summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorBrandon McConnell <brandon@dreamthinkbuild.com>2025-07-30 16:53:31 -0400
committerBrandon McConnell <brandon@dreamthinkbuild.com>2025-07-30 16:53:31 -0400
commit48282555e0732837bf226f7a7dea65c109e94dfa (patch)
tree1535a2dac70fb0504f388e8351437222dd55b76d /apps
parente3ecf4855a9dea317f4823bf1840703de7ec3f67 (diff)
downloadopencut-48282555e0732837bf226f7a7dea65c109e94dfa.tar.gz
Migrate remaining tailwind config pieces to CSS config
Diffstat (limited to 'apps')
-rw-r--r--apps/web/components.json2
-rw-r--r--apps/web/src/app/globals.css292
-rw-r--r--apps/web/src/components/ui/sidebar.tsx2
-rw-r--r--apps/web/tailwind.config.ts149
4 files changed, 208 insertions, 237 deletions
diff --git a/apps/web/components.json b/apps/web/components.json
index 405a08cd..3289f237 100644
--- a/apps/web/components.json
+++ b/apps/web/components.json
@@ -4,7 +4,7 @@
"rsc": true,
"tsx": true,
"tailwind": {
- "config": "tailwind.config.ts",
+ "config": "",
"css": "src/app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css
index 9cc7ed6b..ac14f007 100644
--- a/apps/web/src/app/globals.css
+++ b/apps/web/src/app/globals.css
@@ -1,16 +1,97 @@
-@import 'tailwindcss';
+@import "tailwindcss";
-@config '../../tailwind.config.ts';
+/* Custom variant for dark mode */
+@custom-variant dark (&:where(.dark, .dark *));
-/*
- The default border color has changed to `currentcolor` in Tailwind CSS v4,
- so we've added these compatibility styles to make sure everything still
- looks the same as it did with Tailwind CSS v3.
+/* Plugins */
+@plugin "@tailwindcss/typography";
+@plugin "tailwindcss-animate";
+
+:root {
+ /* Custom colors - light mode (default) */
+ --background: hsl(0 0% 100%);
+ --foreground: hsl(0 0% 3.9%);
+ --card: hsl(0 0% 100%);
+ --card-foreground: hsl(0 0% 3.9%);
+ --popover: hsl(0 0% 100%);
+ --popover-foreground: hsl(0 0% 3.9%);
+ --primary: hsl(0 0% 9%);
+ --primary-foreground: hsl(0 0% 98%);
+ --secondary: hsl(0 0% 96.1%);
+ --secondary-foreground: hsl(0 0% 9%);
+ --muted: hsl(0 0% 96.1%);
+ --muted-foreground: hsl(0 0% 45.1%);
+ --accent: hsl(0 0% 96.1%);
+ --accent-foreground: hsl(0 0% 9%);
+ --destructive: hsl(0 84.2% 60.2%);
+ --destructive-foreground: hsl(0 0% 98%);
+ --border: hsl(0 0% 89.8%);
+ --input: hsl(0 0% 89.8%);
+ --ring: hsl(0 0% 3.9%);
+ --chart-1: hsl(12 76% 61%);
+ --chart-2: hsl(173 58% 39%);
+ --chart-3: hsl(197 37% 24%);
+ --chart-4: hsl(43 74% 66%);
+ --chart-5: hsl(27 87% 67%);
+ --sidebar-background: hsl(0 0% 100%);
+ --sidebar-foreground: hsl(0 0% 3.9%);
+ --sidebar-primary: hsl(0 0% 9%);
+ --sidebar-primary-foreground: hsl(0 0% 98%);
+ --sidebar-accent: hsl(0 0% 96.1%);
+ --sidebar-accent-foreground: hsl(0 0% 9%);
+ --sidebar-border: hsl(0 0% 89.8%);
+ --sidebar-ring: hsl(0 0% 3.9%);
+
+ /* Radius base */
+ --radius: 1rem;
+}
+.dark {
+ /* Custom colors - dark mode */
+ --background: hsl(0 0% 4%);
+ --foreground: hsl(0 0% 89%);
+ --card: hsl(0 0% 14.9%);
+ --card-foreground: hsl(0 0% 98%);
+ --popover: hsl(0 0% 14.9%);
+ --popover-foreground: hsl(0 0% 98%);
+ --primary: hsl(180 95% 40%);
+ --primary-foreground: hsl(0 0% 9%);
+ --secondary: hsl(0 0% 14.9%);
+ --secondary-foreground: hsl(0 0% 98%);
+ --muted: hsl(0 0% 14.9%);
+ --muted-foreground: hsl(0 0% 63.9%);
+ --accent: hsl(0 0% 14.9%);
+ --accent-foreground: hsl(0 0% 98%);
+ --destructive: hsl(0 100% 60%);
+ --destructive-foreground: hsl(0 0% 98%);
+ --border: hsl(0 0% 17%);
+ --input: hsl(0 0% 14.9%);
+ --ring: hsl(0 0% 83.1%);
+ --chart-1: hsl(220 70% 50%);
+ --chart-2: hsl(160 60% 45%);
+ --chart-3: hsl(30 80% 55%);
+ --chart-4: hsl(280 65% 60%);
+ --chart-5: hsl(340 75% 55%);
+ --sidebar-background: hsl(0 0% 3.9%);
+ --sidebar-foreground: hsl(0 0% 98%);
+ --sidebar-primary: hsl(0 0% 98%);
+ --sidebar-primary-foreground: hsl(0 0% 9%);
+ --sidebar-accent: hsl(0 0% 14.9%);
+ --sidebar-accent-foreground: hsl(0 0% 98%);
+ --sidebar-border: hsl(0 0% 14.9%);
+ --sidebar-ring: hsl(0 0% 83.1%);
+ --panel-background: hsl(0 0% 11%);
+ --panel-accent: hsl(0 0% 15%);
+}
- If we ever want to remove these styles, we need to add an explicit border
- color utility to any element that depends on these defaults.
-*/
@layer base {
+ /*
+ The default border color has changed to `currentcolor` in Tailwind CSS v4,
+ so we've added these compatibility styles to make sure everything still
+ looks the same as it did with Tailwind CSS v3.
+
+ If we ever want to remove these styles, we need to add an explicit border
+ color utility to any element that depends on these defaults.
+ */
*,
::after,
::before,
@@ -18,83 +99,7 @@
::file-selector-button {
border-color: var(--color-gray-200, currentcolor);
}
-}
-
-@layer base {
- :root {
- --background: 0 0% 100%;
- --foreground: 0 0% 3.9%;
- --card: 0 0% 100%;
- --card-foreground: 0 0% 3.9%;
- --popover: 0 0% 100%;
- --popover-foreground: 0 0% 3.9%;
- --primary: 0 0% 9%;
- --primary-foreground: 0 0% 98%;
- --secondary: 0 0% 96.1%;
- --secondary-foreground: 0 0% 9%;
- --muted: 0 0% 96.1%;
- --muted-foreground: 0 0% 45.1%;
- --accent: 0 0% 96.1%;
- --accent-foreground: 0 0% 9%;
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 0 0% 98%;
- --border: 0 0% 89.8%;
- --input: 0 0% 89.8%;
- --ring: 0 0% 3.9%;
- --chart-1: 12 76% 61%;
- --chart-2: 173 58% 39%;
- --chart-3: 197 37% 24%;
- --chart-4: 43 74% 66%;
- --chart-5: 27 87% 67%;
- --radius: 1rem;
- --sidebar-background: 0 0% 100%;
- --sidebar-foreground: 0 0% 3.9%;
- --sidebar-primary: 0 0% 9%;
- --sidebar-primary-foreground: 0 0% 98%;
- --sidebar-accent: 0 0% 96.1%;
- --sidebar-accent-foreground: 0 0% 9%;
- --sidebar-border: 0 0% 89.8%;
- --sidebar-ring: 0 0% 3.9%;
- }
- .dark {
- --background: 0 0% 4%;
- --foreground: 0 0% 89%;
- --card: 0 0% 14.9%;
- --card-foreground: 0 0% 98%;
- --popover: 0 0% 14.9%;
- --popover-foreground: 0 0% 98%;
- --primary: 180 95% 40%;
- --primary-foreground: 0 0% 9%;
- --secondary: 0 0% 14.9%;
- --secondary-foreground: 0 0% 98%;
- --muted: 0 0% 14.9%;
- --muted-foreground: 0 0% 63.9%;
- --accent: 0 0% 14.9%;
- --accent-foreground: 0 0% 98%;
- --destructive: 0 100% 60%;
- --destructive-foreground: 0 0% 98%;
- --border: 0 0% 17%;
- --input: 0 0% 14.9%;
- --ring: 0 0% 83.1%;
- --chart-1: 220 70% 50%;
- --chart-2: 160 60% 45%;
- --chart-3: 30 80% 55%;
- --chart-4: 280 65% 60%;
- --chart-5: 340 75% 55%;
- --sidebar-background: 0 0% 3.9%;
- --sidebar-foreground: 0 0% 98%;
- --sidebar-primary: 0 0% 98%;
- --sidebar-primary-foreground: 0 0% 9%;
- --sidebar-accent: 0 0% 14.9%;
- --sidebar-accent-foreground: 0 0% 98%;
- --sidebar-border: 0 0% 14.9%;
- --sidebar-ring: 0 0% 83.1%;
- --panel-background: 0 0% 11%;
- --panel-accent: 0 0% 15%;
- }
-}
-
-@layer base {
+ /* Other default base styles */
* {
@apply border-border;
}
@@ -104,3 +109,118 @@
overscroll-behavior-x: contain;
}
}
+
+@theme inline {
+ /* Responsive breakpoints */
+ --breakpoint-xs: 30rem;
+
+ /* Typography */
+ --font-sans: var(--font-inter), sans-serif;
+
+ /* Font sizes */
+ --text-base: 0.95rem;
+ --text-base--line-height: calc(1.5 / 0.95);
+ --text-xs: 0.8rem;
+ --text-xs--line-height: calc(1 / 0.8);
+
+ /* Border radius */
+ --radius-lg: var(--radius);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-sm: calc(var(--radius) - 8px);
+
+ /* Palette mapped to root design tokens */
+ --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);
+
+ /* Chart colors */
+ --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);
+
+ /* Sidebar */
+ --color-sidebar: var(--sidebar-background);
+ --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);
+
+ /* Panel */
+ --color-panel: var(--panel-background);
+ --color-panel-accent: var(--panel-accent);
+
+ /* Animations */
+ --animate-accordion-down: accordion-down 0.2s ease-out;
+ --animate-accordion-up: accordion-up 0.2s ease-out;
+
+ @keyframes accordion-down {
+ from {
+ height: 0;
+ }
+ to {
+ height: var(--radix-accordion-content-height);
+ }
+ }
+
+ @keyframes accordion-up {
+ from {
+ height: var(--radix-accordion-content-height);
+ }
+ to {
+ height: 0;
+ }
+ }
+}
+
+@utility scrollbar-hidden {
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ &::-webkit-scrollbar {
+ display: none;
+ }
+}
+
+@utility scrollbar-x-hidden {
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ &::-webkit-scrollbar:horizontal {
+ display: none;
+ }
+}
+
+@utility scrollbar-y-hidden {
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ &::-webkit-scrollbar:vertical {
+ display: none;
+ }
+}
diff --git a/apps/web/src/components/ui/sidebar.tsx b/apps/web/src/components/ui/sidebar.tsx
index d25b1801..819116c3 100644
--- a/apps/web/src/components/ui/sidebar.tsx
+++ b/apps/web/src/components/ui/sidebar.tsx
@@ -518,7 +518,7 @@ const sidebarMenuButtonVariants = cva(
variant: {
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
outline:
- "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
+ "bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]",
},
size: {
default: "h-8 text-sm",
diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts
deleted file mode 100644
index 911aae21..00000000
--- a/apps/web/tailwind.config.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-import type { Config } from "tailwindcss";
-import plugin from "tailwindcss/plugin";
-
-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}",
- "./src/lib/**/*.{js,ts,jsx,tsx,mdx}",
- "./src/constants/**/*.{js,ts,jsx,tsx,mdx}",
- ],
- theme: {
- extend: {
- screens: {
- xs: "480px",
- },
- fontSize: {
- base: "0.95rem",
- xs: "0.80rem",
- },
- fontFamily: {
- sans: ["var(--font-inter)", "sans-serif"],
- },
- 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))",
- },
- sidebar: {
- DEFAULT: "hsl(var(--sidebar-background))",
- foreground: "hsl(var(--sidebar-foreground))",
- primary: "hsl(var(--sidebar-primary))",
- "primary-foreground": "hsl(var(--sidebar-primary-foreground))",
- accent: "hsl(var(--sidebar-accent))",
- "accent-foreground": "hsl(var(--sidebar-accent-foreground))",
- border: "hsl(var(--sidebar-border))",
- ring: "hsl(var(--sidebar-ring))",
- },
- panel: {
- DEFAULT: "hsl(var(--panel-background))",
- accent: "hsl(var(--panel-accent))",
- },
- },
- borderRadius: {
- lg: "var(--radius)",
- md: "calc(var(--radius) - 2px)",
- sm: "calc(var(--radius) - 8px)",
- },
- keyframes: {
- "accordion-down": {
- from: {
- height: "0",
- },
- to: {
- height: "var(--radix-accordion-content-height)",
- },
- },
- "accordion-up": {
- from: {
- height: "var(--radix-accordion-content-height)",
- },
- to: {
- height: "0",
- },
- },
- },
- animation: {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out",
- },
- },
- },
- plugins: [
- require("@tailwindcss/typography"),
- require("tailwindcss-animate"),
- plugin(
- ({
- addUtilities,
- }: {
- // biome-ignore lint/suspicious/noExplicitAny: <any> used by Tailwind `plugin` API
- addUtilities: (utilities: Record<string, any>) => void;
- }) => {
- addUtilities({
- ".scrollbar-hidden": {
- "-ms-overflow-style": "none",
- "scrollbar-width": "none",
- "&::-webkit-scrollbar": {
- display: "none",
- },
- },
- ".scrollbar-x-hidden": {
- "-ms-overflow-style": "none",
- "scrollbar-width": "none",
- "&::-webkit-scrollbar:horizontal": {
- display: "none",
- },
- },
- ".scrollbar-y-hidden": {
- "-ms-overflow-style": "none",
- "scrollbar-width": "none",
- "&::-webkit-scrollbar:vertical": {
- display: "none",
- },
- },
- });
- }
- ),
- ],
- future: {
- hoverOnlyWhenSupported: true,
- },
-} satisfies Config;