:root { /* Primitive Color Tokens */ --color-white: rgba(255, 255, 255, 1); --color-black: rgba(0, 0, 0, 1); --color-cream-50: rgba(252, 252, 249, 1); --color-cream-100: rgba(255, 255, 253, 1); --color-gray-200: rgba(245, 245, 245, 1); --color-gray-300: rgba(167, 169, 169, 1); --color-gray-400: rgba(119, 124, 124, 1); --color-slate-500: rgba(98, 108, 113, 1); --color-brown-600: rgba(94, 82, 64, 1); --color-charcoal-700: rgba(31, 33, 33, 1); --color-charcoal-800: rgba(38, 40, 40, 1); --color-slate-900: rgba(19, 52, 59, 1); --color-teal-300: rgba(50, 184, 198, 1); --color-teal-400: rgba(45, 166, 178, 1); --color-teal-500: rgba(33, 128, 141, 1); --color-teal-600: rgba(29, 116, 128, 1); --color-teal-700: rgba(26, 104, 115, 1); --color-teal-800: rgba(41, 150, 161, 1); --color-red-400: rgba(255, 84, 89, 1); --color-red-500: rgba(192, 21, 47, 1); --color-orange-400: rgba(230, 129, 97, 1); --color-orange-500: rgba(168, 75, 47, 1); /* RGB versions for opacity control */ --color-brown-600-rgb: 94, 82, 64; --color-teal-500-rgb: 33, 128, 141; --color-slate-900-rgb: 19, 52, 59; --color-slate-500-rgb: 98, 108, 113; --color-red-500-rgb: 192, 21, 47; --color-red-400-rgb: 255, 84, 89; --color-orange-500-rgb: 168, 75, 47; --color-orange-400-rgb: 230, 129, 97; /* Background color tokens (Light Mode) */ --color-bg-1: rgba(59, 130, 246, 0.08); /* Light blue */ --color-bg-2: rgba(245, 158, 11, 0.08); /* Light yellow */ --color-bg-3: rgba(34, 197, 94, 0.08); /* Light green */ --color-bg-4: rgba(239, 68, 68, 0.08); /* Light red */ --color-bg-5: rgba(147, 51, 234, 0.08); /* Light purple */ --color-bg-6: rgba(249, 115, 22, 0.08); /* Light orange */ --color-bg-7: rgba(236, 72, 153, 0.08); /* Light pink */ --color-bg-8: rgba(6, 182, 212, 0.08); /* Light cyan */ /* Semantic Color Tokens (Light Mode) */ --color-background: var(--color-cream-50); --color-surface: var(--color-cream-100); --color-text: var(--color-slate-900); --color-text-secondary: var(--color-slate-500); --color-primary: var(--color-teal-500); --color-primary-hover: var(--color-teal-600); --color-primary-active: var(--color-teal-700); --color-secondary: rgba(var(--color-brown-600-rgb), 0.12); --color-secondary-hover: rgba(var(--color-brown-600-rgb), 0.2); --color-secondary-active: rgba(var(--color-brown-600-rgb), 0.25); --color-border: rgba(var(--color-brown-600-rgb), 0.2); --color-btn-primary-text: var(--color-cream-50); --color-card-border: rgba(var(--color-brown-600-rgb), 0.12); --color-card-border-inner: rgba(var(--color-brown-600-rgb), 0.12); --color-error: var(--color-red-500); --color-success: var(--color-teal-500); --color-warning: var(--color-orange-500); --color-info: var(--color-slate-500); --color-focus-ring: rgba(var(--color-teal-500-rgb), 0.4); --color-select-caret: rgba(var(--color-slate-900-rgb), 0.8); /* Common style patterns */ --focus-ring: 0 0 0 3px var(--color-focus-ring); --focus-outline: 2px solid var(--color-primary); --status-bg-opacity: 0.15; --status-border-opacity: 0.25; --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); /* RGB versions for opacity control */ --color-success-rgb: 33, 128, 141; --color-error-rgb: 192, 21, 47; --color-warning-rgb: 168, 75, 47; --color-info-rgb: 98, 108, 113; /* Typography */ --font-family-base: "FKGroteskNeue", "Geist", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; --font-family-mono: "Berkeley Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; --font-size-xs: 11px; --font-size-sm: 12px; --font-size-base: 14px; --font-size-md: 14px; --font-size-lg: 16px; --font-size-xl: 18px; --font-size-2xl: 20px; --font-size-3xl: 24px; --font-size-4xl: 30px; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 550; --font-weight-bold: 600; --line-height-tight: 1.2; --line-height-normal: 1.5; --letter-spacing-tight: -0.01em; /* Spacing */ --space-0: 0; --space-1: 1px; --space-2: 2px; --space-4: 4px; --space-6: 6px; --space-8: 8px; --space-10: 10px; --space-12: 12px; --space-16: 16px; --space-20: 20px; --space-24: 24px; --space-32: 32px; /* Border Radius */ --radius-sm: 6px; --radius-base: 8px; --radius-md: 10px; --radius-lg: 12px; --radius-full: 9999px; /* Shadows */ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.02); --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.02); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.04), 0 2px 4px -1px rgba(0, 0, 0, 0.02); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.04), 0 4px 6px -2px rgba(0, 0, 0, 0.02); --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.03); /* Animation */ --duration-fast: 150ms; --duration-normal: 250ms; --ease-standard: cubic-bezier(0.16, 1, 0.3, 1); /* Layout */ --container-sm: 640px; --container-md: 768px; --container-lg: 1024px; --container-xl: 1280px; } /* Dark mode colors */ @media (prefers-color-scheme: dark) { :root { /* RGB versions for opacity control (Dark Mode) */ --color-gray-400-rgb: 119, 124, 124; --color-teal-300-rgb: 50, 184, 198; --color-gray-300-rgb: 167, 169, 169; --color-gray-200-rgb: 245, 245, 245; /* Background color tokens (Dark Mode) */ --color-bg-1: rgba(29, 78, 216, 0.15); /* Dark blue */ --color-bg-2: rgba(180, 83, 9, 0.15); /* Dark yellow */ --color-bg-3: rgba(21, 128, 61, 0.15); /* Dark green */ --color-bg-4: rgba(185, 28, 28, 0.15); /* Dark red */ --color-bg-5: rgba(107, 33, 168, 0.15); /* Dark purple */ --color-bg-6: rgba(194, 65, 12, 0.15); /* Dark orange */ --color-bg-7: rgba(190, 24, 93, 0.15); /* Dark pink */ --color-bg-8: rgba(8, 145, 178, 0.15); /* Dark cyan */ /* Semantic Color Tokens (Dark Mode) */ --color-background: var(--color-charcoal-700); --color-surface: var(--color-charcoal-800); --color-text: var(--color-gray-200); --color-text-secondary: rgba(var(--color-gray-300-rgb), 0.7); --color-primary: var(--color-teal-300); --color-primary-hover: var(--color-teal-400); --color-primary-active: var(--color-teal-800); --color-secondary: rgba(var(--color-gray-400-rgb), 0.15); --color-secondary-hover: rgba(var(--color-gray-400-rgb), 0.25); --color-secondary-active: rgba(var(--color-gray-400-rgb), 0.3); --color-border: rgba(var(--color-gray-400-rgb), 0.3); --color-error: var(--color-red-400); --color-success: var(--color-teal-300); --color-warning: var(--color-orange-400); --color-info: var(--color-gray-300); --color-focus-ring: rgba(var(--color-teal-300-rgb), 0.4); --color-btn-primary-text: var(--color-slate-900); --color-card-border: rgba(var(--color-gray-400-rgb), 0.2); --color-card-border-inner: rgba(var(--color-gray-400-rgb), 0.15); --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.15); --button-border-secondary: rgba(var(--color-gray-400-rgb), 0.2); --color-border-secondary: rgba(var(--color-gray-400-rgb), 0.2); --color-select-caret: rgba(var(--color-gray-200-rgb), 0.8); /* Common style patterns - updated for dark mode */ --focus-ring: 0 0 0 3px var(--color-focus-ring); --focus-outline: 2px solid var(--color-primary); --status-bg-opacity: 0.15; --status-border-opacity: 0.25; --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); /* RGB versions for dark mode */ --color-success-rgb: var(--color-teal-300-rgb); --color-error-rgb: var(--color-red-400-rgb); --color-warning-rgb: var(--color-orange-400-rgb); --color-info-rgb: var(--color-gray-300-rgb); } } /* Data attribute for manual theme switching */ [data-color-scheme="dark"] { /* RGB versions for opacity control (dark mode) */ --color-gray-400-rgb: 119, 124, 124; --color-teal-300-rgb: 50, 184, 198; --color-gray-300-rgb: 167, 169, 169; --color-gray-200-rgb: 245, 245, 245; /* Colorful background palette - Dark Mode */ --color-bg-1: rgba(29, 78, 216, 0.15); /* Dark blue */ --color-bg-2: rgba(180, 83, 9, 0.15); /* Dark yellow */ --color-bg-3: rgba(21, 128, 61, 0.15); /* Dark green */ --color-bg-4: rgba(185, 28, 28, 0.15); /* Dark red */ --color-bg-5: rgba(107, 33, 168, 0.15); /* Dark purple */ --color-bg-6: rgba(194, 65, 12, 0.15); /* Dark orange */ --color-bg-7: rgba(190, 24, 93, 0.15); /* Dark pink */ --color-bg-8: rgba(8, 145, 178, 0.15); /* Dark cyan */ /* Semantic Color Tokens (Dark Mode) */ --color-background: var(--color-charcoal-700); --color-surface: var(--color-charcoal-800); --color-text: var(--color-gray-200); --color-text-secondary: rgba(var(--color-gray-300-rgb), 0.7); --color-primary: var(--color-teal-300); --color-primary-hover: var(--color-teal-400); --color-primary-active: var(--color-teal-800); --color-secondary: rgba(var(--color-gray-400-rgb), 0.15); --color-secondary-hover: rgba(var(--color-gray-400-rgb), 0.25); --color-secondary-active: rgba(var(--color-gray-400-rgb), 0.3); --color-border: rgba(var(--color-gray-400-rgb), 0.3); --color-error: var(--color-red-400); --color-success: var(--color-teal-300); --color-warning: var(--color-orange-400); --color-info: var(--color-gray-300); --color-focus-ring: rgba(var(--color-teal-300-rgb), 0.4); --color-btn-primary-text: var(--color-slate-900); --color-card-border: rgba(var(--color-gray-400-rgb), 0.15); --color-card-border-inner: rgba(var(--color-gray-400-rgb), 0.15); --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.15); --color-border-secondary: rgba(var(--color-gray-400-rgb), 0.2); --color-select-caret: rgba(var(--color-gray-200-rgb), 0.8); /* Common style patterns - updated for dark mode */ --focus-ring: 0 0 0 3px var(--color-focus-ring); --focus-outline: 2px solid var(--color-primary); --status-bg-opacity: 0.15; --status-border-opacity: 0.25; --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); /* RGB versions for dark mode */ --color-success-rgb: var(--color-teal-300-rgb); --color-error-rgb: var(--color-red-400-rgb); --color-warning-rgb: var(--color-orange-400-rgb); --color-info-rgb: var(--color-gray-300-rgb); } [data-color-scheme="light"] { /* RGB versions for opacity control (light mode) */ --color-brown-600-rgb: 94, 82, 64; --color-teal-500-rgb: 33, 128, 141; --color-slate-900-rgb: 19, 52, 59; /* Semantic Color Tokens (Light Mode) */ --color-background: var(--color-cream-50); --color-surface: var(--color-cream-100); --color-text: var(--color-slate-900); --color-text-secondary: var(--color-slate-500); --color-primary: var(--color-teal-500); --color-primary-hover: var(--color-teal-600); --color-primary-active: var(--color-teal-700); --color-secondary: rgba(var(--color-brown-600-rgb), 0.12); --color-secondary-hover: rgba(var(--color-brown-600-rgb), 0.2); --color-secondary-active: rgba(var(--color-brown-600-rgb), 0.25); --color-border: rgba(var(--color-brown-600-rgb), 0.2); --color-btn-primary-text: var(--color-cream-50); --color-card-border: rgba(var(--color-brown-600-rgb), 0.12); --color-card-border-inner: rgba(var(--color-brown-600-rgb), 0.12); --color-error: var(--color-red-500); --color-success: var(--color-teal-500); --color-warning: var(--color-orange-500); --color-info: var(--color-slate-500); --color-focus-ring: rgba(var(--color-teal-500-rgb), 0.4); /* RGB versions for light mode */ --color-success-rgb: var(--color-teal-500-rgb); --color-error-rgb: var(--color-red-500-rgb); --color-warning-rgb: var(--color-orange-500-rgb); --color-info-rgb: var(--color-slate-500-rgb); } /* Base styles */ html { font-size: var(--font-size-base); font-family: var(--font-family-base); line-height: var(--line-height-normal); color: var(--color-text); background-color: var(--color-background); -webkit-font-smoothing: antialiased; box-sizing: border-box; } body { margin: 0; padding: 0; } *, *::before, *::after { box-sizing: inherit; } /* Typography */ h1, h2, h3, h4, h5, h6 { margin: 0; font-weight: var(--font-weight-semibold); line-height: var(--line-height-tight); color: var(--color-text); letter-spacing: var(--letter-spacing-tight); } h1 { font-size: var(--font-size-4xl); } h2 { font-size: var(--font-size-3xl); } h3 { font-size: var(--font-size-2xl); } h4 { font-size: var(--font-size-xl); } h5 { font-size: var(--font-size-lg); } h6 { font-size: var(--font-size-md); } p { margin: 0 0 var(--space-16) 0; } a { color: var(--color-primary); text-decoration: none; transition: color var(--duration-fast) var(--ease-standard); } a:hover { color: var(--color-primary-hover); } code, pre { font-family: var(--font-family-mono); font-size: calc(var(--font-size-base) * 0.95); background-color: var(--color-secondary); border-radius: var(--radius-sm); } code { padding: var(--space-1) var(--space-4); } pre { padding: var(--space-16); margin: var(--space-16) 0; overflow: auto; border: 1px solid var(--color-border); } pre code { background: none; padding: 0; } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; padding: var(--space-8) var(--space-16); border-radius: var(--radius-base); font-size: var(--font-size-base); font-weight: 500; line-height: 1.5; cursor: pointer; transition: all var(--duration-normal) var(--ease-standard); border: none; text-decoration: none; position: relative; } .btn:focus-visible { outline: none; box-shadow: var(--focus-ring); } .btn--primary { background: var(--color-primary); color: var(--color-btn-primary-text); } .btn--primary:hover { background: var(--color-primary-hover); } .btn--primary:active { background: var(--color-primary-active); } .btn--secondary { background: var(--color-secondary); color: var(--color-text); } .btn--secondary:hover { background: var(--color-secondary-hover); } .btn--secondary:active { background: var(--color-secondary-active); } .btn--outline { background: transparent; border: 1px solid var(--color-border); color: var(--color-text); } .btn--outline:hover { background: var(--color-secondary); } .btn--sm { padding: var(--space-4) var(--space-12); font-size: var(--font-size-sm); border-radius: var(--radius-sm); } .btn--lg { padding: var(--space-10) var(--space-20); font-size: var(--font-size-lg); border-radius: var(--radius-md); } .btn--full-width { width: 100%; } .btn:disabled { opacity: 0.5; cursor: not-allowed; } /* Form elements */ .form-control { display: block; width: 100%; padding: var(--space-8) var(--space-12); font-size: var(--font-size-md); line-height: 1.5; color: var(--color-text); background-color: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-base); transition: border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard); } textarea.form-control { font-family: var(--font-family-base); font-size: var(--font-size-base); } select.form-control { padding: var(--space-8) var(--space-12); -webkit-appearance: none; -moz-appearance: none; appearance: none; background-image: var(--select-caret-light); background-repeat: no-repeat; background-position: right var(--space-12) center; background-size: 16px; padding-right: var(--space-32); } /* Add a dark mode specific caret */ @media (prefers-color-scheme: dark) { select.form-control { background-image: var(--select-caret-dark); } } /* Also handle data-color-scheme */ [data-color-scheme="dark"] select.form-control { background-image: var(--select-caret-dark); } [data-color-scheme="light"] select.form-control { background-image: var(--select-caret-light); } .form-control:focus { border-color: var(--color-primary); outline: var(--focus-outline); } .form-label { display: block; margin-bottom: var(--space-8); font-weight: var(--font-weight-medium); font-size: var(--font-size-sm); } .form-group { margin-bottom: var(--space-16); } /* Card component */ .card { background-color: var(--color-surface); border-radius: var(--radius-lg); border: 1px solid var(--color-card-border); box-shadow: var(--shadow-sm); overflow: hidden; transition: box-shadow var(--duration-normal) var(--ease-standard); } .card:hover { box-shadow: var(--shadow-md); } .card__body { padding: var(--space-16); } .card__header, .card__footer { padding: var(--space-16); border-bottom: 1px solid var(--color-card-border-inner); } /* Status indicators - simplified with CSS variables */ .status { display: inline-flex; align-items: center; padding: var(--space-6) var(--space-12); border-radius: var(--radius-full); font-weight: var(--font-weight-medium); font-size: var(--font-size-sm); } .status--success { background-color: rgba( var(--color-success-rgb, 33, 128, 141), var(--status-bg-opacity) ); color: var(--color-success); border: 1px solid rgba(var(--color-success-rgb, 33, 128, 141), var(--status-border-opacity)); } .status--error { background-color: rgba( var(--color-error-rgb, 192, 21, 47), var(--status-bg-opacity) ); color: var(--color-error); border: 1px solid rgba(var(--color-error-rgb, 192, 21, 47), var(--status-border-opacity)); } .status--warning { background-color: rgba( var(--color-warning-rgb, 168, 75, 47), var(--status-bg-opacity) ); color: var(--color-warning); border: 1px solid rgba(var(--color-warning-rgb, 168, 75, 47), var(--status-border-opacity)); } .status--info { background-color: rgba( var(--color-info-rgb, 98, 108, 113), var(--status-bg-opacity) ); color: var(--color-info); border: 1px solid rgba(var(--color-info-rgb, 98, 108, 113), var(--status-border-opacity)); } /* Container layout */ .container { width: 100%; margin-right: auto; margin-left: auto; padding-right: var(--space-16); padding-left: var(--space-16); } @media (min-width: 640px) { .container { max-width: var(--container-sm); } } @media (min-width: 768px) { .container { max-width: var(--container-md); } } @media (min-width: 1024px) { .container { max-width: var(--container-lg); } } @media (min-width: 1280px) { .container { max-width: var(--container-xl); } } /* Utility classes */ .flex { display: flex; } .flex-col { flex-direction: column; } .items-center { align-items: center; } .justify-center { justify-content: center; } .justify-between { justify-content: space-between; } .gap-4 { gap: var(--space-4); } .gap-8 { gap: var(--space-8); } .gap-16 { gap: var(--space-16); } .m-0 { margin: 0; } .mt-8 { margin-top: var(--space-8); } .mb-8 { margin-bottom: var(--space-8); } .mx-8 { margin-left: var(--space-8); margin-right: var(--space-8); } .my-8 { margin-top: var(--space-8); margin-bottom: var(--space-8); } .p-0 { padding: 0; } .py-8 { padding-top: var(--space-8); padding-bottom: var(--space-8); } .px-8 { padding-left: var(--space-8); padding-right: var(--space-8); } .py-16 { padding-top: var(--space-16); padding-bottom: var(--space-16); } .px-16 { padding-left: var(--space-16); padding-right: var(--space-16); } .block { display: block; } .hidden { display: none; } /* Accessibility */ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } :focus-visible { outline: var(--focus-outline); outline-offset: 2px; } /* Dark mode specifics */ [data-color-scheme="dark"] .btn--outline { border: 1px solid var(--color-border-secondary); } @font-face { font-family: 'FKGroteskNeue'; src: url('https://r2cdn.perplexity.ai/fonts/FKGroteskNeue.woff2') format('woff2'); } /* END PERPLEXITY DESIGN SYSTEM */ /* Custom properties for Blubooks brand */ :root { --blubooks-dark-1: #090F14; --blubooks-dark-2: #0D1720; --blubooks-light-1: #82B5C1; --blubooks-light-2: #BCE6F5; --blubooks-white: #FFFFFF; --blubooks-gray: #F8F9FA; --blubooks-text-light: rgba(255, 255, 255, 0.9); /* Override design system colors with brand colors */ --color-primary: var(--blubooks-light-1); --color-primary-hover: #6BA4B1; --color-primary-active: #5A93A0; --color-text: var(--blubooks-dark-1); --color-background: var(--blubooks-white); --color-surface: var(--blubooks-gray); } /* Header Styles */ .header { background: linear-gradient(135deg, var(--blubooks-dark-1) 0%, var(--blubooks-dark-2) 100%); color: var(--blubooks-white); padding: var(--space-16) 0; position: sticky; top: 0; z-index: 100; box-shadow: var(--shadow-md); } .header__content { display: flex; justify-content: space-between; align-items: center; } .header__logo .logo { font-size: var(--font-size-3xl); font-weight: var(--font-weight-bold); color: var(--blubooks-light-2); margin: 0; letter-spacing: -0.02em; cursor: pointer; } .header__logo .tagline { font-size: var(--font-size-sm); color: rgba(188, 230, 245, 0.8); margin: var(--space-4) 0 0 0; font-weight: var(--font-weight-normal); } .nav__list { display: flex; list-style: none; margin: 0; padding: 0; gap: var(--space-32); } .nav__link { color: var(--blubooks-text-light); text-decoration: none; font-weight: var(--font-weight-medium); font-size: var(--font-size-md); transition: color var(--duration-fast) var(--ease-standard); } .nav__link:hover { color: var(--blubooks-light-2); } .nav__toggle { display: none; flex-direction: column; gap: var(--space-4); background: none; border: none; cursor: pointer; padding: var(--space-8); z-index: 101; } .nav__toggle span { width: 24px; height: 2px; background: var(--blubooks-white); transition: all var(--duration-normal) var(--ease-standard); border-radius: 2px; } /* Hero Section */ .hero { background: linear-gradient(135deg, var(--blubooks-light-2) 0%, rgba(188, 230, 245, 0.3) 100%); padding: var(--space-32) 0; } .hero__content { max-width: 800px; margin: 0 auto; text-align: center; } .hero__meta { display: flex; justify-content: center; gap: var(--space-16); margin-bottom: var(--space-24); font-size: var(--font-size-sm); color: var(--color-text-secondary); } .hero__title { font-size: var(--font-size-4xl); line-height: var(--line-height-tight); margin-bottom: var(--space-24); color: var(--blubooks-dark-1); font-weight: var(--font-weight-bold); } .hero__subtitle { font-size: var(--font-size-xl); color: var(--color-text-secondary); line-height: var(--line-height-normal); margin: 0; } /* Featured Image */ .featured-image { padding: var(--space-32) 0; background: var(--color-surface); } .featured-image__container { max-width: 900px; margin: 0 auto; border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-lg); } .featured-image__img { width: 100%; height: auto; display: block; } /* Blog Content */ .blog-content { padding: var(--space-32) 0; } .blog-content__wrapper { max-width: 750px; margin: 0 auto; } .blog-content__text { font-size: var(--font-size-lg); line-height: 1.7; color: var(--color-text); } .blog-content__text p { margin-bottom: var(--space-24); } .blog-content__text h2 { font-size: var(--font-size-2xl); color: var(--blubooks-dark-1); margin: var(--space-32) 0 var(--space-16) 0; border-left: 4px solid var(--blubooks-light-1); padding-left: var(--space-16); } .blog-content__text h3 { font-size: var(--font-size-xl); color: var(--blubooks-dark-1); margin: var(--space-24) 0 var(--space-12) 0; } .intro-text { font-size: var(--font-size-xl); font-weight: var(--font-weight-medium); color: var(--blubooks-dark-1); border-left: 4px solid var(--blubooks-light-1); padding-left: var(--space-20); margin-bottom: var(--space-32) !important; background: rgba(188, 230, 245, 0.1); padding: var(--space-20); border-radius: var(--radius-base); } .services-list { list-style: none; padding: 0; margin: var(--space-24) 0; } .services-list li { padding: var(--space-16); margin-bottom: var(--space-12); background: var(--color-surface); border-radius: var(--radius-base); border-left: 4px solid var(--blubooks-light-1); } /* CTA Sections */ .cta-section { background: linear-gradient(135deg, var(--blubooks-light-1) 0%, var(--blubooks-light-2) 100%); padding: var(--space-32); border-radius: var(--radius-lg); text-align: center; margin: var(--space-32) 0; color: var(--blubooks-white); } .cta-section h3 { color: var(--blubooks-white); margin-bottom: var(--space-16); font-size: var(--font-size-2xl); } .cta-section p { font-size: var(--font-size-lg); margin-bottom: var(--space-24); color: rgba(255, 255, 255, 0.9); } .final-cta { background: var(--blubooks-gray); padding: var(--space-32); border-radius: var(--radius-lg); text-align: center; margin: var(--space-32) 0; border: 2px solid var(--blubooks-light-2); } .final-cta h2 { color: var(--blubooks-dark-1); margin-bottom: var(--space-16); border: none; padding: 0; } .cta-buttons { display: flex; gap: var(--space-16); justify-content: center; margin-top: var(--space-24); flex-wrap: wrap; } /* Content Images */ .content-image { margin: var(--space-32) 0; text-align: center; } .content-image__img { width: 100%; max-width: 600px; height: auto; border-radius: var(--radius-lg); box-shadow: var(--shadow-md); } .content-image__caption { font-size: var(--font-size-sm); color: var(--color-text-secondary); font-style: italic; margin-top: var(--space-12); } /* About Section */ .about { background: var(--color-surface); padding: var(--space-32) 0; } .about__content { max-width: 800px; margin: 0 auto; text-align: center; } .about__content h2 { font-size: var(--font-size-3xl); color: var(--blubooks-dark-1); margin-bottom: var(--space-24); } .about__content p { font-size: var(--font-size-lg); line-height: var(--line-height-normal); color: var(--color-text-secondary); margin-bottom: var(--space-16); } /* Button Overrides */ .btn { font-weight: var(--font-weight-semibold); text-transform: none; letter-spacing: normal; transition: all var(--duration-normal) var(--ease-standard); } .btn--primary { background: var(--blubooks-light-1); color: var(--blubooks-white); } .btn--primary:hover { background: var(--color-primary-hover); transform: translateY(-2px); box-shadow: var(--shadow-md); } .btn--outline { border-color: var(--blubooks-light-1); color: var(--blubooks-light-1); } .btn--outline:hover { background: var(--blubooks-light-1); color: var(--blubooks-white); transform: translateY(-2px); box-shadow: var(--shadow-md); } /* Services Section */ .services { background: var(--blubooks-white); padding: var(--space-32) 0; } .services__header { text-align: center; margin-bottom: var(--space-32); max-width: 600px; margin-left: auto; margin-right: auto; } .services__header h2 { font-size: var(--font-size-3xl); color: var(--blubooks-dark-1); margin-bottom: var(--space-16); } .services__header p { font-size: var(--font-size-lg); color: var(--color-text-secondary); } .services__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--space-24); max-width: 1200px; margin: 0 auto; } .service-card { background: var(--blubooks-white); padding: var(--space-24); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); transition: all var(--duration-normal) var(--ease-standard); border-top: 4px solid var(--blubooks-light-1); border: 1px solid rgba(130, 181, 193, 0.2); } .service-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); border-color: var(--blubooks-light-1); } .service-card h3 { color: var(--blubooks-dark-1); font-size: var(--font-size-xl); margin-bottom: var(--space-12); } .service-card p { color: var(--color-text-secondary); line-height: var(--line-height-normal); margin: 0; } /* Footer */ .footer { background: linear-gradient(135deg, var(--blubooks-dark-1) 0%, var(--blubooks-dark-2) 100%); color: var(--blubooks-white); padding: var(--space-32) 0 var(--space-16) 0; } .footer__content { display: grid; grid-template-columns: 2fr 1fr; gap: var(--space-32); margin-bottom: var(--space-32); } .footer__logo { font-size: var(--font-size-2xl); color: var(--blubooks-light-2); margin-bottom: var(--space-8); } .footer__tagline { font-size: var(--font-size-md); color: rgba(188, 230, 245, 0.8); margin-bottom: var(--space-16); font-weight: var(--font-weight-medium); } .footer__brand p { color: var(--blubooks-text-light); line-height: var(--line-height-normal); } .footer__contact h4 { color: var(--blubooks-light-2); margin-bottom: var(--space-16); } .contact-info p { margin-bottom: var(--space-8); color: var(--blubooks-text-light); } .contact-info a { color: var(--blubooks-light-2); text-decoration: none; } .contact-info a:hover { color: var(--blubooks-white); text-decoration: underline; } .footer__bottom { text-align: center; padding-top: var(--space-16); border-top: 1px solid rgba(130, 181, 193, 0.3); color: rgba(255, 255, 255, 0.7); font-size: var(--font-size-sm); } /* Responsive Design */ @media (max-width: 768px) { .nav__list { display: none; position: absolute; top: 100%; left: 0; right: 0; background: var(--blubooks-dark-2); flex-direction: column; padding: var(--space-16); gap: var(--space-16); box-shadow: var(--shadow-lg); } .nav__list.active { display: flex; } .nav__toggle { display: flex; } .hero__title { font-size: var(--font-size-3xl); } .hero__subtitle { font-size: var(--font-size-lg); } .blog-content__text { font-size: var(--font-size-md); } .intro-text { font-size: var(--font-size-lg); } .cta-buttons { flex-direction: column; align-items: center; } .footer__content { grid-template-columns: 1fr; gap: var(--space-24); } .services__grid { grid-template-columns: 1fr; } .hero__meta { flex-direction: column; gap: var(--space-8); } } @media (max-width: 480px) { .hero { padding: var(--space-24) 0; } .hero__title { font-size: var(--font-size-2xl); } .cta-section { padding: var(--space-24); } .final-cta { padding: var(--space-24); } .service-card { padding: var(--space-16); } .blog-content { padding: var(--space-24) 0; } .featured-image { padding: var(--space-24) 0; } .services { padding: var(--space-24) 0; } .about { padding: var(--space-24) 0; } } /* Smooth scrolling */ html { scroll-behavior: smooth; } /* Focus styles for accessibility */ .btn:focus-visible { box-shadow: var(--focus-ring); } .nav__link:focus-visible { outline: 2px solid var(--blubooks-light-2); outline-offset: 2px; border-radius: var(--radius-sm); } /* Progress bar for scroll indicator */ .scroll-progress { position: fixed; top: 0; left: 0; width: 0%; height: 3px; background: linear-gradient(90deg, var(--blubooks-light-1), var(--blubooks-light-2)); z-index: 9999; transition: width 0.3s ease; } /* Loading animation for images */ img { transition: opacity 0.3s ease; }

Introduction

Every entrepreneur has a dream of creating their own business. Some want to start their own online store using eCommerce software, and some want to sell products on Amazon FBA. If you're wondering what the ideal software stack for an eCommerce store is, this article will shed some light on that topic!

Xero / Quickbooks

When it comes to accounting software, Xero is the best choice for those who sell with PayPal, especially in multiple currencies. The direct Xero integration with Paypal makes things seamless and easy, Quickbooks just does not have this functionality.

Quickbooks is better suited for invoicing, but it doesn’t integrate well with online stores like Shopify, WooCommerce or Amazon. Quickbooks has more all-in-one services that can streamline your entire business process from Accounting to Inventory Management so if you want something that does it all then this might be a good choice for you—but keep in mind there will be less functionality.

Hubdoc / Receipt Bank

Receipt Bank is a cloud-based receipt scanning and management solution that includes everything you need to track receipts, create expense reports, and submit your expenses electronically. The software does cost a bit of money but is a quality product. Hubdoc does all the same things and is free to use with Xero subscription! However you are missing out on some organizational tools such as categorizing receipts into categories automatically.

With Hubdoc you can:

  • Read receipts and import transactions into Xero
  • Get an instant view of all transactions in one place using the document feeder or drag-and-drop functionality
  • Integrate the expense report templates into Hubdoc so that they’re automatically populated with data from Xero

A2X / Link My Books

Both A2X and Link My Books help post entries into your accounting software, but A2X is quite a bit more expensive

  • A2X has been around longer, which means it has more integrations and a better track record with reliability.
  • The cost of Link My Books is much lower than A2X, but the real savings come when you factor in how many hours you can save by not having to spend time on manual data entry. As bookkeepers we love working with both softwares and they help us provide accurate financials for a reasonable price

Shopify or Amazon FBA

Shopify is a great option for eCommerce entrepreneurs who want to focus on developing their brand, rather than chasing orders. With Shopify, you can build an entire store and then let it do the heavy lifting—order management, fulfilment tracking, SEO and marketing, almost everything but shipping orders yourself!

Amazon FBA offers another option that’s popular with many entrepreneurs: hands-free selling on Amazon's marketplace. While it does come with some downsides, such as losing control over your brand identity or having less flexibility in how you sell products, there are plenty of benefits as well: Amazon will handle almost all aspects of running your business including shipping!

Conclusion

If you want to start an eCommerce business, then the software stack is the place to start. The right stack can make a world of difference. Luckily there are many great companies that have great tools in place! Whenever you're ready we at Blubooks are here to help bring it all together and create tax ready financials for your business.

Your Business is Global. Your Accounting should be too.

Sign up today to speak with one of our accountants and learn how we can take take care of your financials.

Get started