/* Custom styles for Easy Invoice */ /* Utility classes */ .hidden { display: none !important; } /* Custom select field styling */ select { -webkit-appearance: none; -moz-appearance: none; appearance: none; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); background-position: right 0.75rem center; background-repeat: no-repeat; background-size: 1.5em 1.5em; } /* Ensure the custom arrow works in all browsers */ select::-ms-expand { display: none; } /* Focus state for select fields */ select:focus { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%234f46e5' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position:right; } /* Specific styling for select fields with pr-10 class (which already has right padding) */ select.pr-10 { background-position: right 0.75rem center; } /* Smooth transitions */ body .invoice-item { transition: all 0.2s ease-in-out; } .invoice-item:hover { transform: translateY(-1px); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); } /* Custom scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; } ::-webkit-scrollbar-thumb { background: #c1c1c1; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #a8a8a8; } /* Print styles */ @media print { body { background: white; } .no-print { display: none !important; } .print-only { display: block !important; } .invoice-preview { box-shadow: none; border: none; } } /* Reset earlier preview tweaks */ .invoice-preview, .quote-preview { overflow-x: visible; } .invoice-preview .invoice-items, .quote-preview .quote-items, .invoice-preview table, .quote-preview table { width: auto; table-layout: auto; } .invoice-preview .invoice-items th, .invoice-preview .invoice-items td, .quote-preview .quote-items th, .quote-preview .quote-items td { white-space: inherit; word-break: normal; overflow-wrap: normal; } /* Show horizontal scroll when the inner template overflows */ #invoice-container .template, #quote-container .template, #invoice-container .template-modern, #quote-container .template-modern, #invoice-container .template-minimal, #quote-container .template-minimal, #invoice-container .template-standard, #quote-container .template-standard { overflow-x: auto; } /* Animation for status badges */ .status-badge { animation: fadeIn 0.3s ease-in-out; } @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } /* Loading spinner */ .loading-spinner { display: inline-block; width: 1.5rem; height: 1.5rem; border: 3px solid rgba(0, 0, 0, 0.1); border-radius: 50%; border-top-color: #6366f1; animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Tooltip styles */ .tooltip { position: relative; display: inline-block; } .tooltip .tooltip-text { visibility: hidden; background-color: #333; color: #fff; text-align: center; border-radius: 6px; padding: 5px; position: absolute; z-index: 1; bottom: 125%; left: 50%; transform: translateX(-50%); opacity: 0; transition: opacity 0.3s, visibility 0.3s; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } /* Responsive adjustments */ @media (max-width: 640px) { .invoice-item { padding: 1rem; } .invoice-item .grid { gap: 1rem; } .invoice-preview { padding: 1rem; } } /* Custom button styles */ .btn-primary { background-color: #6366f1; color: white; padding: 0.5rem 1rem; border-radius: 0.375rem; font-weight: 500; transition: all 0.2s; } .btn-primary:hover { background-color: #4f46e5; transform: translateY(-1px); } .btn-secondary { background-color: #f3f4f6; color: #374151; padding: 0.5rem 1rem; border-radius: 0.375rem; font-weight: 500; transition: all 0.2s; } .btn-secondary:hover { background-color: #e5e7eb; transform: translateY(-1px); } /* Custom table styles */ .custom-table { width: 100%; border-collapse: separate; border-spacing: 0; } .custom-table th { background-color: #f9fafb; padding: 0.75rem 1rem; text-align: left; font-weight: 500; color: #6b7280; } .custom-table td { padding: 0.75rem 1rem; border-bottom: 1px solid #e5e7eb; } .custom-table tr:last-child td { border-bottom: none; } /* Custom alert styles */ .alert { padding: 1rem; border-radius: 0.375rem; margin-bottom: 1rem; } .alert-success { background-color: #d1fae5; color: #065f46; border: 1px solid #a7f3d0; } .alert-error { background-color: #fee2e2; color: #b91c1c; border: 1px solid #fecaca; } .alert-warning { background-color: #fef3c7; color: #92400e; border: 1px solid #fde68a; } .alert-info { background-color: #dbeafe; color: #1e40af; border: 1px solid #bfdbfe; } /* Notification system */ .notification-container { position: fixed; top: 1rem; right: 1rem; z-index: 9999; max-width: 24rem; } .notification { background-color: white; border-radius: 0.375rem; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 1rem; margin-bottom: 1rem; display: flex; align-items: center; justify-content: space-between; transition: all 0.3s ease; transform: translateX(100%); } .notification.translate-x-0 { transform: translateX(0); } .notification.translate-x-full { transform: translateX(100%); } .notification.opacity-0 { opacity: 0; } .notification-icon { margin-right: 0.75rem; } .notification-message { font-weight: 500; } .notification-close { margin-left: 1rem; color: #9CA3AF; cursor: pointer; } .notification-close:hover { color: #6B7280; } /* Success notification */ .notification.bg-green-50 { background-color: #F0FDF4; color: #166534; } .notification.bg-green-50 .notification-icon { color: #4ADE80; } /* Error notification */ .notification.bg-red-50 { background-color: #FEF2F2; color: #B91C1C; } .notification.bg-red-50 .notification-icon { color: #F87171; } /* Loading overlay */ #loading-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(17, 24, 39, 0.5); display: flex; align-items: center; justify-content: center; z-index: 9999; } #loading-overlay > div { background-color: white; border-radius: 0.5rem; padding: 1.5rem; text-align: center; } #loading-overlay .animate-spin { display: inline-block; height: 3rem; width: 3rem; border-radius: 50%; border: 2px solid #E5E7EB; border-top-color: #4F46E5; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } #loading-overlay p { margin-top: 1rem; color: #6B7280; } /* Invoice item collapse styles */ .invoice-item.collapsed-item { padding: 8px !important; margin-bottom: 8px !important; border: 1px solid #e5e7eb !important; border-radius: 0.375rem; background-color: #f9fafb; transition: all 0.2s ease; } .invoice-item.collapsed-item .flex.items-center.justify-between { margin-bottom: 0 !important; padding-bottom: 0 !important; border-bottom: none !important; } .invoice-item.collapsed-item .item-collapsed-summary { display: inline-flex !important; align-items: center; font-size: 0.875rem; color: #6b7280; } .item-content { transition: all 0.3s ease-in-out; } body.toplevel_page_easy-invoice-all #wpcontent { padding-left: 0; } #wpbody-content { display: flex; flex-direction: column; /* Was `height: 100vh` — that pinned the container to exactly the viewport and clipped any page longer than the viewport. Using `min-height: 100vh` instead lets the column grow when content overflows, while still giving short pages a full-viewport base so .easy-invoice-admin (with `flex: 1` below in main-template.php) fills the page background to the bottom edge. */ min-height: 100vh; } .invoice-item.collapsed-item .item-content { display: none; } /* ============================================== Custom Admin Menu Styles for Easy Invoice ============================================== */ /* General menu container styles */ #adminmenuback, #adminmenuwrap, #adminmenu { background-color: #ffffff; /* Clean white background */ border-right: 1px solid #e5e7eb; } /* Top-level menu items */ #adminmenu a.menu-top { font-size: 14px; font-weight: 500; color: #374151; /* Dark gray text */ padding: 12px 10px; transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; border-left: 3px solid transparent; } /* Icons styling */ #adminmenu .wp-menu-image { color: #6b7280; transition: color 0.2s ease-in-out; } /* Hover state for top-level items */ #adminmenu li.menu-top:hover, #adminmenu li.menu-top > a:focus { background-color: #f9fafb; color: #111827; } #adminmenu li.menu-top:hover > a { border-left-color: #d1d5db; /* Gray border on hover */ } /* Active/current top-level item */ #adminmenu li.wp-has-current-submenu > a.wp-has-current-submenu, #adminmenu li.wp-has-current-submenu > a.wp-has-current-submenu:focus { background-color: #f3f4f6; /* Light gray for the parent of an active submenu item */ color: #111827; border-left-color: #4f46e5; /* Indigo border for active section */ } #adminmenu li.wp-has-current-submenu > a .wp-menu-image, #adminmenu li.current > a .wp-menu-image { color: #4f46e5; /* Indigo icon for active item */ } /* Submenu styles */ #adminmenu .wp-submenu { background-color: #f9fafb; /* Slightly off-white for submenu */ padding: 8px 0; } #adminmenu .wp-submenu a { color: #4b5563; padding: 8px 16px 8px 36px; font-size: 13px; border-left: 3px solid transparent; } #adminmenu .wp-submenu a:hover { background-color: #f3f4f6; color: #111827; border-left-color: #d1d5db; } /* Active/current submenu item */ #adminmenu .wp-submenu li.current a, #adminmenu .wp-submenu li.current a:hover { color: #4f46e5; font-weight: 600; border-left-color: #4f46e5; } /* Remove default separator lines */ #adminmenu li.wp-menu-separator { display: none; } /* Adjust the collapse button */ #collapse-menu { color: #6b7280; } #collapse-menu:hover { color: #111827; } /* --- Payment Gateways Section: Minimal Modern Redesign (2024-06) --- */ .section-heading { display: flex; align-items: center; margin-bottom: 1.5rem; font-size: 1.15rem; font-weight: 600; color: #22223b; } .section-heading .gateway-icon { width: 1.5rem; height: 1.5rem; margin-right: 0.5rem; } .info-box, .status-box { display: flex; align-items: flex-start; border-radius: 1rem; padding: 1.5rem; margin-bottom: 1.5rem; font-size: 0.98rem; background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); border: 1px solid #e2e8f0; color: #22223b; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); position: relative; overflow: hidden; } .info-box::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, #3b82f6, #6366f1, #8b5cf6); } .info-box .info-icon-wrapper { display: flex; align-items: center; justify-content: center; width: 3rem; height: 3rem; background: linear-gradient(135deg, #3b82f6, #6366f1); border-radius: 0.75rem; margin-right: 1.25rem; flex-shrink: 0; box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3); } .info-box .info-icon { width: 1.5rem; height: 1.5rem; color: #ffffff; stroke-width: 2.5; } .info-content { flex: 1; display: flex; flex-direction: column; gap: 0.5rem; } .info-header { font-size: 1.1rem; font-weight: 600; color: #1e293b; margin-bottom: 0.25rem; } .info-main { font-weight: 500; color: #374151; line-height: 1.6; font-size: 1rem; } .info-secondary { font-size: 0.95em; color: #6b7280; line-height: 1.5; font-style: italic; padding-left: 0.5rem; border-left: 3px solid #e5e7eb; } .status-box .gateway-icon { width: 1.5rem; height: 1.5rem; margin-right: 1rem; flex-shrink: 0; } .status-content { flex: 1; } .status-box .main { font-weight: 500; color: #22223b; line-height: 1.5; } .status-box .secondary { font-size: 0.95em; color: #64748b; line-height: 1.4; margin-top: 0.25rem; } .status-box .main { color: #059669; } .status-box .secondary { color: #059669; } .no-gateways-notice { padding: 1.25rem 1.5rem; background: #fef2f2; border: 1px solid #fecaca; border-radius: 0.75rem; color: #dc2626; font-size: 0.95rem; font-style: italic; text-align: center; margin-bottom: 1.5rem; } .toggle-container { background: #ffffff; border: 1px solid #e2e8f0; border-radius: 0.75rem; padding: 1.25rem 1.5rem; margin-bottom: 1.5rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .toggle-row { display: flex; align-items: center; cursor: pointer; gap: 1rem; } .toggle-label { font-size: 1rem; font-weight: 500; color: #22223b; flex: 1; } .toggle-switch { position: relative; display: inline-block; width: 3rem; height: 1.5rem; } .toggle-checkbox { opacity: 0; width: 0; height: 0; position: absolute; } .toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #cbd5e1; transition: 0.3s; border-radius: 1.5rem; box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); } .toggle-slider:before { position: absolute; content: ""; height: 1.25rem; width: 1.25rem; left: 0.125rem; bottom: 0.125rem; background-color: white; transition: 0.3s; border-radius: 50%; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .toggle-checkbox:checked + .toggle-slider { background-color: #6366f1; } .toggle-checkbox:checked + .toggle-slider:before { transform: translateX(1.5rem); } .toggle-help { display: inline-flex; align-items: center; justify-content: center; width: 1.25rem; height: 1.25rem; background: #f1f5f9; border: 1px solid #e2e8f0; border-radius: 50%; color: #64748b; font-size: 0.75rem; font-weight: 600; cursor: help; transition: all 0.2s; } .toggle-help:hover { background: #e2e8f0; color: #475569; } .toggle-description { margin-top: 0.75rem; padding: 0.75rem 1rem; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.5rem; font-size: 0.9rem; color: #64748b; line-height: 1.5; border-left: 3px solid #6366f1; } .gateway-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem; } @media (max-width: 900px) { .gateway-cards { grid-template-columns: 1fr; } } .gateway-card { display: flex; align-items: flex-start; padding: 1.25rem 1rem; border: 1px solid #e2e8f0; border-radius: 0.75rem; background: #fff; cursor: pointer; transition: all 0.2s ease; min-height: 4rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); position: relative; gap: 1rem; } .gateway-card.checked { border-color: #6366f1; background: #f6f8ff; box-shadow: 0 2px 8px rgba(99, 102, 241, 0.15); } .gateway-card:hover { border-color: #6366f1; box-shadow: 0 2px 8px rgba(99, 102, 241, 0.1); transform: translateY(-1px); } .gateway-card input[type="checkbox"] { display: none; } .gateway-card .custom-checkbox { width: 1.25rem; height: 1.25rem; border: 2px solid #cbd5e1; border-radius: 0.375rem; background: #fff; display: flex; align-items: center; justify-content: center; margin-right: 1rem; margin-top: 0.125rem; transition: all 0.2s ease; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .gateway-card.checked .custom-checkbox { border-color: #6366f1; background: #6366f1; box-shadow: 0 2px 4px rgba(99, 102, 241, 0.3); } .gateway-card .custom-checkbox svg { display: none; width: 0.875rem; height: 0.875rem; color: #fff; stroke-width: 2.5; } .gateway-card.checked .custom-checkbox svg { display: block; } .gateway-card-content { display: flex; flex-direction: column; justify-content: center; gap: 0.25rem; flex: 1; } .gateway-title { font-weight: 600; color: #22223b; font-size: 1rem; line-height: 1.3; display: flex; align-items: center; gap: 0.5rem; } .gateway-desc { font-size: 0.9em; color: #64748b; margin: 0; font-weight: 400; line-height: 1.4; } .gateway-icon-wrap, .gateway-icon { display: none !important; } .badge { padding: 0.25rem 0.5rem; background: #fef3c7; color: #b45309; border-radius: 0.5rem; font-size: 0.75em; font-weight: 500; border: 1px solid #fde68a; } /* License Status Badge */ .license-status-badge { transition: all 0.2s ease; font-size: 0.75rem; font-weight: 500; border-radius: 9999px; padding: 0 0.5rem; display: inline-flex; align-items: center; gap: 0.25rem; } .license-status-badge .status-dot { width: 0.375rem; height: 0.375rem; border-radius: 50%; background: currentColor; opacity: 0.8; } .license-status-badge.active { background: #dcfce7; color: #166534; border: 1px solid #bbf7d0; } .license-status-badge.activated { background: #dcfce7; color: #166534; border: 1px solid #bbf7d0; font-size: 0.625rem; padding: 0.125rem 0.375rem; } .license-status-badge.inactive { background: #fef2f2; color: #dc2626; border: 1px solid #fecaca; } .license-status-badge.deactivated { background: #fef2f2; color: #dc2626; border: 1px solid #fecaca; } .license-status-badge.expired { background: #fef3c7; color: #92400e; border: 1px solid #fde68a; } .license-status-badge.free { background: #e0e7ff; color: #3730a3; border: 1px solid #c7d2fe; } /* License menu item badge */ .group:hover .license-status-badge { transform: scale(1.05); } /* Responsive adjustments for license badge */ @media (max-width: 768px) { .license-status-badge { font-size: 0.625rem; padding: 0.125rem 0.375rem; } } /* Dashboard / settings: negative margins for full-bleed bar inside padded shell */ .easy-invoice-admin-page-header { margin-left: -2rem; margin-top: -2rem; margin-right: -2rem; padding-left: 2rem; padding-right: 2rem; } /* All primary list/settings/dashboard headers: same strip height as sidebar + builder */ body.easy-invoice-admin-body .ei-app-page-header { box-sizing: border-box; height: var(--ei-app-header-strip-height, 6.5rem); min-height: var(--ei-app-header-strip-height, 6.5rem); max-height: var(--ei-app-header-strip-height, 6.5rem); display: flex; flex-direction: column; justify-content: center; overflow: hidden; padding-top: 0; padding-bottom: 0; } body.easy-invoice-admin-body .ei-app-page-header > div { width: 100%; min-height: 0; flex: 0 1 auto; display: flex; align-items: center; justify-content: space-between; gap: 1rem; } body.easy-invoice-admin-body .ei-app-page-header h1 { font-size: 1.25rem; line-height: 1.3; font-weight: 700; } body.easy-invoice-admin-body .ei-app-page-header p.text-sm, body.easy-invoice-admin-body .ei-app-page-header .text-sm.text-gray-500 { margin-top: 0.125rem; font-size: 0.75rem; line-height: 1.25; } .easy-invoice-chart-wrap { height: 300px; position: relative; } .easy-invoice-chart-canvas { width: 100% !important; height: 100% !important; } /* Accessibility: skip link */ .easy-invoice-admin .screen-reader-text { border: 0; clip: rect(1px, 1px, 1px, 1px); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute !important; width: 1px; word-wrap: normal !important; } .easy-invoice-admin .easy-invoice-skip-link:focus { background: #fff; border-radius: 0.375rem; box-shadow: 0 0 0 2px #4f46e5, 0 4px 6px -1px rgba(0, 0, 0, 0.1); clip: auto !important; clip-path: none; color: #1f2937; display: block; font-size: 0.875rem; font-weight: 600; height: auto; left: 1rem; line-height: 1.25; padding: 0.75rem 1rem; text-decoration: none; top: 1rem; width: auto; z-index: 100000; } .easy-invoice-admin nav a:focus-visible { outline: 2px solid #4f46e5; outline-offset: 2px; } /* * Sidebar branding strip + builder top bar: one shared height so the bottom borders line up. * Variable is on body (sidebar sits outside .easy-invoice-admin, so do not scope only there). * Uses px-friendly rem; max-height + overflow keep Pro toolbar from growing the bar. */ body.easy-invoice-admin-body { /* Shared by sidebar branding, builder bar, and list/dashboard page headers */ --ei-app-header-strip-height: 6.5rem; } body.easy-invoice-admin-body .ei-app-sidebar-top { box-sizing: border-box; flex-shrink: 0; height: var(--ei-app-header-strip-height); min-height: var(--ei-app-header-strip-height); max-height: var(--ei-app-header-strip-height); overflow: hidden; } @media (min-width: 1024px) { body.easy-invoice-admin-body .ei-invoice-builder-header.ei-app-header-sync, body.easy-invoice-admin-body .ei-quote-builder-header.ei-app-header-sync { box-sizing: border-box; flex-shrink: 0; height: var(--ei-app-header-strip-height); min-height: var(--ei-app-header-strip-height); max-height: var(--ei-app-header-strip-height); /* Allow dropdowns/popovers (e.g. Pro deposit info) to extend below the strip; clip tall content on the title column instead (.ei-app-header-leading). */ overflow: visible; } body.easy-invoice-admin-body .ei-app-header-sync .ei-app-header-leading { min-height: 0; min-width: 0; overflow: hidden; } body.easy-invoice-admin-body .ei-app-header-sync > .max-w-full { display: flex; align-items: center; height: 100%; min-height: 0; } body.easy-invoice-admin-body .ei-app-header-sync .ei-app-header-inner { align-items: center; width: 100%; min-height: 0; } body.easy-invoice-admin-body .ei-app-header-sync .ei-builder-header-actions, body.easy-invoice-admin-body .ei-app-header-sync .ei-builder-header-actions > * { max-height: 100%; } }