- Add dbGet/dbAll helper functions for database-agnostic queries - Add toDbBool/convertBooleansForDb for boolean type conversion - Add toDbDate/getNow for timestamp type handling - Add generateId that returns UUID for Postgres, nanoid for SQLite - Update all routes to use compatibility helpers - Add normalizeEvent to return clean number types from Postgres decimal - Add formatPrice utility for consistent price display - Add legal pages admin interface with RichTextEditor - Update carousel images - Add drizzle migration files for PostgreSQL
156 lines
2.6 KiB
CSS
156 lines
2.6 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
@layer base {
|
|
html {
|
|
scroll-behavior: smooth;
|
|
}
|
|
|
|
body {
|
|
@apply font-sans text-primary-dark antialiased;
|
|
@apply font-normal; /* Regular (400) for body */
|
|
@apply leading-relaxed; /* Good line spacing */
|
|
}
|
|
|
|
/* Titles: Medium (500) / SemiBold (600) with good spacing */
|
|
h1 {
|
|
@apply font-semibold tracking-tight leading-tight;
|
|
}
|
|
|
|
h2 {
|
|
@apply font-semibold tracking-tight leading-tight;
|
|
}
|
|
|
|
h3 {
|
|
@apply font-semibold leading-snug;
|
|
}
|
|
|
|
h4, h5, h6 {
|
|
@apply font-medium leading-snug;
|
|
}
|
|
|
|
/* Paragraphs with good spacing */
|
|
p {
|
|
@apply leading-relaxed;
|
|
}
|
|
|
|
/* Buttons: Medium weight */
|
|
button, .btn, [type="button"], [type="submit"], [type="reset"] {
|
|
@apply font-medium;
|
|
}
|
|
}
|
|
|
|
@layer components {
|
|
.container-page {
|
|
@apply max-w-7xl mx-auto px-4 sm:px-6 lg:px-8;
|
|
}
|
|
|
|
.section-padding {
|
|
@apply py-16 md:py-24;
|
|
}
|
|
|
|
.section-title {
|
|
@apply text-3xl md:text-4xl font-semibold text-primary-dark tracking-tight;
|
|
}
|
|
|
|
.section-subtitle {
|
|
@apply text-lg text-gray-600 mt-4 leading-relaxed;
|
|
}
|
|
|
|
/* Form styles */
|
|
.form-group {
|
|
@apply space-y-6;
|
|
}
|
|
|
|
/* Card hover effect */
|
|
.card-hover {
|
|
@apply transition-all duration-300 hover:shadow-card-hover hover:-translate-y-1;
|
|
}
|
|
|
|
/* Status badges */
|
|
.badge {
|
|
@apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium;
|
|
}
|
|
|
|
.badge-success {
|
|
@apply bg-green-100 text-green-800;
|
|
}
|
|
|
|
.badge-warning {
|
|
@apply bg-yellow-100 text-yellow-800;
|
|
}
|
|
|
|
.badge-danger {
|
|
@apply bg-red-100 text-red-800;
|
|
}
|
|
|
|
.badge-info {
|
|
@apply bg-blue-100 text-blue-800;
|
|
}
|
|
|
|
.badge-gray {
|
|
@apply bg-gray-100 text-gray-800;
|
|
}
|
|
}
|
|
|
|
@layer utilities {
|
|
.text-balance {
|
|
text-wrap: balance;
|
|
}
|
|
}
|
|
|
|
/* TipTap Rich Text Editor Styles */
|
|
.ProseMirror {
|
|
outline: none;
|
|
}
|
|
|
|
.ProseMirror p.is-editor-empty:first-child::before {
|
|
@apply text-gray-400 pointer-events-none float-left h-0;
|
|
content: attr(data-placeholder);
|
|
}
|
|
|
|
.ProseMirror > * + * {
|
|
margin-top: 0.75em;
|
|
}
|
|
|
|
.ProseMirror h1 {
|
|
@apply text-2xl font-bold mt-6 mb-3;
|
|
}
|
|
|
|
.ProseMirror h2 {
|
|
@apply text-xl font-bold mt-5 mb-2;
|
|
}
|
|
|
|
.ProseMirror h3 {
|
|
@apply text-lg font-semibold mt-4 mb-2;
|
|
}
|
|
|
|
.ProseMirror ul {
|
|
@apply list-disc list-inside my-3;
|
|
}
|
|
|
|
.ProseMirror ol {
|
|
@apply list-decimal list-inside my-3;
|
|
}
|
|
|
|
.ProseMirror li {
|
|
@apply my-1;
|
|
}
|
|
|
|
.ProseMirror blockquote {
|
|
@apply border-l-4 border-gray-300 pl-4 my-4 italic text-gray-600;
|
|
}
|
|
|
|
.ProseMirror hr {
|
|
@apply border-t border-gray-300 my-6;
|
|
}
|
|
|
|
.ProseMirror strong {
|
|
@apply font-bold;
|
|
}
|
|
|
|
.ProseMirror em {
|
|
@apply italic;
|
|
}
|