@enjoys/context-engine 1.2.0 → 1.4.1
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/data/codeActions/angular.json +126 -0
- package/data/codeActions/css.json +111 -0
- package/data/codeActions/nestjs.json +124 -0
- package/data/codeActions/nextjs.json +198 -0
- package/data/codeActions/react.json +154 -0
- package/data/codeActions/shadcn.json +112 -0
- package/data/codeActions/shell.json +169 -26
- package/data/codeActions/tailwindcss.json +76 -0
- package/data/codeLens/angular.json +22 -0
- package/data/codeLens/css.json +68 -0
- package/data/codeLens/nestjs.json +21 -0
- package/data/codeLens/nextjs.json +117 -0
- package/data/codeLens/react.json +89 -0
- package/data/codeLens/shadcn.json +89 -0
- package/data/codeLens/shell.json +59 -17
- package/data/codeLens/tailwindcss.json +103 -0
- package/data/color/angular.json +21 -0
- package/data/color/css.json +124 -0
- package/data/color/nestjs.json +18 -0
- package/data/color/nextjs.json +22 -0
- package/data/color/react.json +93 -0
- package/data/color/shadcn.json +66 -0
- package/data/color/shell.json +106 -80
- package/data/color/tailwindcss.json +53 -0
- package/data/commands/angular.json +312 -0
- package/data/commands/css.json +41 -0
- package/data/commands/manifest.json +734 -727
- package/data/commands/nestjs.json +273 -0
- package/data/commands/nextjs.json +123 -0
- package/data/commands/react.json +210 -0
- package/data/commands/shadcn.json +410 -0
- package/data/commands/shell.json +571 -41
- package/data/commands/tailwindcss.json +53 -0
- package/data/completion/angular.json +1490 -0
- package/data/completion/css.json +1176 -0
- package/data/completion/javascript.json +27 -0
- package/data/completion/nestjs.json +1454 -0
- package/data/completion/nextjs.json +1373 -0
- package/data/completion/react.json +1319 -0
- package/data/completion/redis-cli.json +1 -1
- package/data/completion/shadcn.json +1202 -0
- package/data/completion/shell.json +2446 -510
- package/data/completion/tailwindcss.json +284 -0
- package/data/completion/typescript.json +27 -0
- package/data/declaration/angular.json +46 -0
- package/data/declaration/css.json +59 -0
- package/data/declaration/nestjs.json +47 -0
- package/data/declaration/nextjs.json +274 -0
- package/data/declaration/react.json +199 -0
- package/data/declaration/shadcn.json +211 -0
- package/data/declaration/shell.json +343 -24
- package/data/declaration/tailwindcss.json +137 -0
- package/data/definition/angular.json +670 -0
- package/data/definition/css.json +115 -0
- package/data/definition/nestjs.json +684 -0
- package/data/definition/nextjs.json +439 -0
- package/data/definition/react.json +397 -0
- package/data/definition/redis-cli.json +1 -1
- package/data/definition/shadcn.json +99 -0
- package/data/definition/shell.json +820 -0
- package/data/definition/tailwindcss.json +115 -0
- package/data/documentHighlight/angular.json +414 -0
- package/data/documentHighlight/css.json +125 -0
- package/data/documentHighlight/nestjs.json +115 -0
- package/data/documentHighlight/nextjs.json +212 -0
- package/data/documentHighlight/react.json +119 -0
- package/data/documentHighlight/shadcn.json +168 -0
- package/data/documentHighlight/shell.json +664 -334
- package/data/documentHighlight/tailwindcss.json +160 -0
- package/data/documentRangeFormatting/angular.json +45 -0
- package/data/documentRangeFormatting/css.json +101 -0
- package/data/documentRangeFormatting/nestjs.json +17 -0
- package/data/documentRangeFormatting/nextjs.json +17 -0
- package/data/documentRangeFormatting/react.json +78 -0
- package/data/documentRangeFormatting/shadcn.json +45 -0
- package/data/documentRangeFormatting/shell.json +120 -53
- package/data/documentRangeFormatting/tailwindcss.json +55 -0
- package/data/documentSymbol/angular.json +180 -0
- package/data/documentSymbol/css.json +96 -0
- package/data/documentSymbol/nestjs.json +152 -0
- package/data/documentSymbol/nextjs.json +159 -0
- package/data/documentSymbol/react.json +145 -0
- package/data/documentSymbol/shadcn.json +131 -0
- package/data/documentSymbol/shell.json +166 -26
- package/data/documentSymbol/tailwindcss.json +110 -0
- package/data/foldingRange/angular.json +99 -0
- package/data/foldingRange/css.json +66 -0
- package/data/foldingRange/nestjs.json +26 -0
- package/data/foldingRange/nextjs.json +26 -0
- package/data/foldingRange/react.json +120 -0
- package/data/foldingRange/shadcn.json +93 -0
- package/data/foldingRange/shell.json +106 -46
- package/data/foldingRange/tailwindcss.json +60 -0
- package/data/formatting/angular.json +21 -0
- package/data/formatting/css.json +73 -0
- package/data/formatting/nestjs.json +23 -0
- package/data/formatting/nextjs.json +23 -0
- package/data/formatting/react.json +71 -0
- package/data/formatting/shadcn.json +61 -0
- package/data/formatting/shell.json +103 -19
- package/data/formatting/tailwindcss.json +48 -0
- package/data/hover/angular.json +455 -0
- package/data/hover/css.json +300 -0
- package/data/hover/nestjs.json +296 -0
- package/data/hover/nextjs.json +305 -0
- package/data/hover/react.json +173 -0
- package/data/hover/redis-cli.json +1 -1
- package/data/hover/shadcn.json +450 -0
- package/data/hover/shell.json +684 -75
- package/data/hover/tailwindcss.json +968 -0
- package/data/implementation/angular.json +22 -0
- package/data/implementation/css.json +65 -0
- package/data/implementation/nestjs.json +24 -0
- package/data/implementation/nextjs.json +137 -0
- package/data/implementation/react.json +125 -0
- package/data/implementation/shadcn.json +89 -0
- package/data/implementation/shell.json +59 -3
- package/data/implementation/tailwindcss.json +59 -0
- package/data/inlayHints/angular.json +24 -0
- package/data/inlayHints/css.json +87 -0
- package/data/inlayHints/nestjs.json +24 -0
- package/data/inlayHints/nextjs.json +143 -0
- package/data/inlayHints/react.json +177 -0
- package/data/inlayHints/shadcn.json +109 -0
- package/data/inlayHints/shell.json +223 -35
- package/data/inlayHints/tailwindcss.json +111 -0
- package/data/inlineCompletions/angular.json +135 -0
- package/data/inlineCompletions/css.json +125 -0
- package/data/inlineCompletions/javascript.json +12 -0
- package/data/inlineCompletions/nestjs.json +25 -0
- package/data/inlineCompletions/nextjs.json +179 -0
- package/data/inlineCompletions/react.json +203 -0
- package/data/inlineCompletions/shadcn.json +115 -0
- package/data/inlineCompletions/shell.json +185 -35
- package/data/inlineCompletions/tailwindcss.json +411 -0
- package/data/inlineCompletions/typescript.json +12 -0
- package/data/linkedEditingRange/angular.json +23 -0
- package/data/linkedEditingRange/css.json +40 -0
- package/data/linkedEditingRange/nestjs.json +10 -0
- package/data/linkedEditingRange/nextjs.json +11 -0
- package/data/linkedEditingRange/react.json +75 -0
- package/data/linkedEditingRange/shadcn.json +23 -0
- package/data/linkedEditingRange/shell.json +25 -25
- package/data/linkedEditingRange/tailwindcss.json +30 -0
- package/data/links/angular.json +95 -0
- package/data/links/css.json +55 -0
- package/data/links/nestjs.json +130 -0
- package/data/links/nextjs.json +91 -0
- package/data/links/react.json +75 -0
- package/data/links/shadcn.json +98 -0
- package/data/links/shell.json +56 -0
- package/data/links/tailwindcss.json +65 -0
- package/data/manifest.json +399 -150
- package/data/onTypeFormatting/angular.json +14 -0
- package/data/onTypeFormatting/css.json +82 -0
- package/data/onTypeFormatting/nestjs.json +16 -0
- package/data/onTypeFormatting/nextjs.json +17 -0
- package/data/onTypeFormatting/react.json +127 -0
- package/data/onTypeFormatting/shadcn.json +54 -0
- package/data/onTypeFormatting/shell.json +72 -68
- package/data/onTypeFormatting/tailwindcss.json +63 -0
- package/data/rangeSemanticTokens/angular.json +140 -0
- package/data/rangeSemanticTokens/css.json +125 -0
- package/data/rangeSemanticTokens/nestjs.json +27 -0
- package/data/rangeSemanticTokens/nextjs.json +28 -0
- package/data/rangeSemanticTokens/react.json +216 -0
- package/data/rangeSemanticTokens/shadcn.json +140 -0
- package/data/rangeSemanticTokens/shell.json +247 -69
- package/data/rangeSemanticTokens/tailwindcss.json +186 -0
- package/data/references/angular.json +26 -0
- package/data/references/css.json +65 -0
- package/data/references/nestjs.json +24 -0
- package/data/references/nextjs.json +178 -0
- package/data/references/react.json +192 -0
- package/data/references/shadcn.json +101 -0
- package/data/references/shell.json +323 -92
- package/data/references/tailwindcss.json +125 -0
- package/data/rename/angular.json +131 -0
- package/data/rename/css.json +91 -0
- package/data/rename/nestjs.json +32 -0
- package/data/rename/nextjs.json +31 -0
- package/data/rename/react.json +88 -0
- package/data/rename/shadcn.json +79 -0
- package/data/rename/shell.json +101 -31
- package/data/rename/tailwindcss.json +58 -0
- package/data/selectionRange/angular.json +95 -0
- package/data/selectionRange/css.json +55 -0
- package/data/selectionRange/nestjs.json +21 -0
- package/data/selectionRange/nextjs.json +22 -0
- package/data/selectionRange/react.json +87 -0
- package/data/selectionRange/shadcn.json +89 -0
- package/data/selectionRange/shell.json +65 -35
- package/data/selectionRange/tailwindcss.json +35 -0
- package/data/semanticTokens/angular.json +198 -0
- package/data/semanticTokens/css.json +107 -0
- package/data/semanticTokens/nestjs.json +35 -0
- package/data/semanticTokens/nextjs.json +38 -0
- package/data/semanticTokens/react.json +215 -0
- package/data/semanticTokens/shadcn.json +180 -0
- package/data/semanticTokens/shell.json +238 -65
- package/data/semanticTokens/tailwindcss.json +161 -0
- package/data/signatureHelp/angular.json +182 -0
- package/data/signatureHelp/css.json +137 -0
- package/data/signatureHelp/nestjs.json +128 -0
- package/data/signatureHelp/nextjs.json +127 -0
- package/data/signatureHelp/react.json +281 -0
- package/data/signatureHelp/shadcn.json +237 -0
- package/data/signatureHelp/shell.json +797 -104
- package/data/signatureHelp/tailwindcss.json +64 -0
- package/data/typeDefinition/angular.json +362 -0
- package/data/typeDefinition/css.json +53 -0
- package/data/typeDefinition/nestjs.json +334 -0
- package/data/typeDefinition/nextjs.json +285 -0
- package/data/typeDefinition/react.json +236 -0
- package/data/typeDefinition/shadcn.json +292 -0
- package/data/typeDefinition/shell.json +104 -40
- package/data/typeDefinition/tailwindcss.json +47 -0
- package/package.json +1 -1
- package/data/codeActions/bash.json +0 -169
- package/data/codeActions/zsh.json +0 -49
- package/data/codeLens/bash.json +0 -75
- package/data/codeLens/zsh.json +0 -19
- package/data/color/bash.json +0 -100
- package/data/color/zsh.json +0 -80
- package/data/commands/bash.json +0 -102
- package/data/commands/zsh.json +0 -166
- package/data/completion/bash.json +0 -1184
- package/data/completion/zsh.json +0 -973
- package/data/declaration/bash.json +0 -301
- package/data/declaration/zsh.json +0 -205
- package/data/definition/bash.json +0 -565
- package/data/definition/zsh.json +0 -350
- package/data/documentHighlight/bash.json +0 -393
- package/data/documentHighlight/zsh.json +0 -266
- package/data/documentRangeFormatting/bash.json +0 -41
- package/data/documentRangeFormatting/zsh.json +0 -59
- package/data/documentSymbol/bash.json +0 -124
- package/data/documentSymbol/zsh.json +0 -26
- package/data/foldingRange/bash.json +0 -76
- package/data/foldingRange/zsh.json +0 -46
- package/data/formatting/bash.json +0 -88
- package/data/formatting/zsh.json +0 -28
- package/data/hover/bash.json +0 -579
- package/data/hover/zsh.json +0 -96
- package/data/implementation/bash.json +0 -44
- package/data/implementation/zsh.json +0 -41
- package/data/inlayHints/bash.json +0 -207
- package/data/inlayHints/zsh.json +0 -43
- package/data/inlineCompletions/bash.json +0 -155
- package/data/inlineCompletions/zsh.json +0 -17
- package/data/linkedEditingRange/bash.json +0 -25
- package/data/linkedEditingRange/zsh.json +0 -25
- package/data/links/bash.json +0 -56
- package/data/links/zsh.json +0 -15
- package/data/onTypeFormatting/bash.json +0 -68
- package/data/onTypeFormatting/zsh.json +0 -68
- package/data/rangeSemanticTokens/bash.json +0 -90
- package/data/rangeSemanticTokens/zsh.json +0 -76
- package/data/references/bash.json +0 -221
- package/data/references/zsh.json +0 -166
- package/data/rename/bash.json +0 -37
- package/data/rename/zsh.json +0 -31
- package/data/selectionRange/bash.json +0 -35
- package/data/selectionRange/zsh.json +0 -35
- package/data/semanticTokens/bash.json +0 -71
- package/data/semanticTokens/zsh.json +0 -71
- package/data/signatureHelp/bash.json +0 -111
- package/data/signatureHelp/zsh.json +0 -118
- package/data/typeDefinition/bash.json +0 -95
- package/data/typeDefinition/zsh.json +0 -40
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"language": "nestjs",
|
|
3
|
+
"inlineCompletions": [
|
|
4
|
+
{ "triggerPattern": "^\\s*@Controller\\($", "insertText": "'${1:path}')\nexport class ${2:Name}Controller {\n\tconstructor(private readonly ${3:name}Service: ${2:Name}Service) {}\n\n\t@Get()\n\tfindAll() {\n\t\treturn this.${3:name}Service.findAll();\n\t}\n}", "description": "Controller class template", "completeBracketPairs": true },
|
|
5
|
+
{ "triggerPattern": "^\\s*@Injectable\\(\\)$", "insertText": "\nexport class ${1:Name}Service {\n\tconstructor() {}\n\n\t${2:// service methods}\n}", "description": "Injectable service template", "completeBracketPairs": true },
|
|
6
|
+
{ "triggerPattern": "^\\s*@Module\\($", "insertText": "{\n\timports: [${1}],\n\tcontrollers: [${2}],\n\tproviders: [${3}],\n\texports: [${4}],\n})\nexport class ${5:Name}Module {}", "description": "Module definition template", "completeBracketPairs": true },
|
|
7
|
+
{ "triggerPattern": "^\\s*@Get\\($", "insertText": "'${1:path}')\nasync ${2:findAll}(${3}): Promise<${4:any}> {\n\t${5:return [];}\n}", "description": "GET endpoint handler", "completeBracketPairs": true },
|
|
8
|
+
{ "triggerPattern": "^\\s*@Post\\($", "insertText": "'${1:path}')\n@HttpCode(${2:201})\nasync ${3:create}(@Body() ${4:createDto}: ${5:CreateDto}): Promise<${6:any}> {\n\t${7:return this.service.create(createDto);}\n}", "description": "POST endpoint handler", "completeBracketPairs": true },
|
|
9
|
+
{ "triggerPattern": "^\\s*@Put\\($", "insertText": "'${1::id}')\nasync ${2:update}(@Param('id') id: string, @Body() ${3:updateDto}: ${4:UpdateDto}): Promise<${5:any}> {\n\t${6:return this.service.update(id, updateDto);}\n}", "description": "PUT endpoint handler", "completeBracketPairs": true },
|
|
10
|
+
{ "triggerPattern": "^\\s*@Delete\\($", "insertText": "'${1::id}')\n@HttpCode(${2:204})\nasync ${3:remove}(@Param('id') id: string): Promise<void> {\n\t${4:return this.service.remove(id);}\n}", "description": "DELETE endpoint handler", "completeBracketPairs": true },
|
|
11
|
+
{ "triggerPattern": "^\\s*@UseGuards\\($", "insertText": "${1:AuthGuard})\n${2}", "description": "Guard decorator", "completeBracketPairs": true },
|
|
12
|
+
{ "triggerPattern": "^\\s*canActivate\\($", "insertText": "context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {\n\tconst request = context.switchToHttp().getRequest();\n\t${1:return true;}\n}", "description": "Guard canActivate method", "completeBracketPairs": true },
|
|
13
|
+
{ "triggerPattern": "^\\s*transform\\($", "insertText": "value: ${1:any}, metadata: ArgumentMetadata): ${2:any} {\n\t${3:return value;}\n}", "description": "Pipe transform method", "completeBracketPairs": true },
|
|
14
|
+
{ "triggerPattern": "^\\s*intercept\\($", "insertText": "context: ExecutionContext, next: CallHandler): Observable<${1:any}> {\n\t${2:console.log('Before...');}\n\treturn next.handle().pipe(\n\t\t${3:tap(() => console.log('After...'))}\n\t);\n}", "description": "Interceptor intercept method", "completeBracketPairs": true },
|
|
15
|
+
{ "triggerPattern": "^\\s*catch\\(exception$", "insertText": ": ${1:HttpException}, host: ArgumentsHost) {\n\tconst ctx = host.switchToHttp();\n\tconst response = ctx.getResponse<Response>();\n\tconst status = exception.getStatus();\n\n\tresponse.status(status).json({\n\t\tstatusCode: status,\n\t\tmessage: exception.message,\n\t\ttimestamp: new Date().toISOString(),\n\t});\n}", "description": "Exception filter catch method", "completeBracketPairs": true },
|
|
16
|
+
{ "triggerPattern": "^\\s*Test\\.createTestingModule\\($", "insertText": "{\n\timports: [${1}],\n\tcontrollers: [${2}],\n\tproviders: [${3}],\n}).compile();\n\n${4:service} = module.get<${5:Service}>(${5:Service});", "description": "Testing module setup", "completeBracketPairs": true },
|
|
17
|
+
{ "triggerPattern": "^\\s*@WebSocketGateway\\($", "insertText": "${1:80}, { namespace: '${2:events}' })\nexport class ${3:Name}Gateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {\n\t@WebSocketServer()\n\tserver: Server;\n\n\t@SubscribeMessage('${4:message}')\n\thandle${4:Message}(client: Socket, payload: ${5:any}): ${6:any} {\n\t\t${7:return payload;}\n\t}\n}", "description": "WebSocket gateway template", "completeBracketPairs": true },
|
|
18
|
+
{ "triggerPattern": "^\\s*configure\\($", "insertText": "consumer: MiddlewareConsumer) {\n\tconsumer\n\t\t.apply(${1:LoggerMiddleware})\n\t\t.forRoutes(${2:'*'});\n}", "description": "Middleware configuration", "completeBracketPairs": true },
|
|
19
|
+
{ "triggerPattern": "^\\s*@Cron\\($", "insertText": "'${1:*/30 * * * * *}')\nasync ${2:handleCron}() {\n\t${3:// scheduled task}\n}", "description": "Cron job handler", "completeBracketPairs": true },
|
|
20
|
+
{ "triggerPattern": "^\\s*TypeOrmModule\\.forRoot\\($", "insertText": "{\n\ttype: '${1|postgres,mysql,sqlite,mariadb,mssql|}',\n\thost: '${2:localhost}',\n\tport: ${3:5432},\n\tusername: '${4:user}',\n\tpassword: '${5:password}',\n\tdatabase: '${6:db}',\n\tentities: [${7}],\n\tsynchronize: ${8:true},\n})", "description": "TypeORM connection config", "completeBracketPairs": true },
|
|
21
|
+
{ "triggerPattern": "^\\s*@ApiOperation\\($", "insertText": "{ summary: '${1:Operation description}' })\n@ApiResponse({ status: ${2:200}, description: '${3:Success}' })\n${4}", "description": "Swagger operation docs", "completeBracketPairs": true },
|
|
22
|
+
{ "triggerPattern": "^\\s*@Entity\\($", "insertText": "'${1:table_name}')\nexport class ${2:Name}Entity {\n\t@PrimaryGeneratedColumn()\n\tid: number;\n\n\t@Column()\n\t${3:name}: ${4:string};\n\n\t@CreateDateColumn()\n\tcreatedAt: Date;\n\n\t@UpdateDateColumn()\n\tupdatedAt: Date;\n}", "description": "TypeORM entity template", "completeBracketPairs": true },
|
|
23
|
+
{ "triggerPattern": "^\\s*class\\s+\\w+Dto$", "insertText": " {\n\t@IsNotEmpty()\n\t@IsString()\n\t${1:name}: string;\n\n\t@IsOptional()\n\t@IsNumber()\n\t${2:age}?: number;\n}", "description": "DTO class with validators", "completeBracketPairs": true }
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
{
|
|
2
|
+
"language": "nextjs",
|
|
3
|
+
"inlineCompletions": [
|
|
4
|
+
{
|
|
5
|
+
"triggerPattern": "export\\s+default\\s+function\\s+Page",
|
|
6
|
+
"insertText": "export default function Page({\n params,\n searchParams\n}: {\n params: Promise<{ slug: string }>\n searchParams: Promise<{ [key: string]: string | string[] | undefined }>\n}) {\n return (\n <div>\n <h1>Page</h1>\n </div>\n )\n}",
|
|
7
|
+
"description": "App Router page component template",
|
|
8
|
+
"completeBracketPairs": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"triggerPattern": "export\\s+default\\s+function\\s+Layout",
|
|
12
|
+
"insertText": "export default function Layout({\n children\n}: {\n children: React.ReactNode\n}) {\n return (\n <div>\n {children}\n </div>\n )\n}",
|
|
13
|
+
"description": "App Router layout component template",
|
|
14
|
+
"completeBracketPairs": true
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"triggerPattern": "export\\s+default\\s+function\\s+RootLayout",
|
|
18
|
+
"insertText": "export default function RootLayout({\n children\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n )\n}",
|
|
19
|
+
"description": "Root layout component with html and body tags",
|
|
20
|
+
"completeBracketPairs": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"triggerPattern": "export\\s+default\\s+function\\s+Loading",
|
|
24
|
+
"insertText": "export default function Loading() {\n return (\n <div className=\"flex items-center justify-center\">\n <p>Loading...</p>\n </div>\n )\n}",
|
|
25
|
+
"description": "Loading component template",
|
|
26
|
+
"completeBracketPairs": true
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"triggerPattern": "export\\s+default\\s+function\\s+Error",
|
|
30
|
+
"insertText": "'use client'\n\nexport default function Error({\n error,\n reset\n}: {\n error: Error & { digest?: string }\n reset: () => void\n}) {\n return (\n <div>\n <h2>Something went wrong!</h2>\n <button onClick={() => reset()}>Try again</button>\n </div>\n )\n}",
|
|
31
|
+
"description": "Error boundary component template",
|
|
32
|
+
"completeBracketPairs": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"triggerPattern": "export\\s+default\\s+function\\s+NotFound",
|
|
36
|
+
"insertText": "export default function NotFound() {\n return (\n <div>\n <h2>Not Found</h2>\n <p>Could not find the requested resource.</p>\n </div>\n )\n}",
|
|
37
|
+
"description": "Not-found component template",
|
|
38
|
+
"completeBracketPairs": true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"triggerPattern": "export\\s+async\\s+function\\s+GET",
|
|
42
|
+
"insertText": "export async function GET(\n request: NextRequest,\n { params }: { params: Promise<{ id: string }> }\n) {\n const { id } = await params\n return NextResponse.json({ id })\n}",
|
|
43
|
+
"description": "Route Handler GET method",
|
|
44
|
+
"completeBracketPairs": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"triggerPattern": "export\\s+async\\s+function\\s+POST",
|
|
48
|
+
"insertText": "export async function POST(request: NextRequest) {\n const body = await request.json()\n return NextResponse.json({ success: true }, { status: 201 })\n}",
|
|
49
|
+
"description": "Route Handler POST method",
|
|
50
|
+
"completeBracketPairs": true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"triggerPattern": "export\\s+(?:async\\s+)?function\\s+middleware",
|
|
54
|
+
"insertText": "import { NextResponse } from 'next/server'\nimport type { NextRequest } from 'next/server'\n\nexport function middleware(request: NextRequest) {\n return NextResponse.next()\n}\n\nexport const config = {\n matcher: ['/dashboard/:path*']\n}",
|
|
55
|
+
"description": "Middleware function template",
|
|
56
|
+
"completeBracketPairs": true
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"triggerPattern": "['\"]use server['\"]\\s*$",
|
|
60
|
+
"insertText": "'use server'\n\nexport async function submitForm(formData: FormData) {\n const data = Object.fromEntries(formData)\n // Process form data\n}",
|
|
61
|
+
"description": "Server Action template",
|
|
62
|
+
"completeBracketPairs": true
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"triggerPattern": "const\\s+router\\s*=\\s*useRouter",
|
|
66
|
+
"insertText": "const router = useRouter()\n\nconst handleNavigate = () => {\n router.push('/destination')\n}",
|
|
67
|
+
"description": "useRouter with navigation handler",
|
|
68
|
+
"completeBracketPairs": true
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"triggerPattern": "const\\s+pathname\\s*=\\s*usePathname",
|
|
72
|
+
"insertText": "const pathname = usePathname()",
|
|
73
|
+
"description": "usePathname hook usage",
|
|
74
|
+
"completeBracketPairs": true
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"triggerPattern": "const\\s+searchParams\\s*=\\s*useSearchParams",
|
|
78
|
+
"insertText": "const searchParams = useSearchParams()\nconst query = searchParams.get('q')",
|
|
79
|
+
"description": "useSearchParams hook with query extraction",
|
|
80
|
+
"completeBracketPairs": true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"triggerPattern": "<Image\\s",
|
|
84
|
+
"insertText": "<Image\n src=\"/image.png\"\n width={500}\n height={300}\n alt=\"Description\"\n/>",
|
|
85
|
+
"description": "next/image component with required props",
|
|
86
|
+
"completeBracketPairs": true
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"triggerPattern": "<Image\\s+fill",
|
|
90
|
+
"insertText": "<Image\n src=\"/image.png\"\n fill\n sizes=\"(max-width: 768px) 100vw, 50vw\"\n alt=\"Description\"\n className=\"object-cover\"\n/>",
|
|
91
|
+
"description": "next/image with fill mode",
|
|
92
|
+
"completeBracketPairs": true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"triggerPattern": "<Link\\s",
|
|
96
|
+
"insertText": "<Link href=\"/path\">\n Link Text\n</Link>",
|
|
97
|
+
"description": "next/link component",
|
|
98
|
+
"completeBracketPairs": true
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"triggerPattern": "export\\s+async\\s+function\\s+generateMetadata",
|
|
102
|
+
"insertText": "export async function generateMetadata(\n { params }: { params: Promise<{ slug: string }> },\n parent: ResolvingMetadata\n): Promise<Metadata> {\n const { slug } = await params\n return {\n title: slug,\n description: `Description for ${slug}`\n }\n}",
|
|
103
|
+
"description": "generateMetadata function template",
|
|
104
|
+
"completeBracketPairs": true
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"triggerPattern": "export\\s+async\\s+function\\s+generateStaticParams",
|
|
108
|
+
"insertText": "export async function generateStaticParams() {\n const items = await fetchItems()\n return items.map((item) => ({\n slug: item.slug\n }))\n}",
|
|
109
|
+
"description": "generateStaticParams function template",
|
|
110
|
+
"completeBracketPairs": true
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"triggerPattern": "export\\s+const\\s+metadata\\s*:\\s*Metadata",
|
|
114
|
+
"insertText": "export const metadata: Metadata = {\n title: 'Page Title',\n description: 'Page description',\n openGraph: {\n title: 'Page Title',\n description: 'Page description',\n type: 'website'\n }\n}",
|
|
115
|
+
"description": "Static metadata export with OpenGraph",
|
|
116
|
+
"completeBracketPairs": true
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"triggerPattern": "export\\s+default\\s+(?:async\\s+)?function\\s+handler",
|
|
120
|
+
"insertText": "import type { NextApiRequest, NextApiResponse } from 'next'\n\nexport default async function handler(\n req: NextApiRequest,\n res: NextApiResponse\n) {\n if (req.method === 'GET') {\n return res.status(200).json({ message: 'OK' })\n }\n return res.status(405).json({ message: 'Method not allowed' })\n}",
|
|
121
|
+
"description": "Pages Router API route handler",
|
|
122
|
+
"completeBracketPairs": true
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"triggerPattern": "import\\s+dynamic\\s+from\\s+['\"]next/dynamic['\"]",
|
|
126
|
+
"insertText": "import dynamic from 'next/dynamic'\n\nconst DynamicComponent = dynamic(() => import('./Component'), {\n loading: () => <p>Loading...</p>,\n ssr: false\n})",
|
|
127
|
+
"description": "Dynamic import with next/dynamic",
|
|
128
|
+
"completeBracketPairs": true
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"triggerPattern": "<form\\s+action\\s*=",
|
|
132
|
+
"insertText": "<form action={async (formData: FormData) => {\n 'use server'\n const data = Object.fromEntries(formData)\n // Process form data\n}}>\n <input type=\"text\" name=\"field\" />\n <button type=\"submit\">Submit</button>\n</form>",
|
|
133
|
+
"description": "Form with inline Server Action",
|
|
134
|
+
"completeBracketPairs": true
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"triggerPattern": "export\\s+async\\s+function\\s+PUT",
|
|
138
|
+
"insertText": "export async function PUT(\n request: NextRequest,\n { params }: { params: Promise<{ id: string }> }\n) {\n const { id } = await params\n const body = await request.json()\n return NextResponse.json({ id, ...body })\n}",
|
|
139
|
+
"description": "Route Handler PUT method",
|
|
140
|
+
"completeBracketPairs": true
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"triggerPattern": "export\\s+async\\s+function\\s+DELETE",
|
|
144
|
+
"insertText": "export async function DELETE(\n request: NextRequest,\n { params }: { params: Promise<{ id: string }> }\n) {\n const { id } = await params\n return NextResponse.json({ deleted: true })\n}",
|
|
145
|
+
"description": "Route Handler DELETE method",
|
|
146
|
+
"completeBracketPairs": true
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"triggerPattern": "const\\s+\\{\\s*pending",
|
|
150
|
+
"insertText": "const { pending, data, method, action } = useFormStatus()",
|
|
151
|
+
"description": "useFormStatus destructuring",
|
|
152
|
+
"completeBracketPairs": true
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"triggerPattern": "const\\s+\\[state,\\s*formAction\\]\\s*=\\s*useFormState",
|
|
156
|
+
"insertText": "const [state, formAction] = useFormState(serverAction, initialState)",
|
|
157
|
+
"description": "useFormState hook usage",
|
|
158
|
+
"completeBracketPairs": true
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"triggerPattern": "export\\s+default\\s+function\\s+Template",
|
|
162
|
+
"insertText": "export default function Template({\n children\n}: {\n children: React.ReactNode\n}) {\n return <div>{children}</div>\n}",
|
|
163
|
+
"description": "Template component",
|
|
164
|
+
"completeBracketPairs": true
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"triggerPattern": "export\\s+default\\s+function\\s+GlobalError",
|
|
168
|
+
"insertText": "'use client'\n\nexport default function GlobalError({\n error,\n reset\n}: {\n error: Error & { digest?: string }\n reset: () => void\n}) {\n return (\n <html>\n <body>\n <h2>Something went wrong!</h2>\n <button onClick={() => reset()}>Try again</button>\n </body>\n </html>\n )\n}",
|
|
169
|
+
"description": "Global error component with required html/body tags",
|
|
170
|
+
"completeBracketPairs": true
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"triggerPattern": "<Script\\s",
|
|
174
|
+
"insertText": "<Script\n src=\"https://example.com/script.js\"\n strategy=\"afterInteractive\"\n onLoad={() => console.log('Script loaded')}\n/>",
|
|
175
|
+
"description": "next/script component with strategy",
|
|
176
|
+
"completeBracketPairs": true
|
|
177
|
+
}
|
|
178
|
+
]
|
|
179
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
{
|
|
2
|
+
"language": "react",
|
|
3
|
+
"inlineCompletions": [
|
|
4
|
+
{
|
|
5
|
+
"triggerPattern": "^import React",
|
|
6
|
+
"insertText": "import React from 'react';",
|
|
7
|
+
"description": "Import React default module",
|
|
8
|
+
"completeBracketPairs": false
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"triggerPattern": "^import \\{ us",
|
|
12
|
+
"insertText": "import { useState, useEffect } from 'react';",
|
|
13
|
+
"description": "Import common React hooks",
|
|
14
|
+
"completeBracketPairs": false
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"triggerPattern": "const \\[\\w+, set",
|
|
18
|
+
"insertText": "const [${1}, set${1/(.*)/${1:/capitalize}/}] = useState(${2});",
|
|
19
|
+
"description": "useState declaration with setter",
|
|
20
|
+
"completeBracketPairs": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"triggerPattern": "useEffect\\(\\(\\) =>",
|
|
24
|
+
"insertText": "useEffect(() => {\n ${1}\n return () => {\n ${2}\n };\n}, [${3}]);",
|
|
25
|
+
"description": "useEffect with cleanup function",
|
|
26
|
+
"completeBracketPairs": true
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"triggerPattern": "useEffect\\(\\(\\) => \\{\\s*$",
|
|
30
|
+
"insertText": "\n ${1:// effect logic}\n return () => {\n ${2:// cleanup}\n };\n}, [${3}]);",
|
|
31
|
+
"description": "useEffect body with cleanup",
|
|
32
|
+
"completeBracketPairs": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"triggerPattern": "const \\w+ = useRef",
|
|
36
|
+
"insertText": "const ${1:ref} = useRef<${2:HTMLDivElement}>(${3:null});",
|
|
37
|
+
"description": "useRef with type annotation",
|
|
38
|
+
"completeBracketPairs": true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"triggerPattern": "const \\w+ = useMemo",
|
|
42
|
+
"insertText": "const ${1:memoized} = useMemo(() => ${2:computation}, [${3:deps}]);",
|
|
43
|
+
"description": "useMemo with computation",
|
|
44
|
+
"completeBracketPairs": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"triggerPattern": "const \\w+ = useCallback",
|
|
48
|
+
"insertText": "const ${1:callback} = useCallback((${2:args}) => {\n ${3}\n}, [${4:deps}]);",
|
|
49
|
+
"description": "useCallback with dependencies",
|
|
50
|
+
"completeBracketPairs": true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"triggerPattern": "const \\w+ = useContext",
|
|
54
|
+
"insertText": "const ${1:value} = useContext(${2:MyContext});",
|
|
55
|
+
"description": "useContext consumption",
|
|
56
|
+
"completeBracketPairs": true
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"triggerPattern": "const \\[\\w+, dispatch\\] = useReducer",
|
|
60
|
+
"insertText": "const [${1:state}, dispatch] = useReducer(${2:reducer}, ${3:initialState});",
|
|
61
|
+
"description": "useReducer with dispatch",
|
|
62
|
+
"completeBracketPairs": true
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"triggerPattern": "<div className=",
|
|
66
|
+
"insertText": "<div className=\"${1:container}\">\n ${2}\n</div>",
|
|
67
|
+
"description": "JSX div with className",
|
|
68
|
+
"completeBracketPairs": true
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"triggerPattern": "onClick=\\{",
|
|
72
|
+
"insertText": "onClick={(e) => {\n ${1:e.preventDefault();}\n ${2}\n}}",
|
|
73
|
+
"description": "onClick handler with event",
|
|
74
|
+
"completeBracketPairs": true
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"triggerPattern": "onChange=\\{",
|
|
78
|
+
"insertText": "onChange={(e: React.ChangeEvent<${1:HTMLInputElement}>) => {\n ${2:setValue(e.target.value);}\n}}",
|
|
79
|
+
"description": "onChange handler with typed event",
|
|
80
|
+
"completeBracketPairs": true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"triggerPattern": "onSubmit=\\{",
|
|
84
|
+
"insertText": "onSubmit={(e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n ${1}\n}}",
|
|
85
|
+
"description": "onSubmit handler with preventDefault",
|
|
86
|
+
"completeBracketPairs": true
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"triggerPattern": "\\{\\w+\\.map\\(",
|
|
90
|
+
"insertText": "{${1:items}.map((${2:item}) => (\n <${3:div} key={${2:item}.${4:id}}>\n {${2:item}.${5:name}}\n </${3:div}>\n))}",
|
|
91
|
+
"description": "Array map with key prop",
|
|
92
|
+
"completeBracketPairs": true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"triggerPattern": "\\{\\w+ \\? ",
|
|
96
|
+
"insertText": "{${1:condition} ? (\n ${2:<div>True</div>}\n) : (\n ${3:<div>False</div>}\n)}",
|
|
97
|
+
"description": "Ternary conditional rendering",
|
|
98
|
+
"completeBracketPairs": true
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"triggerPattern": "\\{\\w+ && ",
|
|
102
|
+
"insertText": "{${1:condition} && <${2:div}>${3:content}</${2:div}>}",
|
|
103
|
+
"description": "Logical AND conditional rendering",
|
|
104
|
+
"completeBracketPairs": true
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"triggerPattern": "const \\w+Context = createContext",
|
|
108
|
+
"insertText": "const ${1:My}Context = createContext<${2:ContextType} | undefined>(undefined);",
|
|
109
|
+
"description": "createContext with type",
|
|
110
|
+
"completeBracketPairs": true
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"triggerPattern": "React\\.memo\\(",
|
|
114
|
+
"insertText": "React.memo(${1:Component}, (prevProps, nextProps) => {\n return ${2:prevProps.id === nextProps.id};\n})",
|
|
115
|
+
"description": "React.memo with custom comparison",
|
|
116
|
+
"completeBracketPairs": true
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"triggerPattern": "forwardRef<",
|
|
120
|
+
"insertText": "forwardRef<${1:HTMLDivElement}, ${2:Props}>((props, ref) => {\n return <${3:div} ref={ref}>${4}</${3:div}>;\n})",
|
|
121
|
+
"description": "forwardRef with types",
|
|
122
|
+
"completeBracketPairs": true
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"triggerPattern": "React\\.lazy\\(",
|
|
126
|
+
"insertText": "React.lazy(() => import('${1:./Component}'))",
|
|
127
|
+
"description": "React.lazy dynamic import",
|
|
128
|
+
"completeBracketPairs": true
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"triggerPattern": "<Suspense",
|
|
132
|
+
"insertText": "<Suspense fallback={<${1:div}>Loading...</${1:div}>}>\n ${2}\n</Suspense>",
|
|
133
|
+
"description": "Suspense with fallback",
|
|
134
|
+
"completeBracketPairs": true
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"triggerPattern": "createPortal\\(",
|
|
138
|
+
"insertText": "createPortal(\n ${1:children},\n document.getElementById('${2:portal-root}')!\n)",
|
|
139
|
+
"description": "createPortal with container",
|
|
140
|
+
"completeBracketPairs": true
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"triggerPattern": "const \\[isPending, startTransition\\]",
|
|
144
|
+
"insertText": "const [isPending, startTransition] = useTransition();\n\nstartTransition(() => {\n ${1:setState(newValue)};\n});",
|
|
145
|
+
"description": "useTransition with startTransition call",
|
|
146
|
+
"completeBracketPairs": true
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"triggerPattern": "useImperativeHandle\\(",
|
|
150
|
+
"insertText": "useImperativeHandle(${1:ref}, () => ({\n ${2:focus}() {\n ${3:// implementation}\n }\n}), [${4}]);",
|
|
151
|
+
"description": "useImperativeHandle with methods",
|
|
152
|
+
"completeBracketPairs": true
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"triggerPattern": "style=\\{\\{",
|
|
156
|
+
"insertText": "style={{ ${1:display}: '${2:flex}', ${3:gap}: '${4:1rem}' }}",
|
|
157
|
+
"description": "Inline style object",
|
|
158
|
+
"completeBracketPairs": true
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"triggerPattern": "<ErrorBoundary",
|
|
162
|
+
"insertText": "<ErrorBoundary fallback={<${1:div}>Something went wrong</${1:div}>}>\n ${2}\n</ErrorBoundary>",
|
|
163
|
+
"description": "ErrorBoundary with fallback",
|
|
164
|
+
"completeBracketPairs": true
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"triggerPattern": "export default function \\w+",
|
|
168
|
+
"insertText": "export default function ${1:Component}(${2:props}: ${3:Props}) {\n return (\n <div>\n ${4}\n </div>\n );\n}",
|
|
169
|
+
"description": "Default exported function component",
|
|
170
|
+
"completeBracketPairs": true
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"triggerPattern": "const handle\\w+ = async",
|
|
174
|
+
"insertText": "const handle${1:Submit} = async (${2:e}: ${3:React.FormEvent}) => {\n ${2:e}.preventDefault();\n try {\n ${4}\n } catch (error) {\n ${5:console.error(error);}\n }\n};",
|
|
175
|
+
"description": "Async event handler with error handling",
|
|
176
|
+
"completeBracketPairs": true
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"triggerPattern": "useLayoutEffect\\(",
|
|
180
|
+
"insertText": "useLayoutEffect(() => {\n ${1:// read DOM measurements}\n return () => {\n ${2:// cleanup}\n };\n}, [${3}]);",
|
|
181
|
+
"description": "useLayoutEffect with cleanup",
|
|
182
|
+
"completeBracketPairs": true
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"triggerPattern": "useSyncExternalStore\\(",
|
|
186
|
+
"insertText": "useSyncExternalStore(\n ${1:subscribe},\n ${2:getSnapshot},\n ${3:getServerSnapshot}\n)",
|
|
187
|
+
"description": "useSyncExternalStore with all params",
|
|
188
|
+
"completeBracketPairs": true
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"triggerPattern": "<form onSubmit",
|
|
192
|
+
"insertText": "<form onSubmit={(e) => {\n e.preventDefault();\n ${1:// handle form submission}\n}}>\n ${2}\n <button type=\"submit\">${3:Submit}</button>\n</form>",
|
|
193
|
+
"description": "Form with submit handler",
|
|
194
|
+
"completeBracketPairs": true
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"triggerPattern": "<input value=",
|
|
198
|
+
"insertText": "<input\n type=\"${1:text}\"\n value={${2:value}}\n onChange={(e) => ${3:setValue}(e.target.value)}\n placeholder=\"${4}\"\n/>",
|
|
199
|
+
"description": "Controlled input element",
|
|
200
|
+
"completeBracketPairs": true
|
|
201
|
+
}
|
|
202
|
+
]
|
|
203
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"language": "shadcn",
|
|
3
|
+
"inlineCompletions": [
|
|
4
|
+
{
|
|
5
|
+
"text": "import { Button } from \"@/components/ui/button\"\n\n<Button variant=\"default\" size=\"default\">\n Click me\n</Button>",
|
|
6
|
+
"description": "Button component with variant and size props",
|
|
7
|
+
"triggerPrefix": "shadcn-button"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"text": "import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from \"@/components/ui/card\"\n\n<Card>\n <CardHeader>\n <CardTitle>Title</CardTitle>\n <CardDescription>Description</CardDescription>\n </CardHeader>\n <CardContent>\n <p>Content</p>\n </CardContent>\n <CardFooter>\n <p>Footer</p>\n </CardFooter>\n</Card>",
|
|
11
|
+
"description": "Card with all sub-components",
|
|
12
|
+
"triggerPrefix": "shadcn-card"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"text": "import {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@/components/ui/dialog\"\n\n<Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\">Open</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Dialog Title</DialogTitle>\n <DialogDescription>Dialog description text.</DialogDescription>\n </DialogHeader>\n <div className=\"py-4\">\n Content here\n </div>\n <DialogFooter>\n <Button type=\"submit\">Save</Button>\n </DialogFooter>\n </DialogContent>\n</Dialog>",
|
|
16
|
+
"description": "Dialog with header, content, and footer",
|
|
17
|
+
"triggerPrefix": "shadcn-dialog"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"text": "import { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from \"@/components/ui/form\"\nimport { Input } from \"@/components/ui/input\"\n\nconst formSchema = z.object({\n username: z.string().min(2).max(50),\n})\n\nexport function MyForm() {\n const form = useForm<z.infer<typeof formSchema>>({\n resolver: zodResolver(formSchema),\n defaultValues: {\n username: \"\",\n },\n })\n\n function onSubmit(values: z.infer<typeof formSchema>) {\n console.log(values)\n }\n\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-8\">\n <FormField\n control={form.control}\n name=\"username\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Username</FormLabel>\n <FormControl>\n <Input placeholder=\"username\" {...field} />\n </FormControl>\n <FormDescription>Your display name.</FormDescription>\n <FormMessage />\n </FormItem>\n )}\n />\n <Button type=\"submit\">Submit</Button>\n </form>\n </Form>\n )\n}",
|
|
21
|
+
"description": "Form with react-hook-form, zod validation, and shadcn fields",
|
|
22
|
+
"triggerPrefix": "shadcn-form"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"text": "import {\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n SortingState,\n ColumnFiltersState,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { useState } from \"react\"\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n onSortingChange: setSorting,\n getSortedRowModel: getSortedRowModel(),\n onColumnFiltersChange: setColumnFilters,\n getFilteredRowModel: getFilteredRowModel(),\n state: { sorting, columnFilters },\n })\n\n return (\n <div>\n <div className=\"flex items-center py-4\">\n <Input\n placeholder=\"Filter...\"\n value={(table.getColumn(\"name\")?.getFilterValue() as string) ?? \"\"}\n onChange={(e) => table.getColumn(\"name\")?.setFilterValue(e.target.value)}\n className=\"max-w-sm\"\n />\n </div>\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow key={row.id}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n <div className=\"flex items-center justify-end space-x-2 py-4\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => table.previousPage()} disabled={!table.getCanPreviousPage()}>Previous</Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => table.nextPage()} disabled={!table.getCanNextPage()}>Next</Button>\n </div>\n </div>\n )\n}",
|
|
26
|
+
"description": "DataTable with columns, sorting, filtering, and pagination",
|
|
27
|
+
"triggerPrefix": "shadcn-datatable"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"text": "import {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\n\n<Select>\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder=\"Select an option\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"option1\">Option 1</SelectItem>\n <SelectItem value=\"option2\">Option 2</SelectItem>\n <SelectItem value=\"option3\">Option 3</SelectItem>\n </SelectContent>\n</Select>",
|
|
31
|
+
"description": "Select dropdown with trigger and items",
|
|
32
|
+
"triggerPrefix": "shadcn-select"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"text": "import {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Button } from \"@/components/ui/button\"\n\n<DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\">Open Menu</Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\">\n <DropdownMenuLabel>My Account</DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem>Profile</DropdownMenuItem>\n <DropdownMenuItem>Settings</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem>Logout</DropdownMenuItem>\n </DropdownMenuContent>\n</DropdownMenu>",
|
|
36
|
+
"description": "Dropdown menu with label, items, and separators",
|
|
37
|
+
"triggerPrefix": "shadcn-dropdown"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"text": "import {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"@/components/ui/command\"\nimport { useState, useEffect } from \"react\"\n\nconst [open, setOpen] = useState(false)\n\nuseEffect(() => {\n const down = (e: KeyboardEvent) => {\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n setOpen((open) => !open)\n }\n }\n document.addEventListener(\"keydown\", down)\n return () => document.removeEventListener(\"keydown\", down)\n}, [])\n\n<CommandDialog open={open} onOpenChange={setOpen}>\n <CommandInput placeholder=\"Type a command or search...\" />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup heading=\"Suggestions\">\n <CommandItem>Calendar</CommandItem>\n <CommandItem>Search</CommandItem>\n <CommandItem>Settings</CommandItem>\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup heading=\"Actions\">\n <CommandItem>New File</CommandItem>\n <CommandItem>New Folder</CommandItem>\n </CommandGroup>\n </CommandList>\n</CommandDialog>",
|
|
41
|
+
"description": "Command palette with keyboard shortcut, search, and grouped items",
|
|
42
|
+
"triggerPrefix": "shadcn-command"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"text": "import { useToast } from \"@/components/ui/use-toast\"\n\nconst { toast } = useToast()\n\ntoast({\n title: \"Success\",\n description: \"Your action was completed.\",\n})",
|
|
46
|
+
"description": "Toast notification call with title and description",
|
|
47
|
+
"triggerPrefix": "shadcn-toast"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"text": "import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@/components/ui/alert-dialog\"\n\n<AlertDialog>\n <AlertDialogTrigger asChild>\n <Button variant=\"destructive\">Delete</Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Are you sure?</AlertDialogTitle>\n <AlertDialogDescription>\n This action cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction>Continue</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n</AlertDialog>",
|
|
51
|
+
"description": "AlertDialog confirmation with cancel and continue actions",
|
|
52
|
+
"triggerPrefix": "shadcn-alertdialog"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"text": "import {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\"\n\n<Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open Sidebar</Button>\n </SheetTrigger>\n <SheetContent side=\"left\">\n <SheetHeader>\n <SheetTitle>Navigation</SheetTitle>\n <SheetDescription>Browse sections.</SheetDescription>\n </SheetHeader>\n <nav className=\"flex flex-col space-y-2 mt-4\">\n <a href=\"#\" className=\"text-sm\">Dashboard</a>\n <a href=\"#\" className=\"text-sm\">Settings</a>\n <a href=\"#\" className=\"text-sm\">Profile</a>\n </nav>\n </SheetContent>\n</Sheet>",
|
|
56
|
+
"description": "Sheet sidebar panel with navigation",
|
|
57
|
+
"triggerPrefix": "shadcn-sheet"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"text": "import { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\n\n<Tabs defaultValue=\"tab1\" className=\"w-full\">\n <TabsList>\n <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n <TabsTrigger value=\"tab3\">Tab 3</TabsTrigger>\n </TabsList>\n <TabsContent value=\"tab1\">Content for tab 1</TabsContent>\n <TabsContent value=\"tab2\">Content for tab 2</TabsContent>\n <TabsContent value=\"tab3\">Content for tab 3</TabsContent>\n</Tabs>",
|
|
61
|
+
"description": "Tabs layout with multiple panels",
|
|
62
|
+
"triggerPrefix": "shadcn-tabs"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"text": "import {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\n\n<Accordion type=\"single\" collapsible>\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>Section 1</AccordionTrigger>\n <AccordionContent>Content for section 1.</AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"item-2\">\n <AccordionTrigger>Section 2</AccordionTrigger>\n <AccordionContent>Content for section 2.</AccordionContent>\n </AccordionItem>\n</Accordion>",
|
|
66
|
+
"description": "Accordion with collapsible sections",
|
|
67
|
+
"triggerPrefix": "shadcn-accordion"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"text": "import { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\n\n<div className=\"grid w-full max-w-sm items-center gap-1.5\">\n <Label htmlFor=\"email\">Email</Label>\n <Input type=\"email\" id=\"email\" placeholder=\"Email\" />\n</div>",
|
|
71
|
+
"description": "Input field with label",
|
|
72
|
+
"triggerPrefix": "shadcn-input"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"text": "import { Textarea } from \"@/components/ui/textarea\"\nimport { Label } from \"@/components/ui/label\"\n\n<div className=\"grid w-full gap-1.5\">\n <Label htmlFor=\"message\">Message</Label>\n <Textarea placeholder=\"Type your message here.\" id=\"message\" />\n</div>",
|
|
76
|
+
"description": "Textarea with label",
|
|
77
|
+
"triggerPrefix": "shadcn-textarea"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"text": "import { Badge } from \"@/components/ui/badge\"\n\n<Badge variant=\"default\">Badge</Badge>\n<Badge variant=\"secondary\">Secondary</Badge>\n<Badge variant=\"outline\">Outline</Badge>\n<Badge variant=\"destructive\">Destructive</Badge>",
|
|
81
|
+
"description": "Badge component with variant options",
|
|
82
|
+
"triggerPrefix": "shadcn-badge"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"text": "import {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n} from \"@/components/ui/navigation-menu\"\n\n<NavigationMenu>\n <NavigationMenuList>\n <NavigationMenuItem>\n <NavigationMenuTrigger>Getting Started</NavigationMenuTrigger>\n <NavigationMenuContent>\n <ul className=\"grid gap-3 p-4 md:w-[400px]\">\n <li><NavigationMenuLink href=\"/docs\">Documentation</NavigationMenuLink></li>\n <li><NavigationMenuLink href=\"/examples\">Examples</NavigationMenuLink></li>\n </ul>\n </NavigationMenuContent>\n </NavigationMenuItem>\n <NavigationMenuItem>\n <NavigationMenuLink className={navigationMenuTriggerStyle()} href=\"/about\">\n About\n </NavigationMenuLink>\n </NavigationMenuItem>\n </NavigationMenuList>\n</NavigationMenu>",
|
|
86
|
+
"description": "Navigation menu with dropdown content",
|
|
87
|
+
"triggerPrefix": "shadcn-navigation"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"text": "import {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\"\n\n<Pagination>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n</Pagination>",
|
|
91
|
+
"description": "Pagination with page links and navigation",
|
|
92
|
+
"triggerPrefix": "shadcn-pagination"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"text": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}",
|
|
96
|
+
"description": "cn() utility function definition using clsx and tailwind-merge",
|
|
97
|
+
"triggerPrefix": "shadcn-cn"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"text": "import { cva, type VariantProps } from \"class-variance-authority\"\n\nconst myVariants = cva(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\"\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\"\n }\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\"\n }\n }\n)",
|
|
101
|
+
"description": "cva() variant definition with multiple variant axes",
|
|
102
|
+
"triggerPrefix": "shadcn-cva"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"text": "import { Toaster } from \"@/components/ui/toaster\"\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <body>\n <main>{children}</main>\n <Toaster />\n </body>\n </html>\n )\n}",
|
|
106
|
+
"description": "Toaster provider setup in root layout",
|
|
107
|
+
"triggerPrefix": "shadcn-toaster"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"text": "import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface MyComponentProps\n extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\"\n}\n\nconst MyComponent = React.forwardRef<HTMLDivElement, MyComponentProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n variant === \"outline\" && \"border-2\",\n className\n )}\n {...props}\n />\n )\n }\n)\nMyComponent.displayName = \"MyComponent\"\n\nexport { MyComponent }",
|
|
111
|
+
"description": "Component with forwardRef, cn(), variants, and displayName",
|
|
112
|
+
"triggerPrefix": "shadcn-component"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|