@archerjessop/utilities 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export{calculateAppreciatedValue,calculateAssignmentFee,calculateBalloonBalance,calculateCOCR30,calculateCOCRAtPercent,calculateCashFlow,calculateCashFlowYield,calculateCashOutAfterRefi,calculateDscrPayment,calculateNOIByType,calculateNetToBuyer,calculatePMT,calculatePriceForCOCR,calculateSfPayment}from"./financial/calculations.js";export{formatCurrency,formatPercentage,formatPriceValue}from"./financial/formatters.js";export{extractBedrooms,extractPhoneNumber}from"./data/extractors.js";export{calculateDOM}from"./date/utilities.js";export{calculateCursorPosition,extractNumericValue,filterNumericInput,formatInputDisplay,formatLiveInput,formatLiveNumber,parseNumericInput}from"./formatting/financial-formatting.js";export{CALCULATION_TOLERANCE,DEFAULT_CAP_RATE,DEFAULT_DOWN_PAYMENT,DEFAULT_DSCR_PERCENTAGE,DSCR_AMORTIZATION,DSCR_INTEREST_RATE,FINANCIAL_CONSTANTS,MAX_ITERATIONS,SELLER_FI_AMORTIZATION,SELLER_FI_CARRY,SELLER_FI_DOWN_PAYMENT,SELLER_FI_INTEREST_RATE}from"./config/financial.js";export{ASSISTED_LIVING,MULTIFAMILY,PROPERTY_TYPES,PROPERTY_TYPE_CONSTANTS,STR}from"./config/property-types.js";export{ASSIGNMENT_FEE_PERCENTAGE,BUSINESS_CONSTANTS,BUYER_AGENT_COMMISSION,CLOSING_COSTS_PERCENTAGE,CONSERVATIVE_COCR15_PRICE_MULTIPLIER,FINANCING_FEE_PERCENTAGE,MAX_COCR15_PRICE_MULTIPLIER,MINIMUM_COCR15_PRICE,NET_TO_BUYER_PERCENTAGE,SELLER_AGENT_COMMISSION}from"./config/business.js";
1
+ export{calculateAppreciatedValue,calculateAssignmentFee,calculateBalloonBalance,calculateCOCR30,calculateCOCRAtPercent,calculateCashFlow,calculateCashFlowYield,calculateCashOutAfterRefi,calculateDscrPayment,calculateNOIByType,calculateNetToBuyer,calculatePMT,calculatePriceForCOCR,calculateSfPayment}from"./financial/calculations.js";export{formatCurrency,formatPercentage,formatPriceValue}from"./financial/formatters.js";export{extractBedrooms,extractPhoneNumber}from"./data/extractors.js";export{calculateDOM}from"./date/utilities.js";export{calculateCursorPosition,extractNumericValue,filterNumericInput,formatInputDisplay,formatLiveInput,formatLiveNumber,parseNumericInput}from"./formatting/financial-formatting.js";export{CALCULATION_TOLERANCE,DEFAULT_CAP_RATE,DEFAULT_DOWN_PAYMENT,DEFAULT_DSCR_PERCENTAGE,DSCR_AMORTIZATION,DSCR_INTEREST_RATE,FINANCIAL_CONSTANTS,MAX_ITERATIONS,SELLER_FI_AMORTIZATION,SELLER_FI_CARRY,SELLER_FI_DOWN_PAYMENT,SELLER_FI_INTEREST_RATE}from"./config/financial.js";export{ASSISTED_LIVING,MULTIFAMILY,PROPERTY_TYPES,PROPERTY_TYPE_CONSTANTS,STR}from"./config/property-types.js";export{ASSIGNMENT_FEE_PERCENTAGE,BUSINESS_CONSTANTS,BUYER_AGENT_COMMISSION,CLOSING_COSTS_PERCENTAGE,CONSERVATIVE_COCR15_PRICE_MULTIPLIER,FINANCING_FEE_PERCENTAGE,MAX_COCR15_PRICE_MULTIPLIER,MINIMUM_COCR15_PRICE,NET_TO_BUYER_PERCENTAGE,SELLER_AGENT_COMMISSION}from"./config/business.js";export{injectDashboardStyles,injectFooterStyles,styles}from"./styles/browser.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ const r={variables:"/* Shared CSS custom properties - extracted from your existing styles */\r\n:root {\r\n /* Colors */\r\n --color-primary: #007bff;\r\n --color-primary-hover: #0056b3;\r\n --color-secondary: #6c757d;\r\n --color-success: #28a745;\r\n --color-warning: #ffc107;\r\n --color-danger: #dc3545;\r\n --color-info: #17a2b8;\r\n \r\n /* Backgrounds */\r\n --bg-primary: #ffffff;\r\n --bg-secondary: #f8f9fa;\r\n --bg-light: #ededed;\r\n --bg-dark: #343a40;\r\n \r\n /* Text Colors */\r\n --text-primary: #212529;\r\n --text-secondary: #6c757d;\r\n --text-muted: #495057;\r\n --text-white: #ffffff;\r\n \r\n /* Borders */\r\n --border-color: #ddd;\r\n --border-color-light: #e9ecef;\r\n --border-color-dark: #919090ff;\r\n \r\n /* Spacing */\r\n --spacing-xs: 4px;\r\n --spacing-sm: 8px;\r\n --spacing-md: 12px;\r\n --spacing-lg: 16px;\r\n --spacing-xl: 20px;\r\n --spacing-2xl: 24px;\r\n --spacing-3xl: 32px;\r\n \r\n /* Typography */\r\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\r\n --font-size-xs: 11px;\r\n --font-size-sm: 12px;\r\n --font-size-base: 14px;\r\n --font-size-md: 16px;\r\n --font-size-lg: 18px;\r\n --font-size-xl: 20px;\r\n --font-weight-normal: 400;\r\n --font-weight-medium: 500;\r\n --font-weight-semibold: 600;\r\n --font-weight-bold: 700;\r\n \r\n /* Border Radius */\r\n --border-radius-sm: 4px;\r\n --border-radius-md: 6px;\r\n --border-radius-lg: 8px;\r\n --border-radius-xl: 12px;\r\n \r\n /* Shadows */\r\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\r\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\r\n \r\n /* Z-index */\r\n --z-extension: 999999999;\r\n --z-modal: 1050;\r\n --z-dropdown: 1000;\r\n \r\n /* Transitions */\r\n --transition-fast: 150ms ease;\r\n --transition-base: 250ms ease;\r\n --transition-slow: 350ms ease;\r\n}",footer:"/* LoopNet Extension Footer - Extracted from content.js AS-IS */\r\n.ln-footer {\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n background: var(--bg-light, #ededed);\r\n border-top: 1px solid var(--border-color-dark, #919090ff);\r\n box-shadow: var(--shadow-lg, 0 -8px 32px rgba(0, 0, 0, 0.08));\r\n z-index: var(--z-extension, 999999999);\r\n padding: var(--spacing-lg, 16px) var(--spacing-2xl, 24px);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n font-size: var(--font-size-md, 16px);\r\n color: var(--text-primary, #212529);\r\n width: 100%;\r\n box-sizing: border-box;\r\n}\r\n\r\n.ln-footer-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n max-width: 1600px;\r\n margin: 0 auto;\r\n gap: var(--spacing-xl, 20px);\r\n}\r\n\r\n.ln-footer-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n flex: 1;\r\n width: 100%;\r\n}\r\n\r\n.ln-footer-right {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-lg, 16px);\r\n flex-shrink: 0;\r\n}\r\n\r\n.ln-metrics-grid {\r\n display: grid;\r\n grid-template-columns: repeat(9, 1fr);\r\n gap: var(--spacing-lg, 16px);\r\n align-items: start;\r\n}\r\n\r\n.ln-metric-column {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-metric {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n min-width: 0;\r\n}\r\n\r\n.ln-metric-label {\r\n font-size: var(--font-size-xs, 11px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n line-height: 1;\r\n}\r\n\r\n.ln-metric-value {\r\n font-weight: var(--font-weight-semibold, 600);\r\n font-size: var(--font-size-md, 16px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n line-height: 1.2;\r\n}\r\n\r\n.ln-price {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\n.ln-cashflow.negative {\r\n color: var(--color-danger, #dc3545);\r\n}\r\n\r\n.ln-cashflow.positive {\r\n color: var(--color-success, #28a745);\r\n}\r\n\r\n.ln-phone {\r\n color: var(--color-info, #17a2b8);\r\n cursor: pointer;\r\n text-decoration: underline;\r\n}\r\n\r\n.ln-phone:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-property-type-dropdown {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n background: var(--bg-primary, #ffffff);\r\n color: var(--text-primary, #212529);\r\n cursor: pointer;\r\n min-width: 120px;\r\n}\r\n\r\n.ln-property-type-dropdown:focus {\r\n outline: none;\r\n border-color: var(--color-primary, #007bff);\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.ln-export-button {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n font-weight: var(--font-weight-medium, 500);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-export-button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.ln-export-icon {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n}\r\n\r\n.ln-discount-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-discount-input {\r\n width: 60px;\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-sm, 12px);\r\n text-align: center;\r\n}\r\n\r\n.ln-discount-button {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n background: var(--color-secondary, #6c757d);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-xs, 11px);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-discount-button:hover {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-discount-button.active {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n@media (max-width: 1400px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(6, 1fr);\r\n }\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n .ln-footer {\r\n padding: var(--spacing-md, 12px) var(--spacing-lg, 16px);\r\n }\r\n \r\n .ln-footer-container {\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(4, 1fr);\r\n }\r\n \r\n .ln-footer-right {\r\n width: 100%;\r\n justify-content: flex-end;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metric-value {\r\n font-size: var(--font-size-base, 14px);\r\n }\r\n}",dashboard:"/* Dashboard styles - extracted from existing dashboard CSS AS-IS */\r\n\r\n/* Base dashboard styles */\r\n.dashboard-container {\r\n min-height: 100vh;\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n color: var(--text-primary, #212529);\r\n}\r\n\r\n.header {\r\n background: var(--bg-primary, white);\r\n padding: var(--spacing-xl, 20px) var(--spacing-2xl, 24px);\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\r\n}\r\n\r\n.header h1 {\r\n color: var(--color-primary, #007bff);\r\n margin-bottom: var(--spacing-xl, 20px);\r\n}\r\n\r\n.filters {\r\n display: flex;\r\n gap: var(--spacing-lg, 15px);\r\n flex-wrap: wrap;\r\n align-items: end;\r\n}\r\n\r\n.filter-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-xs, 5px);\r\n}\r\n\r\n.filter-group label {\r\n font-size: var(--font-size-sm, 12px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.filter-group input, .filter-group select {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n min-width: 120px;\r\n}\r\n\r\n.filter-group button {\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n cursor: pointer;\r\n}\r\n\r\n.filter-group button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.stats {\r\n display: flex;\r\n gap: var(--spacing-xl, 20px);\r\n margin-top: var(--spacing-xl, 20px);\r\n font-size: var(--font-size-base, 14px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.table-container {\r\n background: var(--bg-primary, white);\r\n border-radius: var(--border-radius-lg, 8px);\r\n box-shadow: var(--shadow-base, 0 2px 4px rgba(0,0,0,0.1));\r\n overflow: hidden;\r\n}\r\n\r\ntable {\r\n width: 100%;\r\n border-collapse: collapse;\r\n}\r\n\r\nth, td {\r\n padding: var(--spacing-lg, 15px) var(--spacing-md, 12px);\r\n text-align: left;\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n}\r\n\r\nth {\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-weight: var(--font-weight-semibold, 600);\r\n color: var(--text-muted, #495057);\r\n font-size: var(--font-size-sm, 12px);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\nth a {\r\n color: var(--text-muted, #495057);\r\n text-decoration: none;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-xs, 4px);\r\n}\r\n\r\nth a:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\nth a.sort-active {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\ntr:hover {\r\n background: var(--bg-secondary, #f8f9fa);\r\n}\r\n\r\n.property-link {\r\n color: var(--color-primary, #007bff);\r\n text-decoration: none;\r\n font-weight: var(--font-weight-medium, 500);\r\n}\r\n\r\n.property-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.contract-state {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border-radius: var(--border-radius-xl, 12px);\r\n font-size: var(--font-size-xs, 11px);\r\n font-weight: var(--font-weight-semibold, 600);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.contract-none { \r\n background: var(--border-color-light, #e9ecef); \r\n color: var(--text-muted, #495057); \r\n}\r\n\r\n.contract-loi_sent { \r\n background: #fff3cd; \r\n color: #856404; \r\n}\r\n\r\n.contract-loi_agreed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-loi_rejected { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.contract-contract_signed { \r\n background: #d1ecf1; \r\n color: #0c5460; \r\n}\r\n\r\n.contract-closed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-not_interested { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.date-cell {\r\n font-size: var(--font-size-sm, 13px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.pagination {\r\n display: flex;\r\n justify-content: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-xl, 20px);\r\n padding: var(--spacing-xl, 20px);\r\n}\r\n\r\n.page-link {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n background: var(--bg-primary, white);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n color: var(--text-primary, #212529);\r\n text-decoration: none;\r\n transition: all var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.page-link:hover {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}\r\n\r\n.page-link.active {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}",extension:"/* Shared CSS custom properties - extracted from your existing styles */\r\n:root {\r\n /* Colors */\r\n --color-primary: #007bff;\r\n --color-primary-hover: #0056b3;\r\n --color-secondary: #6c757d;\r\n --color-success: #28a745;\r\n --color-warning: #ffc107;\r\n --color-danger: #dc3545;\r\n --color-info: #17a2b8;\r\n \r\n /* Backgrounds */\r\n --bg-primary: #ffffff;\r\n --bg-secondary: #f8f9fa;\r\n --bg-light: #ededed;\r\n --bg-dark: #343a40;\r\n \r\n /* Text Colors */\r\n --text-primary: #212529;\r\n --text-secondary: #6c757d;\r\n --text-muted: #495057;\r\n --text-white: #ffffff;\r\n \r\n /* Borders */\r\n --border-color: #ddd;\r\n --border-color-light: #e9ecef;\r\n --border-color-dark: #919090ff;\r\n \r\n /* Spacing */\r\n --spacing-xs: 4px;\r\n --spacing-sm: 8px;\r\n --spacing-md: 12px;\r\n --spacing-lg: 16px;\r\n --spacing-xl: 20px;\r\n --spacing-2xl: 24px;\r\n --spacing-3xl: 32px;\r\n \r\n /* Typography */\r\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\r\n --font-size-xs: 11px;\r\n --font-size-sm: 12px;\r\n --font-size-base: 14px;\r\n --font-size-md: 16px;\r\n --font-size-lg: 18px;\r\n --font-size-xl: 20px;\r\n --font-weight-normal: 400;\r\n --font-weight-medium: 500;\r\n --font-weight-semibold: 600;\r\n --font-weight-bold: 700;\r\n \r\n /* Border Radius */\r\n --border-radius-sm: 4px;\r\n --border-radius-md: 6px;\r\n --border-radius-lg: 8px;\r\n --border-radius-xl: 12px;\r\n \r\n /* Shadows */\r\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\r\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\r\n \r\n /* Z-index */\r\n --z-extension: 999999999;\r\n --z-modal: 1050;\r\n --z-dropdown: 1000;\r\n \r\n /* Transitions */\r\n --transition-fast: 150ms ease;\r\n --transition-base: 250ms ease;\r\n --transition-slow: 350ms ease;\r\n}/* LoopNet Extension Footer - Extracted from content.js AS-IS */\r\n.ln-footer {\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n background: var(--bg-light, #ededed);\r\n border-top: 1px solid var(--border-color-dark, #919090ff);\r\n box-shadow: var(--shadow-lg, 0 -8px 32px rgba(0, 0, 0, 0.08));\r\n z-index: var(--z-extension, 999999999);\r\n padding: var(--spacing-lg, 16px) var(--spacing-2xl, 24px);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n font-size: var(--font-size-md, 16px);\r\n color: var(--text-primary, #212529);\r\n width: 100%;\r\n box-sizing: border-box;\r\n}\r\n\r\n.ln-footer-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n max-width: 1600px;\r\n margin: 0 auto;\r\n gap: var(--spacing-xl, 20px);\r\n}\r\n\r\n.ln-footer-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n flex: 1;\r\n width: 100%;\r\n}\r\n\r\n.ln-footer-right {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-lg, 16px);\r\n flex-shrink: 0;\r\n}\r\n\r\n.ln-metrics-grid {\r\n display: grid;\r\n grid-template-columns: repeat(9, 1fr);\r\n gap: var(--spacing-lg, 16px);\r\n align-items: start;\r\n}\r\n\r\n.ln-metric-column {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-metric {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n min-width: 0;\r\n}\r\n\r\n.ln-metric-label {\r\n font-size: var(--font-size-xs, 11px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n line-height: 1;\r\n}\r\n\r\n.ln-metric-value {\r\n font-weight: var(--font-weight-semibold, 600);\r\n font-size: var(--font-size-md, 16px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n line-height: 1.2;\r\n}\r\n\r\n.ln-price {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\n.ln-cashflow.negative {\r\n color: var(--color-danger, #dc3545);\r\n}\r\n\r\n.ln-cashflow.positive {\r\n color: var(--color-success, #28a745);\r\n}\r\n\r\n.ln-phone {\r\n color: var(--color-info, #17a2b8);\r\n cursor: pointer;\r\n text-decoration: underline;\r\n}\r\n\r\n.ln-phone:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-property-type-dropdown {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n background: var(--bg-primary, #ffffff);\r\n color: var(--text-primary, #212529);\r\n cursor: pointer;\r\n min-width: 120px;\r\n}\r\n\r\n.ln-property-type-dropdown:focus {\r\n outline: none;\r\n border-color: var(--color-primary, #007bff);\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.ln-export-button {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n font-weight: var(--font-weight-medium, 500);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-export-button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.ln-export-icon {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n}\r\n\r\n.ln-discount-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-discount-input {\r\n width: 60px;\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-sm, 12px);\r\n text-align: center;\r\n}\r\n\r\n.ln-discount-button {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n background: var(--color-secondary, #6c757d);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-xs, 11px);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-discount-button:hover {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-discount-button.active {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n@media (max-width: 1400px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(6, 1fr);\r\n }\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n .ln-footer {\r\n padding: var(--spacing-md, 12px) var(--spacing-lg, 16px);\r\n }\r\n \r\n .ln-footer-container {\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(4, 1fr);\r\n }\r\n \r\n .ln-footer-right {\r\n width: 100%;\r\n justify-content: flex-end;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metric-value {\r\n font-size: var(--font-size-base, 14px);\r\n }\r\n}",dashboardApp:"/* Shared CSS custom properties - extracted from your existing styles */\r\n:root {\r\n /* Colors */\r\n --color-primary: #007bff;\r\n --color-primary-hover: #0056b3;\r\n --color-secondary: #6c757d;\r\n --color-success: #28a745;\r\n --color-warning: #ffc107;\r\n --color-danger: #dc3545;\r\n --color-info: #17a2b8;\r\n \r\n /* Backgrounds */\r\n --bg-primary: #ffffff;\r\n --bg-secondary: #f8f9fa;\r\n --bg-light: #ededed;\r\n --bg-dark: #343a40;\r\n \r\n /* Text Colors */\r\n --text-primary: #212529;\r\n --text-secondary: #6c757d;\r\n --text-muted: #495057;\r\n --text-white: #ffffff;\r\n \r\n /* Borders */\r\n --border-color: #ddd;\r\n --border-color-light: #e9ecef;\r\n --border-color-dark: #919090ff;\r\n \r\n /* Spacing */\r\n --spacing-xs: 4px;\r\n --spacing-sm: 8px;\r\n --spacing-md: 12px;\r\n --spacing-lg: 16px;\r\n --spacing-xl: 20px;\r\n --spacing-2xl: 24px;\r\n --spacing-3xl: 32px;\r\n \r\n /* Typography */\r\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\r\n --font-size-xs: 11px;\r\n --font-size-sm: 12px;\r\n --font-size-base: 14px;\r\n --font-size-md: 16px;\r\n --font-size-lg: 18px;\r\n --font-size-xl: 20px;\r\n --font-weight-normal: 400;\r\n --font-weight-medium: 500;\r\n --font-weight-semibold: 600;\r\n --font-weight-bold: 700;\r\n \r\n /* Border Radius */\r\n --border-radius-sm: 4px;\r\n --border-radius-md: 6px;\r\n --border-radius-lg: 8px;\r\n --border-radius-xl: 12px;\r\n \r\n /* Shadows */\r\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\r\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\r\n \r\n /* Z-index */\r\n --z-extension: 999999999;\r\n --z-modal: 1050;\r\n --z-dropdown: 1000;\r\n \r\n /* Transitions */\r\n --transition-fast: 150ms ease;\r\n --transition-base: 250ms ease;\r\n --transition-slow: 350ms ease;\r\n}/* Dashboard styles - extracted from existing dashboard CSS AS-IS */\r\n\r\n/* Base dashboard styles */\r\n.dashboard-container {\r\n min-height: 100vh;\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n color: var(--text-primary, #212529);\r\n}\r\n\r\n.header {\r\n background: var(--bg-primary, white);\r\n padding: var(--spacing-xl, 20px) var(--spacing-2xl, 24px);\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\r\n}\r\n\r\n.header h1 {\r\n color: var(--color-primary, #007bff);\r\n margin-bottom: var(--spacing-xl, 20px);\r\n}\r\n\r\n.filters {\r\n display: flex;\r\n gap: var(--spacing-lg, 15px);\r\n flex-wrap: wrap;\r\n align-items: end;\r\n}\r\n\r\n.filter-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-xs, 5px);\r\n}\r\n\r\n.filter-group label {\r\n font-size: var(--font-size-sm, 12px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.filter-group input, .filter-group select {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n min-width: 120px;\r\n}\r\n\r\n.filter-group button {\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n cursor: pointer;\r\n}\r\n\r\n.filter-group button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.stats {\r\n display: flex;\r\n gap: var(--spacing-xl, 20px);\r\n margin-top: var(--spacing-xl, 20px);\r\n font-size: var(--font-size-base, 14px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.table-container {\r\n background: var(--bg-primary, white);\r\n border-radius: var(--border-radius-lg, 8px);\r\n box-shadow: var(--shadow-base, 0 2px 4px rgba(0,0,0,0.1));\r\n overflow: hidden;\r\n}\r\n\r\ntable {\r\n width: 100%;\r\n border-collapse: collapse;\r\n}\r\n\r\nth, td {\r\n padding: var(--spacing-lg, 15px) var(--spacing-md, 12px);\r\n text-align: left;\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n}\r\n\r\nth {\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-weight: var(--font-weight-semibold, 600);\r\n color: var(--text-muted, #495057);\r\n font-size: var(--font-size-sm, 12px);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\nth a {\r\n color: var(--text-muted, #495057);\r\n text-decoration: none;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-xs, 4px);\r\n}\r\n\r\nth a:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\nth a.sort-active {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\ntr:hover {\r\n background: var(--bg-secondary, #f8f9fa);\r\n}\r\n\r\n.property-link {\r\n color: var(--color-primary, #007bff);\r\n text-decoration: none;\r\n font-weight: var(--font-weight-medium, 500);\r\n}\r\n\r\n.property-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.contract-state {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border-radius: var(--border-radius-xl, 12px);\r\n font-size: var(--font-size-xs, 11px);\r\n font-weight: var(--font-weight-semibold, 600);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.contract-none { \r\n background: var(--border-color-light, #e9ecef); \r\n color: var(--text-muted, #495057); \r\n}\r\n\r\n.contract-loi_sent { \r\n background: #fff3cd; \r\n color: #856404; \r\n}\r\n\r\n.contract-loi_agreed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-loi_rejected { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.contract-contract_signed { \r\n background: #d1ecf1; \r\n color: #0c5460; \r\n}\r\n\r\n.contract-closed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-not_interested { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.date-cell {\r\n font-size: var(--font-size-sm, 13px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.pagination {\r\n display: flex;\r\n justify-content: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-xl, 20px);\r\n padding: var(--spacing-xl, 20px);\r\n}\r\n\r\n.page-link {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n background: var(--bg-primary, white);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n color: var(--text-primary, #212529);\r\n text-decoration: none;\r\n transition: all var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.page-link:hover {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}\r\n\r\n.page-link.active {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}"};function injectStyles(r,n="injected-styles"){if("undefined"==typeof document)return null;const o=document.getElementById(n);o&&o.remove();const a=document.createElement("style");return a.id=n,a.textContent=r,document.head.appendChild(a),a}function injectFooterStyles(){return injectStyles(r.extension,"ln-footer-styles")}function injectDashboardStyles(){return injectStyles(r.dashboardApp,"dashboard-styles")}export{injectDashboardStyles,injectFooterStyles,injectStyles,r as styles};
2
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sources":["../../src/styles/browser.js"],"sourcesContent":["// Auto-generated browser styles - DO NOT EDIT\n// Generated from CSS files by build-styles.js\n\nexport const styles = {\n variables: \"/* Shared CSS custom properties - extracted from your existing styles */\\r\\n:root {\\r\\n /* Colors */\\r\\n --color-primary: #007bff;\\r\\n --color-primary-hover: #0056b3;\\r\\n --color-secondary: #6c757d;\\r\\n --color-success: #28a745;\\r\\n --color-warning: #ffc107;\\r\\n --color-danger: #dc3545;\\r\\n --color-info: #17a2b8;\\r\\n \\r\\n /* Backgrounds */\\r\\n --bg-primary: #ffffff;\\r\\n --bg-secondary: #f8f9fa;\\r\\n --bg-light: #ededed;\\r\\n --bg-dark: #343a40;\\r\\n \\r\\n /* Text Colors */\\r\\n --text-primary: #212529;\\r\\n --text-secondary: #6c757d;\\r\\n --text-muted: #495057;\\r\\n --text-white: #ffffff;\\r\\n \\r\\n /* Borders */\\r\\n --border-color: #ddd;\\r\\n --border-color-light: #e9ecef;\\r\\n --border-color-dark: #919090ff;\\r\\n \\r\\n /* Spacing */\\r\\n --spacing-xs: 4px;\\r\\n --spacing-sm: 8px;\\r\\n --spacing-md: 12px;\\r\\n --spacing-lg: 16px;\\r\\n --spacing-xl: 20px;\\r\\n --spacing-2xl: 24px;\\r\\n --spacing-3xl: 32px;\\r\\n \\r\\n /* Typography */\\r\\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\\r\\n --font-size-xs: 11px;\\r\\n --font-size-sm: 12px;\\r\\n --font-size-base: 14px;\\r\\n --font-size-md: 16px;\\r\\n --font-size-lg: 18px;\\r\\n --font-size-xl: 20px;\\r\\n --font-weight-normal: 400;\\r\\n --font-weight-medium: 500;\\r\\n --font-weight-semibold: 600;\\r\\n --font-weight-bold: 700;\\r\\n \\r\\n /* Border Radius */\\r\\n --border-radius-sm: 4px;\\r\\n --border-radius-md: 6px;\\r\\n --border-radius-lg: 8px;\\r\\n --border-radius-xl: 12px;\\r\\n \\r\\n /* Shadows */\\r\\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\\r\\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\\r\\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\\r\\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\\r\\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\\r\\n \\r\\n /* Z-index */\\r\\n --z-extension: 999999999;\\r\\n --z-modal: 1050;\\r\\n --z-dropdown: 1000;\\r\\n \\r\\n /* Transitions */\\r\\n --transition-fast: 150ms ease;\\r\\n --transition-base: 250ms ease;\\r\\n --transition-slow: 350ms ease;\\r\\n}\",\n footer: \"/* LoopNet Extension Footer - Extracted from content.js AS-IS */\\r\\n.ln-footer {\\r\\n position: fixed;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n background: var(--bg-light, #ededed);\\r\\n border-top: 1px solid var(--border-color-dark, #919090ff);\\r\\n box-shadow: var(--shadow-lg, 0 -8px 32px rgba(0, 0, 0, 0.08));\\r\\n z-index: var(--z-extension, 999999999);\\r\\n padding: var(--spacing-lg, 16px) var(--spacing-2xl, 24px);\\r\\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\\r\\n font-size: var(--font-size-md, 16px);\\r\\n color: var(--text-primary, #212529);\\r\\n width: 100%;\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\n.ln-footer-container {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n max-width: 1600px;\\r\\n margin: 0 auto;\\r\\n gap: var(--spacing-xl, 20px);\\r\\n}\\r\\n\\r\\n.ln-footer-content {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-md, 12px);\\r\\n flex: 1;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.ln-footer-right {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-lg, 16px);\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.ln-metrics-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(9, 1fr);\\r\\n gap: var(--spacing-lg, 16px);\\r\\n align-items: start;\\r\\n}\\r\\n\\r\\n.ln-metric-column {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n}\\r\\n\\r\\n.ln-metric {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: 2px;\\r\\n min-width: 0;\\r\\n}\\r\\n\\r\\n.ln-metric-label {\\r\\n font-size: var(--font-size-xs, 11px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.ln-metric-value {\\r\\n font-weight: var(--font-weight-semibold, 600);\\r\\n font-size: var(--font-size-md, 16px);\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.ln-price {\\r\\n color: var(--color-primary, #007bff);\\r\\n font-weight: var(--font-weight-bold, 700);\\r\\n}\\r\\n\\r\\n.ln-cashflow.negative {\\r\\n color: var(--color-danger, #dc3545);\\r\\n}\\r\\n\\r\\n.ln-cashflow.positive {\\r\\n color: var(--color-success, #28a745);\\r\\n}\\r\\n\\r\\n.ln-phone {\\r\\n color: var(--color-info, #17a2b8);\\r\\n cursor: pointer;\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.ln-phone:hover {\\r\\n color: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n.ln-property-type-dropdown {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n background: var(--bg-primary, #ffffff);\\r\\n color: var(--text-primary, #212529);\\r\\n cursor: pointer;\\r\\n min-width: 120px;\\r\\n}\\r\\n\\r\\n.ln-property-type-dropdown:focus {\\r\\n outline: none;\\r\\n border-color: var(--color-primary, #007bff);\\r\\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\\r\\n}\\r\\n\\r\\n.ln-export-button {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, #ffffff);\\r\\n border: none;\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n cursor: pointer;\\r\\n transition: background-color var(--transition-fast, 150ms ease);\\r\\n}\\r\\n\\r\\n.ln-export-button:hover {\\r\\n background: var(--color-primary-hover, #0056b3);\\r\\n}\\r\\n\\r\\n.ln-export-icon {\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n fill: currentColor;\\r\\n}\\r\\n\\r\\n.ln-discount-controls {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n margin-top: var(--spacing-sm, 8px);\\r\\n}\\r\\n\\r\\n.ln-discount-input {\\r\\n width: 60px;\\r\\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-sm, 12px);\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.ln-discount-button {\\r\\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\\r\\n background: var(--color-secondary, #6c757d);\\r\\n color: var(--text-white, #ffffff);\\r\\n border: none;\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-xs, 11px);\\r\\n cursor: pointer;\\r\\n transition: background-color var(--transition-fast, 150ms ease);\\r\\n}\\r\\n\\r\\n.ln-discount-button:hover {\\r\\n background: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n.ln-discount-button.active {\\r\\n background: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n@media (max-width: 1400px) {\\r\\n .ln-metrics-grid {\\r\\n grid-template-columns: repeat(6, 1fr);\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 1024px) {\\r\\n .ln-footer {\\r\\n padding: var(--spacing-md, 12px) var(--spacing-lg, 16px);\\r\\n }\\r\\n \\r\\n .ln-footer-container {\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-md, 12px);\\r\\n }\\r\\n \\r\\n .ln-metrics-grid {\\r\\n grid-template-columns: repeat(4, 1fr);\\r\\n }\\r\\n \\r\\n .ln-footer-right {\\r\\n width: 100%;\\r\\n justify-content: flex-end;\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 768px) {\\r\\n .ln-metrics-grid {\\r\\n grid-template-columns: repeat(3, 1fr);\\r\\n gap: var(--spacing-md, 12px);\\r\\n }\\r\\n \\r\\n .ln-metric-value {\\r\\n font-size: var(--font-size-base, 14px);\\r\\n }\\r\\n}\",\n dashboard: \"/* Dashboard styles - extracted from existing dashboard CSS AS-IS */\\r\\n\\r\\n/* Base dashboard styles */\\r\\n.dashboard-container {\\r\\n min-height: 100vh;\\r\\n background: var(--bg-secondary, #f8f9fa);\\r\\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\\r\\n color: var(--text-primary, #212529);\\r\\n}\\r\\n\\r\\n.header {\\r\\n background: var(--bg-primary, white);\\r\\n padding: var(--spacing-xl, 20px) var(--spacing-2xl, 24px);\\r\\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\\r\\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\\r\\n}\\r\\n\\r\\n.header h1 {\\r\\n color: var(--color-primary, #007bff);\\r\\n margin-bottom: var(--spacing-xl, 20px);\\r\\n}\\r\\n\\r\\n.filters {\\r\\n display: flex;\\r\\n gap: var(--spacing-lg, 15px);\\r\\n flex-wrap: wrap;\\r\\n align-items: end;\\r\\n}\\r\\n\\r\\n.filter-group {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-xs, 5px);\\r\\n}\\r\\n\\r\\n.filter-group label {\\r\\n font-size: var(--font-size-sm, 12px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.filter-group input, .filter-group select {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n min-width: 120px;\\r\\n}\\r\\n\\r\\n.filter-group button {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, white);\\r\\n border: none;\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.filter-group button:hover {\\r\\n background: var(--color-primary-hover, #0056b3);\\r\\n}\\r\\n\\r\\n.stats {\\r\\n display: flex;\\r\\n gap: var(--spacing-xl, 20px);\\r\\n margin-top: var(--spacing-xl, 20px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n}\\r\\n\\r\\n.table-container {\\r\\n background: var(--bg-primary, white);\\r\\n border-radius: var(--border-radius-lg, 8px);\\r\\n box-shadow: var(--shadow-base, 0 2px 4px rgba(0,0,0,0.1));\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\ntable {\\r\\n width: 100%;\\r\\n border-collapse: collapse;\\r\\n}\\r\\n\\r\\nth, td {\\r\\n padding: var(--spacing-lg, 15px) var(--spacing-md, 12px);\\r\\n text-align: left;\\r\\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\\r\\n}\\r\\n\\r\\nth {\\r\\n background: var(--bg-secondary, #f8f9fa);\\r\\n font-weight: var(--font-weight-semibold, 600);\\r\\n color: var(--text-muted, #495057);\\r\\n font-size: var(--font-size-sm, 12px);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\nth a {\\r\\n color: var(--text-muted, #495057);\\r\\n text-decoration: none;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-xs, 4px);\\r\\n}\\r\\n\\r\\nth a:hover {\\r\\n color: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\nth a.sort-active {\\r\\n color: var(--color-primary, #007bff);\\r\\n font-weight: var(--font-weight-bold, 700);\\r\\n}\\r\\n\\r\\ntr:hover {\\r\\n background: var(--bg-secondary, #f8f9fa);\\r\\n}\\r\\n\\r\\n.property-link {\\r\\n color: var(--color-primary, #007bff);\\r\\n text-decoration: none;\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n}\\r\\n\\r\\n.property-link:hover {\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.contract-state {\\r\\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\\r\\n border-radius: var(--border-radius-xl, 12px);\\r\\n font-size: var(--font-size-xs, 11px);\\r\\n font-weight: var(--font-weight-semibold, 600);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.contract-none { \\r\\n background: var(--border-color-light, #e9ecef); \\r\\n color: var(--text-muted, #495057); \\r\\n}\\r\\n\\r\\n.contract-loi_sent { \\r\\n background: #fff3cd; \\r\\n color: #856404; \\r\\n}\\r\\n\\r\\n.contract-loi_agreed { \\r\\n background: #d4edda; \\r\\n color: #155724; \\r\\n}\\r\\n\\r\\n.contract-loi_rejected { \\r\\n background: #f8d7da; \\r\\n color: #721c24; \\r\\n}\\r\\n\\r\\n.contract-contract_signed { \\r\\n background: #d1ecf1; \\r\\n color: #0c5460; \\r\\n}\\r\\n\\r\\n.contract-closed { \\r\\n background: #d4edda; \\r\\n color: #155724; \\r\\n}\\r\\n\\r\\n.contract-not_interested { \\r\\n background: #f8d7da; \\r\\n color: #721c24; \\r\\n}\\r\\n\\r\\n.date-cell {\\r\\n font-size: var(--font-size-sm, 13px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n}\\r\\n\\r\\n.pagination {\\r\\n display: flex;\\r\\n justify-content: center;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n margin-top: var(--spacing-xl, 20px);\\r\\n padding: var(--spacing-xl, 20px);\\r\\n}\\r\\n\\r\\n.page-link {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\\r\\n background: var(--bg-primary, white);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n color: var(--text-primary, #212529);\\r\\n text-decoration: none;\\r\\n transition: all var(--transition-fast, 150ms ease);\\r\\n}\\r\\n\\r\\n.page-link:hover {\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, white);\\r\\n border-color: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n.page-link.active {\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, white);\\r\\n border-color: var(--color-primary, #007bff);\\r\\n}\",\n \n // Combined styles\n extension: \"/* Shared CSS custom properties - extracted from your existing styles */\\r\\n:root {\\r\\n /* Colors */\\r\\n --color-primary: #007bff;\\r\\n --color-primary-hover: #0056b3;\\r\\n --color-secondary: #6c757d;\\r\\n --color-success: #28a745;\\r\\n --color-warning: #ffc107;\\r\\n --color-danger: #dc3545;\\r\\n --color-info: #17a2b8;\\r\\n \\r\\n /* Backgrounds */\\r\\n --bg-primary: #ffffff;\\r\\n --bg-secondary: #f8f9fa;\\r\\n --bg-light: #ededed;\\r\\n --bg-dark: #343a40;\\r\\n \\r\\n /* Text Colors */\\r\\n --text-primary: #212529;\\r\\n --text-secondary: #6c757d;\\r\\n --text-muted: #495057;\\r\\n --text-white: #ffffff;\\r\\n \\r\\n /* Borders */\\r\\n --border-color: #ddd;\\r\\n --border-color-light: #e9ecef;\\r\\n --border-color-dark: #919090ff;\\r\\n \\r\\n /* Spacing */\\r\\n --spacing-xs: 4px;\\r\\n --spacing-sm: 8px;\\r\\n --spacing-md: 12px;\\r\\n --spacing-lg: 16px;\\r\\n --spacing-xl: 20px;\\r\\n --spacing-2xl: 24px;\\r\\n --spacing-3xl: 32px;\\r\\n \\r\\n /* Typography */\\r\\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\\r\\n --font-size-xs: 11px;\\r\\n --font-size-sm: 12px;\\r\\n --font-size-base: 14px;\\r\\n --font-size-md: 16px;\\r\\n --font-size-lg: 18px;\\r\\n --font-size-xl: 20px;\\r\\n --font-weight-normal: 400;\\r\\n --font-weight-medium: 500;\\r\\n --font-weight-semibold: 600;\\r\\n --font-weight-bold: 700;\\r\\n \\r\\n /* Border Radius */\\r\\n --border-radius-sm: 4px;\\r\\n --border-radius-md: 6px;\\r\\n --border-radius-lg: 8px;\\r\\n --border-radius-xl: 12px;\\r\\n \\r\\n /* Shadows */\\r\\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\\r\\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\\r\\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\\r\\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\\r\\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\\r\\n \\r\\n /* Z-index */\\r\\n --z-extension: 999999999;\\r\\n --z-modal: 1050;\\r\\n --z-dropdown: 1000;\\r\\n \\r\\n /* Transitions */\\r\\n --transition-fast: 150ms ease;\\r\\n --transition-base: 250ms ease;\\r\\n --transition-slow: 350ms ease;\\r\\n}/* LoopNet Extension Footer - Extracted from content.js AS-IS */\\r\\n.ln-footer {\\r\\n position: fixed;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n background: var(--bg-light, #ededed);\\r\\n border-top: 1px solid var(--border-color-dark, #919090ff);\\r\\n box-shadow: var(--shadow-lg, 0 -8px 32px rgba(0, 0, 0, 0.08));\\r\\n z-index: var(--z-extension, 999999999);\\r\\n padding: var(--spacing-lg, 16px) var(--spacing-2xl, 24px);\\r\\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\\r\\n font-size: var(--font-size-md, 16px);\\r\\n color: var(--text-primary, #212529);\\r\\n width: 100%;\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\n.ln-footer-container {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n max-width: 1600px;\\r\\n margin: 0 auto;\\r\\n gap: var(--spacing-xl, 20px);\\r\\n}\\r\\n\\r\\n.ln-footer-content {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-md, 12px);\\r\\n flex: 1;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.ln-footer-right {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-lg, 16px);\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.ln-metrics-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(9, 1fr);\\r\\n gap: var(--spacing-lg, 16px);\\r\\n align-items: start;\\r\\n}\\r\\n\\r\\n.ln-metric-column {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n}\\r\\n\\r\\n.ln-metric {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: 2px;\\r\\n min-width: 0;\\r\\n}\\r\\n\\r\\n.ln-metric-label {\\r\\n font-size: var(--font-size-xs, 11px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.ln-metric-value {\\r\\n font-weight: var(--font-weight-semibold, 600);\\r\\n font-size: var(--font-size-md, 16px);\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n line-height: 1.2;\\r\\n}\\r\\n\\r\\n.ln-price {\\r\\n color: var(--color-primary, #007bff);\\r\\n font-weight: var(--font-weight-bold, 700);\\r\\n}\\r\\n\\r\\n.ln-cashflow.negative {\\r\\n color: var(--color-danger, #dc3545);\\r\\n}\\r\\n\\r\\n.ln-cashflow.positive {\\r\\n color: var(--color-success, #28a745);\\r\\n}\\r\\n\\r\\n.ln-phone {\\r\\n color: var(--color-info, #17a2b8);\\r\\n cursor: pointer;\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.ln-phone:hover {\\r\\n color: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n.ln-property-type-dropdown {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n background: var(--bg-primary, #ffffff);\\r\\n color: var(--text-primary, #212529);\\r\\n cursor: pointer;\\r\\n min-width: 120px;\\r\\n}\\r\\n\\r\\n.ln-property-type-dropdown:focus {\\r\\n outline: none;\\r\\n border-color: var(--color-primary, #007bff);\\r\\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\\r\\n}\\r\\n\\r\\n.ln-export-button {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, #ffffff);\\r\\n border: none;\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n cursor: pointer;\\r\\n transition: background-color var(--transition-fast, 150ms ease);\\r\\n}\\r\\n\\r\\n.ln-export-button:hover {\\r\\n background: var(--color-primary-hover, #0056b3);\\r\\n}\\r\\n\\r\\n.ln-export-icon {\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n fill: currentColor;\\r\\n}\\r\\n\\r\\n.ln-discount-controls {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n margin-top: var(--spacing-sm, 8px);\\r\\n}\\r\\n\\r\\n.ln-discount-input {\\r\\n width: 60px;\\r\\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-sm, 12px);\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.ln-discount-button {\\r\\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\\r\\n background: var(--color-secondary, #6c757d);\\r\\n color: var(--text-white, #ffffff);\\r\\n border: none;\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-xs, 11px);\\r\\n cursor: pointer;\\r\\n transition: background-color var(--transition-fast, 150ms ease);\\r\\n}\\r\\n\\r\\n.ln-discount-button:hover {\\r\\n background: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n.ln-discount-button.active {\\r\\n background: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n@media (max-width: 1400px) {\\r\\n .ln-metrics-grid {\\r\\n grid-template-columns: repeat(6, 1fr);\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 1024px) {\\r\\n .ln-footer {\\r\\n padding: var(--spacing-md, 12px) var(--spacing-lg, 16px);\\r\\n }\\r\\n \\r\\n .ln-footer-container {\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-md, 12px);\\r\\n }\\r\\n \\r\\n .ln-metrics-grid {\\r\\n grid-template-columns: repeat(4, 1fr);\\r\\n }\\r\\n \\r\\n .ln-footer-right {\\r\\n width: 100%;\\r\\n justify-content: flex-end;\\r\\n }\\r\\n}\\r\\n\\r\\n@media (max-width: 768px) {\\r\\n .ln-metrics-grid {\\r\\n grid-template-columns: repeat(3, 1fr);\\r\\n gap: var(--spacing-md, 12px);\\r\\n }\\r\\n \\r\\n .ln-metric-value {\\r\\n font-size: var(--font-size-base, 14px);\\r\\n }\\r\\n}\",\n dashboardApp: \"/* Shared CSS custom properties - extracted from your existing styles */\\r\\n:root {\\r\\n /* Colors */\\r\\n --color-primary: #007bff;\\r\\n --color-primary-hover: #0056b3;\\r\\n --color-secondary: #6c757d;\\r\\n --color-success: #28a745;\\r\\n --color-warning: #ffc107;\\r\\n --color-danger: #dc3545;\\r\\n --color-info: #17a2b8;\\r\\n \\r\\n /* Backgrounds */\\r\\n --bg-primary: #ffffff;\\r\\n --bg-secondary: #f8f9fa;\\r\\n --bg-light: #ededed;\\r\\n --bg-dark: #343a40;\\r\\n \\r\\n /* Text Colors */\\r\\n --text-primary: #212529;\\r\\n --text-secondary: #6c757d;\\r\\n --text-muted: #495057;\\r\\n --text-white: #ffffff;\\r\\n \\r\\n /* Borders */\\r\\n --border-color: #ddd;\\r\\n --border-color-light: #e9ecef;\\r\\n --border-color-dark: #919090ff;\\r\\n \\r\\n /* Spacing */\\r\\n --spacing-xs: 4px;\\r\\n --spacing-sm: 8px;\\r\\n --spacing-md: 12px;\\r\\n --spacing-lg: 16px;\\r\\n --spacing-xl: 20px;\\r\\n --spacing-2xl: 24px;\\r\\n --spacing-3xl: 32px;\\r\\n \\r\\n /* Typography */\\r\\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\\r\\n --font-size-xs: 11px;\\r\\n --font-size-sm: 12px;\\r\\n --font-size-base: 14px;\\r\\n --font-size-md: 16px;\\r\\n --font-size-lg: 18px;\\r\\n --font-size-xl: 20px;\\r\\n --font-weight-normal: 400;\\r\\n --font-weight-medium: 500;\\r\\n --font-weight-semibold: 600;\\r\\n --font-weight-bold: 700;\\r\\n \\r\\n /* Border Radius */\\r\\n --border-radius-sm: 4px;\\r\\n --border-radius-md: 6px;\\r\\n --border-radius-lg: 8px;\\r\\n --border-radius-xl: 12px;\\r\\n \\r\\n /* Shadows */\\r\\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\\r\\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\\r\\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\\r\\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\\r\\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\\r\\n \\r\\n /* Z-index */\\r\\n --z-extension: 999999999;\\r\\n --z-modal: 1050;\\r\\n --z-dropdown: 1000;\\r\\n \\r\\n /* Transitions */\\r\\n --transition-fast: 150ms ease;\\r\\n --transition-base: 250ms ease;\\r\\n --transition-slow: 350ms ease;\\r\\n}/* Dashboard styles - extracted from existing dashboard CSS AS-IS */\\r\\n\\r\\n/* Base dashboard styles */\\r\\n.dashboard-container {\\r\\n min-height: 100vh;\\r\\n background: var(--bg-secondary, #f8f9fa);\\r\\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\\r\\n color: var(--text-primary, #212529);\\r\\n}\\r\\n\\r\\n.header {\\r\\n background: var(--bg-primary, white);\\r\\n padding: var(--spacing-xl, 20px) var(--spacing-2xl, 24px);\\r\\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\\r\\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\\r\\n}\\r\\n\\r\\n.header h1 {\\r\\n color: var(--color-primary, #007bff);\\r\\n margin-bottom: var(--spacing-xl, 20px);\\r\\n}\\r\\n\\r\\n.filters {\\r\\n display: flex;\\r\\n gap: var(--spacing-lg, 15px);\\r\\n flex-wrap: wrap;\\r\\n align-items: end;\\r\\n}\\r\\n\\r\\n.filter-group {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: var(--spacing-xs, 5px);\\r\\n}\\r\\n\\r\\n.filter-group label {\\r\\n font-size: var(--font-size-sm, 12px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.filter-group input, .filter-group select {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n min-width: 120px;\\r\\n}\\r\\n\\r\\n.filter-group button {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, white);\\r\\n border: none;\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.filter-group button:hover {\\r\\n background: var(--color-primary-hover, #0056b3);\\r\\n}\\r\\n\\r\\n.stats {\\r\\n display: flex;\\r\\n gap: var(--spacing-xl, 20px);\\r\\n margin-top: var(--spacing-xl, 20px);\\r\\n font-size: var(--font-size-base, 14px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n}\\r\\n\\r\\n.table-container {\\r\\n background: var(--bg-primary, white);\\r\\n border-radius: var(--border-radius-lg, 8px);\\r\\n box-shadow: var(--shadow-base, 0 2px 4px rgba(0,0,0,0.1));\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\ntable {\\r\\n width: 100%;\\r\\n border-collapse: collapse;\\r\\n}\\r\\n\\r\\nth, td {\\r\\n padding: var(--spacing-lg, 15px) var(--spacing-md, 12px);\\r\\n text-align: left;\\r\\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\\r\\n}\\r\\n\\r\\nth {\\r\\n background: var(--bg-secondary, #f8f9fa);\\r\\n font-weight: var(--font-weight-semibold, 600);\\r\\n color: var(--text-muted, #495057);\\r\\n font-size: var(--font-size-sm, 12px);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\nth a {\\r\\n color: var(--text-muted, #495057);\\r\\n text-decoration: none;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: var(--spacing-xs, 4px);\\r\\n}\\r\\n\\r\\nth a:hover {\\r\\n color: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\nth a.sort-active {\\r\\n color: var(--color-primary, #007bff);\\r\\n font-weight: var(--font-weight-bold, 700);\\r\\n}\\r\\n\\r\\ntr:hover {\\r\\n background: var(--bg-secondary, #f8f9fa);\\r\\n}\\r\\n\\r\\n.property-link {\\r\\n color: var(--color-primary, #007bff);\\r\\n text-decoration: none;\\r\\n font-weight: var(--font-weight-medium, 500);\\r\\n}\\r\\n\\r\\n.property-link:hover {\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.contract-state {\\r\\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\\r\\n border-radius: var(--border-radius-xl, 12px);\\r\\n font-size: var(--font-size-xs, 11px);\\r\\n font-weight: var(--font-weight-semibold, 600);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.contract-none { \\r\\n background: var(--border-color-light, #e9ecef); \\r\\n color: var(--text-muted, #495057); \\r\\n}\\r\\n\\r\\n.contract-loi_sent { \\r\\n background: #fff3cd; \\r\\n color: #856404; \\r\\n}\\r\\n\\r\\n.contract-loi_agreed { \\r\\n background: #d4edda; \\r\\n color: #155724; \\r\\n}\\r\\n\\r\\n.contract-loi_rejected { \\r\\n background: #f8d7da; \\r\\n color: #721c24; \\r\\n}\\r\\n\\r\\n.contract-contract_signed { \\r\\n background: #d1ecf1; \\r\\n color: #0c5460; \\r\\n}\\r\\n\\r\\n.contract-closed { \\r\\n background: #d4edda; \\r\\n color: #155724; \\r\\n}\\r\\n\\r\\n.contract-not_interested { \\r\\n background: #f8d7da; \\r\\n color: #721c24; \\r\\n}\\r\\n\\r\\n.date-cell {\\r\\n font-size: var(--font-size-sm, 13px);\\r\\n color: var(--text-secondary, #6c757d);\\r\\n}\\r\\n\\r\\n.pagination {\\r\\n display: flex;\\r\\n justify-content: center;\\r\\n gap: var(--spacing-sm, 8px);\\r\\n margin-top: var(--spacing-xl, 20px);\\r\\n padding: var(--spacing-xl, 20px);\\r\\n}\\r\\n\\r\\n.page-link {\\r\\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\\r\\n background: var(--bg-primary, white);\\r\\n border: 1px solid var(--border-color, #ddd);\\r\\n border-radius: var(--border-radius-sm, 4px);\\r\\n color: var(--text-primary, #212529);\\r\\n text-decoration: none;\\r\\n transition: all var(--transition-fast, 150ms ease);\\r\\n}\\r\\n\\r\\n.page-link:hover {\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, white);\\r\\n border-color: var(--color-primary, #007bff);\\r\\n}\\r\\n\\r\\n.page-link.active {\\r\\n background: var(--color-primary, #007bff);\\r\\n color: var(--text-white, white);\\r\\n border-color: var(--color-primary, #007bff);\\r\\n}\"\n};\n\nexport function injectStyles(cssString, id = \"injected-styles\") {\n if (typeof document === 'undefined') return null;\n \n const existing = document.getElementById(id);\n if (existing) existing.remove();\n \n const style = document.createElement(\"style\");\n style.id = id;\n style.textContent = cssString;\n document.head.appendChild(style);\n \n return style;\n}\n\nexport function injectFooterStyles() {\n return injectStyles(styles.extension, \"ln-footer-styles\");\n}\n\nexport function injectDashboardStyles() {\n return injectStyles(styles.dashboardApp, \"dashboard-styles\");\n}\n"],"names":["styles","variables","footer","dashboard","extension","dashboardApp","injectStyles","cssString","id","document","existing","getElementById","remove","style","createElement","textContent","head","appendChild","injectFooterStyles","injectDashboardStyles"],"mappings":"AAGY,MAACA,EAAS,CACpBC,UAAW,w+DACXC,OAAQ,u4KACRC,UAAW,2xKAGXC,UAAW,42OACXC,aAAc,iwOAGT,SAASC,aAAaC,EAAWC,EAAK,mBAC3C,GAAwB,oBAAbC,SAA0B,OAAO,KAE5C,MAAMC,EAAWD,SAASE,eAAeH,GACrCE,GAAUA,EAASE,SAEvB,MAAMC,EAAQJ,SAASK,cAAc,SAKrC,OAJAD,EAAML,GAAKA,EACXK,EAAME,YAAcR,EACpBE,SAASO,KAAKC,YAAYJ,GAEnBA,CACT,CAEO,SAASK,qBACd,OAAOZ,aAAaN,EAAOI,UAAW,mBACxC,CAEO,SAASe,wBACd,OAAOb,aAAaN,EAAOK,aAAc,mBAC3C"}
package/package.json CHANGED
@@ -1,45 +1,47 @@
1
- {
2
- "name": "@archerjessop/utilities",
3
- "version": "3.5.0",
4
- "description": "Shared utilities for ArcherJessop property analysis tools",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "exports": {
8
- ".": "./dist/index.js"
9
- },
10
- "files": [
11
- "dist",
12
- "README.md"
13
- ],
14
- "sideEffects": false,
15
- "engines": {
16
- "node": ">=16"
17
- },
18
- "scripts": {
19
- "build": "rollup -c",
20
- "dev": "rollup -c -w",
21
- "test": "vitest run",
22
- "test:watch": "vitest",
23
- "test:coverage": "vitest --coverage",
24
- "clean": "rm -rf dist",
25
- "prepublishOnly": "npm run clean && npm run build && npm run test",
26
- "lint": "eslint src tests",
27
- "lint:fix": "eslint src tests --fix",
28
- "release:patch": "npm version patch && git push && git push --tags && npm publish --access public",
29
- "release:minor": "npm version minor && git push && git push --tags && npm publish --access public",
30
- "release:major": "npm version major && git push && git push --tags && npm publish --access public"
31
- },
32
- "repository": {
33
- "type": "git",
34
- "url": "git+https://gitlab.com/archerjessop/utilities.git"
35
- },
36
- "author": "ArcherJessop",
37
- "license": "MIT",
38
- "devDependencies": {
39
- "@rollup/plugin-node-resolve": "^15.2.3",
40
- "@rollup/plugin-terser": "^0.4.4",
41
- "eslint": "^8.57.0",
42
- "rollup": "^4.9.6",
43
- "vitest": "^3.2.4"
44
- }
45
- }
1
+ {
2
+ "name": "@archerjessop/utilities",
3
+ "version": "3.6.0",
4
+ "description": "Shared utilities for ArcherJessop property analysis tools",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "exports": {
8
+ ".": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "src/styles",
13
+ "README.md"
14
+ ],
15
+ "sideEffects": false,
16
+ "engines": {
17
+ "node": ">=16"
18
+ },
19
+ "scripts": {
20
+ "build": "node build-styles.js && rollup -c",
21
+ "prebuild": "node build-styles.js",
22
+ "dev": "rollup -c -w",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "test:coverage": "vitest --coverage",
26
+ "clean": "rm -rf dist",
27
+ "prepublishOnly": "npm run clean && npm run build && npm run test",
28
+ "lint": "eslint src tests",
29
+ "lint:fix": "eslint src tests --fix",
30
+ "release:patch": "npm version patch && git push && git push --tags && npm publish --access public",
31
+ "release:minor": "npm version minor && git push && git push --tags && npm publish --access public",
32
+ "release:major": "npm version major && git push && git push --tags && npm publish --access public"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://gitlab.com/archerjessop/utilities.git"
37
+ },
38
+ "author": "ArcherJessop",
39
+ "license": "MIT",
40
+ "devDependencies": {
41
+ "@rollup/plugin-node-resolve": "^15.2.3",
42
+ "@rollup/plugin-terser": "^0.4.4",
43
+ "eslint": "^8.57.0",
44
+ "rollup": "^4.9.6",
45
+ "vitest": "^3.2.4"
46
+ }
47
+ }
@@ -0,0 +1,34 @@
1
+ // Auto-generated browser styles - DO NOT EDIT
2
+ // Generated from CSS files by build-styles.js
3
+
4
+ export const styles = {
5
+ variables: "/* Shared CSS custom properties - extracted from your existing styles */\r\n:root {\r\n /* Colors */\r\n --color-primary: #007bff;\r\n --color-primary-hover: #0056b3;\r\n --color-secondary: #6c757d;\r\n --color-success: #28a745;\r\n --color-warning: #ffc107;\r\n --color-danger: #dc3545;\r\n --color-info: #17a2b8;\r\n \r\n /* Backgrounds */\r\n --bg-primary: #ffffff;\r\n --bg-secondary: #f8f9fa;\r\n --bg-light: #ededed;\r\n --bg-dark: #343a40;\r\n \r\n /* Text Colors */\r\n --text-primary: #212529;\r\n --text-secondary: #6c757d;\r\n --text-muted: #495057;\r\n --text-white: #ffffff;\r\n \r\n /* Borders */\r\n --border-color: #ddd;\r\n --border-color-light: #e9ecef;\r\n --border-color-dark: #919090ff;\r\n \r\n /* Spacing */\r\n --spacing-xs: 4px;\r\n --spacing-sm: 8px;\r\n --spacing-md: 12px;\r\n --spacing-lg: 16px;\r\n --spacing-xl: 20px;\r\n --spacing-2xl: 24px;\r\n --spacing-3xl: 32px;\r\n \r\n /* Typography */\r\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\r\n --font-size-xs: 11px;\r\n --font-size-sm: 12px;\r\n --font-size-base: 14px;\r\n --font-size-md: 16px;\r\n --font-size-lg: 18px;\r\n --font-size-xl: 20px;\r\n --font-weight-normal: 400;\r\n --font-weight-medium: 500;\r\n --font-weight-semibold: 600;\r\n --font-weight-bold: 700;\r\n \r\n /* Border Radius */\r\n --border-radius-sm: 4px;\r\n --border-radius-md: 6px;\r\n --border-radius-lg: 8px;\r\n --border-radius-xl: 12px;\r\n \r\n /* Shadows */\r\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\r\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\r\n \r\n /* Z-index */\r\n --z-extension: 999999999;\r\n --z-modal: 1050;\r\n --z-dropdown: 1000;\r\n \r\n /* Transitions */\r\n --transition-fast: 150ms ease;\r\n --transition-base: 250ms ease;\r\n --transition-slow: 350ms ease;\r\n}",
6
+ footer: "/* LoopNet Extension Footer - Extracted from content.js AS-IS */\r\n.ln-footer {\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n background: var(--bg-light, #ededed);\r\n border-top: 1px solid var(--border-color-dark, #919090ff);\r\n box-shadow: var(--shadow-lg, 0 -8px 32px rgba(0, 0, 0, 0.08));\r\n z-index: var(--z-extension, 999999999);\r\n padding: var(--spacing-lg, 16px) var(--spacing-2xl, 24px);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n font-size: var(--font-size-md, 16px);\r\n color: var(--text-primary, #212529);\r\n width: 100%;\r\n box-sizing: border-box;\r\n}\r\n\r\n.ln-footer-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n max-width: 1600px;\r\n margin: 0 auto;\r\n gap: var(--spacing-xl, 20px);\r\n}\r\n\r\n.ln-footer-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n flex: 1;\r\n width: 100%;\r\n}\r\n\r\n.ln-footer-right {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-lg, 16px);\r\n flex-shrink: 0;\r\n}\r\n\r\n.ln-metrics-grid {\r\n display: grid;\r\n grid-template-columns: repeat(9, 1fr);\r\n gap: var(--spacing-lg, 16px);\r\n align-items: start;\r\n}\r\n\r\n.ln-metric-column {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-metric {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n min-width: 0;\r\n}\r\n\r\n.ln-metric-label {\r\n font-size: var(--font-size-xs, 11px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n line-height: 1;\r\n}\r\n\r\n.ln-metric-value {\r\n font-weight: var(--font-weight-semibold, 600);\r\n font-size: var(--font-size-md, 16px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n line-height: 1.2;\r\n}\r\n\r\n.ln-price {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\n.ln-cashflow.negative {\r\n color: var(--color-danger, #dc3545);\r\n}\r\n\r\n.ln-cashflow.positive {\r\n color: var(--color-success, #28a745);\r\n}\r\n\r\n.ln-phone {\r\n color: var(--color-info, #17a2b8);\r\n cursor: pointer;\r\n text-decoration: underline;\r\n}\r\n\r\n.ln-phone:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-property-type-dropdown {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n background: var(--bg-primary, #ffffff);\r\n color: var(--text-primary, #212529);\r\n cursor: pointer;\r\n min-width: 120px;\r\n}\r\n\r\n.ln-property-type-dropdown:focus {\r\n outline: none;\r\n border-color: var(--color-primary, #007bff);\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.ln-export-button {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n font-weight: var(--font-weight-medium, 500);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-export-button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.ln-export-icon {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n}\r\n\r\n.ln-discount-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-discount-input {\r\n width: 60px;\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-sm, 12px);\r\n text-align: center;\r\n}\r\n\r\n.ln-discount-button {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n background: var(--color-secondary, #6c757d);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-xs, 11px);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-discount-button:hover {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-discount-button.active {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n@media (max-width: 1400px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(6, 1fr);\r\n }\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n .ln-footer {\r\n padding: var(--spacing-md, 12px) var(--spacing-lg, 16px);\r\n }\r\n \r\n .ln-footer-container {\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(4, 1fr);\r\n }\r\n \r\n .ln-footer-right {\r\n width: 100%;\r\n justify-content: flex-end;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metric-value {\r\n font-size: var(--font-size-base, 14px);\r\n }\r\n}",
7
+ dashboard: "/* Dashboard styles - extracted from existing dashboard CSS AS-IS */\r\n\r\n/* Base dashboard styles */\r\n.dashboard-container {\r\n min-height: 100vh;\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n color: var(--text-primary, #212529);\r\n}\r\n\r\n.header {\r\n background: var(--bg-primary, white);\r\n padding: var(--spacing-xl, 20px) var(--spacing-2xl, 24px);\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\r\n}\r\n\r\n.header h1 {\r\n color: var(--color-primary, #007bff);\r\n margin-bottom: var(--spacing-xl, 20px);\r\n}\r\n\r\n.filters {\r\n display: flex;\r\n gap: var(--spacing-lg, 15px);\r\n flex-wrap: wrap;\r\n align-items: end;\r\n}\r\n\r\n.filter-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-xs, 5px);\r\n}\r\n\r\n.filter-group label {\r\n font-size: var(--font-size-sm, 12px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.filter-group input, .filter-group select {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n min-width: 120px;\r\n}\r\n\r\n.filter-group button {\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n cursor: pointer;\r\n}\r\n\r\n.filter-group button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.stats {\r\n display: flex;\r\n gap: var(--spacing-xl, 20px);\r\n margin-top: var(--spacing-xl, 20px);\r\n font-size: var(--font-size-base, 14px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.table-container {\r\n background: var(--bg-primary, white);\r\n border-radius: var(--border-radius-lg, 8px);\r\n box-shadow: var(--shadow-base, 0 2px 4px rgba(0,0,0,0.1));\r\n overflow: hidden;\r\n}\r\n\r\ntable {\r\n width: 100%;\r\n border-collapse: collapse;\r\n}\r\n\r\nth, td {\r\n padding: var(--spacing-lg, 15px) var(--spacing-md, 12px);\r\n text-align: left;\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n}\r\n\r\nth {\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-weight: var(--font-weight-semibold, 600);\r\n color: var(--text-muted, #495057);\r\n font-size: var(--font-size-sm, 12px);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\nth a {\r\n color: var(--text-muted, #495057);\r\n text-decoration: none;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-xs, 4px);\r\n}\r\n\r\nth a:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\nth a.sort-active {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\ntr:hover {\r\n background: var(--bg-secondary, #f8f9fa);\r\n}\r\n\r\n.property-link {\r\n color: var(--color-primary, #007bff);\r\n text-decoration: none;\r\n font-weight: var(--font-weight-medium, 500);\r\n}\r\n\r\n.property-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.contract-state {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border-radius: var(--border-radius-xl, 12px);\r\n font-size: var(--font-size-xs, 11px);\r\n font-weight: var(--font-weight-semibold, 600);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.contract-none { \r\n background: var(--border-color-light, #e9ecef); \r\n color: var(--text-muted, #495057); \r\n}\r\n\r\n.contract-loi_sent { \r\n background: #fff3cd; \r\n color: #856404; \r\n}\r\n\r\n.contract-loi_agreed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-loi_rejected { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.contract-contract_signed { \r\n background: #d1ecf1; \r\n color: #0c5460; \r\n}\r\n\r\n.contract-closed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-not_interested { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.date-cell {\r\n font-size: var(--font-size-sm, 13px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.pagination {\r\n display: flex;\r\n justify-content: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-xl, 20px);\r\n padding: var(--spacing-xl, 20px);\r\n}\r\n\r\n.page-link {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n background: var(--bg-primary, white);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n color: var(--text-primary, #212529);\r\n text-decoration: none;\r\n transition: all var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.page-link:hover {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}\r\n\r\n.page-link.active {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}",
8
+
9
+ // Combined styles
10
+ extension: "/* Shared CSS custom properties - extracted from your existing styles */\r\n:root {\r\n /* Colors */\r\n --color-primary: #007bff;\r\n --color-primary-hover: #0056b3;\r\n --color-secondary: #6c757d;\r\n --color-success: #28a745;\r\n --color-warning: #ffc107;\r\n --color-danger: #dc3545;\r\n --color-info: #17a2b8;\r\n \r\n /* Backgrounds */\r\n --bg-primary: #ffffff;\r\n --bg-secondary: #f8f9fa;\r\n --bg-light: #ededed;\r\n --bg-dark: #343a40;\r\n \r\n /* Text Colors */\r\n --text-primary: #212529;\r\n --text-secondary: #6c757d;\r\n --text-muted: #495057;\r\n --text-white: #ffffff;\r\n \r\n /* Borders */\r\n --border-color: #ddd;\r\n --border-color-light: #e9ecef;\r\n --border-color-dark: #919090ff;\r\n \r\n /* Spacing */\r\n --spacing-xs: 4px;\r\n --spacing-sm: 8px;\r\n --spacing-md: 12px;\r\n --spacing-lg: 16px;\r\n --spacing-xl: 20px;\r\n --spacing-2xl: 24px;\r\n --spacing-3xl: 32px;\r\n \r\n /* Typography */\r\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\r\n --font-size-xs: 11px;\r\n --font-size-sm: 12px;\r\n --font-size-base: 14px;\r\n --font-size-md: 16px;\r\n --font-size-lg: 18px;\r\n --font-size-xl: 20px;\r\n --font-weight-normal: 400;\r\n --font-weight-medium: 500;\r\n --font-weight-semibold: 600;\r\n --font-weight-bold: 700;\r\n \r\n /* Border Radius */\r\n --border-radius-sm: 4px;\r\n --border-radius-md: 6px;\r\n --border-radius-lg: 8px;\r\n --border-radius-xl: 12px;\r\n \r\n /* Shadows */\r\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\r\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\r\n \r\n /* Z-index */\r\n --z-extension: 999999999;\r\n --z-modal: 1050;\r\n --z-dropdown: 1000;\r\n \r\n /* Transitions */\r\n --transition-fast: 150ms ease;\r\n --transition-base: 250ms ease;\r\n --transition-slow: 350ms ease;\r\n}/* LoopNet Extension Footer - Extracted from content.js AS-IS */\r\n.ln-footer {\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n background: var(--bg-light, #ededed);\r\n border-top: 1px solid var(--border-color-dark, #919090ff);\r\n box-shadow: var(--shadow-lg, 0 -8px 32px rgba(0, 0, 0, 0.08));\r\n z-index: var(--z-extension, 999999999);\r\n padding: var(--spacing-lg, 16px) var(--spacing-2xl, 24px);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n font-size: var(--font-size-md, 16px);\r\n color: var(--text-primary, #212529);\r\n width: 100%;\r\n box-sizing: border-box;\r\n}\r\n\r\n.ln-footer-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n max-width: 1600px;\r\n margin: 0 auto;\r\n gap: var(--spacing-xl, 20px);\r\n}\r\n\r\n.ln-footer-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n flex: 1;\r\n width: 100%;\r\n}\r\n\r\n.ln-footer-right {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-lg, 16px);\r\n flex-shrink: 0;\r\n}\r\n\r\n.ln-metrics-grid {\r\n display: grid;\r\n grid-template-columns: repeat(9, 1fr);\r\n gap: var(--spacing-lg, 16px);\r\n align-items: start;\r\n}\r\n\r\n.ln-metric-column {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-metric {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n min-width: 0;\r\n}\r\n\r\n.ln-metric-label {\r\n font-size: var(--font-size-xs, 11px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n line-height: 1;\r\n}\r\n\r\n.ln-metric-value {\r\n font-weight: var(--font-weight-semibold, 600);\r\n font-size: var(--font-size-md, 16px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n line-height: 1.2;\r\n}\r\n\r\n.ln-price {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\n.ln-cashflow.negative {\r\n color: var(--color-danger, #dc3545);\r\n}\r\n\r\n.ln-cashflow.positive {\r\n color: var(--color-success, #28a745);\r\n}\r\n\r\n.ln-phone {\r\n color: var(--color-info, #17a2b8);\r\n cursor: pointer;\r\n text-decoration: underline;\r\n}\r\n\r\n.ln-phone:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-property-type-dropdown {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n background: var(--bg-primary, #ffffff);\r\n color: var(--text-primary, #212529);\r\n cursor: pointer;\r\n min-width: 120px;\r\n}\r\n\r\n.ln-property-type-dropdown:focus {\r\n outline: none;\r\n border-color: var(--color-primary, #007bff);\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.ln-export-button {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n font-weight: var(--font-weight-medium, 500);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-export-button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.ln-export-icon {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n}\r\n\r\n.ln-discount-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-sm, 8px);\r\n}\r\n\r\n.ln-discount-input {\r\n width: 60px;\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-sm, 12px);\r\n text-align: center;\r\n}\r\n\r\n.ln-discount-button {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n background: var(--color-secondary, #6c757d);\r\n color: var(--text-white, #ffffff);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-xs, 11px);\r\n cursor: pointer;\r\n transition: background-color var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.ln-discount-button:hover {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n.ln-discount-button.active {\r\n background: var(--color-primary, #007bff);\r\n}\r\n\r\n@media (max-width: 1400px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(6, 1fr);\r\n }\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n .ln-footer {\r\n padding: var(--spacing-md, 12px) var(--spacing-lg, 16px);\r\n }\r\n \r\n .ln-footer-container {\r\n flex-direction: column;\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(4, 1fr);\r\n }\r\n \r\n .ln-footer-right {\r\n width: 100%;\r\n justify-content: flex-end;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .ln-metrics-grid {\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: var(--spacing-md, 12px);\r\n }\r\n \r\n .ln-metric-value {\r\n font-size: var(--font-size-base, 14px);\r\n }\r\n}",
11
+ dashboardApp: "/* Shared CSS custom properties - extracted from your existing styles */\r\n:root {\r\n /* Colors */\r\n --color-primary: #007bff;\r\n --color-primary-hover: #0056b3;\r\n --color-secondary: #6c757d;\r\n --color-success: #28a745;\r\n --color-warning: #ffc107;\r\n --color-danger: #dc3545;\r\n --color-info: #17a2b8;\r\n \r\n /* Backgrounds */\r\n --bg-primary: #ffffff;\r\n --bg-secondary: #f8f9fa;\r\n --bg-light: #ededed;\r\n --bg-dark: #343a40;\r\n \r\n /* Text Colors */\r\n --text-primary: #212529;\r\n --text-secondary: #6c757d;\r\n --text-muted: #495057;\r\n --text-white: #ffffff;\r\n \r\n /* Borders */\r\n --border-color: #ddd;\r\n --border-color-light: #e9ecef;\r\n --border-color-dark: #919090ff;\r\n \r\n /* Spacing */\r\n --spacing-xs: 4px;\r\n --spacing-sm: 8px;\r\n --spacing-md: 12px;\r\n --spacing-lg: 16px;\r\n --spacing-xl: 20px;\r\n --spacing-2xl: 24px;\r\n --spacing-3xl: 32px;\r\n \r\n /* Typography */\r\n --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\r\n --font-size-xs: 11px;\r\n --font-size-sm: 12px;\r\n --font-size-base: 14px;\r\n --font-size-md: 16px;\r\n --font-size-lg: 18px;\r\n --font-size-xl: 20px;\r\n --font-weight-normal: 400;\r\n --font-weight-medium: 500;\r\n --font-weight-semibold: 600;\r\n --font-weight-bold: 700;\r\n \r\n /* Border Radius */\r\n --border-radius-sm: 4px;\r\n --border-radius-md: 6px;\r\n --border-radius-lg: 8px;\r\n --border-radius-xl: 12px;\r\n \r\n /* Shadows */\r\n --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);\r\n --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\r\n \r\n /* Z-index */\r\n --z-extension: 999999999;\r\n --z-modal: 1050;\r\n --z-dropdown: 1000;\r\n \r\n /* Transitions */\r\n --transition-fast: 150ms ease;\r\n --transition-base: 250ms ease;\r\n --transition-slow: 350ms ease;\r\n}/* Dashboard styles - extracted from existing dashboard CSS AS-IS */\r\n\r\n/* Base dashboard styles */\r\n.dashboard-container {\r\n min-height: 100vh;\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);\r\n color: var(--text-primary, #212529);\r\n}\r\n\r\n.header {\r\n background: var(--bg-primary, white);\r\n padding: var(--spacing-xl, 20px) var(--spacing-2xl, 24px);\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\r\n}\r\n\r\n.header h1 {\r\n color: var(--color-primary, #007bff);\r\n margin-bottom: var(--spacing-xl, 20px);\r\n}\r\n\r\n.filters {\r\n display: flex;\r\n gap: var(--spacing-lg, 15px);\r\n flex-wrap: wrap;\r\n align-items: end;\r\n}\r\n\r\n.filter-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--spacing-xs, 5px);\r\n}\r\n\r\n.filter-group label {\r\n font-size: var(--font-size-sm, 12px);\r\n color: var(--text-secondary, #6c757d);\r\n font-weight: var(--font-weight-medium, 500);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.filter-group input, .filter-group select {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n min-width: 120px;\r\n}\r\n\r\n.filter-group button {\r\n padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border: none;\r\n border-radius: var(--border-radius-sm, 4px);\r\n font-size: var(--font-size-base, 14px);\r\n cursor: pointer;\r\n}\r\n\r\n.filter-group button:hover {\r\n background: var(--color-primary-hover, #0056b3);\r\n}\r\n\r\n.stats {\r\n display: flex;\r\n gap: var(--spacing-xl, 20px);\r\n margin-top: var(--spacing-xl, 20px);\r\n font-size: var(--font-size-base, 14px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.table-container {\r\n background: var(--bg-primary, white);\r\n border-radius: var(--border-radius-lg, 8px);\r\n box-shadow: var(--shadow-base, 0 2px 4px rgba(0,0,0,0.1));\r\n overflow: hidden;\r\n}\r\n\r\ntable {\r\n width: 100%;\r\n border-collapse: collapse;\r\n}\r\n\r\nth, td {\r\n padding: var(--spacing-lg, 15px) var(--spacing-md, 12px);\r\n text-align: left;\r\n border-bottom: 1px solid var(--border-color-light, #e9ecef);\r\n}\r\n\r\nth {\r\n background: var(--bg-secondary, #f8f9fa);\r\n font-weight: var(--font-weight-semibold, 600);\r\n color: var(--text-muted, #495057);\r\n font-size: var(--font-size-sm, 12px);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\nth a {\r\n color: var(--text-muted, #495057);\r\n text-decoration: none;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--spacing-xs, 4px);\r\n}\r\n\r\nth a:hover {\r\n color: var(--color-primary, #007bff);\r\n}\r\n\r\nth a.sort-active {\r\n color: var(--color-primary, #007bff);\r\n font-weight: var(--font-weight-bold, 700);\r\n}\r\n\r\ntr:hover {\r\n background: var(--bg-secondary, #f8f9fa);\r\n}\r\n\r\n.property-link {\r\n color: var(--color-primary, #007bff);\r\n text-decoration: none;\r\n font-weight: var(--font-weight-medium, 500);\r\n}\r\n\r\n.property-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.contract-state {\r\n padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);\r\n border-radius: var(--border-radius-xl, 12px);\r\n font-size: var(--font-size-xs, 11px);\r\n font-weight: var(--font-weight-semibold, 600);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.contract-none { \r\n background: var(--border-color-light, #e9ecef); \r\n color: var(--text-muted, #495057); \r\n}\r\n\r\n.contract-loi_sent { \r\n background: #fff3cd; \r\n color: #856404; \r\n}\r\n\r\n.contract-loi_agreed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-loi_rejected { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.contract-contract_signed { \r\n background: #d1ecf1; \r\n color: #0c5460; \r\n}\r\n\r\n.contract-closed { \r\n background: #d4edda; \r\n color: #155724; \r\n}\r\n\r\n.contract-not_interested { \r\n background: #f8d7da; \r\n color: #721c24; \r\n}\r\n\r\n.date-cell {\r\n font-size: var(--font-size-sm, 13px);\r\n color: var(--text-secondary, #6c757d);\r\n}\r\n\r\n.pagination {\r\n display: flex;\r\n justify-content: center;\r\n gap: var(--spacing-sm, 8px);\r\n margin-top: var(--spacing-xl, 20px);\r\n padding: var(--spacing-xl, 20px);\r\n}\r\n\r\n.page-link {\r\n padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);\r\n background: var(--bg-primary, white);\r\n border: 1px solid var(--border-color, #ddd);\r\n border-radius: var(--border-radius-sm, 4px);\r\n color: var(--text-primary, #212529);\r\n text-decoration: none;\r\n transition: all var(--transition-fast, 150ms ease);\r\n}\r\n\r\n.page-link:hover {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}\r\n\r\n.page-link.active {\r\n background: var(--color-primary, #007bff);\r\n color: var(--text-white, white);\r\n border-color: var(--color-primary, #007bff);\r\n}"
12
+ };
13
+
14
+ export function injectStyles(cssString, id = "injected-styles") {
15
+ if (typeof document === 'undefined') return null;
16
+
17
+ const existing = document.getElementById(id);
18
+ if (existing) existing.remove();
19
+
20
+ const style = document.createElement("style");
21
+ style.id = id;
22
+ style.textContent = cssString;
23
+ document.head.appendChild(style);
24
+
25
+ return style;
26
+ }
27
+
28
+ export function injectFooterStyles() {
29
+ return injectStyles(styles.extension, "ln-footer-styles");
30
+ }
31
+
32
+ export function injectDashboardStyles() {
33
+ return injectStyles(styles.dashboardApp, "dashboard-styles");
34
+ }
@@ -0,0 +1,209 @@
1
+ /* Dashboard styles - extracted from existing dashboard CSS AS-IS */
2
+
3
+ /* Base dashboard styles */
4
+ .dashboard-container {
5
+ min-height: 100vh;
6
+ background: var(--bg-secondary, #f8f9fa);
7
+ font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);
8
+ color: var(--text-primary, #212529);
9
+ }
10
+
11
+ .header {
12
+ background: var(--bg-primary, white);
13
+ padding: var(--spacing-xl, 20px) var(--spacing-2xl, 24px);
14
+ border-bottom: 1px solid var(--border-color-light, #e9ecef);
15
+ box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));
16
+ }
17
+
18
+ .header h1 {
19
+ color: var(--color-primary, #007bff);
20
+ margin-bottom: var(--spacing-xl, 20px);
21
+ }
22
+
23
+ .filters {
24
+ display: flex;
25
+ gap: var(--spacing-lg, 15px);
26
+ flex-wrap: wrap;
27
+ align-items: end;
28
+ }
29
+
30
+ .filter-group {
31
+ display: flex;
32
+ flex-direction: column;
33
+ gap: var(--spacing-xs, 5px);
34
+ }
35
+
36
+ .filter-group label {
37
+ font-size: var(--font-size-sm, 12px);
38
+ color: var(--text-secondary, #6c757d);
39
+ font-weight: var(--font-weight-medium, 500);
40
+ text-transform: uppercase;
41
+ letter-spacing: 0.5px;
42
+ }
43
+
44
+ .filter-group input, .filter-group select {
45
+ padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);
46
+ border: 1px solid var(--border-color, #ddd);
47
+ border-radius: var(--border-radius-sm, 4px);
48
+ font-size: var(--font-size-base, 14px);
49
+ min-width: 120px;
50
+ }
51
+
52
+ .filter-group button {
53
+ padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);
54
+ background: var(--color-primary, #007bff);
55
+ color: var(--text-white, white);
56
+ border: none;
57
+ border-radius: var(--border-radius-sm, 4px);
58
+ font-size: var(--font-size-base, 14px);
59
+ cursor: pointer;
60
+ }
61
+
62
+ .filter-group button:hover {
63
+ background: var(--color-primary-hover, #0056b3);
64
+ }
65
+
66
+ .stats {
67
+ display: flex;
68
+ gap: var(--spacing-xl, 20px);
69
+ margin-top: var(--spacing-xl, 20px);
70
+ font-size: var(--font-size-base, 14px);
71
+ color: var(--text-secondary, #6c757d);
72
+ }
73
+
74
+ .table-container {
75
+ background: var(--bg-primary, white);
76
+ border-radius: var(--border-radius-lg, 8px);
77
+ box-shadow: var(--shadow-base, 0 2px 4px rgba(0,0,0,0.1));
78
+ overflow: hidden;
79
+ }
80
+
81
+ table {
82
+ width: 100%;
83
+ border-collapse: collapse;
84
+ }
85
+
86
+ th, td {
87
+ padding: var(--spacing-lg, 15px) var(--spacing-md, 12px);
88
+ text-align: left;
89
+ border-bottom: 1px solid var(--border-color-light, #e9ecef);
90
+ }
91
+
92
+ th {
93
+ background: var(--bg-secondary, #f8f9fa);
94
+ font-weight: var(--font-weight-semibold, 600);
95
+ color: var(--text-muted, #495057);
96
+ font-size: var(--font-size-sm, 12px);
97
+ text-transform: uppercase;
98
+ letter-spacing: 0.5px;
99
+ }
100
+
101
+ th a {
102
+ color: var(--text-muted, #495057);
103
+ text-decoration: none;
104
+ display: flex;
105
+ align-items: center;
106
+ gap: var(--spacing-xs, 4px);
107
+ }
108
+
109
+ th a:hover {
110
+ color: var(--color-primary, #007bff);
111
+ }
112
+
113
+ th a.sort-active {
114
+ color: var(--color-primary, #007bff);
115
+ font-weight: var(--font-weight-bold, 700);
116
+ }
117
+
118
+ tr:hover {
119
+ background: var(--bg-secondary, #f8f9fa);
120
+ }
121
+
122
+ .property-link {
123
+ color: var(--color-primary, #007bff);
124
+ text-decoration: none;
125
+ font-weight: var(--font-weight-medium, 500);
126
+ }
127
+
128
+ .property-link:hover {
129
+ text-decoration: underline;
130
+ }
131
+
132
+ .contract-state {
133
+ padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);
134
+ border-radius: var(--border-radius-xl, 12px);
135
+ font-size: var(--font-size-xs, 11px);
136
+ font-weight: var(--font-weight-semibold, 600);
137
+ text-transform: uppercase;
138
+ letter-spacing: 0.5px;
139
+ }
140
+
141
+ .contract-none {
142
+ background: var(--border-color-light, #e9ecef);
143
+ color: var(--text-muted, #495057);
144
+ }
145
+
146
+ .contract-loi_sent {
147
+ background: #fff3cd;
148
+ color: #856404;
149
+ }
150
+
151
+ .contract-loi_agreed {
152
+ background: #d4edda;
153
+ color: #155724;
154
+ }
155
+
156
+ .contract-loi_rejected {
157
+ background: #f8d7da;
158
+ color: #721c24;
159
+ }
160
+
161
+ .contract-contract_signed {
162
+ background: #d1ecf1;
163
+ color: #0c5460;
164
+ }
165
+
166
+ .contract-closed {
167
+ background: #d4edda;
168
+ color: #155724;
169
+ }
170
+
171
+ .contract-not_interested {
172
+ background: #f8d7da;
173
+ color: #721c24;
174
+ }
175
+
176
+ .date-cell {
177
+ font-size: var(--font-size-sm, 13px);
178
+ color: var(--text-secondary, #6c757d);
179
+ }
180
+
181
+ .pagination {
182
+ display: flex;
183
+ justify-content: center;
184
+ gap: var(--spacing-sm, 8px);
185
+ margin-top: var(--spacing-xl, 20px);
186
+ padding: var(--spacing-xl, 20px);
187
+ }
188
+
189
+ .page-link {
190
+ padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);
191
+ background: var(--bg-primary, white);
192
+ border: 1px solid var(--border-color, #ddd);
193
+ border-radius: var(--border-radius-sm, 4px);
194
+ color: var(--text-primary, #212529);
195
+ text-decoration: none;
196
+ transition: all var(--transition-fast, 150ms ease);
197
+ }
198
+
199
+ .page-link:hover {
200
+ background: var(--color-primary, #007bff);
201
+ color: var(--text-white, white);
202
+ border-color: var(--color-primary, #007bff);
203
+ }
204
+
205
+ .page-link.active {
206
+ background: var(--color-primary, #007bff);
207
+ color: var(--text-white, white);
208
+ border-color: var(--color-primary, #007bff);
209
+ }
@@ -0,0 +1,216 @@
1
+ /* LoopNet Extension Footer - Extracted from content.js AS-IS */
2
+ .ln-footer {
3
+ position: fixed;
4
+ bottom: 0;
5
+ left: 0;
6
+ right: 0;
7
+ background: var(--bg-light, #ededed);
8
+ border-top: 1px solid var(--border-color-dark, #919090ff);
9
+ box-shadow: var(--shadow-lg, 0 -8px 32px rgba(0, 0, 0, 0.08));
10
+ z-index: var(--z-extension, 999999999);
11
+ padding: var(--spacing-lg, 16px) var(--spacing-2xl, 24px);
12
+ font-family: var(--font-family-base, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);
13
+ font-size: var(--font-size-md, 16px);
14
+ color: var(--text-primary, #212529);
15
+ width: 100%;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ .ln-footer-container {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ max-width: 1600px;
24
+ margin: 0 auto;
25
+ gap: var(--spacing-xl, 20px);
26
+ }
27
+
28
+ .ln-footer-content {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: var(--spacing-md, 12px);
32
+ flex: 1;
33
+ width: 100%;
34
+ }
35
+
36
+ .ln-footer-right {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: var(--spacing-lg, 16px);
40
+ flex-shrink: 0;
41
+ }
42
+
43
+ .ln-metrics-grid {
44
+ display: grid;
45
+ grid-template-columns: repeat(9, 1fr);
46
+ gap: var(--spacing-lg, 16px);
47
+ align-items: start;
48
+ }
49
+
50
+ .ln-metric-column {
51
+ display: flex;
52
+ flex-direction: column;
53
+ gap: var(--spacing-sm, 8px);
54
+ }
55
+
56
+ .ln-metric {
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: 2px;
60
+ min-width: 0;
61
+ }
62
+
63
+ .ln-metric-label {
64
+ font-size: var(--font-size-xs, 11px);
65
+ color: var(--text-secondary, #6c757d);
66
+ font-weight: var(--font-weight-medium, 500);
67
+ text-transform: uppercase;
68
+ letter-spacing: 0.5px;
69
+ line-height: 1;
70
+ }
71
+
72
+ .ln-metric-value {
73
+ font-weight: var(--font-weight-semibold, 600);
74
+ font-size: var(--font-size-md, 16px);
75
+ white-space: nowrap;
76
+ overflow: hidden;
77
+ text-overflow: ellipsis;
78
+ line-height: 1.2;
79
+ }
80
+
81
+ .ln-price {
82
+ color: var(--color-primary, #007bff);
83
+ font-weight: var(--font-weight-bold, 700);
84
+ }
85
+
86
+ .ln-cashflow.negative {
87
+ color: var(--color-danger, #dc3545);
88
+ }
89
+
90
+ .ln-cashflow.positive {
91
+ color: var(--color-success, #28a745);
92
+ }
93
+
94
+ .ln-phone {
95
+ color: var(--color-info, #17a2b8);
96
+ cursor: pointer;
97
+ text-decoration: underline;
98
+ }
99
+
100
+ .ln-phone:hover {
101
+ color: var(--color-primary, #007bff);
102
+ }
103
+
104
+ .ln-property-type-dropdown {
105
+ padding: var(--spacing-sm, 8px) var(--spacing-md, 12px);
106
+ border: 1px solid var(--border-color, #ddd);
107
+ border-radius: var(--border-radius-sm, 4px);
108
+ font-size: var(--font-size-base, 14px);
109
+ background: var(--bg-primary, #ffffff);
110
+ color: var(--text-primary, #212529);
111
+ cursor: pointer;
112
+ min-width: 120px;
113
+ }
114
+
115
+ .ln-property-type-dropdown:focus {
116
+ outline: none;
117
+ border-color: var(--color-primary, #007bff);
118
+ box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
119
+ }
120
+
121
+ .ln-export-button {
122
+ display: flex;
123
+ align-items: center;
124
+ gap: var(--spacing-sm, 8px);
125
+ padding: var(--spacing-sm, 8px) var(--spacing-lg, 16px);
126
+ background: var(--color-primary, #007bff);
127
+ color: var(--text-white, #ffffff);
128
+ border: none;
129
+ border-radius: var(--border-radius-sm, 4px);
130
+ font-size: var(--font-size-base, 14px);
131
+ font-weight: var(--font-weight-medium, 500);
132
+ cursor: pointer;
133
+ transition: background-color var(--transition-fast, 150ms ease);
134
+ }
135
+
136
+ .ln-export-button:hover {
137
+ background: var(--color-primary-hover, #0056b3);
138
+ }
139
+
140
+ .ln-export-icon {
141
+ width: 16px;
142
+ height: 16px;
143
+ fill: currentColor;
144
+ }
145
+
146
+ .ln-discount-controls {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: var(--spacing-sm, 8px);
150
+ margin-top: var(--spacing-sm, 8px);
151
+ }
152
+
153
+ .ln-discount-input {
154
+ width: 60px;
155
+ padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);
156
+ border: 1px solid var(--border-color, #ddd);
157
+ border-radius: var(--border-radius-sm, 4px);
158
+ font-size: var(--font-size-sm, 12px);
159
+ text-align: center;
160
+ }
161
+
162
+ .ln-discount-button {
163
+ padding: var(--spacing-xs, 4px) var(--spacing-sm, 8px);
164
+ background: var(--color-secondary, #6c757d);
165
+ color: var(--text-white, #ffffff);
166
+ border: none;
167
+ border-radius: var(--border-radius-sm, 4px);
168
+ font-size: var(--font-size-xs, 11px);
169
+ cursor: pointer;
170
+ transition: background-color var(--transition-fast, 150ms ease);
171
+ }
172
+
173
+ .ln-discount-button:hover {
174
+ background: var(--color-primary, #007bff);
175
+ }
176
+
177
+ .ln-discount-button.active {
178
+ background: var(--color-primary, #007bff);
179
+ }
180
+
181
+ @media (max-width: 1400px) {
182
+ .ln-metrics-grid {
183
+ grid-template-columns: repeat(6, 1fr);
184
+ }
185
+ }
186
+
187
+ @media (max-width: 1024px) {
188
+ .ln-footer {
189
+ padding: var(--spacing-md, 12px) var(--spacing-lg, 16px);
190
+ }
191
+
192
+ .ln-footer-container {
193
+ flex-direction: column;
194
+ gap: var(--spacing-md, 12px);
195
+ }
196
+
197
+ .ln-metrics-grid {
198
+ grid-template-columns: repeat(4, 1fr);
199
+ }
200
+
201
+ .ln-footer-right {
202
+ width: 100%;
203
+ justify-content: flex-end;
204
+ }
205
+ }
206
+
207
+ @media (max-width: 768px) {
208
+ .ln-metrics-grid {
209
+ grid-template-columns: repeat(3, 1fr);
210
+ gap: var(--spacing-md, 12px);
211
+ }
212
+
213
+ .ln-metric-value {
214
+ font-size: var(--font-size-base, 14px);
215
+ }
216
+ }
@@ -0,0 +1,41 @@
1
+ // Simple CSS injection utilities - no duplication, just read CSS files and inject
2
+
3
+ // Import CSS files as strings (will be handled by build process)
4
+ import variablesCSS from "./variables.css?raw";
5
+ import footerCSS from "./footer.css?raw";
6
+ import dashboardCSS from "./dashboard.css?raw";
7
+
8
+ // Combined CSS strings
9
+ export const styles = {
10
+ variables: variablesCSS,
11
+ footer: footerCSS,
12
+ dashboard: dashboardCSS,
13
+
14
+ // Combined styles for different contexts
15
+ extension: variablesCSS + footerCSS,
16
+ dashboardApp: variablesCSS + dashboardCSS
17
+ };
18
+
19
+ // Simple injection function
20
+ export function injectStyles(cssString, id = "injected-styles") {
21
+ if (typeof document === 'undefined') return null;
22
+
23
+ const existing = document.getElementById(id);
24
+ if (existing) existing.remove();
25
+
26
+ const style = document.createElement("style");
27
+ style.id = id;
28
+ style.textContent = cssString;
29
+ document.head.appendChild(style);
30
+
31
+ return style;
32
+ }
33
+
34
+ // Specific injection functions for each project
35
+ export function injectFooterStyles() {
36
+ return injectStyles(styles.extension, "ln-footer-styles");
37
+ }
38
+
39
+ export function injectDashboardStyles() {
40
+ return injectStyles(styles.dashboardApp, "dashboard-styles");
41
+ }
@@ -0,0 +1,73 @@
1
+ /* Shared CSS custom properties - extracted from your existing styles */
2
+ :root {
3
+ /* Colors */
4
+ --color-primary: #007bff;
5
+ --color-primary-hover: #0056b3;
6
+ --color-secondary: #6c757d;
7
+ --color-success: #28a745;
8
+ --color-warning: #ffc107;
9
+ --color-danger: #dc3545;
10
+ --color-info: #17a2b8;
11
+
12
+ /* Backgrounds */
13
+ --bg-primary: #ffffff;
14
+ --bg-secondary: #f8f9fa;
15
+ --bg-light: #ededed;
16
+ --bg-dark: #343a40;
17
+
18
+ /* Text Colors */
19
+ --text-primary: #212529;
20
+ --text-secondary: #6c757d;
21
+ --text-muted: #495057;
22
+ --text-white: #ffffff;
23
+
24
+ /* Borders */
25
+ --border-color: #ddd;
26
+ --border-color-light: #e9ecef;
27
+ --border-color-dark: #919090ff;
28
+
29
+ /* Spacing */
30
+ --spacing-xs: 4px;
31
+ --spacing-sm: 8px;
32
+ --spacing-md: 12px;
33
+ --spacing-lg: 16px;
34
+ --spacing-xl: 20px;
35
+ --spacing-2xl: 24px;
36
+ --spacing-3xl: 32px;
37
+
38
+ /* Typography */
39
+ --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
40
+ --font-size-xs: 11px;
41
+ --font-size-sm: 12px;
42
+ --font-size-base: 14px;
43
+ --font-size-md: 16px;
44
+ --font-size-lg: 18px;
45
+ --font-size-xl: 20px;
46
+ --font-weight-normal: 400;
47
+ --font-weight-medium: 500;
48
+ --font-weight-semibold: 600;
49
+ --font-weight-bold: 700;
50
+
51
+ /* Border Radius */
52
+ --border-radius-sm: 4px;
53
+ --border-radius-md: 6px;
54
+ --border-radius-lg: 8px;
55
+ --border-radius-xl: 12px;
56
+
57
+ /* Shadows */
58
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
59
+ --shadow-base: 0 2px 4px rgba(0, 0, 0, 0.1);
60
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
61
+ --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.08);
62
+ --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);
63
+
64
+ /* Z-index */
65
+ --z-extension: 999999999;
66
+ --z-modal: 1050;
67
+ --z-dropdown: 1000;
68
+
69
+ /* Transitions */
70
+ --transition-fast: 150ms ease;
71
+ --transition-base: 250ms ease;
72
+ --transition-slow: 350ms ease;
73
+ }