Files
tilbudgivern/build/static/css/main.df837bb1.css.map
T
alex 8ad6c494fb Add mock server and database for Bygma pricing test
- Implemented a mock Express server in `mock-bygma-test.js` to simulate Bygma's web price search API with sample data.
- Created a new SQL file `standard_material_prices.sql` containing standard market prices for various construction materials.
- Added initial files for frontend server and pricing test components.
2025-09-15 00:13:47 +02:00

1 line
24 KiB
Plaintext

{"version":3,"file":"static/css/main.df837bb1.css","mappings":"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","sources":["index.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f5f5f5;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.header {\n text-align: center;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: relative;\n}\n\n.header h1 {\n color: #2c3e50;\n margin: 0 0 10px 0;\n font-size: 2.5em;\n}\n\n.header p {\n color: #7f8c8d;\n margin: 0;\n font-size: 1.1em;\n}\n\n.ai-budget-bar {\n position: absolute;\n top: 10px;\n right: 20px;\n background: #ecf0f1;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.budget-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.budget-label {\n color: #34495e;\n}\n\n.budget-used {\n color: #27ae60;\n font-weight: bold;\n}\n\n.budget-separator {\n color: #bdc3c7;\n}\n\n.budget-total {\n color: #34495e;\n font-weight: bold;\n}\n\n.budget-mini-bar {\n width: 60px;\n height: 4px;\n background: #ecf0f1;\n border-radius: 2px;\n overflow: hidden;\n}\n\n.budget-mini-fill {\n height: 100%;\n transition: width 0.3s ease;\n}\n\n.budget-tokens {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.budget-refresh-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1em;\n padding: 2px;\n border-radius: 3px;\n transition: background-color 0.2s;\n}\n\n.budget-refresh-btn:hover {\n background-color: #bdc3c7;\n}\n\n.nav-buttons {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin: 20px 0;\n flex-wrap: wrap;\n}\n\n.nav-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.3s ease;\n font-size: 0.95em;\n}\n\n.nav-btn:hover {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.nav-btn.active {\n background: #27ae60;\n}\n\n.logout-btn {\n position: absolute;\n top: 20px;\n left: 20px;\n background: #e74c3c;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n}\n\n.logout-btn:hover {\n background: #c0392b;\n}\n\n.login-form {\n max-width: 400px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n}\n\n.login-form h2 {\n text-align: center;\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.login-form p {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n color: #34495e;\n font-weight: 500;\n}\n\n.form-group input,\n.form-group textarea,\n.form-group select {\n width: 100%;\n padding: 12px;\n border: 2px solid #ecf0f1;\n border-radius: 6px;\n font-size: 16px;\n transition: border-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group textarea:focus,\n.form-group select:focus {\n outline: none;\n border-color: #3498db;\n}\n\n.form-group textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-row {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.form-row .form-group {\n flex: 1;\n min-width: 250px;\n}\n\n.btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn.btn-secondary {\n background: #95a5a6;\n}\n\n.btn.btn-secondary:hover:not(:disabled) {\n background: #7f8c8d;\n}\n\n.btn.btn-small {\n padding: 6px 12px;\n font-size: 14px;\n width: auto;\n}\n\n.btn.btn-primary {\n background: #3498db;\n}\n\n.btn.btn-primary:hover:not(:disabled) {\n background: #2980b9;\n}\n\n.btn.btn-danger {\n background: #e74c3c;\n}\n\n.btn.btn-danger:hover:not(:disabled) {\n background: #c0392b;\n}\n\n.error {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 6px;\n margin: 20px 0;\n border: 1px solid #f5c6cb;\n}\n\n.quote-form {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n}\n\n.quote-form h2 {\n color: #2c3e50;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.loading {\n text-align: center;\n padding: 50px 20px;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.loading-animation {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n}\n\n.loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #ecf0f1;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text h3 {\n color: #2c3e50;\n margin: 0 0 15px 0;\n}\n\n.loading-steps {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.loading-steps .step {\n color: #bdc3c7;\n transition: color 0.3s ease;\n}\n\n.loading-steps .step.active {\n color: #27ae60;\n font-weight: 500;\n}\n\n.loading-progress {\n margin-top: 30px;\n}\n\n.progress-bar {\n width: 100%;\n height: 6px;\n background: #ecf0f1;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #3498db, #27ae60);\n border-radius: 3px;\n animation: progress 20s ease-in-out;\n}\n\n@keyframes progress {\n 0% { width: 0%; }\n 100% { width: 100%; }\n}\n\n.loading-time {\n color: #7f8c8d;\n margin-top: 10px;\n font-style: italic;\n}\n\n.quote-result {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 30px;\n}\n\n.quote-result h2 {\n color: #27ae60;\n margin-bottom: 20px;\n}\n\n.quote-result div {\n white-space: pre-line;\n line-height: 1.6;\n color: #2c3e50;\n font-size: 15px;\n}\n\n.quote-actions {\n display: flex;\n gap: 15px;\n margin-top: 30px;\n flex-wrap: wrap;\n}\n\n.quote-actions .btn {\n flex: 1;\n min-width: 200px;\n}\n\n.feedback-section {\n margin-top: 30px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #3498db;\n}\n\n.feedback-section h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.upload-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.upload-form {\n margin-bottom: 30px;\n}\n\n.file-info {\n color: #27ae60;\n font-style: italic;\n margin-top: 8px;\n}\n\n.upload-status {\n padding: 15px;\n border-radius: 6px;\n margin: 20px 0;\n}\n\n.upload-status.success {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.upload-status.error {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.parse-results {\n margin-top: 15px;\n padding: 15px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n}\n\n.parse-results ul {\n margin: 10px 0;\n padding-left: 20px;\n}\n\n.recent-uploads {\n margin: 30px 0;\n}\n\n.recent-uploads h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.uploads-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.upload-name {\n font-weight: 500;\n color: #2c3e50;\n flex: 1;\n}\n\n.upload-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.upload-type {\n background: #ecf0f1;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n color: #34495e;\n}\n\n.upload-date {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.materials-overview {\n margin-top: 30px;\n}\n\n.materials-overview h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.materials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.material-item {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.material-item strong {\n color: #2c3e50;\n display: block;\n margin-bottom: 8px;\n}\n\n.material-item .price {\n color: #27ae60;\n font-weight: 500;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .category {\n color: #3498db;\n font-size: 0.9em;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .supplier {\n color: #7f8c8d;\n font-size: 0.85em;\n}\n\n.more-items {\n text-align: center;\n color: #7f8c8d;\n font-style: italic;\n margin-top: 15px;\n}\n\n.pricing-management-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.pricing-management-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.pricing-management-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.category-selector {\n margin-bottom: 20px;\n}\n\n.category-selector label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.category-selector select {\n width: 100%;\n max-width: 300px;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n margin-bottom: 10px;\n}\n\n.web-search-btn {\n background: linear-gradient(135deg, #3498db, #2980b9);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: all 0.3s ease;\n margin-left: 10px;\n}\n\n.web-search-btn:hover {\n background: linear-gradient(135deg, #2980b9, #3498db);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3);\n}\n\n.web-search-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.add-price-form {\n margin-bottom: 40px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.add-price-form h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-list {\n margin-top: 30px;\n}\n\n.prices-list h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n}\n\n.price-item {\n padding: 20px;\n background: white;\n border-radius: 8px;\n border: 1px solid #ecf0f1;\n box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n transition: box-shadow 0.3s ease;\n}\n\n.price-item:hover {\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n\n.price-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n}\n\n.price-header strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.price-value {\n color: #27ae60;\n font-weight: bold;\n font-size: 1.1em;\n}\n\n.price-details {\n margin-bottom: 15px;\n}\n\n.price-details p {\n margin: 5px 0;\n color: #34495e;\n font-size: 0.95em;\n}\n\n.price-date {\n color: #7f8c8d;\n font-size: 0.85em;\n margin-bottom: 15px;\n}\n\n.price-actions {\n display: flex;\n gap: 10px;\n}\n\n.edit-form {\n border: 2px solid #3498db;\n border-radius: 8px;\n padding: 15px;\n background: #f8f9fa;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n margin-top: 15px;\n}\n\n.no-data {\n text-align: center;\n padding: 40px 20px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.usage-overview {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n background: white;\n padding: 25px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.stat-card h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n font-size: 1.2em;\n}\n\n.budget-info p,\n.token-info p,\n.general-info p {\n margin: 8px 0;\n color: #34495e;\n}\n\n.budget-bar,\n.token-bar {\n width: 100%;\n height: 12px;\n background: #ecf0f1;\n border-radius: 6px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.budget-fill,\n.token-fill {\n height: 100%;\n transition: width 0.3s ease;\n border-radius: 6px;\n}\n\n.budget-percent,\n.token-percent {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.warning-level {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.warning-level.low {\n background: #d4edda;\n color: #155724;\n}\n\n.warning-level.medium {\n background: #fff3cd;\n color: #856404;\n}\n\n.warning-level.high {\n background: #f8d7da;\n color: #721c24;\n}\n\n.refresh-section {\n text-align: center;\n margin-top: 30px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n}\n\n.last-update {\n color: #7f8c8d;\n font-size: 0.9em;\n margin-top: 15px;\n}\n\n.loading-usage {\n text-align: center;\n padding: 50px 20px;\n color: #7f8c8d;\n}\n\n@media (max-width: 768px) {\n .container {\n padding: 15px;\n }\n \n .header {\n padding: 15px;\n }\n \n .ai-budget-bar {\n position: static;\n margin-top: 15px;\n justify-content: center;\n }\n \n .logout-btn {\n position: static;\n margin-bottom: 15px;\n }\n \n .nav-buttons {\n flex-direction: column;\n align-items: center;\n }\n \n .nav-btn {\n width: 100%;\n max-width: 300px;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .form-row .form-group {\n min-width: auto;\n }\n \n .quote-actions {\n flex-direction: column;\n }\n \n .quote-actions .btn {\n min-width: auto;\n }\n \n .prices-grid {\n grid-template-columns: 1fr;\n }\n \n .usage-overview {\n grid-template-columns: 1fr;\n }\n \n .materials-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Web Search Approval Dialog */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.approval-dialog {\n background: white;\n border-radius: 12px;\n padding: 30px;\n max-width: 700px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.approval-dialog h3 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n font-size: 1.4em;\n}\n\n.approval-dialog p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.approval-list {\n margin-bottom: 25px;\n}\n\n.approval-item {\n border: 2px solid #ecf0f1;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n}\n\n.approval-item:hover {\n border-color: #3498db;\n box-shadow: 0 2px 8px rgba(52, 152, 219, 0.1);\n}\n\n.approval-checkbox {\n display: flex;\n align-items: flex-start;\n padding: 15px;\n cursor: pointer;\n gap: 12px;\n}\n\n.approval-checkbox input[type=\"checkbox\"] {\n margin: 4px 0 0 0;\n transform: scale(1.2);\n}\n\n.approval-details {\n flex: 1;\n}\n\n.approval-main {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.approval-main strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.approval-price {\n background: #e8f5e8;\n color: #27ae60;\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: bold;\n font-size: 0.9em;\n}\n\n.approval-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 8px;\n}\n\n.approval-source {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.approval-confidence {\n color: #8e44ad;\n font-size: 0.9em;\n font-weight: 500;\n}\n\n.approval-notes {\n background: #f8f9fa;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85em;\n color: #6c757d;\n border-left: 3px solid #dee2e6;\n}\n\n.approval-actions {\n display: flex;\n gap: 15px;\n justify-content: flex-end;\n margin-top: 25px;\n padding-top: 20px;\n border-top: 1px solid #ecf0f1;\n}\n\n.approval-actions .btn {\n min-width: 120px;\n}\n\n.btn-primary:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n@media (max-width: 768px) {\n .approval-dialog {\n padding: 20px;\n margin: 20px;\n }\n \n .approval-main {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .approval-meta {\n flex-direction: column;\n gap: 5px;\n }\n \n .approval-actions {\n flex-direction: column-reverse;\n }\n}\n"],"names":[],"sourceRoot":""}