@proofkit/cli 1.2.0-beta.2 → 2.0.0-beta.11

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 (29) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/index.js +108 -98
  3. package/dist/index.js.map +1 -1
  4. package/package.json +46 -48
  5. package/template/extras/emailTemplates/auth-code.tsx +7 -26
  6. package/template/extras/emailTemplates/generic.tsx +8 -31
  7. package/template/extras/fmaddon-auth/emails/auth-code.tsx +7 -26
  8. package/template/extras/src/app/api/auth/[...nextauth]/route.ts +1 -1
  9. package/template/extras/src/server/next-auth/base.ts +3 -3
  10. package/template/nextjs-mantine/package.json +5 -4
  11. package/template/nextjs-shadcn/biome.json +18 -13
  12. package/template/nextjs-shadcn/package.json +9 -7
  13. package/template/nextjs-shadcn/proofkit.json +1 -1
  14. package/template/nextjs-shadcn/src/components/mode-toggle.tsx +39 -0
  15. package/template/nextjs-shadcn/src/components/ui/button.tsx +61 -0
  16. package/template/nextjs-shadcn/src/components/ui/dropdown-menu.tsx +267 -0
  17. package/template/nextjs-shadcn/src/components/ui/sonner.tsx +31 -0
  18. package/template/pages/nextjs/table-infinite/actions.ts +1 -1
  19. package/template/pages/nextjs/table-infinite-edit/actions.ts +1 -1
  20. package/template/vite-wv/package.json +5 -2
  21. package/template/vite-wv/src/routeTree.gen.ts +1 -1
  22. package/template/vite-wv/src/routes/index.tsx +8 -20
  23. package/template/vite-wv/src/routes/secondary.tsx +4 -6
  24. package/template/extras/config/_eslint.js +0 -27
  25. package/template/extras/config/_prettier.config.js +0 -6
  26. package/template/nextjs-mantine/.prettierrc +0 -3
  27. package/template/nextjs-shadcn/.prettierrc +0 -3
  28. package/template/vite-wv/.prettierrc +0 -3
  29. /package/dist/{index.d.ts → index-BitR4XBZ.d.ts} +0 -0
@@ -0,0 +1,267 @@
1
+ "use client";
2
+
3
+ import { Check, ChevronRight, Circle } from "lucide-react";
4
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
5
+ import type * as React from "react";
6
+
7
+ import { cn } from "@/lib/utils";
8
+
9
+ function DropdownMenu({
10
+ ...props
11
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
12
+ return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />;
13
+ }
14
+
15
+ function DropdownMenuPortal({
16
+ ...props
17
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
18
+ return (
19
+ <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
20
+ );
21
+ }
22
+
23
+ function DropdownMenuTrigger({
24
+ ...props
25
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
26
+ return (
27
+ <DropdownMenuPrimitive.Trigger
28
+ className="select-none"
29
+ data-slot="dropdown-menu-trigger"
30
+ {...props}
31
+ />
32
+ );
33
+ }
34
+
35
+ function DropdownMenuContent({
36
+ className,
37
+ sideOffset = 4,
38
+ ...props
39
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
40
+ return (
41
+ <DropdownMenuPrimitive.Portal>
42
+ <DropdownMenuPrimitive.Content
43
+ className={cn(
44
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] space-y-0.5 overflow-hidden rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in",
45
+ className
46
+ )}
47
+ data-slot="dropdown-menu-content"
48
+ sideOffset={sideOffset}
49
+ {...props}
50
+ />
51
+ </DropdownMenuPrimitive.Portal>
52
+ );
53
+ }
54
+
55
+ function DropdownMenuGroup({
56
+ ...props
57
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
58
+ return (
59
+ <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
60
+ );
61
+ }
62
+
63
+ function DropdownMenuItem({
64
+ className,
65
+ inset,
66
+ variant,
67
+ ...props
68
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
69
+ inset?: boolean;
70
+ variant?: "destructive";
71
+ }) {
72
+ return (
73
+ <DropdownMenuPrimitive.Item
74
+ className={cn(
75
+ "relative flex cursor-default select-none items-center gap-2 rounded-md px-2 py-1.5 text-foreground text-sm outline-hidden transition-colors data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg:not([class*=size-])]:size-4 [&_svg:not([role=img]):not([class*=text-])]:opacity-60 [&_svg]:pointer-events-none [&_svg]:shrink-0",
76
+ "focus:bg-accent focus:text-foreground",
77
+ "data-[active=true]:bg-accent data-[active=true]:text-accent-foreground",
78
+ inset && "ps-8",
79
+ variant === "destructive" &&
80
+ "text-destructive hover:bg-destructive/5 hover:text-destructive focus:bg-destructive/5 focus:text-destructive data-[active=true]:bg-destructive/5",
81
+ className
82
+ )}
83
+ data-slot="dropdown-menu-item"
84
+ {...props}
85
+ />
86
+ );
87
+ }
88
+
89
+ function DropdownMenuCheckboxItem({
90
+ className,
91
+ children,
92
+ checked,
93
+ ...props
94
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
95
+ return (
96
+ <DropdownMenuPrimitive.CheckboxItem
97
+ checked={checked}
98
+ className={cn(
99
+ "relative flex cursor-default select-none items-center rounded-md py-1.5 ps-8 pe-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
100
+ className
101
+ )}
102
+ data-slot="dropdown-menu-checkbox-item"
103
+ {...props}
104
+ >
105
+ <span className="absolute start-2 flex h-3.5 w-3.5 items-center justify-center text-muted-foreground">
106
+ <DropdownMenuPrimitive.ItemIndicator>
107
+ <Check className="h-4 w-4 text-primary" />
108
+ </DropdownMenuPrimitive.ItemIndicator>
109
+ </span>
110
+ {children}
111
+ </DropdownMenuPrimitive.CheckboxItem>
112
+ );
113
+ }
114
+
115
+ function DropdownMenuRadioItem({
116
+ className,
117
+ children,
118
+ ...props
119
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
120
+ return (
121
+ <DropdownMenuPrimitive.RadioItem
122
+ className={cn(
123
+ "relative flex cursor-default select-none items-center rounded-md py-1.5 ps-6 pe-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
124
+ className
125
+ )}
126
+ data-slot="dropdown-menu-radio-item"
127
+ {...props}
128
+ >
129
+ <span className="absolute start-1.5 flex h-3.5 w-3.5 items-center justify-center">
130
+ <DropdownMenuPrimitive.ItemIndicator>
131
+ <Circle className="h-1.5 w-1.5 fill-primary stroke-primary" />
132
+ </DropdownMenuPrimitive.ItemIndicator>
133
+ </span>
134
+ {children}
135
+ </DropdownMenuPrimitive.RadioItem>
136
+ );
137
+ }
138
+
139
+ function DropdownMenuLabel({
140
+ className,
141
+ inset,
142
+ ...props
143
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
144
+ inset?: boolean;
145
+ }) {
146
+ return (
147
+ <DropdownMenuPrimitive.Label
148
+ className={cn(
149
+ "px-2 py-1.5 font-medium text-muted-foreground text-xs",
150
+ inset && "ps-8",
151
+ className
152
+ )}
153
+ data-slot="dropdown-menu-label"
154
+ {...props}
155
+ />
156
+ );
157
+ }
158
+
159
+ function DropdownMenuRadioGroup({
160
+ ...props
161
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
162
+ return (
163
+ <DropdownMenuPrimitive.RadioGroup
164
+ data-slot="dropdown-menu-radio-group"
165
+ {...props}
166
+ />
167
+ );
168
+ }
169
+
170
+ function DropdownMenuSeparator({
171
+ className,
172
+ ...props
173
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
174
+ return (
175
+ <DropdownMenuPrimitive.Separator
176
+ className={cn("-mx-2 my-1.5 h-px bg-muted", className)}
177
+ data-slot="dropdown-menu-separator"
178
+ {...props}
179
+ />
180
+ );
181
+ }
182
+
183
+ function DropdownMenuShortcut({
184
+ className,
185
+ ...props
186
+ }: React.HTMLAttributes<HTMLSpanElement>) {
187
+ return (
188
+ <span
189
+ className={cn("ms-auto text-xs tracking-widest opacity-60", className)}
190
+ data-slot="dropdown-menu-shortcut"
191
+ {...props}
192
+ />
193
+ );
194
+ }
195
+
196
+ function DropdownMenuSub({
197
+ ...props
198
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
199
+ return (
200
+ <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
201
+ );
202
+ }
203
+
204
+ function DropdownMenuSubTrigger({
205
+ className,
206
+ inset,
207
+ children,
208
+ ...props
209
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
210
+ inset?: boolean;
211
+ }) {
212
+ return (
213
+ <DropdownMenuPrimitive.SubTrigger
214
+ className={cn(
215
+ "flex cursor-default select-none items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-hidden",
216
+ "focus:bg-accent focus:text-foreground",
217
+ "data-[state=open]:bg-accent data-[state=open]:text-foreground",
218
+ "data-[here=true]:bg-accent data-[here=true]:text-foreground",
219
+ "[&>svg]:pointer-events-none [&>svg]:size-4 [&>svg]:shrink-0 [&_svg:not([role=img]):not([class*=text-])]:opacity-60",
220
+ inset && "ps-8",
221
+ className
222
+ )}
223
+ data-slot="dropdown-menu-sub-trigger"
224
+ {...props}
225
+ >
226
+ {children}
227
+ <ChevronRight
228
+ className="ms-auto size-3.5! rtl:rotate-180"
229
+ data-slot="dropdown-menu-sub-trigger-indicator"
230
+ />
231
+ </DropdownMenuPrimitive.SubTrigger>
232
+ );
233
+ }
234
+
235
+ function DropdownMenuSubContent({
236
+ className,
237
+ ...props
238
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
239
+ return (
240
+ <DropdownMenuPrimitive.SubContent
241
+ className={cn(
242
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] space-y-0.5 overflow-hidden rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in",
243
+ className
244
+ )}
245
+ data-slot="dropdown-menu-sub-content"
246
+ {...props}
247
+ />
248
+ );
249
+ }
250
+
251
+ export {
252
+ DropdownMenu,
253
+ DropdownMenuCheckboxItem,
254
+ DropdownMenuContent,
255
+ DropdownMenuGroup,
256
+ DropdownMenuItem,
257
+ DropdownMenuLabel,
258
+ DropdownMenuPortal,
259
+ DropdownMenuRadioGroup,
260
+ DropdownMenuRadioItem,
261
+ DropdownMenuSeparator,
262
+ DropdownMenuShortcut,
263
+ DropdownMenuSub,
264
+ DropdownMenuSubContent,
265
+ DropdownMenuSubTrigger,
266
+ DropdownMenuTrigger,
267
+ };
@@ -0,0 +1,31 @@
1
+ "use client";
2
+
3
+ import { useTheme } from "next-themes";
4
+ import { Toaster as Sonner } from "sonner";
5
+
6
+ type ToasterProps = React.ComponentProps<typeof Sonner>;
7
+
8
+ function Toaster({ ...props }: ToasterProps) {
9
+ const { theme = "system" } = useTheme();
10
+
11
+ return (
12
+ <Sonner
13
+ theme={theme as ToasterProps["theme"]}
14
+ className="toaster group"
15
+ toastOptions={{
16
+ classNames: {
17
+ toast:
18
+ "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
19
+ description: "group-[.toast]:text-muted-foreground",
20
+ actionButton:
21
+ "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
22
+ cancelButton:
23
+ "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
24
+ },
25
+ }}
26
+ {...props}
27
+ />
28
+ );
29
+ }
30
+
31
+ export { Toaster };
@@ -19,7 +19,7 @@ export const fetchData = __ACTION_CLIENT__
19
19
  })
20
20
  )
21
21
  .action(async ({ parsedInput: { offset, sorting, columnFilters } }) => {
22
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+
23
23
  const getOptions: clientTypes.ListParams<__TYPE_NAME__, any> & {
24
24
  query: clientTypes.Query<__TYPE_NAME__>[];
25
25
  } = {
@@ -24,7 +24,7 @@ export const fetchData = __ACTION_CLIENT__
24
24
  })
25
25
  )
26
26
  .action(async ({ parsedInput: { offset, sorting, columnFilters } }) => {
27
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+
28
28
  const getOptions: clientTypes.ListParams<__TYPE_NAME__, any> & {
29
29
  query: clientTypes.Query<__TYPE_NAME__>[];
30
30
  } = {
@@ -12,7 +12,9 @@
12
12
  "serve": "vite preview",
13
13
  "start": "vite",
14
14
  "typegen": "proofkit typegen",
15
- "upload": "node scripts/upload.js"
15
+ "upload": "node scripts/upload.js",
16
+ "lint": "biome check",
17
+ "format": "biome format --write"
16
18
  },
17
19
  "dependencies": {
18
20
  "@mantine/core": "^7.15.1",
@@ -33,8 +35,9 @@
33
35
  "zod": "^3.24.1"
34
36
  },
35
37
  "devDependencies": {
36
- "@tanstack/eslint-plugin-query": "^5.59.1",
38
+ "@biomejs/biome": "2.3.11",
37
39
  "@tanstack/react-query-devtools": "^5.69.0",
40
+ "ultracite": "7.0.8",
38
41
  "@tanstack/react-router-devtools": "^1.114.27",
39
42
  "@tanstack/router-plugin": "^1.114.27",
40
43
  "@types/node": "^22.13.13",
@@ -1,4 +1,4 @@
1
- /* eslint-disable */
1
+
2
2
 
3
3
  // @ts-nocheck
4
4
 
@@ -1,17 +1,6 @@
1
- import * as React from "react";
2
- import { createFileRoute, Link } from "@tanstack/react-router";
3
- import {
4
- Anchor,
5
- Box,
6
- Code,
7
- Container,
8
- Image,
9
- px,
10
- Stack,
11
- Text,
12
- Title,
13
- } from "@mantine/core";
1
+ import { Anchor, Box, Code, Container, Image, px, Stack, Text, Title } from "@mantine/core";
14
2
  import { IconExternalLink } from "@tabler/icons-react";
3
+ import { createFileRoute, Link } from "@tanstack/react-router";
15
4
 
16
5
  export const Route = createFileRoute("/")({
17
6
  component: HomeComponent,
@@ -22,20 +11,20 @@ function HomeComponent() {
22
11
  <Container mt="5rem">
23
12
  <Stack gap="xl" ta="center">
24
13
  <Image
25
- src="https://raw.githubusercontent.com/proofgeist/proofkit/dde6366c529104658dfba67a8fc2910a8644fc64/docs/src/assets/proofkit.png"
26
14
  alt="ProofKit"
15
+ mah={px("16rem")}
16
+ src="https://raw.githubusercontent.com/proofgeist/proofkit/dde6366c529104658dfba67a8fc2910a8644fc64/docs/src/assets/proofkit.png"
27
17
  style={{
28
18
  marginRight: "auto",
29
19
  marginLeft: "auto",
30
20
  }}
31
21
  w={"auto"}
32
- mah={px("16rem")}
33
22
  />
34
23
  <Title order={1}>Welcome!</Title>
35
24
 
36
25
  <Text style={{ textWrap: "balance" }}>
37
- This is the base template page. To add more pages, components, or
38
- other features, run the ProofKit CLI from within your project.
26
+ This is the base template page. To add more pages, components, or other features, run the ProofKit CLI from
27
+ within your project.
39
28
  </Text>
40
29
  <Code block>pnpm proofkit</Code>
41
30
 
@@ -45,17 +34,16 @@ function HomeComponent() {
45
34
  <Box>
46
35
  <Anchor
47
36
  href="https://proofkit.dev"
48
- target="_blank"
49
37
  rel="proofkit-app"
50
38
  style={{ display: "inline-flex", alignItems: "center", gap: 4 }}
39
+ target="_blank"
51
40
  >
52
41
  ProofKit Docs <IconExternalLink size={px("1rem")} />
53
42
  </Anchor>
54
43
  </Box>
55
44
 
56
45
  <Text c="dimmed" size="sm">
57
- Need to build multiple webviewer widgets?{" "}
58
- <Link to="/secondary">Check out the secondary page</Link>
46
+ Need to build multiple webviewer widgets? <Link to="/secondary">Check out the secondary page</Link>
59
47
  </Text>
60
48
  </Stack>
61
49
  </Container>
@@ -1,6 +1,5 @@
1
- import * as React from "react";
2
- import { createFileRoute, Link } from "@tanstack/react-router";
3
1
  import { Code, Container, Stack, Text, Title } from "@mantine/core";
2
+ import { createFileRoute, Link } from "@tanstack/react-router";
4
3
 
5
4
  export const Route = createFileRoute("/secondary")({
6
5
  component: RouteComponent,
@@ -12,12 +11,11 @@ function RouteComponent() {
12
11
  <Stack gap="xl" ta="center">
13
12
  <Title order={1}>Secondary Page</Title>
14
13
  <Text>
15
- Use hidden pages like this to embed multiple webviewer widgets into a
16
- single HTML bundle for your FileMaker solution.
14
+ Use hidden pages like this to embed multiple webviewer widgets into a single HTML bundle for your FileMaker
15
+ solution.
17
16
  </Text>
18
17
  <Text>
19
- See how to navigate via a FileMaker script in the{" "}
20
- <Code>EXAMPLE: Navigation</Code> script
18
+ See how to navigate via a FileMaker script in the <Code>EXAMPLE: Navigation</Code> script
21
19
  </Text>
22
20
  <Text c="dimmed" size="sm">
23
21
  <Link to="/">Go back to the home page</Link>
@@ -1,27 +0,0 @@
1
- /** @type {import("eslint").Linter.Config} */
2
- export const _initialConfig = {
3
- parser: "@typescript-eslint/parser",
4
- parserOptions: { project: true },
5
- plugins: ["@typescript-eslint"],
6
- extends: [
7
- "next/core-web-vitals",
8
- "plugin:@typescript-eslint/recommended-type-checked",
9
- "plugin:@typescript-eslint/stylistic-type-checked",
10
- ],
11
- rules: {
12
- "@typescript-eslint/array-type": "off",
13
- "@typescript-eslint/consistent-type-definitions": "off",
14
- "@typescript-eslint/consistent-type-imports": [
15
- "warn",
16
- { prefer: "type-imports", fixStyle: "inline-type-imports" },
17
- ],
18
- "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
19
- "@typescript-eslint/require-await": "off",
20
- "@typescript-eslint/no-explicit-any": "warn",
21
- "@typescript-eslint/no-misused-promises": [
22
- "error",
23
- { checksVoidReturn: { attributes: false } },
24
- ],
25
- "@typescript-eslint/no-floating-promises": "warn",
26
- },
27
- };
@@ -1,6 +0,0 @@
1
- /** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */
2
- const config = {
3
- plugins: ["prettier-plugin-tailwindcss"],
4
- };
5
-
6
- export default config;
@@ -1,3 +0,0 @@
1
- {
2
- "plugins": ["prettier-plugin-tailwindcss"]
3
- }
@@ -1,3 +0,0 @@
1
- {
2
- "plugins": ["prettier-plugin-tailwindcss"]
3
- }
@@ -1,3 +0,0 @@
1
- {
2
- "plugins": ["prettier-plugin-tailwindcss"]
3
- }
File without changes