Refactor frontend to Composition API and improve UI/UX

Major Changes:
- Migrate components from Options API to Composition API with <script setup>
- Add centralized service layer (serviceService, deliveryService, adminService)
- Implement new reusable components (EnhancedButton, EnhancedModal, StatCard, etc.)
- Add theme store for consistent theming across application
- Improve ServiceCalendar with federal holidays and better styling
- Refactor customer profile and tank estimation components
- Update all delivery and payment pages to use centralized services
- Add utility functions for formatting and validation
- Update Dockerfiles for better environment configuration
- Enhance Tailwind config with custom design tokens

UI Improvements:
- Modern, premium design with glassmorphism effects
- Improved form layouts with FloatingInput components
- Better loading states and empty states
- Enhanced modals and tables with consistent styling
- Responsive design improvements across all pages

Technical Improvements:
- Strict TypeScript types throughout
- Better error handling and validation
- Removed deprecated api.js in favor of TypeScript services
- Improved code organization and maintainability
This commit is contained in:
2026-02-01 19:04:07 -05:00
parent 72d8e35e06
commit 61f93ec4e8
86 changed files with 3931 additions and 2086 deletions

View File

@@ -3,20 +3,83 @@ module.exports = {
presets: [],
darkMode: 'class',
daisyui: {
// themes: ["dracula" ],
themes: [{
mytheme: {
"primary": "#010409",
"secondary": "#161B22",
"accent": "#ff6600",
"neutral": "#21262C",
"base-100": "#0D1117",
"info": "#74a0d5",
"success": "#33cc33",
"warning": "#97520C",
"error": "#da0e0e",
themes: [
{
ocean: {
"primary": "#010409",
"secondary": "#161B22",
"accent": "#ff6600",
"neutral": "#21262C",
"base-100": "#0D1117",
"base-200": "#161B22",
"base-300": "#21262C",
"info": "#74a0d5",
"success": "#33cc33",
"warning": "#97520C",
"error": "#da0e0e",
},
},
},],
{
forest: {
"primary": "#1a472a",
"secondary": "#2d5a3d",
"accent": "#4ade80",
"neutral": "#1e3a2f",
"base-100": "#0f1f14",
"base-200": "#162a1c",
"base-300": "#1e3a2f",
"info": "#67e8f9",
"success": "#22c55e",
"warning": "#eab308",
"error": "#ef4444",
},
},
{
sunset: {
"primary": "#44403c",
"secondary": "#57534e",
"accent": "#fb923c",
"neutral": "#292524",
"base-100": "#1c1917",
"base-200": "#292524",
"base-300": "#44403c",
"info": "#38bdf8",
"success": "#4ade80",
"warning": "#fbbf24",
"error": "#f87171",
},
},
{
arctic: {
"primary": "#3b82f6",
"secondary": "#64748b",
"accent": "#06b6d4",
"neutral": "#e2e8f0",
"base-100": "#f8fafc",
"base-200": "#f1f5f9",
"base-300": "#e2e8f0",
"info": "#0ea5e9",
"success": "#22c55e",
"warning": "#f59e0b",
"error": "#ef4444",
},
},
{
midnight: {
"primary": "#312e81",
"secondary": "#3730a3",
"accent": "#a78bfa",
"neutral": "#1e1b4b",
"base-100": "#0f0a1f",
"base-200": "#1e1b4b",
"base-300": "#312e81",
"info": "#818cf8",
"success": "#34d399",
"warning": "#fbbf24",
"error": "#f87171",
},
},
],
},
plugins: [require('daisyui')],
theme: {
@@ -129,6 +192,10 @@ module.exports = {
ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',
pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
bounce: 'bounce 1s infinite',
'fade-in': 'fadeIn 0.3s ease-in',
'slide-up': 'slideUp 0.3s ease-out',
'slide-down': 'slideDown 0.3s ease-out',
'scale-in': 'scaleIn 0.2s ease-out',
},
aspectRatio: {
auto: 'auto',
@@ -405,27 +472,26 @@ module.exports = {
},
fontFamily: {
sans: [
'Arial',
'ui-sans-serif',
'system-ui',
'Inter',
'-apple-system',
'BlinkMacSystemFont',
'"Segoe UI"',
'Roboto',
'"Helvetica Neue"',
'"Noto Sans"',
'Arial',
'sans-serif',
'"Apple Color Emoji"',
'"Segoe UI Emoji"',
'"Segoe UI Symbol"',
'"Noto Color Emoji"',
],
serif: ['ui-serif', 'Georgia', 'Cambria', '"Times New Roman"', 'Times', 'serif'],
mono: [
'SF Mono',
'Monaco',
'Cascadia Code',
'ui-monospace',
'SFMono-Regular',
'Menlo',
'Monaco',
'Consolas',
'"Liberation Mono"',
'"Courier New"',
@@ -670,6 +736,22 @@ module.exports = {
animationTimingFunction: 'cubic-bezier(0,0,0.2,1)',
},
},
fadeIn: {
'0%': { opacity: '0' },
'100%': { opacity: '1' },
},
slideUp: {
'0%': { transform: 'translateY(10px)', opacity: '0' },
'100%': { transform: 'translateY(0)', opacity: '1' },
},
slideDown: {
'0%': { transform: 'translateY(-10px)', opacity: '0' },
'100%': { transform: 'translateY(0)', opacity: '1' },
},
scaleIn: {
'0%': { transform: 'scale(0.95)', opacity: '0' },
'100%': { transform: 'scale(1)', opacity: '1' },
},
},
letterSpacing: {
tighter: '-0.05em',