@ng-cn/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/cursor.mdc +53 -0
- package/.editorconfig +17 -0
- package/.postcssrc.json +5 -0
- package/.prettierrc +27 -0
- package/README.md +199 -0
- package/angular.json +122 -0
- package/dist/schematics/component/index.d.ts +8 -0
- package/dist/schematics/component/index.js +109 -0
- package/dist/schematics/ng-add/index.d.ts +7 -0
- package/dist/schematics/ng-add/index.js +51 -0
- package/mcp.json +336 -0
- package/package.json +99 -0
- package/postcss.config.mjs +6 -0
- package/public/.!14865!favicon.ico +0 -0
- package/public/angular-shad-cn.png +0 -0
- package/public/favicon.ico +0 -0
- package/schematics/README.md +97 -0
- package/schematics/collection.json +16 -0
- package/schematics/component/index.d.ts +9 -0
- package/schematics/component/index.js +214 -0
- package/schematics/component/index.ts +238 -0
- package/schematics/component/schema.json +36 -0
- package/schematics/ng-add/index.d.ts +8 -0
- package/schematics/ng-add/index.js +310 -0
- package/schematics/ng-add/index.ts +334 -0
- package/schematics/ng-add/schema.json +25 -0
- package/schematics/tsconfig.json +20 -0
- package/tsconfig.app.json +17 -0
- package/tsconfig.json +45 -0
- package/tsconfig.spec.json +15 -0
package/mcp.json
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "shadcn-angular",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Angular port of shadcn/ui components — Tailwind 4+ compatible. Machine-readable manifest (no docs).",
|
|
5
|
+
"angularPeer": ">=21.0.0",
|
|
6
|
+
"tailwindPeer": ">=4.0.0",
|
|
7
|
+
"schematics": {
|
|
8
|
+
"ngAdd": {
|
|
9
|
+
"description": "Installs base styles, Tailwind config, and optional per-component selection."
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"components": [
|
|
13
|
+
{ "name": "Accordion", "package": "@shadcn-angular/accordion", "selector": "Accordion", "selectorType": "element", "standalone": true },
|
|
14
|
+
{ "name": "AccordionItem", "package": "@shadcn-angular/accordion", "selector": "AccordionItem", "selectorType": "element", "standalone": true },
|
|
15
|
+
{ "name": "AccordionTrigger", "package": "@shadcn-angular/accordion", "selector": "AccordionTrigger", "selectorType": "element", "standalone": true },
|
|
16
|
+
{ "name": "AccordionContent", "package": "@shadcn-angular/accordion", "selector": "AccordionContent", "selectorType": "element", "standalone": true },
|
|
17
|
+
{ "name": "Alert", "package": "@shadcn-angular/alert", "selector": "Alert", "selectorType": "element", "standalone": true },
|
|
18
|
+
{ "name": "AlertTitle", "package": "@shadcn-angular/alert", "selector": "AlertTitle", "selectorType": "element", "standalone": true },
|
|
19
|
+
{ "name": "AlertDescription", "package": "@shadcn-angular/alert", "selector": "AlertDescription", "selectorType": "element", "standalone": true },
|
|
20
|
+
{ "name": "AlertDialog", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialog", "selectorType": "element", "standalone": true },
|
|
21
|
+
{ "name": "AlertDialogTrigger", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogTrigger", "selectorType": "element", "standalone": true },
|
|
22
|
+
{ "name": "AlertDialogContent", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogContent", "selectorType": "element", "standalone": true },
|
|
23
|
+
{ "name": "AlertDialogHeader", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogHeader", "selectorType": "element", "standalone": true },
|
|
24
|
+
{ "name": "AlertDialogFooter", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogFooter", "selectorType": "element", "standalone": true },
|
|
25
|
+
{ "name": "AlertDialogTitle", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogTitle", "selectorType": "element", "standalone": true },
|
|
26
|
+
{ "name": "AlertDialogDescription", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogDescription", "selectorType": "element", "standalone": true },
|
|
27
|
+
{ "name": "AlertDialogAction", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogAction", "selectorType": "element", "standalone": true },
|
|
28
|
+
{ "name": "AlertDialogCancel", "package": "@shadcn-angular/alert-dialog", "selector": "AlertDialogCancel", "selectorType": "element", "standalone": true },
|
|
29
|
+
{ "name": "AspectRatio", "package": "@shadcn-angular/aspect-ratio", "selector": "AspectRatio", "selectorType": "element", "standalone": true },
|
|
30
|
+
{ "name": "Avatar", "package": "@shadcn-angular/avatar", "selector": "Avatar", "selectorType": "element", "standalone": true },
|
|
31
|
+
{ "name": "AvatarImage", "package": "@shadcn-angular/avatar", "selector": "AvatarImage", "selectorType": "element", "standalone": true },
|
|
32
|
+
{ "name": "AvatarFallback", "package": "@shadcn-angular/avatar", "selector": "AvatarFallback", "selectorType": "element", "standalone": true },
|
|
33
|
+
{ "name": "Badge", "package": "@shadcn-angular/badge", "selector": "Badge", "selectorType": "element", "standalone": true },
|
|
34
|
+
{ "name": "Breadcrumb", "package": "@shadcn-angular/breadcrumb", "selector": "Breadcrumb", "selectorType": "element", "standalone": true },
|
|
35
|
+
{ "name": "BreadcrumbList", "package": "@shadcn-angular/breadcrumb", "selector": "BreadcrumbList", "selectorType": "element", "standalone": true },
|
|
36
|
+
{ "name": "BreadcrumbItem", "package": "@shadcn-angular/breadcrumb", "selector": "BreadcrumbItem", "selectorType": "element", "standalone": true },
|
|
37
|
+
{ "name": "BreadcrumbLink", "package": "@shadcn-angular/breadcrumb", "selector": "BreadcrumbLink", "selectorType": "element", "standalone": true },
|
|
38
|
+
{ "name": "BreadcrumbPage", "package": "@shadcn-angular/breadcrumb", "selector": "BreadcrumbPage", "selectorType": "element", "standalone": true },
|
|
39
|
+
{ "name": "BreadcrumbSeparator", "package": "@shadcn-angular/breadcrumb", "selector": "BreadcrumbSeparator", "selectorType": "element", "standalone": true },
|
|
40
|
+
{ "name": "BreadcrumbEllipsis", "package": "@shadcn-angular/breadcrumb", "selector": "BreadcrumbEllipsis", "selectorType": "element", "standalone": true },
|
|
41
|
+
{ "name": "Button", "package": "@shadcn-angular/button", "selector": "Button", "selectorType": "element", "standalone": true },
|
|
42
|
+
{ "name": "Calendar", "package": "@shadcn-angular/calendar", "selector": "Calendar", "selectorType": "element", "standalone": true },
|
|
43
|
+
{ "name": "Card", "package": "@shadcn-angular/card", "selector": "Card", "selectorType": "element", "standalone": true },
|
|
44
|
+
{ "name": "CardHeader", "package": "@shadcn-angular/card", "selector": "CardHeader", "selectorType": "element", "standalone": true },
|
|
45
|
+
{ "name": "CardTitle", "package": "@shadcn-angular/card", "selector": "CardTitle", "selectorType": "element", "standalone": true },
|
|
46
|
+
{ "name": "CardDescription", "package": "@shadcn-angular/card", "selector": "CardDescription", "selectorType": "element", "standalone": true },
|
|
47
|
+
{ "name": "CardContent", "package": "@shadcn-angular/card", "selector": "CardContent", "selectorType": "element", "standalone": true },
|
|
48
|
+
{ "name": "CardFooter", "package": "@shadcn-angular/card", "selector": "CardFooter", "selectorType": "element", "standalone": true },
|
|
49
|
+
{ "name": "Carousel", "package": "@shadcn-angular/carousel", "selector": "Carousel", "selectorType": "element", "standalone": true },
|
|
50
|
+
{ "name": "CarouselContent", "package": "@shadcn-angular/carousel", "selector": "CarouselContent", "selectorType": "element", "standalone": true },
|
|
51
|
+
{ "name": "CarouselItem", "package": "@shadcn-angular/carousel", "selector": "CarouselItem", "selectorType": "element", "standalone": true },
|
|
52
|
+
{ "name": "CarouselPrevious", "package": "@shadcn-angular/carousel", "selector": "CarouselPrevious", "selectorType": "element", "standalone": true },
|
|
53
|
+
{ "name": "CarouselNext", "package": "@shadcn-angular/carousel", "selector": "CarouselNext", "selectorType": "element", "standalone": true },
|
|
54
|
+
{ "name": "Checkbox", "package": "@shadcn-angular/checkbox", "selector": "Checkbox", "selectorType": "element", "standalone": true },
|
|
55
|
+
{ "name": "Collapsible", "package": "@shadcn-angular/collapsible", "selector": "Collapsible", "selectorType": "element", "standalone": true },
|
|
56
|
+
{ "name": "CollapsibleTrigger", "package": "@shadcn-angular/collapsible", "selector": "CollapsibleTrigger", "selectorType": "element", "standalone": true },
|
|
57
|
+
{ "name": "CollapsibleContent", "package": "@shadcn-angular/collapsible", "selector": "CollapsibleContent", "selectorType": "element", "standalone": true },
|
|
58
|
+
{ "name": "Command", "package": "@shadcn-angular/command", "selector": "Command", "selectorType": "element", "standalone": true },
|
|
59
|
+
{ "name": "CommandInput", "package": "@shadcn-angular/command", "selector": "CommandInput", "selectorType": "element", "standalone": true },
|
|
60
|
+
{ "name": "CommandList", "package": "@shadcn-angular/command", "selector": "CommandList", "selectorType": "element", "standalone": true },
|
|
61
|
+
{ "name": "CommandEmpty", "package": "@shadcn-angular/command", "selector": "CommandEmpty", "selectorType": "element", "standalone": true },
|
|
62
|
+
{ "name": "CommandGroup", "package": "@shadcn-angular/command", "selector": "CommandGroup", "selectorType": "element", "standalone": true },
|
|
63
|
+
{ "name": "CommandItem", "package": "@shadcn-angular/command", "selector": "CommandItem", "selectorType": "element", "standalone": true },
|
|
64
|
+
{ "name": "CommandShortcut", "package": "@shadcn-angular/command", "selector": "CommandShortcut", "selectorType": "element", "standalone": true },
|
|
65
|
+
{ "name": "CommandSeparator", "package": "@shadcn-angular/command", "selector": "CommandSeparator", "selectorType": "element", "standalone": true },
|
|
66
|
+
{ "name": "ContextMenu", "package": "@shadcn-angular/context-menu", "selector": "ContextMenu", "selectorType": "element", "standalone": true },
|
|
67
|
+
{ "name": "ContextMenuTrigger", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuTrigger", "selectorType": "element", "standalone": true },
|
|
68
|
+
{ "name": "ContextMenuContent", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuContent", "selectorType": "element", "standalone": true },
|
|
69
|
+
{ "name": "ContextMenuItem", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuItem", "selectorType": "element", "standalone": true },
|
|
70
|
+
{ "name": "ContextMenuCheckboxItem", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuCheckboxItem", "selectorType": "element", "standalone": true },
|
|
71
|
+
{ "name": "ContextMenuRadioGroup", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuRadioGroup", "selectorType": "element", "standalone": true },
|
|
72
|
+
{ "name": "ContextMenuRadioItem", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuRadioItem", "selectorType": "element", "standalone": true },
|
|
73
|
+
{ "name": "ContextMenuLabel", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuLabel", "selectorType": "element", "standalone": true },
|
|
74
|
+
{ "name": "ContextMenuSeparator", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuSeparator", "selectorType": "element", "standalone": true },
|
|
75
|
+
{ "name": "ContextMenuShortcut", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuShortcut", "selectorType": "element", "standalone": true },
|
|
76
|
+
{ "name": "ContextMenuSub", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuSub", "selectorType": "element", "standalone": true },
|
|
77
|
+
{ "name": "ContextMenuSubTrigger", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuSubTrigger", "selectorType": "element", "standalone": true },
|
|
78
|
+
{ "name": "ContextMenuSubContent", "package": "@shadcn-angular/context-menu", "selector": "ContextMenuSubContent", "selectorType": "element", "standalone": true },
|
|
79
|
+
{ "name": "DatePicker", "package": "@shadcn-angular/date-picker", "selector": "DatePicker", "selectorType": "element", "standalone": true },
|
|
80
|
+
{ "name": "Dialog", "package": "@shadcn-angular/dialog", "selector": "Dialog", "selectorType": "element", "standalone": true },
|
|
81
|
+
{ "name": "DialogTrigger", "package": "@shadcn-angular/dialog", "selector": "DialogTrigger", "selectorType": "element", "standalone": true },
|
|
82
|
+
{ "name": "DialogContent", "package": "@shadcn-angular/dialog", "selector": "DialogContent", "selectorType": "element", "standalone": true },
|
|
83
|
+
{ "name": "DialogHeader", "package": "@shadcn-angular/dialog", "selector": "DialogHeader", "selectorType": "element", "standalone": true },
|
|
84
|
+
{ "name": "DialogFooter", "package": "@shadcn-angular/dialog", "selector": "DialogFooter", "selectorType": "element", "standalone": true },
|
|
85
|
+
{ "name": "DialogTitle", "package": "@shadcn-angular/dialog", "selector": "DialogTitle", "selectorType": "element", "standalone": true },
|
|
86
|
+
{ "name": "DialogDescription", "package": "@shadcn-angular/dialog", "selector": "DialogDescription", "selectorType": "element", "standalone": true },
|
|
87
|
+
{ "name": "DialogClose", "package": "@shadcn-angular/dialog", "selector": "DialogClose", "selectorType": "element", "standalone": true },
|
|
88
|
+
{ "name": "Drawer", "package": "@shadcn-angular/drawer", "selector": "Drawer", "selectorType": "element", "standalone": true },
|
|
89
|
+
{ "name": "DrawerTrigger", "package": "@shadcn-angular/drawer", "selector": "DrawerTrigger", "selectorType": "element", "standalone": true },
|
|
90
|
+
{ "name": "DrawerContent", "package": "@shadcn-angular/drawer", "selector": "DrawerContent", "selectorType": "element", "standalone": true },
|
|
91
|
+
{ "name": "DrawerHeader", "package": "@shadcn-angular/drawer", "selector": "DrawerHeader", "selectorType": "element", "standalone": true },
|
|
92
|
+
{ "name": "DrawerFooter", "package": "@shadcn-angular/drawer", "selector": "DrawerFooter", "selectorType": "element", "standalone": true },
|
|
93
|
+
{ "name": "DrawerTitle", "package": "@shadcn-angular/drawer", "selector": "DrawerTitle", "selectorType": "element", "standalone": true },
|
|
94
|
+
{ "name": "DrawerDescription", "package": "@shadcn-angular/drawer", "selector": "DrawerDescription", "selectorType": "element", "standalone": true },
|
|
95
|
+
{ "name": "DrawerClose", "package": "@shadcn-angular/drawer", "selector": "DrawerClose", "selectorType": "element", "standalone": true },
|
|
96
|
+
{ "name": "DropdownMenu", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenu", "selectorType": "element", "standalone": true },
|
|
97
|
+
{ "name": "DropdownMenuTrigger", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuTrigger", "selectorType": "element", "standalone": true },
|
|
98
|
+
{ "name": "DropdownMenuContent", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuContent", "selectorType": "element", "standalone": true },
|
|
99
|
+
{ "name": "DropdownMenuItem", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuItem", "selectorType": "element", "standalone": true },
|
|
100
|
+
{ "name": "DropdownMenuCheckboxItem", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuCheckboxItem", "selectorType": "element", "standalone": true },
|
|
101
|
+
{ "name": "DropdownMenuRadioGroup", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuRadioGroup", "selectorType": "element", "standalone": true },
|
|
102
|
+
{ "name": "DropdownMenuRadioItem", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuRadioItem", "selectorType": "element", "standalone": true },
|
|
103
|
+
{ "name": "DropdownMenuLabel", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuLabel", "selectorType": "element", "standalone": true },
|
|
104
|
+
{ "name": "DropdownMenuSeparator", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuSeparator", "selectorType": "element", "standalone": true },
|
|
105
|
+
{ "name": "DropdownMenuShortcut", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuShortcut", "selectorType": "element", "standalone": true },
|
|
106
|
+
{ "name": "DropdownMenuGroup", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuGroup", "selectorType": "element", "standalone": true },
|
|
107
|
+
{ "name": "DropdownMenuSub", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuSub", "selectorType": "element", "standalone": true },
|
|
108
|
+
{ "name": "DropdownMenuSubTrigger", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuSubTrigger", "selectorType": "element", "standalone": true },
|
|
109
|
+
{ "name": "DropdownMenuSubContent", "package": "@shadcn-angular/dropdown-menu", "selector": "DropdownMenuSubContent", "selectorType": "element", "standalone": true },
|
|
110
|
+
{ "name": "Form", "package": "@shadcn-angular/form", "selector": "Form", "selectorType": "element", "standalone": true },
|
|
111
|
+
{ "name": "FormField", "package": "@shadcn-angular/form", "selector": "FormField", "selectorType": "element", "standalone": true },
|
|
112
|
+
{ "name": "FormItem", "package": "@shadcn-angular/form", "selector": "FormItem", "selectorType": "element", "standalone": true },
|
|
113
|
+
{ "name": "FormLabel", "package": "@shadcn-angular/form", "selector": "FormLabel", "selectorType": "element", "standalone": true },
|
|
114
|
+
{ "name": "FormControl", "package": "@shadcn-angular/form", "selector": "FormControl", "selectorType": "element", "standalone": true },
|
|
115
|
+
{ "name": "FormDescription", "package": "@shadcn-angular/form", "selector": "FormDescription", "selectorType": "element", "standalone": true },
|
|
116
|
+
{ "name": "FormMessage", "package": "@shadcn-angular/form", "selector": "FormMessage", "selectorType": "element", "standalone": true },
|
|
117
|
+
{ "name": "HoverCard", "package": "@shadcn-angular/hover-card", "selector": "HoverCard", "selectorType": "element", "standalone": true },
|
|
118
|
+
{ "name": "HoverCardTrigger", "package": "@shadcn-angular/hover-card", "selector": "HoverCardTrigger", "selectorType": "element", "standalone": true },
|
|
119
|
+
{ "name": "HoverCardContent", "package": "@shadcn-angular/hover-card", "selector": "HoverCardContent", "selectorType": "element", "standalone": true },
|
|
120
|
+
{ "name": "Input", "package": "@shadcn-angular/input", "selector": "Input", "selectorType": "element", "standalone": true },
|
|
121
|
+
{ "name": "InputOTP", "package": "@shadcn-angular/input-otp", "selector": "InputOTP", "selectorType": "element", "standalone": true },
|
|
122
|
+
{ "name": "InputOTPGroup", "package": "@shadcn-angular/input-otp", "selector": "InputOTPGroup", "selectorType": "element", "standalone": true },
|
|
123
|
+
{ "name": "InputOTPSlot", "package": "@shadcn-angular/input-otp", "selector": "InputOTPSlot", "selectorType": "element", "standalone": true },
|
|
124
|
+
{ "name": "InputOTPSeparator", "package": "@shadcn-angular/input-otp", "selector": "InputOTPSeparator", "selectorType": "element", "standalone": true },
|
|
125
|
+
{ "name": "Label", "package": "@shadcn-angular/label", "selector": "Label", "selectorType": "element", "standalone": true },
|
|
126
|
+
{ "name": "Menubar", "package": "@shadcn-angular/menubar", "selector": "Menubar", "selectorType": "element", "standalone": true },
|
|
127
|
+
{ "name": "MenubarMenu", "package": "@shadcn-angular/menubar", "selector": "MenubarMenu", "selectorType": "element", "standalone": true },
|
|
128
|
+
{ "name": "MenubarTrigger", "package": "@shadcn-angular/menubar", "selector": "MenubarTrigger", "selectorType": "element", "standalone": true },
|
|
129
|
+
{ "name": "MenubarContent", "package": "@shadcn-angular/menubar", "selector": "MenubarContent", "selectorType": "element", "standalone": true },
|
|
130
|
+
{ "name": "MenubarItem", "package": "@shadcn-angular/menubar", "selector": "MenubarItem", "selectorType": "element", "standalone": true },
|
|
131
|
+
{ "name": "MenubarSeparator", "package": "@shadcn-angular/menubar", "selector": "MenubarSeparator", "selectorType": "element", "standalone": true },
|
|
132
|
+
{ "name": "MenubarLabel", "package": "@shadcn-angular/menubar", "selector": "MenubarLabel", "selectorType": "element", "standalone": true },
|
|
133
|
+
{ "name": "MenubarCheckboxItem", "package": "@shadcn-angular/menubar", "selector": "MenubarCheckboxItem", "selectorType": "element", "standalone": true },
|
|
134
|
+
{ "name": "MenubarRadioGroup", "package": "@shadcn-angular/menubar", "selector": "MenubarRadioGroup", "selectorType": "element", "standalone": true },
|
|
135
|
+
{ "name": "MenubarRadioItem", "package": "@shadcn-angular/menubar", "selector": "MenubarRadioItem", "selectorType": "element", "standalone": true },
|
|
136
|
+
{ "name": "MenubarSub", "package": "@shadcn-angular/menubar", "selector": "MenubarSub", "selectorType": "element", "standalone": true },
|
|
137
|
+
{ "name": "MenubarSubTrigger", "package": "@shadcn-angular/menubar", "selector": "MenubarSubTrigger", "selectorType": "element", "standalone": true },
|
|
138
|
+
{ "name": "MenubarSubContent", "package": "@shadcn-angular/menubar", "selector": "MenubarSubContent", "selectorType": "element", "standalone": true },
|
|
139
|
+
{ "name": "MenubarShortcut", "package": "@shadcn-angular/menubar", "selector": "MenubarShortcut", "selectorType": "element", "standalone": true },
|
|
140
|
+
{ "name": "NavigationMenu", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenu", "selectorType": "element", "standalone": true },
|
|
141
|
+
{ "name": "NavigationMenuList", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenuList", "selectorType": "element", "standalone": true },
|
|
142
|
+
{ "name": "NavigationMenuItem", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenuItem", "selectorType": "element", "standalone": true },
|
|
143
|
+
{ "name": "NavigationMenuTrigger", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenuTrigger", "selectorType": "element", "standalone": true },
|
|
144
|
+
{ "name": "NavigationMenuContent", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenuContent", "selectorType": "element", "standalone": true },
|
|
145
|
+
{ "name": "NavigationMenuLink", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenuLink", "selectorType": "element", "standalone": true },
|
|
146
|
+
{ "name": "NavigationMenuIndicator", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenuIndicator", "selectorType": "element", "standalone": true },
|
|
147
|
+
{ "name": "NavigationMenuViewport", "package": "@shadcn-angular/navigation-menu", "selector": "NavigationMenuViewport", "selectorType": "element", "standalone": true },
|
|
148
|
+
{ "name": "Pagination", "package": "@shadcn-angular/pagination", "selector": "Pagination", "selectorType": "element", "standalone": true },
|
|
149
|
+
{ "name": "PaginationContent", "package": "@shadcn-angular/pagination", "selector": "PaginationContent", "selectorType": "element", "standalone": true },
|
|
150
|
+
{ "name": "PaginationItem", "package": "@shadcn-angular/pagination", "selector": "PaginationItem", "selectorType": "element", "standalone": true },
|
|
151
|
+
{ "name": "PaginationLink", "package": "@shadcn-angular/pagination", "selector": "PaginationLink", "selectorType": "element", "standalone": true },
|
|
152
|
+
{ "name": "PaginationPrevious", "package": "@shadcn-angular/pagination", "selector": "PaginationPrevious", "selectorType": "element", "standalone": true },
|
|
153
|
+
{ "name": "PaginationNext", "package": "@shadcn-angular/pagination", "selector": "PaginationNext", "selectorType": "element", "standalone": true },
|
|
154
|
+
{ "name": "PaginationEllipsis", "package": "@shadcn-angular/pagination", "selector": "PaginationEllipsis", "selectorType": "element", "standalone": true },
|
|
155
|
+
{ "name": "Popover", "package": "@shadcn-angular/popover", "selector": "Popover", "selectorType": "element", "standalone": true },
|
|
156
|
+
{ "name": "PopoverTrigger", "package": "@shadcn-angular/popover", "selector": "PopoverTrigger", "selectorType": "element", "standalone": true },
|
|
157
|
+
{ "name": "PopoverContent", "package": "@shadcn-angular/popover", "selector": "PopoverContent", "selectorType": "element", "standalone": true },
|
|
158
|
+
{ "name": "PopoverAnchor", "package": "@shadcn-angular/popover", "selector": "PopoverAnchor", "selectorType": "element", "standalone": true },
|
|
159
|
+
{ "name": "Progress", "package": "@shadcn-angular/progress", "selector": "Progress", "selectorType": "element", "standalone": true },
|
|
160
|
+
{ "name": "RadioGroup", "package": "@shadcn-angular/radio-group", "selector": "RadioGroup", "selectorType": "element", "standalone": true },
|
|
161
|
+
{ "name": "RadioGroupItem", "package": "@shadcn-angular/radio-group", "selector": "RadioGroupItem", "selectorType": "element", "standalone": true },
|
|
162
|
+
{ "name": "ResizablePanelGroup", "package": "@shadcn-angular/resizable", "selector": "ResizablePanelGroup", "selectorType": "element", "standalone": true },
|
|
163
|
+
{ "name": "ResizablePanel", "package": "@shadcn-angular/resizable", "selector": "ResizablePanel", "selectorType": "element", "standalone": true },
|
|
164
|
+
{ "name": "ResizableHandle", "package": "@shadcn-angular/resizable", "selector": "ResizableHandle", "selectorType": "element", "standalone": true },
|
|
165
|
+
{ "name": "ScrollArea", "package": "@shadcn-angular/scroll-area", "selector": "ScrollArea", "selectorType": "element", "standalone": true },
|
|
166
|
+
{ "name": "ScrollBar", "package": "@shadcn-angular/scroll-area", "selector": "ScrollBar", "selectorType": "element", "standalone": true },
|
|
167
|
+
{ "name": "Select", "package": "@shadcn-angular/select", "selector": "Select", "selectorType": "element", "standalone": true },
|
|
168
|
+
{ "name": "SelectTrigger", "package": "@shadcn-angular/select", "selector": "SelectTrigger", "selectorType": "element", "standalone": true },
|
|
169
|
+
{ "name": "SelectValue", "package": "@shadcn-angular/select", "selector": "SelectValue", "selectorType": "element", "standalone": true },
|
|
170
|
+
{ "name": "SelectContent", "package": "@shadcn-angular/select", "selector": "SelectContent", "selectorType": "element", "standalone": true },
|
|
171
|
+
{ "name": "SelectGroup", "package": "@shadcn-angular/select", "selector": "SelectGroup", "selectorType": "element", "standalone": true },
|
|
172
|
+
{ "name": "SelectItem", "package": "@shadcn-angular/select", "selector": "SelectItem", "selectorType": "element", "standalone": true },
|
|
173
|
+
{ "name": "SelectLabel", "package": "@shadcn-angular/select", "selector": "SelectLabel", "selectorType": "element", "standalone": true },
|
|
174
|
+
{ "name": "SelectSeparator", "package": "@shadcn-angular/select", "selector": "SelectSeparator", "selectorType": "element", "standalone": true },
|
|
175
|
+
{ "name": "Separator", "package": "@shadcn-angular/separator", "selector": "Separator", "selectorType": "element", "standalone": true },
|
|
176
|
+
{ "name": "Sheet", "package": "@shadcn-angular/sheet", "selector": "Sheet", "selectorType": "element", "standalone": true },
|
|
177
|
+
{ "name": "SheetTrigger", "package": "@shadcn-angular/sheet", "selector": "SheetTrigger", "selectorType": "element", "standalone": true },
|
|
178
|
+
{ "name": "SheetContent", "package": "@shadcn-angular/sheet", "selector": "SheetContent", "selectorType": "element", "standalone": true },
|
|
179
|
+
{ "name": "SheetHeader", "package": "@shadcn-angular/sheet", "selector": "SheetHeader", "selectorType": "element", "standalone": true },
|
|
180
|
+
{ "name": "SheetFooter", "package": "@shadcn-angular/sheet", "selector": "SheetFooter", "selectorType": "element", "standalone": true },
|
|
181
|
+
{ "name": "SheetTitle", "package": "@shadcn-angular/sheet", "selector": "SheetTitle", "selectorType": "element", "standalone": true },
|
|
182
|
+
{ "name": "SheetDescription", "package": "@shadcn-angular/sheet", "selector": "SheetDescription", "selectorType": "element", "standalone": true },
|
|
183
|
+
{ "name": "SheetClose", "package": "@shadcn-angular/sheet", "selector": "SheetClose", "selectorType": "element", "standalone": true },
|
|
184
|
+
{ "name": "Skeleton", "package": "@shadcn-angular/skeleton", "selector": "Skeleton", "selectorType": "element", "standalone": true },
|
|
185
|
+
{ "name": "Slider", "package": "@shadcn-angular/slider", "selector": "Slider", "selectorType": "element", "standalone": true },
|
|
186
|
+
{ "name": "Sonner", "package": "@shadcn-angular/sonner", "selector": "Sonner", "selectorType": "element", "standalone": true },
|
|
187
|
+
{ "name": "Switch", "package": "@shadcn-angular/switch", "selector": "Switch", "selectorType": "element", "standalone": true },
|
|
188
|
+
{ "name": "Table", "package": "@shadcn-angular/table", "selector": "Table", "selectorType": "element", "standalone": true },
|
|
189
|
+
{ "name": "TableHeader", "package": "@shadcn-angular/table", "selector": "TableHeader", "selectorType": "element", "standalone": true },
|
|
190
|
+
{ "name": "TableBody", "package": "@shadcn-angular/table", "selector": "TableBody", "selectorType": "element", "standalone": true },
|
|
191
|
+
{ "name": "TableFooter", "package": "@shadcn-angular/table", "selector": "TableFooter", "selectorType": "element", "standalone": true },
|
|
192
|
+
{ "name": "TableRow", "package": "@shadcn-angular/table", "selector": "TableRow", "selectorType": "element", "standalone": true },
|
|
193
|
+
{ "name": "TableHead", "package": "@shadcn-angular/table", "selector": "TableHead", "selectorType": "element", "standalone": true },
|
|
194
|
+
{ "name": "TableCell", "package": "@shadcn-angular/table", "selector": "TableCell", "selectorType": "element", "standalone": true },
|
|
195
|
+
{ "name": "TableCaption", "package": "@shadcn-angular/table", "selector": "TableCaption", "selectorType": "element", "standalone": true },
|
|
196
|
+
{ "name": "Tabs", "package": "@shadcn-angular/tabs", "selector": "Tabs", "selectorType": "element", "standalone": true },
|
|
197
|
+
{ "name": "TabsList", "package": "@shadcn-angular/tabs", "selector": "TabsList", "selectorType": "element", "standalone": true },
|
|
198
|
+
{ "name": "TabsTrigger", "package": "@shadcn-angular/tabs", "selector": "TabsTrigger", "selectorType": "element", "standalone": true },
|
|
199
|
+
{ "name": "TabsContent", "package": "@shadcn-angular/tabs", "selector": "TabsContent", "selectorType": "element", "standalone": true },
|
|
200
|
+
{ "name": "Textarea", "package": "@shadcn-angular/textarea", "selector": "Textarea", "selectorType": "element", "standalone": true },
|
|
201
|
+
{ "name": "Toast", "package": "@shadcn-angular/toast", "selector": "Toast", "selectorType": "element", "standalone": true },
|
|
202
|
+
{ "name": "ToastAction", "package": "@shadcn-angular/toast", "selector": "ToastAction", "selectorType": "element", "standalone": true },
|
|
203
|
+
{ "name": "ToastClose", "package": "@shadcn-angular/toast", "selector": "ToastClose", "selectorType": "element", "standalone": true },
|
|
204
|
+
{ "name": "ToastDescription", "package": "@shadcn-angular/toast", "selector": "ToastDescription", "selectorType": "element", "standalone": true },
|
|
205
|
+
{ "name": "ToastProvider", "package": "@shadcn-angular/toast", "selector": "ToastProvider", "selectorType": "element", "standalone": true },
|
|
206
|
+
{ "name": "ToastTitle", "package": "@shadcn-angular/toast", "selector": "ToastTitle", "selectorType": "element", "standalone": true },
|
|
207
|
+
{ "name": "ToastViewport", "package": "@shadcn-angular/toast", "selector": "ToastViewport", "selectorType": "element", "standalone": true },
|
|
208
|
+
{ "name": "Toaster", "package": "@shadcn-angular/toast", "selector": "Toaster", "selectorType": "element", "standalone": true },
|
|
209
|
+
{ "name": "Toggle", "package": "@shadcn-angular/toggle", "selector": "Toggle", "selectorType": "element", "standalone": true },
|
|
210
|
+
{ "name": "ToggleGroup", "package": "@shadcn-angular/toggle-group", "selector": "ToggleGroup", "selectorType": "element", "standalone": true },
|
|
211
|
+
{ "name": "ToggleGroupItem", "package": "@shadcn-angular/toggle-group", "selector": "ToggleGroupItem", "selectorType": "element", "standalone": true },
|
|
212
|
+
{ "name": "Tooltip", "package": "@shadcn-angular/tooltip", "selector": "Tooltip", "selectorType": "element", "standalone": true },
|
|
213
|
+
{ "name": "TooltipTrigger", "package": "@shadcn-angular/tooltip", "selector": "TooltipTrigger", "selectorType": "element", "standalone": true },
|
|
214
|
+
{ "name": "TooltipContent", "package": "@shadcn-angular/tooltip", "selector": "TooltipContent", "selectorType": "element", "standalone": true },
|
|
215
|
+
{ "name": "TooltipProvider", "package": "@shadcn-angular/tooltip", "selector": "TooltipProvider", "selectorType": "element", "standalone": true }
|
|
216
|
+
],
|
|
217
|
+
"compat": {
|
|
218
|
+
"tweakCn": true,
|
|
219
|
+
"naming": "exact-shadcn",
|
|
220
|
+
"notes": "Uses exact shadcn/ui naming conventions with element selectors only. All components use element selectors (e.g., <Button>, <Card>, <Input>). No attribute selectors. No custom prefixes. Components are standalone and tree-shakable."
|
|
221
|
+
},
|
|
222
|
+
"blocks": [
|
|
223
|
+
{
|
|
224
|
+
"name": "Sidebar",
|
|
225
|
+
"package": "@shadcn-angular/blocks",
|
|
226
|
+
"description": "Collapsible side navigation with icons and nested menus",
|
|
227
|
+
"components": ["Sheet", "Button", "Tooltip", "ScrollArea", "Separator"],
|
|
228
|
+
"variants": ["default", "floating", "inset"]
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"name": "Navbar",
|
|
232
|
+
"package": "@shadcn-angular/blocks",
|
|
233
|
+
"description": "Top navigation bar with logo, links, and user menu",
|
|
234
|
+
"components": ["NavigationMenu", "Button", "DropdownMenu", "Avatar"],
|
|
235
|
+
"variants": ["default", "centered", "minimal"]
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"name": "DashboardLayout",
|
|
239
|
+
"package": "@shadcn-angular/blocks",
|
|
240
|
+
"description": "Full admin dashboard shell with sidebar and header",
|
|
241
|
+
"components": ["Sidebar", "Navbar", "Card", "Breadcrumb"],
|
|
242
|
+
"variants": ["default", "compact"]
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"name": "AuthForm",
|
|
246
|
+
"package": "@shadcn-angular/blocks",
|
|
247
|
+
"description": "Login, register, and forgot password forms",
|
|
248
|
+
"components": ["Card", "Form", "Input", "Button", "Label", "Checkbox"],
|
|
249
|
+
"variants": ["login", "register", "forgot-password", "reset-password"]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"name": "DataTable",
|
|
253
|
+
"package": "@shadcn-angular/blocks",
|
|
254
|
+
"description": "Advanced data table with sorting, filtering, and pagination",
|
|
255
|
+
"components": ["Table", "Button", "DropdownMenu", "Checkbox", "Input", "Select", "Pagination"],
|
|
256
|
+
"variants": ["default", "compact", "expandable"]
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"name": "SettingsPage",
|
|
260
|
+
"package": "@shadcn-angular/blocks",
|
|
261
|
+
"description": "Settings form layout with tabs and sections",
|
|
262
|
+
"components": ["Card", "Form", "Tabs", "Switch", "Select", "Input", "Button"],
|
|
263
|
+
"variants": ["default", "sidebar-nav"]
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"name": "ProfileCard",
|
|
267
|
+
"package": "@shadcn-angular/blocks",
|
|
268
|
+
"description": "User profile display with avatar and actions",
|
|
269
|
+
"components": ["Card", "Avatar", "Badge", "Button"],
|
|
270
|
+
"variants": ["default", "horizontal", "minimal"]
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"name": "EmptyState",
|
|
274
|
+
"package": "@shadcn-angular/blocks",
|
|
275
|
+
"description": "No data placeholder with icon and action",
|
|
276
|
+
"components": ["Card", "Button"],
|
|
277
|
+
"variants": ["default", "simple", "illustration"]
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"name": "ErrorPage",
|
|
281
|
+
"package": "@shadcn-angular/blocks",
|
|
282
|
+
"description": "Error pages for 404, 500, etc.",
|
|
283
|
+
"components": ["Card", "Button"],
|
|
284
|
+
"variants": ["404", "500", "maintenance", "offline"]
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"name": "CommandMenu",
|
|
288
|
+
"package": "@shadcn-angular/blocks",
|
|
289
|
+
"description": "Global command palette (⌘K style)",
|
|
290
|
+
"components": ["Command", "Dialog"],
|
|
291
|
+
"variants": ["default"]
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"name": "FileUpload",
|
|
295
|
+
"package": "@shadcn-angular/blocks",
|
|
296
|
+
"description": "Drag and drop file upload zone",
|
|
297
|
+
"components": ["Card", "Button", "Progress"],
|
|
298
|
+
"variants": ["default", "minimal", "avatar"]
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"name": "StatsCards",
|
|
302
|
+
"package": "@shadcn-angular/blocks",
|
|
303
|
+
"description": "Dashboard statistics cards grid",
|
|
304
|
+
"components": ["Card"],
|
|
305
|
+
"variants": ["default", "with-chart", "compact"]
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
"name": "NotificationCenter",
|
|
309
|
+
"package": "@shadcn-angular/blocks",
|
|
310
|
+
"description": "Notification dropdown panel",
|
|
311
|
+
"components": ["Popover", "ScrollArea", "Button", "Avatar"],
|
|
312
|
+
"variants": ["default", "grouped"]
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"name": "SearchDialog",
|
|
316
|
+
"package": "@shadcn-angular/blocks",
|
|
317
|
+
"description": "Global search with recent and suggestions",
|
|
318
|
+
"components": ["Dialog", "Input", "ScrollArea"],
|
|
319
|
+
"variants": ["default", "with-filters"]
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"name": "UserMenu",
|
|
323
|
+
"package": "@shadcn-angular/blocks",
|
|
324
|
+
"description": "User dropdown menu with profile and settings",
|
|
325
|
+
"components": ["DropdownMenu", "Avatar", "Button"],
|
|
326
|
+
"variants": ["default", "with-status"]
|
|
327
|
+
}
|
|
328
|
+
],
|
|
329
|
+
"theme": {
|
|
330
|
+
"default": "neutral",
|
|
331
|
+
"darkMode": true,
|
|
332
|
+
"cssVariables": true,
|
|
333
|
+
"colorFormat": "oklch",
|
|
334
|
+
"availableThemes": ["neutral", "zinc", "slate", "stone", "gray", "red", "rose", "orange", "green", "blue", "yellow", "violet"]
|
|
335
|
+
}
|
|
336
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ng-cn/core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Beautifully designed Angular components built with Tailwind CSS v4 - The official Angular port of shadcn/ui",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"components",
|
|
8
|
+
"tailwind",
|
|
9
|
+
"shadcn",
|
|
10
|
+
"ui",
|
|
11
|
+
"design-system",
|
|
12
|
+
"angular-components"
|
|
13
|
+
],
|
|
14
|
+
"author": "Jamel Eid Yassin",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://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@github.com/Tigayon-Innovations/angular-shadcn.git"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://shadcn-angular.tigayon.com/",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/Tigayon-Innovations/angular-shadcn/issues"
|
|
23
|
+
},
|
|
24
|
+
"schematics": "./schematics/collection.json",
|
|
25
|
+
"ng-add": {
|
|
26
|
+
"save": "dependencies"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"ng": "ng",
|
|
30
|
+
"start": "ng serve",
|
|
31
|
+
"build": "ng build",
|
|
32
|
+
"build:schematics": "tsc -p schematics/tsconfig.json",
|
|
33
|
+
"build:mcp": "tsc -p mcp-server/tsconfig.json",
|
|
34
|
+
"mcp:setup": "tsx mcp-server/setup-mcp.ts",
|
|
35
|
+
"watch": "ng build --watch --configuration development",
|
|
36
|
+
"lint": "ng lint",
|
|
37
|
+
"test": "vitest",
|
|
38
|
+
"test:ui": "vitest --ui",
|
|
39
|
+
"test:coverage": "vitest run --coverage",
|
|
40
|
+
"serve:ssr:shadcn-angular": "node dist/shadcn-angular/server/server.mjs"
|
|
41
|
+
},
|
|
42
|
+
"prettier": {
|
|
43
|
+
"printWidth": 100,
|
|
44
|
+
"singleQuote": true,
|
|
45
|
+
"overrides": [
|
|
46
|
+
{
|
|
47
|
+
"files": "*.html",
|
|
48
|
+
"options": {
|
|
49
|
+
"parser": "angular"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@angular/cdk": "^21.0.5",
|
|
56
|
+
"@angular/common": "^21.0.6",
|
|
57
|
+
"@angular/compiler": "^21.0.6",
|
|
58
|
+
"@angular/core": "^21.0.6",
|
|
59
|
+
"@angular/forms": "^21.0.6",
|
|
60
|
+
"@angular/platform-browser": "^21.0.6",
|
|
61
|
+
"@angular/platform-server": "^21.0.6",
|
|
62
|
+
"@angular/router": "^21.0.6",
|
|
63
|
+
"@angular/ssr": "^21.0.4",
|
|
64
|
+
"@tailwindcss/postcss": "^4.1.18",
|
|
65
|
+
"class-variance-authority": "^0.7.1",
|
|
66
|
+
"clsx": "^2.1.1",
|
|
67
|
+
"express": "^5.1.0",
|
|
68
|
+
"lucide-angular": "^0.562.0",
|
|
69
|
+
"postcss": "^8.5.6",
|
|
70
|
+
"rxjs": "~7.8.0",
|
|
71
|
+
"shiki": "^3.20.0",
|
|
72
|
+
"tailwind-merge": "^3.4.0",
|
|
73
|
+
"tailwindcss": "^4.1.18",
|
|
74
|
+
"tslib": "^2.3.0"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@analogjs/vitest-angular": "^2.2.0",
|
|
78
|
+
"@angular-devkit/core": "^21.0.4",
|
|
79
|
+
"@angular-devkit/schematics": "^21.0.4",
|
|
80
|
+
"@angular/build": "^21.0.4",
|
|
81
|
+
"@angular/cli": "^21.0.4",
|
|
82
|
+
"@angular/compiler-cli": "^21.0.6",
|
|
83
|
+
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
84
|
+
"@testing-library/angular": "^18.1.1",
|
|
85
|
+
"@testing-library/dom": "^10.4.1",
|
|
86
|
+
"@types/express": "^5.0.1",
|
|
87
|
+
"@types/jasmine": "~5.1.0",
|
|
88
|
+
"@types/node": "^20.17.19",
|
|
89
|
+
"jasmine-core": "~5.9.0",
|
|
90
|
+
"jsdom": "^27.4.0",
|
|
91
|
+
"karma": "~6.4.0",
|
|
92
|
+
"karma-chrome-launcher": "~3.2.0",
|
|
93
|
+
"karma-coverage": "~2.2.0",
|
|
94
|
+
"karma-jasmine": "~5.1.0",
|
|
95
|
+
"karma-jasmine-html-reporter": "~2.1.0",
|
|
96
|
+
"typescript": "~5.9.2",
|
|
97
|
+
"vitest": "^4.0.16"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# shadcn-angular Schematics
|
|
2
|
+
|
|
3
|
+
Angular schematics for installing shadcn-angular components individually.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
### Install Dependencies
|
|
8
|
+
|
|
9
|
+
First, add shadcn-angular to your project:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
ng add shadcn-angular
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This will:
|
|
16
|
+
- Install required dependencies (lucide-angular, class-variance-authority, clsx, tailwind-merge, @angular/cdk)
|
|
17
|
+
- Set up the project for shadcn-angular components
|
|
18
|
+
|
|
19
|
+
### Install Individual Components
|
|
20
|
+
|
|
21
|
+
Install specific components using the component schematic:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
ng generate shadcn-angular:component button
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or use the shorter alias:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
ng g shadcn-angular:c data-table
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Available Components
|
|
34
|
+
|
|
35
|
+
- `button` - Button component with variants
|
|
36
|
+
- `card` - Card component with header, content, and footer
|
|
37
|
+
- `input` - Input component
|
|
38
|
+
- `label` - Label component
|
|
39
|
+
- `separator` - Separator component
|
|
40
|
+
- `badge` - Badge component with variants
|
|
41
|
+
- `alert` - Alert component with variants
|
|
42
|
+
- `dialog` - Dialog component with overlay
|
|
43
|
+
- `data-table` - Data table with sorting, filtering, and pagination
|
|
44
|
+
- And many more...
|
|
45
|
+
|
|
46
|
+
### Options
|
|
47
|
+
|
|
48
|
+
#### Component Schematic
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
ng g shadcn-angular:component <name> [options]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
- `--path` - The path to install the component (default: `src/app/lib/components/ui`)
|
|
56
|
+
- `--project` - The project name
|
|
57
|
+
|
|
58
|
+
Example:
|
|
59
|
+
```bash
|
|
60
|
+
ng g shadcn-angular:c button --path=src/components
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Development
|
|
64
|
+
|
|
65
|
+
To build the schematics:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npm run build:schematics
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
This compiles the TypeScript files in the `schematics` directory to JavaScript.
|
|
72
|
+
|
|
73
|
+
## Structure
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
schematics/
|
|
77
|
+
├── collection.json # Schematic collection definition
|
|
78
|
+
├── tsconfig.json # TypeScript config for schematics
|
|
79
|
+
├── ng-add/ # ng-add schematic
|
|
80
|
+
│ ├── index.ts
|
|
81
|
+
│ └── schema.json
|
|
82
|
+
└── component/ # Component installation schematic
|
|
83
|
+
├── index.ts
|
|
84
|
+
└── schema.json
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## How It Works
|
|
88
|
+
|
|
89
|
+
1. **ng-add**: Sets up the project with required dependencies
|
|
90
|
+
2. **component**: Copies component files from the source to your project
|
|
91
|
+
|
|
92
|
+
The component schematic:
|
|
93
|
+
- Validates the component name against the registry
|
|
94
|
+
- Creates the component directory structure
|
|
95
|
+
- Copies all component files
|
|
96
|
+
- Reports required dependencies
|
|
97
|
+
- Provides import instructions
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
|
|
3
|
+
"schematics": {
|
|
4
|
+
"ng-add": {
|
|
5
|
+
"description": "Initialize @ng-cn/core in your Angular project - sets up Tailwind, styles, and utilities",
|
|
6
|
+
"factory": "./ng-add/index#ngAdd",
|
|
7
|
+
"schema": "./ng-add/schema.json"
|
|
8
|
+
},
|
|
9
|
+
"component": {
|
|
10
|
+
"description": "Add a shadcn component to your project",
|
|
11
|
+
"factory": "./component/index#component",
|
|
12
|
+
"schema": "./component/schema.json",
|
|
13
|
+
"aliases": ["c", "add"]
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|