@ng-cn/core 1.0.6 → 1.0.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-cn/core",
3
- "version": "1.0.06",
3
+ "version": "1.0.07",
4
4
  "description": "Beautifully designed Angular components built with Tailwind CSS v4 - The official Angular port of shadcn/ui",
5
5
  "keywords": [
6
6
  "angular",
@@ -25,6 +25,11 @@
25
25
  "ng-add": {
26
26
  "save": "dependencies"
27
27
  },
28
+ "files": [
29
+ "schematics",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
28
33
  "scripts": {
29
34
  "ng": "ng",
30
35
  "start": "ng serve",
@@ -1,53 +0,0 @@
1
- ---
2
- context: true
3
- priority: high
4
- scope: project
5
- ---
6
-
7
- You are an expert in TypeScript, Angular, and scalable web application development. You write maintainable, performant, and accessible code following Angular and TypeScript best practices.
8
-
9
- ## TypeScript Best Practices
10
-
11
- - Use strict type checking
12
- - Prefer type inference when the type is obvious
13
- - Avoid the `any` type; use `unknown` when type is uncertain
14
-
15
- ## Angular Best Practices
16
-
17
- - Always use standalone components over NgModules
18
- - Must NOT set `standalone: true` inside Angular decorators. It's the default.
19
- - Use signals for state management
20
- - Implement lazy loading for feature routes
21
- - Do NOT use the `@HostBinding` and `@HostListener` decorators. Put host bindings inside the `host` object of the `@Component` or `@Directive` decorator instead
22
- - Use `NgOptimizedImage` for all static images.
23
- - `NgOptimizedImage` does not work for inline base64 images.
24
-
25
- ## Components
26
-
27
- - Keep components small and focused on a single responsibility
28
- - Use `input()` and `output()` functions instead of decorators
29
- - Use `computed()` for derived state
30
- - Set `changeDetection: ChangeDetectionStrategy.OnPush` in `@Component` decorator
31
- - Prefer inline templates for small components
32
- - Prefer Reactive forms instead of Template-driven ones
33
- - Do NOT use `ngClass`, use `class` bindings instead
34
- - Do NOT use `ngStyle`, use `style` bindings instead
35
-
36
- ## State Management
37
-
38
- - Use signals for local component state
39
- - Use `computed()` for derived state
40
- - Keep state transformations pure and predictable
41
- - Do NOT use `mutate` on signals, use `update` or `set` instead
42
-
43
- ## Templates
44
-
45
- - Keep templates simple and avoid complex logic
46
- - Use native control flow (`@if`, `@for`, `@switch`) instead of `*ngIf`, `*ngFor`, `*ngSwitch`
47
- - Use the async pipe to handle observables
48
-
49
- ## Services
50
-
51
- - Design services around a single responsibility
52
- - Use the `providedIn: 'root'` option for singleton services
53
- - Use the `inject()` function instead of constructor injection
package/.editorconfig DELETED
@@ -1,17 +0,0 @@
1
- # Editor configuration, see https://editorconfig.org
2
- root = true
3
-
4
- [*]
5
- charset = utf-8
6
- indent_style = space
7
- indent_size = 2
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
10
-
11
- [*.ts]
12
- quote_type = single
13
- ij_typescript_use_double_quotes = false
14
-
15
- [*.md]
16
- max_line_length = off
17
- trim_trailing_whitespace = false
package/.postcssrc.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "plugins": {
3
- "@tailwindcss/postcss": {}
4
- }
5
- }
package/.prettierrc DELETED
@@ -1,27 +0,0 @@
1
- {
2
- "printWidth": 100,
3
- "tabWidth": 2,
4
- "useTabs": false,
5
- "semi": true,
6
- "singleQuote": true,
7
- "trailingComma": "all",
8
- "bracketSpacing": true,
9
- "arrowParens": "always",
10
- "endOfLine": "lf",
11
- "htmlWhitespaceSensitivity": "ignore",
12
- "bracketSameLine": false,
13
- "overrides": [
14
- {
15
- "files": "*.html",
16
- "options": {
17
- "parser": "angular"
18
- }
19
- },
20
- {
21
- "files": "*.component.html",
22
- "options": {
23
- "parser": "angular"
24
- }
25
- }
26
- ]
27
- }
package/angular.json DELETED
@@ -1,122 +0,0 @@
1
- {
2
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3
- "version": 1,
4
- "newProjectRoot": "projects",
5
- "projects": {
6
- "shadcn-angular": {
7
- "projectType": "application",
8
- "schematics": {
9
- "@schematics/angular:component": {
10
- "prefix": "",
11
- "style": "none",
12
- "changeDetection": "OnPush",
13
- "standalone": true,
14
- "skipTests": true
15
- },
16
- "@schematics/angular:directive": {
17
- "prefix": "",
18
- "type": "directive"
19
- },
20
- "@schematics/angular:service": {
21
- "type": "service"
22
- },
23
- "@schematics/angular:guard": {
24
- "typeSeparator": "."
25
- },
26
- "@schematics/angular:interceptor": {
27
- "typeSeparator": "."
28
- },
29
- "@schematics/angular:module": {
30
- "typeSeparator": "."
31
- },
32
- "@schematics/angular:pipe": {
33
- "typeSeparator": "."
34
- },
35
- "@schematics/angular:resolver": {
36
- "typeSeparator": "."
37
- }
38
- },
39
- "root": "",
40
- "sourceRoot": "src",
41
- "prefix": "",
42
- "architect": {
43
- "build": {
44
- "builder": "@angular/build:application",
45
- "options": {
46
- "browser": "src/main.ts",
47
- "tsConfig": "tsconfig.app.json",
48
- "inlineStyleLanguage": "scss",
49
- "assets": [
50
- {
51
- "glob": "**/*",
52
- "input": "public"
53
- }
54
- ],
55
- "styles": [
56
- "src/styles.scss"
57
- ],
58
- "server": "src/main.server.ts",
59
- "outputMode": "server",
60
- "ssr": {
61
- "entry": "src/server.ts"
62
- }
63
- },
64
- "configurations": {
65
- "production": {
66
- "budgets": [
67
- {
68
- "type": "initial",
69
- "maximumWarning": "500kB",
70
- "maximumError": "1MB"
71
- },
72
- {
73
- "type": "anyComponentStyle",
74
- "maximumWarning": "4kB",
75
- "maximumError": "8kB"
76
- }
77
- ],
78
- "outputHashing": "all"
79
- },
80
- "development": {
81
- "optimization": false,
82
- "extractLicenses": false,
83
- "sourceMap": true
84
- }
85
- },
86
- "defaultConfiguration": "production"
87
- },
88
- "serve": {
89
- "builder": "@angular/build:dev-server",
90
- "configurations": {
91
- "production": {
92
- "buildTarget": "shadcn-angular:build:production"
93
- },
94
- "development": {
95
- "buildTarget": "shadcn-angular:build:development"
96
- }
97
- },
98
- "defaultConfiguration": "development"
99
- },
100
- "extract-i18n": {
101
- "builder": "@angular/build:extract-i18n"
102
- },
103
- "test": {
104
- "builder": "@angular/build:karma",
105
- "options": {
106
- "tsConfig": "tsconfig.spec.json",
107
- "inlineStyleLanguage": "scss",
108
- "assets": [
109
- {
110
- "glob": "**/*",
111
- "input": "public"
112
- }
113
- ],
114
- "styles": [
115
- "src/styles.scss"
116
- ]
117
- }
118
- }
119
- }
120
- }
121
- }
122
- }
@@ -1,30 +0,0 @@
1
- import os
2
- import re
3
-
4
- def process_html_file(file_path):
5
- with open(file_path, 'r', encoding='utf-8') as file:
6
- content = file.read()
7
-
8
- # Replace classes
9
- new_content = re.sub(r'\bmr-', 'me-', content)
10
- new_content = re.sub(r'\bml-', 'ms-', new_content)
11
- new_content = re.sub(r'\btext-left\b', 'text-start', new_content)
12
- new_content = re.sub(r'\btext-right\b', 'text-end', new_content)
13
-
14
- if new_content != content:
15
- with open(file_path, 'w', encoding='utf-8') as file:
16
- file.write(new_content)
17
- return True
18
- return False
19
-
20
- def traverse_and_process(directory):
21
- for root, _, files in os.walk(directory):
22
- for file in files:
23
- if file.endswith('.html'):
24
- file_path = os.path.join(root, file)
25
- if process_html_file(file_path):
26
- print(f"Changes made to: {file_path}")
27
-
28
- if __name__ == "__main__":
29
- src_directory = 'src'
30
- traverse_and_process(src_directory)
@@ -1,8 +0,0 @@
1
- import { Rule } from '@angular-devkit/schematics';
2
- interface ComponentOptions {
3
- name: string;
4
- project?: string;
5
- path?: string;
6
- }
7
- export declare function component(options: ComponentOptions): Rule;
8
- export {};
@@ -1,109 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.component = component;
4
- const core_1 = require("@angular-devkit/core");
5
- const schematics_1 = require("@angular-devkit/schematics");
6
- // Component registry - maps component names to their file structure
7
- const COMPONENT_REGISTRY = {
8
- button: {
9
- files: ['button.component.ts', 'index.ts'],
10
- dependencies: ['class-variance-authority', 'clsx', 'tailwind-merge', '@angular/cdk']
11
- },
12
- card: {
13
- files: ['card.component.ts', 'card-header.component.ts', 'card-title.component.ts', 'card-description.component.ts', 'card-content.component.ts', 'card-footer.component.ts', 'index.ts'],
14
- dependencies: ['clsx', 'tailwind-merge']
15
- },
16
- input: {
17
- files: ['input.component.ts', 'index.ts'],
18
- dependencies: ['clsx', 'tailwind-merge', '@angular/forms']
19
- },
20
- label: {
21
- files: ['label.component.ts', 'index.ts'],
22
- dependencies: ['class-variance-authority', 'clsx', 'tailwind-merge']
23
- },
24
- separator: {
25
- files: ['separator.component.ts', 'index.ts'],
26
- dependencies: ['clsx', 'tailwind-merge']
27
- },
28
- badge: {
29
- files: ['badge.component.ts', 'index.ts'],
30
- dependencies: ['class-variance-authority', 'clsx', 'tailwind-merge']
31
- },
32
- alert: {
33
- files: ['alert.component.ts', 'alert-title.component.ts', 'alert-description.component.ts', 'index.ts'],
34
- dependencies: ['class-variance-authority', 'clsx', 'tailwind-merge']
35
- },
36
- dialog: {
37
- files: ['dialog.component.ts', 'dialog-content.component.ts', 'dialog-header.component.ts', 'dialog-footer.component.ts', 'dialog-title.component.ts', 'dialog-description.component.ts', 'index.ts'],
38
- dependencies: ['@angular/cdk', 'clsx', 'tailwind-merge']
39
- },
40
- 'data-table': {
41
- files: [
42
- 'data-table.component.ts',
43
- 'data-table-content.component.ts',
44
- 'data-table-context.ts',
45
- 'data-table-pagination.component.ts',
46
- 'data-table-search.component.ts',
47
- 'data-table-toolbar.component.ts',
48
- 'data-table-view-options.component.ts',
49
- 'index.ts'
50
- ],
51
- dependencies: ['clsx', 'tailwind-merge', 'lucide-angular']
52
- },
53
- // Add more components as needed
54
- };
55
- function component(options) {
56
- return (tree, context) => {
57
- const componentName = options.name.toLowerCase();
58
- if (!COMPONENT_REGISTRY[componentName]) {
59
- const availableComponents = Object.keys(COMPONENT_REGISTRY).join(', ');
60
- throw new schematics_1.SchematicsException(`Component "${componentName}" not found. Available components: ${availableComponents}`);
61
- }
62
- const componentInfo = COMPONENT_REGISTRY[componentName];
63
- const basePath = options.path || 'src/app/lib/components/ui';
64
- const componentPath = (0, core_1.normalize)((0, core_1.join)((0, core_1.normalize)(basePath), (0, core_1.normalize)(componentName)));
65
- context.logger.info(`📦 Installing ${componentName} component...`);
66
- // Check if component directory already exists
67
- if (tree.exists(componentPath)) {
68
- context.logger.warn(`⚠️ Component directory ${componentPath} already exists. Skipping...`);
69
- return tree;
70
- }
71
- // Create component directory
72
- tree.create((0, core_1.join)(componentPath, '.gitkeep'), '');
73
- // Copy component files from the source
74
- const sourceBasePath = `src/app/lib/components/ui/${componentName}`;
75
- for (const file of componentInfo.files) {
76
- const sourcePath = (0, core_1.join)((0, core_1.normalize)(sourceBasePath), (0, core_1.normalize)(file));
77
- const targetPath = (0, core_1.join)(componentPath, (0, core_1.normalize)(file));
78
- if (tree.exists(sourcePath)) {
79
- const content = tree.read(sourcePath);
80
- if (content) {
81
- tree.create(targetPath, content);
82
- context.logger.info(` ✅ Created ${file}`);
83
- }
84
- }
85
- else {
86
- context.logger.warn(` ⚠️ Source file ${sourcePath} not found`);
87
- }
88
- }
89
- // Check dependencies
90
- context.logger.info('');
91
- context.logger.info('📚 Required dependencies:');
92
- for (const dep of componentInfo.dependencies) {
93
- context.logger.info(` - ${dep}`);
94
- }
95
- context.logger.info('');
96
- context.logger.info(`✅ ${componentName} component installed successfully!`);
97
- context.logger.info('');
98
- context.logger.info('📖 Import the component:');
99
- context.logger.info(` import { ${toPascalCase(componentName)} } from '@/ui/${componentName}';`);
100
- context.logger.info('');
101
- return tree;
102
- };
103
- }
104
- function toPascalCase(str) {
105
- return str
106
- .split('-')
107
- .map(word => word.charAt(0).toUpperCase() + word.slice(1))
108
- .join('');
109
- }
@@ -1,7 +0,0 @@
1
- import { Rule } from '@angular-devkit/schematics';
2
- interface NgAddOptions {
3
- project?: string;
4
- skipInstall?: boolean;
5
- }
6
- export declare function ngAdd(options: NgAddOptions): Rule;
7
- export {};
@@ -1,51 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ngAdd = ngAdd;
4
- const tasks_1 = require("@angular-devkit/schematics/tasks");
5
- function ngAdd(options) {
6
- return (tree, context) => {
7
- context.logger.info('✨ Adding shadcn-angular to your project...');
8
- // Add dependencies to package.json
9
- const packageJsonPath = '/package.json';
10
- if (tree.exists(packageJsonPath)) {
11
- const packageJson = JSON.parse(tree.read(packageJsonPath).toString('utf-8'));
12
- const requiredDependencies = {
13
- 'lucide-angular': '^0.562.0',
14
- 'class-variance-authority': '^0.7.1',
15
- 'clsx': '^2.1.1',
16
- 'tailwind-merge': '^3.4.0',
17
- '@angular/cdk': '^21.0.5',
18
- 'tailwindcss': '^4.1.18',
19
- '@tailwindcss/postcss': '^4.1.18'
20
- };
21
- // Check and add missing dependencies
22
- let needsInstall = false;
23
- for (const [pkg, version] of Object.entries(requiredDependencies)) {
24
- if (!packageJson.dependencies?.[pkg]) {
25
- packageJson.dependencies = packageJson.dependencies || {};
26
- packageJson.dependencies[pkg] = version;
27
- needsInstall = true;
28
- context.logger.info(` 📦 Adding ${pkg}@${version}`);
29
- }
30
- }
31
- if (needsInstall) {
32
- tree.overwrite(packageJsonPath, JSON.stringify(packageJson, null, 2));
33
- if (!options.skipInstall) {
34
- context.addTask(new tasks_1.NodePackageInstallTask());
35
- }
36
- }
37
- else {
38
- context.logger.info(' ✅ All dependencies already installed');
39
- }
40
- }
41
- context.logger.info('');
42
- context.logger.info('✅ shadcn-angular setup complete!');
43
- context.logger.info('');
44
- context.logger.info('📚 Next steps:');
45
- context.logger.info(' 1. Ensure Tailwind CSS is configured in your project');
46
- context.logger.info(' 2. Add CSS variables to your styles.scss (see docs)');
47
- context.logger.info(' 3. Install components: ng generate shadcn-angular:component button');
48
- context.logger.info('');
49
- return tree;
50
- };
51
- }
package/mcp.json DELETED
@@ -1,336 +0,0 @@
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
- }
@@ -1,6 +0,0 @@
1
- /** @type {import('postcss').Config} */
2
- export default {
3
- plugins: {
4
- '@tailwindcss/postcss': {},
5
- },
6
- };
File without changes
Binary file
Binary file
package/public/robots.txt DELETED
@@ -1,34 +0,0 @@
1
- # https://www.robotstxt.org/robotstxt.html
2
- User-agent: *
3
- Allow: /
4
-
5
- # Sitemaps
6
- Sitemap: https://shadcn-angular.dev/sitemap.xml
7
-
8
- # Disallow admin and internal paths
9
- Disallow: /api/
10
- Disallow: /_/
11
- Disallow: /admin/
12
-
13
- # Allow all major search engines
14
- User-agent: Googlebot
15
- Allow: /
16
-
17
- User-agent: Bingbot
18
- Allow: /
19
-
20
- User-agent: Slurp
21
- Allow: /
22
-
23
- User-agent: DuckDuckBot
24
- Allow: /
25
-
26
- User-agent: Baiduspider
27
- Allow: /
28
-
29
- User-agent: YandexBot
30
- Allow: /
31
-
32
- # Crawl-delay for less aggressive crawlers
33
- User-agent: *
34
- Crawl-delay: 1
@@ -1,45 +0,0 @@
1
- {
2
- "name": "shadcn-angular",
3
- "short_name": "shadcn-ng",
4
- "description": "Beautiful, accessible, and customizable UI components for Angular. Built with Tailwind CSS.",
5
- "start_url": "/",
6
- "display": "standalone",
7
- "background_color": "#ffffff",
8
- "theme_color": "#18181B",
9
- "orientation": "portrait-primary",
10
- "scope": "/",
11
- "lang": "en",
12
- "categories": ["developer tools", "productivity", "utilities"],
13
- "icons": [
14
- {
15
- "src": "/android-chrome-192x192.png",
16
- "sizes": "192x192",
17
- "type": "image/png",
18
- "purpose": "any maskable"
19
- },
20
- {
21
- "src": "/android-chrome-512x512.png",
22
- "sizes": "512x512",
23
- "type": "image/png",
24
- "purpose": "any maskable"
25
- }
26
- ],
27
- "screenshots": [
28
- {
29
- "src": "/screenshots/home.png",
30
- "sizes": "1280x720",
31
- "type": "image/png",
32
- "form_factor": "wide",
33
- "label": "Home page showing component library overview"
34
- },
35
- {
36
- "src": "/screenshots/components.png",
37
- "sizes": "1280x720",
38
- "type": "image/png",
39
- "form_factor": "wide",
40
- "label": "Components documentation page"
41
- }
42
- ],
43
- "related_applications": [],
44
- "prefer_related_applications": false
45
- }
package/tsconfig.app.json DELETED
@@ -1,17 +0,0 @@
1
- /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
- /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
- {
4
- "extends": "./tsconfig.json",
5
- "compilerOptions": {
6
- "outDir": "./out-tsc/app",
7
- "types": [
8
- "node"
9
- ]
10
- },
11
- "include": [
12
- "src/**/*.ts"
13
- ],
14
- "exclude": [
15
- "src/**/*.spec.ts"
16
- ]
17
- }
package/tsconfig.json DELETED
@@ -1,45 +0,0 @@
1
- /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
- /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
- {
4
- "compileOnSave": false,
5
- "compilerOptions": {
6
- "strict": true,
7
- "noImplicitOverride": true,
8
- "noPropertyAccessFromIndexSignature": true,
9
- "noImplicitReturns": true,
10
- "noFallthroughCasesInSwitch": true,
11
- "skipLibCheck": true,
12
- "isolatedModules": true,
13
- "experimentalDecorators": true,
14
- "importHelpers": true,
15
- "target": "ES2022",
16
- "module": "preserve",
17
- "baseUrl": ".",
18
- "paths": {
19
- "@/*": ["src/*"],
20
- "@/lib/*": ["src/app/lib/*"],
21
- "@/components/*": ["src/app/components/*"],
22
- "@/ui/*": ["src/app/lib/components/ui/*"],
23
- "@/utils/*": ["src/app/lib/utils/*"],
24
- "@/services/*": ["src/app/services/*"],
25
- "@/data/*": ["src/app/data/*"],
26
- "@/pages/*": ["src/app/pages/*"]
27
- }
28
- },
29
- "angularCompilerOptions": {
30
- "enableI18nLegacyMessageIdFormat": false,
31
- "strictInjectionParameters": true,
32
- "strictInputAccessModifiers": true,
33
- "typeCheckHostBindings": true,
34
- "strictTemplates": true
35
- },
36
- "files": [],
37
- "references": [
38
- {
39
- "path": "./tsconfig.app.json"
40
- },
41
- {
42
- "path": "./tsconfig.spec.json"
43
- }
44
- ]
45
- }
@@ -1,15 +0,0 @@
1
- /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
- /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
- {
4
- "extends": "./tsconfig.json",
5
- "compilerOptions": {
6
- "outDir": "./out-tsc/spec",
7
- "types": [
8
- "jasmine"
9
- ]
10
- },
11
- "include": [
12
- "src/**/*.d.ts",
13
- "src/**/*.spec.ts"
14
- ]
15
- }