@0xsown/vibe-code-fe 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/bin/index.js +181 -0
  2. package/package.json +32 -0
  3. package/skills/claude-md-improver/SKILL.md +179 -0
  4. package/skills/claude-md-improver/references/quality-criteria.md +109 -0
  5. package/skills/claude-md-improver/references/templates.md +253 -0
  6. package/skills/claude-md-improver/references/update-guidelines.md +150 -0
  7. package/skills/find-skills/SKILL.md +133 -0
  8. package/skills/frontend-design/LICENSE.txt +177 -0
  9. package/skills/frontend-design/SKILL.md +42 -0
  10. package/skills/next-best-practices/SKILL.md +153 -0
  11. package/skills/next-best-practices/async-patterns.md +87 -0
  12. package/skills/next-best-practices/bundling.md +180 -0
  13. package/skills/next-best-practices/data-patterns.md +297 -0
  14. package/skills/next-best-practices/debug-tricks.md +105 -0
  15. package/skills/next-best-practices/directives.md +73 -0
  16. package/skills/next-best-practices/error-handling.md +227 -0
  17. package/skills/next-best-practices/file-conventions.md +140 -0
  18. package/skills/next-best-practices/font.md +245 -0
  19. package/skills/next-best-practices/functions.md +108 -0
  20. package/skills/next-best-practices/hydration-error.md +91 -0
  21. package/skills/next-best-practices/image.md +173 -0
  22. package/skills/next-best-practices/metadata.md +301 -0
  23. package/skills/next-best-practices/parallel-routes.md +287 -0
  24. package/skills/next-best-practices/route-handlers.md +146 -0
  25. package/skills/next-best-practices/rsc-boundaries.md +159 -0
  26. package/skills/next-best-practices/runtime-selection.md +39 -0
  27. package/skills/next-best-practices/scripts.md +141 -0
  28. package/skills/next-best-practices/self-hosting.md +371 -0
  29. package/skills/next-best-practices/suspense-boundaries.md +67 -0
  30. package/skills/next-cache-components/SKILL.md +411 -0
  31. package/skills/shadcn-ui/README.md +248 -0
  32. package/skills/shadcn-ui/SKILL.md +326 -0
  33. package/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  34. package/skills/shadcn-ui/examples/data-table.tsx +313 -0
  35. package/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  36. package/skills/shadcn-ui/resources/component-catalog.md +481 -0
  37. package/skills/shadcn-ui/resources/customization-guide.md +516 -0
  38. package/skills/shadcn-ui/resources/migration-guide.md +463 -0
  39. package/skills/shadcn-ui/resources/setup-guide.md +412 -0
  40. package/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  41. package/skills/supabase-postgres-best-practices/AGENTS.md +68 -0
  42. package/skills/supabase-postgres-best-practices/CLAUDE.md +68 -0
  43. package/skills/supabase-postgres-best-practices/README.md +116 -0
  44. package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  45. package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  46. package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  47. package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  48. package/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  49. package/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  50. package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  51. package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  52. package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  53. package/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  54. package/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  55. package/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  56. package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  57. package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  58. package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  59. package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  60. package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  61. package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  62. package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  63. package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  64. package/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  65. package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  66. package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  67. package/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  68. package/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  69. package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  70. package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  71. package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  72. package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  73. package/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  74. package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  75. package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  76. package/skills/tailwind-design-system/SKILL.md +874 -0
  77. package/skills/vercel-composition-patterns/AGENTS.md +946 -0
  78. package/skills/vercel-composition-patterns/README.md +60 -0
  79. package/skills/vercel-composition-patterns/SKILL.md +89 -0
  80. package/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  81. package/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  82. package/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  83. package/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  84. package/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  85. package/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  86. package/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  87. package/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  88. package/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  89. package/skills/vercel-react-best-practices/README.md +123 -0
  90. package/skills/vercel-react-best-practices/SKILL.md +136 -0
  91. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  92. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  93. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  94. package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  95. package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  96. package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  97. package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  98. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  99. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  100. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  101. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  102. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  103. package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  104. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  105. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  106. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  107. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  108. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  109. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  110. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  111. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  112. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  113. package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  114. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  115. package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  116. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  117. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  118. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  119. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  120. package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  121. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  122. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  123. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  124. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  125. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  126. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  127. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  128. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  129. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  130. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  131. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  132. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  133. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  134. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  135. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  136. package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  137. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  138. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  139. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  140. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  141. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  142. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  143. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  144. package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  145. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  146. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  147. package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  148. package/skills/vercel-react-native-skills/AGENTS.md +2897 -0
  149. package/skills/vercel-react-native-skills/README.md +165 -0
  150. package/skills/vercel-react-native-skills/SKILL.md +121 -0
  151. package/skills/vercel-react-native-skills/rules/animation-derived-value.md +53 -0
  152. package/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  153. package/skills/vercel-react-native-skills/rules/animation-gpu-properties.md +65 -0
  154. package/skills/vercel-react-native-skills/rules/design-system-compound-components.md +66 -0
  155. package/skills/vercel-react-native-skills/rules/fonts-config-plugin.md +71 -0
  156. package/skills/vercel-react-native-skills/rules/imports-design-system-folder.md +68 -0
  157. package/skills/vercel-react-native-skills/rules/js-hoist-intl.md +61 -0
  158. package/skills/vercel-react-native-skills/rules/list-performance-callbacks.md +44 -0
  159. package/skills/vercel-react-native-skills/rules/list-performance-function-references.md +132 -0
  160. package/skills/vercel-react-native-skills/rules/list-performance-images.md +53 -0
  161. package/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md +97 -0
  162. package/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md +94 -0
  163. package/skills/vercel-react-native-skills/rules/list-performance-item-memo.md +82 -0
  164. package/skills/vercel-react-native-skills/rules/list-performance-item-types.md +104 -0
  165. package/skills/vercel-react-native-skills/rules/list-performance-virtualize.md +67 -0
  166. package/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  167. package/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  168. package/skills/vercel-react-native-skills/rules/navigation-native-navigators.md +188 -0
  169. package/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  170. package/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  171. package/skills/vercel-react-native-skills/rules/react-state-dispatcher.md +91 -0
  172. package/skills/vercel-react-native-skills/rules/react-state-fallback.md +56 -0
  173. package/skills/vercel-react-native-skills/rules/react-state-minimize.md +65 -0
  174. package/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  175. package/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  176. package/skills/vercel-react-native-skills/rules/scroll-position-no-state.md +82 -0
  177. package/skills/vercel-react-native-skills/rules/state-ground-truth.md +80 -0
  178. package/skills/vercel-react-native-skills/rules/ui-expo-image.md +66 -0
  179. package/skills/vercel-react-native-skills/rules/ui-image-gallery.md +104 -0
  180. package/skills/vercel-react-native-skills/rules/ui-measure-views.md +78 -0
  181. package/skills/vercel-react-native-skills/rules/ui-menus.md +174 -0
  182. package/skills/vercel-react-native-skills/rules/ui-native-modals.md +77 -0
  183. package/skills/vercel-react-native-skills/rules/ui-pressable.md +61 -0
  184. package/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  185. package/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  186. package/skills/vercel-react-native-skills/rules/ui-styling.md +87 -0
  187. package/skills/web-design-guidelines/SKILL.md +39 -0
  188. package/templates/AGENTS.md +31 -0
  189. package/templates/CLAUDE.md +31 -0
@@ -0,0 +1,313 @@
1
+ // Example: Data Table with Sorting and Filtering
2
+ // Demonstrates: Table composition, TanStack Table integration, responsive design
3
+
4
+ "use client"
5
+
6
+ import {
7
+ ColumnDef,
8
+ ColumnFiltersState,
9
+ flexRender,
10
+ getCoreRowModel,
11
+ getFilteredRowModel,
12
+ getPaginationRowModel,
13
+ getSortedRowModel,
14
+ SortingState,
15
+ useReactTable,
16
+ } from "@tanstack/react-table"
17
+ import { ArrowUpDown, ChevronDown, MoreHorizontal } from "lucide-react"
18
+ import * as React from "react"
19
+
20
+ import { Button } from "@/components/ui/button"
21
+ import {
22
+ DropdownMenu,
23
+ DropdownMenuCheckboxItem,
24
+ DropdownMenuContent,
25
+ DropdownMenuItem,
26
+ DropdownMenuLabel,
27
+ DropdownMenuSeparator,
28
+ DropdownMenuTrigger,
29
+ } from "@/components/ui/dropdown-menu"
30
+ import { Input } from "@/components/ui/input"
31
+ import {
32
+ Table,
33
+ TableBody,
34
+ TableCell,
35
+ TableHead,
36
+ TableHeader,
37
+ TableRow,
38
+ } from "@/components/ui/table"
39
+
40
+ // Define data type
41
+ export type User = {
42
+ id: string
43
+ name: string
44
+ email: string
45
+ role: "admin" | "user" | "viewer"
46
+ status: "active" | "inactive"
47
+ }
48
+
49
+ // Sample data
50
+ const data: User[] = [
51
+ {
52
+ id: "1",
53
+ name: "Alice Johnson",
54
+ email: "alice@example.com",
55
+ role: "admin",
56
+ status: "active",
57
+ },
58
+ {
59
+ id: "2",
60
+ name: "Bob Smith",
61
+ email: "bob@example.com",
62
+ role: "user",
63
+ status: "active",
64
+ },
65
+ {
66
+ id: "3",
67
+ name: "Carol White",
68
+ email: "carol@example.com",
69
+ role: "viewer",
70
+ status: "inactive",
71
+ },
72
+ ]
73
+
74
+ // Define columns
75
+ export const columns: ColumnDef<User>[] = [
76
+ {
77
+ accessorKey: "name",
78
+ header: ({ column }) => {
79
+ return (
80
+ <Button
81
+ variant="ghost"
82
+ onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
83
+ >
84
+ Name
85
+ <ArrowUpDown className="ml-2 h-4 w-4" />
86
+ </Button>
87
+ )
88
+ },
89
+ cell: ({ row }) => <div className="capitalize">{row.getValue("name")}</div>,
90
+ },
91
+ {
92
+ accessorKey: "email",
93
+ header: ({ column }) => {
94
+ return (
95
+ <Button
96
+ variant="ghost"
97
+ onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
98
+ >
99
+ Email
100
+ <ArrowUpDown className="ml-2 h-4 w-4" />
101
+ </Button>
102
+ )
103
+ },
104
+ cell: ({ row }) => <div className="lowercase">{row.getValue("email")}</div>,
105
+ },
106
+ {
107
+ accessorKey: "role",
108
+ header: "Role",
109
+ cell: ({ row }) => (
110
+ <div className="capitalize">{row.getValue("role")}</div>
111
+ ),
112
+ },
113
+ {
114
+ accessorKey: "status",
115
+ header: "Status",
116
+ cell: ({ row }) => (
117
+ <div className="capitalize">{row.getValue("status")}</div>
118
+ ),
119
+ },
120
+ {
121
+ id: "actions",
122
+ enableHiding: false,
123
+ cell: ({ row }) => {
124
+ const user = row.original
125
+
126
+ return (
127
+ <DropdownMenu>
128
+ <DropdownMenuTrigger asChild>
129
+ <Button variant="ghost" className="h-8 w-8 p-0">
130
+ <span className="sr-only">Open menu</span>
131
+ <MoreHorizontal className="h-4 w-4" />
132
+ </Button>
133
+ </DropdownMenuTrigger>
134
+ <DropdownMenuContent align="end">
135
+ <DropdownMenuLabel>Actions</DropdownMenuLabel>
136
+ <DropdownMenuItem
137
+ onClick={() => navigator.clipboard.writeText(user.id)}
138
+ >
139
+ Copy user ID
140
+ </DropdownMenuItem>
141
+ <DropdownMenuSeparator />
142
+ <DropdownMenuItem>View user</DropdownMenuItem>
143
+ <DropdownMenuItem>Edit user</DropdownMenuItem>
144
+ </DropdownMenuContent>
145
+ </DropdownMenu>
146
+ )
147
+ },
148
+ },
149
+ ]
150
+
151
+ export function DataTableExample() {
152
+ const [sorting, setSorting] = React.useState<SortingState>([])
153
+ const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([])
154
+ const [columnVisibility, setColumnVisibility] = React.useState({})
155
+ const [rowSelection, setRowSelection] = React.useState({})
156
+
157
+ const table = useReactTable({
158
+ data,
159
+ columns,
160
+ onSortingChange: setSorting,
161
+ onColumnFiltersChange: setColumnFilters,
162
+ getCoreRowModel: getCoreRowModel(),
163
+ getPaginationRowModel: getPaginationRowModel(),
164
+ getSortedRowModel: getSortedRowModel(),
165
+ getFilteredRowModel: getFilteredRowModel(),
166
+ onColumnVisibilityChange: setColumnVisibility,
167
+ onRowSelectionChange: setRowSelection,
168
+ state: {
169
+ sorting,
170
+ columnFilters,
171
+ columnVisibility,
172
+ rowSelection,
173
+ },
174
+ })
175
+
176
+ return (
177
+ <div className="w-full">
178
+ <div className="flex items-center py-4">
179
+ <Input
180
+ placeholder="Filter names..."
181
+ value={(table.getColumn("name")?.getFilterValue() as string) ?? ""}
182
+ onChange={(event) =>
183
+ table.getColumn("name")?.setFilterValue(event.target.value)
184
+ }
185
+ className="max-w-sm"
186
+ />
187
+ <DropdownMenu>
188
+ <DropdownMenuTrigger asChild>
189
+ <Button variant="outline" className="ml-auto">
190
+ Columns <ChevronDown className="ml-2 h-4 w-4" />
191
+ </Button>
192
+ </DropdownMenuTrigger>
193
+ <DropdownMenuContent align="end">
194
+ {table
195
+ .getAllColumns()
196
+ .filter((column) => column.getCanHide())
197
+ .map((column) => {
198
+ return (
199
+ <DropdownMenuCheckboxItem
200
+ key={column.id}
201
+ className="capitalize"
202
+ checked={column.getIsVisible()}
203
+ onCheckedChange={(value) =>
204
+ column.toggleVisibility(!!value)
205
+ }
206
+ >
207
+ {column.id}
208
+ </DropdownMenuCheckboxItem>
209
+ )
210
+ })}
211
+ </DropdownMenuContent>
212
+ </DropdownMenu>
213
+ </div>
214
+ <div className="rounded-md border">
215
+ <Table>
216
+ <TableHeader>
217
+ {table.getHeaderGroups().map((headerGroup) => (
218
+ <TableRow key={headerGroup.id}>
219
+ {headerGroup.headers.map((header) => {
220
+ return (
221
+ <TableHead key={header.id}>
222
+ {header.isPlaceholder
223
+ ? null
224
+ : flexRender(
225
+ header.column.columnDef.header,
226
+ header.getContext()
227
+ )}
228
+ </TableHead>
229
+ )
230
+ })}
231
+ </TableRow>
232
+ ))}
233
+ </TableHeader>
234
+ <TableBody>
235
+ {table.getRowModel().rows?.length ? (
236
+ table.getRowModel().rows.map((row) => (
237
+ <TableRow
238
+ key={row.id}
239
+ data-state={row.getIsSelected() && "selected"}
240
+ >
241
+ {row.getVisibleCells().map((cell) => (
242
+ <TableCell key={cell.id}>
243
+ {flexRender(
244
+ cell.column.columnDef.cell,
245
+ cell.getContext()
246
+ )}
247
+ </TableCell>
248
+ ))}
249
+ </TableRow>
250
+ ))
251
+ ) : (
252
+ <TableRow>
253
+ <TableCell
254
+ colSpan={columns.length}
255
+ className="h-24 text-center"
256
+ >
257
+ No results.
258
+ </TableCell>
259
+ </TableRow>
260
+ )}
261
+ </TableBody>
262
+ </Table>
263
+ </div>
264
+ <div className="flex items-center justify-end space-x-2 py-4">
265
+ <div className="flex-1 text-sm text-muted-foreground">
266
+ {table.getFilteredSelectedRowModel().rows.length} of{" "}
267
+ {table.getFilteredRowModel().rows.length} row(s) selected.
268
+ </div>
269
+ <div className="space-x-2">
270
+ <Button
271
+ variant="outline"
272
+ size="sm"
273
+ onClick={() => table.previousPage()}
274
+ disabled={!table.getCanPreviousPage()}
275
+ >
276
+ Previous
277
+ </Button>
278
+ <Button
279
+ variant="outline"
280
+ size="sm"
281
+ onClick={() => table.nextPage()}
282
+ disabled={!table.getCanNextPage()}
283
+ >
284
+ Next
285
+ </Button>
286
+ </div>
287
+ </div>
288
+ </div>
289
+ )
290
+ }
291
+
292
+ /**
293
+ * Key Patterns Demonstrated:
294
+ *
295
+ * 1. TanStack Table Integration: Using @tanstack/react-table with shadcn/ui
296
+ * 2. Sorting: Click headers to sort ascending/descending
297
+ * 3. Filtering: Text input to filter table data
298
+ * 4. Column Visibility: Toggle columns via dropdown menu
299
+ * 5. Pagination: Built-in pagination controls
300
+ * 6. Row Actions: Dropdown menu per row for context actions
301
+ * 7. Responsive Design: Table adapts to different screen sizes
302
+ *
303
+ * Required Dependencies:
304
+ * - @tanstack/react-table
305
+ * - lucide-react
306
+ *
307
+ * Installation:
308
+ * npx shadcn@latest add table
309
+ * npx shadcn@latest add button
310
+ * npx shadcn@latest add input
311
+ * npx shadcn@latest add dropdown-menu
312
+ * npm install @tanstack/react-table lucide-react
313
+ */
@@ -0,0 +1,177 @@
1
+ // Example: Form Pattern with shadcn/ui components
2
+ // Demonstrates: Form building, validation, and composition
3
+
4
+ "use client"
5
+
6
+ import { Button } from "@/components/ui/button"
7
+ import {
8
+ Form,
9
+ FormControl,
10
+ FormDescription,
11
+ FormField,
12
+ FormItem,
13
+ FormLabel,
14
+ FormMessage,
15
+ } from "@/components/ui/form"
16
+ import { Input } from "@/components/ui/input"
17
+ import {
18
+ Select,
19
+ SelectContent,
20
+ SelectItem,
21
+ SelectTrigger,
22
+ SelectValue,
23
+ } from "@/components/ui/select"
24
+ import { Textarea } from "@/components/ui/textarea"
25
+ import { toast } from "@/components/ui/use-toast"
26
+ import { zodResolver } from "@hookform/resolvers/zod"
27
+ import { useForm } from "react-hook-form"
28
+ import * as z from "zod"
29
+
30
+ // Define form schema with zod
31
+ const formSchema = z.object({
32
+ username: z.string().min(2, {
33
+ message: "Username must be at least 2 characters.",
34
+ }),
35
+ email: z.string().email({
36
+ message: "Please enter a valid email address.",
37
+ }),
38
+ role: z.enum(["admin", "user", "viewer"], {
39
+ required_error: "Please select a role.",
40
+ }),
41
+ bio: z.string().max(160, {
42
+ message: "Bio must not be longer than 160 characters.",
43
+ }).optional(),
44
+ })
45
+
46
+ type FormValues = z.infer<typeof formSchema>
47
+
48
+ export function UserProfileForm() {
49
+ // Initialize form with react-hook-form and zod validation
50
+ const form = useForm<FormValues>({
51
+ resolver: zodResolver(formSchema),
52
+ defaultValues: {
53
+ username: "",
54
+ email: "",
55
+ bio: "",
56
+ },
57
+ })
58
+
59
+ // Handle form submission
60
+ function onSubmit(values: FormValues) {
61
+ // In a real app, send to API
62
+ console.log(values)
63
+
64
+ toast({
65
+ title: "Profile updated",
66
+ description: "Your profile has been successfully updated.",
67
+ })
68
+ }
69
+
70
+ return (
71
+ <Form {...form}>
72
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
73
+ <FormField
74
+ control={form.control}
75
+ name="username"
76
+ render={({ field }) => (
77
+ <FormItem>
78
+ <FormLabel>Username</FormLabel>
79
+ <FormControl>
80
+ <Input placeholder="johndoe" {...field} />
81
+ </FormControl>
82
+ <FormDescription>
83
+ This is your public display name.
84
+ </FormDescription>
85
+ <FormMessage />
86
+ </FormItem>
87
+ )}
88
+ />
89
+
90
+ <FormField
91
+ control={form.control}
92
+ name="email"
93
+ render={({ field }) => (
94
+ <FormItem>
95
+ <FormLabel>Email</FormLabel>
96
+ <FormControl>
97
+ <Input type="email" placeholder="john@example.com" {...field} />
98
+ </FormControl>
99
+ <FormMessage />
100
+ </FormItem>
101
+ )}
102
+ />
103
+
104
+ <FormField
105
+ control={form.control}
106
+ name="role"
107
+ render={({ field }) => (
108
+ <FormItem>
109
+ <FormLabel>Role</FormLabel>
110
+ <Select onValueChange={field.onChange} defaultValue={field.value}>
111
+ <FormControl>
112
+ <SelectTrigger>
113
+ <SelectValue placeholder="Select a role" />
114
+ </SelectTrigger>
115
+ </FormControl>
116
+ <SelectContent>
117
+ <SelectItem value="admin">Admin</SelectItem>
118
+ <SelectItem value="user">User</SelectItem>
119
+ <SelectItem value="viewer">Viewer</SelectItem>
120
+ </SelectContent>
121
+ </Select>
122
+ <FormDescription>
123
+ Your role determines your access level.
124
+ </FormDescription>
125
+ <FormMessage />
126
+ </FormItem>
127
+ )}
128
+ />
129
+
130
+ <FormField
131
+ control={form.control}
132
+ name="bio"
133
+ render={({ field }) => (
134
+ <FormItem>
135
+ <FormLabel>Bio</FormLabel>
136
+ <FormControl>
137
+ <Textarea
138
+ placeholder="Tell us about yourself"
139
+ className="resize-none"
140
+ {...field}
141
+ />
142
+ </FormControl>
143
+ <FormDescription>
144
+ Optional. Maximum 160 characters.
145
+ </FormDescription>
146
+ <FormMessage />
147
+ </FormItem>
148
+ )}
149
+ />
150
+
151
+ <Button type="submit">Update profile</Button>
152
+ </form>
153
+ </Form>
154
+ )
155
+ }
156
+
157
+ /**
158
+ * Key Patterns Demonstrated:
159
+ *
160
+ * 1. Form Composition: Using shadcn/ui's Form components with react-hook-form
161
+ * 2. Validation: Zod schema for type-safe validation
162
+ * 3. Error Handling: Automatic error messages via FormMessage
163
+ * 4. Accessibility: All fields properly labeled with descriptions
164
+ * 5. Type Safety: TypeScript types inferred from Zod schema
165
+ *
166
+ * Required Dependencies:
167
+ * - react-hook-form
168
+ * - @hookform/resolvers
169
+ * - zod
170
+ *
171
+ * Installation:
172
+ * npx shadcn@latest add form
173
+ * npx shadcn@latest add input
174
+ * npx shadcn@latest add select
175
+ * npx shadcn@latest add textarea
176
+ * npx shadcn@latest add button
177
+ */