mirror of
https://github.com/skidoodle/budgetable.git
synced 2026-04-27 23:37:36 +02:00
Security
This commit is contained in:
+16
-53
@@ -1,65 +1,28 @@
|
|||||||
FROM node:20-alpine AS base
|
FROM oven/bun:1 AS base
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
### Dependencies ###
|
|
||||||
FROM base AS deps
|
FROM base AS deps
|
||||||
RUN apk add --no-cache libc6-compat git curl
|
COPY package.json bun.lock* ./
|
||||||
|
RUN bun install --no-save --frozen-lockfile
|
||||||
|
|
||||||
# Setup pnpm environment
|
|
||||||
ENV PNPM_HOME="/pnpm"
|
|
||||||
ENV PATH="$PNPM_HOME:$PATH"
|
|
||||||
RUN corepack enable
|
|
||||||
RUN corepack prepare pnpm@latest --activate
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY package.json pnpm-lock.yaml ./
|
|
||||||
RUN pnpm install --frozen-lockfile --prefer-frozen-lockfile
|
|
||||||
|
|
||||||
# Builder
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
|
|
||||||
RUN corepack enable
|
|
||||||
RUN corepack prepare pnpm@latest --activate
|
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY . ./
|
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
COPY ./src ./src
|
COPY . .
|
||||||
COPY ./public ./public
|
|
||||||
COPY package.json pnpm-lock.yaml ./
|
|
||||||
RUN pnpm install --frozen-lockfile --prefer-frozen-lockfile
|
|
||||||
RUN pnpm build
|
|
||||||
|
|
||||||
### Production image runner ###
|
|
||||||
FROM base AS runner
|
|
||||||
|
|
||||||
# Install curl for healthcheck
|
|
||||||
RUN apk add --no-cache curl
|
|
||||||
|
|
||||||
# Disable Next.js telemetry
|
|
||||||
# https://nextjs.org/telemetry
|
|
||||||
ENV NEXT_TELEMETRY_DISABLED=1
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
RUN bun run build
|
||||||
|
|
||||||
# Set correct permissions for nextjs user and don't run as root
|
FROM base AS runner
|
||||||
RUN addgroup nodejs
|
WORKDIR /app
|
||||||
RUN adduser -SDH nextjs
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
RUN mkdir .next
|
ENV NODE_ENV=production \
|
||||||
RUN chown nextjs:nodejs .next
|
PORT=3000 \
|
||||||
|
HOSTNAME="0.0.0.0"
|
||||||
# Automatically leverage output traces to reduce image size
|
RUN addgroup --system --gid 1001 nodejs && \
|
||||||
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
adduser --system --uid 1001 nextjs
|
||||||
|
COPY --from=builder /app/public ./public
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
|
|
||||||
|
|
||||||
USER nextjs
|
USER nextjs
|
||||||
|
|
||||||
# Exposed port (for orchestrators and dynamic reverse proxies)
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
ENV PORT=3000
|
CMD ["bun", "./server.js"]
|
||||||
ENV HOSTNAME=0.0.0.0
|
|
||||||
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD ["curl", "-f", "http://localhost:3000/health"]
|
|
||||||
|
|
||||||
# Run the nextjs app
|
|
||||||
CMD ["node", "server.js"]
|
|
||||||
|
|||||||
+21
-8
@@ -1,21 +1,17 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
"$schema": "https://biomejs.dev/schemas/2.3.8/schema.json",
|
||||||
"vcs": {
|
"vcs": {
|
||||||
"enabled": false,
|
"enabled": true,
|
||||||
"clientKind": "git",
|
"clientKind": "git",
|
||||||
"useIgnoreFile": false
|
"useIgnoreFile": true
|
||||||
},
|
},
|
||||||
"files": {
|
"files": {
|
||||||
"ignoreUnknown": false,
|
"ignoreUnknown": false
|
||||||
"ignore": []
|
|
||||||
},
|
},
|
||||||
"formatter": {
|
"formatter": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"indentStyle": "tab"
|
"indentStyle": "tab"
|
||||||
},
|
},
|
||||||
"organizeImports": {
|
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"linter": {
|
"linter": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"rules": {
|
"rules": {
|
||||||
@@ -23,8 +19,25 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"javascript": {
|
"javascript": {
|
||||||
|
"formatter": {
|
||||||
|
"quoteStyle": "double",
|
||||||
|
"jsxQuoteStyle": "double"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"css": {
|
||||||
"formatter": {
|
"formatter": {
|
||||||
"quoteStyle": "double"
|
"quoteStyle": "double"
|
||||||
|
},
|
||||||
|
"parser": {
|
||||||
|
"tailwindDirectives": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"assist": {
|
||||||
|
"enabled": true,
|
||||||
|
"actions": {
|
||||||
|
"source": {
|
||||||
|
"organizeImports": "on"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-24
@@ -11,34 +11,35 @@
|
|||||||
"format": "biome format --write src/"
|
"format": "biome format --write src/"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@number-flow/react": "^0.4.4",
|
"@number-flow/react": "^0.5.10",
|
||||||
"@radix-ui/react-dialog": "^1.1.4",
|
"@radix-ui/react-dialog": "^1.1.15",
|
||||||
"@radix-ui/react-progress": "^1.1.1",
|
"@radix-ui/react-progress": "^1.1.8",
|
||||||
"@radix-ui/react-slot": "^1.1.1",
|
"@radix-ui/react-slot": "^1.2.4",
|
||||||
"@radix-ui/react-toast": "^1.2.4",
|
"@radix-ui/react-toast": "^1.2.15",
|
||||||
"@radix-ui/react-tooltip": "^1.1.6",
|
"@radix-ui/react-tooltip": "^1.2.8",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.469.0",
|
"lucide-react": "^0.556.0",
|
||||||
"next": "15.2.4",
|
"next": "16.0.7",
|
||||||
"next-themes": "^0.4.4",
|
"next-themes": "^0.4.6",
|
||||||
"pocketbase": "^0.24.0",
|
"pocketbase": "^0.26.5",
|
||||||
"react": "^19.0.0",
|
"react": "^19.2.1",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.2.1",
|
||||||
"sonner": "^1.7.1",
|
"sonner": "^2.0.7",
|
||||||
"tailwind-merge": "^2.6.0",
|
"tailwind-merge": "^3.4.0",
|
||||||
"tailwindcss-animate": "^1.0.7"
|
"tailwindcss-animate": "^1.0.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "1.9.4",
|
"@biomejs/biome": "2.3.8",
|
||||||
"@eslint/eslintrc": "^3",
|
"@eslint/eslintrc": "^3.3.3",
|
||||||
"@types/node": "22.10.2",
|
"@tailwindcss/postcss": "^4.1.17",
|
||||||
"@types/react": "^19",
|
"@types/node": "24.10.1",
|
||||||
"@types/react-dom": "^19",
|
"@types/react": "^19.2.7",
|
||||||
"eslint": "^9",
|
"@types/react-dom": "^19.2.3",
|
||||||
"eslint-config-next": "15.1.3",
|
"eslint": "^9.39.1",
|
||||||
"postcss": "^8",
|
"eslint-config-next": "16.0.7",
|
||||||
"tailwindcss": "^3.4.1",
|
"postcss": "^8.5.6",
|
||||||
"typescript": "^5"
|
"tailwindcss": "^4.1.17",
|
||||||
|
"typescript": "^5.9.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
-4412
File diff suppressed because it is too large
Load Diff
+1
-2
@@ -1,7 +1,6 @@
|
|||||||
/** @type {import('postcss-load-config').Config} */
|
|
||||||
const config = {
|
const config = {
|
||||||
plugins: {
|
plugins: {
|
||||||
tailwindcss: {},
|
"@tailwindcss/postcss": {},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+165
-58
@@ -1,70 +1,177 @@
|
|||||||
@tailwind base;
|
@import "tailwindcss";
|
||||||
@tailwind components;
|
|
||||||
@tailwind utilities;
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
@layer base {
|
|
||||||
:root {
|
:root {
|
||||||
--background: 0 0% 100%;
|
--background: oklch(1 0 0);
|
||||||
--foreground: 240 10% 3.9%;
|
--foreground: oklch(0.1448 0 0);
|
||||||
--card: 0 0% 100%;
|
--card: oklch(1 0 0);
|
||||||
--card-foreground: 240 10% 3.9%;
|
--card-foreground: oklch(0.1448 0 0);
|
||||||
--popover: 0 0% 100%;
|
--popover: oklch(1 0 0);
|
||||||
--popover-foreground: 240 10% 3.9%;
|
--popover-foreground: oklch(0.1448 0 0);
|
||||||
--primary: 240 5.9% 10%;
|
--primary: oklch(0.5555 0 0);
|
||||||
--primary-foreground: 0 0% 98%;
|
--primary-foreground: oklch(0.9851 0 0);
|
||||||
--secondary: 240 4.8% 95.9%;
|
--secondary: oklch(0.9702 0 0);
|
||||||
--secondary-foreground: 240 5.9% 10%;
|
--secondary-foreground: oklch(0.2046 0 0);
|
||||||
--muted: 240 4.8% 95.9%;
|
--muted: oklch(0.9702 0 0);
|
||||||
--muted-foreground: 240 3.8% 46.1%;
|
--muted-foreground: oklch(0.5486 0 0);
|
||||||
--accent: 240 4.8% 95.9%;
|
--accent: oklch(0.9702 0 0);
|
||||||
--accent-foreground: 240 5.9% 10%;
|
--accent-foreground: oklch(0.2046 0 0);
|
||||||
--destructive: 0 84.2% 60.2%;
|
--destructive: oklch(0.583 0.2387 28.4765);
|
||||||
--destructive-foreground: 0 0% 98%;
|
--destructive-foreground: oklch(0.9702 0 0);
|
||||||
--border: 240 5.9% 90%;
|
--border: oklch(0.9219 0 0);
|
||||||
--input: 240 5.9% 90%;
|
--input: oklch(0.9219 0 0);
|
||||||
--ring: 240 10% 3.9%;
|
--ring: oklch(0.709 0 0);
|
||||||
--chart-1: 12 76% 61%;
|
--chart-1: oklch(0.5555 0 0);
|
||||||
--chart-2: 173 58% 39%;
|
--chart-2: oklch(0.5555 0 0);
|
||||||
--chart-3: 197 37% 24%;
|
--chart-3: oklch(0.5555 0 0);
|
||||||
--chart-4: 43 74% 66%;
|
--chart-4: oklch(0.5555 0 0);
|
||||||
--chart-5: 27 87% 67%;
|
--chart-5: oklch(0.5555 0 0);
|
||||||
--radius: 0.5rem;
|
--sidebar: oklch(0.9851 0 0);
|
||||||
|
--sidebar-foreground: oklch(0.1448 0 0);
|
||||||
|
--sidebar-primary: oklch(0.2046 0 0);
|
||||||
|
--sidebar-primary-foreground: oklch(0.9851 0 0);
|
||||||
|
--sidebar-accent: oklch(0.9702 0 0);
|
||||||
|
--sidebar-accent-foreground: oklch(0.2046 0 0);
|
||||||
|
--sidebar-border: oklch(0.9219 0 0);
|
||||||
|
--sidebar-ring: oklch(0.709 0 0);
|
||||||
|
--font-sans: Geist Mono, monospace;
|
||||||
|
--font-serif: Geist Mono, monospace;
|
||||||
|
--font-mono: Geist Mono, monospace;
|
||||||
|
--radius: 0rem;
|
||||||
|
--shadow-x: 0px;
|
||||||
|
--shadow-y: 1px;
|
||||||
|
--shadow-blur: 0px;
|
||||||
|
--shadow-spread: 0px;
|
||||||
|
--shadow-opacity: 0;
|
||||||
|
--shadow-color: hsl(0 0% 0%);
|
||||||
|
--shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-sm:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 1px 2px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 1px 2px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-md:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 2px 4px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-lg:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 4px 6px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-xl:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 8px 10px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0);
|
||||||
|
--tracking-normal: 0em;
|
||||||
|
--spacing: 0.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark {
|
.dark {
|
||||||
--background: 240 10% 3.9%;
|
--background: oklch(0.1448 0 0);
|
||||||
--foreground: 0 0% 98%;
|
--foreground: oklch(0.9851 0 0);
|
||||||
--card: 240 10% 3.9%;
|
--card: oklch(0.2134 0 0);
|
||||||
--card-foreground: 0 0% 98%;
|
--card-foreground: oklch(0.9851 0 0);
|
||||||
--popover: 240 10% 3.9%;
|
--popover: oklch(0.2686 0 0);
|
||||||
--popover-foreground: 0 0% 98%;
|
--popover-foreground: oklch(0.9851 0 0);
|
||||||
--primary: 0 0% 98%;
|
--primary: oklch(0.5555 0 0);
|
||||||
--primary-foreground: 240 5.9% 10%;
|
--primary-foreground: oklch(0.9851 0 0);
|
||||||
--secondary: 240 3.7% 15.9%;
|
--secondary: oklch(0.2686 0 0);
|
||||||
--secondary-foreground: 0 0% 98%;
|
--secondary-foreground: oklch(0.9851 0 0);
|
||||||
--muted: 240 3.7% 15.9%;
|
--muted: oklch(0.2686 0 0);
|
||||||
--muted-foreground: 240 5% 64.9%;
|
--muted-foreground: oklch(0.709 0 0);
|
||||||
--accent: 240 3.7% 15.9%;
|
--accent: oklch(0.3715 0 0);
|
||||||
--accent-foreground: 0 0% 98%;
|
--accent-foreground: oklch(0.9851 0 0);
|
||||||
--destructive: 0 62.8% 30.6%;
|
--destructive: oklch(0.7022 0.1892 22.2279);
|
||||||
--destructive-foreground: 0 0% 98%;
|
--destructive-foreground: oklch(0.2686 0 0);
|
||||||
--border: 240 3.7% 15.9%;
|
--border: oklch(0.3407 0 0);
|
||||||
--input: 240 3.7% 15.9%;
|
--input: oklch(0.4386 0 0);
|
||||||
--ring: 240 4.9% 83.9%;
|
--ring: oklch(0.5555 0 0);
|
||||||
--chart-1: 220 70% 50%;
|
--chart-1: oklch(0.5555 0 0);
|
||||||
--chart-2: 160 60% 45%;
|
--chart-2: oklch(0.5555 0 0);
|
||||||
--chart-3: 30 80% 55%;
|
--chart-3: oklch(0.5555 0 0);
|
||||||
--chart-4: 280 65% 60%;
|
--chart-4: oklch(0.5555 0 0);
|
||||||
--chart-5: 340 75% 55%;
|
--chart-5: oklch(0.5555 0 0);
|
||||||
|
--sidebar: oklch(0.2046 0 0);
|
||||||
|
--sidebar-foreground: oklch(0.9851 0 0);
|
||||||
|
--sidebar-primary: oklch(0.9851 0 0);
|
||||||
|
--sidebar-primary-foreground: oklch(0.2046 0 0);
|
||||||
|
--sidebar-accent: oklch(0.2686 0 0);
|
||||||
|
--sidebar-accent-foreground: oklch(0.9851 0 0);
|
||||||
|
--sidebar-border: oklch(1 0 0);
|
||||||
|
--sidebar-ring: oklch(0.4386 0 0);
|
||||||
|
--font-sans: Geist Mono, monospace;
|
||||||
|
--font-serif: Geist Mono, monospace;
|
||||||
|
--font-mono: Geist Mono, monospace;
|
||||||
|
--radius: 0rem;
|
||||||
|
--shadow-x: 0px;
|
||||||
|
--shadow-y: 1px;
|
||||||
|
--shadow-blur: 0px;
|
||||||
|
--shadow-spread: 0px;
|
||||||
|
--shadow-opacity: 0;
|
||||||
|
--shadow-color: hsl(0 0% 0%);
|
||||||
|
--shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-sm:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 1px 2px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 1px 2px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-md:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 2px 4px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-lg:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 4px 6px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-xl:
|
||||||
|
0px 1px 0px 0px hsl(0 0% 0% / 0), 0px 8px 10px -1px hsl(0 0% 0% / 0);
|
||||||
|
--shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@theme inline {
|
||||||
|
--color-background: var(--background);
|
||||||
|
--color-foreground: var(--foreground);
|
||||||
|
--color-card: var(--card);
|
||||||
|
--color-card-foreground: var(--card-foreground);
|
||||||
|
--color-popover: var(--popover);
|
||||||
|
--color-popover-foreground: var(--popover-foreground);
|
||||||
|
--color-primary: var(--primary);
|
||||||
|
--color-primary-foreground: var(--primary-foreground);
|
||||||
|
--color-secondary: var(--secondary);
|
||||||
|
--color-secondary-foreground: var(--secondary-foreground);
|
||||||
|
--color-muted: var(--muted);
|
||||||
|
--color-muted-foreground: var(--muted-foreground);
|
||||||
|
--color-accent: var(--accent);
|
||||||
|
--color-accent-foreground: var(--accent-foreground);
|
||||||
|
--color-destructive: var(--destructive);
|
||||||
|
--color-destructive-foreground: var(--destructive-foreground);
|
||||||
|
--color-border: var(--border);
|
||||||
|
--color-input: var(--input);
|
||||||
|
--color-ring: var(--ring);
|
||||||
|
--color-chart-1: var(--chart-1);
|
||||||
|
--color-chart-2: var(--chart-2);
|
||||||
|
--color-chart-3: var(--chart-3);
|
||||||
|
--color-chart-4: var(--chart-4);
|
||||||
|
--color-chart-5: var(--chart-5);
|
||||||
|
--color-sidebar: var(--sidebar);
|
||||||
|
--color-sidebar-foreground: var(--sidebar-foreground);
|
||||||
|
--color-sidebar-primary: var(--sidebar-primary);
|
||||||
|
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
||||||
|
--color-sidebar-accent: var(--sidebar-accent);
|
||||||
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
||||||
|
--color-sidebar-border: var(--sidebar-border);
|
||||||
|
--color-sidebar-ring: var(--sidebar-ring);
|
||||||
|
|
||||||
|
--font-sans: var(--font-sans);
|
||||||
|
--font-mono: var(--font-mono);
|
||||||
|
--font-serif: var(--font-serif);
|
||||||
|
|
||||||
|
--radius-sm: calc(var(--radius) - 4px);
|
||||||
|
--radius-md: calc(var(--radius) - 2px);
|
||||||
|
--radius-lg: var(--radius);
|
||||||
|
--radius-xl: calc(var(--radius) + 4px);
|
||||||
|
|
||||||
|
--shadow-2xs: var(--shadow-2xs);
|
||||||
|
--shadow-xs: var(--shadow-xs);
|
||||||
|
--shadow-sm: var(--shadow-sm);
|
||||||
|
--shadow: var(--shadow);
|
||||||
|
--shadow-md: var(--shadow-md);
|
||||||
|
--shadow-lg: var(--shadow-lg);
|
||||||
|
--shadow-xl: var(--shadow-xl);
|
||||||
|
--shadow-2xl: var(--shadow-2xl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
* {
|
* {
|
||||||
@apply border-border;
|
@apply border-border outline-ring/50;
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
@apply bg-background text-foreground;
|
@apply bg-background text-foreground;
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
import type { Config } from "tailwindcss";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
darkMode: ["class"],
|
|
||||||
content: [
|
|
||||||
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
|
|
||||||
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
|
|
||||||
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
|
|
||||||
],
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
colors: {
|
|
||||||
background: 'hsl(var(--background))',
|
|
||||||
foreground: 'hsl(var(--foreground))',
|
|
||||||
card: {
|
|
||||||
DEFAULT: 'hsl(var(--card))',
|
|
||||||
foreground: 'hsl(var(--card-foreground))'
|
|
||||||
},
|
|
||||||
popover: {
|
|
||||||
DEFAULT: 'hsl(var(--popover))',
|
|
||||||
foreground: 'hsl(var(--popover-foreground))'
|
|
||||||
},
|
|
||||||
primary: {
|
|
||||||
DEFAULT: 'hsl(var(--primary))',
|
|
||||||
foreground: 'hsl(var(--primary-foreground))'
|
|
||||||
},
|
|
||||||
secondary: {
|
|
||||||
DEFAULT: 'hsl(var(--secondary))',
|
|
||||||
foreground: 'hsl(var(--secondary-foreground))'
|
|
||||||
},
|
|
||||||
muted: {
|
|
||||||
DEFAULT: 'hsl(var(--muted))',
|
|
||||||
foreground: 'hsl(var(--muted-foreground))'
|
|
||||||
},
|
|
||||||
accent: {
|
|
||||||
DEFAULT: 'hsl(var(--accent))',
|
|
||||||
foreground: 'hsl(var(--accent-foreground))'
|
|
||||||
},
|
|
||||||
destructive: {
|
|
||||||
DEFAULT: 'hsl(var(--destructive))',
|
|
||||||
foreground: 'hsl(var(--destructive-foreground))'
|
|
||||||
},
|
|
||||||
border: 'hsl(var(--border))',
|
|
||||||
input: 'hsl(var(--input))',
|
|
||||||
ring: 'hsl(var(--ring))',
|
|
||||||
chart: {
|
|
||||||
'1': 'hsl(var(--chart-1))',
|
|
||||||
'2': 'hsl(var(--chart-2))',
|
|
||||||
'3': 'hsl(var(--chart-3))',
|
|
||||||
'4': 'hsl(var(--chart-4))',
|
|
||||||
'5': 'hsl(var(--chart-5))'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
borderRadius: {
|
|
||||||
lg: 'var(--radius)',
|
|
||||||
md: 'calc(var(--radius) - 2px)',
|
|
||||||
sm: 'calc(var(--radius) - 4px)'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: [require("tailwindcss-animate")],
|
|
||||||
} satisfies Config;
|
|
||||||
+19
-5
@@ -1,7 +1,11 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES2017",
|
"target": "ES2017",
|
||||||
"lib": ["dom", "dom.iterable", "esnext"],
|
"lib": [
|
||||||
|
"dom",
|
||||||
|
"dom.iterable",
|
||||||
|
"esnext"
|
||||||
|
],
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
@@ -11,7 +15,7 @@
|
|||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"jsx": "preserve",
|
"jsx": "react-jsx",
|
||||||
"incremental": true,
|
"incremental": true,
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
@@ -19,9 +23,19 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./src/*"]
|
"@/*": [
|
||||||
|
"./src/*"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
"include": [
|
||||||
"exclude": ["node_modules"]
|
"next-env.d.ts",
|
||||||
|
"**/*.ts",
|
||||||
|
"**/*.tsx",
|
||||||
|
".next/types/**/*.ts",
|
||||||
|
".next/dev/types/**/*.ts"
|
||||||
|
, "postcss.config.js" ],
|
||||||
|
"exclude": [
|
||||||
|
"node_modules"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user