feat: move to css based config

This commit is contained in:
Lucas Smith
2026-06-29 14:02:22 +10:00
parent b79895b38c
commit 403c1ca916
21 changed files with 189 additions and 309 deletions
+14 -3
View File
@@ -1,5 +1,15 @@
@import "@documenso/ui/styles/theme.css";
/* Content sources: this app plus the shared `ui` and `email` packages it renders. */
@source "./**/*.{ts,tsx}";
@source "../../../packages/ui/primitives/**/*.{ts,tsx}";
@source "../../../packages/ui/components/**/*.{ts,tsx}";
@source "../../../packages/ui/icons/**/*.{ts,tsx}";
@source "../../../packages/ui/lib/**/*.{ts,tsx}";
@source "../../../packages/email/templates/**/*.{ts,tsx}";
@source "../../../packages/email/template-components/**/*.{ts,tsx}";
@source "../../../packages/email/providers/**/*.{ts,tsx}";
/* Inter Variable Fonts */
@font-face {
font-family: "Inter";
@@ -64,8 +74,9 @@
@layer base {
:root {
--font-sans: "Inter";
--font-signature: "Caveat";
--font-noto: "Noto Sans", "Noto Sans Korean", "Noto Sans Japanese", "Noto Sans Chinese";
/* Consumed by the `--font-*` theme tokens in @documenso/ui/styles/theme.css. */
--font-family-sans: "Inter";
--font-family-signature: "Caveat";
--font-family-noto: "Noto Sans", "Noto Sans Korean", "Noto Sans Japanese", "Noto Sans Chinese";
}
}
+2 -1
View File
@@ -21,7 +21,6 @@
"@documenso/ee": "*",
"@documenso/lib": "*",
"@documenso/prisma": "*",
"@documenso/tailwind-config": "*",
"@documenso/trpc": "*",
"@documenso/ui": "*",
"@epic-web/remember": "^1.1.0",
@@ -68,9 +67,11 @@
"react-router": "^7.12.0",
"recharts": "^2.15.4",
"remeda": "^2.32.0",
"@tailwindcss/typography": "^0.5.19",
"remix-themes": "^2.0.4",
"satori": "^0.18.3",
"tailwindcss": "^4.3.1",
"tailwindcss-animate": "^1.0.7",
"ts-pattern": "^5.9.0",
"ua-parser-js": "^1.0.41",
"uqr": "^0.1.2"
-17
View File
@@ -1,17 +0,0 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const baseConfig = require('@documenso/ui/tailwind.config.cjs');
const path = require('path');
module.exports = {
presets: [baseConfig],
content: [
'./app/**/*.{ts,tsx}',
`${path.join(require.resolve('@documenso/ui'), '..')}/components/**/*.{ts,tsx}`,
`${path.join(require.resolve('@documenso/ui'), '..')}/icons/**/*.{ts,tsx}`,
`${path.join(require.resolve('@documenso/ui'), '..')}/lib/**/*.{ts,tsx}`,
`${path.join(require.resolve('@documenso/ui'), '..')}/primitives/**/*.{ts,tsx}`,
`${path.join(require.resolve('@documenso/email'), '..')}/templates/**/*.{ts,tsx}`,
`${path.join(require.resolve('@documenso/email'), '..')}/template-components/**/*.{ts,tsx}`,
`${path.join(require.resolve('@documenso/email'), '..')}/providers/**/*.{ts,tsx}`,
],
};
+1 -2
View File
@@ -18,8 +18,7 @@
"@documenso/lib": ["../../packages/lib"],
"@documenso/prisma": ["../../packages/prisma"],
"@documenso/trpc": ["../../packages/trpc"],
"@documenso/ui": ["../../packages/ui"],
"@documenso/tailwind-config": ["../../packages/tailwind-config"]
"@documenso/ui": ["../../packages/ui"]
},
"esModuleInterop": true,
"verbatimModuleSyntax": true,
-1
View File
@@ -68,7 +68,6 @@ export default defineConfig({
'@napi-rs/canvas',
'@node-rs/bcrypt',
'@prisma/client',
'@documenso/tailwind-config',
'playwright',
'playwright-core',
'@playwright/browser-chromium',
+3 -2
View File
@@ -409,7 +409,6 @@
"@documenso/ee": "*",
"@documenso/lib": "*",
"@documenso/prisma": "*",
"@documenso/tailwind-config": "*",
"@documenso/trpc": "*",
"@documenso/ui": "*",
"@epic-web/remember": "^1.1.0",
@@ -429,6 +428,7 @@
"@simplewebauthn/browser": "^13.2.2",
"@simplewebauthn/server": "^13.2.2",
"@tailwindcss/postcss": "^4.3.1",
"@tailwindcss/typography": "^0.5.19",
"@tanstack/react-query": "5.90.10",
"colord": "^2.9.3",
"content-disposition": "^1.0.1",
@@ -459,6 +459,7 @@
"remix-themes": "^2.0.4",
"satori": "^0.18.3",
"tailwindcss": "^4.3.1",
"tailwindcss-animate": "^1.0.7",
"ts-pattern": "^5.9.0",
"ua-parser-js": "^1.0.41",
"uqr": "^0.1.2"
@@ -30084,7 +30085,6 @@
"license": "MIT",
"dependencies": {
"@documenso/nodemailer-resend": "4.0.0",
"@documenso/tailwind-config": "*",
"@react-email/body": "0.2.0",
"@react-email/button": "0.2.0",
"@react-email/code-block": "0.2.0",
@@ -30508,6 +30508,7 @@
"packages/tailwind-config": {
"name": "@documenso/tailwind-config",
"version": "0.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@tailwindcss/typography": "^0.5.19",
-1
View File
@@ -18,7 +18,6 @@
},
"dependencies": {
"@documenso/nodemailer-resend": "4.0.0",
"@documenso/tailwind-config": "*",
"@react-email/body": "0.2.0",
"@react-email/button": "0.2.0",
"@react-email/code-block": "0.2.0",
+6 -2
View File
@@ -1,7 +1,11 @@
@import "tailwindcss";
/* v4 no longer auto-detects the JS config; load the standalone preview config. */
@config "../tailwind.config.cjs";
@source "./**/*.{ts,tsx}";
@theme {
--font-sans:
"Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Roboto", "Helvetica Neue", "Arial", sans-serif;
}
html,
body {
@@ -1,24 +0,0 @@
const path = require('node:path');
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [path.join(__dirname, 'app/**/*.{ts,tsx}')],
theme: {
extend: {
fontFamily: {
sans: [
'Inter',
'ui-sans-serif',
'system-ui',
'-apple-system',
'Segoe UI',
'Roboto',
'Helvetica Neue',
'Arial',
'sans-serif',
],
},
},
},
plugins: [],
};
-1
View File
@@ -14,7 +14,6 @@
"@documenso/lib": ["../../lib"],
"@documenso/lib/*": ["../../lib/*"],
"@documenso/prisma": ["../../prisma"],
"@documenso/tailwind-config": ["../../tailwind-config"],
"@documenso/ui": ["../../ui"]
},
"esModuleInterop": true,
+1 -4
View File
@@ -12,14 +12,12 @@ import tsconfigPaths from 'vite-tsconfig-paths';
*
* Emails render server-side through the real `renderEmailWithI18N` pipeline
* (see `app/routes/preview.tsx`), so the SSR config mirrors the main Remix app:
* Prisma, the tailwind config, and native modules stay external.
* Prisma and native modules stay external.
*/
export default defineConfig({
root: __dirname,
css: {
postcss: {
// The JS config is loaded via `@config` in app/app.css (v4 no longer
// auto-detects it or accepts a path argument here).
plugins: [tailwindcss()],
},
},
@@ -49,7 +47,6 @@ export default defineConfig({
'@napi-rs/canvas',
'@node-rs/bcrypt',
'@prisma/client',
'@documenso/tailwind-config',
'playwright',
'playwright-core',
'@playwright/browser-chromium',
-8
View File
@@ -1,8 +0,0 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const baseConfig = require('@documenso/tailwind-config');
const path = require('path');
module.exports = {
...baseConfig,
content: [`templates/**/*.{ts,tsx}`],
};
-162
View File
@@ -1,162 +0,0 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const { fontFamily } = require('tailwindcss/defaultTheme');
/** @type {import('tailwindcss').Config} */
module.exports = {
// `dark:` is driven by `@custom-variant dark` in theme.css; the JS `darkMode` key is ignored under v4.
content: ['src/**/*.{ts,tsx}'],
theme: {
extend: {
fontFamily: {
sans: ['var(--font-sans)', ...fontFamily.sans],
signature: ['var(--font-signature)'],
noto: ['var(--font-noto)'],
},
zIndex: {
9999: '9999',
},
aspectRatio: {
'signature-pad': '16 / 7',
},
colors: {
border: 'hsl(var(--border))',
'field-border': 'hsl(var(--field-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))',
},
'envelope-editor-background': 'hsl(var(--envelope-editor-background))',
secondary: {
DEFAULT: 'hsl(var(--secondary))',
foreground: 'hsl(var(--secondary-foreground))',
},
warning: {
DEFAULT: 'hsl(var(--warning))',
},
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))',
},
'field-card': {
DEFAULT: 'hsl(var(--field-card))',
border: 'hsl(var(--field-card-border))',
foreground: 'hsl(var(--field-card-foreground))',
},
widget: {
DEFAULT: 'hsl(var(--widget))',
foreground: 'hsl(var(--widget-foreground))',
},
documenso: {
DEFAULT: '#A2E771',
50: '#FFFFFF',
100: '#FDFFFD',
200: '#E7F9DA',
300: '#D0F3B7',
400: '#B9ED94',
500: '#A2E771',
600: '#83DF41',
700: '#66C622',
800: '#4D9619',
900: '#356611',
950: '#284E0D',
},
dawn: {
DEFAULT: '#aaa89f',
50: '#f8f8f8',
100: '#f1f1ef',
200: '#e6e5e2',
300: '#d4d3cd',
400: '#b9b7b0',
500: '#aaa89f',
600: '#88857a',
700: '#706e65',
800: '#5f5d55',
900: '#52514a',
950: '#2a2925',
},
water: {
DEFAULT: '#d7e4f3',
50: '#f3f6fb',
100: '#e3ebf6',
200: '#d7e4f3',
300: '#abc7e5',
400: '#82abd8',
500: '#658ecc',
600: '#5175bf',
700: '#4764ae',
800: '#3e538f',
900: '#364772',
950: '#252d46',
},
recipient: {
green: 'hsl(var(--recipient-green))',
blue: 'hsl(var(--recipient-blue))',
purple: 'hsl(var(--recipient-purple))',
orange: 'hsl(var(--recipient-orange))',
yellow: 'hsl(var(--recipient-yellow))',
pink: 'hsl(var(--recipient-pink))',
},
},
borderRadius: {
DEFAULT: 'calc(var(--radius) - 3px)',
'2xl': 'calc(var(--radius) + 4px)',
xl: 'calc(var(--radius) + 2px)',
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
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 },
},
'caret-blink': {
'0%,70%,100%': { opacity: '1' },
'20%,50%': { opacity: '0' },
},
},
animation: {
'accordion-down': 'accordion-down 0.2s ease-out',
'accordion-up': 'accordion-up 0.2s ease-out',
'caret-blink': 'caret-blink 1.25s ease-out infinite',
},
screens: {
'3xl': '1920px',
'4xl': '2560px',
'5xl': '3840px',
// `print` is defined as `@custom-variant print` in theme.css, not here:
// a `screens` entry would break the `container` utility under v4.
},
},
},
plugins: [
require('tailwindcss-animate'),
require('@tailwindcss/typography'),
// container-queries and the old `addVariablesForColors` plugin were dropped:
// the former is built into v4 core, the latter broke the themed `--*` color vars.
],
};
-4
View File
@@ -1,4 +0,0 @@
import type { Config } from 'tailwindcss';
declare const config: Config;
export default config;
-20
View File
@@ -1,20 +0,0 @@
{
"name": "@documenso/tailwind-config",
"version": "0.0.0",
"main": "index.cjs",
"types": "index.d.ts",
"license": "MIT",
"scripts": {
"clean": "rimraf node_modules"
},
"dependencies": {
"@tailwindcss/typography": "^0.5.19",
"postcss": "^8.5.14",
"tailwindcss": "^4.3.1",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {},
"publishConfig": {
"access": "public"
}
}
-9
View File
@@ -1,9 +0,0 @@
{
"extends": "@documenso/tsconfig/base.json",
"compilerOptions": {
"allowJs": true,
"noEmit": true
},
"include": ["**/*.cjs", "**/*.js"],
"exclude": ["dist", "build", "node_modules"]
}
-1
View File
@@ -1 +0,0 @@
declare module '@documenso/tailwind-config';
-2
View File
@@ -34,8 +34,6 @@ const Card = React.forwardRef<HTMLDivElement, CardProps>(
gradient,
'dark:gradient-border-mask before:pointer-events-none before:absolute before:-inset-[2px] before:rounded-lg before:p-[2px] before:[background:linear-gradient(var(--card-gradient-degrees),theme(colors.primary.DEFAULT/70%)_5%,theme(colors.border/80%)_30%)]':
gradient,
'shadow-[0_0_0_4px_theme(colors.gray.100/70%),0_0_0_1px_theme(colors.gray.100/70%),0_0_0_0.5px_theme(colors.primary.DEFAULT/70%)]': true,
'dark:shadow-[0]': true,
},
className,
)}
+4 -4
View File
@@ -92,7 +92,7 @@ export const DocumentDropzone = ({
// Disabled State
<div className="flex">
<motion.div
className="a z-10 flex aspect-[3/4] w-24 origin-top-right -rotate-[22deg] flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-destructive/10 group-hover:bg-destructive/2"
className="a z-10 flex aspect-[3/4] w-24 origin-top-right flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-destructive/10 group-hover:bg-destructive/2"
variants={DocumentDropzoneDisabledCardLeftVariants}
>
<div className="h-2 w-full rounded-[2px] bg-muted-foreground/10 group-hover:bg-destructive/10" />
@@ -109,7 +109,7 @@ export const DocumentDropzone = ({
/>
</motion.div>
<motion.div
className="z-10 flex aspect-[3/4] w-24 origin-top-left rotate-[22deg] flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-destructive/10 group-hover:bg-destructive/2"
className="z-10 flex aspect-[3/4] w-24 origin-top-left flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-destructive/10 group-hover:bg-destructive/2"
variants={DocumentDropzoneDisabledCardRightVariants}
>
<div className="h-2 w-full rounded-[2px] bg-muted-foreground/10 group-hover:bg-destructive/10" />
@@ -121,7 +121,7 @@ export const DocumentDropzone = ({
// Non Disabled State
<div className="flex">
<motion.div
className="a z-10 flex aspect-[3/4] w-24 origin-top-right -rotate-[22deg] flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-documenso/80"
className="a z-10 flex aspect-[3/4] w-24 origin-top-right flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-documenso/80"
variants={DocumentDropzoneCardLeftVariants}
>
<div className="h-2 w-full rounded-[2px] bg-muted-foreground/20 group-hover:bg-documenso" />
@@ -135,7 +135,7 @@ export const DocumentDropzone = ({
<Plus strokeWidth="2px" className="h-12 w-12 text-muted-foreground/20 group-hover:text-documenso" />
</motion.div>
<motion.div
className="z-10 flex aspect-[3/4] w-24 origin-top-left rotate-[22deg] flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-documenso/80"
className="z-10 flex aspect-[3/4] w-24 origin-top-left flex-col gap-y-1 rounded-lg border border-muted-foreground/20 bg-background/80 px-2 py-4 backdrop-blur-xs group-hover:border-documenso/80"
variants={DocumentDropzoneCardRightVariants}
>
<div className="h-2 w-full rounded-[2px] bg-muted-foreground/20 group-hover:bg-documenso" />
+158 -33
View File
@@ -1,15 +1,17 @@
/* biome-ignore-all lint/suspicious/noDuplicateProperties: twv3-space-* lists both --value(number) and --value([length]) forms; v4 keeps only one per class. */
/* Shared theme. Apps declare their own `@source` file globs in their CSS entry. */
@import "tailwindcss";
@config "../tailwind.config.cjs";
@plugin "tailwindcss-animate";
@plugin "@tailwindcss/typography";
@custom-variant dark (&:is(.dark:not(.dark-mode-disabled) *));
/* `print:` variant; defining it as a JS `screen` breaks the `container` utility under v4. */
/* `print:` as a screen would break the `container` utility under v4. */
@custom-variant print (@media print);
/* Safelist for the runtime recipient color classes (v4 ignores the JS config `safelist`). */
/* Recipient color safelist (built dynamically at runtime). */
@source inline("{ring,bg,border,text}-recipient-{green,blue,purple,orange,yellow,pink}");
@source inline("hover:bg-recipient-{green,blue,purple,orange,yellow,pink}/{15,30}");
@source inline("active:bg-recipient-{green,blue,purple,orange,yellow,pink}/15");
@@ -17,17 +19,163 @@
@source inline("group-hover:text-recipient-{green,blue,purple,orange,yellow,pink}");
@source inline("group-hover/field-item:bg-recipient-{green,blue,purple,orange,yellow,pink}");
/* Restore the v3 `ring` defaults (v4 changed them to 1px / currentColor). */
@theme {
/* Restore v3 `ring` defaults (v4 uses 1px / currentColor). */
--default-ring-width: 3px;
--default-ring-color: hsl(var(--ring));
/* Families are injected at runtime via `--font-family-*` (see the app entry). */
--font-sans:
var(--font-family-sans), ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
"Segoe UI Symbol", "Noto Color Emoji";
--font-signature: var(--font-family-signature);
--font-noto: var(--font-family-noto);
--breakpoint-3xl: 1920px;
--breakpoint-4xl: 2560px;
--breakpoint-5xl: 3840px;
--aspect-signature-pad: 16 / 7;
--radius: 0.5rem;
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 2px);
--radius-2xl: calc(var(--radius) + 4px);
/* Themed colors (driven by the runtime HSL vars below). */
--color-border: hsl(var(--border));
--color-field-border: hsl(var(--field-border));
--color-input: hsl(var(--input));
--color-ring: hsl(var(--ring));
--color-background: hsl(var(--background));
--color-foreground: hsl(var(--foreground));
--color-primary: hsl(var(--primary));
--color-primary-foreground: hsl(var(--primary-foreground));
--color-envelope-editor-background: hsl(var(--envelope-editor-background));
--color-secondary: hsl(var(--secondary));
--color-secondary-foreground: hsl(var(--secondary-foreground));
--color-warning: hsl(var(--warning));
--color-destructive: hsl(var(--destructive));
--color-destructive-foreground: hsl(var(--destructive-foreground));
--color-muted: hsl(var(--muted));
--color-muted-foreground: hsl(var(--muted-foreground));
--color-accent: hsl(var(--accent));
--color-accent-foreground: hsl(var(--accent-foreground));
--color-popover: hsl(var(--popover));
--color-popover-foreground: hsl(var(--popover-foreground));
--color-card: hsl(var(--card));
--color-card-foreground: hsl(var(--card-foreground));
--color-field-card: hsl(var(--field-card));
--color-field-card-border: hsl(var(--field-card-border));
--color-field-card-foreground: hsl(var(--field-card-foreground));
--color-widget: hsl(var(--widget));
--color-widget-foreground: hsl(var(--widget-foreground));
/* Static brand palettes */
--color-documenso: #a2e771;
--color-documenso-50: #ffffff;
--color-documenso-100: #fdfffd;
--color-documenso-200: #e7f9da;
--color-documenso-300: #d0f3b7;
--color-documenso-400: #b9ed94;
--color-documenso-500: #a2e771;
--color-documenso-600: #83df41;
--color-documenso-700: #66c622;
--color-documenso-800: #4d9619;
--color-documenso-900: #356611;
--color-documenso-950: #284e0d;
--color-dawn: #aaa89f;
--color-dawn-50: #f8f8f8;
--color-dawn-100: #f1f1ef;
--color-dawn-200: #e6e5e2;
--color-dawn-300: #d4d3cd;
--color-dawn-400: #b9b7b0;
--color-dawn-500: #aaa89f;
--color-dawn-600: #88857a;
--color-dawn-700: #706e65;
--color-dawn-800: #5f5d55;
--color-dawn-900: #52514a;
--color-dawn-950: #2a2925;
--color-water: #d7e4f3;
--color-water-50: #f3f6fb;
--color-water-100: #e3ebf6;
--color-water-200: #d7e4f3;
--color-water-300: #abc7e5;
--color-water-400: #82abd8;
--color-water-500: #658ecc;
--color-water-600: #5175bf;
--color-water-700: #4764ae;
--color-water-800: #3e538f;
--color-water-900: #364772;
--color-water-950: #252d46;
--color-recipient-green: hsl(var(--recipient-green));
--color-recipient-blue: hsl(var(--recipient-blue));
--color-recipient-purple: hsl(var(--recipient-purple));
--color-recipient-orange: hsl(var(--recipient-orange));
--color-recipient-yellow: hsl(var(--recipient-yellow));
--color-recipient-pink: hsl(var(--recipient-pink));
--animate-accordion-down: accordion-down 0.2s ease-out;
--animate-accordion-up: accordion-up 0.2s ease-out;
--animate-caret-blink: caret-blink 1.25s ease-out infinite;
}
/*
* v3-compatible `space-*` utilities. v4's built-in `space-*` uses a zero-specificity
* `:where()` selector that lets child margins collapse the gaps; these reproduce the v3
* selector/edges so existing layouts keep working. Pair with `twv3-space-{x,y}-reverse`.
*/
@utility z-9999 {
z-index: 9999;
}
/* Bare `rounded` differs from `--radius`, so it can't be a theme token. */
@utility rounded {
border-radius: calc(var(--radius) - 3px);
}
@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;
}
}
@keyframes caret-blink {
0%,
70%,
100% {
opacity: 1;
}
20%,
50% {
opacity: 0;
}
}
/* v3-compatible `space-*`; v4's built-in uses a `:where()` selector that collapses gaps. */
@utility twv3-space-y-* {
& > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
@@ -48,7 +196,6 @@
}
}
/* Reverse companions for the twv3-space-* utilities above (built-in ones use a different selector). */
@utility twv3-space-y-reverse {
& > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 1;
@@ -271,14 +418,7 @@
}
}
/*
* Custom CSS for printing reports
* - Sets page margins to 0.5 inches
* - Hides the header and footer
* - Hides the print button
* - Sets page size to A4
* - Sets the font size to 12pt
*/
/* Print page setup for reports. */
@page {
margin: 1in;
size: A4;
@@ -311,21 +451,6 @@
display: none;
}
/* .custom-scrollbar::-webkit-scrollbar-track {
border-radius: 10px;
}
.custom-scrollbar::-webkit-scrollbar-thumb {
background: rgb(100 116 139 / 1);
border-radius: 10px;
width: 8px;
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
background: rgb(100 116 139 / 0.5);
} */
/* Custom Swagger Dark Theme */
.swagger-dark-theme .swagger-ui {
filter: invert(88%) hue-rotate(180deg);
}
-8
View File
@@ -1,8 +0,0 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const baseConfig = require('@documenso/tailwind-config');
// Recipient dynamic classes are safelisted via `@source inline(...)` in theme.css (v4 ignores JS `safelist`).
module.exports = {
presets: [baseConfig],
content: [...baseConfig.content, './primitives/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './lib/**/*.{ts,tsx}'],
};