@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/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
+ }
@@ -0,0 +1,6 @@
1
+ /** @type {import('postcss').Config} */
2
+ export default {
3
+ plugins: {
4
+ '@tailwindcss/postcss': {},
5
+ },
6
+ };
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
+ }
@@ -0,0 +1,9 @@
1
+ import { Rule } from '@angular-devkit/schematics';
2
+ interface ComponentOptions {
3
+ name: string;
4
+ project?: string;
5
+ path?: string;
6
+ overwrite?: boolean;
7
+ }
8
+ export declare function component(options: ComponentOptions): Rule;
9
+ export {};