@proofkit/cli 2.0.0-beta.5 → 2.0.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proofkit/cli",
3
- "version": "2.0.0-beta.5",
3
+ "version": "2.0.0-beta.9",
4
4
  "description": "Create web application with the ProofKit stack",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,13 +42,12 @@
42
42
  "@better-fetch/fetch": "1.1.17",
43
43
  "@clack/core": "^0.3.4",
44
44
  "@clack/prompts": "^0.11.0",
45
- "@ianvs/prettier-plugin-sort-imports": "^4.4.1",
46
45
  "@types/glob": "^8.1.0",
47
46
  "axios": "^1.7.3",
48
47
  "chalk": "5.4.1",
49
48
  "commander": "^14.0.0",
50
49
  "dotenv": "^16.5.0",
51
- "es-toolkit": "^1.15.1",
50
+ "es-toolkit": "^1.38.0",
52
51
  "execa": "^9.5.1",
53
52
  "fast-glob": "^3.3.3",
54
53
  "fs-extra": "^11.3.0",
@@ -59,15 +58,13 @@
59
58
  "jsonc-parser": "^3.3.1",
60
59
  "open": "^10.1.0",
61
60
  "ora": "6.3.1",
62
- "prettier": "^3.5.3",
63
- "prettier-plugin-tailwindcss": "^0.6.5",
64
61
  "randomstring": "^1.3.0",
65
62
  "semver": "^7.7.2",
66
63
  "shadcn": "^2.10.0",
67
64
  "sort-package-json": "^2.10.0",
68
65
  "ts-morph": "^26.0.0",
69
- "@proofkit/fmdapi": "5.0.3-beta.0",
70
- "@proofkit/typegen": "1.0.11-beta.1"
66
+ "@proofkit/fmdapi": "5.0.3-beta.1",
67
+ "@proofkit/typegen": "1.1.0-beta.4"
71
68
  },
72
69
  "devDependencies": {
73
70
  "@auth/drizzle-adapter": "^1.1.0",
@@ -76,8 +73,9 @@
76
73
  "@planetscale/database": "^1.18.0",
77
74
  "@prisma/adapter-planetscale": "^5.14.0",
78
75
  "@prisma/client": "^5.14.0",
76
+ "@rollup/plugin-replace": "^6.0.3",
79
77
  "@t3-oss/env-nextjs": "^0.10.1",
80
- "@tanstack/react-query": "^5.49.2",
78
+ "@tanstack/react-query": "^5.76.1",
81
79
  "@trpc/client": "11.0.0-rc.441",
82
80
  "@trpc/next": "11.0.0-rc.441",
83
81
  "@trpc/react-query": "11.0.0-rc.441",
@@ -89,11 +87,11 @@
89
87
  "@types/randomstring": "^1.3.0",
90
88
  "@types/react": "^19.1.10",
91
89
  "@types/semver": "^7.7.0",
92
- "@vitest/coverage-v8": "^1.4.0",
90
+ "@vitest/coverage-v8": "^2.1.8",
93
91
  "drizzle-kit": "^0.21.4",
94
92
  "drizzle-orm": "^0.30.10",
95
93
  "mysql2": "^3.9.7",
96
- "next": "^15.4.8",
94
+ "next": "^15.5.8",
97
95
  "next-auth": "^4.24.7",
98
96
  "postgres": "^3.4.4",
99
97
  "prisma": "^5.14.0",
@@ -104,10 +102,12 @@
104
102
  "tailwindcss": "^4.1.11",
105
103
  "tsdown": "^0.14.1",
106
104
  "type-fest": "^3.13.1",
107
- "typescript": "^5.9.2",
108
- "vitest": "^3.2.4",
109
- "zod": "3.25.64",
110
- "@proofkit/registry": "1.0.0"
105
+ "typescript": "^5.9.3",
106
+ "ultracite": "7.0.8",
107
+ "vitest": "^4.0.7",
108
+ "zod": "^4.1.13",
109
+ "@biomejs/biome": "2.3.11",
110
+ "@proofkit/registry": "1.0.1-beta.0"
111
111
  },
112
112
  "scripts": {
113
113
  "typecheck": "tsc",
@@ -115,10 +115,10 @@
115
115
  "dev": "tsdown --watch",
116
116
  "clean": "rm -rf dist .turbo node_modules",
117
117
  "start": "node dist/index.js",
118
- "lint": "eslint . --ext .ts,.tsx",
119
- "lint:fix": "pnpm lint --fix",
120
- "format": "prettier '**/*.{cjs,mjs,ts,tsx,md,json}' --ignore-path ../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write",
121
- "format:check": "prettier '**/*.{cjs,mjs,ts,tsx,md,json}' --ignore-path ../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --check",
118
+ "lint": "biome check .",
119
+ "lint:summary": "biome check . --reporter=summary",
120
+ "format": "biome format --write .",
121
+ "format:check": "biome format --check .",
122
122
  "release": "changeset version",
123
123
  "pub:beta": "NODE_ENV=production pnpm build && npm publish --tag beta --access public",
124
124
  "pub:next": "NODE_ENV=production pnpm build && npm publish --tag next --access public",
@@ -1,14 +1,4 @@
1
- import {
2
- Body,
3
- Container,
4
- Head,
5
- Heading,
6
- Html,
7
- Img,
8
- Section,
9
- Text,
10
- } from "@react-email/components";
11
- import * as React from "react";
1
+ import { Body, Container, Head, Heading, Html, Img, Section, Text } from "@react-email/components";
12
2
 
13
3
  interface AuthCodeEmailProps {
14
4
  validationCode: string;
@@ -22,29 +12,20 @@ export const AuthCodeEmail = ({ validationCode, type }: AuthCodeEmailProps) => (
22
12
  <Container style={container}>
23
13
  <Img
24
14
  // TODO: Replace with your logo
25
- src="https://proofkit.dev/_astro/proofkit.DNcFg0_B_1JN3Dz.webp"
26
- width="238"
27
- height="175"
28
15
  alt="ProofKit"
16
+ height="175"
17
+ src="https://proofkit.dev/_astro/proofkit.DNcFg0_B_1JN3Dz.webp"
29
18
  style={logo}
19
+ width="238"
30
20
  />
31
- <Text style={tertiary}>
32
- {type === "verification"
33
- ? "Verify Your Email"
34
- : "Reset Your Password"}
35
- </Text>
21
+ <Text style={tertiary}>{type === "verification" ? "Verify Your Email" : "Reset Your Password"}</Text>
36
22
  <Heading style={secondary}>
37
- Enter the following code to{" "}
38
- {type === "verification"
39
- ? "verify your email"
40
- : "reset your password"}
23
+ Enter the following code to {type === "verification" ? "verify your email" : "reset your password"}
41
24
  </Heading>
42
25
  <Section style={codeContainer}>
43
26
  <Text style={code}>{validationCode}</Text>
44
27
  </Section>
45
- <Text style={paragraph}>
46
- If you did not request this code, you can ignore this email.
47
- </Text>
28
+ <Text style={paragraph}>If you did not request this code, you can ignore this email.</Text>
48
29
  </Container>
49
30
  </Body>
50
31
  </Html>
@@ -1,16 +1,4 @@
1
- import {
2
- Body,
3
- Button,
4
- Container,
5
- Head,
6
- Heading,
7
- Hr,
8
- Html,
9
- Img,
10
- Section,
11
- Text,
12
- } from "@react-email/components";
13
- import * as React from "react";
1
+ import { Body, Button, Container, Head, Heading, Hr, Html, Img, Section, Text } from "@react-email/components";
14
2
 
15
3
  export interface GenericEmailProps {
16
4
  title?: string;
@@ -20,30 +8,22 @@ export interface GenericEmailProps {
20
8
  footer?: string;
21
9
  }
22
10
 
23
- export const GenericEmail = ({
24
- title,
25
- description,
26
- ctaText,
27
- ctaHref,
28
- footer,
29
- }: GenericEmailProps) => (
11
+ export const GenericEmail = ({ title, description, ctaText, ctaHref, footer }: GenericEmailProps) => (
30
12
  <Html>
31
13
  <Head />
32
14
  <Body style={styles.main}>
33
15
  <Container style={styles.container}>
34
16
  <Img
35
- src="https://proofkit.dev/_astro/proofkit.DNcFg0_B_1JN3Dz.webp"
36
- width="238"
37
- height="175"
38
17
  alt="ProofKit"
18
+ height="175"
19
+ src="https://proofkit.dev/_astro/proofkit.DNcFg0_B_1JN3Dz.webp"
39
20
  style={styles.logo}
21
+ width="238"
40
22
  />
41
23
 
42
24
  {title ? <Heading style={styles.title}>{title}</Heading> : null}
43
25
 
44
- {description ? (
45
- <Text style={styles.description}>{description}</Text>
46
- ) : null}
26
+ {description ? <Text style={styles.description}>{description}</Text> : null}
47
27
 
48
28
  {ctaText && ctaHref ? (
49
29
  <Section style={styles.ctaSection}>
@@ -53,9 +33,7 @@ export const GenericEmail = ({
53
33
  </Section>
54
34
  ) : null}
55
35
 
56
- {(title || description || (ctaText && ctaHref)) && (
57
- <Hr style={styles.hr} />
58
- )}
36
+ {(title || description || (ctaText && ctaHref)) && <Hr style={styles.hr} />}
59
37
 
60
38
  {footer ? <Text style={styles.footer}>{footer}</Text> : null}
61
39
  </Container>
@@ -65,8 +43,7 @@ export const GenericEmail = ({
65
43
 
66
44
  GenericEmail.PreviewProps = {
67
45
  title: "Welcome to ProofKit",
68
- description:
69
- "Thanks for trying ProofKit. This is a sample email template you can customize.",
46
+ description: "Thanks for trying ProofKit. This is a sample email template you can customize.",
70
47
  ctaText: "Get Started",
71
48
  ctaHref: "https://proofkit.dev",
72
49
  footer: "You received this email because you signed up for updates.",
@@ -1,14 +1,4 @@
1
- import {
2
- Body,
3
- Container,
4
- Head,
5
- Heading,
6
- Html,
7
- Img,
8
- Section,
9
- Text,
10
- } from "@react-email/components";
11
- import * as React from "react";
1
+ import { Body, Container, Head, Heading, Html, Img, Section, Text } from "@react-email/components";
12
2
 
13
3
  interface AuthCodeEmailProps {
14
4
  validationCode: string;
@@ -22,29 +12,20 @@ export const AuthCodeEmail = ({ validationCode, type }: AuthCodeEmailProps) => (
22
12
  <Container style={container}>
23
13
  <Img
24
14
  // TODO: Replace with your logo
25
- src="https://proofkit.dev/_astro/proofkit.DNcFg0_B_1JN3Dz.webp"
26
- width="238"
27
- height="175"
28
15
  alt="ProofKit"
16
+ height="175"
17
+ src="https://proofkit.dev/_astro/proofkit.DNcFg0_B_1JN3Dz.webp"
29
18
  style={logo}
19
+ width="238"
30
20
  />
31
- <Text style={tertiary}>
32
- {type === "verification"
33
- ? "Verify Your Email"
34
- : "Reset Your Password"}
35
- </Text>
21
+ <Text style={tertiary}>{type === "verification" ? "Verify Your Email" : "Reset Your Password"}</Text>
36
22
  <Heading style={secondary}>
37
- Enter the following code to{" "}
38
- {type === "verification"
39
- ? "verify your email"
40
- : "reset your password"}
23
+ Enter the following code to {type === "verification" ? "verify your email" : "reset your password"}
41
24
  </Heading>
42
25
  <Section style={codeContainer}>
43
26
  <Text style={code}>{validationCode}</Text>
44
27
  </Section>
45
- <Text style={paragraph}>
46
- If you did not request this code, you can ignore this email.
47
- </Text>
28
+ <Text style={paragraph}>If you did not request this code, you can ignore this email.</Text>
48
29
  </Container>
49
30
  </Body>
50
31
  </Html>
@@ -1,4 +1,4 @@
1
1
  import { handlers } from "@/server/auth"; // Referring to the auth.ts we just created
2
2
 
3
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
3
+
4
4
  export const { GET, POST } = handlers;
@@ -1,6 +1,6 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-call */
2
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
1
+
2
+
3
+
4
4
 
5
5
  import { env } from "@/config/env";
6
6
  import { OttoAdapter } from "@proofkit/fmdapi";
@@ -6,7 +6,8 @@
6
6
  "dev": "next dev --turbopack",
7
7
  "build": "next build",
8
8
  "start": "next start",
9
- "lint": "next lint",
9
+ "lint": "biome check",
10
+ "format": "biome format --write",
10
11
  "proofkit": "proofkit",
11
12
  "typegen": "proofkit typegen",
12
13
  "deploy": "proofkit deploy"
@@ -25,7 +26,7 @@
25
26
  "mantine-react-table": "2.0.0-beta.9",
26
27
  "@t3-oss/env-nextjs": "^0.12.0",
27
28
  "dayjs": "^1.11.13",
28
- "next": "^15.2.6",
29
+ "next": "^15.2.7",
29
30
  "react": "19.0.0",
30
31
  "react-dom": "19.0.0",
31
32
  "zod": "^3.24.2"
@@ -34,9 +35,9 @@
34
35
  "@types/node": "^20",
35
36
  "@types/react": "npm:types-react@19.0.12",
36
37
  "@types/react-dom": "npm:types-react-dom@19.0.4",
37
- "eslint": "^9.14.0",
38
- "eslint-config-next": "15.2.6",
38
+ "@biomejs/biome": "2.3.11",
39
39
  "postcss": "^8.4.41",
40
+ "ultracite": "7.0.8",
40
41
  "postcss-preset-mantine": "^1.17.0",
41
42
  "postcss-simple-vars": "^7.0.1",
42
43
  "typescript": "^5"
@@ -1,5 +1,6 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/2.2.0/schema.json",
2
+ "root": false,
3
+ "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json",
3
4
  "vcs": {
4
5
  "enabled": true,
5
6
  "clientKind": "git",
@@ -7,13 +8,7 @@
7
8
  },
8
9
  "files": {
9
10
  "ignoreUnknown": true,
10
- "includes": [
11
- "**",
12
- "!node_modules",
13
- "!.next",
14
- "!dist",
15
- "!build"
16
- ]
11
+ "includes": ["**", "!node_modules", "!.next", "!dist", "!build"]
17
12
  },
18
13
  "formatter": {
19
14
  "enabled": true,
@@ -23,7 +18,19 @@
23
18
  "linter": {
24
19
  "enabled": true,
25
20
  "rules": {
26
- "recommended": true
21
+ "recommended": true,
22
+ "style": {
23
+ "noParameterAssign": "error",
24
+ "useAsConstAssertion": "error",
25
+ "useDefaultParameterLast": "error",
26
+ "useEnumInitializers": "error",
27
+ "useSelfClosingElements": "error",
28
+ "useSingleVarDeclarator": "error",
29
+ "noUnusedTemplateLiteral": "error",
30
+ "useNumberNamespace": "error",
31
+ "noInferrableTypes": "error",
32
+ "noUselessElse": "error"
33
+ }
27
34
  },
28
35
  "domains": {
29
36
  "next": "recommended",
@@ -37,7 +44,5 @@
37
44
  }
38
45
  }
39
46
  },
40
- "extends": [
41
- "ultracite"
42
- ]
43
- }
47
+ "extends": ["ultracite"]
48
+ }
@@ -15,14 +15,14 @@
15
15
  "class-variance-authority": "^0.7.1",
16
16
  "clsx": "^2.1.1",
17
17
  "lucide-react": "^0.541.0",
18
- "next": "15.5.7",
18
+ "next": "^15.5.8",
19
19
  "next-themes": "^0.4.6",
20
20
  "react": "19.1.1",
21
21
  "react-dom": "19.1.1",
22
22
  "tailwind-merge": "^3.3.1"
23
23
  },
24
24
  "devDependencies": {
25
- "@biomejs/biome": "2.2.4",
25
+ "@biomejs/biome": "2.3.11",
26
26
  "@tailwindcss/postcss": "^4",
27
27
  "@types/node": "^22",
28
28
  "@types/react": "^19",
@@ -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
- }