@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.
Files changed (270) hide show
  1. package/data/codeActions/angular.json +126 -0
  2. package/data/codeActions/css.json +111 -0
  3. package/data/codeActions/nestjs.json +124 -0
  4. package/data/codeActions/nextjs.json +198 -0
  5. package/data/codeActions/react.json +154 -0
  6. package/data/codeActions/shadcn.json +112 -0
  7. package/data/codeActions/shell.json +169 -26
  8. package/data/codeActions/tailwindcss.json +76 -0
  9. package/data/codeLens/angular.json +22 -0
  10. package/data/codeLens/css.json +68 -0
  11. package/data/codeLens/nestjs.json +21 -0
  12. package/data/codeLens/nextjs.json +117 -0
  13. package/data/codeLens/react.json +89 -0
  14. package/data/codeLens/shadcn.json +89 -0
  15. package/data/codeLens/shell.json +59 -17
  16. package/data/codeLens/tailwindcss.json +103 -0
  17. package/data/color/angular.json +21 -0
  18. package/data/color/css.json +124 -0
  19. package/data/color/nestjs.json +18 -0
  20. package/data/color/nextjs.json +22 -0
  21. package/data/color/react.json +93 -0
  22. package/data/color/shadcn.json +66 -0
  23. package/data/color/shell.json +106 -80
  24. package/data/color/tailwindcss.json +53 -0
  25. package/data/commands/angular.json +312 -0
  26. package/data/commands/css.json +41 -0
  27. package/data/commands/manifest.json +734 -727
  28. package/data/commands/nestjs.json +273 -0
  29. package/data/commands/nextjs.json +123 -0
  30. package/data/commands/react.json +210 -0
  31. package/data/commands/shadcn.json +410 -0
  32. package/data/commands/shell.json +571 -41
  33. package/data/commands/tailwindcss.json +53 -0
  34. package/data/completion/angular.json +1490 -0
  35. package/data/completion/css.json +1176 -0
  36. package/data/completion/javascript.json +27 -0
  37. package/data/completion/nestjs.json +1454 -0
  38. package/data/completion/nextjs.json +1373 -0
  39. package/data/completion/react.json +1319 -0
  40. package/data/completion/redis-cli.json +1 -1
  41. package/data/completion/shadcn.json +1202 -0
  42. package/data/completion/shell.json +2446 -510
  43. package/data/completion/tailwindcss.json +284 -0
  44. package/data/completion/typescript.json +27 -0
  45. package/data/declaration/angular.json +46 -0
  46. package/data/declaration/css.json +59 -0
  47. package/data/declaration/nestjs.json +47 -0
  48. package/data/declaration/nextjs.json +274 -0
  49. package/data/declaration/react.json +199 -0
  50. package/data/declaration/shadcn.json +211 -0
  51. package/data/declaration/shell.json +343 -24
  52. package/data/declaration/tailwindcss.json +137 -0
  53. package/data/definition/angular.json +670 -0
  54. package/data/definition/css.json +115 -0
  55. package/data/definition/nestjs.json +684 -0
  56. package/data/definition/nextjs.json +439 -0
  57. package/data/definition/react.json +397 -0
  58. package/data/definition/redis-cli.json +1 -1
  59. package/data/definition/shadcn.json +99 -0
  60. package/data/definition/shell.json +820 -0
  61. package/data/definition/tailwindcss.json +115 -0
  62. package/data/documentHighlight/angular.json +414 -0
  63. package/data/documentHighlight/css.json +125 -0
  64. package/data/documentHighlight/nestjs.json +115 -0
  65. package/data/documentHighlight/nextjs.json +212 -0
  66. package/data/documentHighlight/react.json +119 -0
  67. package/data/documentHighlight/shadcn.json +168 -0
  68. package/data/documentHighlight/shell.json +664 -334
  69. package/data/documentHighlight/tailwindcss.json +160 -0
  70. package/data/documentRangeFormatting/angular.json +45 -0
  71. package/data/documentRangeFormatting/css.json +101 -0
  72. package/data/documentRangeFormatting/nestjs.json +17 -0
  73. package/data/documentRangeFormatting/nextjs.json +17 -0
  74. package/data/documentRangeFormatting/react.json +78 -0
  75. package/data/documentRangeFormatting/shadcn.json +45 -0
  76. package/data/documentRangeFormatting/shell.json +120 -53
  77. package/data/documentRangeFormatting/tailwindcss.json +55 -0
  78. package/data/documentSymbol/angular.json +180 -0
  79. package/data/documentSymbol/css.json +96 -0
  80. package/data/documentSymbol/nestjs.json +152 -0
  81. package/data/documentSymbol/nextjs.json +159 -0
  82. package/data/documentSymbol/react.json +145 -0
  83. package/data/documentSymbol/shadcn.json +131 -0
  84. package/data/documentSymbol/shell.json +166 -26
  85. package/data/documentSymbol/tailwindcss.json +110 -0
  86. package/data/foldingRange/angular.json +99 -0
  87. package/data/foldingRange/css.json +66 -0
  88. package/data/foldingRange/nestjs.json +26 -0
  89. package/data/foldingRange/nextjs.json +26 -0
  90. package/data/foldingRange/react.json +120 -0
  91. package/data/foldingRange/shadcn.json +93 -0
  92. package/data/foldingRange/shell.json +106 -46
  93. package/data/foldingRange/tailwindcss.json +60 -0
  94. package/data/formatting/angular.json +21 -0
  95. package/data/formatting/css.json +73 -0
  96. package/data/formatting/nestjs.json +23 -0
  97. package/data/formatting/nextjs.json +23 -0
  98. package/data/formatting/react.json +71 -0
  99. package/data/formatting/shadcn.json +61 -0
  100. package/data/formatting/shell.json +103 -19
  101. package/data/formatting/tailwindcss.json +48 -0
  102. package/data/hover/angular.json +455 -0
  103. package/data/hover/css.json +300 -0
  104. package/data/hover/nestjs.json +296 -0
  105. package/data/hover/nextjs.json +305 -0
  106. package/data/hover/react.json +173 -0
  107. package/data/hover/redis-cli.json +1 -1
  108. package/data/hover/shadcn.json +450 -0
  109. package/data/hover/shell.json +684 -75
  110. package/data/hover/tailwindcss.json +968 -0
  111. package/data/implementation/angular.json +22 -0
  112. package/data/implementation/css.json +65 -0
  113. package/data/implementation/nestjs.json +24 -0
  114. package/data/implementation/nextjs.json +137 -0
  115. package/data/implementation/react.json +125 -0
  116. package/data/implementation/shadcn.json +89 -0
  117. package/data/implementation/shell.json +59 -3
  118. package/data/implementation/tailwindcss.json +59 -0
  119. package/data/inlayHints/angular.json +24 -0
  120. package/data/inlayHints/css.json +87 -0
  121. package/data/inlayHints/nestjs.json +24 -0
  122. package/data/inlayHints/nextjs.json +143 -0
  123. package/data/inlayHints/react.json +177 -0
  124. package/data/inlayHints/shadcn.json +109 -0
  125. package/data/inlayHints/shell.json +223 -35
  126. package/data/inlayHints/tailwindcss.json +111 -0
  127. package/data/inlineCompletions/angular.json +135 -0
  128. package/data/inlineCompletions/css.json +125 -0
  129. package/data/inlineCompletions/javascript.json +12 -0
  130. package/data/inlineCompletions/nestjs.json +25 -0
  131. package/data/inlineCompletions/nextjs.json +179 -0
  132. package/data/inlineCompletions/react.json +203 -0
  133. package/data/inlineCompletions/shadcn.json +115 -0
  134. package/data/inlineCompletions/shell.json +185 -35
  135. package/data/inlineCompletions/tailwindcss.json +411 -0
  136. package/data/inlineCompletions/typescript.json +12 -0
  137. package/data/linkedEditingRange/angular.json +23 -0
  138. package/data/linkedEditingRange/css.json +40 -0
  139. package/data/linkedEditingRange/nestjs.json +10 -0
  140. package/data/linkedEditingRange/nextjs.json +11 -0
  141. package/data/linkedEditingRange/react.json +75 -0
  142. package/data/linkedEditingRange/shadcn.json +23 -0
  143. package/data/linkedEditingRange/shell.json +25 -25
  144. package/data/linkedEditingRange/tailwindcss.json +30 -0
  145. package/data/links/angular.json +95 -0
  146. package/data/links/css.json +55 -0
  147. package/data/links/nestjs.json +130 -0
  148. package/data/links/nextjs.json +91 -0
  149. package/data/links/react.json +75 -0
  150. package/data/links/shadcn.json +98 -0
  151. package/data/links/shell.json +56 -0
  152. package/data/links/tailwindcss.json +65 -0
  153. package/data/manifest.json +399 -150
  154. package/data/onTypeFormatting/angular.json +14 -0
  155. package/data/onTypeFormatting/css.json +82 -0
  156. package/data/onTypeFormatting/nestjs.json +16 -0
  157. package/data/onTypeFormatting/nextjs.json +17 -0
  158. package/data/onTypeFormatting/react.json +127 -0
  159. package/data/onTypeFormatting/shadcn.json +54 -0
  160. package/data/onTypeFormatting/shell.json +72 -68
  161. package/data/onTypeFormatting/tailwindcss.json +63 -0
  162. package/data/rangeSemanticTokens/angular.json +140 -0
  163. package/data/rangeSemanticTokens/css.json +125 -0
  164. package/data/rangeSemanticTokens/nestjs.json +27 -0
  165. package/data/rangeSemanticTokens/nextjs.json +28 -0
  166. package/data/rangeSemanticTokens/react.json +216 -0
  167. package/data/rangeSemanticTokens/shadcn.json +140 -0
  168. package/data/rangeSemanticTokens/shell.json +247 -69
  169. package/data/rangeSemanticTokens/tailwindcss.json +186 -0
  170. package/data/references/angular.json +26 -0
  171. package/data/references/css.json +65 -0
  172. package/data/references/nestjs.json +24 -0
  173. package/data/references/nextjs.json +178 -0
  174. package/data/references/react.json +192 -0
  175. package/data/references/shadcn.json +101 -0
  176. package/data/references/shell.json +323 -92
  177. package/data/references/tailwindcss.json +125 -0
  178. package/data/rename/angular.json +131 -0
  179. package/data/rename/css.json +91 -0
  180. package/data/rename/nestjs.json +32 -0
  181. package/data/rename/nextjs.json +31 -0
  182. package/data/rename/react.json +88 -0
  183. package/data/rename/shadcn.json +79 -0
  184. package/data/rename/shell.json +101 -31
  185. package/data/rename/tailwindcss.json +58 -0
  186. package/data/selectionRange/angular.json +95 -0
  187. package/data/selectionRange/css.json +55 -0
  188. package/data/selectionRange/nestjs.json +21 -0
  189. package/data/selectionRange/nextjs.json +22 -0
  190. package/data/selectionRange/react.json +87 -0
  191. package/data/selectionRange/shadcn.json +89 -0
  192. package/data/selectionRange/shell.json +65 -35
  193. package/data/selectionRange/tailwindcss.json +35 -0
  194. package/data/semanticTokens/angular.json +198 -0
  195. package/data/semanticTokens/css.json +107 -0
  196. package/data/semanticTokens/nestjs.json +35 -0
  197. package/data/semanticTokens/nextjs.json +38 -0
  198. package/data/semanticTokens/react.json +215 -0
  199. package/data/semanticTokens/shadcn.json +180 -0
  200. package/data/semanticTokens/shell.json +238 -65
  201. package/data/semanticTokens/tailwindcss.json +161 -0
  202. package/data/signatureHelp/angular.json +182 -0
  203. package/data/signatureHelp/css.json +137 -0
  204. package/data/signatureHelp/nestjs.json +128 -0
  205. package/data/signatureHelp/nextjs.json +127 -0
  206. package/data/signatureHelp/react.json +281 -0
  207. package/data/signatureHelp/shadcn.json +237 -0
  208. package/data/signatureHelp/shell.json +797 -104
  209. package/data/signatureHelp/tailwindcss.json +64 -0
  210. package/data/typeDefinition/angular.json +362 -0
  211. package/data/typeDefinition/css.json +53 -0
  212. package/data/typeDefinition/nestjs.json +334 -0
  213. package/data/typeDefinition/nextjs.json +285 -0
  214. package/data/typeDefinition/react.json +236 -0
  215. package/data/typeDefinition/shadcn.json +292 -0
  216. package/data/typeDefinition/shell.json +104 -40
  217. package/data/typeDefinition/tailwindcss.json +47 -0
  218. package/package.json +1 -1
  219. package/data/codeActions/bash.json +0 -169
  220. package/data/codeActions/zsh.json +0 -49
  221. package/data/codeLens/bash.json +0 -75
  222. package/data/codeLens/zsh.json +0 -19
  223. package/data/color/bash.json +0 -100
  224. package/data/color/zsh.json +0 -80
  225. package/data/commands/bash.json +0 -102
  226. package/data/commands/zsh.json +0 -166
  227. package/data/completion/bash.json +0 -1184
  228. package/data/completion/zsh.json +0 -973
  229. package/data/declaration/bash.json +0 -301
  230. package/data/declaration/zsh.json +0 -205
  231. package/data/definition/bash.json +0 -565
  232. package/data/definition/zsh.json +0 -350
  233. package/data/documentHighlight/bash.json +0 -393
  234. package/data/documentHighlight/zsh.json +0 -266
  235. package/data/documentRangeFormatting/bash.json +0 -41
  236. package/data/documentRangeFormatting/zsh.json +0 -59
  237. package/data/documentSymbol/bash.json +0 -124
  238. package/data/documentSymbol/zsh.json +0 -26
  239. package/data/foldingRange/bash.json +0 -76
  240. package/data/foldingRange/zsh.json +0 -46
  241. package/data/formatting/bash.json +0 -88
  242. package/data/formatting/zsh.json +0 -28
  243. package/data/hover/bash.json +0 -579
  244. package/data/hover/zsh.json +0 -96
  245. package/data/implementation/bash.json +0 -44
  246. package/data/implementation/zsh.json +0 -41
  247. package/data/inlayHints/bash.json +0 -207
  248. package/data/inlayHints/zsh.json +0 -43
  249. package/data/inlineCompletions/bash.json +0 -155
  250. package/data/inlineCompletions/zsh.json +0 -17
  251. package/data/linkedEditingRange/bash.json +0 -25
  252. package/data/linkedEditingRange/zsh.json +0 -25
  253. package/data/links/bash.json +0 -56
  254. package/data/links/zsh.json +0 -15
  255. package/data/onTypeFormatting/bash.json +0 -68
  256. package/data/onTypeFormatting/zsh.json +0 -68
  257. package/data/rangeSemanticTokens/bash.json +0 -90
  258. package/data/rangeSemanticTokens/zsh.json +0 -76
  259. package/data/references/bash.json +0 -221
  260. package/data/references/zsh.json +0 -166
  261. package/data/rename/bash.json +0 -37
  262. package/data/rename/zsh.json +0 -31
  263. package/data/selectionRange/bash.json +0 -35
  264. package/data/selectionRange/zsh.json +0 -35
  265. package/data/semanticTokens/bash.json +0 -71
  266. package/data/semanticTokens/zsh.json +0 -71
  267. package/data/signatureHelp/bash.json +0 -111
  268. package/data/signatureHelp/zsh.json +0 -118
  269. package/data/typeDefinition/bash.json +0 -95
  270. 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
+ }