From c56ad086476c8cacd98cd5f443b6c958ec556282 Mon Sep 17 00:00:00 2001 From: Stan Runge Date: Tue, 21 Jan 2025 23:26:24 +0100 Subject: [PATCH] deps: add shadcn svelte --- packages/web/bun.lockb | Bin 187520 -> 188689 bytes packages/web/components.json | 14 ++++++ packages/web/package.json | 3 ++ packages/web/src/app.css | 75 ++++++++++++++++++++++++++++++++ packages/web/src/lib/utils.ts | 62 ++++++++++++++++++++++++++ packages/web/tailwind.config.js | 71 ++++++++++++++++++++++++++---- 6 files changed, 217 insertions(+), 8 deletions(-) create mode 100644 packages/web/components.json create mode 100644 packages/web/src/lib/utils.ts diff --git a/packages/web/bun.lockb b/packages/web/bun.lockb index 49d8071f13e206758e39d126318d95dac26c1dfd..49fff1ecd229292f349e7f37e76f1bcdac4d3949 100755 GIT binary patch delta 28884 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 delta 28244 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 C9t3Ov diff --git a/packages/web/components.json b/packages/web/components.json new file mode 100644 index 0000000..7b2aff4 --- /dev/null +++ b/packages/web/components.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "default", + "tailwind": { + "config": "tailwind.config.js", + "css": "src/app.css", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils" + }, + "typescript": true +} \ No newline at end of file diff --git a/packages/web/package.json b/packages/web/package.json index 0ad97bd..689b9e6 100755 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -25,6 +25,7 @@ "@types/eslint": "9.6.1", "@types/pg": "^8.11.10", "autoprefixer": "^10.4.20", + "clsx": "^2.1.1", "drizzle-kit": "^0.30.1", "eslint": "9.17.0", "eslint-config-prettier": "9.1.0", @@ -35,6 +36,8 @@ "prettier-plugin-svelte": "3.3.2", "svelte": "^5.16.5", "svelte-check": "4.1.1", + "tailwind-merge": "^2.6.0", + "tailwind-variants": "^0.3.1", "tailwindcss": "^3.4.17", "typescript": "5.7.2", "typescript-eslint": "8.19.1", diff --git a/packages/web/src/app.css b/packages/web/src/app.css index b5c61c9..1460463 100755 --- a/packages/web/src/app.css +++ b/packages/web/src/app.css @@ -1,3 +1,78 @@ @tailwind base; @tailwind components; @tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/packages/web/src/lib/utils.ts b/packages/web/src/lib/utils.ts new file mode 100644 index 0000000..8871245 --- /dev/null +++ b/packages/web/src/lib/utils.ts @@ -0,0 +1,62 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; + +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 } +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + + const scaleConversion = ( + valueA: number, + scaleA: [number, number], + scaleB: [number, number] + ) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = ( + style: Record + ): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + `${key}:${style[key]};`; + }, ""); + }; + + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + + return styleToString({ + transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, + opacity: t + }); + }, + easing: cubicOut + }; +}; \ No newline at end of file diff --git a/packages/web/tailwind.config.js b/packages/web/tailwind.config.js index 499e5f1..fa1cb36 100755 --- a/packages/web/tailwind.config.js +++ b/packages/web/tailwind.config.js @@ -1,9 +1,64 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ["./src/**/*.{svelte, html, js, ts}"], - theme: { - extend: {}, - }, - plugins: [], -} +import { fontFamily } from "tailwindcss/defaultTheme"; +/** @type {import('tailwindcss').Config} */ +const config = { + darkMode: ["class"], + content: ["./src/**/*.{html,js,svelte,ts}"], + safelist: ["dark"], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px" + } + }, + extend: { + colors: { + border: "hsl(var(--border) / )", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + background: "hsl(var(--background) / )", + foreground: "hsl(var(--foreground) / )", + primary: { + DEFAULT: "hsl(var(--primary) / )", + foreground: "hsl(var(--primary-foreground) / )" + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / )", + foreground: "hsl(var(--secondary-foreground) / )" + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )" + }, + muted: { + DEFAULT: "hsl(var(--muted) / )", + foreground: "hsl(var(--muted-foreground) / )" + }, + accent: { + DEFAULT: "hsl(var(--accent) / )", + foreground: "hsl(var(--accent-foreground) / )" + }, + popover: { + DEFAULT: "hsl(var(--popover) / )", + foreground: "hsl(var(--popover-foreground) / )" + }, + card: { + DEFAULT: "hsl(var(--card) / )", + foreground: "hsl(var(--card-foreground) / )" + } + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)" + }, + fontFamily: { + sans: [...fontFamily.sans] + } + } + }, +}; + +export default config;