├── postcss.config.js ├── renovate.json ├── .claude └── settings.local.json ├── src ├── main.js ├── router │ └── index.js ├── components │ ├── AllocationResult.vue │ └── AllocationInput.vue ├── stores │ └── allocation.js ├── assets │ └── main.css ├── App.vue └── views │ ├── AboutView.vue │ ├── CalculatorView.vue │ └── ConfigurationView.vue ├── tailwind.config.js.bak ├── .gitignore ├── index.html ├── package.json ├── public ├── manifest.json ├── favicon.ico ├── icon-192.png └── icon-512.png ├── .github └── workflows │ └── build.yml ├── LICENSE ├── vite.config.js └── README.md /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | '@tailwindcss/postcss': {}, 4 | }, 5 | } -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.claude/settings.local.json: -------------------------------------------------------------------------------- 1 | { 2 | "permissions": { 3 | "allow": [ 4 | "Bash(gh pr view:*)", 5 | "Bash(gh pr diff:*)", 6 | "Bash(gh pr checks:*)", 7 | "Bash(gh pr list:*)", 8 | "WebSearch" 9 | ], 10 | "deny": [], 11 | "ask": [] 12 | } 13 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import { createPinia } from 'pinia' 3 | import App from './App.vue' 4 | import router from './router' 5 | import './assets/main.css' 6 | 7 | const app = createApp(App) 8 | 9 | app.use(createPinia()) 10 | app.use(router) 11 | 12 | app.mount('#app') -------------------------------------------------------------------------------- /tailwind.config.js.bak: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{vue,js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: { 9 | colors: { 10 | 'profit-green': '#10b981', 11 | 'tax-blue': '#3b82f6', 12 | 'owner-purple': '#8b5cf6', 13 | 'opex-orange': '#f97316', 14 | } 15 | }, 16 | }, 17 | plugins: [], 18 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | # Environment files 27 | .env 28 | .env.local 29 | .env.production 30 | 31 | # Build files 32 | *.tsbuildinfo -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | PFCalc - Profit First Calculator 12 | 13 | 14 |
15 | 16 | 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pfcalc", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Profit First Calculator - A Progressive Web App for calculating business allocations", 6 | "type": "module", 7 | "scripts": { 8 | "dev": "vite", 9 | "build": "vite build", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "pinia": "^3.0.0", 14 | "vue": "^3.5.13", 15 | "vue-router": "^4.5.0" 16 | }, 17 | "devDependencies": { 18 | "@tailwindcss/postcss": "^4.1.12", 19 | "@vitejs/plugin-vue": "^6.0.0", 20 | "autoprefixer": "^10.4.20", 21 | "postcss": "^8.4.49", 22 | "tailwindcss": "^4.0.0", 23 | "vite": "^7.0.0", 24 | "vite-plugin-pwa": "^1.0.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import CalculatorView from '../views/CalculatorView.vue' 3 | import ConfigurationView from '../views/ConfigurationView.vue' 4 | import AboutView from '../views/AboutView.vue' 5 | 6 | const router = createRouter({ 7 | history: createWebHistory(import.meta.env.BASE_URL), 8 | routes: [ 9 | { 10 | path: '/', 11 | name: 'calculator', 12 | component: CalculatorView 13 | }, 14 | { 15 | path: '/config', 16 | name: 'configuration', 17 | component: ConfigurationView 18 | }, 19 | { 20 | path: '/about', 21 | name: 'about', 22 | component: AboutView 23 | } 24 | ] 25 | }) 26 | 27 | export default router -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "PFCalc - Profit First Calculator", 3 | "short_name": "PFCalc", 4 | "description": "Calculate your business allocations using the Profit First methodology", 5 | "theme_color": "#10b981", 6 | "background_color": "#ffffff", 7 | "display": "standalone", 8 | "orientation": "portrait", 9 | "scope": "/", 10 | "start_url": "/", 11 | "icons": [ 12 | { 13 | "src": "/icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "/icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "/icon-512.png", 24 | "sizes": "512x512", 25 | "type": "image/png", 26 | "purpose": "any maskable" 27 | } 28 | ], 29 | "categories": ["business", "finance", "productivity"] 30 | } -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v4 15 | 16 | - name: Setup Node.js 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: '20' 20 | cache: 'npm' 21 | 22 | - name: Cache dependencies 23 | uses: actions/cache@v4 24 | with: 25 | path: ~/.npm 26 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 27 | restore-keys: | 28 | ${{ runner.os }}-node- 29 | 30 | - name: Install dependencies 31 | run: npm ci 32 | 33 | - name: Build 34 | run: npm run build 35 | 36 | - name: Upload build artifacts 37 | uses: actions/upload-artifact@v4 38 | with: 39 | name: dist 40 | path: dist 41 | retention-days: 7 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Kevin Griffin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | import { VitePWA } from 'vite-plugin-pwa' 4 | 5 | export default defineConfig({ 6 | plugins: [ 7 | vue(), 8 | VitePWA({ 9 | registerType: 'autoUpdate', 10 | includeAssets: ['favicon.ico', 'apple-touch-icon.png', 'masked-icon.svg'], 11 | manifest: { 12 | name: 'PFCalc - Profit First Calculator', 13 | short_name: 'PFCalc', 14 | description: 'Calculate your business allocations using the Profit First methodology', 15 | theme_color: '#10b981', 16 | background_color: '#ffffff', 17 | display: 'standalone', 18 | orientation: 'portrait', 19 | scope: '/', 20 | start_url: '/', 21 | icons: [ 22 | { 23 | src: '/icon-192.png', 24 | sizes: '192x192', 25 | type: 'image/png' 26 | }, 27 | { 28 | src: '/icon-512.png', 29 | sizes: '512x512', 30 | type: 'image/png' 31 | }, 32 | { 33 | src: '/icon-512.png', 34 | sizes: '512x512', 35 | type: 'image/png', 36 | purpose: 'any maskable' 37 | } 38 | ] 39 | }, 40 | workbox: { 41 | globPatterns: ['**/*.{js,css,html,ico,png,svg}'], 42 | runtimeCaching: [ 43 | { 44 | urlPattern: /^https:\/\/fonts\.googleapis\.com/, 45 | handler: 'CacheFirst', 46 | options: { 47 | cacheName: 'google-fonts-stylesheets', 48 | }, 49 | }, 50 | { 51 | urlPattern: /^https:\/\/fonts\.gstatic\.com/, 52 | handler: 'CacheFirst', 53 | options: { 54 | cacheName: 'google-fonts-webfonts', 55 | expiration: { 56 | maxEntries: 30, 57 | maxAgeSeconds: 60 * 60 * 24 * 365 58 | }, 59 | }, 60 | }, 61 | ], 62 | }, 63 | }) 64 | ], 65 | }) -------------------------------------------------------------------------------- /src/components/AllocationResult.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | -------------------------------------------------------------------------------- /src/components/AllocationInput.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 73 | 74 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PFCalc - Profit First Calculator 2 | 3 | A simple, privacy-focused calculator for implementing the Profit First methodology in your business. Built by an entrepreneur, for entrepreneurs. 4 | 5 | 🚀 **Live App**: [Coming Soon] 6 | 7 | ## Features 8 | 9 | ### 🔒 Privacy First 10 | - **No sign-up required** - Start calculating immediately 11 | - **No tracking or analytics** - Your data stays private 12 | - **Works offline** - Once loaded, works without internet 13 | - **Local storage only** - All settings saved in your browser 14 | 15 | ### 💼 Business Features 16 | - **Instant calculations** - Enter income, see allocations immediately 17 | - **Customizable percentages** - Adjust allocations to fit your business 18 | - **Add/remove categories** - Create custom allocation categories 19 | - **Persistent settings** - Remembers your income and percentages 20 | 21 | ### 📱 Progressive Web App 22 | - **Install on any device** - Works like a native app 23 | - **Responsive design** - Perfect on desktop, tablet, or mobile 24 | - **Offline capable** - Calculate allocations anywhere 25 | 26 | ## Default Allocations 27 | 28 | Based on Profit First recommendations for businesses under $250K revenue: 29 | 30 | - **Profit**: 5% 31 | - **Owner's Pay**: 50% 32 | - **Tax**: 15% 33 | - **Operating Expenses**: 30% 34 | 35 | ## Technology Stack 36 | 37 | - **Vue 3** - Modern reactive framework 38 | - **Vite** - Lightning-fast build tool 39 | - **Tailwind CSS** - Utility-first styling 40 | - **Pinia** - State management 41 | - **PWA** - Progressive Web App capabilities 42 | 43 | ## Local Development 44 | 45 | ### Prerequisites 46 | - Node.js 16+ 47 | - npm or yarn 48 | 49 | ### Installation 50 | 51 | ```bash 52 | # Clone the repository 53 | git clone https://github.com/1kevgriff/pfcalc.git 54 | cd pfcalc 55 | 56 | # Install dependencies 57 | npm install 58 | 59 | # Start development server 60 | npm run dev 61 | ``` 62 | 63 | The app will be available at `http://localhost:5173` 64 | 65 | ### Build for Production 66 | 67 | ```bash 68 | # Create production build 69 | npm run build 70 | 71 | # Preview production build 72 | npm run preview 73 | ``` 74 | 75 | ## About Profit First 76 | 77 | Profit First is a cash management system developed by Mike Michalowicz that helps businesses achieve profitability by flipping the traditional accounting formula: 78 | 79 | **Traditional**: Sales - Expenses = Profit 80 | **Profit First**: Sales - Profit = Expenses 81 | 82 | By allocating profit first, you ensure your business remains profitable from day one. 83 | 84 | Learn more at [profitfirstbook.com](https://profitfirstbook.com) 85 | 86 | ## Author 87 | 88 | **Kevin Griffin** 89 | Consultant and entrepreneur who has been successfully implementing Profit First in his consulting business for years. 90 | 91 | - Website: [consultwithgriff.com](https://consultwithgriff.com) 92 | - X/Twitter: [@1kevgriff](https://x.com/1kevgriff) 93 | - Bluesky: [@consultwithgriff.com](https://bsky.app/profile/consultwithgriff.com) 94 | - LinkedIn: [/in/1kevgriff](https://www.linkedin.com/in/1kevgriff) 95 | 96 | ## License 97 | 98 | MIT License - See [LICENSE](LICENSE) file for details 99 | 100 | ## Contributing 101 | 102 | Contributions are welcome! Please feel free to submit a Pull Request. 103 | 104 | ## Acknowledgments 105 | 106 | - Mike Michalowicz for creating the Profit First methodology 107 | - The Vue.js team for an amazing framework 108 | - All entrepreneurs using Profit First to build sustainable businesses 109 | 110 | --- 111 | 112 | *Built with ❤️ for the entrepreneurial community* -------------------------------------------------------------------------------- /src/stores/allocation.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { ref, computed, watch } from 'vue' 3 | 4 | export const useAllocationStore = defineStore('allocation', () => { 5 | const defaultAllocations = [ 6 | { id: 'profit', name: 'Profit', percentage: 5, color: 'bg-profit-green' }, 7 | { id: 'owners-pay', name: "Owner's Pay", percentage: 50, color: 'bg-owner-purple' }, 8 | { id: 'tax', name: 'Tax', percentage: 15, color: 'bg-tax-blue' }, 9 | { id: 'opex', name: 'Operating Expenses', percentage: 30, color: 'bg-opex-orange' } 10 | ] 11 | 12 | const allocations = ref(loadAllocations()) 13 | const incomeAmount = ref(loadIncomeAmount()) 14 | 15 | function loadAllocations() { 16 | const saved = localStorage.getItem('pfcalc-allocations') 17 | if (saved) { 18 | try { 19 | const parsed = JSON.parse(saved) 20 | if (Array.isArray(parsed) && parsed.length > 0) { 21 | return parsed 22 | } 23 | } catch (e) { 24 | console.error('Failed to load allocations from localStorage:', e) 25 | } 26 | } 27 | return [...defaultAllocations] 28 | } 29 | 30 | function loadIncomeAmount() { 31 | const saved = localStorage.getItem('pfcalc-income') 32 | if (saved) { 33 | try { 34 | const amount = parseFloat(saved) 35 | if (!isNaN(amount) && amount >= 0) { 36 | return amount 37 | } 38 | } catch (e) { 39 | console.error('Failed to load income amount from localStorage:', e) 40 | } 41 | } 42 | return 0 43 | } 44 | 45 | function saveAllocations() { 46 | localStorage.setItem('pfcalc-allocations', JSON.stringify(allocations.value)) 47 | } 48 | 49 | function saveIncomeAmount() { 50 | localStorage.setItem('pfcalc-income', incomeAmount.value.toString()) 51 | } 52 | 53 | watch(allocations, saveAllocations, { deep: true }) 54 | watch(incomeAmount, saveIncomeAmount) 55 | 56 | const totalPercentage = computed(() => { 57 | return allocations.value.reduce((sum, alloc) => sum + alloc.percentage, 0) 58 | }) 59 | 60 | const isValid = computed(() => { 61 | return Math.abs(totalPercentage.value - 100) < 0.01 62 | }) 63 | 64 | const calculatedAmounts = computed(() => { 65 | return allocations.value.map(alloc => ({ 66 | ...alloc, 67 | amount: (incomeAmount.value * alloc.percentage) / 100 68 | })) 69 | }) 70 | 71 | function updateAllocation(id, percentage) { 72 | const allocation = allocations.value.find(a => a.id === id) 73 | if (allocation) { 74 | allocation.percentage = Math.max(0, Math.min(100, percentage)) 75 | } 76 | } 77 | 78 | function addAllocation(name) { 79 | const id = name.toLowerCase().replace(/\s+/g, '-') 80 | const colors = ['bg-green-500', 'bg-blue-500', 'bg-purple-500', 'bg-orange-500', 'bg-pink-500', 'bg-yellow-500'] 81 | const color = colors[allocations.value.length % colors.length] 82 | 83 | allocations.value.push({ 84 | id, 85 | name, 86 | percentage: 0, 87 | color 88 | }) 89 | } 90 | 91 | function removeAllocation(id) { 92 | const index = allocations.value.findIndex(a => a.id === id) 93 | if (index > -1) { 94 | allocations.value.splice(index, 1) 95 | } 96 | } 97 | 98 | function resetToDefaults() { 99 | allocations.value = [...defaultAllocations] 100 | saveAllocations() 101 | } 102 | 103 | function updateAllocationName(id, newName) { 104 | const allocation = allocations.value.find(a => a.id === id) 105 | if (allocation) { 106 | allocation.name = newName 107 | } 108 | } 109 | 110 | function importConfiguration(importedAllocations, importedIncome) { 111 | // Replace allocations with imported ones 112 | allocations.value = importedAllocations.map(alloc => ({ 113 | id: alloc.id, 114 | name: alloc.name, 115 | percentage: alloc.percentage, 116 | color: alloc.color || 'bg-gray-500' 117 | })) 118 | 119 | // Set income amount if provided 120 | if (typeof importedIncome === 'number' && importedIncome >= 0) { 121 | incomeAmount.value = importedIncome 122 | } 123 | 124 | // Save to localStorage 125 | saveAllocations() 126 | saveIncomeAmount() 127 | } 128 | 129 | return { 130 | allocations, 131 | incomeAmount, 132 | totalPercentage, 133 | isValid, 134 | calculatedAmounts, 135 | updateAllocation, 136 | addAllocation, 137 | removeAllocation, 138 | resetToDefaults, 139 | updateAllocationName, 140 | importConfiguration 141 | } 142 | }) -------------------------------------------------------------------------------- /src/assets/main.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | 3 | @theme { 4 | --color-profit-green: #10b981; 5 | --color-tax-blue: #3b82f6; 6 | --color-owner-purple: #8b5cf6; 7 | --color-opex-orange: #f97316; 8 | --color-primary: #10b981; 9 | --color-primary-dark: #059669; 10 | --color-primary-light: #34d399; 11 | --color-accent: #6366f1; 12 | --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); 13 | --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1); 14 | --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1); 15 | --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1); 16 | --radius-sm: 0.375rem; 17 | --radius-md: 0.5rem; 18 | --radius-lg: 0.75rem; 19 | --radius-xl: 1rem; 20 | } 21 | 22 | @keyframes fadeIn { 23 | from { opacity: 0; transform: translateY(10px); } 24 | to { opacity: 1; transform: translateY(0); } 25 | } 26 | 27 | @keyframes slideIn { 28 | from { transform: translateX(-20px); opacity: 0; } 29 | to { transform: translateX(0); opacity: 1; } 30 | } 31 | 32 | @keyframes pulse { 33 | 0%, 100% { transform: scale(1); } 34 | 50% { transform: scale(1.05); } 35 | } 36 | 37 | @keyframes shimmer { 38 | 0% { background-position: -200% 0; } 39 | 100% { background-position: 200% 0; } 40 | } 41 | 42 | @keyframes float { 43 | 0%, 100% { transform: translateY(0px); } 44 | 50% { transform: translateY(-10px); } 45 | } 46 | 47 | @keyframes gradientShift { 48 | 0% { background-position: 0% 50%; } 49 | 50% { background-position: 100% 50%; } 50 | 100% { background-position: 0% 50%; } 51 | } 52 | 53 | .animate-fadeIn { 54 | animation: fadeIn 0.5s ease-out; 55 | } 56 | 57 | .animate-slideIn { 58 | animation: slideIn 0.3s ease-out; 59 | } 60 | 61 | .animate-pulse-subtle { 62 | animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; 63 | } 64 | 65 | .animate-float { 66 | animation: float 3s ease-in-out infinite; 67 | } 68 | 69 | .gradient-bg { 70 | background: linear-gradient(-45deg, #10b981, #34d399, #6ee7b7, #86efac); 71 | background-size: 400% 400%; 72 | animation: gradientShift 15s ease infinite; 73 | } 74 | 75 | .glass-effect { 76 | background: rgba(255, 255, 255, 0.95); 77 | backdrop-filter: blur(10px); 78 | border: 1px solid rgba(255, 255, 255, 0.2); 79 | } 80 | 81 | .hover-lift { 82 | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); 83 | } 84 | 85 | .hover-lift:hover { 86 | transform: translateY(-4px); 87 | box-shadow: var(--shadow-xl); 88 | } 89 | 90 | .btn-gradient { 91 | background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%); 92 | transition: all 0.3s ease; 93 | } 94 | 95 | .btn-gradient:hover { 96 | background: linear-gradient(135deg, var(--color-primary-light) 0%, var(--color-primary) 100%); 97 | transform: translateY(-2px); 98 | box-shadow: 0 10px 20px rgba(16, 185, 129, 0.3); 99 | } 100 | 101 | .text-gradient { 102 | background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%); 103 | -webkit-background-clip: text; 104 | -webkit-text-fill-color: transparent; 105 | background-clip: text; 106 | } 107 | 108 | .card-shine { 109 | position: relative; 110 | overflow: hidden; 111 | } 112 | 113 | .card-shine::before { 114 | content: ''; 115 | position: absolute; 116 | top: 0; 117 | left: -100%; 118 | width: 100%; 119 | height: 100%; 120 | background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); 121 | transition: left 0.5s ease; 122 | } 123 | 124 | .card-shine:hover::before { 125 | left: 100%; 126 | } 127 | 128 | .progress-bar { 129 | position: relative; 130 | overflow: hidden; 131 | background: #e5e7eb; 132 | border-radius: 9999px; 133 | } 134 | 135 | .progress-fill { 136 | height: 100%; 137 | transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1); 138 | background: linear-gradient(90deg, var(--color-primary) 0%, var(--color-primary-light) 100%); 139 | position: relative; 140 | overflow: hidden; 141 | } 142 | 143 | .progress-fill::after { 144 | content: ''; 145 | position: absolute; 146 | top: 0; 147 | left: 0; 148 | right: 0; 149 | bottom: 0; 150 | background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); 151 | background-size: 200% 100%; 152 | animation: shimmer 2s linear infinite; 153 | } 154 | 155 | .input-glow:focus { 156 | box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1), 0 0 20px rgba(16, 185, 129, 0.2); 157 | } 158 | 159 | *::-webkit-scrollbar { 160 | width: 8px; 161 | height: 8px; 162 | } 163 | 164 | *::-webkit-scrollbar-track { 165 | background: #f1f5f9; 166 | border-radius: 4px; 167 | } 168 | 169 | *::-webkit-scrollbar-thumb { 170 | background: linear-gradient(180deg, #10b981, #059669); 171 | border-radius: 4px; 172 | } 173 | 174 | *::-webkit-scrollbar-thumb:hover { 175 | background: linear-gradient(180deg, #34d399, #10b981); 176 | } 177 | 178 | .pattern-dots { 179 | background-image: radial-gradient(circle, #10b981 1px, transparent 1px); 180 | background-size: 20px 20px; 181 | opacity: 0.05; 182 | } -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 74 | 75 | 80 | 81 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- 1 | AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAPw/AAD8PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEyCYAxwgnwNmIp8DRSKfAzkimwMRIpUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJJ5oCByKGA2wguARRImqGwEaqxhtJqdvZSardfEeq2G9IqtjaSKraxkmr3dhKq9ysSavbJEl2/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEy+aAhcukgRqIrAPaSHBQcEasJbVRK/vd0es695JrO7aSavuz0qs7rFKrO5xSqzuBEqs7gBLre4AS63vAE2u8ABNru8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4imgSCHcJHvxyzjdNGsOp5SKzuz0mr7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S6zu/0ut7/9MrfD/Ta7v/02u7/9Nru//Ta7vAE2u7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASyeYAhcnmQVdIbg0vyC13dRGse5jSavt2Ums7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9Lre//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7vAE2u7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRI5kGTyGdA44evAdrIcBT0CmozMdFsvNzSa3utEqr7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S63v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7vAE2u7wAAAAAAAAAAAAAAAAAAAAAAkBfhBI4c0AqUIsdLuiKxutNEtPdjSa3u0Eqs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0ut7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7vAAAAAAAAAAAAAAAADEIqkQsLRCuOHoMfxHObJMzJ1EOz72hJre7jSqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S63v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7vAAAAABpELJASEkMroT9qILRSXCCwcc0tvM/WQ7LwZEmr7uhKrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9Lre//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta3vAEkmmwYVRiqkwBmxlzlSIrZkeSO6sNdCtPVoSazuzkms7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0ut7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//EzCXCBdALJ+8GrGjLUsgs21sI7qc3D6z7GZJrO7JSqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S63v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/8YRCueEzortxaIJN5llSTA1Uc/sOCLR7D1f0qt7dhKrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9Lre//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/xk9LKZMeyOvUgAAyR2RJOvSSa3uf0mr7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S63v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/8VPiqnUHYivlIAAOczjyfi2kmr7nNJq+79Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0ut7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//FUIrnU17I65SAADnNoQh4OJJre5cSavusEqs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9Lre//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/xdDK5tKdyKtOBsAyRyOJOvSSazu+kqs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S63v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/8YRCueFDsruwCBJPGamCTS1UY/sd+DSa3zqEms7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9Lre//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/yxFK5QAMCmlBYkm1o+SJMnYRDu071RJqO7OSqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0ut7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//RT6YBxRIK5oAXCLMo5Mjr9NAse1mSKvu50ms7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9Lre//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7vAFEdpAcQSSybAGcjwauLJbHGPqzyfEmr7udKrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9Lre//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta3vAAAAAABIJpkLDD4tgnltI6qOei21ytJEtPFmSa3u0kms7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S63v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7wAAAAAAAAAAAAAAAAAOPS6EAHQjyoaYJcfJ0kOy7GVJru7ISqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0ut7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru8AAAAAAAAAAAAAAAAAAAAAACw/oQAAhCTkl5okwtE+su9lSazu0kqs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0ut7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFM5wEAHYl0quLKbDAQbDujUms7uJKrO7/Sqzu/0qs7v9KrO7/Sqzu/0qs7v9KrO7/S63v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEqsAoAYCWusFkop6VFrOq8Sa3u6Uqs7v9KrO7/Sqzu/0qs7v9KrO7/Sqzu/0ut7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru//Ta7v/02u7/9Nru8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZCq0BRFPKFZwXyqjckmn0ohJqepwSqvsmkqs7LhKrOzOSqzs00us7dBMre3NTa7vyU2u78NNru+5Ta7vqE2u74hNru9STa7vKE2u7xRNru8GTa7vAE2u7wBNru8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////AAD///////8AAP///////wAA/////wf/AAD////wA/8AAP///8AD/wAA////AAH/AACA//8AAP8AAIA//wAAfwAAgB//AAA/AAAAHwAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/AAAAvwAAAL8AAIA/AAAAPwAAgD8AAP8/AACA/wAA/z8AAOD/AAH/PwAA+P8AB/8/AAD8/wAf/z8AAP//AH//PwAA////////AAD///////8AAP///////wAA////////AAA= -------------------------------------------------------------------------------- /public/icon-192.png: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /src/views/AboutView.vue: -------------------------------------------------------------------------------- 1 | 114 | 115 | -------------------------------------------------------------------------------- /src/views/CalculatorView.vue: -------------------------------------------------------------------------------- 1 | 130 | 131 | -------------------------------------------------------------------------------- /src/views/ConfigurationView.vue: -------------------------------------------------------------------------------- 1 | 141 | 142 | -------------------------------------------------------------------------------- /public/icon-512.png: -------------------------------------------------------------------------------- 1 | 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 --------------------------------------------------------------------------------