Changeset 3473414
- Timestamp:
- 03/03/2026 09:14:36 AM (4 weeks ago)
- Location:
- tracksure/trunk
- Files:
-
- 10 edited
-
admin/dist/336.js (modified) (1 diff)
-
admin/dist/637.js (modified) (1 diff)
-
admin/tracking-goals.js (modified) (2 diffs)
-
admin/tracksure-goal-constants.js (modified) (1 diff)
-
includes/core/admin/class-tracksure-admin-ui.php (modified) (33 diffs)
-
includes/core/api/class-tracksure-rest-goals-controller.php (modified) (68 diffs)
-
includes/core/services/class-tracksure-goal-evaluator.php (modified) (40 diffs)
-
includes/core/tracking/class-tracksure-tracker-assets.php (modified) (15 diffs)
-
readme.txt (modified) (3 diffs)
-
tracksure.php (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tracksure/trunk/admin/dist/336.js
r3472561 r3473414 1 "use strict";(self.webpackChunktracksure_admin=self.webpackChunktracksure_admin||[]).push([[336],{24099:(n,r,e)=>{e.d(r,{A:()=>o});var s=e(71354),t=e.n(s),a=e(76314),A=e.n(a)()(t());A.push([n.id,'/* ==========================================================================\n TrafficSourcesPage.css (Premium summary + table + sorting)\n Matches TrafficSourcesPage.tsx markup exactly\n ========================================================================== */\n\n.ts-sources-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: var(--ts-spacing-lg);\n margin-top: var(--ts-spacing-lg);\n margin-bottom: var(--ts-spacing-lg);\n}\n\n.ts-summary-card {\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-xl);\n box-shadow: var(--ts-shadow-sm);\n padding: 16px 18px;\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.ts-summary-icon {\n width: 32px;\n height: 32px;\n border-radius: 16px;\n display: grid;\n place-items: center;\n font-size: 20px;\n background: var(--ts-surface-2);\n border: 1px solid var(--ts-border);\n flex: 0 0 auto;\n}\n\n.ts-summary-content {\n min-width: 0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ts-summary-value {\n font-size: 18px;\n font-weight: 900;\n letter-spacing: -0.02em;\n line-height: 1.1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.ts-summary-sub {\n font-size: 12px;\n font-weight: 600;\n color: var(--ts-text-muted);\n letter-spacing: 0;\n}\n\n.ts-summary-label {\n color: var(--ts-text-muted);\n font-weight: 650;\n font-size: 13px;\n}\n\n/* View Mode Tabs */\n.ts-view-tabs {\n display: flex;\n gap: 8px;\n margin-bottom: var(--ts-spacing-lg);\n border-bottom: 1px solid var(--ts-border);\n padding-bottom: 8px;\n}\n\n.ts-view-tab {\n padding: 10px 18px;\n border: none;\n background: transparent;\n color: var(--ts-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n transition: all 0.2s;\n position: relative;\n bottom: -9px;\n}\n\n.ts-view-tab:hover {\n color: var(--ts-text);\n background: rgba(14, 165, 233, 0.05);\n border-radius: var(--ts-radius-lg) var(--ts-radius-lg) 0 0;\n}\n\n.ts-view-tab--active {\n color: var(--ts-primary);\n border-bottom-color: var(--ts-primary);\n}\n\n/* Table container */\n.ts-sources-table-container {\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-xl);\n box-shadow: var(--ts-shadow-sm);\n overflow: hidden;\n}\n\n.ts-sources-table-container {\n overflow: auto;\n max-width: 100%;\n}\n\n/* Table */\n.ts-sources-table {\n width: 100%;\n min-width: 720px; /* ensures no overlap; mobile scroll instead */\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-sources-table thead th {\n position: sticky;\n top: 0;\n background: var(--ts-surface-2);\n border-bottom: 1px solid var(--ts-border);\n padding: 12px 14px;\n text-align: left;\n font-weight: 850;\n color: var(--ts-text);\n white-space: nowrap;\n}\n\n.ts-sources-table tbody td {\n padding: 12px 14px;\n border-bottom: 1px solid var(--ts-border);\n color: var(--ts-text);\n vertical-align: middle;\n text-align: center; /* Center all cells by default */\n}\n\n/* First column (Source/Channel) stays left-aligned */\n.ts-sources-table tbody td:first-child {\n text-align: left;\n}\n\n\n\n.ts-sources-table tbody tr:hover td {\n background: rgba(148, 163, 184, 0.10);\n}\n\n[data-theme="dark"] .ts-sources-table tbody tr:hover td {\n background: rgba(148, 163, 184, 0.08);\n}\n\n.ts-source-icon {\n width: 28px;\n height: 28px;\n border-radius: 10px;\n display: inline-grid;\n place-items: center;\n margin-right: 10px;\n background: var(--ts-surface-2);\n border: 1px solid var(--ts-border);\n font-size: 14px;\n}\n\n/* Sorting */\n.ts-sortable {\n cursor: pointer;\n user-select: none;\n}\n\n.ts-sortable:hover {\n background: rgba(14, 165, 233, 0.08);\n}\n\n.ts-sorted {\n color: var(--ts-primary);\n}\n\n.ts-sort-icon {\n color: var(--ts-text-subtle);\n font-weight: 900;\n}\n\n/* Conversion Icon */\n.ts-conversion-icon {\n margin-right: 4px;\n vertical-align: middle;\n}\n\n/* Display Mode Toggle */\n.ts-display-toggle {\n display: flex;\n gap: 8px;\n margin: 16px 0;\n padding: 4px;\n background: var(--ts-surface-2);\n border-radius: var(--ts-radius-md);\n width: fit-content;\n}\n\n.ts-toggle-btn {\n padding: 8px 16px;\n border: 1px solid transparent;\n border-radius: var(--ts-radius-sm);\n background: transparent;\n color: var(--ts-text-subtle);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ts-toggle-btn:hover {\n color: var(--ts-text);\n background: var(--ts-surface);\n}\n\n.ts-toggle-btn--active {\n background: var(--ts-surface);\n color: var(--ts-primary);\n border-color: var(--ts-border);\n box-shadow: var(--ts-shadow-sm);\n}\n\n/* Channel View Styles */\n.ts-channel-row {\n font-weight: 500;\n}\n\n.ts-channel-icon {\n font-size: 18px;\n margin-right: 8px;\n}\n\n.ts-source-count {\n color: var(--ts-text-subtle);\n font-size: 12px;\n font-weight: 400;\n margin-left: 6px;\n}\n\n.ts-percentage-bar {\n position: relative;\n width: 100%;\n height: 24px;\n background: var(--ts-surface-2);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.ts-percentage-fill {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n transition: width 0.3s ease;\n opacity: 0.7;\n}\n\n.ts-percentage-text {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n font-size: 12px;\n font-weight: 700;\n color: var(--ts-text);\n}\n\n/* Attribution Comparison Styles */\n.ts-revenue-sub {\n font-size: 11px;\n color: var(--ts-text-muted);\n margin-top: 2px;\n font-weight: normal;\n}\n\n.ts-table-header {\n display: flex;\n align-items: center;\n gap: 6px;\n justify-content: center;\n}\n\n.ts-table-header svg {\n flex-shrink: 0;\n}\n\n/* Compact Attribution Selector */\n.ts-page-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 24px;\n margin-bottom: 24px;\n}\n\n.ts-attribution-compact {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-lg);\n font-size: 14px;\n}\n\n.ts-attribution-compact label {\n font-weight: 600;\n color: var(--ts-text-muted);\n margin: 0;\n}\n\n.ts-select-wrapper {\n position: relative;\n}\n\n.ts-select {\n padding: 6px 32px 6px 12px;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n background: var(--ts-surface-2);\n color: var(--ts-text);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n appearance: none;\n min-width: 150px;\n}\n\n.ts-select:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ts-btn-icon {\n padding: 6px;\n background: transparent;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n cursor: pointer;\n display: flex;\n align-items: center;\n color: var(--ts-text-muted);\n transition: all 0.2s;\n}\n\n.ts-btn-icon:hover {\n background: var(--ts-surface-2);\n color: var(--ts-primary);\n}\n\n/* Modal Overlay */\n.ts-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n}\n\n .ts-modal {\n background: var(--ts-surface);\n border-radius: var(--ts-radius-xl);\n box-shadow: var(--ts-shadow-lg);\n max-width: 600px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n}\n\n.ts-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid var(--ts-border);\n}\n\n.ts-modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n}\n\n.ts-modal-header button {\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--ts-text-muted);\n padding: 4px;\n display: flex;\n}\n\n/* Insights Widget */\n.ts-insights-widget {\n background: linear-gradient(135deg, rgba(79, 70, 229, 0.05) 0%, rgba(16, 185, 129, 0.05) 100%);\n border: 1px solid var(--ts-border);\n border-left: 4px solid var(--ts-primary);\n border-radius: var(--ts-radius-lg);\n padding: 16px 20px;\n margin: 20px 0;\n}\n\n.ts-insights-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n color: var(--ts-primary);\n}\n\n.ts-insights-header h3 {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n}\n\n.ts-insights-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.ts-insights-list li {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n font-size: 14px;\n line-height: 1.5;\n color: var(--ts-text);\n}\n\n.ts-insights-list li svg {\n flex-shrink: 0;\n margin-top: 2px;\n color: var(--ts-success);\n}\n\n/* Quick Filters */\n.ts-quick-filters {\n display: flex;\n gap: 8px;\n margin: 16px 0;\n flex-wrap: wrap;\n}\n\n.ts-filter-btn {\n padding: 8px 16px;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-lg);\n background: var(--ts-surface);\n color: var(--ts-text);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.ts-filter-btn:hover {\n background: var(--ts-surface-2);\n border-color: var(--ts-primary);\n}\n\n.ts-filter-btn--active {\n background: var(--ts-primary);\n color: white;\n border-color: var(--ts-primary);\n}\n\n',"",{version:3,sources:["webpack://./src/styles/pages/TrafficSourcesPage.css"],names:[],mappings:"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",sourcesContent:['/* ==========================================================================\r\n TrafficSourcesPage.css (Premium summary + table + sorting)\r\n Matches TrafficSourcesPage.tsx markup exactly\r\n ========================================================================== */\r\n\r\n.ts-sources-summary {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\r\n gap: var(--ts-spacing-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n margin-bottom: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-summary-card {\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-xl);\r\n box-shadow: var(--ts-shadow-sm);\r\n padding: 16px 18px;\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n min-width: 0;\r\n}\r\n\r\n.ts-summary-icon {\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 16px;\r\n display: grid;\r\n place-items: center;\r\n font-size: 20px;\r\n background: var(--ts-surface-2);\r\n border: 1px solid var(--ts-border);\r\n flex: 0 0 auto;\r\n}\r\n\r\n.ts-summary-content {\r\n min-width: 0;\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.ts-summary-value {\r\n font-size: 18px;\r\n font-weight: 900;\r\n letter-spacing: -0.02em;\r\n line-height: 1.1;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n}\r\n\r\n.ts-summary-sub {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--ts-text-muted);\r\n letter-spacing: 0;\r\n}\r\n\r\n.ts-summary-label {\r\n color: var(--ts-text-muted);\r\n font-weight: 650;\r\n font-size: 13px;\r\n}\r\n\r\n/* View Mode Tabs */\r\n.ts-view-tabs {\r\n display: flex;\r\n gap: 8px;\r\n margin-bottom: var(--ts-spacing-lg);\r\n border-bottom: 1px solid var(--ts-border);\r\n padding-bottom: 8px;\r\n}\r\n\r\n.ts-view-tab {\r\n padding: 10px 18px;\r\n border: none;\r\n background: transparent;\r\n color: var(--ts-text-muted);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n transition: all 0.2s;\r\n position: relative;\r\n bottom: -9px;\r\n}\r\n\r\n.ts-view-tab:hover {\r\n color: var(--ts-text);\r\n background: rgba(14, 165, 233, 0.05);\r\n border-radius: var(--ts-radius-lg) var(--ts-radius-lg) 0 0;\r\n}\r\n\r\n.ts-view-tab--active {\r\n color: var(--ts-primary);\r\n border-bottom-color: var(--ts-primary);\r\n}\r\n\r\n/* Table container */\r\n.ts-sources-table-container {\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-xl);\r\n box-shadow: var(--ts-shadow-sm);\r\n overflow: hidden;\r\n}\r\n\r\n.ts-sources-table-container {\r\n overflow: auto;\r\n max-width: 100%;\r\n}\r\n\r\n/* Table */\r\n.ts-sources-table {\r\n width: 100%;\r\n min-width: 720px; /* ensures no overlap; mobile scroll instead */\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-sources-table thead th {\r\n position: sticky;\r\n top: 0;\r\n background: var(--ts-surface-2);\r\n border-bottom: 1px solid var(--ts-border);\r\n padding: 12px 14px;\r\n text-align: left;\r\n font-weight: 850;\r\n color: var(--ts-text);\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-sources-table tbody td {\r\n padding: 12px 14px;\r\n border-bottom: 1px solid var(--ts-border);\r\n color: var(--ts-text);\r\n vertical-align: middle;\r\n text-align: center; /* Center all cells by default */\r\n}\r\n\r\n/* First column (Source/Channel) stays left-aligned */\r\n.ts-sources-table tbody td:first-child {\r\n text-align: left;\r\n}\r\n\r\n\r\n\r\n.ts-sources-table tbody tr:hover td {\r\n background: rgba(148, 163, 184, 0.10);\r\n}\r\n\r\n[data-theme="dark"] .ts-sources-table tbody tr:hover td {\r\n background: rgba(148, 163, 184, 0.08);\r\n}\r\n\r\n.ts-source-icon {\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 10px;\r\n display: inline-grid;\r\n place-items: center;\r\n margin-right: 10px;\r\n background: var(--ts-surface-2);\r\n border: 1px solid var(--ts-border);\r\n font-size: 14px;\r\n}\r\n\r\n/* Sorting */\r\n.ts-sortable {\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.ts-sortable:hover {\r\n background: rgba(14, 165, 233, 0.08);\r\n}\r\n\r\n.ts-sorted {\r\n color: var(--ts-primary);\r\n}\r\n\r\n.ts-sort-icon {\r\n color: var(--ts-text-subtle);\r\n font-weight: 900;\r\n}\r\n\r\n/* Conversion Icon */\r\n.ts-conversion-icon {\r\n margin-right: 4px;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Display Mode Toggle */\r\n.ts-display-toggle {\r\n display: flex;\r\n gap: 8px;\r\n margin: 16px 0;\r\n padding: 4px;\r\n background: var(--ts-surface-2);\r\n border-radius: var(--ts-radius-md);\r\n width: fit-content;\r\n}\r\n\r\n.ts-toggle-btn {\r\n padding: 8px 16px;\r\n border: 1px solid transparent;\r\n border-radius: var(--ts-radius-sm);\r\n background: transparent;\r\n color: var(--ts-text-subtle);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-toggle-btn:hover {\r\n color: var(--ts-text);\r\n background: var(--ts-surface);\r\n}\r\n\r\n.ts-toggle-btn--active {\r\n background: var(--ts-surface);\r\n color: var(--ts-primary);\r\n border-color: var(--ts-border);\r\n box-shadow: var(--ts-shadow-sm);\r\n}\r\n\r\n/* Channel View Styles */\r\n.ts-channel-row {\r\n font-weight: 500;\r\n}\r\n\r\n.ts-channel-icon {\r\n font-size: 18px;\r\n margin-right: 8px;\r\n}\r\n\r\n.ts-source-count {\r\n color: var(--ts-text-subtle);\r\n font-size: 12px;\r\n font-weight: 400;\r\n margin-left: 6px;\r\n}\r\n\r\n.ts-percentage-bar {\r\n position: relative;\r\n width: 100%;\r\n height: 24px;\r\n background: var(--ts-surface-2);\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.ts-percentage-fill {\r\n position: absolute;\r\n left: 0;\r\n top: 0;\r\n height: 100%;\r\n transition: width 0.3s ease;\r\n opacity: 0.7;\r\n}\r\n\r\n.ts-percentage-text {\r\n position: relative;\r\n z-index: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n font-size: 12px;\r\n font-weight: 700;\r\n color: var(--ts-text);\r\n}\r\n\r\n/* Attribution Comparison Styles */\r\n.ts-revenue-sub {\r\n font-size: 11px;\r\n color: var(--ts-text-muted);\r\n margin-top: 2px;\r\n font-weight: normal;\r\n}\r\n\r\n.ts-table-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n justify-content: center;\r\n}\r\n\r\n.ts-table-header svg {\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Compact Attribution Selector */\r\n.ts-page-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n gap: 24px;\r\n margin-bottom: 24px;\r\n}\r\n\r\n.ts-attribution-compact {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 16px;\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n font-size: 14px;\r\n}\r\n\r\n.ts-attribution-compact label {\r\n font-weight: 600;\r\n color: var(--ts-text-muted);\r\n margin: 0;\r\n}\r\n\r\n.ts-select-wrapper {\r\n position: relative;\r\n}\r\n\r\n.ts-select {\r\n padding: 6px 32px 6px 12px;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n background: var(--ts-surface-2);\r\n color: var(--ts-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n appearance: none;\r\n min-width: 150px;\r\n}\r\n\r\n.ts-select:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.ts-btn-icon {\r\n padding: 6px;\r\n background: transparent;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n color: var(--ts-text-muted);\r\n transition: all 0.2s;\r\n}\r\n\r\n.ts-btn-icon:hover {\r\n background: var(--ts-surface-2);\r\n color: var(--ts-primary);\r\n}\r\n\r\n/* Modal Overlay */\r\n.ts-modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 9999;\r\n}\r\n\r\n.ts-modal {\r\n background: var(--ts-surface);\r\n border-radius: var(--ts-radius-xl);\r\n box-shadow: var(--ts-shadow-lg);\r\n max-width: 600px;\r\n width: 90%;\r\n max-height: 80vh;\r\n overflow-y: auto;\r\n}\r\n\r\n.ts-modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 20px 24px;\r\n border-bottom: 1px solid var(--ts-border);\r\n}\r\n\r\n.ts-modal-header h3 {\r\n margin: 0;\r\n font-size: 18px;\r\n font-weight: 700;\r\n}\r\n\r\n.ts-modal-header button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n color: var(--ts-text-muted);\r\n padding: 4px;\r\n display: flex;\r\n}\r\n\r\n/* Insights Widget */\r\n.ts-insights-widget {\r\n background: linear-gradient(135deg, rgba(79, 70, 229, 0.05) 0%, rgba(16, 185, 129, 0.05) 100%);\r\n border: 1px solid var(--ts-border);\r\n border-left: 4px solid var(--ts-primary);\r\n border-radius: var(--ts-radius-lg);\r\n padding: 16px 20px;\r\n margin: 20px 0;\r\n}\r\n\r\n.ts-insights-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-bottom: 12px;\r\n color: var(--ts-primary);\r\n}\r\n\r\n.ts-insights-header h3 {\r\n margin: 0;\r\n font-size: 15px;\r\n font-weight: 700;\r\n}\r\n\r\n.ts-insights-list {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.ts-insights-list li {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 10px;\r\n font-size: 14px;\r\n line-height: 1.5;\r\n color: var(--ts-text);\r\n}\r\n\r\n.ts-insights-list li svg {\r\n flex-shrink: 0;\r\n margin-top: 2px;\r\n color: var(--ts-success);\r\n}\r\n\r\n/* Quick Filters */\r\n.ts-quick-filters {\r\n display: flex;\r\n gap: 8px;\r\n margin: 16px 0;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-filter-btn {\r\n padding: 8px 16px;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n background: var(--ts-surface);\r\n color: var(--ts-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.ts-filter-btn:hover {\r\n background: var(--ts-surface-2);\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n.ts-filter-btn--active {\r\n background: var(--ts-primary);\r\n color: white;\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n'],sourceRoot:""}]);const o=A},78336:(n,r,e)=>{e.r(r),e.d(r,{default:()=>j});var s=e(74848),t=e(41594),a=e.n(t),A=e(37090),o=e(82381),i=e(12470),l=e(51481),c=e(67359),d=e(84013),C=e(28343),p=e(85072),g=e.n(p),m=e(97825),u=e.n(m),x=e(77659),B=e.n(x),h=e(55056),E=e.n(h),b=e(10540),v=e.n(b),f=e(41113),y=e.n(f),k=e(24099),w={};w.styleTagTransform=y(),w.setAttributes=E(),w.insert=B().bind(null,"head"),w.domAPI=u(),w.insertStyleElement=v();g()(k.A,w);k.A&&k.A.locals&&k.A.locals;const j=()=>{const{dateRange:n,segment:r}=(0,A.n)(),[e,p]=(0,t.useState)("sessions"),[g,m]=(0,t.useState)("desc"),[u,x]=(0,t.useState)("channels"),[B,h]=(0,t.useState)("last_touch"),[E,b]=(0,t.useState)("all"),{data:v,error:f,isLoading:y}=(0,o.S)("getTrafficSources",{date_start:(0,C.TJ)(n.start),date_end:(0,C.TJ)(n.end),segment:r},{refetchInterval:9e5,staleTime:6e5,retry:1}),k=n=>{e===n?m("desc"===g?"asc":"desc"):(p(n),m("desc"))},w=v?.sources?[...v.sources].sort((n,r)=>{let s,t;switch(e){case"sessions":default:s=n.sessions,t=r.sessions;break;case"conversions":s=n.conversions,t=r.conversions;break;case"revenue":s=n.revenue||0,t=r.revenue||0;break;case"conversion_rate":s=n.conversion_rate||0,t=r.conversion_rate||0;break;case"aov":s=n.aov||0,t=r.aov||0;break;case"first_touch_conversions":s=n.first_touch_conversions||0,t=r.first_touch_conversions||0;break;case"last_touch_conversions":s=n.last_touch_conversions||0,t=r.last_touch_conversions||0}return"desc"===g?t-s:s-t}):[],j=(0,t.useMemo)(()=>"all"===E?w:w.filter(n=>{const r=n.medium.toLowerCase();switch(E){case"paid":return"cpc"===r||"paid"===r;case"organic":return"organic"===r;case"social":return"social"===r;case"email":return"email"===r;default:return!0}}),[w,E]),_=j.reduce((n,r)=>n+r.sessions,0)||0,N=v?.total_conversions||0,z=j.reduce((n,r)=>n+(r.revenue||0),0)||0,S=_>0?(N/_*100).toFixed(1):"0.0",T="channels"===u&&j.length>0?Object.values((0,c.gk)(j)).sort((n,r)=>r.totalSessions-n.totalSessions):[],Y=n=>({google:"Search",facebook:"Users",instagram:"Instagram",twitter:"Twitter",linkedin:"Linkedin",youtube:"Youtube",pinterest:"Image",tiktok:"Music",reddit:"MessageSquare",direct:"Link",newsletter:"Mail",email:"Mail",referral:"ExternalLink",bing:"Search",yahoo:"Search"}[n.toLowerCase()]||"Globe"),I=(0,t.useMemo)(()=>{if(!j.length)return[];const n=[],r=_>0?N/_*100:0;if(T.length>0){const r=T[0],e=_>0?(r.totalSessions/_*100).toFixed(0):0;Number(e)>50&&n.push(`${r.channel} dominates with ${e}% of traffic - consider diversifying sources`)}const e=j.filter(n=>n.conversion_rate&&n.conversion_rate>1.5*r);e.length>0&&n.push(`${e[0].source}/${e[0].medium} has ${e[0].conversion_rate?.toFixed(1)}% conv. rate - replicate this success`);const s=j.some(n=>"organic"===n.medium.toLowerCase()),t=j.some(n=>"cpc"===n.medium.toLowerCase());!s&&j.length>1&&n.push("No organic traffic detected - improve SEO to reduce acquisition costs"),!t&&z>1e3&&n.push("Consider paid advertising to scale high-performing channels");const a=j.filter(n=>"(direct)"===n.source.toLowerCase()||"direct"===n.source.toLowerCase());return a.length>0&&a[0].sessions>.3*_&&n.push("Add UTM parameters to campaigns for better attribution tracking"),n.slice(0,3)},[j,T,_,N,z]);return(0,s.jsxs)("div",{className:"ts-page",children:[(0,s.jsxs)("div",{className:"ts-page-header",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h1",{className:"ts-page-title",children:(0,i.__)("Traffic Sources")}),(0,s.jsx)("p",{className:"ts-page-description",children:(0,i.__)("Analyze traffic performance with multi-touch attribution")})]}),!f&&!y&&(0,s.jsxs)("div",{className:"ts-attribution-selector",children:[(0,s.jsx)("label",{className:"ts-label",children:(0,i.__)("Attribution Model:")}),(0,s.jsx)("div",{className:"ts-select-wrapper",children:(0,s.jsxs)("select",{value:B,onChange:n=>h(n.target.value),className:"ts-select",children:[(0,s.jsx)("option",{value:"last_touch",children:(0,i.__)("Last-Touch")}),(0,s.jsx)("option",{value:"first_touch",children:(0,i.__)("First-Touch")}),(0,s.jsx)("option",{value:"linear",children:(0,i.__)("Linear")}),(0,s.jsx)("option",{value:"time_decay",children:(0,i.__)("Time-Decay")}),(0,s.jsx)("option",{value:"position_based",children:(0,i.__)("Position-Based")})]})}),(0,s.jsx)("span",{className:"ts-help-text",children:(0,i.__)("Choose how to attribute conversions to traffic sources")})]})]}),f?(0,s.jsxs)("div",{className:"ts-error-state",children:[(0,s.jsx)(l.I,{name:"AlertTriangle",size:48,color:"danger"}),(0,s.jsx)("h2",{children:(0,i.__)("Error Loading Data")}),(0,s.jsx)("p",{children:f?.message||(0,i.__)("Failed to load traffic sources data")})]}):y?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"ts-sources-summary",children:[1,2,3].map(n=>(0,s.jsx)(d.or,{},n))}),(0,s.jsx)("div",{className:"ts-sources-content",children:(0,s.jsx)(d.cU,{rows:8,columns:5})})]}):v&&v.sources&&0!==v.sources.length?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"ts-sources-summary",children:[(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"Users",size:24,color:"primary",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsxs)("div",{className:"ts-summary-value",children:[(v.unique_visitors||_).toLocaleString(),(0,s.jsxs)("span",{className:"ts-summary-sub",children:[_.toLocaleString()," sessions"]})]}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Unique Visitors")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"Link",size:24,color:"primary",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsx)("div",{className:"ts-summary-value",children:j.length}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Traffic Sources")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"CheckCircle",size:24,color:"success",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsx)("div",{className:"ts-summary-value",children:N.toLocaleString()}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Total Conversions")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"DollarSign",size:24,color:"success",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsx)("div",{className:"ts-summary-value",children:(0,C.vv)(z)}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Total Revenue")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"TrendingUp",size:24,color:"primary",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsxs)("div",{className:"ts-summary-value",children:[S,"%"]}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Conversion Rate")})]})]})]}),I.length>0&&(0,s.jsxs)("div",{className:"ts-insights-widget",children:[(0,s.jsxs)("div",{className:"ts-insights-header",children:[(0,s.jsx)(l.I,{name:"Lightbulb",size:18}),(0,s.jsx)("h3",{children:(0,i.__)("Insights & Recommendations")})]}),(0,s.jsx)("ul",{className:"ts-insights-list",children:I.map((n,r)=>(0,s.jsxs)("li",{children:[(0,s.jsx)(l.I,{name:"TrendingUp",size:14}),n]},r))})]}),(0,s.jsxs)("div",{className:"ts-quick-filters",children:[(0,s.jsx)("button",{className:"ts-filter-btn "+("all"===E?"ts-filter-btn--active":""),onClick:()=>b("all"),children:(0,i.__)("All Channels")}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("paid"===E?"ts-filter-btn--active":""),onClick:()=>b("paid"),children:["💰 ",(0,i.__)("Paid")]}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("organic"===E?"ts-filter-btn--active":""),onClick:()=>b("organic"),children:["🌱 ",(0,i.__)("Organic")]}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("social"===E?"ts-filter-btn--active":""),onClick:()=>b("social"),children:["👥 ",(0,i.__)("Social")]}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("email"===E?"ts-filter-btn--active":""),onClick:()=>b("email"),children:["📧 ",(0,i.__)("Email")]})]}),(0,s.jsxs)("div",{className:"ts-display-toggle",children:[(0,s.jsxs)("button",{className:"ts-toggle-btn "+("channels"===u?"ts-toggle-btn--active":""),onClick:()=>x("channels"),children:[(0,s.jsx)(l.I,{name:"Layers",size:16})," ",(0,i.__)("Group by Channels")]}),(0,s.jsxs)("button",{className:"ts-toggle-btn "+("sources"===u?"ts-toggle-btn--active":""),onClick:()=>x("sources"),children:[(0,s.jsx)(l.I,{name:"List",size:16})," ",(0,i.__)("View by Sources")]})]}),(0,s.jsx)("div",{className:"ts-sources-table-container",children:(0,s.jsxs)("table",{className:"ts-sources-table",children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:["channels"===u?(0,s.jsx)("th",{children:(0,i.__)("Channel")}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("th",{children:(0,i.__)("Source")}),(0,s.jsx)("th",{children:(0,i.__)("Medium")})]}),(0,s.jsx)("th",{className:"ts-sortable "+("sessions"===e?"ts-sorted":""),onClick:()=>k("sessions"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Sessions"),"sessions"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("conversions"===e?"ts-sorted":""),onClick:()=>k("conversions"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Conversions"),"conversions"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("conversion_rate"===e?"ts-sorted":""),onClick:()=>k("conversion_rate"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Conv. Rate"),"conversion_rate"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("revenue"===e?"ts-sorted":""),onClick:()=>k("revenue"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Revenue"),"revenue"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("aov"===e?"ts-sorted":""),onClick:()=>k("aov"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("AOV"),"aov"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{children:(0,i.__)("% of Total")})]})}),(0,s.jsx)("tbody",{children:"channels"===u?T.map((n,r)=>{const e=_>0?(n.totalSessions/_*100).toFixed(1):"0.0",t=n.totalSessions>0?(n.totalConversions/n.totalSessions*100).toFixed(1):"0.0",A=n.totalConversions>0?n.totalRevenue/n.totalConversions:0;return(0,s.jsx)(a().Fragment,{children:(0,s.jsxs)("tr",{className:"ts-channel-row",children:[(0,s.jsxs)("td",{children:[(0,s.jsx)("span",{className:"ts-channel-icon",children:(0,s.jsx)(l.I,{name:(0,c.Vp)(n.channel),size:20})}),(0,s.jsx)("strong",{children:n.channel}),(0,s.jsxs)("span",{className:"ts-source-count",children:[" (",n.sources.length," ",1===n.sources.length?(0,i.__)("source"):(0,i.__)("sources"),")"]})]}),(0,s.jsx)("td",{children:n.totalSessions.toLocaleString()}),(0,s.jsxs)("td",{children:[n.totalConversions>0&&(0,s.jsx)(l.I,{name:"CheckCircle",size:14,color:"success",className:"ts-conversion-icon"}),n.totalConversions.toLocaleString()]}),(0,s.jsxs)("td",{children:[t,"%"]}),(0,s.jsx)("td",{className:"ts-revenue-cell",children:(0,C.vv)(n.totalRevenue)}),(0,s.jsx)("td",{children:(0,C.vv)(A)}),(0,s.jsx)("td",{children:(0,s.jsxs)("div",{className:"ts-percentage-bar",children:[(0,s.jsx)("div",{className:"ts-percentage-fill",style:{width:`${e}%`,backgroundColor:(0,c.rp)(n.channel)}}),(0,s.jsxs)("span",{className:"ts-percentage-text",children:[e,"%"]})]})})]})},r)}):j.map((n,r)=>{const e=_>0?(n.sessions/_*100).toFixed(1):"0.0";return(0,s.jsxs)("tr",{children:[(0,s.jsxs)("td",{children:[(0,s.jsx)("span",{className:"ts-source-icon",children:(0,s.jsx)(l.I,{name:Y(n.source),size:16})}),n.source]}),(0,s.jsx)("td",{children:n.medium}),(0,s.jsx)("td",{children:n.sessions.toLocaleString()}),(0,s.jsxs)("td",{children:[n.conversions>0&&(0,s.jsx)(l.I,{name:"CheckCircle",size:14,color:"success"}),n.conversions.toLocaleString()]}),(0,s.jsx)("td",{children:n.conversion_rate?n.conversion_rate.toFixed(1)+"%":"0.0%"}),(0,s.jsx)("td",{className:"ts-revenue-cell",children:(0,C.vv)(n.revenue||0)}),(0,s.jsx)("td",{children:(0,C.vv)(n.aov||0)}),(0,s.jsxs)("td",{children:[e,"%"]})]},r)})})]})})]}):(0,s.jsxs)("div",{className:"ts-empty-state",children:[(0,s.jsx)(l.I,{name:"BarChart2",size:48,color:"muted"}),(0,s.jsx)("h2",{children:(0,i.__)("No traffic data yet")}),(0,s.jsx)("p",{children:(0,i.__)("Start tracking to see where your visitors come from")})]})]})}}}]);1 "use strict";(self.webpackChunktracksure_admin=self.webpackChunktracksure_admin||[]).push([[336],{24099:(n,r,e)=>{e.d(r,{A:()=>o});var s=e(71354),t=e.n(s),a=e(76314),A=e.n(a)()(t());A.push([n.id,'/* ==========================================================================\n TrafficSourcesPage.css (Premium summary + table + sorting)\n Matches TrafficSourcesPage.tsx markup exactly\n ========================================================================== */\n\n.ts-sources-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: var(--ts-spacing-lg);\n margin-top: var(--ts-spacing-lg);\n margin-bottom: var(--ts-spacing-lg);\n}\n\n.ts-summary-card {\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-xl);\n box-shadow: var(--ts-shadow-sm);\n padding: 16px 18px;\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.ts-summary-icon {\n width: 32px;\n height: 32px;\n border-radius: 16px;\n display: grid;\n place-items: center;\n font-size: 20px;\n background: var(--ts-surface-2);\n border: 1px solid var(--ts-border);\n flex: 0 0 auto;\n}\n\n.ts-summary-content {\n min-width: 0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ts-summary-value {\n font-size: 18px;\n font-weight: 900;\n letter-spacing: -0.02em;\n line-height: 1.1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.ts-summary-sub {\n font-size: 12px;\n font-weight: 600;\n color: var(--ts-text-muted);\n letter-spacing: 0;\n}\n\n.ts-summary-label {\n color: var(--ts-text-muted);\n font-weight: 650;\n font-size: 13px;\n}\n\n/* View Mode Tabs */\n.ts-view-tabs {\n display: flex;\n gap: 8px;\n margin-bottom: var(--ts-spacing-lg);\n border-bottom: 1px solid var(--ts-border);\n padding-bottom: 8px;\n}\n\n.ts-view-tab {\n padding: 10px 18px;\n border: none;\n background: transparent;\n color: var(--ts-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n transition: all 0.2s;\n position: relative;\n bottom: -9px;\n}\n\n.ts-view-tab:hover {\n color: var(--ts-text);\n background: rgba(14, 165, 233, 0.05);\n border-radius: var(--ts-radius-lg) var(--ts-radius-lg) 0 0;\n}\n\n.ts-view-tab--active {\n color: var(--ts-primary);\n border-bottom-color: var(--ts-primary);\n}\n\n/* Table container */\n.ts-sources-table-container {\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-xl);\n box-shadow: var(--ts-shadow-sm);\n overflow: hidden;\n}\n\n.ts-sources-table-container {\n overflow: auto;\n max-width: 100%;\n}\n\n/* Table */\n.ts-sources-table {\n width: 100%;\n min-width: 720px; /* ensures no overlap; mobile scroll instead */\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-sources-table thead th {\n position: sticky;\n top: 0;\n background: var(--ts-surface-2);\n border-bottom: 1px solid var(--ts-border);\n padding: 12px 14px;\n text-align: left;\n font-weight: 850;\n color: var(--ts-text);\n white-space: nowrap;\n}\n\n.ts-sources-table tbody td {\n padding: 12px 14px;\n border-bottom: 1px solid var(--ts-border);\n color: var(--ts-text);\n vertical-align: middle;\n text-align: center; /* Center all cells by default */\n}\n\n/* First column (Source/Channel) stays left-aligned */\n.ts-sources-table tbody td:first-child {\n text-align: left;\n}\n\n\n\n.ts-sources-table tbody tr:hover td {\n background: rgba(148, 163, 184, 0.10);\n}\n\n[data-theme="dark"] .ts-sources-table tbody tr:hover td {\n background: rgba(148, 163, 184, 0.08);\n}\n\n.ts-source-icon {\n width: 28px;\n height: 28px;\n border-radius: 10px;\n display: inline-grid;\n place-items: center;\n margin-right: 10px;\n background: var(--ts-surface-2);\n border: 1px solid var(--ts-border);\n font-size: 14px;\n}\n\n/* Sorting */\n.ts-sortable {\n cursor: pointer;\n user-select: none;\n}\n\n.ts-sortable:hover {\n background: rgba(14, 165, 233, 0.08);\n}\n\n.ts-sorted {\n color: var(--ts-primary);\n}\n\n.ts-sort-icon {\n color: var(--ts-text-subtle);\n font-weight: 900;\n}\n\n/* Conversion Icon */\n.ts-conversion-icon {\n margin-right: 4px;\n vertical-align: middle;\n}\n\n/* Display Mode Toggle */\n.ts-display-toggle {\n display: flex;\n gap: 8px;\n margin: 16px 0;\n padding: 4px;\n background: var(--ts-surface-2);\n border-radius: var(--ts-radius-md);\n width: fit-content;\n}\n\n.ts-toggle-btn {\n padding: 8px 16px;\n border: 1px solid transparent;\n border-radius: var(--ts-radius-sm);\n background: transparent;\n color: var(--ts-text-subtle);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ts-toggle-btn:hover {\n color: var(--ts-text);\n background: var(--ts-surface);\n}\n\n.ts-toggle-btn--active {\n background: var(--ts-surface);\n color: var(--ts-primary);\n border-color: var(--ts-border);\n box-shadow: var(--ts-shadow-sm);\n}\n\n/* Channel View Styles */\n.ts-channel-row {\n font-weight: 500;\n}\n\n.ts-channel-icon {\n font-size: 18px;\n margin-right: 8px;\n}\n\n.ts-source-count {\n color: var(--ts-text-subtle);\n font-size: 12px;\n font-weight: 400;\n margin-left: 6px;\n}\n\n.ts-percentage-bar {\n position: relative;\n width: 100%;\n height: 24px;\n background: var(--ts-surface-2);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.ts-percentage-fill {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n transition: width 0.3s ease;\n opacity: 0.7;\n}\n\n.ts-percentage-text {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n font-size: 12px;\n font-weight: 700;\n color: var(--ts-text);\n}\n\n/* Attribution Comparison Styles */\n.ts-revenue-sub {\n font-size: 11px;\n color: var(--ts-text-muted);\n margin-top: 2px;\n font-weight: normal;\n}\n\n.ts-table-header {\n display: flex;\n align-items: center;\n gap: 6px;\n justify-content: center;\n}\n\n.ts-table-header svg {\n flex-shrink: 0;\n}\n\n/* Compact Attribution Selector */\n.ts-page-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 24px;\n margin-bottom: 24px;\n}\n\n.ts-attribution-compact {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-lg);\n font-size: 14px;\n}\n\n.ts-attribution-compact label {\n font-weight: 600;\n color: var(--ts-text-muted);\n margin: 0;\n}\n\n.ts-select-wrapper {\n position: relative;\n}\n\n.ts-select {\n padding: 6px 32px 6px 12px;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n background: var(--ts-surface-2);\n color: var(--ts-text);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n appearance: none;\n min-width: 150px;\n}\n\n.ts-select:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ts-btn-icon {\n padding: 6px;\n background: transparent;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n cursor: pointer;\n display: flex;\n align-items: center;\n color: var(--ts-text-muted);\n transition: all 0.2s;\n}\n\n.ts-btn-icon:hover {\n background: var(--ts-surface-2);\n color: var(--ts-primary);\n}\n\n/* Modal Overlay */\n.ts-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n}\n\n\n\n.ts-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid var(--ts-border);\n}\n\n.ts-modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n}\n\n.ts-modal-header button {\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--ts-text-muted);\n padding: 4px;\n display: flex;\n}\n\n/* Insights Widget */\n.ts-insights-widget {\n background: linear-gradient(135deg, rgba(79, 70, 229, 0.05) 0%, rgba(16, 185, 129, 0.05) 100%);\n border: 1px solid var(--ts-border);\n border-left: 4px solid var(--ts-primary);\n border-radius: var(--ts-radius-lg);\n padding: 16px 20px;\n margin: 20px 0;\n}\n\n.ts-insights-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n color: var(--ts-primary);\n}\n\n.ts-insights-header h3 {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n}\n\n.ts-insights-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.ts-insights-list li {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n font-size: 14px;\n line-height: 1.5;\n color: var(--ts-text);\n}\n\n.ts-insights-list li svg {\n flex-shrink: 0;\n margin-top: 2px;\n color: var(--ts-success);\n}\n\n/* Quick Filters */\n.ts-quick-filters {\n display: flex;\n gap: 8px;\n margin: 16px 0;\n flex-wrap: wrap;\n}\n\n.ts-filter-btn {\n padding: 8px 16px;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-lg);\n background: var(--ts-surface);\n color: var(--ts-text);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.ts-filter-btn:hover {\n background: var(--ts-surface-2);\n border-color: var(--ts-primary);\n}\n\n.ts-filter-btn--active {\n background: var(--ts-primary);\n color: white;\n border-color: var(--ts-primary);\n}\n\n',"",{version:3,sources:["webpack://./src/styles/pages/TrafficSourcesPage.css"],names:[],mappings:"AAAA;;;+EAG+E;;AAE/E;EACE,aAAa;EACb,2DAA2D;EAC3D,yBAAyB;EACzB,gCAAgC;EAChC,mCAAmC;AACrC;;AAEA;EACE,6BAA6B;EAC7B,kCAAkC;EAClC,kCAAkC;EAClC,+BAA+B;EAC/B,kBAAkB;EAClB,aAAa;EACb,mBAAmB;EACnB,SAAS;EACT,YAAY;AACd;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,eAAe;EACf,+BAA+B;EAC/B,kCAAkC;EAClC,cAAc;AAChB;;AAEA;EACE,YAAY;EACZ,OAAO;EACP,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,uBAAuB;EACvB,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,2BAA2B;EAC3B,iBAAiB;AACnB;;AAEA;EACE,2BAA2B;EAC3B,gBAAgB;EAChB,eAAe;AACjB;;AAEA,mBAAmB;AACnB;EACE,aAAa;EACb,QAAQ;EACR,mCAAmC;EACnC,yCAAyC;EACzC,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;EAClB,YAAY;EACZ,uBAAuB;EACvB,2BAA2B;EAC3B,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,oCAAoC;EACpC,oBAAoB;EACpB,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,qBAAqB;EACrB,oCAAoC;EACpC,0DAA0D;AAC5D;;AAEA;EACE,wBAAwB;EACxB,sCAAsC;AACxC;;AAEA,oBAAoB;AACpB;EACE,6BAA6B;EAC7B,kCAAkC;EAClC,kCAAkC;EAClC,+BAA+B;EAC/B,gBAAgB;AAClB;;AAEA;EACE,cAAc;EACd,eAAe;AACjB;;AAEA,UAAU;AACV;EACE,WAAW;EACX,gBAAgB,EAAE,8CAA8C;EAChE,yBAAyB;EACzB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,MAAM;EACN,+BAA+B;EAC/B,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;EAChB,gBAAgB;EAChB,qBAAqB;EACrB,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;EAClB,yCAAyC;EACzC,qBAAqB;EACrB,sBAAsB;EACtB,kBAAkB,EAAE,gCAAgC;AACtD;;AAEA,qDAAqD;AACrD;EACE,gBAAgB;AAClB;;;;AAIA;EACE,qCAAqC;AACvC;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;EACpB,mBAAmB;EACnB,kBAAkB;EAClB,+BAA+B;EAC/B,kCAAkC;EAClC,eAAe;AACjB;;AAEA,YAAY;AACZ;EACE,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,oCAAoC;AACtC;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,4BAA4B;EAC5B,gBAAgB;AAClB;;AAEA,oBAAoB;AACpB;EACE,iBAAiB;EACjB,sBAAsB;AACxB;;AAEA,wBAAwB;AACxB;EACE,aAAa;EACb,QAAQ;EACR,cAAc;EACd,YAAY;EACZ,+BAA+B;EAC/B,kCAAkC;EAClC,kBAAkB;AACpB;;AAEA;EACE,iBAAiB;EACjB,6BAA6B;EAC7B,kCAAkC;EAClC,uBAAuB;EACvB,4BAA4B;EAC5B,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,yBAAyB;AAC3B;;AAEA;EACE,qBAAqB;EACrB,6BAA6B;AAC/B;;AAEA;EACE,6BAA6B;EAC7B,wBAAwB;EACxB,8BAA8B;EAC9B,+BAA+B;AACjC;;AAEA,wBAAwB;AACxB;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,4BAA4B;EAC5B,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,+BAA+B;EAC/B,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,OAAO;EACP,MAAM;EACN,YAAY;EACZ,2BAA2B;EAC3B,YAAY;AACd;;AAEA;EACE,kBAAkB;EAClB,UAAU;EACV,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,YAAY;EACZ,eAAe;EACf,gBAAgB;EAChB,qBAAqB;AACvB;;AAEA,kCAAkC;AAClC;EACE,eAAe;EACf,2BAA2B;EAC3B,eAAe;EACf,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,uBAAuB;AACzB;;AAEA;EACE,cAAc;AAChB;;AAEA,iCAAiC;AACjC;EACE,aAAa;EACb,8BAA8B;EAC9B,uBAAuB;EACvB,SAAS;EACT,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;EACjB,6BAA6B;EAC7B,kCAAkC;EAClC,kCAAkC;EAClC,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;EAC3B,SAAS;AACX;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,0BAA0B;EAC1B,kCAAkC;EAClC,kCAAkC;EAClC,+BAA+B;EAC/B,qBAAqB;EACrB,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,YAAY;EACZ,uBAAuB;EACvB,kCAAkC;EAClC,kCAAkC;EAClC,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,2BAA2B;EAC3B,oBAAoB;AACtB;;AAEA;EACE,+BAA+B;EAC/B,wBAAwB;AAC1B;;AAEA,kBAAkB;AAClB;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAS;EACT,8BAA8B;EAC9B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,aAAa;AACf;;;;AAIA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,kBAAkB;EAClB,yCAAyC;AAC3C;;AAEA;EACE,SAAS;EACT,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,uBAAuB;EACvB,YAAY;EACZ,eAAe;EACf,2BAA2B;EAC3B,YAAY;EACZ,aAAa;AACf;;AAEA,oBAAoB;AACpB;EACE,8FAA8F;EAC9F,kCAAkC;EAClC,wCAAwC;EACxC,kCAAkC;EAClC,kBAAkB;EAClB,cAAc;AAChB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,mBAAmB;EACnB,wBAAwB;AAC1B;;AAEA;EACE,SAAS;EACT,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,SAAS;EACT,UAAU;EACV,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,qBAAqB;AACvB;;AAEA;EACE,cAAc;EACd,eAAe;EACf,wBAAwB;AAC1B;;AAEA,kBAAkB;AAClB;EACE,aAAa;EACb,QAAQ;EACR,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,iBAAiB;EACjB,kCAAkC;EAClC,kCAAkC;EAClC,6BAA6B;EAC7B,qBAAqB;EACrB,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,oBAAoB;EACpB,aAAa;EACb,mBAAmB;EACnB,QAAQ;AACV;;AAEA;EACE,+BAA+B;EAC/B,+BAA+B;AACjC;;AAEA;EACE,6BAA6B;EAC7B,YAAY;EACZ,+BAA+B;AACjC",sourcesContent:['/* ==========================================================================\r\n TrafficSourcesPage.css (Premium summary + table + sorting)\r\n Matches TrafficSourcesPage.tsx markup exactly\r\n ========================================================================== */\r\n\r\n.ts-sources-summary {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\r\n gap: var(--ts-spacing-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n margin-bottom: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-summary-card {\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-xl);\r\n box-shadow: var(--ts-shadow-sm);\r\n padding: 16px 18px;\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n min-width: 0;\r\n}\r\n\r\n.ts-summary-icon {\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 16px;\r\n display: grid;\r\n place-items: center;\r\n font-size: 20px;\r\n background: var(--ts-surface-2);\r\n border: 1px solid var(--ts-border);\r\n flex: 0 0 auto;\r\n}\r\n\r\n.ts-summary-content {\r\n min-width: 0;\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.ts-summary-value {\r\n font-size: 18px;\r\n font-weight: 900;\r\n letter-spacing: -0.02em;\r\n line-height: 1.1;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n}\r\n\r\n.ts-summary-sub {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--ts-text-muted);\r\n letter-spacing: 0;\r\n}\r\n\r\n.ts-summary-label {\r\n color: var(--ts-text-muted);\r\n font-weight: 650;\r\n font-size: 13px;\r\n}\r\n\r\n/* View Mode Tabs */\r\n.ts-view-tabs {\r\n display: flex;\r\n gap: 8px;\r\n margin-bottom: var(--ts-spacing-lg);\r\n border-bottom: 1px solid var(--ts-border);\r\n padding-bottom: 8px;\r\n}\r\n\r\n.ts-view-tab {\r\n padding: 10px 18px;\r\n border: none;\r\n background: transparent;\r\n color: var(--ts-text-muted);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n transition: all 0.2s;\r\n position: relative;\r\n bottom: -9px;\r\n}\r\n\r\n.ts-view-tab:hover {\r\n color: var(--ts-text);\r\n background: rgba(14, 165, 233, 0.05);\r\n border-radius: var(--ts-radius-lg) var(--ts-radius-lg) 0 0;\r\n}\r\n\r\n.ts-view-tab--active {\r\n color: var(--ts-primary);\r\n border-bottom-color: var(--ts-primary);\r\n}\r\n\r\n/* Table container */\r\n.ts-sources-table-container {\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-xl);\r\n box-shadow: var(--ts-shadow-sm);\r\n overflow: hidden;\r\n}\r\n\r\n.ts-sources-table-container {\r\n overflow: auto;\r\n max-width: 100%;\r\n}\r\n\r\n/* Table */\r\n.ts-sources-table {\r\n width: 100%;\r\n min-width: 720px; /* ensures no overlap; mobile scroll instead */\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-sources-table thead th {\r\n position: sticky;\r\n top: 0;\r\n background: var(--ts-surface-2);\r\n border-bottom: 1px solid var(--ts-border);\r\n padding: 12px 14px;\r\n text-align: left;\r\n font-weight: 850;\r\n color: var(--ts-text);\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-sources-table tbody td {\r\n padding: 12px 14px;\r\n border-bottom: 1px solid var(--ts-border);\r\n color: var(--ts-text);\r\n vertical-align: middle;\r\n text-align: center; /* Center all cells by default */\r\n}\r\n\r\n/* First column (Source/Channel) stays left-aligned */\r\n.ts-sources-table tbody td:first-child {\r\n text-align: left;\r\n}\r\n\r\n\r\n\r\n.ts-sources-table tbody tr:hover td {\r\n background: rgba(148, 163, 184, 0.10);\r\n}\r\n\r\n[data-theme="dark"] .ts-sources-table tbody tr:hover td {\r\n background: rgba(148, 163, 184, 0.08);\r\n}\r\n\r\n.ts-source-icon {\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 10px;\r\n display: inline-grid;\r\n place-items: center;\r\n margin-right: 10px;\r\n background: var(--ts-surface-2);\r\n border: 1px solid var(--ts-border);\r\n font-size: 14px;\r\n}\r\n\r\n/* Sorting */\r\n.ts-sortable {\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.ts-sortable:hover {\r\n background: rgba(14, 165, 233, 0.08);\r\n}\r\n\r\n.ts-sorted {\r\n color: var(--ts-primary);\r\n}\r\n\r\n.ts-sort-icon {\r\n color: var(--ts-text-subtle);\r\n font-weight: 900;\r\n}\r\n\r\n/* Conversion Icon */\r\n.ts-conversion-icon {\r\n margin-right: 4px;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Display Mode Toggle */\r\n.ts-display-toggle {\r\n display: flex;\r\n gap: 8px;\r\n margin: 16px 0;\r\n padding: 4px;\r\n background: var(--ts-surface-2);\r\n border-radius: var(--ts-radius-md);\r\n width: fit-content;\r\n}\r\n\r\n.ts-toggle-btn {\r\n padding: 8px 16px;\r\n border: 1px solid transparent;\r\n border-radius: var(--ts-radius-sm);\r\n background: transparent;\r\n color: var(--ts-text-subtle);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-toggle-btn:hover {\r\n color: var(--ts-text);\r\n background: var(--ts-surface);\r\n}\r\n\r\n.ts-toggle-btn--active {\r\n background: var(--ts-surface);\r\n color: var(--ts-primary);\r\n border-color: var(--ts-border);\r\n box-shadow: var(--ts-shadow-sm);\r\n}\r\n\r\n/* Channel View Styles */\r\n.ts-channel-row {\r\n font-weight: 500;\r\n}\r\n\r\n.ts-channel-icon {\r\n font-size: 18px;\r\n margin-right: 8px;\r\n}\r\n\r\n.ts-source-count {\r\n color: var(--ts-text-subtle);\r\n font-size: 12px;\r\n font-weight: 400;\r\n margin-left: 6px;\r\n}\r\n\r\n.ts-percentage-bar {\r\n position: relative;\r\n width: 100%;\r\n height: 24px;\r\n background: var(--ts-surface-2);\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.ts-percentage-fill {\r\n position: absolute;\r\n left: 0;\r\n top: 0;\r\n height: 100%;\r\n transition: width 0.3s ease;\r\n opacity: 0.7;\r\n}\r\n\r\n.ts-percentage-text {\r\n position: relative;\r\n z-index: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n font-size: 12px;\r\n font-weight: 700;\r\n color: var(--ts-text);\r\n}\r\n\r\n/* Attribution Comparison Styles */\r\n.ts-revenue-sub {\r\n font-size: 11px;\r\n color: var(--ts-text-muted);\r\n margin-top: 2px;\r\n font-weight: normal;\r\n}\r\n\r\n.ts-table-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n justify-content: center;\r\n}\r\n\r\n.ts-table-header svg {\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Compact Attribution Selector */\r\n.ts-page-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n gap: 24px;\r\n margin-bottom: 24px;\r\n}\r\n\r\n.ts-attribution-compact {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 16px;\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n font-size: 14px;\r\n}\r\n\r\n.ts-attribution-compact label {\r\n font-weight: 600;\r\n color: var(--ts-text-muted);\r\n margin: 0;\r\n}\r\n\r\n.ts-select-wrapper {\r\n position: relative;\r\n}\r\n\r\n.ts-select {\r\n padding: 6px 32px 6px 12px;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n background: var(--ts-surface-2);\r\n color: var(--ts-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n appearance: none;\r\n min-width: 150px;\r\n}\r\n\r\n.ts-select:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.ts-btn-icon {\r\n padding: 6px;\r\n background: transparent;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n color: var(--ts-text-muted);\r\n transition: all 0.2s;\r\n}\r\n\r\n.ts-btn-icon:hover {\r\n background: var(--ts-surface-2);\r\n color: var(--ts-primary);\r\n}\r\n\r\n/* Modal Overlay */\r\n.ts-modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 9999;\r\n}\r\n\r\n\r\n\r\n.ts-modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 20px 24px;\r\n border-bottom: 1px solid var(--ts-border);\r\n}\r\n\r\n.ts-modal-header h3 {\r\n margin: 0;\r\n font-size: 18px;\r\n font-weight: 700;\r\n}\r\n\r\n.ts-modal-header button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n color: var(--ts-text-muted);\r\n padding: 4px;\r\n display: flex;\r\n}\r\n\r\n/* Insights Widget */\r\n.ts-insights-widget {\r\n background: linear-gradient(135deg, rgba(79, 70, 229, 0.05) 0%, rgba(16, 185, 129, 0.05) 100%);\r\n border: 1px solid var(--ts-border);\r\n border-left: 4px solid var(--ts-primary);\r\n border-radius: var(--ts-radius-lg);\r\n padding: 16px 20px;\r\n margin: 20px 0;\r\n}\r\n\r\n.ts-insights-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-bottom: 12px;\r\n color: var(--ts-primary);\r\n}\r\n\r\n.ts-insights-header h3 {\r\n margin: 0;\r\n font-size: 15px;\r\n font-weight: 700;\r\n}\r\n\r\n.ts-insights-list {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.ts-insights-list li {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 10px;\r\n font-size: 14px;\r\n line-height: 1.5;\r\n color: var(--ts-text);\r\n}\r\n\r\n.ts-insights-list li svg {\r\n flex-shrink: 0;\r\n margin-top: 2px;\r\n color: var(--ts-success);\r\n}\r\n\r\n/* Quick Filters */\r\n.ts-quick-filters {\r\n display: flex;\r\n gap: 8px;\r\n margin: 16px 0;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-filter-btn {\r\n padding: 8px 16px;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n background: var(--ts-surface);\r\n color: var(--ts-text);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.ts-filter-btn:hover {\r\n background: var(--ts-surface-2);\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n.ts-filter-btn--active {\r\n background: var(--ts-primary);\r\n color: white;\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n'],sourceRoot:""}]);const o=A},78336:(n,r,e)=>{e.r(r),e.d(r,{default:()=>w});var s=e(74848),t=e(41594),a=e.n(t),A=e(37090),o=e(82381),i=e(12470),l=e(51481),c=e(67359),d=e(84013),C=e(28343),p=e(85072),g=e.n(p),m=e(97825),u=e.n(m),x=e(77659),B=e.n(x),h=e(55056),E=e.n(h),b=e(10540),v=e.n(b),f=e(41113),y=e.n(f),k=e(24099),j={};j.styleTagTransform=y(),j.setAttributes=E(),j.insert=B().bind(null,"head"),j.domAPI=u(),j.insertStyleElement=v();g()(k.A,j);k.A&&k.A.locals&&k.A.locals;const w=()=>{const{dateRange:n,segment:r}=(0,A.n)(),[e,p]=(0,t.useState)("sessions"),[g,m]=(0,t.useState)("desc"),[u,x]=(0,t.useState)("channels"),[B,h]=(0,t.useState)("last_touch"),[E,b]=(0,t.useState)("all"),{data:v,error:f,isLoading:y}=(0,o.S)("getTrafficSources",{date_start:(0,C.TJ)(n.start),date_end:(0,C.TJ)(n.end),segment:r},{refetchInterval:9e5,staleTime:6e5,retry:1}),k=n=>{e===n?m("desc"===g?"asc":"desc"):(p(n),m("desc"))},j=v?.sources?[...v.sources].sort((n,r)=>{let s,t;switch(e){case"sessions":default:s=n.sessions,t=r.sessions;break;case"conversions":s=n.conversions,t=r.conversions;break;case"revenue":s=n.revenue||0,t=r.revenue||0;break;case"conversion_rate":s=n.conversion_rate||0,t=r.conversion_rate||0;break;case"aov":s=n.aov||0,t=r.aov||0;break;case"first_touch_conversions":s=n.first_touch_conversions||0,t=r.first_touch_conversions||0;break;case"last_touch_conversions":s=n.last_touch_conversions||0,t=r.last_touch_conversions||0}return"desc"===g?t-s:s-t}):[],w=(0,t.useMemo)(()=>"all"===E?j:j.filter(n=>{const r=n.medium.toLowerCase();switch(E){case"paid":return"cpc"===r||"paid"===r;case"organic":return"organic"===r;case"social":return"social"===r;case"email":return"email"===r;default:return!0}}),[j,E]),_=w.reduce((n,r)=>n+r.sessions,0)||0,N=v?.total_conversions||0,z=w.reduce((n,r)=>n+(r.revenue||0),0)||0,S=_>0?(N/_*100).toFixed(1):"0.0",T="channels"===u&&w.length>0?Object.values((0,c.gk)(w)).sort((n,r)=>r.totalSessions-n.totalSessions):[],Y=n=>({google:"Search",facebook:"Users",instagram:"Instagram",twitter:"Twitter",linkedin:"Linkedin",youtube:"Youtube",pinterest:"Image",tiktok:"Music",reddit:"MessageSquare",direct:"Link",newsletter:"Mail",email:"Mail",referral:"ExternalLink",bing:"Search",yahoo:"Search"}[n.toLowerCase()]||"Globe"),I=(0,t.useMemo)(()=>{if(!w.length)return[];const n=[],r=_>0?N/_*100:0;if(T.length>0){const r=T[0],e=_>0?(r.totalSessions/_*100).toFixed(0):0;Number(e)>50&&n.push(`${r.channel} dominates with ${e}% of traffic - consider diversifying sources`)}const e=w.filter(n=>n.conversion_rate&&n.conversion_rate>1.5*r);e.length>0&&n.push(`${e[0].source}/${e[0].medium} has ${e[0].conversion_rate?.toFixed(1)}% conv. rate - replicate this success`);const s=w.some(n=>"organic"===n.medium.toLowerCase()),t=w.some(n=>"cpc"===n.medium.toLowerCase());!s&&w.length>1&&n.push("No organic traffic detected - improve SEO to reduce acquisition costs"),!t&&z>1e3&&n.push("Consider paid advertising to scale high-performing channels");const a=w.filter(n=>"(direct)"===n.source.toLowerCase()||"direct"===n.source.toLowerCase());return a.length>0&&a[0].sessions>.3*_&&n.push("Add UTM parameters to campaigns for better attribution tracking"),n.slice(0,3)},[w,T,_,N,z]);return(0,s.jsxs)("div",{className:"ts-page",children:[(0,s.jsxs)("div",{className:"ts-page-header",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h1",{className:"ts-page-title",children:(0,i.__)("Traffic Sources")}),(0,s.jsx)("p",{className:"ts-page-description",children:(0,i.__)("Analyze traffic performance with multi-touch attribution")})]}),!f&&!y&&(0,s.jsxs)("div",{className:"ts-attribution-selector",children:[(0,s.jsx)("label",{className:"ts-label",children:(0,i.__)("Attribution Model:")}),(0,s.jsx)("div",{className:"ts-select-wrapper",children:(0,s.jsxs)("select",{value:B,onChange:n=>h(n.target.value),className:"ts-select",children:[(0,s.jsx)("option",{value:"last_touch",children:(0,i.__)("Last-Touch")}),(0,s.jsx)("option",{value:"first_touch",children:(0,i.__)("First-Touch")}),(0,s.jsx)("option",{value:"linear",children:(0,i.__)("Linear")}),(0,s.jsx)("option",{value:"time_decay",children:(0,i.__)("Time-Decay")}),(0,s.jsx)("option",{value:"position_based",children:(0,i.__)("Position-Based")})]})}),(0,s.jsx)("span",{className:"ts-help-text",children:(0,i.__)("Choose how to attribute conversions to traffic sources")})]})]}),f?(0,s.jsxs)("div",{className:"ts-error-state",children:[(0,s.jsx)(l.I,{name:"AlertTriangle",size:48,color:"danger"}),(0,s.jsx)("h2",{children:(0,i.__)("Error Loading Data")}),(0,s.jsx)("p",{children:f?.message||(0,i.__)("Failed to load traffic sources data")})]}):y?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"ts-sources-summary",children:[1,2,3].map(n=>(0,s.jsx)(d.or,{},n))}),(0,s.jsx)("div",{className:"ts-sources-content",children:(0,s.jsx)(d.cU,{rows:8,columns:5})})]}):v&&v.sources&&0!==v.sources.length?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"ts-sources-summary",children:[(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"Users",size:24,color:"primary",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsxs)("div",{className:"ts-summary-value",children:[(v.unique_visitors||_).toLocaleString(),(0,s.jsxs)("span",{className:"ts-summary-sub",children:[_.toLocaleString()," sessions"]})]}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Unique Visitors")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"Link",size:24,color:"primary",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsx)("div",{className:"ts-summary-value",children:w.length}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Traffic Sources")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"CheckCircle",size:24,color:"success",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsx)("div",{className:"ts-summary-value",children:N.toLocaleString()}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Total Conversions")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"DollarSign",size:24,color:"success",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsx)("div",{className:"ts-summary-value",children:(0,C.vv)(z)}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Total Revenue")})]})]}),(0,s.jsxs)("div",{className:"ts-summary-card",children:[(0,s.jsx)(l.I,{name:"TrendingUp",size:24,color:"primary",className:"ts-summary-icon"}),(0,s.jsxs)("div",{className:"ts-summary-content",children:[(0,s.jsxs)("div",{className:"ts-summary-value",children:[S,"%"]}),(0,s.jsx)("div",{className:"ts-summary-label",children:(0,i.__)("Conversion Rate")})]})]})]}),I.length>0&&(0,s.jsxs)("div",{className:"ts-insights-widget",children:[(0,s.jsxs)("div",{className:"ts-insights-header",children:[(0,s.jsx)(l.I,{name:"Lightbulb",size:18}),(0,s.jsx)("h3",{children:(0,i.__)("Insights & Recommendations")})]}),(0,s.jsx)("ul",{className:"ts-insights-list",children:I.map((n,r)=>(0,s.jsxs)("li",{children:[(0,s.jsx)(l.I,{name:"TrendingUp",size:14}),n]},r))})]}),(0,s.jsxs)("div",{className:"ts-quick-filters",children:[(0,s.jsx)("button",{className:"ts-filter-btn "+("all"===E?"ts-filter-btn--active":""),onClick:()=>b("all"),children:(0,i.__)("All Channels")}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("paid"===E?"ts-filter-btn--active":""),onClick:()=>b("paid"),children:["💰 ",(0,i.__)("Paid")]}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("organic"===E?"ts-filter-btn--active":""),onClick:()=>b("organic"),children:["🌱 ",(0,i.__)("Organic")]}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("social"===E?"ts-filter-btn--active":""),onClick:()=>b("social"),children:["👥 ",(0,i.__)("Social")]}),(0,s.jsxs)("button",{className:"ts-filter-btn "+("email"===E?"ts-filter-btn--active":""),onClick:()=>b("email"),children:["📧 ",(0,i.__)("Email")]})]}),(0,s.jsxs)("div",{className:"ts-display-toggle",children:[(0,s.jsxs)("button",{className:"ts-toggle-btn "+("channels"===u?"ts-toggle-btn--active":""),onClick:()=>x("channels"),children:[(0,s.jsx)(l.I,{name:"Layers",size:16})," ",(0,i.__)("Group by Channels")]}),(0,s.jsxs)("button",{className:"ts-toggle-btn "+("sources"===u?"ts-toggle-btn--active":""),onClick:()=>x("sources"),children:[(0,s.jsx)(l.I,{name:"List",size:16})," ",(0,i.__)("View by Sources")]})]}),(0,s.jsx)("div",{className:"ts-sources-table-container",children:(0,s.jsxs)("table",{className:"ts-sources-table",children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:["channels"===u?(0,s.jsx)("th",{children:(0,i.__)("Channel")}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("th",{children:(0,i.__)("Source")}),(0,s.jsx)("th",{children:(0,i.__)("Medium")})]}),(0,s.jsx)("th",{className:"ts-sortable "+("sessions"===e?"ts-sorted":""),onClick:()=>k("sessions"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Sessions"),"sessions"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("conversions"===e?"ts-sorted":""),onClick:()=>k("conversions"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Conversions"),"conversions"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("conversion_rate"===e?"ts-sorted":""),onClick:()=>k("conversion_rate"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Conv. Rate"),"conversion_rate"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("revenue"===e?"ts-sorted":""),onClick:()=>k("revenue"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("Revenue"),"revenue"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{className:"ts-sortable "+("aov"===e?"ts-sorted":""),onClick:()=>k("aov"),children:(0,s.jsxs)("div",{className:"ts-table-header",children:[(0,i.__)("AOV"),"aov"===e&&(0,s.jsx)(l.I,{name:"desc"===g?"ChevronDown":"ChevronUp",size:16,className:"ts-sort-icon"})]})}),(0,s.jsx)("th",{children:(0,i.__)("% of Total")})]})}),(0,s.jsx)("tbody",{children:"channels"===u?T.map((n,r)=>{const e=_>0?(n.totalSessions/_*100).toFixed(1):"0.0",t=n.totalSessions>0?(n.totalConversions/n.totalSessions*100).toFixed(1):"0.0",A=n.totalConversions>0?n.totalRevenue/n.totalConversions:0;return(0,s.jsx)(a().Fragment,{children:(0,s.jsxs)("tr",{className:"ts-channel-row",children:[(0,s.jsxs)("td",{children:[(0,s.jsx)("span",{className:"ts-channel-icon",children:(0,s.jsx)(l.I,{name:(0,c.Vp)(n.channel),size:20})}),(0,s.jsx)("strong",{children:n.channel}),(0,s.jsxs)("span",{className:"ts-source-count",children:[" (",n.sources.length," ",1===n.sources.length?(0,i.__)("source"):(0,i.__)("sources"),")"]})]}),(0,s.jsx)("td",{children:n.totalSessions.toLocaleString()}),(0,s.jsxs)("td",{children:[n.totalConversions>0&&(0,s.jsx)(l.I,{name:"CheckCircle",size:14,color:"success",className:"ts-conversion-icon"}),n.totalConversions.toLocaleString()]}),(0,s.jsxs)("td",{children:[t,"%"]}),(0,s.jsx)("td",{className:"ts-revenue-cell",children:(0,C.vv)(n.totalRevenue)}),(0,s.jsx)("td",{children:(0,C.vv)(A)}),(0,s.jsx)("td",{children:(0,s.jsxs)("div",{className:"ts-percentage-bar",children:[(0,s.jsx)("div",{className:"ts-percentage-fill",style:{width:`${e}%`,backgroundColor:(0,c.rp)(n.channel)}}),(0,s.jsxs)("span",{className:"ts-percentage-text",children:[e,"%"]})]})})]})},r)}):w.map((n,r)=>{const e=_>0?(n.sessions/_*100).toFixed(1):"0.0";return(0,s.jsxs)("tr",{children:[(0,s.jsxs)("td",{children:[(0,s.jsx)("span",{className:"ts-source-icon",children:(0,s.jsx)(l.I,{name:Y(n.source),size:16})}),n.source]}),(0,s.jsx)("td",{children:n.medium}),(0,s.jsx)("td",{children:n.sessions.toLocaleString()}),(0,s.jsxs)("td",{children:[n.conversions>0&&(0,s.jsx)(l.I,{name:"CheckCircle",size:14,color:"success"}),n.conversions.toLocaleString()]}),(0,s.jsx)("td",{children:n.conversion_rate?n.conversion_rate.toFixed(1)+"%":"0.0%"}),(0,s.jsx)("td",{className:"ts-revenue-cell",children:(0,C.vv)(n.revenue||0)}),(0,s.jsx)("td",{children:(0,C.vv)(n.aov||0)}),(0,s.jsxs)("td",{children:[e,"%"]})]},r)})})]})})]}):(0,s.jsxs)("div",{className:"ts-empty-state",children:[(0,s.jsx)(l.I,{name:"BarChart2",size:48,color:"muted"}),(0,s.jsx)("h2",{children:(0,i.__)("No traffic data yet")}),(0,s.jsx)("p",{children:(0,i.__)("Start tracking to see where your visitors come from")})]})]})}}}]); 2 2 //# sourceMappingURL=336.js.map -
tracksure/trunk/admin/dist/637.js
r3472561 r3473414 1 "use strict";(self.webpackChunktracksure_admin=self.webpackChunktracksure_admin||[]).push([[637],{9570:r=>{r.exports="data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2712%27 height=%2712%27 viewBox=%270 0 12 12%27%3E%3Cpath fill=%27%23666%27 d=%27M6 8L2 4h8z%27/%3E%3C/svg%3E"},12577:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Goals Overview Dashboard Styles\n * \n * Theme-aware styling for the goals dashboard with:\n * - KPI cards grid\n * - Chart visualization\n * - Top goals list\n * - Dark/light theme support\n * - Responsive design\n * \n * @package TrackSure\n * @since 2.1.0\n */\n\n/* ========================================\n Overview Container\n ======================================== */\n.ts-goals-overview {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-lg);\n}\n\n/* ========================================\n KPIs Row\n ======================================== */\n.ts-goals-overview__kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: var(--ts-spacing-md);\n}\n\n/* ========================================\n Chart Card\n ======================================== */\n.ts-goals-overview__chart {\n margin-top: var(--ts-spacing-md);\n}\n\n/* ========================================\n Premium Chart Container\n ======================================== */\n.ts-simple-chart {\n position: relative;\n padding: var(--ts-spacing-lg) var(--ts-spacing-md) var(--ts-spacing-md);\n}\n\n/* Chart Grid Lines - Background Reference */\n.ts-simple-chart::before {\n content: \'\';\n position: absolute;\n top: var(--ts-spacing-lg);\n left: var(--ts-spacing-md);\n right: var(--ts-spacing-md);\n height: 280px;\n background-image: \n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px);\n background-size: 100% 25%, 100% 25%, 100% 25%, 100% 25%;\n background-position: 0 0, 0 25%, 0 50%, 0 75%;\n background-repeat: no-repeat;\n opacity: 0.3;\n pointer-events: none;\n z-index: 0;\n}\n\n.ts-simple-chart__bars {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n height: 280px;\n gap: 12px;\n padding: 0;\n position: relative;\n z-index: 1;\n}\n\n.ts-simple-chart__bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ts-spacing-sm);\n height: 100%;\n justify-content: flex-end;\n animation: fadeInUp 0.4s ease-out backwards;\n}\n\n@keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Stagger animation for each bar */\n.ts-simple-chart__bar-wrapper:nth-child(1) { animation-delay: 0.05s; }\n.ts-simple-chart__bar-wrapper:nth-child(2) { animation-delay: 0.1s; }\n.ts-simple-chart__bar-wrapper:nth-child(3) { animation-delay: 0.15s; }\n.ts-simple-chart__bar-wrapper:nth-child(4) { animation-delay: 0.2s; }\n.ts-simple-chart__bar-wrapper:nth-child(5) { animation-delay: 0.25s; }\n.ts-simple-chart__bar-wrapper:nth-child(6) { animation-delay: 0.3s; }\n.ts-simple-chart__bar-wrapper:nth-child(7) { animation-delay: 0.35s; }\n\n.ts-simple-chart__bar {\n width: 100%;\n min-height: 20px;\n background: linear-gradient(\n 180deg, \n rgba(37, 99, 235, 0.9) 0%,\n rgba(37, 99, 235, 1) 50%,\n rgba(29, 78, 216, 1) 100%\n );\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 8px;\n cursor: pointer;\n box-shadow: \n 0 -2px 8px rgba(37, 99, 235, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n}\n\n.ts-simple-chart__bar::after {\n content: \'\';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: rgba(255, 255, 255, 0.4);\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\n}\n\n.ts-simple-chart__bar:hover {\n background: linear-gradient(\n 180deg,\n rgba(16, 185, 129, 0.9) 0%,\n rgba(16, 185, 129, 1) 50%,\n rgba(5, 150, 105, 1) 100%\n );\n transform: translateY(-4px) scale(1.02);\n box-shadow: \n 0 -4px 16px rgba(16, 185, 129, 0.3),\n 0 4px 12px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n z-index: 2;\n}\n\n[data-theme="dark"] .ts-simple-chart__bar {\n background: linear-gradient(\n 180deg,\n rgba(96, 165, 250, 0.8) 0%,\n rgba(59, 130, 246, 0.9) 50%,\n rgba(37, 99, 235, 1) 100%\n );\n box-shadow: \n 0 -2px 12px rgba(96, 165, 250, 0.25),\n inset 0 1px 0 rgba(255, 255, 255, 0.15);\n}\n\n[data-theme="dark"] .ts-simple-chart__bar:hover {\n background: linear-gradient(\n 180deg,\n rgba(52, 211, 153, 0.8) 0%,\n rgba(16, 185, 129, 0.9) 50%,\n rgba(5, 150, 105, 1) 100%\n );\n box-shadow: \n 0 -4px 20px rgba(52, 211, 153, 0.4),\n 0 4px 16px rgba(0, 0, 0, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n}\n\n.ts-simple-chart__bar-value {\n font-size: 12px;\n font-weight: 700;\n color: white;\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n opacity: 0.9;\n transition: all 0.2s ease;\n line-height: 1;\n}\n\n.ts-simple-chart__bar:hover .ts-simple-chart__bar-value {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.ts-simple-chart__bar-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--ts-text-secondary);\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n transition: color 0.2s ease;\n}\n\n.ts-simple-chart__bar-wrapper:hover .ts-simple-chart__bar-label {\n color: var(--ts-text-primary);\n font-weight: 600;\n}\n\n/* ========================================\n Top Goals List\n ======================================== */\n.ts-goals-overview__top-goals {\n margin-top: var(--ts-spacing-md);\n}\n\n.ts-top-goals-list {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-sm);\n}\n\n.ts-top-goal {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-md);\n padding: var(--ts-spacing-md);\n background: var(--ts-bg);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n transition: all 0.2s ease;\n}\n\n.ts-top-goal:hover {\n background: var(--ts-surface-hover);\n border-color: var(--ts-primary);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n[data-theme="dark"] .ts-top-goal {\n background: var(--ts-surface-dark);\n}\n\n[data-theme="dark"] .ts-top-goal:hover {\n background: var(--ts-surface-hover-dark);\n}\n\n.ts-top-goal__rank {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--ts-primary);\n color: var(--ts-surface);\n border-radius: 50%;\n font-size: 13px;\n font-weight: 700;\n}\n\n.ts-top-goal__info {\n flex: 1;\n min-width: 0;\n}\n\n.ts-top-goal__name {\n font-size: 15px;\n font-weight: 600;\n color: var(--ts-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ts-top-goal__type {\n font-size: 13px;\n color: var(--ts-text-muted);\n text-transform: capitalize;\n}\n\n.ts-top-goal__metrics {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-md);\n flex-shrink: 0;\n}\n\n.ts-top-goal__conversions,\n.ts-top-goal__value {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs);\n font-size: 14px;\n font-weight: 600;\n color: var(--ts-text);\n}\n\n.ts-top-goal__conversions {\n color: var(--ts-success);\n}\n\n.ts-top-goal__value {\n color: var(--ts-primary);\n}\n\n/* ========================================\n Empty State\n ======================================== */\n.ts-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\n text-align: center;\n gap: var(--ts-spacing-md);\n}\n\n.ts-empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0;\n}\n\n.ts-empty-state p {\n font-size: 14px;\n color: var(--ts-text-muted);\n margin: 0;\n max-width: 400px;\n}\n\n.ts-empty-state--error {\n color: var(--ts-error);\n}\n\n.ts-empty-state--error h3 {\n color: var(--ts-error);\n}\n\n/* ========================================\n Responsive Design\n ======================================== */\n@media (max-width: 768px) {\n .ts-goals-overview__kpis {\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n }\n\n .ts-simple-chart::before {\n height: 200px;\n }\n\n .ts-simple-chart__bars {\n height: 200px;\n }\n\n .ts-simple-chart__bar-label {\n font-size: 10px;\n }\n\n .ts-top-goal {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--ts-spacing-sm);\n }\n\n .ts-top-goal__metrics {\n width: 100%;\n justify-content: space-between;\n }\n}\n\n/* ========================================\n Accessibility\n ======================================== */\n@media (prefers-reduced-motion: reduce) {\n .ts-simple-chart__bar,\n .ts-top-goal {\n transition: none;\n }\n}\n\n@media (prefers-contrast: high) {\n .ts-simple-chart__bar {\n border: 2px solid currentColor;\n }\n\n .ts-top-goal {\n border-width: 2px;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/views/GoalsOverview.css"],names:[],mappings:"AAAA;;;;;;;;;;;;EAYE;;AAEF;;6CAE6C;AAC7C;EACE,aAAa;EACb,sBAAsB;EACtB,yBAAyB;AAC3B;;AAEA;;6CAE6C;AAC7C;EACE,aAAa;EACb,2DAA2D;EAC3D,yBAAyB;AAC3B;;AAEA;;6CAE6C;AAC7C;EACE,gCAAgC;AAClC;;AAEA;;6CAE6C;AAC7C;EACE,kBAAkB;EAClB,uEAAuE;AACzE;;AAEA,4CAA4C;AAC5C;EACE,WAAW;EACX,kBAAkB;EAClB,yBAAyB;EACzB,0BAA0B;EAC1B,2BAA2B;EAC3B,aAAa;EACb;;;;2EAIyE;EACzE,uDAAuD;EACvD,6CAA6C;EAC7C,4BAA4B;EAC5B,YAAY;EACZ,oBAAoB;EACpB,UAAU;AACZ;;AAEA;EACE,aAAa;EACb,qBAAqB;EACrB,8BAA8B;EAC9B,aAAa;EACb,SAAS;EACT,UAAU;EACV,kBAAkB;EAClB,UAAU;AACZ;;AAEA;EACE,OAAO;EACP,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,yBAAyB;EACzB,YAAY;EACZ,yBAAyB;EACzB,2CAA2C;AAC7C;;AAEA;EACE;IACE,UAAU;IACV,2BAA2B;EAC7B;EACA;IACE,UAAU;IACV,wBAAwB;EAC1B;AACF;;AAEA,mCAAmC;AACnC,6CAA6C,sBAAsB,EAAE;AACrE,6CAA6C,qBAAqB,EAAE;AACpE,6CAA6C,sBAAsB,EAAE;AACrE,6CAA6C,qBAAqB,EAAE;AACpE,6CAA6C,sBAAsB,EAAE;AACrE,6CAA6C,qBAAqB,EAAE;AACpE,6CAA6C,sBAAsB,EAAE;;AAErE;EACE,WAAW;EACX,gBAAgB;EAChB;;;;;GAKC;EACD,0DAA0D;EAC1D,iDAAiD;EACjD,kBAAkB;EAClB,aAAa;EACb,uBAAuB;EACvB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf;;0CAEwC;AAC1C;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,MAAM;EACN,OAAO;EACP,QAAQ;EACR,WAAW;EACX,oCAAoC;EACpC,0DAA0D;AAC5D;;AAEA;EACE;;;;;GAKC;EACD,uCAAuC;EACvC;;;0CAGwC;EACxC,UAAU;AACZ;;AAEA;EACE;;;;;GAKC;EACD;;2CAEyC;AAC3C;;AAEA;EACE;;;;;GAKC;EACD;;;0CAGwC;AAC1C;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,YAAY;EACZ,yCAAyC;EACzC,YAAY;EACZ,yBAAyB;EACzB,cAAc;AAChB;;AAEA;EACE,UAAU;EACV,qBAAqB;AACvB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,+BAA+B;EAC/B,kBAAkB;EAClB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;EACvB,eAAe;EACf,2BAA2B;AAC7B;;AAEA;EACE,6BAA6B;EAC7B,gBAAgB;AAClB;;AAEA;;6CAE6C;AAC7C;EACE,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,yBAAyB;AAC3B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,6BAA6B;EAC7B,wBAAwB;EACxB,kCAAkC;EAClC,kCAAkC;EAClC,yBAAyB;AAC3B;;AAEA;EACE,mCAAmC;EACnC,+BAA+B;EAC/B,yCAAyC;AAC3C;;AAEA;EACE,kCAAkC;AACpC;;AAEA;EACE,wCAAwC;AAC1C;;AAEA;EACE,cAAc;EACd,WAAW;EACX,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,6BAA6B;EAC7B,wBAAwB;EACxB,kBAAkB;EAClB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,YAAY;AACd;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,0BAA0B;AAC5B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,cAAc;AAChB;;AAEA;;EAEE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,eAAe;EACf,gBAAgB;EAChB,qBAAqB;AACvB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;;6CAE6C;AAC7C;EACE,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,uBAAuB;EACvB,kDAAkD;EAClD,kBAAkB;EAClB,yBAAyB;AAC3B;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,SAAS;AACX;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,SAAS;EACT,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;;6CAE6C;AAC7C;EACE;IACE,2DAA2D;EAC7D;;EAEA;IACE,aAAa;EACf;;EAEA;IACE,aAAa;EACf;;EAEA;IACE,eAAe;EACjB;;EAEA;IACE,sBAAsB;IACtB,uBAAuB;IACvB,yBAAyB;EAC3B;;EAEA;IACE,WAAW;IACX,8BAA8B;EAChC;AACF;;AAEA;;6CAE6C;AAC7C;EACE;;IAEE,gBAAgB;EAClB;AACF;;AAEA;EACE;IACE,8BAA8B;EAChC;;EAEA;IACE,iBAAiB;EACnB;AACF",sourcesContent:['/**\r\n * Goals Overview Dashboard Styles\r\n * \r\n * Theme-aware styling for the goals dashboard with:\r\n * - KPI cards grid\r\n * - Chart visualization\r\n * - Top goals list\r\n * - Dark/light theme support\r\n * - Responsive design\r\n * \r\n * @package TrackSure\r\n * @since 2.1.0\r\n */\r\n\r\n/* ========================================\r\n Overview Container\r\n ======================================== */\r\n.ts-goals-overview {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-lg);\r\n}\r\n\r\n/* ========================================\r\n KPIs Row\r\n ======================================== */\r\n.ts-goals-overview__kpis {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\r\n gap: var(--ts-spacing-md);\r\n}\r\n\r\n/* ========================================\r\n Chart Card\r\n ======================================== */\r\n.ts-goals-overview__chart {\r\n margin-top: var(--ts-spacing-md);\r\n}\r\n\r\n/* ========================================\r\n Premium Chart Container\r\n ======================================== */\r\n.ts-simple-chart {\r\n position: relative;\r\n padding: var(--ts-spacing-lg) var(--ts-spacing-md) var(--ts-spacing-md);\r\n}\r\n\r\n/* Chart Grid Lines - Background Reference */\r\n.ts-simple-chart::before {\r\n content: \'\';\r\n position: absolute;\r\n top: var(--ts-spacing-lg);\r\n left: var(--ts-spacing-md);\r\n right: var(--ts-spacing-md);\r\n height: 280px;\r\n background-image: \r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px);\r\n background-size: 100% 25%, 100% 25%, 100% 25%, 100% 25%;\r\n background-position: 0 0, 0 25%, 0 50%, 0 75%;\r\n background-repeat: no-repeat;\r\n opacity: 0.3;\r\n pointer-events: none;\r\n z-index: 0;\r\n}\r\n\r\n.ts-simple-chart__bars {\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: space-between;\r\n height: 280px;\r\n gap: 12px;\r\n padding: 0;\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.ts-simple-chart__bar-wrapper {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm);\r\n height: 100%;\r\n justify-content: flex-end;\r\n animation: fadeInUp 0.4s ease-out backwards;\r\n}\r\n\r\n@keyframes fadeInUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n/* Stagger animation for each bar */\r\n.ts-simple-chart__bar-wrapper:nth-child(1) { animation-delay: 0.05s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(2) { animation-delay: 0.1s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(3) { animation-delay: 0.15s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(4) { animation-delay: 0.2s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(5) { animation-delay: 0.25s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(6) { animation-delay: 0.3s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(7) { animation-delay: 0.35s; }\r\n\r\n.ts-simple-chart__bar {\r\n width: 100%;\r\n min-height: 20px;\r\n background: linear-gradient(\r\n 180deg, \r\n rgba(37, 99, 235, 0.9) 0%,\r\n rgba(37, 99, 235, 1) 50%,\r\n rgba(29, 78, 216, 1) 100%\r\n );\r\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n position: relative;\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: center;\r\n padding-top: 8px;\r\n cursor: pointer;\r\n box-shadow: \r\n 0 -2px 8px rgba(37, 99, 235, 0.15),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n.ts-simple-chart__bar::after {\r\n content: \'\';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 3px;\r\n background: rgba(255, 255, 255, 0.4);\r\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\r\n}\r\n\r\n.ts-simple-chart__bar:hover {\r\n background: linear-gradient(\r\n 180deg,\r\n rgba(16, 185, 129, 0.9) 0%,\r\n rgba(16, 185, 129, 1) 50%,\r\n rgba(5, 150, 105, 1) 100%\r\n );\r\n transform: translateY(-4px) scale(1.02);\r\n box-shadow: \r\n 0 -4px 16px rgba(16, 185, 129, 0.3),\r\n 0 4px 12px rgba(0, 0, 0, 0.1),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\r\n z-index: 2;\r\n}\r\n\r\n[data-theme="dark"] .ts-simple-chart__bar {\r\n background: linear-gradient(\r\n 180deg,\r\n rgba(96, 165, 250, 0.8) 0%,\r\n rgba(59, 130, 246, 0.9) 50%,\r\n rgba(37, 99, 235, 1) 100%\r\n );\r\n box-shadow: \r\n 0 -2px 12px rgba(96, 165, 250, 0.25),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.15);\r\n}\r\n\r\n[data-theme="dark"] .ts-simple-chart__bar:hover {\r\n background: linear-gradient(\r\n 180deg,\r\n rgba(52, 211, 153, 0.8) 0%,\r\n rgba(16, 185, 129, 0.9) 50%,\r\n rgba(5, 150, 105, 1) 100%\r\n );\r\n box-shadow: \r\n 0 -4px 20px rgba(52, 211, 153, 0.4),\r\n 0 4px 16px rgba(0, 0, 0, 0.2),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n.ts-simple-chart__bar-value {\r\n font-size: 12px;\r\n font-weight: 700;\r\n color: white;\r\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\r\n opacity: 0.9;\r\n transition: all 0.2s ease;\r\n line-height: 1;\r\n}\r\n\r\n.ts-simple-chart__bar:hover .ts-simple-chart__bar-value {\r\n opacity: 1;\r\n transform: scale(1.1);\r\n}\r\n\r\n.ts-simple-chart__bar-label {\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: var(--ts-text-secondary);\r\n text-align: center;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n max-width: 100%;\r\n transition: color 0.2s ease;\r\n}\r\n\r\n.ts-simple-chart__bar-wrapper:hover .ts-simple-chart__bar-label {\r\n color: var(--ts-text-primary);\r\n font-weight: 600;\r\n}\r\n\r\n/* ========================================\r\n Top Goals List\r\n ======================================== */\r\n.ts-goals-overview__top-goals {\r\n margin-top: var(--ts-spacing-md);\r\n}\r\n\r\n.ts-top-goals-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-sm);\r\n}\r\n\r\n.ts-top-goal {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-md);\r\n padding: var(--ts-spacing-md);\r\n background: var(--ts-bg);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-top-goal:hover {\r\n background: var(--ts-surface-hover);\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n[data-theme="dark"] .ts-top-goal {\r\n background: var(--ts-surface-dark);\r\n}\r\n\r\n[data-theme="dark"] .ts-top-goal:hover {\r\n background: var(--ts-surface-hover-dark);\r\n}\r\n\r\n.ts-top-goal__rank {\r\n flex-shrink: 0;\r\n width: 32px;\r\n height: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--ts-primary);\r\n color: var(--ts-surface);\r\n border-radius: 50%;\r\n font-size: 13px;\r\n font-weight: 700;\r\n}\r\n\r\n.ts-top-goal__info {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-top-goal__name {\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.ts-top-goal__type {\r\n font-size: 13px;\r\n color: var(--ts-text-muted);\r\n text-transform: capitalize;\r\n}\r\n\r\n.ts-top-goal__metrics {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-md);\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-top-goal__conversions,\r\n.ts-top-goal__value {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs);\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n}\r\n\r\n.ts-top-goal__conversions {\r\n color: var(--ts-success);\r\n}\r\n\r\n.ts-top-goal__value {\r\n color: var(--ts-primary);\r\n}\r\n\r\n/* ========================================\r\n Empty State\r\n ======================================== */\r\n.ts-empty-state {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\r\n text-align: center;\r\n gap: var(--ts-spacing-md);\r\n}\r\n\r\n.ts-empty-state h3 {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0;\r\n}\r\n\r\n.ts-empty-state p {\r\n font-size: 14px;\r\n color: var(--ts-text-muted);\r\n margin: 0;\r\n max-width: 400px;\r\n}\r\n\r\n.ts-empty-state--error {\r\n color: var(--ts-error);\r\n}\r\n\r\n.ts-empty-state--error h3 {\r\n color: var(--ts-error);\r\n}\r\n\r\n/* ========================================\r\n Responsive Design\r\n ======================================== */\r\n@media (max-width: 768px) {\r\n .ts-goals-overview__kpis {\r\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\r\n }\r\n\r\n .ts-simple-chart::before {\r\n height: 200px;\r\n }\r\n\r\n .ts-simple-chart__bars {\r\n height: 200px;\r\n }\r\n\r\n .ts-simple-chart__bar-label {\r\n font-size: 10px;\r\n }\r\n\r\n .ts-top-goal {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: var(--ts-spacing-sm);\r\n }\r\n\r\n .ts-top-goal__metrics {\r\n width: 100%;\r\n justify-content: space-between;\r\n }\r\n}\r\n\r\n/* ========================================\r\n Accessibility\r\n ======================================== */\r\n@media (prefers-reduced-motion: reduce) {\r\n .ts-simple-chart__bar,\r\n .ts-top-goal {\r\n transition: none;\r\n }\r\n}\r\n\r\n@media (prefers-contrast: high) {\r\n .ts-simple-chart__bar {\r\n border: 2px solid currentColor;\r\n }\r\n\r\n .ts-top-goal {\r\n border-width: 2px;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},21421:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'.goal-filters {\n background: var(--ts-bg-secondary);\n border: 1px solid var(--ts-border-color);\n border-radius: 8px;\n margin-bottom: 16px;\n}\n\n.filters-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n gap: 16px;\n}\n\n.filters-search {\n position: relative;\n flex: 1;\n max-width: 400px;\n}\n\n.filters-search .dashicons-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--ts-text-tertiary);\n font-size: 18px;\n width: 18px;\n height: 18px;\n pointer-events: none;\n}\n\n.search-input {\n width: 100%;\n padding: 8px 36px 8px 36px;\n border: 1px solid var(--ts-border-color);\n border-radius: 6px;\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--ts-primary-color);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.clear-search {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--ts-text-tertiary);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.clear-search:hover {\n background: var(--ts-bg-hover);\n color: var(--ts-text-primary);\n}\n\n.clear-search .dashicons {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.filters-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filters-toggle {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--ts-border-color);\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n.filters-toggle .dashicons {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.filters-toggle:hover {\n background: var(--ts-bg-hover);\n border-color: var(--ts-primary-color);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.filters-toggle.active {\n background: var(--ts-primary-color);\n color: white;\n border-color: var(--ts-primary-color);\n}\n\n.filters-toggle.active:hover {\n background: var(--ts-primary-hover, #1d4ed8);\n}\n\n.filter-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 8px;\n height: 8px;\n background: #dc3545;\n border-radius: 50%;\n border: 2px solid var(--ts-bg-secondary);\n}\n\n.filters-panel {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 16px;\n padding: 16px;\n border-top: 1px solid var(--ts-border-color);\n animation: slideDown 0.2s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.filters-panel .filter-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n width:100%;\n background: var(--ts-surface);\n}\n\n.filter-group label {\n font-size: 12px;\n font-weight: 600;\n color: var(--ts-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.filter-group select {\n padding: 8px 12px;\n border: 1px solid var(--ts-border-color);\n border-radius: 6px;\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-group select:focus {\n outline: none;\n border-color: var(--ts-primary-color);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.filter-group select:hover {\n border-color: var(--ts-primary-color);\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .filters-header {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filters-search {\n max-width: none;\n }\n\n .filters-actions {\n justify-content: space-between;\n }\n\n .filters-panel {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 480px) {\n .filters-header {\n padding: 12px;\n }\n\n .filters-panel {\n padding: 12px;\n gap: 12px;\n }\n\n .search-input {\n font-size: 16px; /* Prevent zoom on iOS */\n }\n}\n\n/* Dark Theme */\n[data-theme="dark"] .search-input,\n[data-theme="dark"] .filter-group select {\n background: var(--ts-bg-secondary);\n}\n\n[data-theme="dark"] .search-input:focus,\n[data-theme="dark"] .filter-group select:focus {\n background: var(--ts-bg-primary);\n}\n',"",{version:3,sources:["webpack://./src/components/goals/features/filters/GoalFilters.css"],names:[],mappings:"AAAA;EACE,kCAAkC;EAClC,wCAAwC;EACxC,kBAAkB;EAClB,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,kBAAkB;EAClB,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,UAAU;EACV,QAAQ;EACR,2BAA2B;EAC3B,8BAA8B;EAC9B,eAAe;EACf,WAAW;EACX,YAAY;EACZ,oBAAoB;AACtB;;AAEA;EACE,WAAW;EACX,0BAA0B;EAC1B,wCAAwC;EACxC,kBAAkB;EAClB,gCAAgC;EAChC,6BAA6B;EAC7B,eAAe;EACf,yBAAyB;AAC3B;;AAEA;EACE,aAAa;EACb,qCAAqC;EACrC,4CAA4C;AAC9C;;AAEA;EACE,kBAAkB;EAClB,UAAU;EACV,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,eAAe;EACf,8BAA8B;EAC9B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;AAC3B;;AAEA;EACE,8BAA8B;EAC9B,6BAA6B;AAC/B;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;AACd;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;AACV;;AAEA;EACE,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;EACjB,wCAAwC;EACxC,gCAAgC;EAChC,6BAA6B;EAC7B,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,yBAAyB;AAC3B;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;AACd;;AAEA;EACE,8BAA8B;EAC9B,qCAAqC;EACrC,2BAA2B;EAC3B,wCAAwC;AAC1C;;AAEA;EACE,mCAAmC;EACnC,YAAY;EACZ,qCAAqC;AACvC;;AAEA;EACE,4CAA4C;AAC9C;;AAEA;EACE,kBAAkB;EAClB,SAAS;EACT,WAAW;EACX,UAAU;EACV,WAAW;EACX,mBAAmB;EACnB,kBAAkB;EAClB,wCAAwC;AAC1C;;AAEA;EACE,aAAa;EACb,2DAA2D;EAC3D,SAAS;EACT,aAAa;EACb,4CAA4C;EAC5C,8BAA8B;AAChC;;AAEA;EACE;IACE,UAAU;IACV,4BAA4B;EAC9B;EACA;IACE,UAAU;IACV,wBAAwB;EAC1B;AACF;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,QAAQ;EACR,UAAU;EACV,6BAA6B;AAC/B;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,+BAA+B;EAC/B,yBAAyB;EACzB,qBAAqB;AACvB;;AAEA;EACE,iBAAiB;EACjB,wCAAwC;EACxC,kBAAkB;EAClB,gCAAgC;EAChC,6BAA6B;EAC7B,eAAe;EACf,eAAe;EACf,yBAAyB;AAC3B;;AAEA;EACE,aAAa;EACb,qCAAqC;EACrC,4CAA4C;AAC9C;;AAEA;EACE,qCAAqC;AACvC;;AAEA,sBAAsB;AACtB;EACE;IACE,sBAAsB;IACtB,oBAAoB;EACtB;;EAEA;IACE,eAAe;EACjB;;EAEA;IACE,8BAA8B;EAChC;;EAEA;IACE,0BAA0B;EAC5B;AACF;;AAEA;EACE;IACE,aAAa;EACf;;EAEA;IACE,aAAa;IACb,SAAS;EACX;;EAEA;IACE,eAAe,EAAE,wBAAwB;EAC3C;AACF;;AAEA,eAAe;AACf;;EAEE,kCAAkC;AACpC;;AAEA;;EAEE,gCAAgC;AAClC",sourcesContent:['.goal-filters {\r\n background: var(--ts-bg-secondary);\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 8px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.filters-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n gap: 16px;\r\n}\r\n\r\n.filters-search {\r\n position: relative;\r\n flex: 1;\r\n max-width: 400px;\r\n}\r\n\r\n.filters-search .dashicons-search {\r\n position: absolute;\r\n left: 12px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: var(--ts-text-tertiary);\r\n font-size: 18px;\r\n width: 18px;\r\n height: 18px;\r\n pointer-events: none;\r\n}\r\n\r\n.search-input {\r\n width: 100%;\r\n padding: 8px 36px 8px 36px;\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 6px;\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n font-size: 14px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.search-input:focus {\r\n outline: none;\r\n border-color: var(--ts-primary-color);\r\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\r\n}\r\n\r\n.clear-search {\r\n position: absolute;\r\n right: 8px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n background: none;\r\n border: none;\r\n padding: 4px;\r\n cursor: pointer;\r\n color: var(--ts-text-tertiary);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.clear-search:hover {\r\n background: var(--ts-bg-hover);\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.clear-search .dashicons {\r\n font-size: 16px;\r\n width: 16px;\r\n height: 16px;\r\n}\r\n\r\n.filters-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.filters-toggle {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 6px 12px;\r\n border: 1px solid var(--ts-border-color);\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 13px;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.filters-toggle .dashicons {\r\n font-size: 16px;\r\n width: 16px;\r\n height: 16px;\r\n}\r\n\r\n.filters-toggle:hover {\r\n background: var(--ts-bg-hover);\r\n border-color: var(--ts-primary-color);\r\n transform: translateY(-1px);\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.filters-toggle.active {\r\n background: var(--ts-primary-color);\r\n color: white;\r\n border-color: var(--ts-primary-color);\r\n}\r\n\r\n.filters-toggle.active:hover {\r\n background: var(--ts-primary-hover, #1d4ed8);\r\n}\r\n\r\n.filter-badge {\r\n position: absolute;\r\n top: -4px;\r\n right: -4px;\r\n width: 8px;\r\n height: 8px;\r\n background: #dc3545;\r\n border-radius: 50%;\r\n border: 2px solid var(--ts-bg-secondary);\r\n}\r\n\r\n.filters-panel {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\r\n gap: 16px;\r\n padding: 16px;\r\n border-top: 1px solid var(--ts-border-color);\r\n animation: slideDown 0.2s ease;\r\n}\r\n\r\n@keyframes slideDown {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.filters-panel .filter-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n width:100%;\r\n background: var(--ts-surface);\r\n}\r\n\r\n.filter-group label {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--ts-text-secondary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.filter-group select {\r\n padding: 8px 12px;\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 6px;\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.filter-group select:focus {\r\n outline: none;\r\n border-color: var(--ts-primary-color);\r\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\r\n}\r\n\r\n.filter-group select:hover {\r\n border-color: var(--ts-primary-color);\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 768px) {\r\n .filters-header {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .filters-search {\r\n max-width: none;\r\n }\r\n\r\n .filters-actions {\r\n justify-content: space-between;\r\n }\r\n\r\n .filters-panel {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .filters-header {\r\n padding: 12px;\r\n }\r\n\r\n .filters-panel {\r\n padding: 12px;\r\n gap: 12px;\r\n }\r\n\r\n .search-input {\r\n font-size: 16px; /* Prevent zoom on iOS */\r\n }\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme="dark"] .search-input,\r\n[data-theme="dark"] .filter-group select {\r\n background: var(--ts-bg-secondary);\r\n}\r\n\r\n[data-theme="dark"] .search-input:focus,\r\n[data-theme="dark"] .filter-group select:focus {\r\n background: var(--ts-bg-primary);\r\n}\r\n'],sourceRoot:""}]);const i=s},27691:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'.goal-import-modal {\n background: var(--ts-bg-primary);\n border-radius: 12px;\n max-width: 600px;\n width: 90%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\n}\n\n.goal-import-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--ts-border-color);\n}\n\n.goal-import-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-close {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--ts-text-tertiary);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.goal-import-close:hover {\n background: var(--ts-bg-hover);\n color: var(--ts-text-primary);\n}\n\n.goal-import-close .dashicons {\n font-size: 20px;\n width: 20px;\n height: 20px;\n}\n\n.goal-import-body {\n padding: 24px;\n overflow-y: auto;\n flex: 1;\n}\n\n/* Dropzone */\n.goal-import-dropzone {\n border: 2px dashed var(--ts-border-color);\n border-radius: 8px;\n padding: 48px 24px;\n text-align: center;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--ts-bg-secondary);\n}\n\n.goal-import-dropzone:hover,\n.goal-import-dropzone.dragging {\n border-color: var(--ts-primary-color);\n background: var(--ts-primary-soft);\n}\n\n.goal-import-dropzone .dashicons {\n font-size: 48px;\n width: 48px;\n height: 48px;\n color: var(--ts-text-tertiary);\n margin-bottom: 16px;\n}\n\n.goal-import-dropzone h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-dropzone p {\n margin: 0;\n color: var(--ts-text-secondary);\n font-size: 14px;\n}\n\n/* Preview */\n.goal-import-preview h3 {\n margin: 0 0 12px;\n font-size: 16px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-preview > p {\n margin: 0 0 16px;\n color: var(--ts-text-secondary);\n}\n\n.preview-list {\n max-height: 400px;\n overflow-y: auto;\n border: 1px solid var(--ts-border-color);\n border-radius: 8px;\n background: var(--ts-bg-secondary);\n margin-bottom: 20px;\n}\n\n.preview-item {\n padding: 16px;\n border-bottom: 1px solid var(--ts-border-color);\n}\n\n.preview-item:last-child {\n border-bottom: none;\n}\n\n.preview-item-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 12px;\n}\n\n.preview-item-header strong {\n font-size: 15px;\n color: var(--ts-text-primary);\n flex: 1;\n}\n\n.preview-badge {\n display: inline-block;\n padding: 4px 10px;\n background: var(--ts-primary-soft);\n color: var(--ts-primary-color);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.preview-description {\n margin: 0 0 8px;\n color: var(--ts-text-secondary);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.preview-meta {\n display: flex;\n gap: 12px;\n font-size: 12px;\n color: var(--ts-text-tertiary);\n}\n\n.preview-meta span {\n text-transform: capitalize;\n}\n\n/* Actions */\n.goal-import-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.goal-import-actions .button {\n min-width: 100px;\n}\n\n/* Result */\n.goal-import-result {\n text-align: center;\n padding: 24px;\n}\n\n.goal-import-result .dashicons {\n font-size: 64px;\n width: 64px;\n height: 64px;\n margin-bottom: 16px;\n}\n\n.goal-import-result.success .dashicons {\n color: #10b981;\n}\n\n.goal-import-result.error .dashicons {\n color: #dc3545;\n}\n\n.goal-import-result h3 {\n margin: 0 0 12px;\n font-size: 20px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-result p {\n margin: 0 0 20px;\n color: var(--ts-text-secondary);\n}\n\n.error-list {\n text-align: left;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 6px;\n padding: 12px 16px;\n margin-bottom: 20px;\n}\n\n[data-theme="dark"] .error-list {\n background: rgba(220, 53, 69, 0.1);\n border-color: rgba(220, 53, 69, 0.3);\n}\n\n.error-message {\n margin: 6px 0;\n color: #dc3545;\n font-size: 13px;\n line-height: 1.5;\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .goal-import-modal {\n max-width: 100%;\n width: 100%;\n height: 100%;\n max-height: 100vh;\n border-radius: 0;\n }\n\n .goal-import-dropzone {\n padding: 32px 16px;\n }\n\n .goal-import-actions {\n flex-direction: column-reverse;\n }\n\n .goal-import-actions .button {\n width: 100%;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/features/import/GoalImport.css"],names:[],mappings:"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",sourcesContent:['.goal-import-modal {\r\n background: var(--ts-bg-primary);\r\n border-radius: 12px;\r\n max-width: 600px;\r\n width: 90%;\r\n max-height: 80vh;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.goal-import-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 20px 24px;\r\n border-bottom: 1px solid var(--ts-border-color);\r\n}\r\n\r\n.goal-import-header h2 {\r\n margin: 0;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-close {\r\n background: none;\r\n border: none;\r\n padding: 4px;\r\n cursor: pointer;\r\n color: var(--ts-text-tertiary);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.goal-import-close:hover {\r\n background: var(--ts-bg-hover);\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-close .dashicons {\r\n font-size: 20px;\r\n width: 20px;\r\n height: 20px;\r\n}\r\n\r\n.goal-import-body {\r\n padding: 24px;\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n/* Dropzone */\r\n.goal-import-dropzone {\r\n border: 2px dashed var(--ts-border-color);\r\n border-radius: 8px;\r\n padding: 48px 24px;\r\n text-align: center;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n background: var(--ts-bg-secondary);\r\n}\r\n\r\n.goal-import-dropzone:hover,\r\n.goal-import-dropzone.dragging {\r\n border-color: var(--ts-primary-color);\r\n background: var(--ts-primary-soft);\r\n}\r\n\r\n.goal-import-dropzone .dashicons {\r\n font-size: 48px;\r\n width: 48px;\r\n height: 48px;\r\n color: var(--ts-text-tertiary);\r\n margin-bottom: 16px;\r\n}\r\n\r\n.goal-import-dropzone h3 {\r\n margin: 0 0 8px;\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-dropzone p {\r\n margin: 0;\r\n color: var(--ts-text-secondary);\r\n font-size: 14px;\r\n}\r\n\r\n/* Preview */\r\n.goal-import-preview h3 {\r\n margin: 0 0 12px;\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-preview > p {\r\n margin: 0 0 16px;\r\n color: var(--ts-text-secondary);\r\n}\r\n\r\n.preview-list {\r\n max-height: 400px;\r\n overflow-y: auto;\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 8px;\r\n background: var(--ts-bg-secondary);\r\n margin-bottom: 20px;\r\n}\r\n\r\n.preview-item {\r\n padding: 16px;\r\n border-bottom: 1px solid var(--ts-border-color);\r\n}\r\n\r\n.preview-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.preview-item-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 8px;\r\n gap: 12px;\r\n}\r\n\r\n.preview-item-header strong {\r\n font-size: 15px;\r\n color: var(--ts-text-primary);\r\n flex: 1;\r\n}\r\n\r\n.preview-badge {\r\n display: inline-block;\r\n padding: 4px 10px;\r\n background: var(--ts-primary-soft);\r\n color: var(--ts-primary-color);\r\n border-radius: 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n text-transform: capitalize;\r\n}\r\n\r\n.preview-description {\r\n margin: 0 0 8px;\r\n color: var(--ts-text-secondary);\r\n font-size: 13px;\r\n line-height: 1.5;\r\n}\r\n\r\n.preview-meta {\r\n display: flex;\r\n gap: 12px;\r\n font-size: 12px;\r\n color: var(--ts-text-tertiary);\r\n}\r\n\r\n.preview-meta span {\r\n text-transform: capitalize;\r\n}\r\n\r\n/* Actions */\r\n.goal-import-actions {\r\n display: flex;\r\n gap: 12px;\r\n justify-content: flex-end;\r\n}\r\n\r\n.goal-import-actions .button {\r\n min-width: 100px;\r\n}\r\n\r\n/* Result */\r\n.goal-import-result {\r\n text-align: center;\r\n padding: 24px;\r\n}\r\n\r\n.goal-import-result .dashicons {\r\n font-size: 64px;\r\n width: 64px;\r\n height: 64px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.goal-import-result.success .dashicons {\r\n color: #10b981;\r\n}\r\n\r\n.goal-import-result.error .dashicons {\r\n color: #dc3545;\r\n}\r\n\r\n.goal-import-result h3 {\r\n margin: 0 0 12px;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-result p {\r\n margin: 0 0 20px;\r\n color: var(--ts-text-secondary);\r\n}\r\n\r\n.error-list {\r\n text-align: left;\r\n background: #fef2f2;\r\n border: 1px solid #fecaca;\r\n border-radius: 6px;\r\n padding: 12px 16px;\r\n margin-bottom: 20px;\r\n}\r\n\r\n[data-theme="dark"] .error-list {\r\n background: rgba(220, 53, 69, 0.1);\r\n border-color: rgba(220, 53, 69, 0.3);\r\n}\r\n\r\n.error-message {\r\n margin: 6px 0;\r\n color: #dc3545;\r\n font-size: 13px;\r\n line-height: 1.5;\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 640px) {\r\n .goal-import-modal {\r\n max-width: 100%;\r\n width: 100%;\r\n height: 100%;\r\n max-height: 100vh;\r\n border-radius: 0;\r\n }\r\n\r\n .goal-import-dropzone {\r\n padding: 32px 16px;\r\n }\r\n\r\n .goal-import-actions {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .goal-import-actions .button {\r\n width: 100%;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},31637:(r,n,e)=>{e.r(n),e.d(n,{default:()=>mr});var a=e(74848),t=e(41594),o=e(37090),s=e(82381),i=e(87387);const A=["pageview","click","form_submit","scroll_depth","time_on_page","engagement","video_play","download","outbound_link","custom_event"],l=["equals","not_equals","contains","not_contains","starts_with","ends_with","greater_than","less_than","greater_than_or_equal","less_than_or_equal","matches_regex"],d=["none","fixed","dynamic"],c=["once","session","unlimited"];var p=e(87318),g=e(84013),m=e(51481),C=e(45767);const u={engagement:{id:"engagement",label:"Engagement",description:"Track user interactions and content engagement",icon:"MousePointer",color:"var(--color-primary)"},leads:{id:"leads",label:"Lead Generation",description:"Capture contact requests, forms, and inquiries",icon:"Users",color:"var(--color-success)"},ecommerce:{id:"ecommerce",label:"Ecommerce",description:"Track purchases, cart actions, and revenue",icon:"ShoppingCart",color:"var(--color-warning)"},content:{id:"content",label:"Content",description:"Monitor content consumption and downloads",icon:"FileText",color:"var(--color-info)"}},E=[{id:"eng_time_on_page",name:"Deep Content Engagement",description:"Visitors who spent 3+ minutes on a page",event_name:" time_on_page",trigger_type:"time_on_page",category:"engagement",priority:1,recommended:!0,icon:"Timer",conditions:[{param:"time_on_page",operator:"greater_than_or_equal",value:180}],trigger_config:{time_seconds:180}},{id:"eng_scroll_depth",name:"Read to Bottom",description:"Visitors who scrolled to 80% of page",event_name:"scroll_depth",trigger_type:"scroll_depth",category:"engagement",priority:2,recommended:!0,icon:"ArrowDown",conditions:[{param:"scroll_depth",operator:"greater_than_or_equal",value:80}],trigger_config:{scroll_depth:80}},{id:"eng_video_complete",name:"Video Completed",description:"Track video completion",event_name:"video_complete",trigger_type:"video_play",category:"engagement",priority:3,recommended:!0,icon:"Film",conditions:[]},{id:"eng_outbound_click",name:"Outbound Link Click",description:"Track external link clicks (affiliate, partner sites)",event_name:"outbound_click",trigger_type:"outbound_link",category:"engagement",priority:4,recommended:!1,icon:"ExternalLink",conditions:[]},{id:"eng_social_share",name:"Social Share Click",description:"Track content shares on social media",event_name:"click",trigger_type:"click",category:"engagement",priority:5,recommended:!1,icon:"Share2",conditions:[{param:"element_class",operator:"contains",value:"share"}],trigger_config:{css_selector:".share-button, .social-share"}},{id:"eng_search",name:"Site Search Used",description:"Track what visitors are searching for",event_name:"search",trigger_type:"custom_event",category:"engagement",priority:6,recommended:!1,icon:"Search",conditions:[]},{id:"eng_pricing_view",name:"Pricing Page Viewed",description:"High-intent visitors checking pricing",event_name:"page_view",trigger_type:"pageview",category:"engagement",priority:7,recommended:!0,icon:"DollarSign",conditions:[{param:"page_url",operator:"contains",value:"/pricing"}]},{id:"lead_contact_form",name:"Contact Form Submitted",description:"Track contact form submissions",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:1,recommended:!0,icon:"Mail",conditions:[{param:"form_name",operator:"contains",value:"contact"}],trigger_config:{form_id:"contact-form"},value_type:"fixed",typical_value:50},{id:"lead_phone_click",name:"Phone Number Clicked",description:"Track when visitors click your phone number",event_name:"click",trigger_type:"click",category:"leads",priority:2,recommended:!0,icon:"Phone",conditions:[{param:"element_type",operator:"equals",value:"tel"}],trigger_config:{css_selector:'a[href^="tel:"]'},value_type:"fixed",typical_value:60},{id:"lead_quote_request",name:"Quote Requested",description:"Track quote or estimate requests",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:3,recommended:!0,icon:"FileText",conditions:[{param:"form_name",operator:"contains",value:"quote"}],value_type:"fixed",typical_value:75},{id:"lead_email_click",name:"Email Link Clicked",description:"Track when visitors click your email address",event_name:"click",trigger_type:"click",category:"leads",priority:4,recommended:!1,icon:"AtSign",conditions:[{param:"element_type",operator:"equals",value:"mailto"}],trigger_config:{css_selector:'a[href^="mailto:"]'},value_type:"fixed",typical_value:40},{id:"lead_appointment",name:"Appointment Booked",description:"Track appointment/meeting bookings",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:5,recommended:!0,icon:"Calendar",conditions:[{param:"form_name",operator:"contains",value:"appointment"}],value_type:"fixed",typical_value:100},{id:"lead_chat_started",name:"Live Chat Started",description:"Track when visitors initiate live chat",event_name:"chat_started",trigger_type:"custom_event",category:"leads",priority:6,recommended:!1,icon:"MessageCircle",conditions:[],value_type:"fixed",typical_value:45},{id:"lead_callback_request",name:"Callback Requested",description:"Track callback form submissions",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:7,recommended:!1,icon:"PhoneCall",conditions:[{param:"form_name",operator:"contains",value:"callback"}],value_type:"fixed",typical_value:55},{id:"ecom_purchase",name:"Purchase Completed",description:"Track completed transactions and revenue",event_name:"purchase",trigger_type:"custom_event",category:"ecommerce",priority:1,recommended:!0,icon:"DollarSign",conditions:[],value_type:"dynamic"},{id:"ecom_add_to_cart",name:"Add to Cart",description:"Track product additions to cart",event_name:"add_to_cart",trigger_type:"custom_event",category:"ecommerce",priority:2,recommended:!0,icon:"ShoppingCart",conditions:[]},{id:"ecom_checkout_start",name:"Checkout Started",description:"Track when customers begin checkout",event_name:"begin_checkout",trigger_type:"custom_event",category:"ecommerce",priority:3,recommended:!0,icon:"CreditCard",conditions:[]},{id:"ecom_product_view",name:"Product Viewed",description:"Track product page views",event_name:"view_item",trigger_type:"custom_event",category:"ecommerce",priority:4,recommended:!1,icon:"Package",conditions:[]},{id:"ecom_view_cart",name:"Cart Viewed",description:"Track cart page views",event_name:"view_cart",trigger_type:"custom_event",category:"ecommerce",priority:5,recommended:!1,icon:"Eye",conditions:[]},{id:"ecom_payment_info",name:"Payment Info Added",description:"Track when payment details are entered",event_name:"add_payment_info",trigger_type:"custom_event",category:"ecommerce",priority:6,recommended:!1,icon:"Lock",conditions:[]},{id:"ecom_remove_from_cart",name:"Remove from Cart",description:"Track cart abandonment signals",event_name:"remove_from_cart",trigger_type:"custom_event",category:"ecommerce",priority:7,recommended:!1,icon:"XCircle",conditions:[]},{id:"content_newsletter",name:"Newsletter Signup",description:"Track newsletter subscriptions",event_name:"form_submit",trigger_type:"form_submit",category:"content",priority:1,recommended:!0,icon:"Newspaper",conditions:[{param:"form_name",operator:"contains",value:"newsletter"}],trigger_config:{form_id:"newsletter-form"},value_type:"fixed",typical_value:10},{id:"content_download",name:"Resource Downloaded",description:"Track PDF, ebook, or template downloads",event_name:"file_download",trigger_type:"download",category:"content",priority:2,recommended:!0,icon:"Download",conditions:[],value_type:"fixed",typical_value:15},{id:"content_ebook",name:"Ebook Downloaded",description:"Track ebook or guide downloads",event_name:"file_download",trigger_type:"download",category:"content",priority:3,recommended:!0,icon:"BookOpen",conditions:[{param:"file_name",operator:"contains",value:".pdf"}],value_type:"fixed",typical_value:20},{id:"content_case_study",name:"Case Study Viewed",description:"Track case study page views",event_name:"page_view",trigger_type:"pageview",category:"content",priority:4,recommended:!1,icon:"BarChart2",conditions:[{param:"page_url",operator:"contains",value:"/case-stud"}]},{id:"content_webinar",name:"Webinar Registration",description:"Track webinar signups",event_name:"form_submit",trigger_type:"form_submit",category:"content",priority:5,recommended:!1,icon:"Video",conditions:[{param:"form_name",operator:"contains",value:"webinar"}],value_type:"fixed",typical_value:30},{id:"content_whitepaper",name:"Whitepaper Downloaded",description:"Track whitepaper downloads",event_name:"file_download",trigger_type:"download",category:"content",priority:6,recommended:!1,icon:"FileDown",conditions:[{param:"file_name",operator:"contains",value:"whitepaper"}],value_type:"fixed",typical_value:25},{id:"content_portfolio",name:"Portfolio Viewed",description:"Track portfolio or work samples page views",event_name:"page_view",trigger_type:"pageview",category:"content",priority:7,recommended:!1,icon:"Folder",conditions:[{param:"page_url",operator:"contains",value:"/portfolio"}]}],x=r=>E.filter(n=>n.category===r);var v=e(66557);const h={pageview:[{value:"page_url",label:"Page URL",example:"/pricing",description:"Full page URL (e.g., https://site.com/pricing or /pricing)"},{value:"page_path",label:"Page Path",example:"/products",description:"URL path only (without domain)"},{value:"page_title",label:"Page Title",example:"Pricing",description:"Browser page title"}],form_submit:[{value:"form_id",label:"Form ID",example:"gform_3",description:"HTML form ID attribute (e.g., gform_3, wpforms-form-1245)"},{value:"form_name",label:"Form Name",example:"contact",description:"Form name or type (e.g., contact, inquiry, newsletter)"},{value:"form_builder",label:"Form Builder",example:"gravity_forms",description:"Form builder plugin (gravity_forms, wpforms, contact_form_7, etc.)"},{value:"form_type",label:"Form Type",example:"contact",description:"Form category (contact, newsletter, inquiry, etc.)"}],click:[{value:"element_text",label:"Button/Link Text",example:"Buy Now",description:"Text inside the clicked element"},{value:"element_id",label:"Element ID",example:"cta-button",description:"HTML ID attribute of the element"},{value:"element_class",label:"Element Class",example:"btn-primary",description:"CSS class of the element"},{value:"element_type",label:"Element Type",example:"tel",description:"Link type (tel, mailto, etc.)"},{value:"link_url",label:"Link URL",example:"https://example.com",description:"Destination URL for links"}],scroll_depth:[{value:"scroll_depth",label:"Scroll Depth %",example:"75",description:"Scroll percentage (0-100)"},{value:"page_url",label:"Page URL",example:"/blog",description:"Track scroll on specific pages"}],time_on_page:[{value:"time_seconds",label:"Time (seconds)",example:"180",description:"Time spent on page in seconds"},{value:"page_url",label:"Page URL",example:"/blog",description:"Track time on specific pages"}],engagement:[{value:"scroll_depth",label:"Scroll Depth %",example:"50",description:"Minimum scroll percentage"},{value:"time_seconds",label:"Time (seconds)",example:"120",description:"Minimum time on page"},{value:"page_url",label:"Page URL",example:"/blog",description:"Track engagement on specific pages"}],video_play:[{value:"video_title",label:"Video Title",example:"product demo",description:"Video title or name"},{value:"video_url",label:"Video URL",example:"youtube.com/watch?v=",description:"Video source URL"},{value:"video_type",label:"Video Type",example:"youtube",description:"Video platform (html5, youtube, vimeo)"}],download:[{value:"file_name",label:"File Name",example:"pricing-guide",description:"Name of downloaded file"},{value:"file_type",label:"File Type",example:"pdf",description:"File extension (pdf, doc, jpg, etc.)"},{value:"link_url",label:"Download URL",example:"/downloads/",description:"Download link URL"}],outbound_link:[{value:"link_domain",label:"Link Domain",example:"partner.com",description:"External website domain"},{value:"link_url",label:"Link URL",example:"https://partner.com",description:"Full external URL"},{value:"link_text",label:"Link Text",example:"Visit Partner",description:"Text of the clicked link"}],custom_event:[{value:"event_name",label:"Event Name",example:"calculator_completed",description:"Custom event identifier"},{value:"page_url",label:"Page URL",example:"/pricing",description:"Full page URL where event fires"},{value:"page_path",label:"Page Path",example:"/products",description:"URL path only (without domain)"},{value:"page_title",label:"Page Title",example:"Pricing",description:"Browser page title when event fires"},{value:"referrer",label:"Referrer URL",example:"https://google.com",description:"Referring page URL"}]},b=[{value:"equals",label:"Equals",description:"Exact match (case-sensitive)"},{value:"not_equals",label:"Not equals",description:"Does not exactly match"},{value:"contains",label:"Contains",description:"Partial match (most flexible)"},{value:"not_contains",label:"Does not contain",description:"Excludes partial match"},{value:"starts_with",label:"Starts with",description:"Begins with the value"},{value:"ends_with",label:"Ends with",description:"Finishes with the value"},{value:"matches_regex",label:"Matches regex",description:"Advanced pattern matching"},{value:"greater_than",label:"Greater than",description:"For numbers only"},{value:"greater_than_or_equal",label:"Greater than or equal",description:"For numbers only"},{value:"less_than",label:"Less than",description:"For numbers only"},{value:"less_than_or_equal",label:"Less than or equal",description:"For numbers only"}],B=({conditions:r,onChange:n,triggerType:e,matchLogic:t="all",onMatchLogicChange:o})=>{const s=h[e]||[],i=(e,a,t)=>{const o=[...r];o[e]={...o[e],[a]:t},n(o)},A=r=>""!==r&&"__custom__"!==r&&!s.some(n=>n.value===r),l=r=>A(r)?"__custom__":r;return(0,a.jsxs)("div",{className:"ts-condition-builder",children:[(0,a.jsxs)("div",{className:"ts-condition-builder-header",children:[(0,a.jsx)("h4",{style:{margin:0},children:"Conditions"}),0===r.length&&(0,a.jsxs)("p",{style:{margin:"8px 0",color:"#666",fontSize:"13px"},children:["💡 No conditions = Goal will fire for ",(0,a.jsx)("strong",{children:"ALL"})," ",e," events"]})]}),(0,a.jsx)("div",{className:"ts-conditions-list",children:r.map((t,o)=>{const d=(c=t.param,s.find(r=>r.value===c));var c;return(0,a.jsxs)("div",{className:"ts-condition-row",style:{display:"grid",gridTemplateColumns:"1fr 1fr 1.5fr auto",gap:"12px",alignItems:"start",padding:"16px",background:"#f9fafb",borderRadius:"8px",marginBottom:"12px",border:"1px solid #e5e7eb"},children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"6px",fontSize:"13px",fontWeight:500},children:"Parameter"}),(0,a.jsxs)("select",{value:l(t.param),onChange:r=>{const n=r.target.value;i(o,"param","__custom__"===n?"":n)},style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px"},children:[(0,a.jsx)("option",{value:"",children:"Select parameter..."}),s.map(r=>(0,a.jsx)("option",{value:r.value,children:r.label},r.value)),"custom_event"===e&&(0,a.jsx)("option",{value:"__custom__",children:"✏️ Custom Data Key..."})]}),"custom_event"===e&&("__custom__"===l(t.param)||A(t.param))&&(0,a.jsx)("input",{type:"text",value:A(t.param)?t.param:"",onChange:r=>i(o,"param",r.target.value),placeholder:"e.g. product_id, amount, category",style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px",marginTop:"6px",background:"#fefce8"}}),d&&(0,a.jsx)("p",{style:{margin:"4px 0 0",fontSize:"12px",color:"#6b7280"},children:d.description}),"custom_event"===e&&A(t.param)&&(0,a.jsxs)("p",{style:{margin:"4px 0 0",fontSize:"12px",color:"#92400e"},children:["Matches key “",(0,a.jsx)("strong",{children:t.param}),"” from fireCustomEvent() data"]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"6px",fontSize:"13px",fontWeight:500},children:"Operator"}),(0,a.jsx)("select",{value:t.operator,onChange:r=>i(o,"operator",r.target.value),style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px"},children:b.map(r=>(0,a.jsx)("option",{value:r.value,title:r.description,children:r.label},r.value))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"6px",fontSize:"13px",fontWeight:500},children:"Value"}),(0,a.jsx)("input",{type:"text",value:t.value,onChange:r=>i(o,"value",r.target.value),placeholder:d?.example||"Enter value...",style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px"}}),d&&(0,a.jsxs)("p",{style:{margin:"4px 0 0",fontSize:"12px",color:"#6b7280"},children:["Example: ",(0,a.jsx)("code",{style:{background:"#e5e7eb",padding:"2px 6px",borderRadius:"4px"},children:d.example})]})]}),(0,a.jsx)("div",{style:{paddingTop:"28px"},children:(0,a.jsx)("button",{onClick:()=>(e=>{n(r.filter((r,n)=>n!==e))})(o),style:{padding:"8px 12px",background:"#ef4444",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:500},title:"Remove condition",children:"🗑️"})})]},o)})}),(0,a.jsx)("button",{onClick:()=>{n([...r,{param:"",operator:"contains",value:""}])},style:{padding:"10px 16px",background:"#3b82f6",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:500,marginBottom:"16px"},children:"➕ Add Condition"}),r.length>1&&o&&(0,a.jsxs)("div",{style:{padding:"16px",background:"#eff6ff",borderRadius:"8px",border:"1px solid #bfdbfe"},children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"8px",fontSize:"13px",fontWeight:500},children:"Match Logic"}),(0,a.jsxs)("div",{style:{display:"flex",gap:"12px"},children:[(0,a.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"6px",cursor:"pointer"},children:[(0,a.jsx)("input",{type:"radio",name:"match_logic",value:"all",checked:"all"===t,onChange:r=>o(r.target.value)}),(0,a.jsxs)("span",{style:{fontSize:"14px"},children:[(0,a.jsx)("strong",{children:"ALL"})," conditions must match (AND)"]})]}),(0,a.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"6px",cursor:"pointer"},children:[(0,a.jsx)("input",{type:"radio",name:"match_logic",value:"any",checked:"any"===t,onChange:r=>o(r.target.value)}),(0,a.jsxs)("span",{style:{fontSize:"14px"},children:[(0,a.jsx)("strong",{children:"ANY"})," condition can match (OR)"]})]})]}),(0,a.jsx)("p",{style:{margin:"8px 0 0",fontSize:"12px",color:"#1e40af"},children:"all"===t?"✓ Goal fires only when ALL conditions are satisfied":"✓ Goal fires when ANY ONE condition is satisfied"})]}),s.length>0&&(0,a.jsxs)("details",{style:{marginTop:"16px",fontSize:"13px",color:"#6b7280"},children:[(0,a.jsxs)("summary",{style:{cursor:"pointer",fontWeight:500},children:["💡 Available Parameters for ",e]}),(0,a.jsx)("ul",{style:{marginTop:"8px",paddingLeft:"20px"},children:s.map(r=>(0,a.jsxs)("li",{style:{marginBottom:"4px"},children:[(0,a.jsxs)("strong",{children:[r.label,":"]})," ",r.description,(0,a.jsx)("br",{}),(0,a.jsxs)("code",{style:{background:"#e5e7eb",padding:"2px 6px",borderRadius:"4px",fontSize:"12px"},children:["Example: ",r.example]})]},r.value))}),"custom_event"===e&&(0,a.jsxs)("div",{style:{marginTop:"12px",padding:"12px",background:"#fefce8",borderRadius:"6px",border:"1px solid #fde68a"},children:[(0,a.jsx)("strong",{style:{color:"#92400e"},children:"💡 Custom Data Keys"}),(0,a.jsx)("p",{style:{margin:"6px 0 0",fontSize:"12px",color:"#78350f"},children:"Select “Custom Data Key” to match any key from your event data. For example:"}),(0,a.jsx)("pre",{style:{margin:"6px 0 0",padding:"8px",background:"#fffbeb",borderRadius:"4px",fontSize:"11px",color:"#78350f",whiteSpace:"pre-wrap"},children:"window.trackSureGoals.fireCustomEvent('purchase', {\n product_id: 'sku-123',\n amount: '49.99',\n category: 'software'\n});"}),(0,a.jsxs)("p",{style:{margin:"6px 0 0",fontSize:"12px",color:"#78350f"},children:["Then use ",(0,a.jsx)("strong",{children:"product_id"}),", ",(0,a.jsx)("strong",{children:"amount"}),", or ",(0,a.jsx)("strong",{children:"category"})," as custom data keys in your conditions."]})]})]})]})};var f=e(71255),k=e(85072),_=e.n(k),y=e(97825),w=e.n(y),j=e(77659),z=e.n(j),N=e(55056),I=e.n(N),S=e(10540),T=e.n(S),D=e(41113),q=e.n(D),Y=e(80126),F={};F.styleTagTransform=q(),F.setAttributes=I(),F.insert=z().bind(null,"head"),F.domAPI=w(),F.insertStyleElement=T();_()(Y.A,F);Y.A&&Y.A.locals&&Y.A.locals;const R=[{value:"pageview",label:(0,f.__)("Page View","tracksure"),eventName:"page_view",icon:"📄"},{value:"click",label:(0,f.__)("Element Click","tracksure"),eventName:"click",icon:"👆"},{value:"form_submit",label:(0,f.__)("Form Submission","tracksure"),eventName:"form_submit",icon:"📝"},{value:"scroll_depth",label:(0,f.__)("Scroll Depth","tracksure"),eventName:"scroll",icon:"📜"},{value:"time_on_page",label:(0,f.__)("Time on Page","tracksure"),eventName:"time_on_page",icon:"⏱️"},{value:"engagement",label:(0,f.__)("Engagement Rate","tracksure"),eventName:"engagement",icon:"❤️"},{value:"video_play",label:(0,f.__)("Video Play","tracksure"),eventName:"video_play",icon:"🎬"},{value:"download",label:(0,f.__)("File Download","tracksure"),eventName:"file_download",icon:"💾"},{value:"outbound_link",label:(0,f.__)("Outbound Link","tracksure"),eventName:"outbound_click",icon:"🔗"},{value:"custom_event",label:(0,f.__)("Custom Event","tracksure"),eventName:"custom_event",icon:"⚡"}],G=({isOpen:r,onClose:n,onSave:e,mode:o,template:s,existingGoal:i})=>{const A=()=>"edit"===o&&i?{...i}:"create-from-template"===o&&s?{name:s.name,description:s.description,event_name:s.event_name,trigger_type:s.trigger_type,category:s.category,conditions:[...s.conditions||[]],match_logic:s.match_logic||"all",value_type:s.value_type||"none",value:s.typical_value||0,attribution_window:30,frequency:"unlimited",is_active:!0}:{name:"",description:"",event_name:"page_view",trigger_type:"pageview",category:"engagement",conditions:[],match_logic:"all",value_type:"none",value:0,attribution_window:30,frequency:"unlimited",is_active:!0},[l,d]=(0,t.useState)(A()),[c,p]=(0,t.useState)({}),[g,m]=(0,t.useState)(!1);(0,t.useEffect)(()=>{r&&(d(A()),p({}),m(!1))},[r,o,s,i]);const C=(r,n)=>{const e={...l,[r]:n};if("trigger_type"===r){const r=R.find(r=>r.value===n);r&&(e.event_name=r.eventName)}d(e),c[r]&&p(n=>({...n,[r]:void 0}))};return(0,a.jsx)(v.a,{isOpen:r,onClose:n,size:"lg",title:(()=>{switch(o){case"edit":return(0,f.__)("Edit Goal");case"create-from-template":return(0,f.__)("Customize Goal Template");default:return(0,f.__)("Create Custom Goal")}})(),footer:(0,a.jsxs)("div",{className:"ts-goal-modal__footer",children:[(0,a.jsx)("button",{onClick:n,className:"ts-btn ts-btn--secondary",disabled:g,"aria-label":(0,f.__)("Cancel"),children:(0,f.__)("Cancel")}),(0,a.jsx)("button",{onClick:async()=>{if((()=>{const r={};return l.name.trim()?l.name.trim().length<3?r.name=(0,f.__)("Goal name must be at least 3 characters"):l.name.trim().length>100&&(r.name=(0,f.__)("Goal name must not exceed 100 characters")):r.name=(0,f.__)("Goal name is required"),l.description&&l.description.length>500&&(r.description=(0,f.__)("Description must not exceed 500 characters")),"fixed"===l.value_type&&(!l.value||l.value<=0)&&(r.fixed_value=(0,f.__)("Fixed value must be greater than 0")),p(r),0===Object.keys(r).length})()){m(!0);try{const r={...l,name:l.name.trim(),description:l.description?.trim()||""};await e(r),n()}catch(r){p({name:(0,f.__)("An error occurred while saving. Please try again.")})}finally{m(!1)}}},className:"ts-btn ts-btn--primary",disabled:g,"aria-label":"edit"===o?(0,f.__)("Update goal"):(0,f.__)("Create goal"),children:g?(0,f.__)("Saving..."):"edit"===o?(0,f.__)("Update Goal"):(0,f.__)("Create Goal")})]}),children:(0,a.jsxs)("div",{className:"ts-goal-modal__content",children:["create-from-template"===o&&(0,a.jsxs)("div",{className:"ts-goal-modal__banner ts-goal-modal__banner--info",role:"alert",children:[(0,a.jsx)("span",{className:"ts-goal-modal__banner-icon",children:"💡"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Customize this template")}),(0,a.jsx)("p",{children:(0,f.__)("Modify the conditions to match your website's URLs, form IDs, or other specific values before creating.")})]})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"basic-info-heading",children:[(0,a.jsxs)("h3",{id:"basic-info-heading",className:"ts-goal-modal__section-title",children:[(0,a.jsx)("span",{className:"ts-goal-modal__section-icon",children:"📝"}),(0,f.__)("Basic Information")]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"goal-name",className:"ts-goal-modal__label ts-goal-modal__label--required",children:(0,f.__)("Goal Name")}),(0,a.jsx)("input",{id:"goal-name",type:"text",className:"ts-goal-modal__input "+(c.name?"ts-goal-modal__input--error":""),value:l.name,onChange:r=>C("name",r.target.value),placeholder:(0,f.__)("e.g., Pricing Page Viewed"),required:!0,"aria-required":"true","aria-invalid":!!c.name,"aria-describedby":c.name?"goal-name-error":void 0,maxLength:100}),c.name&&(0,a.jsx)("p",{id:"goal-name-error",className:"ts-goal-modal__error",role:"alert",children:c.name})]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsxs)("label",{htmlFor:"goal-description",className:"ts-goal-modal__label",children:[(0,f.__)("Description"),(0,a.jsxs)("span",{className:"ts-goal-modal__label-optional",children:[" (",(0,f.__)("optional"),")"]})]}),(0,a.jsx)("textarea",{id:"goal-description",className:"ts-goal-modal__textarea "+(c.description?"ts-goal-modal__input--error":""),value:l.description,onChange:r=>C("description",r.target.value),placeholder:(0,f.__)("Describe what this goal tracks..."),rows:3,"aria-invalid":!!c.description,"aria-describedby":c.description?"goal-description-error":void 0,maxLength:500}),c.description&&(0,a.jsx)("p",{id:"goal-description-error",className:"ts-goal-modal__error",role:"alert",children:c.description}),(0,a.jsxs)("p",{className:"ts-goal-modal__help",children:[(l.description||"").length,"/500 ",(0,f.__)("characters")]})]})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"trigger-heading",children:[(0,a.jsxs)("h3",{id:"trigger-heading",className:"ts-goal-modal__section-title",children:[(0,a.jsx)("span",{className:"ts-goal-modal__section-icon",children:"⚡"}),(0,f.__)("Trigger Type")]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"trigger-type",className:"ts-goal-modal__label ts-goal-modal__label--required",children:(0,f.__)("When should this goal fire?")}),(0,a.jsx)("select",{id:"trigger-type",className:"ts-goal-modal__select",value:l.trigger_type,onChange:r=>C("trigger_type",r.target.value),"aria-required":"true",children:R.map(r=>(0,a.jsxs)("option",{value:r.value,children:[r.icon," ",r.label]},r.value))}),(0,a.jsx)("p",{className:"ts-goal-modal__help",children:(r=>{const n={pageview:(0,f.__)("Fires when a specific page is viewed"),click:(0,f.__)("Fires when a specific element is clicked"),form_submit:(0,f.__)("Fires when a form is submitted"),scroll_depth:(0,f.__)("Fires when user scrolls to a specific depth"),time_on_page:(0,f.__)("Fires when user spends specific time on page"),engagement:(0,f.__)("Fires when user meets scroll + time engagement thresholds"),video_play:(0,f.__)("Fires when a video is played or completed"),download:(0,f.__)("Fires when a file is downloaded"),outbound_link:(0,f.__)("Fires when an external link is clicked"),custom_event:(0,f.__)("Fires when a custom event occurs (e.g., WooCommerce purchase)")};return r in n?n[r]:""})(l.trigger_type)})]}),"custom_event"===l.trigger_type&&(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"custom-event-name",className:"ts-goal-modal__label ts-goal-modal__label--required",children:(0,f.__)("Event Name")}),(0,a.jsx)("input",{id:"custom-event-name",type:"text",className:"ts-goal-modal__input",value:l.event_name||"",onChange:r=>C("event_name",r.target.value),placeholder:(0,f.__)("e.g., purchase, add_to_cart, calculator_completed")}),(0,a.jsx)("p",{className:"ts-goal-modal__help",children:(0,f.__)("The exact event name your custom code or WooCommerce dispatches")})]})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"conditions-heading",children:[(0,a.jsx)(B,{conditions:l.conditions,onChange:r=>C("conditions",r),triggerType:l.trigger_type,matchLogic:l.match_logic,onMatchLogicChange:r=>C("match_logic",r)}),c.conditions&&(0,a.jsx)("p",{className:"ts-goal-modal__error",role:"alert",children:c.conditions})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"value-heading",children:[(0,a.jsxs)("h3",{id:"value-heading",className:"ts-goal-modal__section-title",children:[(0,a.jsx)("span",{className:"ts-goal-modal__section-icon",children:"💰"}),(0,f.__)("Conversion Value")]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"value-type",className:"ts-goal-modal__label",children:(0,f.__)("Value Type")}),(0,a.jsxs)("select",{id:"value-type",className:"ts-goal-modal__select",value:l.value_type,onChange:r=>C("value_type",r.target.value),children:[(0,a.jsx)("option",{value:"none",children:(0,f.__)("No Value (Engagement Metric)")}),(0,a.jsx)("option",{value:"fixed",children:(0,f.__)("Fixed Value (Same for all conversions)")}),(0,a.jsx)("option",{value:"dynamic",children:(0,f.__)("Dynamic Value (Use transaction amount)")})]})]}),"fixed"===l.value_type&&(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsxs)("label",{htmlFor:"fixed-value",className:"ts-goal-modal__label ts-goal-modal__label--required",children:[(0,f.__)("Fixed Value")," ($)"]}),(0,a.jsx)("input",{id:"fixed-value",type:"number",className:"ts-goal-modal__input "+(c.fixed_value?"ts-goal-modal__input--error":""),value:l.value||0,onChange:r=>C("value",parseFloat(r.target.value)||0),placeholder:"0",min:"0",step:"0.01",required:!0,"aria-required":"true","aria-invalid":!!c.fixed_value,"aria-describedby":c.fixed_value?"fixed-value-error":"fixed-value-help"}),c.fixed_value?(0,a.jsx)("p",{id:"fixed-value-error",className:"ts-goal-modal__error",role:"alert",children:c.fixed_value}):(0,a.jsx)("p",{id:"fixed-value-help",className:"ts-goal-modal__help",children:(0,f.__)("This value will be assigned to every conversion (e.g., lead value, estimated revenue)")})]}),"dynamic"===l.value_type&&(0,a.jsxs)("div",{className:"ts-goal-modal__banner ts-goal-modal__banner--info",children:[(0,a.jsx)("span",{className:"ts-goal-modal__banner-icon",children:"💡"}),(0,a.jsx)("div",{children:(0,f.__)("Value will be automatically pulled from transaction data (e.g., WooCommerce order total)")})]})]}),"edit"===o&&(0,a.jsx)("section",{className:"ts-goal-modal__section",children:(0,a.jsxs)("label",{className:"ts-goal-modal__toggle",children:[(0,a.jsx)("input",{type:"checkbox",className:"ts-goal-modal__toggle-input",checked:l.is_active,onChange:r=>C("is_active",r.target.checked),"aria-label":(0,f.__)("Activate this goal")}),(0,a.jsxs)("div",{className:"ts-goal-modal__toggle-content",children:[(0,a.jsx)("div",{className:"ts-goal-modal__toggle-title",children:(0,f.__)("Activate this goal")}),(0,a.jsx)("div",{className:"ts-goal-modal__toggle-description",children:(0,f.__)("Start tracking conversions for this goal")})]})]})}),Object.keys(c).length>0&&(0,a.jsxs)("div",{className:"ts-goal-modal__banner ts-goal-modal__banner--error",role:"alert",children:[(0,a.jsx)("span",{className:"ts-goal-modal__banner-icon",children:"⚠️"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Please fix the following errors:")}),(0,a.jsx)("ul",{className:"ts-goal-modal__error-list",children:Object.entries(c).map(([r,n])=>n&&(0,a.jsx)("li",{children:n},r))})]})]})]})})};var W=e(26604),L=e(99003),P=e(28343),U=e(51768),O={};O.styleTagTransform=q(),O.setAttributes=I(),O.insert=z().bind(null,"head"),O.domAPI=w(),O.insertStyleElement=T();_()(U.A,O);U.A&&U.A.locals&&U.A.locals;const M=({goal:r,onClose:n})=>{const{config:e,dateRange:s}=(0,o.n)(),A=(0,L.iW)(),[l,d]=(0,t.useState)("overview"),[c,p]=(0,t.useState)(1),[g,u]=(0,t.useState)("date"),[E,x]=(0,t.useState)("desc"),[h,b]=(0,t.useState)("all"),[B,k]=(0,t.useState)([]),[_,y]=(0,t.useState)(0),[w,j]=(0,t.useState)(!1),[z,N]=(0,t.useState)(null),[I,S]=(0,t.useState)(null),[T,D]=(0,t.useState)([]),[q,Y]=(0,t.useState)([]),[F,R]=(0,t.useState)(!0),[G,U]=(0,t.useState)(!1);(0,t.useEffect)(()=>{(async()=>{R(!0);try{const n=new i.n(e),a=await n.getGoalSources(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA"),attribution_model:"last_touch"});D(a.sources||[]);const t=await n.getGoalPerformance(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA")});t&&S({total_conversions:t.conversions||0,total_value:t.revenue||0,conversion_rate:t.conversion_rate||0,avg_value:t.avg_value||0,unique_visitors:t.unique_visitors||0,top_pages:(t.top_pages||[]).map(r=>({page_url:r.page,conversions:r.count}))})}catch(r){}finally{R(!1)}})()},[r.goal_id,s,e]),(0,t.useEffect)(()=>{if("timeline"!==l)return;(async()=>{j(!0),N(null);try{const n=new i.n(e),a=await n.getGoalTimeline(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA"),page:c,per_page:20});k(a.conversions||[]),y(a.total||0)}catch(r){const n=r instanceof Error?r.message:(0,f.__)("Failed to load conversions","tracksure");N(n)}finally{j(!1)}})()},[r.goal_id,s,c,e,l]),(0,t.useEffect)(()=>{if("devices"!==l)return;(async()=>{U(!0);try{const n=new i.n(e),a=await n.getGoalDevices(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA")});Y((a.devices||[]).map(r=>({device:r.device||"desktop",browser:r.browser||"unknown",conversions:r.conversions||0,percentage:r.percentage||0})))}catch(r){}finally{U(!1)}})()},[r.goal_id,s,e,l]);const O=(0,t.useMemo)(()=>{const r=new Set(B.map(r=>r.source||"direct"));return["all",...Array.from(r)]},[B]),M=(0,t.useMemo)(()=>{let r=[...B];return"all"!==h&&(r=r.filter(r=>(r.source||"direct")===h)),r.sort((r,n)=>{let e=0;return"date"===g?e=new Date(r.converted_at.replace(" ","T")+"Z").getTime()-new Date(n.converted_at.replace(" ","T")+"Z").getTime():"value"===g?e=(r.value||0)-(n.value||0):"page"===g&&(e=(r.page_url||"").localeCompare(n.page_url||"")),"asc"===E?e:-e}),r},[B,h,g,E]),Z=r=>{g===r?x("asc"===E?"desc":"asc"):(u(r),x("desc"))},V=r=>r.product_name?r.product_name:r.product_id?`Product #${r.product_id}`:r.form_id?`Form: ${r.form_id}`:r.element_selector?r.element_selector:null,$=Math.ceil(_/20),X=()=>{const n=[(0,f.__)("Date","tracksure"),(0,f.__)("Page URL","tracksure"),"none"!==r.value_type?(0,f.__)("Value","tracksure"):null,(0,f.__)("Context","tracksure"),(0,f.__)("Source","tracksure"),(0,f.__)("Medium","tracksure"),(0,f.__)("Campaign","tracksure"),(0,f.__)("Device","tracksure"),(0,f.__)("Browser","tracksure")].filter(Boolean),e=M.map(e=>[e.converted_at,e.page_url,"none"!==r.value_type?e.value:null,V(e)||"-",e.source||"direct",e.medium||"-",e.campaign||"-",e.device||"-",e.browser||"-"].filter((r,e)=>null!==n[e])),a=[n.join(","),...e.map(r=>r.map(r=>`"${r}"`).join(","))].join("\n"),t=new Blob([a],{type:"text/csv"}),o=window.URL.createObjectURL(t),s=document.createElement("a");s.href=o,s.download=`${r.name.replace(/[^a-z0-9]/gi,"_")}_conversions.csv`,s.click(),window.URL.revokeObjectURL(o)},Q=()=>F?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading overview...","tracksure")})]}):I?(0,a.jsxs)("div",{className:"ts-goal-overview-tab",children:[(0,a.jsxs)("div",{className:"ts-overview-metrics",children:[(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Total Conversions","tracksure")}),(0,a.jsx)("div",{className:"ts-metric-value",children:I.total_conversions.toLocaleString()})]})})}),"none"!==r.value_type&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Total Value","tracksure")}),(0,a.jsx)("div",{className:"ts-metric-value",children:(0,P.vv)(I.total_value)})]})})}),(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Average Value","tracksure")}),(0,a.jsx)("div",{className:"ts-metric-value",children:(0,P.vv)(I.avg_value)})]})})})]}),(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Conversion Rate","tracksure")}),(0,a.jsxs)("div",{className:"ts-metric-value",children:[I.conversion_rate.toFixed(2),"%"]})]})})})]}),I.top_pages&&I.top_pages.length>0&&(0,a.jsxs)(C.Zp,{children:[(0,a.jsx)(C.aR,{children:(0,f.__)("Top Converting Pages","tracksure")}),(0,a.jsx)(C.bw,{children:(0,a.jsx)("div",{className:"ts-top-pages",children:I.top_pages.map((r,n)=>(0,a.jsxs)("div",{className:"ts-top-page",children:[(0,a.jsxs)("div",{className:"ts-top-page-rank",children:["#",n+1]}),(0,a.jsx)("div",{className:"ts-top-page-url",children:(0,a.jsx)("a",{href:r.page_url,target:"_blank",rel:"noopener noreferrer",children:r.page_url})}),(0,a.jsx)("div",{className:"ts-top-page-conversions",children:(0,a.jsxs)(W.E,{variant:"success",children:[r.conversions," ",(0,f.__)("conversions","tracksure")]})})]},n))})})]})]}):(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"BarChart3",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No data available for this period.","tracksure")})]}),H=()=>(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"ts-modal-filters",children:[(0,a.jsxs)("div",{className:"ts-filter-group",children:[(0,a.jsx)("label",{children:(0,f.__)("Filter by Source:","tracksure")}),(0,a.jsx)("select",{value:h,onChange:r=>b(r.target.value),className:"ts-filter-select",children:O.map(r=>(0,a.jsx)("option",{value:r,children:"all"===r?(0,f.__)("All Sources","tracksure"):r},r))})]}),(0,a.jsxs)("button",{className:"ts-export-btn",onClick:X,children:[(0,a.jsx)(m.I,{name:"Download",size:14}),(0,f.__)("Export CSV","tracksure")]})]}),(0,a.jsx)("div",{className:"ts-modal-content",children:w?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading conversions...","tracksure")})]}):z?(0,a.jsxs)("div",{className:"ts-error",children:[(0,a.jsx)(m.I,{name:"AlertCircle",size:24}),(0,a.jsx)("span",{children:z})]}):0===M.length?(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"FileText",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No conversions found for this date range.","tracksure")})]}):(0,a.jsx)("div",{className:"ts-table-scroll",children:(0,a.jsxs)("table",{className:"ts-conversions-table",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{children:[(0,a.jsxs)("th",{onClick:()=>Z("date"),className:"date"===g?"ts-sorted":"",children:[(0,f.__)("Date","tracksure")," ","date"===g&&("asc"===E?"↑":"↓")]}),(0,a.jsxs)("th",{onClick:()=>Z("page"),className:"page"===g?"ts-sorted":"",children:[(0,f.__)("Page URL","tracksure")," ","page"===g&&("asc"===E?"↑":"↓")]}),(0,a.jsx)("th",{children:(0,f.__)("Context","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Source","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Device","tracksure")}),"none"!==r.value_type&&(0,a.jsxs)("th",{onClick:()=>Z("value"),className:"value"===g?"ts-sorted":"",children:[(0,f.__)("Value","tracksure")," ","value"===g&&("asc"===E?"↑":"↓")]})]})}),(0,a.jsx)("tbody",{children:M.map(n=>{return(0,a.jsxs)("tr",{children:[(0,a.jsx)("td",{className:"ts-date-cell",children:(e=n.converted_at,(0,L.oD)(e,A))}),(0,a.jsx)("td",{className:"ts-url-cell",children:n.page_url?(0,a.jsxs)("a",{href:n.page_url,target:"_blank",rel:"noopener noreferrer",className:"ts-url-link",children:[n.page_url,(0,a.jsx)(m.I,{name:"ExternalLink",size:12})]}):(0,a.jsx)("span",{className:"ts-url-empty",children:"-"})}),(0,a.jsx)("td",{className:"ts-context-cell",children:V(n)?(0,a.jsxs)("span",{className:"ts-context-badge",children:[(0,a.jsx)(m.I,{name:"Tag",size:12}),V(n)]}):(0,a.jsx)("span",{className:"ts-context-empty",children:"-"})}),(0,a.jsx)("td",{className:"ts-source-cell",children:(0,a.jsxs)("div",{className:"ts-source-info",children:[(0,a.jsx)("strong",{children:n.source||"direct"}),n.medium&&(0,a.jsxs)("span",{className:"ts-medium",children:[" / ",n.medium]}),n.campaign&&(0,a.jsx)("div",{className:"ts-campaign",children:n.campaign})]})}),(0,a.jsx)("td",{className:"ts-device-cell",children:(0,a.jsxs)("span",{className:"ts-device-badge",children:[(0,a.jsx)(m.I,{name:"mobile"===n.device?"Smartphone":"tablet"===n.device?"Tablet":"Monitor",size:12}),n.device||"desktop"]})}),"none"!==r.value_type&&(0,a.jsx)("td",{className:"ts-value-cell",children:(0,P.vv)(n.value||0)})]},n.conversion_id);var e})})]})})}),!w&&$>1&&(0,a.jsxs)("div",{className:"ts-modal-pagination",children:[(0,a.jsxs)("button",{onClick:()=>p(r=>Math.max(1,r-1)),disabled:1===c,className:"ts-page-btn",children:[(0,a.jsx)(m.I,{name:"ChevronLeft",size:16}),(0,f.__)("Previous","tracksure")]}),(0,a.jsxs)("span",{className:"ts-page-info",children:[(0,f.__)("Page","tracksure")," ",c," ",(0,f.__)("of","tracksure")," ",$," (",_," ",(0,f.__)("total conversions","tracksure"),")"]}),(0,a.jsxs)("button",{onClick:()=>p(r=>Math.min($,r+1)),disabled:c===$,className:"ts-page-btn",children:[(0,f.__)("Next","tracksure"),(0,a.jsx)(m.I,{name:"ChevronRight",size:16})]})]})]}),J=()=>F?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading sources...","tracksure")})]}):0===T.length?(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"Globe",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No source data available for this period.","tracksure")})]}):(0,a.jsx)("div",{className:"ts-sources-tab",children:(0,a.jsxs)("table",{className:"ts-sources-table",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{children:(0,f.__)("Source","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Medium","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Conversions","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Percentage","tracksure")}),"none"!==r.value_type&&(0,a.jsx)("th",{children:(0,f.__)("Revenue","tracksure")})]})}),(0,a.jsx)("tbody",{children:T.map((n,e)=>(0,a.jsxs)("tr",{children:[(0,a.jsx)("td",{className:"ts-source-name",children:n.source}),(0,a.jsx)("td",{className:"ts-source-medium",children:n.medium||"-"}),(0,a.jsx)("td",{className:"ts-source-conversions",children:n.conversions}),(0,a.jsxs)("td",{className:"ts-source-percentage",children:[(0,a.jsx)("div",{className:"ts-progress-bar",children:(0,a.jsx)("div",{className:"ts-progress-fill",style:{width:`${n.percentage}%`}})}),(0,a.jsxs)("span",{children:[n.percentage.toFixed(1),"%"]})]}),"none"!==r.value_type&&(0,a.jsx)("td",{className:"ts-source-revenue",children:(0,P.vv)(n.revenue)})]},e))})]})}),K=()=>G?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading devices...","tracksure")})]}):0===q.length?(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"Monitor",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No device data available for this period.","tracksure")})]}):(0,a.jsx)("div",{className:"ts-devices-tab",children:(0,a.jsxs)("table",{className:"ts-devices-table",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{children:(0,f.__)("Device","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Browser","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Conversions","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Percentage","tracksure")})]})}),(0,a.jsx)("tbody",{children:q.map((r,n)=>(0,a.jsxs)("tr",{children:[(0,a.jsxs)("td",{className:"ts-device-name",children:[(0,a.jsx)(m.I,{name:"mobile"===r.device?"Smartphone":"tablet"===r.device?"Tablet":"Monitor",size:16}),r.device]}),(0,a.jsx)("td",{className:"ts-device-browser",children:r.browser}),(0,a.jsx)("td",{className:"ts-device-conversions",children:r.conversions}),(0,a.jsxs)("td",{className:"ts-device-percentage",children:[(0,a.jsx)("div",{className:"ts-progress-bar",children:(0,a.jsx)("div",{className:"ts-progress-fill",style:{width:`${r.percentage}%`}})}),(0,a.jsxs)("span",{children:[r.percentage.toFixed(1),"%"]})]})]},n))})]})});return(0,a.jsx)(v.a,{isOpen:!0,onClose:n,size:"xl",title:(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{children:r.name}),(0,a.jsx)("p",{className:"ts-modal-subtitle",children:r.description})]}),children:(0,a.jsxs)("div",{className:"ts-goal-details-modal",children:[(0,a.jsxs)("div",{className:"ts-modal-tabs",children:[(0,a.jsxs)("button",{className:"ts-modal-tab "+("overview"===l?"ts-modal-tab--active":""),onClick:()=>d("overview"),children:[(0,a.jsx)(m.I,{name:"BarChart3",size:18}),(0,f.__)("Overview","tracksure")]}),(0,a.jsxs)("button",{className:"ts-modal-tab "+("timeline"===l?"ts-modal-tab--active":""),onClick:()=>d("timeline"),children:[(0,a.jsx)(m.I,{name:"Clock",size:18}),(0,f.__)("Timeline","tracksure")]}),(0,a.jsxs)("button",{className:"ts-modal-tab "+("sources"===l?"ts-modal-tab--active":""),onClick:()=>d("sources"),children:[(0,a.jsx)(m.I,{name:"Globe",size:18}),(0,f.__)("Sources","tracksure")]}),(0,a.jsxs)("button",{className:"ts-modal-tab "+("devices"===l?"ts-modal-tab--active":""),onClick:()=>d("devices"),children:[(0,a.jsx)(m.I,{name:"Monitor",size:18}),(0,f.__)("Devices","tracksure")]})]}),(0,a.jsx)("div",{className:"ts-modal-tab-content",children:(()=>{switch(l){case"overview":return Q();case"timeline":return H();case"sources":return J();case"devices":return K();default:return null}})()})]})})};var Z=e(66522),V=e(87791),$=e(56883),X={};X.styleTagTransform=q(),X.setAttributes=I(),X.insert=z().bind(null,"head"),X.domAPI=w(),X.insertStyleElement=T();_()($.A,X);$.A&&$.A.locals&&$.A.locals;const Q=[{id:"basic",title:(0,f.__)("Basic Information","tracksure"),description:(0,f.__)("Name and describe your goal","tracksure"),icon:"FileText"},{id:"trigger",title:(0,f.__)("Trigger Configuration","tracksure"),description:(0,f.__)("Choose what triggers this goal","tracksure"),icon:"Zap"},{id:"conditions",title:(0,f.__)("Conditions","tracksure"),description:(0,f.__)("Define when the goal converts","tracksure"),icon:"Filter"},{id:"advanced",title:(0,f.__)("Advanced Settings","tracksure"),description:(0,f.__)("Value, frequency, and attribution","tracksure"),icon:"Settings"},{id:"preview",title:(0,f.__)("Review & Save","tracksure"),description:(0,f.__)("Preview and confirm your goal","tracksure"),icon:"Eye"}],H=[{value:"pageview",label:(0,f.__)("Page View","tracksure"),description:(0,f.__)("Track visits to specific pages or sections","tracksure"),icon:"FileText",eventName:"page_view"},{value:"click",label:(0,f.__)("Element Click","tracksure"),description:(0,f.__)("Track clicks on buttons, links, or elements","tracksure"),icon:"MousePointer",eventName:"click"},{value:"form_submit",label:(0,f.__)("Form Submission","tracksure"),description:(0,f.__)("Track form completions and leads","tracksure"),icon:"Send",eventName:"form_submit"},{value:"scroll_depth",label:(0,f.__)("Scroll Depth","tracksure"),description:(0,f.__)("Track how far users scroll on a page","tracksure"),icon:"ArrowDown",eventName:"scroll"},{value:"time_on_page",label:(0,f.__)("Time on Page","tracksure"),description:(0,f.__)("Track engagement duration","tracksure"),icon:"Clock",eventName:"time_on_page"},{value:"engagement",label:(0,f.__)("Engagement Rate","tracksure"),description:(0,f.__)("Track combined scroll + time engagement","tracksure"),icon:"Heart",eventName:"engagement"},{value:"video_play",label:(0,f.__)("Video Play","tracksure"),description:(0,f.__)("Track video interactions","tracksure"),icon:"Play",eventName:"video_play"},{value:"download",label:(0,f.__)("File Download","tracksure"),description:(0,f.__)("Track file and document downloads","tracksure"),icon:"Download",eventName:"file_download"},{value:"outbound_link",label:(0,f.__)("Outbound Link","tracksure"),description:(0,f.__)("Track clicks to external websites","tracksure"),icon:"ExternalLink",eventName:"outbound_click"},{value:"custom_event",label:(0,f.__)("Custom Event","tracksure"),description:(0,f.__)("Track custom JavaScript events","tracksure"),icon:"Code",eventName:"custom_event"}],J=[{value:"engagement",label:(0,f.__)("Engagement","tracksure"),icon:"Heart"},{value:"leads",label:(0,f.__)("Leads & Conversions","tracksure"),icon:"Users"},{value:"ecommerce",label:(0,f.__)("E-commerce","tracksure"),icon:"ShoppingCart"},{value:"content",label:(0,f.__)("Content & Media","tracksure"),icon:"FileText"}],K=({isOpen:r,onClose:n,onSave:e,onSaveAsTemplate:o})=>{const[s,i]=(0,t.useState)("basic"),[A,l]=(0,t.useState)({name:"",description:"",category:"engagement",trigger_type:"pageview",event_name:"page_view",conditions:[],match_logic:"all",value_type:"none",value:0,attribution_window:30,frequency:"unlimited",is_active:!0}),[d,c]=(0,t.useState)({}),[p,g]=(0,t.useState)(!1),C=Q.findIndex(r=>r.id===s),u=0===C,E=C===Q.length-1,x=r=>{const n={};if("basic"===r){const r=A.name?.trim()||"";r?r.length<3?n.name=(0,f.__)("Goal name must be at least 3 characters","tracksure"):r.length>100&&(n.name=(0,f.__)("Goal name cannot exceed 100 characters","tracksure")):n.name=(0,f.__)("Goal name is required","tracksure"),A.description&&A.description.length>500&&(n.description=(0,f.__)("Description cannot exceed 500 characters","tracksure")),A.category||(n.category=(0,f.__)("Please select a category","tracksure"))}if("trigger"===r){A.trigger_type||(n.trigger_type=(0,f.__)("Please select a trigger type","tracksure"));const r=A.event_name?.trim()||"";r?r.length>100?n.event_name=(0,f.__)("Event name cannot exceed 100 characters","tracksure"):/^[a-z0-9_]+$/.test(r)||(n.event_name=(0,f.__)("Event name must contain only lowercase letters, numbers, and underscores","tracksure")):n.event_name=(0,f.__)("Event name is required","tracksure")}return"advanced"===r&&"fixed"===A.value_type&&(!A.value||A.value<=0)&&(n.value=(0,f.__)("Fixed value must be greater than 0","tracksure")),c(n),0===Object.keys(n).length},h=()=>{for(const r of Q)if(!x(r.id))return i(r.id),!1;return!0};(0,t.useEffect)(()=>{if(!r)return;const n=localStorage.getItem("tracksure_goal_draft");if(n)try{const r=JSON.parse(n);l(r),g(!0)}catch(r){}},[r]),(0,t.useEffect)(()=>{if("custom_event"===A.trigger_type)return;const r=H.find(r=>r.value===A.trigger_type);r&&l(n=>({...n,event_name:r.eventName}))},[A.trigger_type]);return(0,a.jsx)(v.a,{isOpen:r,onClose:n,size:"xl",title:(0,f.__)("Create Custom Goal","tracksure"),children:(0,a.jsxs)("div",{className:"ts-custom-goal-builder",children:[(0,a.jsx)("div",{className:"ts-goal-builder-steps",children:Q.map((r,n)=>(0,a.jsxs)("div",{className:`ts-step ${s===r.id?"ts-step--active":""} ${n<C?"ts-step--completed":""}`,children:[(0,a.jsx)("div",{className:"ts-step-number",children:n<C?(0,a.jsx)(m.I,{name:"Check",size:16}):(0,a.jsx)("span",{children:n+1})}),(0,a.jsxs)("div",{className:"ts-step-info",children:[(0,a.jsx)("div",{className:"ts-step-title",children:r.title}),(0,a.jsx)("div",{className:"ts-step-description",children:r.description})]})]},r.id))}),(0,a.jsxs)("div",{className:"ts-builder-content",children:[p&&(0,a.jsxs)("div",{className:"ts-draft-notice",children:[(0,a.jsx)(m.I,{name:"Info",size:16}),(0,f.__)("Draft loaded from previous session","tracksure")]}),(()=>{switch(s){case"basic":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"FileText",size:20}),(0,f.__)("Basic Information","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsxs)("label",{htmlFor:"goal-name",children:[(0,f.__)("Goal Name","tracksure")," ",(0,a.jsx)("span",{className:"ts-required",children:"*"})]}),(0,a.jsx)("input",{id:"goal-name",type:"text",value:A.name||"",onChange:r=>l({...A,name:r.target.value}),placeholder:(0,f.__)("e.g., Newsletter Signup, Product Purchase","tracksure"),className:d.name?"ts-input-error":"",autoFocus:!0}),d.name&&(0,a.jsx)("span",{className:"ts-error-message",children:d.name}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Choose a clear, descriptive name that identifies this goal","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsxs)("label",{htmlFor:"goal-description",children:[(0,f.__)("Description","tracksure")," ",(0,a.jsxs)("span",{className:"ts-optional",children:["(",(0,f.__)("optional","tracksure"),")"]})]}),(0,a.jsx)("textarea",{id:"goal-description",value:A.description||"",onChange:r=>l({...A,description:r.target.value}),placeholder:(0,f.__)("Describe the purpose of this goal and what success looks like","tracksure"),rows:3}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Help team members understand what this goal measures","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsxs)("label",{children:[(0,f.__)("Category","tracksure")," ",(0,a.jsx)("span",{className:"ts-required",children:"*"})]}),(0,a.jsx)("div",{className:"ts-category-grid",children:J.map(r=>(0,a.jsxs)("button",{type:"button",className:"ts-category-card "+(A.category===r.value?"ts-category-card--selected":""),onClick:()=>l({...A,category:r.value}),children:[(0,a.jsx)(m.I,{name:r.icon,size:24}),(0,a.jsx)("span",{children:r.label})]},r.value))}),d.category&&(0,a.jsx)("span",{className:"ts-error-message",children:d.category})]})]})]})});case"trigger":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Zap",size:20}),(0,f.__)("Choose Trigger Type","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsx)("p",{className:"ts-section-intro",children:(0,f.__)("Select what user action will trigger this goal conversion","tracksure")}),(0,a.jsx)("div",{className:"ts-trigger-grid",children:H.map(r=>(0,a.jsxs)("button",{type:"button",className:"ts-trigger-card "+(A.trigger_type===r.value?"ts-trigger-card--selected":""),onClick:()=>l({...A,trigger_type:r.value}),children:[(0,a.jsx)("div",{className:"ts-trigger-icon",children:(0,a.jsx)(m.I,{name:r.icon,size:32})}),(0,a.jsxs)("div",{className:"ts-trigger-info",children:[(0,a.jsx)("div",{className:"ts-trigger-label",children:r.label}),(0,a.jsx)("div",{className:"ts-trigger-description",children:r.description})]}),A.trigger_type===r.value&&(0,a.jsx)("div",{className:"ts-trigger-check",children:(0,a.jsx)(m.I,{name:"CheckCircle",size:20})})]},r.value))}),d.trigger_type&&(0,a.jsx)("span",{className:"ts-error-message",children:d.trigger_type}),"custom_event"===A.trigger_type&&(0,a.jsxs)("div",{className:"ts-form-field",style:{marginTop:"16px"},children:[(0,a.jsxs)("label",{htmlFor:"custom-event-name",children:[(0,f.__)("Event Name","tracksure")," ",(0,a.jsx)("span",{className:"ts-required",children:"*"})]}),(0,a.jsx)("input",{id:"custom-event-name",type:"text",value:A.event_name||"",onChange:r=>l({...A,event_name:r.target.value}),placeholder:(0,f.__)("e.g., purchase, add_to_cart, calculator_completed","tracksure"),maxLength:100}),d.event_name&&(0,a.jsx)("p",{className:"ts-field-error",children:d.event_name}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("The exact event name your custom code dispatches","tracksure")})]})]})]})});case"conditions":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Filter",size:20}),(0,f.__)("Define Conditions","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsx)("p",{className:"ts-section-intro",children:(0,f.__)("Add conditions to specify exactly when this goal should convert","tracksure")}),(0,a.jsx)(B,{conditions:A.conditions||[],onChange:r=>l({...A,conditions:r}),triggerType:A.trigger_type||"pageview",matchLogic:A.match_logic,onMatchLogicChange:r=>l({...A,match_logic:r})}),d.conditions&&(0,a.jsx)("span",{className:"ts-error-message",children:d.conditions}),A.conditions&&A.conditions.length>0&&(0,a.jsxs)("div",{className:"ts-conditions-preview",children:[(0,a.jsxs)("h4",{children:[(0,a.jsx)(m.I,{name:"Eye",size:16}),(0,f.__)("Condition Logic Preview","tracksure")]}),(0,a.jsxs)("div",{className:"ts-logic-preview",children:["all"===A.match_logic?(0,a.jsxs)("p",{children:[(0,f.__)("Goal converts when","tracksure")," ",(0,a.jsx)("strong",{children:(0,f.__)("ALL","tracksure")})," ",(0,f.__)("of the following are true:","tracksure")]}):(0,a.jsxs)("p",{children:[(0,f.__)("Goal converts when","tracksure")," ",(0,a.jsx)("strong",{children:(0,f.__)("ANY","tracksure")})," ",(0,f.__)("of the following are true:","tracksure")]}),(0,a.jsx)("ul",{className:"ts-condition-list",children:A.conditions.map((r,n)=>(0,a.jsxs)("li",{children:[(0,a.jsx)("code",{children:r.param})," ",(0,a.jsx)("em",{children:r.operator})," ",(0,a.jsxs)("code",{children:['"',r.value,'"']})]},n))})]})]})]})]})});case"advanced":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Settings",size:20}),(0,f.__)("Advanced Settings","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsx)("label",{children:(0,f.__)("Conversion Value","tracksure")}),(0,a.jsxs)("div",{className:"ts-radio-group",children:[(0,a.jsxs)("label",{className:"ts-radio-option",children:[(0,a.jsx)("input",{type:"radio",name:"value_type",value:"none",checked:"none"===A.value_type,onChange:r=>l({...A,value_type:"none"})}),(0,a.jsxs)("span",{children:[(0,a.jsx)("strong",{children:(0,f.__)("No Value","tracksure")}),(0,a.jsx)("small",{children:(0,f.__)("Track conversions only (most common)","tracksure")})]})]}),(0,a.jsxs)("label",{className:"ts-radio-option",children:[(0,a.jsx)("input",{type:"radio",name:"value_type",value:"fixed",checked:"fixed"===A.value_type,onChange:r=>l({...A,value_type:"fixed"})}),(0,a.jsxs)("span",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Fixed Value","tracksure")}),(0,a.jsx)("small",{children:(0,f.__)("Assign a specific value to each conversion","tracksure")})]})]}),(0,a.jsxs)("label",{className:"ts-radio-option",children:[(0,a.jsx)("input",{type:"radio",name:"value_type",value:"dynamic",checked:"dynamic"===A.value_type,onChange:r=>l({...A,value_type:"dynamic"})}),(0,a.jsxs)("span",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Dynamic Value","tracksure")}),(0,a.jsx)("small",{children:(0,f.__)("Use actual transaction amounts (e.g., order totals)","tracksure")})]})]})]}),"fixed"===A.value_type&&(0,a.jsxs)("div",{className:"ts-value-input",children:[(0,a.jsx)("input",{type:"number",value:A.value||0,onChange:r=>l({...A,value:parseFloat(r.target.value)||0}),min:"0",step:"0.01",placeholder:"0.00",className:d.value?"ts-input-error":""}),d.value&&(0,a.jsx)("span",{className:"ts-error-message",children:d.value}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Enter the monetary value for each conversion (e.g., average lead value)","tracksure")})]})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsx)("label",{htmlFor:"attribution-window",children:(0,f.__)("Attribution Window","tracksure")}),(0,a.jsxs)("select",{id:"attribution-window",value:A.attribution_window||30,onChange:r=>l({...A,attribution_window:parseInt(r.target.value)}),children:[(0,a.jsx)("option",{value:"1",children:(0,f.__)("1 day","tracksure")}),(0,a.jsx)("option",{value:"7",children:(0,f.__)("7 days","tracksure")}),(0,a.jsx)("option",{value:"14",children:(0,f.__)("14 days","tracksure")}),(0,a.jsx)("option",{value:"30",children:(0,f.__)("30 days (recommended)","tracksure")}),(0,a.jsx)("option",{value:"60",children:(0,f.__)("60 days","tracksure")}),(0,a.jsx)("option",{value:"90",children:(0,f.__)("90 days","tracksure")})]}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("How long to connect conversions to original traffic sources","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsx)("label",{htmlFor:"frequency",children:(0,f.__)("Conversion Frequency","tracksure")}),(0,a.jsxs)("select",{id:"frequency",value:A.frequency||"unlimited",onChange:r=>l({...A,frequency:r.target.value}),children:[(0,a.jsx)("option",{value:"unlimited",children:(0,f.__)("Unlimited (track every occurrence)","tracksure")}),(0,a.jsx)("option",{value:"session",children:(0,f.__)("Once per session","tracksure")}),(0,a.jsx)("option",{value:"once",children:(0,f.__)("Once per visitor (lifetime)","tracksure")})]}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Control how often the same user can trigger this goal","tracksure")})]})]})]})});case"preview":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Eye",size:20}),(0,f.__)("Review Your Goal","tracksure")]}),(0,a.jsx)(Z.bw,{children:(0,a.jsxs)("div",{className:"ts-goal-preview",children:[(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Basic Information","tracksure")}),(0,a.jsxs)("dl",{children:[(0,a.jsx)("dt",{children:(0,f.__)("Name","tracksure")}),(0,a.jsx)("dd",{children:A.name}),A.description&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("dt",{children:(0,f.__)("Description","tracksure")}),(0,a.jsx)("dd",{children:A.description})]}),(0,a.jsx)("dt",{children:(0,f.__)("Category","tracksure")}),(0,a.jsx)("dd",{children:J.find(r=>r.value===A.category)?.label})]})]}),(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Trigger Configuration","tracksure")}),(0,a.jsxs)("dl",{children:[(0,a.jsx)("dt",{children:(0,f.__)("Trigger Type","tracksure")}),(0,a.jsx)("dd",{children:H.find(r=>r.value===A.trigger_type)?.label}),(0,a.jsx)("dt",{children:(0,f.__)("Event Name","tracksure")}),(0,a.jsx)("dd",{children:(0,a.jsx)("code",{children:A.event_name})})]})]}),(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Conditions","tracksure")}),(0,a.jsx)("p",{children:"all"===A.match_logic?(0,f.__)("Must match ALL conditions:","tracksure"):(0,f.__)("Must match ANY condition:","tracksure")}),A.conditions&&A.conditions.length>0?(0,a.jsx)("ul",{className:"ts-condition-list",children:A.conditions.map((r,n)=>(0,a.jsxs)("li",{children:[(0,a.jsx)("code",{children:r.param})," ",(0,a.jsx)("em",{children:r.operator})," ",(0,a.jsxs)("code",{children:['"',r.value,'"']})]},n))}):(0,a.jsx)("p",{className:"ts-no-conditions",children:(0,f.__)("No conditions defined","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Advanced Settings","tracksure")}),(0,a.jsxs)("dl",{children:[(0,a.jsx)("dt",{children:(0,f.__)("Value Type","tracksure")}),(0,a.jsxs)("dd",{children:["none"===A.value_type&&(0,f.__)("No value tracked","tracksure"),"fixed"===A.value_type&&`${(0,f.__)("Fixed:","tracksure")} $${A.value}`,"dynamic"===A.value_type&&(0,f.__)("Dynamic (from transaction)","tracksure")]}),(0,a.jsx)("dt",{children:(0,f.__)("Attribution Window","tracksure")}),(0,a.jsxs)("dd",{children:[A.attribution_window," ",(0,f.__)("days","tracksure")]}),(0,a.jsx)("dt",{children:(0,f.__)("Frequency","tracksure")}),(0,a.jsxs)("dd",{children:["unlimited"===A.frequency&&(0,f.__)("Unlimited","tracksure"),"session"===A.frequency&&(0,f.__)("Once per session","tracksure"),"once"===A.frequency&&(0,f.__)("Once per visitor","tracksure")]})]})]})]})})]})});default:return null}})()]}),(0,a.jsxs)("div",{className:"ts-builder-actions",children:[(0,a.jsx)("div",{className:"ts-actions-left",children:!u&&(0,a.jsxs)(V.$,{variant:"outline",onClick:()=>{const r=C-1;if(r>=0){const n=Q[r];n&&(i(n.id),c({}))}},children:[(0,a.jsx)(m.I,{name:"ChevronLeft",size:16}),(0,f.__)("Back","tracksure")]})}),(0,a.jsxs)("div",{className:"ts-actions-right",children:[(0,a.jsxs)(V.$,{variant:"ghost",onClick:()=>{g(!0),localStorage.setItem("tracksure_goal_draft",JSON.stringify(A))},children:[(0,a.jsx)(m.I,{name:"Save",size:16}),(0,f.__)("Save Draft","tracksure")]}),E?(0,a.jsxs)(a.Fragment,{children:[o&&(0,a.jsxs)(V.$,{variant:"outline",onClick:()=>{o&&h()&&o(A)},children:[(0,a.jsx)(m.I,{name:"Bookmark",size:16}),(0,f.__)("Save as Template","tracksure")]}),(0,a.jsxs)(V.$,{variant:"primary",onClick:()=>{h()&&(e(A),localStorage.removeItem("tracksure_goal_draft"),g(!1))},children:[(0,a.jsx)(m.I,{name:"Check",size:16}),(0,f.__)("Create Goal","tracksure")]})]}):(0,a.jsxs)(V.$,{variant:"primary",onClick:()=>{if(x(s)){const r=C+1;if(r<Q.length){const n=Q[r];n&&i(n.id)}}},children:[(0,f.__)("Next","tracksure"),(0,a.jsx)(m.I,{name:"ChevronRight",size:16})]})]})]})]})})};var rr=e(96478),nr={};nr.styleTagTransform=q(),nr.setAttributes=I(),nr.insert=z().bind(null,"head"),nr.domAPI=w(),nr.insertStyleElement=T();_()(rr.A,nr);rr.A&&rr.A.locals&&rr.A.locals;const er=({selectedGoals:r,allGoals:n,onActionComplete:e,onSelectionChange:o})=>{const[s,i]=(0,t.useState)(!1),[A,l]=(0,t.useState)(null);(0,t.useEffect)(()=>{const r=r=>{"Escape"===r.key&&A&&l(null)};if(A)return document.addEventListener("keydown",r),()=>document.removeEventListener("keydown",r)},[A]);const d=async n=>{if(0!==r.length)if("delete"!==n)if("disable"!==n){i(!0);try{"export"===n?await p():await c(n)}catch(r){alert((0,f.__)("Failed to perform bulk action. Please try again.","tracksure"))}finally{i(!1)}}else l("disable");else l("delete");else alert((0,f.__)("Please select at least one goal.","tracksure"))},c=async n=>{const a="enable"===n?1:0,t=r.map(r=>window.wp.apiFetch({path:`/ts/v1/goals/${r}`,method:"POST",data:{is_active:a}}));await Promise.all(t),o([]),e(),alert(1===r.length?(0,f.__)("Goal updated successfully.","tracksure"):(0,f.__)(`${r.length} goals updated successfully.`,"tracksure"))},p=async()=>{const e=n.filter(n=>r.includes(n.goal_id)),a={version:"2.1.0",exported_at:(new Date).toISOString(),goals:e.map(r=>({name:r.name,description:r.description,category:r.category,trigger_type:r.trigger_type,event_name:r.event_name,conditions:r.conditions,match_logic:r.match_logic,value_type:r.value_type,value:r.value,attribution_window:r.attribution_window,frequency:r.frequency,is_active:r.is_active}))},t=new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),s=URL.createObjectURL(t),i=document.createElement("a");i.href=s,i.download=`tracksure-goals-${Date.now()}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(s),alert(1===r.length?(0,f.__)("Goal exported successfully.","tracksure"):(0,f.__)(`${r.length} goals exported successfully.`,"tracksure")),o([])},g=r.length===n.length&&n.length>0,m=r.length>0&&r.length<n.length;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"goal-bulk-actions",role:"toolbar","aria-label":(0,f.__)("Bulk actions for goals","tracksure"),children:[(0,a.jsx)("div",{className:"bulk-actions-left",children:(0,a.jsxs)("label",{className:"bulk-select-all",children:[(0,a.jsx)("input",{type:"checkbox",checked:g,ref:r=>{r&&(r.indeterminate=m)},onChange:()=>{r.length===n.length?o([]):o(n.map(r=>r.goal_id))},disabled:0===n.length,"aria-label":g?(0,f.__)("Deselect all goals","tracksure"):(0,f.__)("Select all goals","tracksure")}),(0,a.jsx)("span",{children:r.length>0?(0,f.__)(`${r.length} selected`,"tracksure"):(0,f.__)("Select all","tracksure")})]})}),r.length>0&&(0,a.jsxs)("div",{className:"bulk-actions-right",role:"group","aria-label":(0,f.__)("Available bulk actions","tracksure"),children:[(0,a.jsxs)("button",{className:"bulk-action-btn",onClick:()=>d("enable"),disabled:s,"aria-label":(0,f.__)("Enable selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-yes-alt","aria-hidden":"true"}),(0,f.__)("Enable","tracksure")]}),(0,a.jsxs)("button",{className:"bulk-action-btn",onClick:()=>d("disable"),disabled:s,"aria-label":(0,f.__)("Disable selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-dismiss","aria-hidden":"true"}),(0,f.__)("Disable","tracksure")]}),(0,a.jsxs)("button",{className:"bulk-action-btn",onClick:()=>d("export"),disabled:s,"aria-label":(0,f.__)("Export selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-download","aria-hidden":"true"}),(0,f.__)("Export","tracksure")]}),(0,a.jsxs)("button",{className:"bulk-action-btn bulk-delete",onClick:()=>d("delete"),disabled:s,"aria-label":(0,f.__)("Delete selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-trash","aria-hidden":"true"}),(0,f.__)("Delete","tracksure")]})]})]}),A&&(0,a.jsx)("div",{className:"bulk-confirm-dialog-overlay",onClick:()=>l(null),role:"dialog","aria-modal":"true","aria-labelledby":"bulk-confirm-title",children:(0,a.jsxs)("div",{className:"bulk-confirm-dialog",onClick:r=>r.stopPropagation(),children:[(0,a.jsx)("h3",{id:"bulk-confirm-title",children:"delete"===A?(0,f.__)("Confirm Deletion","tracksure"):(0,f.__)("Confirm Disable","tracksure")}),(0,a.jsx)("p",{children:"delete"===A?1===r.length?(0,f.__)("Are you sure you want to delete this goal? This action cannot be undone.","tracksure"):`${(0,f.__)("Are you sure you want to delete","tracksure")} ${r.length} ${(0,f.__)("goals? This action cannot be undone.","tracksure")}`:1===r.length?(0,f.__)("Are you sure you want to disable this goal?","tracksure"):`${(0,f.__)("Are you sure you want to disable","tracksure")} ${r.length} ${(0,f.__)("goals?","tracksure")}`}),(0,a.jsxs)("div",{className:"bulk-confirm-actions",children:[(0,a.jsx)("button",{className:"button",onClick:()=>l(null),children:(0,f.__)("Cancel","tracksure")}),(0,a.jsx)("button",{className:"button button-primary",onClick:"delete"===A?async()=>{l(null),i(!0);try{const n=r.map(r=>window.wp.apiFetch({path:`/ts/v1/goals/${r}`,method:"DELETE"}));await Promise.all(n),o([]),e(),alert(1===r.length?(0,f.__)("Goal deleted successfully.","tracksure"):(0,f.__)(`${r.length} goals deleted successfully.`,"tracksure"))}catch(r){alert((0,f.__)("Failed to delete goals. Please try again.","tracksure"))}finally{i(!1)}}:()=>{l(null),c("disable")},autoFocus:!0,children:(0,f.__)("Confirm","tracksure")})]})]})})]})};var ar=e(21421),tr={};tr.styleTagTransform=q(),tr.setAttributes=I(),tr.insert=z().bind(null,"head"),tr.domAPI=w(),tr.insertStyleElement=T();_()(ar.A,tr);ar.A&&ar.A.locals&&ar.A.locals;const or=({filters:r,onFiltersChange:n,onReset:e})=>{const[o,s]=(0,t.useState)(!1),[i,A]=(0,t.useState)(r.search);(0,t.useEffect)(()=>{const e=setTimeout(()=>{i!==r.search&&n({...r,search:i})},300);return()=>clearTimeout(e)},[i]);const l=(e,a)=>{n({...r,[e]:a})},d=""!==r.search||"all"!==r.category||"all"!==r.triggerType||"all"!==r.status||"name"!==r.sortBy||"asc"!==r.sortOrder;return(0,a.jsxs)("div",{className:"goal-filters",role:"search","aria-label":(0,f.__)("Filter and search goals","tracksure"),children:[(0,a.jsxs)("div",{className:"filters-header",children:[(0,a.jsxs)("div",{className:"filters-search",children:[(0,a.jsx)("span",{className:"dashicons dashicons-search","aria-hidden":"true"}),(0,a.jsx)("input",{type:"text",placeholder:(0,f.__)("Search goals...","tracksure"),value:i,onChange:r=>A(r.target.value),className:"search-input","aria-label":(0,f.__)("Search goals","tracksure")}),i&&(0,a.jsx)("button",{className:"clear-search",onClick:()=>A(""),title:(0,f.__)("Clear search","tracksure"),"aria-label":(0,f.__)("Clear search","tracksure"),children:(0,a.jsx)("span",{className:"dashicons dashicons-no-alt","aria-hidden":"true"})})]}),(0,a.jsxs)("div",{className:"filters-actions",children:[(0,a.jsxs)("button",{className:"filters-toggle "+(d?"active":""),onClick:()=>s(!o),"aria-expanded":o,"aria-controls":"filter-panel",children:[(0,a.jsx)("span",{className:"dashicons dashicons-filter","aria-hidden":"true"}),(0,f.__)("Filters","tracksure"),d&&(0,a.jsx)("span",{className:"filter-badge","aria-label":(0,f.__)("Active filters","tracksure")})]}),d&&(0,a.jsx)("button",{className:"button",onClick:e,"aria-label":(0,f.__)("Reset all filters","tracksure"),children:(0,f.__)("Reset","tracksure")})]})]}),o&&(0,a.jsxs)("div",{className:"filters-panel",id:"filter-panel",children:[(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-category",children:(0,f.__)("Category","tracksure")}),(0,a.jsxs)("select",{id:"filter-category",value:r.category,onChange:r=>l("category",r.target.value),children:[(0,a.jsx)("option",{value:"all",children:(0,f.__)("All Categories","tracksure")}),(0,a.jsx)("option",{value:"engagement",children:(0,f.__)("Engagement","tracksure")}),(0,a.jsx)("option",{value:"leads",children:(0,f.__)("Leads","tracksure")}),(0,a.jsx)("option",{value:"ecommerce",children:(0,f.__)("E-commerce","tracksure")}),(0,a.jsx)("option",{value:"content",children:(0,f.__)("Content","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-trigger",children:(0,f.__)("Trigger Type","tracksure")}),(0,a.jsxs)("select",{id:"filter-trigger",value:r.triggerType,onChange:r=>l("triggerType",r.target.value),children:[(0,a.jsx)("option",{value:"all",children:(0,f.__)("All Triggers","tracksure")}),(0,a.jsx)("option",{value:"page_visit",children:(0,f.__)("Page Visit","tracksure")}),(0,a.jsx)("option",{value:"element_click",children:(0,f.__)("Element Click","tracksure")}),(0,a.jsx)("option",{value:"form_submission",children:(0,f.__)("Form Submission","tracksure")}),(0,a.jsx)("option",{value:"scroll_depth",children:(0,f.__)("Scroll Depth","tracksure")}),(0,a.jsx)("option",{value:"time_on_page",children:(0,f.__)("Time on Page","tracksure")}),(0,a.jsx)("option",{value:"custom_event",children:(0,f.__)("Custom Event","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-status",children:(0,f.__)("Status","tracksure")}),(0,a.jsxs)("select",{id:"filter-status",value:r.status,onChange:r=>l("status",r.target.value),children:[(0,a.jsx)("option",{value:"all",children:(0,f.__)("All Status","tracksure")}),(0,a.jsx)("option",{value:"active",children:(0,f.__)("Active","tracksure")}),(0,a.jsx)("option",{value:"inactive",children:(0,f.__)("Inactive","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-sortby",children:(0,f.__)("Sort By","tracksure")}),(0,a.jsxs)("select",{id:"filter-sortby",value:r.sortBy,onChange:r=>l("sortBy",r.target.value),children:[(0,a.jsx)("option",{value:"name",children:(0,f.__)("Name","tracksure")}),(0,a.jsx)("option",{value:"created_at",children:(0,f.__)("Date Created","tracksure")}),(0,a.jsx)("option",{value:"conversions",children:(0,f.__)("Conversions","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-order",children:(0,f.__)("Order","tracksure")}),(0,a.jsxs)("select",{id:"filter-order",value:r.sortOrder,onChange:r=>l("sortOrder",r.target.value),children:[(0,a.jsx)("option",{value:"asc",children:(0,f.__)("Ascending","tracksure")}),(0,a.jsx)("option",{value:"desc",children:(0,f.__)("Descending","tracksure")})]})]})]})]})};var sr=e(27691),ir={};ir.styleTagTransform=q(),ir.setAttributes=I(),ir.insert=z().bind(null,"head"),ir.domAPI=w(),ir.insertStyleElement=T();_()(sr.A,ir);sr.A&&sr.A.locals&&sr.A.locals;const Ar=({onImport:r,onClose:n})=>{const[e,o]=(0,t.useState)(!1),[s,i]=(0,t.useState)(!1),[A,l]=(0,t.useState)(null),[d,c]=(0,t.useState)([]),[p,g]=(0,t.useState)(!1),m=(0,t.useRef)(null),C=async r=>{try{const n=await r.text(),e=JSON.parse(n),a=(r=>{const n=[];if(!r||"object"!=typeof r)return n.push((0,f.__)("Invalid JSON format","tracksure")),{valid:!1,errors:n};const e=r;return e.goals&&Array.isArray(e.goals)?0===e.goals.length?(n.push((0,f.__)("Import file contains no goals","tracksure")),{valid:!1,errors:n}):(e.goals.forEach((r,e)=>{r.name||n.push((0,f.__)(`Goal ${e+1}: Missing name`,"tracksure")),r.category||n.push((0,f.__)(`Goal ${e+1}: Missing category`,"tracksure")),r.trigger_type||n.push((0,f.__)(`Goal ${e+1}: Missing trigger type`,"tracksure"))}),{valid:0===n.length,errors:n}):(n.push((0,f.__)("No goals array found in import file","tracksure")),{valid:!1,errors:n})})(e);if(!a.valid)return void l({success:!1,imported:0,skipped:0,errors:a.errors});const t=e.goals.map(r=>({name:String(r.name||""),description:String(r.description||""),event_name:String(r.event_name||r.trigger_type||""),trigger_type:r.trigger_type||"custom_event",category:r.category||void 0,conditions:Array.isArray(r.conditions)?r.conditions:[],match_logic:r.match_logic||"all",value_type:r.value_type||"none",value:"number"==typeof r.conversion_value?r.conversion_value:void 0,frequency:["once","session","unlimited"].includes(String(r.frequency))?String(r.frequency):"once",is_active:void 0===r.is_active||Boolean(r.is_active)}));c(t),g(!0)}catch(r){l({success:!1,imported:0,skipped:0,errors:[(0,f.__)("Failed to parse JSON file. Please check the file format.","tracksure")]})}},u=r=>{r.name.endsWith(".json")?C(r):l({success:!1,imported:0,skipped:0,errors:[(0,f.__)("Please select a JSON file","tracksure")]})};return(0,a.jsxs)("div",{className:"goal-import-modal",role:"dialog","aria-modal":"true","aria-labelledby":"import-title",children:[(0,a.jsxs)("div",{className:"goal-import-header",children:[(0,a.jsx)("h2",{id:"import-title",children:(0,f.__)("Import Goals","tracksure")}),(0,a.jsx)("button",{className:"goal-import-close",onClick:n,"aria-label":(0,f.__)("Close import dialog","tracksure"),children:(0,a.jsx)("span",{className:"dashicons dashicons-no-alt","aria-hidden":"true"})})]}),(0,a.jsxs)("div",{className:"goal-import-body",children:[!p&&!A&&(0,a.jsxs)("div",{className:"goal-import-dropzone "+(e?"dragging":""),onDrop:r=>{r.preventDefault(),o(!1);const n=Array.from(r.dataTransfer.files);n.length>0&&u(n[0])},onDragOver:r=>{r.preventDefault(),o(!0)},onDragLeave:()=>{o(!1)},onClick:()=>m.current?.click(),children:[(0,a.jsx)("span",{className:"dashicons dashicons-upload","aria-hidden":"true"}),(0,a.jsx)("h3",{children:(0,f.__)("Drop JSON file here","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("or click to browse files","tracksure")}),(0,a.jsx)("input",{ref:m,type:"file",accept:".json",onChange:r=>{const n=r.target.files;n&&n.length>0&&u(n[0])},style:{display:"none"},"aria-label":(0,f.__)("Select JSON file","tracksure")})]}),p&&(0,a.jsxs)("div",{className:"goal-import-preview",children:[(0,a.jsx)("h3",{children:(0,f.__)("Preview Import","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)(`${d.length} goal(s) will be imported:`,"tracksure")}),(0,a.jsx)("div",{className:"preview-list",children:d.map((r,n)=>(0,a.jsxs)("div",{className:"preview-item",children:[(0,a.jsxs)("div",{className:"preview-item-header",children:[(0,a.jsx)("strong",{children:r.name}),(0,a.jsx)("span",{className:"preview-badge",children:r.category})]}),(0,a.jsx)("p",{className:"preview-description",children:r.description}),(0,a.jsxs)("div",{className:"preview-meta",children:[(0,a.jsx)("span",{children:r.trigger_type.replace(/_/g," ")}),r.conditions.length>0&&(0,a.jsxs)("span",{children:[r.conditions.length," conditions"]})]})]},n))}),(0,a.jsxs)("div",{className:"goal-import-actions",children:[(0,a.jsx)("button",{className:"button",onClick:()=>{g(!1),c([])},disabled:s,children:(0,f.__)("Cancel","tracksure")}),(0,a.jsx)("button",{className:"button button-primary",onClick:async()=>{i(!0);try{await r(d),l({success:!0,imported:d.length,skipped:0,errors:[]}),g(!1),setTimeout(()=>{n()},2e3)}catch(r){l({success:!1,imported:0,skipped:d.length,errors:[(0,f.__)("Failed to import goals. Please try again.","tracksure")]})}finally{i(!1)}},disabled:s,children:s?(0,f.__)("Importing...","tracksure"):(0,f.__)(`Import ${d.length} Goal(s)`,"tracksure")})]})]}),A&&(0,a.jsxs)("div",{className:"goal-import-result "+(A.success?"success":"error"),children:[(0,a.jsx)("span",{className:"dashicons "+(A.success?"dashicons-yes-alt":"dashicons-warning"),"aria-hidden":"true"}),(0,a.jsx)("h3",{children:A.success?(0,f.__)("Import Successful!","tracksure"):(0,f.__)("Import Failed","tracksure")}),A.success?(0,a.jsx)("p",{children:(0,f.__)(`Successfully imported ${A.imported} goal(s)`,"tracksure")}):(0,a.jsx)("div",{className:"error-list",children:A.errors.map((r,n)=>(0,a.jsx)("p",{className:"error-message",children:r},n))}),(0,a.jsx)("button",{className:"button button-primary",onClick:n,children:(0,f.__)("Close","tracksure")})]})]})]})};var lr=e(12577),dr={};dr.styleTagTransform=q(),dr.setAttributes=I(),dr.insert=z().bind(null,"head"),dr.domAPI=w(),dr.insertStyleElement=T();_()(lr.A,dr);lr.A&&lr.A.locals&&lr.A.locals;const cr=()=>{const{dateRange:r}=(0,o.n)(),{data:n,isLoading:e,error:i,refetch:A}=(0,s.S)("getGoalsOverview",{start_date:(0,P.TJ)(r.start),end_date:(0,P.TJ)(r.end)}),l=(0,t.useMemo)(()=>{if(!n?.conversions_trend)return null;const r=n.total_conversions,e=n.conversions_trend.previous_period||0;if(0===e)return{direction:"neutral",percentage:0};const a=(r-e)/e*100;return{direction:a>0?"up":a<0?"down":"neutral",percentage:Math.abs(Math.round(a))}},[n]),d=(0,t.useMemo)(()=>{if(!n?.value_trend)return null;const r=n.total_value,e=n.value_trend.previous_period||0;if(0===e)return{direction:"neutral",percentage:0};const a=(r-e)/e*100;return{direction:a>0?"up":a<0?"down":"neutral",percentage:Math.abs(Math.round(a))}},[n]),c=(0,t.useMemo)(()=>{if(!n?.rate_trend)return null;const r=n.conversion_rate,e=n.rate_trend.previous_period||0;if(0===e)return{direction:"neutral",percentage:0};const a=(r-e)/e*100;return{direction:a>0?"up":a<0?"down":"neutral",percentage:Math.abs(Math.round(a))}},[n]);return e?(0,a.jsx)("div",{className:"ts-goals-overview",children:(0,a.jsxs)("div",{className:"ts-goals-overview__kpis",children:[(0,a.jsx)(g.or,{}),(0,a.jsx)(g.or,{}),(0,a.jsx)(g.or,{}),(0,a.jsx)(g.or,{})]})}):i?(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-empty-state ts-empty-state--error",children:[(0,a.jsx)(m.I,{name:"AlertCircle",size:48,color:"var(--ts-error)"}),(0,a.jsx)("h3",{children:(0,f.__)("Failed to load goals overview","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("There was an error loading the dashboard data.","tracksure")}),(0,a.jsx)("button",{onClick:A,className:"ts-btn ts-btn--primary",children:(0,f.__)("Retry","tracksure")})]})})}):n?(0,a.jsxs)("div",{className:"ts-goals-overview",children:[(0,a.jsxs)("div",{className:"ts-goals-overview__kpis",children:[(0,a.jsx)(p.l,{metric:{label:(0,f.__)("All Conversions","tracksure"),value:n.total_conversions,format:"number",change:l?.percentage||0}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Conversion Value","tracksure"),value:n.total_value,format:"currency",change:d?.percentage||0}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Avg Conversion Rate","tracksure"),value:n.conversion_rate,format:"percent",change:c?.percentage||0}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Active Goals","tracksure"),value:n.active_goals,format:"number"}})]}),n.daily_conversions&&n.daily_conversions.length>0&&(0,a.jsxs)(C.Zp,{className:"ts-goals-overview__chart",children:[(0,a.jsxs)(C.aR,{children:[(0,a.jsx)("h3",{children:(0,f.__)("Conversions Trend","tracksure")}),(0,a.jsx)("span",{className:"ts-card-header__subtitle",children:(0,f.__)("Last 30 days","tracksure")})]}),(0,a.jsx)(C.bw,{children:(0,a.jsx)("div",{className:"ts-simple-chart",children:(0,a.jsx)("div",{className:"ts-simple-chart__bars",children:(()=>{const r=Math.max(...n.daily_conversions.map(r=>r.conversions));return n.daily_conversions.map((n,e)=>{const t=r>0?n.conversions/r*100:0;return(0,a.jsxs)("div",{className:"ts-simple-chart__bar-wrapper",children:[(0,a.jsx)("div",{className:"ts-simple-chart__bar",style:{height:`${t}%`},title:`${n.date}: ${n.conversions} conversions`,children:(0,a.jsx)("span",{className:"ts-simple-chart__bar-value",children:n.conversions})}),(0,a.jsx)("span",{className:"ts-simple-chart__bar-label",children:new Date(n.date+"T00:00:00").toLocaleDateString(void 0,{month:"short",day:"numeric"})})]},e)})})()})})})]}),n.top_goals&&n.top_goals.length>0&&(0,a.jsxs)(C.Zp,{className:"ts-goals-overview__top-goals",children:[(0,a.jsxs)(C.aR,{children:[(0,a.jsx)("h3",{children:(0,f.__)("Top Performing Goals","tracksure")}),(0,a.jsx)("span",{className:"ts-card-header__subtitle",children:(0,f.__)("By conversion count","tracksure")})]}),(0,a.jsx)(C.bw,{children:(0,a.jsx)("div",{className:"ts-top-goals-list",children:n.top_goals.slice(0,5).map((r,n)=>(0,a.jsxs)("div",{className:"ts-top-goal",children:[(0,a.jsxs)("div",{className:"ts-top-goal__rank",children:["#",n+1]}),(0,a.jsxs)("div",{className:"ts-top-goal__info",children:[(0,a.jsx)("div",{className:"ts-top-goal__name",children:r.name}),(0,a.jsx)("div",{className:"ts-top-goal__type",children:r.trigger_type})]}),(0,a.jsxs)("div",{className:"ts-top-goal__metrics",children:[(0,a.jsxs)("div",{className:"ts-top-goal__conversions",children:[(0,a.jsx)(m.I,{name:"CheckCircle",size:16}),r.conversions.toLocaleString()]}),r.value>0&&(0,a.jsx)("div",{className:"ts-top-goal__value",children:(0,P.vv)(r.value)})]})]},r.goal_id))})})]}),0===n.total_conversions&&(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-empty-state",children:[(0,a.jsx)(m.I,{name:"Inbox",size:64,color:"var(--ts-text-muted)"}),(0,a.jsx)("h3",{children:(0,f.__)("No conversions yet","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Start tracking conversions by creating your first goal.","tracksure")})]})})})]}):null};var pr=e(76840),gr={};gr.styleTagTransform=q(),gr.setAttributes=I(),gr.insert=z().bind(null,"head"),gr.domAPI=w(),gr.insertStyleElement=T();_()(pr.A,gr);pr.A&&pr.A.locals&&pr.A.locals;const mr=()=>{const{config:r,dateRange:n}=(0,o.n)(),[e,v]=(0,t.useState)("overview"),[h,b]=(0,t.useState)("list"),[B,k]=(0,t.useState)("all"),[_,y]=(0,t.useState)(""),[w,j]=(0,t.useState)(!1),[z,N]=(0,t.useState)(null),[I,S]=(0,t.useState)(null),[T,D]=(0,t.useState)([]),[q,Y]=(0,t.useState)(!1),[F,R]=(0,t.useState)({search:"",category:"all",triggerType:"all",status:"all",sortBy:"name",sortOrder:"asc"}),[W,L]=(0,t.useState)(null),[U,O]=(0,t.useState)(null),[Z,V]=(0,t.useState)(null),{data:$,isLoading:X,error:Q,refetch:H}=(0,s.S)("getGoals",{},{refetchInterval:void 0,retry:2,onError:r=>{}}),J=(0,t.useMemo)(()=>$?.goals||[],[$]),rr=J.map(r=>r.goal_id).join(","),nr=(0,t.useMemo)(()=>({goal_ids:rr,date_start:(0,P.TJ)(n.start),date_end:(0,P.TJ)(n.end)}),[rr,n]),{data:ar}=(0,s.S)("getGoalsPerformance",nr,{enabled:J.length>0&&rr.length>0,refetchInterval:void 0,retry:2,onError:r=>{}}),tr=(0,t.useMemo)(()=>ar?.performance||{},[ar]),sr=Q?Q.message:null,ir=async n=>{try{const a=function(r){const n=[];return r.name&&""!==r.name.trim()||n.push("Goal name is required"),r.event_name&&""!==r.event_name.trim()||n.push("Event name is required"),r.trigger_type?A.includes(r.trigger_type)||n.push(`Invalid trigger type: ${r.trigger_type}. Allowed: ${A.join(", ")}`):n.push("Trigger type is required"),r.conditions&&Array.isArray(r.conditions)&&r.conditions.forEach((r,e)=>{const a=e+1;if(r.param&&""!==r.param.trim()||n.push(`Condition #${a}: Parameter (param) is required`),r.operator?l.includes(r.operator)||n.push(`Condition #${a}: Invalid operator '${r.operator}'. Allowed: ${l.join(", ")}`):n.push(`Condition #${a}: Operator is required`),void 0!==r.value&&""!==r.value||n.push(`Condition #${a}: Value is required`),"matches_regex"===r.operator)try{new RegExp(String(r.value))}catch(e){n.push(`Condition #${a}: Invalid regex pattern: ${r.value}`)}}),r.match_logic&&!["all","any"].includes(r.match_logic)&&n.push(`Match logic must be 'all' or 'any', got: ${r.match_logic}`),r.value_type&&!d.includes(r.value_type)&&n.push(`Invalid value_type. Must be: ${d.join(", ")}`),"fixed"===r.value_type&&(void 0===r.value||null===r.value?n.push('Fixed value is required when value_type is "fixed"'):isNaN(Number(r.value))&&n.push("Fixed value must be a number")),r.frequency&&!c.includes(r.frequency)&&n.push(`Invalid frequency. Must be: ${c.join(", ")}`),{valid:0===n.length,errors:n}}(n);if(!a.valid){const r=0===(e=a.errors).length?"":1===e.length?e[0]:`Please fix the following errors:\n• ${e.join("\n• ")}`;throw new Error("Goal validation failed:\n\n"+r)}const t=new i.n(r);if("edit"===W&&Z){const r=Z.goal_id;await t.put(`/goals/${r}`,n)}else await t.post("/goals",n);H(),L(null),O(null),V(null),b("list")}catch(r){throw r}var e},lr=()=>{let r=[];return r="all"===B?E:x(B),_?(r=>{const n=r.toLowerCase();return E.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n))})(_):r},dr=(0,t.useMemo)(()=>{let r=[...J];if(F.search){const n=F.search.toLowerCase();r=r.filter(r=>r.name&&r.name.toLowerCase().includes(n)||r.description&&r.description.toLowerCase().includes(n))}return"all"!==F.category&&(r=r.filter(r=>r.category===F.category)),"all"!==F.triggerType&&(r=r.filter(r=>r.trigger_type===F.triggerType)),"all"!==F.status&&(r=r.filter(r=>r.is_active===("active"===F.status))),r.sort((r,n)=>{let e=0;switch(F.sortBy){case"name":e=(r.name||"").localeCompare(n.name||"");break;case"created_at":e=new Date(r.created_at.replace(" ","T")+"Z").getTime()-new Date(n.created_at.replace(" ","T")+"Z").getTime();break;case"conversions":e=(tr[r.goal_id]?.conversions||0)-(tr[n.goal_id]?.conversions||0);break}return"asc"===F.sortOrder?e:-e}),r},[J,F,tr]),pr=()=>{R({search:"",category:"all",triggerType:"all",status:"all",sortBy:"name",sortOrder:"asc"})};return(0,a.jsxs)("div",{className:"ts-goals-page",children:[(0,a.jsxs)("div",{className:"ts-goals-header",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"ts-page-title",children:(0,f.__)("Goals","tracksure")}),(0,a.jsx)("p",{className:"ts-page-subtitle",children:(0,f.__)("Track conversions and measure what matters most","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-goals-header-actions",children:["goals"===e&&"list"===h&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(C.$n,{variant:"ghost",onClick:()=>Y(!0),icon:(0,a.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M10 14V6M10 6L7 9M10 6L13 9M4 16h12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),children:(0,f.__)("Import Goals","tracksure")}),(0,a.jsx)(C.$n,{variant:"outline",onClick:()=>{v("templates"),b("templates")},icon:(0,a.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M4 6h12M4 10h12M4 14h12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),children:(0,f.__)("Browse Templates","tracksure")}),(0,a.jsx)(C.$n,{variant:"primary",onClick:()=>b("custom-builder"),icon:(0,a.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M10 5v10M5 10h10",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),children:(0,f.__)("Create Custom Goal","tracksure")})]}),"list"!==h&&(0,a.jsx)(C.$n,{variant:"ghost",onClick:()=>{b("list"),v("goals")},children:(0,f.__)("← Back to Goals","tracksure")})]})]}),(0,a.jsxs)("div",{className:"ts-goals-tabs",children:[(0,a.jsxs)("button",{className:"ts-goals-tab "+("overview"===e?"ts-goals-tab--active":""),onClick:()=>{v("overview"),b("list")},children:[(0,a.jsx)(m.I,{name:"BarChart3",size:18}),(0,f.__)("Overview","tracksure")]}),(0,a.jsxs)("button",{className:"ts-goals-tab "+("goals"===e?"ts-goals-tab--active":""),onClick:()=>{v("goals"),b("list")},children:[(0,a.jsx)(m.I,{name:"Target",size:18}),(0,f.__)("All Goals","tracksure"),J.length>0&&(0,a.jsx)(C.Ex,{variant:"default",size:"sm",children:J.length})]}),(0,a.jsxs)("button",{className:"ts-goals-tab "+("templates"===e?"ts-goals-tab--active":""),onClick:()=>{v("templates"),b("templates")},children:[(0,a.jsx)(m.I,{name:"LayoutTemplate",size:18}),(0,f.__)("Templates","tracksure")]})]}),sr&&(0,a.jsxs)("div",{className:"ts-error-banner",children:[(0,a.jsx)(m.I,{name:"AlertTriangle",size:20,color:"warning"}),(0,a.jsx)("p",{children:sr})]}),"overview"===e&&(0,a.jsx)(cr,{}),"goals"===e&&(0,a.jsxs)(a.Fragment,{children:["list"===h&&(()=>{if(X)return(0,a.jsxs)("div",{className:"ts-goals-loading",children:[(0,a.jsx)("div",{className:"ts-goals-summary",children:[1,2,3].map(r=>(0,a.jsx)(g.or,{},r))}),(0,a.jsx)("div",{className:"ts-goals-table",children:(0,a.jsx)(g.cU,{rows:6,columns:5})})]});if(0===J.length)return(0,a.jsxs)("div",{className:"ts-empty-state",children:[(0,a.jsx)("div",{className:"ts-empty-icon",children:(0,a.jsx)(m.I,{name:"Target",size:64,color:"muted"})}),(0,a.jsx)("h2",{children:(0,f.__)("No goals yet","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Start tracking conversions by creating your first goal from a template or building a custom one.","tracksure")}),(0,a.jsxs)("div",{style:{display:"flex",gap:"12px",justifyContent:"center",marginTop:"16px"},children:[(0,a.jsx)(C.$n,{variant:"primary",onClick:()=>b("templates"),children:(0,f.__)("Browse Templates","tracksure")}),(0,a.jsx)(C.$n,{variant:"outline",onClick:()=>b("custom-builder"),children:(0,f.__)("Create Custom Goal","tracksure")})]})]});if(0===dr.length&&J.length>0)return(0,a.jsxs)("div",{style:{textAlign:"center",padding:"40px 20px"},children:[(0,a.jsx)("h2",{children:(0,f.__)("No Goals Found","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Try adjusting your filters or search query.","tracksure")}),(0,a.jsx)(C.$n,{onClick:pr,children:(0,f.__)("Clear Filters","tracksure")})]});const n=dr.filter(r=>r.is_active),e=n.reduce((r,n)=>{const e=tr[n.goal_id];return r+(e?.conversions||0)},0),t=n.reduce((r,n)=>{const e=tr[n.goal_id];return r+(e?.revenue||0)},0),o=n.filter(r=>"none"!==r.value_type).length,s=n.length>0?n.reduce((r,n)=>{const e=tr[n.goal_id];return r+(e?.conversion_rate||0)},0)/n.length:0;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"ts-goals-summary ts-goals-summary-row",children:[(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Total Achievements","tracksure"),value:e,format:"number"}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Active Goals","tracksure"),value:n.length,format:"number"}}),(0,a.jsx)(p.l,{metric:{label:t>0?(0,f.__)("Total Value","tracksure"):(0,f.__)("Goals with Value","tracksure"),value:t>0?t:o,format:t>0?"currency":"number",currency:(0,P._1)()}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Avg Conversion Rate","tracksure"),value:s,format:"percent"}})]}),(0,a.jsx)(or,{filters:F,onFiltersChange:R,onReset:pr}),(0,a.jsx)(er,{selectedGoals:T,allGoals:dr,onActionComplete:H,onSelectionChange:D}),0===dr.length?(0,a.jsxs)("div",{className:"ts-empty-state",children:[(0,a.jsx)("div",{className:"ts-empty-icon",children:(0,a.jsx)(m.I,{name:"Search",size:64,color:"muted"})}),(0,a.jsx)("h2",{children:(0,f.__)("No Goals Found","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Try adjusting your filters or search query.","tracksure")}),(0,a.jsx)(C.$n,{variant:"outline",onClick:pr,children:(0,f.__)("Clear Filters","tracksure")})]}):(0,a.jsx)("div",{className:"ts-goals-grid",children:dr.map(n=>{const e=tr[n.goal_id],t=T.includes(n.goal_id);return(0,a.jsxs)("div",{className:"ts-goal-card "+(t?"ts-goal-card-selected":""),children:[(0,a.jsx)("div",{className:"ts-goal-checkbox",children:(0,a.jsx)("input",{type:"checkbox",checked:t,onChange:r=>{r.target.checked?D([...T,n.goal_id]):D(T.filter(r=>r!==n.goal_id))}})}),(0,a.jsxs)("div",{className:"ts-goal-header",children:[(0,a.jsxs)("div",{className:"ts-goal-title-section",children:[(0,a.jsxs)("div",{className:"ts-goal-title-row",children:[(0,a.jsx)("h3",{className:"ts-goal-name",children:n.name}),(0,a.jsx)("span",{className:"ts-goal-status "+(n.is_active?"ts-active":"ts-inactive"),children:n.is_active?(0,f.__)("Active","tracksure"):(0,f.__)("Inactive","tracksure")})]}),(0,a.jsx)("p",{className:"ts-goal-description",children:n.description})]}),(0,a.jsxs)("div",{className:"ts-goal-actions",children:[(0,a.jsx)("button",{className:"ts-btn-icon",onClick:()=>{L("edit"),V(n)},title:(0,f.__)("Edit goal","tracksure"),children:(0,a.jsx)(m.I,{name:"Edit2",size:16})}),(0,a.jsx)("button",{className:"ts-btn-icon",onClick:()=>(async n=>{try{const e=new i.n(r);await e.put(`/goals/${n.goal_id}`,{is_active:n.is_active?0:1}),H()}catch(r){throw r}})(n),title:n.is_active?(0,f.__)("Deactivate","tracksure"):(0,f.__)("Activate","tracksure"),children:(0,a.jsx)(m.I,{name:n.is_active?"Pause":"Play",size:16})}),(0,a.jsx)("button",{className:"ts-btn-icon ts-btn-danger",onClick:()=>{N(n),j(!0)},title:(0,f.__)("Delete goal","tracksure"),children:(0,a.jsx)(m.I,{name:"Trash2",size:16,color:"danger"})})]})]}),(0,a.jsx)("div",{className:"ts-goal-details",children:(0,a.jsxs)("div",{className:"ts-goal-meta",children:[(0,a.jsxs)("span",{className:"ts-goal-event",children:[(0,a.jsx)(m.I,{name:"BarChart2",size:16})," ",n.event_name]}),n.conditions.length>0&&(0,a.jsxs)("span",{className:"ts-goal-conditions",children:[(0,a.jsx)(m.I,{name:"Target",size:16})," ",n.conditions.length," ",1===n.conditions.length?(0,f.__)("condition","tracksure"):(0,f.__)("conditions","tracksure")]})]})}),e&&(0,a.jsxs)("div",{className:"ts-goal-performance",children:[(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Conversions","tracksure")}),(0,a.jsx)("span",{className:"ts-goal-stat-value",children:e.conversions.toLocaleString()})]}),"none"!==n.value_type&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Revenue","tracksure")}),(0,a.jsx)("span",{className:"ts-goal-stat-value",children:(0,P.vv)(e.revenue)})]}),(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Avg. Value","tracksure")}),(0,a.jsx)("span",{className:"ts-goal-stat-value",children:(0,P.vv)(e.avg_value)})]})]}),(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Conv. Rate","tracksure")}),(0,a.jsxs)("span",{className:"ts-goal-stat-value",children:[e.conversion_rate.toFixed(2),"%"]})]})]}),e&&e.conversions>0&&(0,a.jsxs)("button",{className:"ts-goal-view-details",onClick:()=>{S(n)},children:[(0,a.jsx)(m.I,{name:"Eye",size:14}),(0,f.__)("View Details","tracksure")]})]},n.goal_id)})})]})})(),"custom-builder"===h&&null]}),"templates"===e&&(()=>{const r=lr();return(0,a.jsxs)("div",{className:"ts-templates-view",children:[(0,a.jsx)(C.Zp,{className:"ts-templates-filters",children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-filters-row",children:[(0,a.jsx)(C.l6,{label:(0,f.__)("Goal Category","tracksure"),value:B,onChange:r=>k(r.target.value),options:[{value:"all",label:(0,f.__)("All Categories","tracksure")},...Object.values(u).map(r=>({value:r.id,label:r.label}))],fullWidth:!0}),(0,a.jsx)(C.pd,{placeholder:(0,f.__)("Search templates...","tracksure"),value:_,onChange:r=>y(r.target.value),icon:(0,a.jsx)("svg",{width:"18",height:"18",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M9 17A8 8 0 109 1a8 8 0 000 16zM19 19l-4.35-4.35",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),fullWidth:!0})]})})}),(0,a.jsx)("div",{className:"ts-templates-grid",children:r.map(r=>(0,a.jsx)(C.Zp,{variant:"elevated",hoverable:!0,className:"ts-template-card",children:(0,a.jsxs)(C.bw,{children:[(0,a.jsx)("div",{className:"ts-template-icon",children:(0,a.jsx)(m.I,{name:r.icon,size:32,color:"primary"})}),(0,a.jsx)("h3",{className:"ts-template-name",children:r.name}),(0,a.jsx)("p",{className:"ts-template-description",children:r.description}),(0,a.jsxs)("div",{className:"ts-template-meta",children:[(0,a.jsx)(C.Ex,{variant:"default",size:"sm",children:r.event_name}),(0,a.jsx)(C.Ex,{variant:"leads"===r.category?"success":"ecommerce"===r.category?"info":"default",size:"sm",children:r.category})]}),(0,a.jsx)(C.$n,{variant:"primary",fullWidth:!0,onClick:()=>{L("create-from-template"),O(r)},className:"ts-template-add-btn",children:(0,f.__)("Customize & Add","tracksure")})]})},r.id))}),0===r.length&&(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsx)(C.pp,{icon:"Search",title:(0,f.__)("No templates found","tracksure"),message:(0,f.__)("Try adjusting your filters or search query.","tracksure")})})})]})})(),I&&(0,a.jsx)(M,{goal:I,onClose:()=>{S(null)}}),W&&(0,a.jsx)(G,{isOpen:!0,onClose:()=>{L(null),O(null),V(null)},onSave:ir,mode:W,template:U||void 0,existingGoal:Z||void 0}),"custom-builder"===h&&(0,a.jsx)(K,{isOpen:!0,onClose:()=>b("list"),onSave:r=>{ir(r),b("list")},onSaveAsTemplate:r=>{}}),(0,a.jsxs)(C.aF,{isOpen:w,onClose:()=>{j(!1),N(null)},title:(0,f.__)("Delete Goal","tracksure"),size:"sm",footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(C.$n,{variant:"ghost",onClick:()=>{j(!1),N(null)},children:(0,f.__)("Cancel","tracksure")}),(0,a.jsx)(C.$n,{variant:"danger",onClick:()=>z&&(async n=>{try{const e=new i.n(r);await e.delete(`/goals/${n.goal_id}`),H(),j(!1),N(null)}catch(r){}})(z),children:(0,f.__)("Delete","tracksure")})]}),children:[(0,a.jsxs)("p",{children:[(0,f.__)("Are you sure you want to delete","tracksure")," ",(0,a.jsx)("strong",{children:z?.name}),"?"]}),(0,a.jsx)("p",{style:{marginTop:"12px",color:"var(--ts-text-secondary)"},children:(0,f.__)("This action cannot be undone.","tracksure")})]}),q&&(0,a.jsx)("div",{className:"ts-modal-overlay",onClick:()=>Y(!1),children:(0,a.jsx)("div",{onClick:r=>r.stopPropagation(),children:(0,a.jsx)(Ar,{onImport:async n=>{const e=new i.n(r);for(const r of n)await e.post("/goals",r);H()},onClose:()=>Y(!1)})})})]})}},51768:(r,n,e)=>{e.d(n,{A:()=>p});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o),i=e(4417),A=e.n(i),l=new URL(e(9570),e.b),d=s()(t()),c=A()(l);d.push([r.id,`/**\n * Goal Details Modal Styles\n * Enhanced with tab navigation and analytics views\n * \n * @since 2.1.0\n * @package TrackSure\n */\n\n/* Main Container */\n.ts-goal-details-modal {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 600px;\n}\n\n/* Modal Subtitle */\n.ts-modal-subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n font-weight: 400;\n color: var(--text-tertiary);\n opacity: 0.8;\n}\n\n/* Tab Navigation */\n.ts-modal-tabs {\n display: flex;\n gap: 0;\n border-bottom: 1px solid var(--border-color);\n margin-bottom: 20px;\n padding: 0 4px;\n}\n\n.ts-modal-tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 20px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--text-secondary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n bottom: -1px;\n}\n\n.ts-modal-tab:hover {\n color: var(--text-primary);\n background: var(--background-secondary);\n}\n\n.ts-modal-tab--active {\n color: var(--primary);\n border-bottom-color: var(--primary);\n font-weight: 600;\n}\n\n.ts-modal-tab--active:hover {\n background: transparent;\n}\n\n/* Tab Content */\n.ts-modal-tab-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Overview Tab */\n.ts-goal-overview-tab {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.ts-overview-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.ts-metric {\n text-align: center;\n padding: 8px 0;\n}\n\n.ts-metric-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 8px;\n}\n\n.ts-metric .ts-metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary);\n line-height: 1.2;\n}\n\n.ts-top-pages {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.ts-top-page {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 12px;\n background: var(--background-secondary);\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.ts-top-page:hover {\n background: var(--background-tertiary);\n transform: translateX(4px);\n}\n\n.ts-top-page-rank {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--primary);\n color: white;\n border-radius: 50%;\n font-size: 14px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n.ts-top-page-url {\n flex: 1;\n min-width: 0;\n}\n\n.ts-top-page-url a {\n color: var(--text-primary);\n text-decoration: none;\n font-size: 14px;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ts-top-page-url a:hover {\n color: var(--primary);\n text-decoration: underline;\n}\n\n.ts-top-page-conversions {\n flex-shrink: 0;\n}\n\n/* Timeline Tab */\n.ts-modal-filters {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: var(--background-secondary);\n border-radius: 8px;\n}\n\n.ts-filter-group {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.ts-filter-group label {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-secondary);\n white-space: nowrap;\n}\n\n.ts-filter-select {\n padding: 6px 32px 6px 12px;\n border: 1px solid var(--border-color);\n border-radius: 6px;\n background: var(--background-primary);\n color: var(--text-primary);\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n appearance: none;\n background-image: url(${c});\n background-repeat: no-repeat;\n background-position: right 8px center;\n}\n\n.ts-filter-select:hover {\n border-color: var(--primary);\n}\n\n.ts-filter-select:focus {\n outline: none;\n border-color: var(--primary);\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\n}\n\n.ts-export-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: var(--primary);\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.ts-export-btn:hover {\n background: var(--primary-dark);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px var(--primary-alpha-20);\n}\n\n.ts-modal-content {\n flex: 1;\n overflow: auto;\n margin-bottom: 16px;\n}\n\n.ts-table-scroll {\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid var(--border-color);\n}\n\n.ts-conversions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-conversions-table thead {\n background: var(--background-secondary);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.ts-conversions-table thead th {\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--text-secondary);\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.05em;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition: background 0.2s ease;\n}\n\n.ts-conversions-table thead th:hover {\n background: var(--background-tertiary);\n}\n\n.ts-conversions-table thead th.ts-sorted {\n color: var(--primary);\n}\n\n.ts-conversions-table tbody tr {\n border-bottom: 1px solid var(--border-color);\n transition: background 0.15s ease;\n}\n\n.ts-conversions-table tbody tr:hover {\n background: var(--background-secondary);\n}\n\n.ts-conversions-table tbody td {\n padding: 12px;\n color: var(--text-primary);\n}\n\n.ts-date-cell {\n white-space: nowrap;\n color: var(--text-secondary);\n font-size: 12px;\n}\n\n.ts-url-cell {\n max-width: 300px;\n}\n\n.ts-url-link {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--primary);\n text-decoration: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ts-url-link:hover {\n text-decoration: underline;\n}\n\n.ts-url-empty,\n.ts-context-empty {\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.ts-context-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n background: var(--background-secondary);\n border-radius: 4px;\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.ts-source-info strong {\n color: var(--text-primary);\n font-weight: 600;\n}\n\n.ts-medium {\n color: var(--text-secondary);\n font-size: 12px;\n}\n\n.ts-campaign {\n font-size: 11px;\n color: var(--text-tertiary);\n margin-top: 2px;\n}\n\n.ts-device-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--background-secondary);\n border-radius: 12px;\n font-size: 12px;\n color: var(--text-secondary);\n text-transform: capitalize;\n}\n\n.ts-value-cell {\n font-weight: 600;\n color: var(--success);\n white-space: nowrap;\n}\n\n/* Pagination */\n.ts-modal-pagination {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n padding: 12px 16px;\n background: var(--background-secondary);\n border-radius: 8px;\n margin-top: auto;\n}\n\n.ts-page-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n background: var(--background-primary);\n border: 1px solid var(--border-color);\n border-radius: 6px;\n color: var(--text-primary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ts-page-btn:hover:not(:disabled) {\n background: var(--background-tertiary);\n border-color: var(--primary);\n color: var(--primary);\n}\n\n.ts-page-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.ts-page-info {\n font-size: 13px;\n color: var(--text-secondary);\n}\n\n/* Sources Tab */\n.ts-sources-tab {\n overflow: auto;\n}\n\n.ts-sources-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-sources-table thead {\n background: var(--background-secondary);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.ts-sources-table thead th {\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--text-secondary);\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.05em;\n}\n\n.ts-sources-table tbody tr {\n border-bottom: 1px solid var(--border-color);\n transition: background 0.15s ease;\n}\n\n.ts-sources-table tbody tr:hover {\n background: var(--background-secondary);\n}\n\n.ts-sources-table tbody td {\n padding: 12px;\n}\n\n.ts-source-name {\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.ts-source-medium {\n color: var(--text-secondary);\n font-size: 12px;\n}\n\n.ts-source-conversions {\n font-weight: 600;\n color: var(--primary);\n}\n\n.ts-source-percentage {\n min-width: 200px;\n}\n\n.ts-progress-bar {\n display: inline-block;\n width: 100px;\n height: 6px;\n background: var(--background-secondary);\n border-radius: 3px;\n overflow: hidden;\n margin-right: 12px;\n vertical-align: middle;\n}\n\n.ts-progress-fill {\n height: 100%;\n background: linear-gradient(90deg, var(--primary), var(--primary-dark));\n border-radius: 3px;\n transition: width 0.3s ease;\n}\n\n.ts-source-revenue {\n font-weight: 600;\n color: var(--success);\n white-space: nowrap;\n}\n\n/* Devices Tab */\n.ts-devices-tab {\n overflow: auto;\n}\n\n.ts-devices-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-devices-table thead {\n background: var(--background-secondary);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.ts-devices-table thead th {\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--text-secondary);\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.05em;\n}\n\n.ts-devices-table tbody tr {\n border-bottom: 1px solid var(--border-color);\n transition: background 0.15s ease;\n}\n\n.ts-devices-table tbody tr:hover {\n background: var(--background-secondary);\n}\n\n.ts-devices-table tbody td {\n padding: 12px;\n}\n\n.ts-device-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--text-primary);\n text-transform: capitalize;\n}\n\n.ts-device-browser {\n color: var(--text-secondary);\n}\n\n.ts-device-conversions {\n font-weight: 600;\n color: var(--primary);\n}\n\n.ts-device-percentage {\n min-width: 200px;\n}\n\n/* Loading & Empty States */\n.ts-loading,\n.ts-error,\n.ts-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 20px;\n text-align: center;\n color: var(--text-secondary);\n}\n\n.ts-loading svg,\n.ts-error svg,\n.ts-empty svg {\n color: var(--text-tertiary);\n opacity: 0.4;\n animation: pulse 2s ease-in-out infinite;\n}\n\n.ts-loading svg {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 0.3;\n }\n 50% {\n opacity: 0.6;\n }\n}\n\n.ts-error {\n color: var(--danger);\n}\n\n/* Dark Theme */\n[data-theme="dark"] {\n .ts-modal-tabs {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-modal-tab {\n color: var(--text-dark-secondary);\n }\n\n .ts-modal-tab:hover {\n color: var(--text-dark-primary);\n background: var(--background-dark-secondary);\n }\n\n .ts-modal-tab--active {\n color: var(--primary-light);\n border-bottom-color: var(--primary-light);\n }\n\n .ts-metric-label {\n color: var(--text-dark-tertiary);\n }\n\n .ts-metric-value {\n color: var(--text-dark-primary);\n }\n\n .ts-top-page {\n background: var(--background-dark-secondary);\n }\n\n .ts-top-page:hover {\n background: var(--background-dark-tertiary);\n }\n\n .ts-top-page-url a {\n color: var(--text-dark-primary);\n }\n\n .ts-top-page-url a:hover {\n color: var(--primary-light);\n }\n\n .ts-modal-filters {\n background: var(--background-dark-secondary);\n }\n\n .ts-filter-group label {\n color: var(--text-dark-secondary);\n }\n\n .ts-filter-select {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n color: var(--text-dark-primary);\n }\n\n .ts-filter-select:hover {\n border-color: var(--primary-light);\n }\n\n .ts-export-btn {\n background: var(--primary-dark);\n }\n\n .ts-export-btn:hover {\n background: var(--primary);\n }\n\n .ts-table-scroll {\n border-color: var(--border-dark);\n }\n\n .ts-conversions-table thead {\n background: var(--background-dark-secondary);\n }\n\n .ts-conversions-table thead th {\n color: var(--text-dark-secondary);\n }\n\n .ts-conversions-table thead th.ts-sorted {\n color: var(--primary-light);\n }\n\n .ts-conversions-table tbody tr {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-conversions-table tbody tr:hover {\n background: var(--background-dark-secondary);\n }\n\n .ts-conversions-table tbody td {\n color: var(--text-dark-primary);\n }\n\n .ts-url-link {\n color: var(--primary-light);\n }\n\n .ts-context-badge {\n background: var(--background-dark-secondary);\n color: var(--text-dark-secondary);\n }\n\n .ts-device-badge {\n background: var(--background-dark-secondary);\n color: var(--text-dark-secondary);\n }\n\n .ts-modal-pagination {\n background: var(--background-dark-secondary);\n }\n\n .ts-page-btn {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n color: var(--text-dark-primary);\n }\n\n .ts-page-btn:hover:not(:disabled) {\n background: var(--background-dark-tertiary);\n border-color: var(--primary-light);\n color: var(--primary-light);\n }\n\n .ts-page-info {\n color: var(--text-dark-secondary);\n }\n\n .ts-sources-table thead,\n .ts-devices-table thead {\n background: var(--background-dark-secondary);\n }\n\n .ts-sources-table thead th,\n .ts-devices-table thead th {\n color: var(--text-dark-secondary);\n }\n\n .ts-sources-table tbody tr,\n .ts-devices-table tbody tr {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-sources-table tbody tr:hover,\n .ts-devices-table tbody tr:hover {\n background: var(--background-dark-secondary);\n }\n\n .ts-source-name,\n .ts-device-name {\n color: var(--text-dark-primary);\n }\n\n .ts-source-medium,\n .ts-device-browser {\n color: var(--text-dark-secondary);\n }\n\n .ts-source-conversions,\n .ts-device-conversions {\n color: var(--primary-light);\n }\n\n .ts-progress-bar {\n background: var(--background-dark-secondary);\n }\n\n .ts-progress-fill {\n background: linear-gradient(90deg, var(--primary-light), var(--primary));\n }\n\n .ts-loading,\n .ts-error,\n .ts-empty {\n color: var(--text-dark-secondary);\n }\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .ts-modal-tabs {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n\n .ts-modal-tab {\n padding: 10px 16px;\n font-size: 13px;\n }\n\n .ts-overview-metrics {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .ts-modal-filters {\n flex-direction: column;\n align-items: stretch;\n }\n\n .ts-filter-group {\n flex-direction: column;\n align-items: stretch;\n }\n\n .ts-export-btn {\n width: 100%;\n justify-content: center;\n }\n\n .ts-table-scroll {\n font-size: 12px;\n }\n\n .ts-conversions-table thead th,\n .ts-sources-table thead th,\n .ts-devices-table thead th {\n padding: 8px;\n font-size: 10px;\n }\n\n .ts-conversions-table tbody td,\n .ts-sources-table tbody td,\n .ts-devices-table tbody td {\n padding: 8px;\n }\n\n .ts-modal-pagination {\n flex-direction: column;\n gap: 12px;\n }\n\n .ts-page-info {\n font-size: 12px;\n text-align: center;\n }\n\n .ts-top-page {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .ts-top-page-url {\n width: 100%;\n }\n\n .ts-source-percentage,\n .ts-device-percentage {\n min-width: 150px;\n }\n\n .ts-progress-bar {\n width: 60px;\n }\n}\n\n/* Accessibility */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n@media (prefers-contrast: high) {\n .ts-modal-tab--active {\n border-bottom-width: 3px;\n }\n\n .ts-progress-fill {\n background: var(--primary);\n }\n\n .ts-url-link {\n text-decoration: underline;\n }\n}\n`,"",{version:3,sources:["webpack://./src/components/goals/components/GoalDetailsModal.css"],names:[],mappings:"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",sourcesContent:["/**\r\n * Goal Details Modal Styles\r\n * Enhanced with tab navigation and analytics views\r\n * \r\n * @since 2.1.0\r\n * @package TrackSure\r\n */\r\n\r\n/* Main Container */\r\n.ts-goal-details-modal {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n min-height: 600px;\r\n}\r\n\r\n/* Modal Subtitle */\r\n.ts-modal-subtitle {\r\n margin: 4px 0 0;\r\n font-size: 13px;\r\n font-weight: 400;\r\n color: var(--text-tertiary);\r\n opacity: 0.8;\r\n}\r\n\r\n/* Tab Navigation */\r\n.ts-modal-tabs {\r\n display: flex;\r\n gap: 0;\r\n border-bottom: 1px solid var(--border-color);\r\n margin-bottom: 20px;\r\n padding: 0 4px;\r\n}\r\n\r\n.ts-modal-tab {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 12px 20px;\r\n background: transparent;\r\n border: none;\r\n border-bottom: 2px solid transparent;\r\n color: var(--text-secondary);\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n position: relative;\r\n bottom: -1px;\r\n}\r\n\r\n.ts-modal-tab:hover {\r\n color: var(--text-primary);\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-modal-tab--active {\r\n color: var(--primary);\r\n border-bottom-color: var(--primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-modal-tab--active:hover {\r\n background: transparent;\r\n}\r\n\r\n/* Tab Content */\r\n.ts-modal-tab-content {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n}\r\n\r\n/* Overview Tab */\r\n.ts-goal-overview-tab {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 20px;\r\n}\r\n\r\n.ts-overview-metrics {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: 16px;\r\n}\r\n\r\n.ts-metric {\r\n text-align: center;\r\n padding: 8px 0;\r\n}\r\n\r\n.ts-metric-label {\r\n font-size: 12px;\r\n font-weight: 500;\r\n color: var(--text-tertiary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.ts-metric .ts-metric-value {\r\n font-size: 28px;\r\n font-weight: 700;\r\n color: var(--text-primary);\r\n line-height: 1.2;\r\n}\r\n\r\n.ts-top-pages {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.ts-top-page {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n padding: 12px;\r\n background: var(--background-secondary);\r\n border-radius: 8px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-top-page:hover {\r\n background: var(--background-tertiary);\r\n transform: translateX(4px);\r\n}\r\n\r\n.ts-top-page-rank {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n background: var(--primary);\r\n color: white;\r\n border-radius: 50%;\r\n font-size: 14px;\r\n font-weight: 700;\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-top-page-url {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-top-page-url a {\r\n color: var(--text-primary);\r\n text-decoration: none;\r\n font-size: 14px;\r\n display: block;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-top-page-url a:hover {\r\n color: var(--primary);\r\n text-decoration: underline;\r\n}\r\n\r\n.ts-top-page-conversions {\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Timeline Tab */\r\n.ts-modal-filters {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 16px;\r\n margin-bottom: 16px;\r\n padding: 12px 16px;\r\n background: var(--background-secondary);\r\n border-radius: 8px;\r\n}\r\n\r\n.ts-filter-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n}\r\n\r\n.ts-filter-group label {\r\n font-size: 13px;\r\n font-weight: 500;\r\n color: var(--text-secondary);\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-filter-select {\r\n padding: 6px 32px 6px 12px;\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n background: var(--background-primary);\r\n color: var(--text-primary);\r\n font-size: 13px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n appearance: none;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L2 4h8z'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 8px center;\r\n}\r\n\r\n.ts-filter-select:hover {\r\n border-color: var(--primary);\r\n}\r\n\r\n.ts-filter-select:focus {\r\n outline: none;\r\n border-color: var(--primary);\r\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-export-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 14px;\r\n background: var(--primary);\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n font-size: 13px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-export-btn:hover {\r\n background: var(--primary-dark);\r\n transform: translateY(-1px);\r\n box-shadow: 0 2px 8px var(--primary-alpha-20);\r\n}\r\n\r\n.ts-modal-content {\r\n flex: 1;\r\n overflow: auto;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.ts-table-scroll {\r\n overflow-x: auto;\r\n border-radius: 8px;\r\n border: 1px solid var(--border-color);\r\n}\r\n\r\n.ts-conversions-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-conversions-table thead {\r\n background: var(--background-secondary);\r\n position: sticky;\r\n top: 0;\r\n z-index: 10;\r\n}\r\n\r\n.ts-conversions-table thead th {\r\n padding: 12px;\r\n text-align: left;\r\n font-weight: 600;\r\n color: var(--text-secondary);\r\n text-transform: uppercase;\r\n font-size: 11px;\r\n letter-spacing: 0.05em;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n user-select: none;\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.ts-conversions-table thead th:hover {\r\n background: var(--background-tertiary);\r\n}\r\n\r\n.ts-conversions-table thead th.ts-sorted {\r\n color: var(--primary);\r\n}\r\n\r\n.ts-conversions-table tbody tr {\r\n border-bottom: 1px solid var(--border-color);\r\n transition: background 0.15s ease;\r\n}\r\n\r\n.ts-conversions-table tbody tr:hover {\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-conversions-table tbody td {\r\n padding: 12px;\r\n color: var(--text-primary);\r\n}\r\n\r\n.ts-date-cell {\r\n white-space: nowrap;\r\n color: var(--text-secondary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-url-cell {\r\n max-width: 300px;\r\n}\r\n\r\n.ts-url-link {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n color: var(--primary);\r\n text-decoration: none;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-url-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.ts-url-empty,\r\n.ts-context-empty {\r\n color: var(--text-tertiary);\r\n font-style: italic;\r\n}\r\n\r\n.ts-context-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 4px 8px;\r\n background: var(--background-secondary);\r\n border-radius: 4px;\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-source-info strong {\r\n color: var(--text-primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-medium {\r\n color: var(--text-secondary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-campaign {\r\n font-size: 11px;\r\n color: var(--text-tertiary);\r\n margin-top: 2px;\r\n}\r\n\r\n.ts-device-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 4px 10px;\r\n background: var(--background-secondary);\r\n border-radius: 12px;\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n text-transform: capitalize;\r\n}\r\n\r\n.ts-value-cell {\r\n font-weight: 600;\r\n color: var(--success);\r\n white-space: nowrap;\r\n}\r\n\r\n/* Pagination */\r\n.ts-modal-pagination {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 16px;\r\n padding: 12px 16px;\r\n background: var(--background-secondary);\r\n border-radius: 8px;\r\n margin-top: auto;\r\n}\r\n\r\n.ts-page-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 14px;\r\n background: var(--background-primary);\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n color: var(--text-primary);\r\n font-size: 13px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-page-btn:hover:not(:disabled) {\r\n background: var(--background-tertiary);\r\n border-color: var(--primary);\r\n color: var(--primary);\r\n}\r\n\r\n.ts-page-btn:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.ts-page-info {\r\n font-size: 13px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n/* Sources Tab */\r\n.ts-sources-tab {\r\n overflow: auto;\r\n}\r\n\r\n.ts-sources-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-sources-table thead {\r\n background: var(--background-secondary);\r\n position: sticky;\r\n top: 0;\r\n z-index: 10;\r\n}\r\n\r\n.ts-sources-table thead th {\r\n padding: 12px;\r\n text-align: left;\r\n font-weight: 600;\r\n color: var(--text-secondary);\r\n text-transform: uppercase;\r\n font-size: 11px;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.ts-sources-table tbody tr {\r\n border-bottom: 1px solid var(--border-color);\r\n transition: background 0.15s ease;\r\n}\r\n\r\n.ts-sources-table tbody tr:hover {\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-sources-table tbody td {\r\n padding: 12px;\r\n}\r\n\r\n.ts-source-name {\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n}\r\n\r\n.ts-source-medium {\r\n color: var(--text-secondary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-source-conversions {\r\n font-weight: 600;\r\n color: var(--primary);\r\n}\r\n\r\n.ts-source-percentage {\r\n min-width: 200px;\r\n}\r\n\r\n.ts-progress-bar {\r\n display: inline-block;\r\n width: 100px;\r\n height: 6px;\r\n background: var(--background-secondary);\r\n border-radius: 3px;\r\n overflow: hidden;\r\n margin-right: 12px;\r\n vertical-align: middle;\r\n}\r\n\r\n.ts-progress-fill {\r\n height: 100%;\r\n background: linear-gradient(90deg, var(--primary), var(--primary-dark));\r\n border-radius: 3px;\r\n transition: width 0.3s ease;\r\n}\r\n\r\n.ts-source-revenue {\r\n font-weight: 600;\r\n color: var(--success);\r\n white-space: nowrap;\r\n}\r\n\r\n/* Devices Tab */\r\n.ts-devices-tab {\r\n overflow: auto;\r\n}\r\n\r\n.ts-devices-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-devices-table thead {\r\n background: var(--background-secondary);\r\n position: sticky;\r\n top: 0;\r\n z-index: 10;\r\n}\r\n\r\n.ts-devices-table thead th {\r\n padding: 12px;\r\n text-align: left;\r\n font-weight: 600;\r\n color: var(--text-secondary);\r\n text-transform: uppercase;\r\n font-size: 11px;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.ts-devices-table tbody tr {\r\n border-bottom: 1px solid var(--border-color);\r\n transition: background 0.15s ease;\r\n}\r\n\r\n.ts-devices-table tbody tr:hover {\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-devices-table tbody td {\r\n padding: 12px;\r\n}\r\n\r\n.ts-device-name {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n text-transform: capitalize;\r\n}\r\n\r\n.ts-device-browser {\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-device-conversions {\r\n font-weight: 600;\r\n color: var(--primary);\r\n}\r\n\r\n.ts-device-percentage {\r\n min-width: 200px;\r\n}\r\n\r\n/* Loading & Empty States */\r\n.ts-loading,\r\n.ts-error,\r\n.ts-empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 16px;\r\n padding: 60px 20px;\r\n text-align: center;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-loading svg,\r\n.ts-error svg,\r\n.ts-empty svg {\r\n color: var(--text-tertiary);\r\n opacity: 0.4;\r\n animation: pulse 2s ease-in-out infinite;\r\n}\r\n\r\n.ts-loading svg {\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@keyframes pulse {\r\n 0%, 100% {\r\n opacity: 0.3;\r\n }\r\n 50% {\r\n opacity: 0.6;\r\n }\r\n}\r\n\r\n.ts-error {\r\n color: var(--danger);\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme=\"dark\"] {\r\n .ts-modal-tabs {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-modal-tab {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-modal-tab:hover {\r\n color: var(--text-dark-primary);\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-modal-tab--active {\r\n color: var(--primary-light);\r\n border-bottom-color: var(--primary-light);\r\n }\r\n\r\n .ts-metric-label {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-metric-value {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-top-page {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-top-page:hover {\r\n background: var(--background-dark-tertiary);\r\n }\r\n\r\n .ts-top-page-url a {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-top-page-url a:hover {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-modal-filters {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-filter-group label {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-filter-select {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-filter-select:hover {\r\n border-color: var(--primary-light);\r\n }\r\n\r\n .ts-export-btn {\r\n background: var(--primary-dark);\r\n }\r\n\r\n .ts-export-btn:hover {\r\n background: var(--primary);\r\n }\r\n\r\n .ts-table-scroll {\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-conversions-table thead {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-conversions-table thead th {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-conversions-table thead th.ts-sorted {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-conversions-table tbody tr {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-conversions-table tbody tr:hover {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-conversions-table tbody td {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-url-link {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-context-badge {\r\n background: var(--background-dark-secondary);\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-device-badge {\r\n background: var(--background-dark-secondary);\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-modal-pagination {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-page-btn {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-page-btn:hover:not(:disabled) {\r\n background: var(--background-dark-tertiary);\r\n border-color: var(--primary-light);\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-page-info {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-sources-table thead,\r\n .ts-devices-table thead {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-sources-table thead th,\r\n .ts-devices-table thead th {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-sources-table tbody tr,\r\n .ts-devices-table tbody tr {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-sources-table tbody tr:hover,\r\n .ts-devices-table tbody tr:hover {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-source-name,\r\n .ts-device-name {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-source-medium,\r\n .ts-device-browser {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-source-conversions,\r\n .ts-device-conversions {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-progress-bar {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-progress-fill {\r\n background: linear-gradient(90deg, var(--primary-light), var(--primary));\r\n }\r\n\r\n .ts-loading,\r\n .ts-error,\r\n .ts-empty {\r\n color: var(--text-dark-secondary);\r\n }\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 768px) {\r\n .ts-modal-tabs {\r\n overflow-x: auto;\r\n -webkit-overflow-scrolling: touch;\r\n }\r\n\r\n .ts-modal-tab {\r\n padding: 10px 16px;\r\n font-size: 13px;\r\n }\r\n\r\n .ts-overview-metrics {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n\r\n .ts-modal-filters {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .ts-filter-group {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .ts-export-btn {\r\n width: 100%;\r\n justify-content: center;\r\n }\r\n\r\n .ts-table-scroll {\r\n font-size: 12px;\r\n }\r\n\r\n .ts-conversions-table thead th,\r\n .ts-sources-table thead th,\r\n .ts-devices-table thead th {\r\n padding: 8px;\r\n font-size: 10px;\r\n }\r\n\r\n .ts-conversions-table tbody td,\r\n .ts-sources-table tbody td,\r\n .ts-devices-table tbody td {\r\n padding: 8px;\r\n }\r\n\r\n .ts-modal-pagination {\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n\r\n .ts-page-info {\r\n font-size: 12px;\r\n text-align: center;\r\n }\r\n\r\n .ts-top-page {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 8px;\r\n }\r\n\r\n .ts-top-page-url {\r\n width: 100%;\r\n }\r\n\r\n .ts-source-percentage,\r\n .ts-device-percentage {\r\n min-width: 150px;\r\n }\r\n\r\n .ts-progress-bar {\r\n width: 60px;\r\n }\r\n}\r\n\r\n/* Accessibility */\r\n@media (prefers-reduced-motion: reduce) {\r\n *,\r\n *::before,\r\n *::after {\r\n animation-duration: 0.01ms !important;\r\n animation-iteration-count: 1 !important;\r\n transition-duration: 0.01ms !important;\r\n }\r\n}\r\n\r\n@media (prefers-contrast: high) {\r\n .ts-modal-tab--active {\r\n border-bottom-width: 3px;\r\n }\r\n\r\n .ts-progress-fill {\r\n background: var(--primary);\r\n }\r\n\r\n .ts-url-link {\r\n text-decoration: underline;\r\n }\r\n}\r\n"],sourceRoot:""}]);const p=d},56883:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Custom Goal Builder Styles\n * \n * Step-by-step wizard interface with clear visual hierarchy,\n * contextual help, and premium UI/UX\n * \n * @since 2.1.0\n * @package TrackSure\n */\n\n/* Main Container */\n.ts-custom-goal-builder {\n display: flex;\n flex-direction: column;\n gap: 24px;\n min-height: 600px;\n}\n\n/* Step Indicator */\n.ts-goal-builder-steps {\n display: flex;\n gap: 12px;\n padding: 20px;\n background: var(--background-secondary);\n border-radius: 12px;\n overflow-x: auto;\n}\n\n.ts-step {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 160px;\n padding: 12px 16px;\n background: var(--background-primary);\n border: 2px solid var(--border-color);\n border-radius: 8px;\n transition: all 0.3s ease;\n cursor: default;\n}\n\n.ts-step--active {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\n}\n\n.ts-step--completed {\n border-color: var(--success);\n background: var(--success-alpha-5);\n}\n\n.ts-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--background-secondary);\n border-radius: 50%;\n font-size: 14px;\n font-weight: 700;\n color: var(--text-secondary);\n flex-shrink: 0;\n transition: all 0.3s ease;\n}\n\n.ts-step--active .ts-step-number {\n background: var(--primary);\n color: white;\n}\n\n.ts-step--completed .ts-step-number {\n background: var(--success);\n color: white;\n}\n\n.ts-step-info {\n flex: 1;\n min-width: 0;\n}\n\n.ts-step-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ts-step-description {\n font-size: 11px;\n color: var(--text-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ts-step--active .ts-step-title {\n color: var(--primary);\n}\n\n/* Builder Content */\n.ts-builder-content {\n flex: 1;\n overflow-y: auto;\n max-height: 500px;\n}\n\n.ts-step-content {\n animation: fadeIn 0.3s ease;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.ts-draft-notice {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: var(--info-alpha-10);\n border-left: 4px solid var(--info);\n border-radius: 6px;\n color: var(--info);\n font-size: 13px;\n margin-bottom: 16px;\n}\n\n/* Section Intro */\n.ts-section-intro {\n font-size: 14px;\n color: var(--text-secondary);\n margin-bottom: 20px;\n line-height: 1.6;\n}\n\n/* Form Fields */\n.ts-form-field {\n margin-bottom: 24px;\n}\n\n.ts-form-field label {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 8px;\n}\n\n.ts-required {\n color: var(--danger);\n margin-left: 2px;\n}\n\n.ts-optional {\n font-weight: 400;\n color: var(--text-tertiary);\n font-size: 12px;\n}\n\n.ts-form-field input[type="text"],\n.ts-form-field input[type="number"],\n.ts-form-field textarea,\n.ts-form-field select {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--border-color);\n border-radius: 6px;\n background: var(--background-primary);\n color: var(--text-primary);\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.ts-form-field input:focus,\n.ts-form-field textarea:focus,\n.ts-form-field select:focus {\n outline: none;\n border-color: var(--primary);\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\n}\n\n.ts-input-error {\n border-color: var(--danger) !important;\n}\n\n.ts-error-message {\n display: block;\n margin-top: 6px;\n font-size: 12px;\n color: var(--danger);\n}\n\n.ts-field-help {\n margin-top: 6px;\n font-size: 12px;\n color: var(--text-tertiary);\n line-height: 1.5;\n}\n\n/* Category Grid */\n.ts-category-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n}\n\n.ts-category-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 20px 16px;\n background: var(--background-secondary);\n border: 2px solid var(--border-color);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: center;\n}\n\n.ts-category-card:hover {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px var(--shadow-color);\n}\n\n.ts-category-card--selected {\n border-color: var(--primary);\n background: var(--primary-alpha-10);\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\n}\n\n.ts-category-card span {\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n/* Trigger Grid */\n.ts-trigger-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.ts-trigger-card {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 16px;\n background: var(--background-secondary);\n border: 2px solid var(--border-color);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n}\n\n.ts-trigger-card:hover {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n box-shadow: 0 4px 12px var(--shadow-color);\n}\n\n.ts-trigger-card--selected {\n border-color: var(--primary);\n background: var(--primary-alpha-10);\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\n}\n\n.ts-trigger-icon {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--background-primary);\n border-radius: 8px;\n color: var(--primary);\n}\n\n.ts-trigger-card--selected .ts-trigger-icon {\n background: var(--primary);\n color: white;\n}\n\n.ts-trigger-info {\n flex: 1;\n min-width: 0;\n}\n\n.ts-trigger-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 4px;\n}\n\n.ts-trigger-description {\n font-size: 12px;\n color: var(--text-secondary);\n line-height: 1.4;\n}\n\n.ts-trigger-check {\n position: absolute;\n top: 12px;\n right: 12px;\n color: var(--primary);\n}\n\n/* Radio Options */\n.ts-radio-group {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.ts-radio-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--border-color);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ts-radio-option:hover {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n}\n\n.ts-radio-option input[type="radio"] {\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.ts-radio-option span {\n flex: 1;\n}\n\n.ts-radio-option strong {\n display: block;\n font-size: 14px;\n color: var(--text-primary);\n margin-bottom: 4px;\n}\n\n.ts-radio-option small {\n display: block;\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.ts-value-input {\n margin-top: 12px;\n padding-left: 24px;\n}\n\n.ts-value-input input[type="number"] {\n max-width: 200px;\n}\n\n/* Conditions Preview */\n.ts-conditions-preview {\n margin-top: 24px;\n padding: 16px;\n background: var(--background-secondary);\n border-left: 4px solid var(--primary);\n border-radius: 6px;\n}\n\n.ts-conditions-preview h4 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 12px;\n}\n\n.ts-logic-preview {\n font-size: 13px;\n color: var(--text-secondary);\n}\n\n.ts-logic-preview p {\n margin-bottom: 12px;\n}\n\n.ts-logic-preview strong {\n color: var(--primary);\n font-weight: 700;\n}\n\n.ts-condition-list {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\n.ts-condition-list li {\n padding: 8px 12px;\n background: var(--background-primary);\n border-radius: 4px;\n margin-bottom: 6px;\n font-size: 12px;\n font-family: \'Courier New\', monospace;\n}\n\n.ts-condition-list code {\n color: var(--primary);\n font-weight: 600;\n}\n\n.ts-condition-list em {\n color: var(--text-tertiary);\n font-style: normal;\n margin: 0 6px;\n}\n\n/* Goal Preview */\n.ts-goal-preview {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.ts-preview-section {\n padding-bottom: 20px;\n border-bottom: 1px solid var(--border-color);\n}\n\n.ts-preview-section:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n\n.ts-preview-section h4 {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 12px;\n}\n\n.ts-preview-section p {\n font-size: 13px;\n color: var(--text-secondary);\n margin-bottom: 12px;\n}\n\n.ts-preview-section dl {\n display: grid;\n grid-template-columns: 140px 1fr;\n gap: 12px 16px;\n margin: 0;\n}\n\n.ts-preview-section dt {\n font-size: 12px;\n font-weight: 600;\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.ts-preview-section dd {\n font-size: 14px;\n color: var(--text-primary);\n margin: 0;\n}\n\n.ts-preview-section code {\n padding: 2px 6px;\n background: var(--background-secondary);\n border-radius: 3px;\n font-size: 12px;\n color: var(--primary);\n font-family: \'Courier New\', monospace;\n}\n\n.ts-no-conditions {\n font-style: italic;\n color: var(--text-tertiary);\n}\n\n/* Builder Actions */\n.ts-builder-actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n padding: 16px 20px;\n background: var(--background-secondary);\n border-top: 1px solid var(--border-color);\n border-radius: 0 0 12px 12px;\n margin: 0 -24px -24px;\n}\n\n.ts-actions-left,\n.ts-actions-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* Dark Theme */\n[data-theme="dark"] {\n .ts-goal-builder-steps {\n background: var(--background-dark-secondary);\n }\n\n .ts-step {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n }\n\n .ts-step--active {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-10);\n }\n\n .ts-step--completed {\n border-color: var(--success-light);\n background: var(--success-dark-alpha-10);\n }\n\n .ts-step-number {\n background: var(--background-dark-secondary);\n color: var(--text-dark-secondary);\n }\n\n .ts-step--active .ts-step-number {\n background: var(--primary-light);\n }\n\n .ts-step--completed .ts-step-number {\n background: var(--success-light);\n }\n\n .ts-step-title {\n color: var(--text-dark-primary);\n }\n\n .ts-step-description {\n color: var(--text-dark-tertiary);\n }\n\n .ts-step--active .ts-step-title {\n color: var(--primary-light);\n }\n\n .ts-draft-notice {\n background: var(--info-dark-alpha-10);\n border-left-color: var(--info-light);\n color: var(--info-light);\n }\n\n .ts-section-intro {\n color: var(--text-dark-secondary);\n }\n\n .ts-form-field label {\n color: var(--text-dark-primary);\n }\n\n .ts-form-field input,\n .ts-form-field textarea,\n .ts-form-field select {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n color: var(--text-dark-primary);\n }\n\n .ts-field-help {\n color: var(--text-dark-tertiary);\n }\n\n .ts-category-card,\n .ts-trigger-card {\n background: var(--background-dark-secondary);\n border-color: var(--border-dark);\n }\n\n .ts-category-card:hover,\n .ts-trigger-card:hover {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-5);\n }\n\n .ts-category-card--selected,\n .ts-trigger-card--selected {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-10);\n }\n\n .ts-trigger-icon {\n background: var(--background-dark-primary);\n color: var(--primary-light);\n }\n\n .ts-trigger-card--selected .ts-trigger-icon {\n background: var(--primary-light);\n }\n\n .ts-trigger-label {\n color: var(--text-dark-primary);\n }\n\n .ts-trigger-description {\n color: var(--text-dark-secondary);\n }\n\n .ts-trigger-check {\n color: var(--primary-light);\n }\n\n .ts-radio-option {\n border-color: var(--border-dark);\n }\n\n .ts-radio-option:hover {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-5);\n }\n\n .ts-radio-option strong {\n color: var(--text-dark-primary);\n }\n\n .ts-radio-option small {\n color: var(--text-dark-secondary);\n }\n\n .ts-conditions-preview {\n background: var(--background-dark-secondary);\n border-left-color: var(--primary-light);\n }\n\n .ts-conditions-preview h4 {\n color: var(--text-dark-primary);\n }\n\n .ts-logic-preview {\n color: var(--text-dark-secondary);\n }\n\n .ts-logic-preview strong {\n color: var(--primary-light);\n }\n\n .ts-condition-list li {\n background: var(--background-dark-primary);\n }\n\n .ts-condition-list code {\n color: var(--primary-light);\n }\n\n .ts-condition-list em {\n color: var(--text-dark-tertiary);\n }\n\n .ts-preview-section {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-preview-section h4 {\n color: var(--text-dark-primary);\n }\n\n .ts-preview-section p {\n color: var(--text-dark-secondary);\n }\n\n .ts-preview-section dt {\n color: var(--text-dark-tertiary);\n }\n\n .ts-preview-section dd {\n color: var(--text-dark-primary);\n }\n\n .ts-preview-section code {\n background: var(--background-dark-secondary);\n color: var(--primary-light);\n }\n\n .ts-no-conditions {\n color: var(--text-dark-tertiary);\n }\n\n .ts-builder-actions {\n background: var(--background-dark-secondary);\n border-top-color: var(--border-dark);\n }\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .ts-goal-builder-steps {\n flex-wrap: nowrap;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n\n .ts-step {\n min-width: 140px;\n }\n\n .ts-trigger-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 768px) {\n .ts-step-description {\n display: none;\n }\n\n .ts-category-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .ts-preview-section dl {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .ts-preview-section dt {\n font-weight: 700;\n }\n\n .ts-builder-actions {\n flex-direction: column;\n gap: 12px;\n }\n\n .ts-actions-left,\n .ts-actions-right {\n width: 100%;\n justify-content: space-between;\n }\n}\n\n/* Accessibility */\n@media (prefers-reduced-motion: reduce) {\n .ts-step-content {\n animation: none;\n }\n\n .ts-step,\n .ts-category-card,\n .ts-trigger-card,\n .ts-radio-option {\n transition: none;\n }\n}\n\n@media (prefers-contrast: high) {\n .ts-step--active {\n border-width: 3px;\n }\n\n .ts-category-card--selected,\n .ts-trigger-card--selected {\n border-width: 3px;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/components/CustomGoalBuilder.css"],names:[],mappings:"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",sourcesContent:['/**\r\n * Custom Goal Builder Styles\r\n * \r\n * Step-by-step wizard interface with clear visual hierarchy,\r\n * contextual help, and premium UI/UX\r\n * \r\n * @since 2.1.0\r\n * @package TrackSure\r\n */\r\n\r\n/* Main Container */\r\n.ts-custom-goal-builder {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 24px;\r\n min-height: 600px;\r\n}\r\n\r\n/* Step Indicator */\r\n.ts-goal-builder-steps {\r\n display: flex;\r\n gap: 12px;\r\n padding: 20px;\r\n background: var(--background-secondary);\r\n border-radius: 12px;\r\n overflow-x: auto;\r\n}\r\n\r\n.ts-step {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex: 1;\r\n min-width: 160px;\r\n padding: 12px 16px;\r\n background: var(--background-primary);\r\n border: 2px solid var(--border-color);\r\n border-radius: 8px;\r\n transition: all 0.3s ease;\r\n cursor: default;\r\n}\r\n\r\n.ts-step--active {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-step--completed {\r\n border-color: var(--success);\r\n background: var(--success-alpha-5);\r\n}\r\n\r\n.ts-step-number {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n background: var(--background-secondary);\r\n border-radius: 50%;\r\n font-size: 14px;\r\n font-weight: 700;\r\n color: var(--text-secondary);\r\n flex-shrink: 0;\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.ts-step--active .ts-step-number {\r\n background: var(--primary);\r\n color: white;\r\n}\r\n\r\n.ts-step--completed .ts-step-number {\r\n background: var(--success);\r\n color: white;\r\n}\r\n\r\n.ts-step-info {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-step-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 2px;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.ts-step-description {\r\n font-size: 11px;\r\n color: var(--text-tertiary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.ts-step--active .ts-step-title {\r\n color: var(--primary);\r\n}\r\n\r\n/* Builder Content */\r\n.ts-builder-content {\r\n flex: 1;\r\n overflow-y: auto;\r\n max-height: 500px;\r\n}\r\n\r\n.ts-step-content {\r\n animation: fadeIn 0.3s ease;\r\n}\r\n\r\n@keyframes fadeIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.ts-draft-notice {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 12px 16px;\r\n background: var(--info-alpha-10);\r\n border-left: 4px solid var(--info);\r\n border-radius: 6px;\r\n color: var(--info);\r\n font-size: 13px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n/* Section Intro */\r\n.ts-section-intro {\r\n font-size: 14px;\r\n color: var(--text-secondary);\r\n margin-bottom: 20px;\r\n line-height: 1.6;\r\n}\r\n\r\n/* Form Fields */\r\n.ts-form-field {\r\n margin-bottom: 24px;\r\n}\r\n\r\n.ts-form-field label {\r\n display: block;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 8px;\r\n}\r\n\r\n.ts-required {\r\n color: var(--danger);\r\n margin-left: 2px;\r\n}\r\n\r\n.ts-optional {\r\n font-weight: 400;\r\n color: var(--text-tertiary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-form-field input[type="text"],\r\n.ts-form-field input[type="number"],\r\n.ts-form-field textarea,\r\n.ts-form-field select {\r\n width: 100%;\r\n padding: 10px 14px;\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n background: var(--background-primary);\r\n color: var(--text-primary);\r\n font-size: 14px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-form-field input:focus,\r\n.ts-form-field textarea:focus,\r\n.ts-form-field select:focus {\r\n outline: none;\r\n border-color: var(--primary);\r\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-input-error {\r\n border-color: var(--danger) !important;\r\n}\r\n\r\n.ts-error-message {\r\n display: block;\r\n margin-top: 6px;\r\n font-size: 12px;\r\n color: var(--danger);\r\n}\r\n\r\n.ts-field-help {\r\n margin-top: 6px;\r\n font-size: 12px;\r\n color: var(--text-tertiary);\r\n line-height: 1.5;\r\n}\r\n\r\n/* Category Grid */\r\n.ts-category-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\r\n gap: 12px;\r\n}\r\n\r\n.ts-category-card {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 20px 16px;\r\n background: var(--background-secondary);\r\n border: 2px solid var(--border-color);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n text-align: center;\r\n}\r\n\r\n.ts-category-card:hover {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 12px var(--shadow-color);\r\n}\r\n\r\n.ts-category-card--selected {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-10);\r\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-category-card span {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n}\r\n\r\n/* Trigger Grid */\r\n.ts-trigger-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n gap: 12px;\r\n}\r\n\r\n.ts-trigger-card {\r\n position: relative;\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 16px;\r\n padding: 16px;\r\n background: var(--background-secondary);\r\n border: 2px solid var(--border-color);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n text-align: left;\r\n}\r\n\r\n.ts-trigger-card:hover {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n box-shadow: 0 4px 12px var(--shadow-color);\r\n}\r\n\r\n.ts-trigger-card--selected {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-10);\r\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-trigger-icon {\r\n flex-shrink: 0;\r\n width: 48px;\r\n height: 48px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--background-primary);\r\n border-radius: 8px;\r\n color: var(--primary);\r\n}\r\n\r\n.ts-trigger-card--selected .ts-trigger-icon {\r\n background: var(--primary);\r\n color: white;\r\n}\r\n\r\n.ts-trigger-info {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-trigger-label {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 4px;\r\n}\r\n\r\n.ts-trigger-description {\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n line-height: 1.4;\r\n}\r\n\r\n.ts-trigger-check {\r\n position: absolute;\r\n top: 12px;\r\n right: 12px;\r\n color: var(--primary);\r\n}\r\n\r\n/* Radio Options */\r\n.ts-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.ts-radio-option {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n padding: 12px;\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-radio-option:hover {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n}\r\n\r\n.ts-radio-option input[type="radio"] {\r\n margin-top: 2px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-radio-option span {\r\n flex: 1;\r\n}\r\n\r\n.ts-radio-option strong {\r\n display: block;\r\n font-size: 14px;\r\n color: var(--text-primary);\r\n margin-bottom: 4px;\r\n}\r\n\r\n.ts-radio-option small {\r\n display: block;\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-value-input {\r\n margin-top: 12px;\r\n padding-left: 24px;\r\n}\r\n\r\n.ts-value-input input[type="number"] {\r\n max-width: 200px;\r\n}\r\n\r\n/* Conditions Preview */\r\n.ts-conditions-preview {\r\n margin-top: 24px;\r\n padding: 16px;\r\n background: var(--background-secondary);\r\n border-left: 4px solid var(--primary);\r\n border-radius: 6px;\r\n}\r\n\r\n.ts-conditions-preview h4 {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-logic-preview {\r\n font-size: 13px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-logic-preview p {\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-logic-preview strong {\r\n color: var(--primary);\r\n font-weight: 700;\r\n}\r\n\r\n.ts-condition-list {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.ts-condition-list li {\r\n padding: 8px 12px;\r\n background: var(--background-primary);\r\n border-radius: 4px;\r\n margin-bottom: 6px;\r\n font-size: 12px;\r\n font-family: \'Courier New\', monospace;\r\n}\r\n\r\n.ts-condition-list code {\r\n color: var(--primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-condition-list em {\r\n color: var(--text-tertiary);\r\n font-style: normal;\r\n margin: 0 6px;\r\n}\r\n\r\n/* Goal Preview */\r\n.ts-goal-preview {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 24px;\r\n}\r\n\r\n.ts-preview-section {\r\n padding-bottom: 20px;\r\n border-bottom: 1px solid var(--border-color);\r\n}\r\n\r\n.ts-preview-section:last-child {\r\n border-bottom: none;\r\n padding-bottom: 0;\r\n}\r\n\r\n.ts-preview-section h4 {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-preview-section p {\r\n font-size: 13px;\r\n color: var(--text-secondary);\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-preview-section dl {\r\n display: grid;\r\n grid-template-columns: 140px 1fr;\r\n gap: 12px 16px;\r\n margin: 0;\r\n}\r\n\r\n.ts-preview-section dt {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--text-tertiary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.ts-preview-section dd {\r\n font-size: 14px;\r\n color: var(--text-primary);\r\n margin: 0;\r\n}\r\n\r\n.ts-preview-section code {\r\n padding: 2px 6px;\r\n background: var(--background-secondary);\r\n border-radius: 3px;\r\n font-size: 12px;\r\n color: var(--primary);\r\n font-family: \'Courier New\', monospace;\r\n}\r\n\r\n.ts-no-conditions {\r\n font-style: italic;\r\n color: var(--text-tertiary);\r\n}\r\n\r\n/* Builder Actions */\r\n.ts-builder-actions {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 16px;\r\n padding: 16px 20px;\r\n background: var(--background-secondary);\r\n border-top: 1px solid var(--border-color);\r\n border-radius: 0 0 12px 12px;\r\n margin: 0 -24px -24px;\r\n}\r\n\r\n.ts-actions-left,\r\n.ts-actions-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme="dark"] {\r\n .ts-goal-builder-steps {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-step {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-step--active {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-10);\r\n }\r\n\r\n .ts-step--completed {\r\n border-color: var(--success-light);\r\n background: var(--success-dark-alpha-10);\r\n }\r\n\r\n .ts-step-number {\r\n background: var(--background-dark-secondary);\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-step--active .ts-step-number {\r\n background: var(--primary-light);\r\n }\r\n\r\n .ts-step--completed .ts-step-number {\r\n background: var(--success-light);\r\n }\r\n\r\n .ts-step-title {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-step-description {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-step--active .ts-step-title {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-draft-notice {\r\n background: var(--info-dark-alpha-10);\r\n border-left-color: var(--info-light);\r\n color: var(--info-light);\r\n }\r\n\r\n .ts-section-intro {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-form-field label {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-form-field input,\r\n .ts-form-field textarea,\r\n .ts-form-field select {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-field-help {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-category-card,\r\n .ts-trigger-card {\r\n background: var(--background-dark-secondary);\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-category-card:hover,\r\n .ts-trigger-card:hover {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-5);\r\n }\r\n\r\n .ts-category-card--selected,\r\n .ts-trigger-card--selected {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-10);\r\n }\r\n\r\n .ts-trigger-icon {\r\n background: var(--background-dark-primary);\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-trigger-card--selected .ts-trigger-icon {\r\n background: var(--primary-light);\r\n }\r\n\r\n .ts-trigger-label {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-trigger-description {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-trigger-check {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-radio-option {\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-radio-option:hover {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-5);\r\n }\r\n\r\n .ts-radio-option strong {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-radio-option small {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-conditions-preview {\r\n background: var(--background-dark-secondary);\r\n border-left-color: var(--primary-light);\r\n }\r\n\r\n .ts-conditions-preview h4 {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-logic-preview {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-logic-preview strong {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-condition-list li {\r\n background: var(--background-dark-primary);\r\n }\r\n\r\n .ts-condition-list code {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-condition-list em {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-preview-section {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-preview-section h4 {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-preview-section p {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-preview-section dt {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-preview-section dd {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-preview-section code {\r\n background: var(--background-dark-secondary);\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-no-conditions {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-builder-actions {\r\n background: var(--background-dark-secondary);\r\n border-top-color: var(--border-dark);\r\n }\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 1024px) {\r\n .ts-goal-builder-steps {\r\n flex-wrap: nowrap;\r\n overflow-x: auto;\r\n -webkit-overflow-scrolling: touch;\r\n }\r\n\r\n .ts-step {\r\n min-width: 140px;\r\n }\r\n\r\n .ts-trigger-grid {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .ts-step-description {\r\n display: none;\r\n }\r\n\r\n .ts-category-grid {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n\r\n .ts-preview-section dl {\r\n grid-template-columns: 1fr;\r\n gap: 8px;\r\n }\r\n\r\n .ts-preview-section dt {\r\n font-weight: 700;\r\n }\r\n\r\n .ts-builder-actions {\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n\r\n .ts-actions-left,\r\n .ts-actions-right {\r\n width: 100%;\r\n justify-content: space-between;\r\n }\r\n}\r\n\r\n/* Accessibility */\r\n@media (prefers-reduced-motion: reduce) {\r\n .ts-step-content {\r\n animation: none;\r\n }\r\n\r\n .ts-step,\r\n .ts-category-card,\r\n .ts-trigger-card,\r\n .ts-radio-option {\r\n transition: none;\r\n }\r\n}\r\n\r\n@media (prefers-contrast: high) {\r\n .ts-step--active {\r\n border-width: 3px;\r\n }\r\n\r\n .ts-category-card--selected,\r\n .ts-trigger-card--selected {\r\n border-width: 3px;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},76840:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Goals Page - Modern, User-Friendly Design\n * Features: CSS Variables, Dark Mode Support, Smooth Animations\n * Now using global CSS variables for consistent theming\n */\n\n/* ========================================\n Page Container\n\n ======================================== */\n.ts-goals-page {\n padding: var(--ts-spacing-lg);\n background: var(--ts-bg);\n min-height: 100vh;\n}\n\n/* ========================================\n Page Header\n ======================================== */\n.ts-page-header {\n margin-bottom: var(--ts-spacing-xl);\n}\n\n.ts-page-title {\n font-size: 28px;\n font-weight: 700;\n color: var(--ts-text);\n margin: 0 0 8px 0;\n letter-spacing: -0.025em;\n}\n\n.ts-page-description {\n font-size: 15px;\n color: var(--ts-text-muted);\n margin: 0;\n line-height: 1.6;\n}\n\n/* ========================================\n Tab Navigation\n ======================================== */\n.ts-goals-tabs {\n display: flex;\n gap: var(--ts-spacing-xs);\n margin-bottom: var(--ts-spacing-lg);\n border-bottom: 1px solid var(--ts-border);\n padding: 0;\n}\n\n.ts-goals-tab {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs);\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--ts-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n top: 1px;\n}\n\n.ts-goals-tab:hover {\n color: var(--ts-text);\n background: var(--ts-surface-hover);\n}\n\n.ts-goals-tab--active {\n color: var(--ts-primary);\n border-bottom-color: var(--ts-primary);\n font-weight: 600;\n}\n\n.ts-goals-tab--active:hover {\n background: transparent;\n}\n\n[data-theme="dark"] .ts-goals-tab:hover {\n background: var(--ts-surface-hover-dark);\n}\n\n/* ========================================\n Goals Grid\n ======================================== */\n\n/* Summary Cards - Row Layout */\n.ts-goals-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: var(--ts-spacing-md);\n margin-bottom: var(--ts-spacing-xl);\n}\n\n.ts-goals-summary-row {\n display: flex;\n flex-direction: row;\n gap: var(--ts-spacing-md);\n margin-bottom: var(--ts-spacing-xl);\n flex-wrap: wrap;\n}\n\n.ts-goals-summary-row > * {\n flex: 1;\n min-width: 200px;\n}\n\n.ts-goals-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));\n gap: var(--ts-spacing-lg);\n margin-top: var(--ts-spacing-lg);\n}\n\n/* ========================================\n Goal Card\n ======================================== */\n.ts-goal-card {\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-lg);\n padding: var(--ts-spacing-lg);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.ts-goal-card::before {\n content: \'\';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: linear-gradient(90deg, var(--ts-primary), var(--ts-success));\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.ts-goal-card:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08);\n transform: translateY(-3px);\n border-color: var(--ts-primary);\n}\n\n.ts-goal-card:hover::before {\n opacity: 1;\n}\n\n.ts-goal-card-selected {\n border-color: var(--ts-primary);\n background: var(--ts-surface-hover);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n/* Goal Checkbox - Inline with header */\n.ts-goal-checkbox {\n position: absolute;\n top: var(--ts-spacing-lg);\n left: var(--ts-spacing-lg);\n z-index: 1;\n}\n\n.ts-goal-checkbox input[type="checkbox"] {\n margin: 0;\n cursor: pointer;\n width: 18px;\n height: 18px;\n accent-color: var(--ts-primary);\n}\n\n/* Goal Header */\n.ts-goal-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: var(--ts-spacing-md);\n gap: var(--ts-spacing-md);\n padding-left: 30px; /* Space for absolute checkbox */\n}\n\n.ts-goal-title-section {\n flex: 1;\n min-width: 0;\n}\n\n.ts-goal-title-row {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm);\n flex-wrap: wrap;\n}\n\n.ts-goal-name {\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0;\n line-height: 1.4;\n}\n\n.ts-goal-description {\n font-size: 14px;\n color: var(--ts-text-muted);\n margin: 6px 0 0 0;\n line-height: 1.5;\n display: -webkit-box;\n line-clamp: 2;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Goal Actions */\n.ts-goal-actions {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs);\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.ts-goal-status {\n font-size: 12px;\n font-weight: 600;\n padding: 6px 12px;\n border-radius: var(--ts-radius-full);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n transition: all 0.2s ease;\n}\n\n.ts-goal-status.ts-active {\n background: var(--ts-success-soft);\n color: var(--ts-success);\n border: 1px solid var(--ts-success);\n}\n\n.ts-goal-status.ts-inactive {\n background: var(--ts-danger-soft);\n color: var(--ts-danger);\n border: 1px solid var(--ts-danger);\n}\n\n.ts-btn-icon {\n background: var(--ts-surface-hover);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n color: var(--ts-text-muted);\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n}\n\n.ts-btn-icon:hover {\n background: var(--ts-primary-soft);\n color: var(--ts-primary);\n border-color: var(--ts-primary);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.ts-btn-icon.ts-btn-danger:hover {\n background: var(--ts-danger-soft);\n color: var(--ts-danger);\n border-color: var(--ts-danger);\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.2);\n}\n\n/* Goal Details */\n.ts-goal-details {\n margin-bottom: var(--ts-spacing-md);\n}\n\n.ts-goal-meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ts-spacing-sm);\n}\n\n.ts-goal-event,\n.ts-goal-conditions {\n font-size: 13px;\n color: var(--ts-text);\n background: var(--ts-bg-tertiary);\n padding: 6px 12px;\n border-radius: var(--ts-radius-md);\n border: 1px solid var(--ts-border);\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n.ts-goal-event:hover,\n.ts-goal-conditions:hover {\n background: var(--ts-primary-soft);\n border-color: var(--ts-primary);\n color: var(--ts-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n}\n\n/* Goal Performance */\n.ts-goal-performance {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: var(--ts-spacing-md);\n padding-top: var(--ts-spacing-md);\n border-top: 1px solid var(--ts-border);\n margin-top: auto;\n}\n\n.ts-goal-stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ts-goal-stat-label {\n font-size: 11px;\n color: var(--ts-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.8px;\n font-weight: 600;\n}\n\n.ts-goal-stat-value {\n font-size: 24px;\n font-weight: 700;\n color: var(--ts-text);\n line-height: 1;\n}\n\n/* View Details Button */\n.ts-goal-view-details {\n width: 100%;\n margin-top: var(--ts-spacing-md);\n padding: var(--ts-spacing-sm) var(--ts-spacing-md);\n background: var(--ts-primary-soft);\n border: 1px solid var(--ts-primary);\n color: var(--ts-primary);\n border-radius: var(--ts-radius-md);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ts-spacing-xs);\n position: relative;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.ts-goal-view-details svg {\n flex-shrink: 0;\n}\n\n.ts-goal-view-details::before {\n content: \'\';\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);\n transition: left 0.5s ease;\n}\n\n.ts-goal-view-details:hover::before {\n left: 100%;\n}\n\n.ts-goal-view-details:hover {\n background: var(--ts-primary);\n color: var(--ts-bg-elevated);\n transform: translateY(-1px);\n box-shadow: var(--ts-shadow-md);\n}\n\n/* ========================================\n Empty State\n ======================================== */\n.ts-empty-state {\n text-align: center;\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\n background: var(--ts-surface);\n border: 2px dashed var(--ts-border);\n border-radius: var(--ts-radius-lg);\n margin-top: var(--ts-spacing-lg);\n}\n\n.ts-empty-icon {\n font-size: 64px;\n margin-bottom: var(--ts-spacing-md);\n opacity: 0.5;\n}\n\n.ts-empty-state h2 {\n font-size: 22px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0 0 8px 0;\n}\n\n.ts-empty-state p {\n font-size: 15px;\n color: var(--ts-text-muted);\n margin: 0 0 var(--ts-spacing-lg) 0;\n line-height: 1.6;\n}\n\n/* ========================================\n Error Banner\n ======================================== */\n.ts-error-banner {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-md);\n background: var(--ts-danger-soft);\n border: 1px solid var(--ts-danger);\n border-radius: var(--ts-radius-lg);\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\n margin-bottom: var(--ts-spacing-lg);\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.15);\n}\n\n.ts-error-banner span {\n font-size: 24px;\n flex-shrink: 0;\n color: var(--ts-danger);\n}\n\n.ts-error-banner p {\n margin: 0;\n color: var(--ts-danger);\n font-size: 14px;\n font-weight: 500;\n line-height: 1.5;\n}\n\n/* ========================================\n Modal\n ======================================== */\n.ts-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.65);\n backdrop-filter: blur(8px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.ts-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: var(--ts-spacing-lg);\n border-bottom: 1px solid var(--ts-border);\n background: var(--ts-surface-hover);\n}\n\n.ts-modal-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--ts-text);\n}\n\n.ts-modal-close {\n background: transparent;\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: var(--ts-text-muted);\n padding: 8px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--ts-radius-md);\n transition: all 0.2s ease;\n}\n\n.ts-modal-close:hover {\n background: var(--ts-danger-soft);\n color: var(--ts-danger);\n transform: rotate(90deg);\n}\n\n.ts-modal-body {\n padding: var(--ts-spacing-lg);\n overflow-y: auto;\n flex: 1;\n}\n\n.ts-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--ts-spacing-sm);\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\n border-top: 1px solid var(--ts-border);\n background: var(--ts-surface-hover);\n}\n\n/* ========================================\n Form Fields\n ======================================== */\n.ts-form-field {\n margin-bottom: var(--ts-spacing-lg);\n}\n\n.ts-form-field label {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--ts-text);\n margin-bottom: 8px;\n}\n\n.ts-field-help {\n font-size: 13px;\n color: var(--ts-text-muted);\n margin: 4px 0 0 0;\n line-height: 1.5;\n}\n\n.ts-form-field input[type="text"],\n.ts-form-field textarea,\n.ts-form-field select {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n font-size: 14px;\n color: var(--ts-text);\n background: var(--ts-surface);\n transition: all 0.2s ease;\n}\n\n.ts-form-field input[type="text"]:focus,\n.ts-form-field textarea:focus,\n.ts-form-field select:focus {\n outline: none;\n border-color: var(--ts-primary);\n box-shadow: 0 0 0 3px var(--ts-primary-soft);\n}\n\n.ts-form-field textarea {\n resize: vertical;\n min-height: 100px;\n font-family: inherit;\n line-height: 1.6;\n}\n\n/* ========================================\n Condition Rows\n ======================================== */\n.ts-condition-row {\n display: flex;\n gap: var(--ts-spacing-sm);\n margin-bottom: var(--ts-spacing-sm);\n align-items: flex-start;\n}\n\n.ts-condition-param,\n.ts-condition-operator,\n.ts-condition-value {\n flex: 1;\n}\n\n.ts-condition-row .ts-btn-icon {\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n/* ========================================\n Checkbox\n ======================================== */\n.ts-checkbox-label {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm);\n cursor: pointer;\n font-weight: normal !important;\n padding: var(--ts-spacing-sm);\n border-radius: var(--ts-radius-md);\n transition: background 0.2s ease;\n}\n\n.ts-checkbox-label:hover {\n background: var(--ts-surface-hover);\n}\n\n.ts-checkbox-label input[type="checkbox"] {\n width: 20px;\n height: 20px;\n cursor: pointer;\n accent-color: var(--ts-primary);\n}\n\n.ts-checkbox-label span {\n font-size: 14px;\n color: var(--ts-text);\n line-height: 1.5;\n}\n\n/* ========================================\n Buttons\n ======================================== */\n.ts-btn {\n padding: 10px 20px;\n border: none;\n border-radius: var(--ts-radius-md);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ts-spacing-sm);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.ts-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none !important;\n}\n\n.ts-btn-primary {\n background: var(--ts-primary);\n color: var(--ts-bg-elevated);\n}\n\n.ts-btn-primary:hover:not(:disabled) {\n background: var(--ts-primary-hover);\n box-shadow: var(--ts-shadow-md);\n transform: translateY(-1px);\n}\n\n.ts-btn-primary:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: var(--ts-shadow-sm);\n}\n\n.ts-btn-secondary {\n background: var(--ts-surface-hover);\n color: var(--ts-text);\n border: 1px solid var(--ts-border);\n}\n\n.ts-btn-secondary:hover:not(:disabled) {\n background: var(--ts-bg-tertiary);\n border-color: var(--ts-text-muted);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n.ts-btn-sm {\n padding: 6px 14px;\n font-size: 13px;\n}\n\n/* ========================================\n Loading State\n ======================================== */\n.ts-loading-state {\n text-align: center;\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\n}\n\n.ts-spinner {\n width: 48px;\n height: 48px;\n border: 4px solid var(--ts-border);\n border-top-color: var(--ts-primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin: 0 auto var(--ts-spacing-md);\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.ts-loading-state p {\n color: var(--ts-text-muted);\n font-size: 15px;\n font-weight: 500;\n}\n\n/* ========================================\n Templates Grid\n ======================================== */\n.ts-templates-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: var(--ts-spacing-lg);\n margin-top: var(--ts-spacing-lg);\n}\n\n.ts-template-card {\n display: flex;\n flex-direction: column;\n}\n\n.ts-template-card .ts-card-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n}\n\n.ts-template-icon {\n font-size: 48px;\n margin-bottom: var(--ts-spacing-md);\n text-align: center;\n}\n\n.ts-template-name {\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0 0 8px 0;\n line-height: 1.4;\n}\n\n.ts-template-description {\n font-size: 14px;\n color: var(--ts-text-muted);\n margin: 0 0 var(--ts-spacing-md) 0;\n line-height: 1.6;\n flex: 1;\n}\n\n.ts-template-meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ts-spacing-sm);\n margin-bottom: var(--ts-spacing-md);\n padding-top: var(--ts-spacing-md);\n border-top: 1px solid var(--ts-border);\n}\n\n.ts-template-add-btn {\n margin-top: auto;\n}\n\n/* ========================================\n Responsive Design\n ======================================== */\n\n/* Tablet and below */\n@media (max-width: 768px) {\n .ts-goals-page {\n padding: var(--ts-spacing-md);\n }\n\n .ts-templates-grid {\n grid-template-columns: 1fr;\n gap: var(--ts-spacing-md);\n }\n\n .ts-goal-card {\n padding: var(--ts-spacing-md);\n }\n\n .ts-goal-header {\n flex-direction: column;\n gap: var(--ts-spacing-sm);\n padding-left: 30px;\n }\n\n .ts-goal-actions {\n flex-wrap: wrap;\n }\n\n .ts-goal-performance {\n grid-template-columns: 1fr 1fr;\n gap: var(--ts-spacing-sm);\n }\n\n .ts-goal-stat-value {\n font-size: 18px;\n }\n\n .ts-condition-row {\n flex-direction: column;\n }\n\n .ts-modal {\n width: 95%;\n max-height: 95vh;\n }\n\n .ts-modal-footer {\n flex-direction: column;\n }\n\n .ts-modal-footer .ts-btn {\n width: 100%;\n }\n}\n\n/* Small mobile */\n@media (max-width: 480px) {\n .ts-goal-performance {\n grid-template-columns: 1fr;\n }\n \n .ts-goal-header {\n padding-left: 28px;\n }\n \n .ts-goal-name {\n font-size: 15px;\n }\n}\n\n/* ========================================\n Dark Theme Support\n ======================================== */\n[data-theme="dark"] .ts-goals-page {\n background: var(--ts-bg-dark, #0f1419);\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-goal-card,\n[data-theme="dark"] .ts-template-card,\n[data-theme="dark"] .ts-modal-content,\n[data-theme="dark"] .ts-card {\n background: var(--ts-surface-dark, #1a1f26);\n border-color: var(--ts-border-dark, #2d3748);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);\n}\n\n[data-theme="dark"] .ts-goal-card:hover,\n[data-theme="dark"] .ts-template-card:hover {\n border-color: var(--ts-primary);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--ts-primary);\n}\n\n[data-theme="dark"] .ts-page-title,\n[data-theme="dark"] .ts-goal-title,\n[data-theme="dark"] .ts-template-title,\n[data-theme="dark"] .ts-modal-title {\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-page-description,\n[data-theme="dark"] .ts-goal-description,\n[data-theme="dark"] .ts-template-description,\n[data-theme="dark"] .ts-text-muted {\n color: var(--ts-text-muted-dark, #9ca3af);\n}\n\n[data-theme="dark"] .ts-kpi-value,\n[data-theme="dark"] .ts-perf-value {\n color: var(--ts-text-dark, #ffffff);\n}\n\n[data-theme="dark"] .ts-kpi-label,\n[data-theme="dark"] .ts-perf-label {\n color: var(--ts-text-muted-dark, #9ca3af);\n}\n\n[data-theme="dark"] .ts-btn-outline {\n border-color: var(--ts-border-dark, #2d3748);\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-btn-outline:hover {\n background: var(--ts-surface-dark, #2d3748);\n border-color: var(--ts-primary);\n}\n\n[data-theme="dark"] .ts-btn-danger-outline {\n border-color: var(--ts-danger);\n color: var(--ts-danger);\n}\n\n[data-theme="dark"] .ts-btn-danger-outline:hover {\n background: var(--ts-danger);\n color: #ffffff;\n}\n\n[data-theme="dark"] .ts-input,\n[data-theme="dark"] .ts-select,\n[data-theme="dark"] .ts-textarea {\n background: var(--ts-surface-dark, #0f1419);\n border-color: var(--ts-border-dark, #2d3748);\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-input:focus,\n[data-theme="dark"] .ts-select:focus,\n[data-theme="dark"] .ts-textarea:focus {\n border-color: var(--ts-primary);\n background: var(--ts-surface-dark, #1a1f26);\n}\n\n[data-theme="dark"] .ts-badge {\n background: rgba(59, 130, 246, 0.15);\n color: #60a5fa;\n}\n\n[data-theme="dark"] .ts-badge-success {\n background: rgba(16, 185, 129, 0.15);\n color: #34d399;\n}\n\n[data-theme="dark"] .ts-badge-warning {\n background: rgba(245, 158, 11, 0.15);\n color: #fbbf24;\n}\n\n[data-theme="dark"] .ts-badge-danger {\n background: rgba(239, 68, 68, 0.15);\n color: #f87171;\n}\n\n[data-theme="dark"] .ts-divider {\n border-color: var(--ts-border-dark, #2d3748);\n}\n\n[data-theme="dark"] .ts-goal-status-inactive {\n background: rgba(156, 163, 175, 0.1);\n color: #9ca3af;\n}\n\n[data-theme="dark"] .ts-empty-state {\n color: var(--ts-text-muted-dark, #9ca3af);\n}\n\n[data-theme="dark"] .ts-empty-state-title {\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-condition-row {\n background: var(--ts-bg-dark, #0f1419);\n border-color: var(--ts-border-dark, #2d3748);\n}\n\n[data-theme="dark"] .ts-template-category {\n color: var(--ts-text-muted-dark, #9ca3af);\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.05em;\n}\n\n[data-theme="dark"] .ts-modal-overlay {\n background: rgba(0, 0, 0, 0.85);\n}\n\n[data-theme="dark"] .ts-skeleton {\n background: linear-gradient(\n 90deg,\n var(--ts-surface-dark, #1a1f26) 0%,\n var(--ts-border-dark, #2d3748) 50%,\n var(--ts-surface-dark, #1a1f26) 100%\n );\n background-size: 200% 100%;\n}\n',"",{version:3,sources:["webpack://./src/styles/pages/GoalsPage.css"],names:[],mappings:"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",sourcesContent:['/**\r\n * Goals Page - Modern, User-Friendly Design\r\n * Features: CSS Variables, Dark Mode Support, Smooth Animations\r\n * Now using global CSS variables for consistent theming\r\n */\r\n\r\n/* ========================================\r\n Page Container\r\n\r\n ======================================== */\r\n.ts-goals-page {\r\n padding: var(--ts-spacing-lg);\r\n background: var(--ts-bg);\r\n min-height: 100vh;\r\n}\r\n\r\n/* ========================================\r\n Page Header\r\n ======================================== */\r\n.ts-page-header {\r\n margin-bottom: var(--ts-spacing-xl);\r\n}\r\n\r\n.ts-page-title {\r\n font-size: 28px;\r\n font-weight: 700;\r\n color: var(--ts-text);\r\n margin: 0 0 8px 0;\r\n letter-spacing: -0.025em;\r\n}\r\n\r\n.ts-page-description {\r\n font-size: 15px;\r\n color: var(--ts-text-muted);\r\n margin: 0;\r\n line-height: 1.6;\r\n}\r\n\r\n/* ========================================\r\n Tab Navigation\r\n ======================================== */\r\n.ts-goals-tabs {\r\n display: flex;\r\n gap: var(--ts-spacing-xs);\r\n margin-bottom: var(--ts-spacing-lg);\r\n border-bottom: 1px solid var(--ts-border);\r\n padding: 0;\r\n}\r\n\r\n.ts-goals-tab {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs);\r\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\r\n background: transparent;\r\n border: none;\r\n border-bottom: 2px solid transparent;\r\n color: var(--ts-text-muted);\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n position: relative;\r\n top: 1px;\r\n}\r\n\r\n.ts-goals-tab:hover {\r\n color: var(--ts-text);\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n.ts-goals-tab--active {\r\n color: var(--ts-primary);\r\n border-bottom-color: var(--ts-primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-goals-tab--active:hover {\r\n background: transparent;\r\n}\r\n\r\n[data-theme="dark"] .ts-goals-tab:hover {\r\n background: var(--ts-surface-hover-dark);\r\n}\r\n\r\n/* ========================================\r\n Goals Grid\r\n ======================================== */\r\n\r\n/* Summary Cards - Row Layout */\r\n.ts-goals-summary {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: var(--ts-spacing-md);\r\n margin-bottom: var(--ts-spacing-xl);\r\n}\r\n\r\n.ts-goals-summary-row {\r\n display: flex;\r\n flex-direction: row;\r\n gap: var(--ts-spacing-md);\r\n margin-bottom: var(--ts-spacing-xl);\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-goals-summary-row > * {\r\n flex: 1;\r\n min-width: 200px;\r\n}\r\n\r\n.ts-goals-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));\r\n gap: var(--ts-spacing-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n}\r\n\r\n/* ========================================\r\n Goal Card\r\n ======================================== */\r\n.ts-goal-card {\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n padding: var(--ts-spacing-lg);\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\r\n position: relative;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n}\r\n\r\n.ts-goal-card::before {\r\n content: \'\';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 3px;\r\n background: linear-gradient(90deg, var(--ts-primary), var(--ts-success));\r\n opacity: 0;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.ts-goal-card:hover {\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08);\r\n transform: translateY(-3px);\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n.ts-goal-card:hover::before {\r\n opacity: 1;\r\n}\r\n\r\n.ts-goal-card-selected {\r\n border-color: var(--ts-primary);\r\n background: var(--ts-surface-hover);\r\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\r\n}\r\n\r\n/* Goal Checkbox - Inline with header */\r\n.ts-goal-checkbox {\r\n position: absolute;\r\n top: var(--ts-spacing-lg);\r\n left: var(--ts-spacing-lg);\r\n z-index: 1;\r\n}\r\n\r\n.ts-goal-checkbox input[type="checkbox"] {\r\n margin: 0;\r\n cursor: pointer;\r\n width: 18px;\r\n height: 18px;\r\n accent-color: var(--ts-primary);\r\n}\r\n\r\n/* Goal Header */\r\n.ts-goal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n margin-bottom: var(--ts-spacing-md);\r\n gap: var(--ts-spacing-md);\r\n padding-left: 30px; /* Space for absolute checkbox */\r\n}\r\n\r\n.ts-goal-title-section {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-goal-title-row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm);\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-goal-name {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0;\r\n line-height: 1.4;\r\n}\r\n\r\n.ts-goal-description {\r\n font-size: 14px;\r\n color: var(--ts-text-muted);\r\n margin: 6px 0 0 0;\r\n line-height: 1.5;\r\n display: -webkit-box;\r\n line-clamp: 2;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n}\r\n\r\n/* Goal Actions */\r\n.ts-goal-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs);\r\n flex-shrink: 0;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-goal-status {\r\n font-size: 12px;\r\n font-weight: 600;\r\n padding: 6px 12px;\r\n border-radius: var(--ts-radius-full);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-goal-status.ts-active {\r\n background: var(--ts-success-soft);\r\n color: var(--ts-success);\r\n border: 1px solid var(--ts-success);\r\n}\r\n\r\n.ts-goal-status.ts-inactive {\r\n background: var(--ts-danger-soft);\r\n color: var(--ts-danger);\r\n border: 1px solid var(--ts-danger);\r\n}\r\n\r\n.ts-btn-icon {\r\n background: var(--ts-surface-hover);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n cursor: pointer;\r\n font-size: 18px;\r\n padding: 8px;\r\n color: var(--ts-text-muted);\r\n transition: all 0.2s ease;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n}\r\n\r\n.ts-btn-icon:hover {\r\n background: var(--ts-primary-soft);\r\n color: var(--ts-primary);\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.ts-btn-icon.ts-btn-danger:hover {\r\n background: var(--ts-danger-soft);\r\n color: var(--ts-danger);\r\n border-color: var(--ts-danger);\r\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.2);\r\n}\r\n\r\n/* Goal Details */\r\n.ts-goal-details {\r\n margin-bottom: var(--ts-spacing-md);\r\n}\r\n\r\n.ts-goal-meta {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--ts-spacing-sm);\r\n}\r\n\r\n.ts-goal-event,\r\n.ts-goal-conditions {\r\n font-size: 13px;\r\n color: var(--ts-text);\r\n background: var(--ts-bg-tertiary);\r\n padding: 6px 12px;\r\n border-radius: var(--ts-radius-md);\r\n border: 1px solid var(--ts-border);\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-goal-event:hover,\r\n.ts-goal-conditions:hover {\r\n background: var(--ts-primary-soft);\r\n border-color: var(--ts-primary);\r\n color: var(--ts-primary);\r\n transform: translateY(-1px);\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n/* Goal Performance */\r\n.ts-goal-performance {\r\n display: grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: var(--ts-spacing-md);\r\n padding-top: var(--ts-spacing-md);\r\n border-top: 1px solid var(--ts-border);\r\n margin-top: auto;\r\n}\r\n\r\n.ts-goal-stat {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.ts-goal-stat-label {\r\n font-size: 11px;\r\n color: var(--ts-text-muted);\r\n text-transform: uppercase;\r\n letter-spacing: 0.8px;\r\n font-weight: 600;\r\n}\r\n\r\n.ts-goal-stat-value {\r\n font-size: 24px;\r\n font-weight: 700;\r\n color: var(--ts-text);\r\n line-height: 1;\r\n}\r\n\r\n/* View Details Button */\r\n.ts-goal-view-details {\r\n width: 100%;\r\n margin-top: var(--ts-spacing-md);\r\n padding: var(--ts-spacing-sm) var(--ts-spacing-md);\r\n background: var(--ts-primary-soft);\r\n border: 1px solid var(--ts-primary);\r\n color: var(--ts-primary);\r\n border-radius: var(--ts-radius-md);\r\n font-size: 13px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ts-spacing-xs);\r\n position: relative;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n}\r\n\r\n.ts-goal-view-details svg {\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-goal-view-details::before {\r\n content: \'\';\r\n position: absolute;\r\n top: 0;\r\n left: -100%;\r\n width: 100%;\r\n height: 100%;\r\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);\r\n transition: left 0.5s ease;\r\n}\r\n\r\n.ts-goal-view-details:hover::before {\r\n left: 100%;\r\n}\r\n\r\n.ts-goal-view-details:hover {\r\n background: var(--ts-primary);\r\n color: var(--ts-bg-elevated);\r\n transform: translateY(-1px);\r\n box-shadow: var(--ts-shadow-md);\r\n}\r\n\r\n/* ========================================\r\n Empty State\r\n ======================================== */\r\n.ts-empty-state {\r\n text-align: center;\r\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\r\n background: var(--ts-surface);\r\n border: 2px dashed var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-empty-icon {\r\n font-size: 64px;\r\n margin-bottom: var(--ts-spacing-md);\r\n opacity: 0.5;\r\n}\r\n\r\n.ts-empty-state h2 {\r\n font-size: 22px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0 0 8px 0;\r\n}\r\n\r\n.ts-empty-state p {\r\n font-size: 15px;\r\n color: var(--ts-text-muted);\r\n margin: 0 0 var(--ts-spacing-lg) 0;\r\n line-height: 1.6;\r\n}\r\n\r\n/* ========================================\r\n Error Banner\r\n ======================================== */\r\n.ts-error-banner {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-md);\r\n background: var(--ts-danger-soft);\r\n border: 1px solid var(--ts-danger);\r\n border-radius: var(--ts-radius-lg);\r\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\r\n margin-bottom: var(--ts-spacing-lg);\r\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.15);\r\n}\r\n\r\n.ts-error-banner span {\r\n font-size: 24px;\r\n flex-shrink: 0;\r\n color: var(--ts-danger);\r\n}\r\n\r\n.ts-error-banner p {\r\n margin: 0;\r\n color: var(--ts-danger);\r\n font-size: 14px;\r\n font-weight: 500;\r\n line-height: 1.5;\r\n}\r\n\r\n/* ========================================\r\n Modal\r\n ======================================== */\r\n.ts-modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.65);\r\n backdrop-filter: blur(8px);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10000;\r\n animation: fadeIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n@keyframes fadeIn {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n\r\n\r\n@keyframes slideUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(20px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.ts-modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: var(--ts-spacing-lg);\r\n border-bottom: 1px solid var(--ts-border);\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n.ts-modal-header h2 {\r\n margin: 0;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n}\r\n\r\n.ts-modal-close {\r\n background: transparent;\r\n border: none;\r\n font-size: 24px;\r\n cursor: pointer;\r\n color: var(--ts-text-muted);\r\n padding: 8px;\r\n width: 40px;\r\n height: 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--ts-radius-md);\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-modal-close:hover {\r\n background: var(--ts-danger-soft);\r\n color: var(--ts-danger);\r\n transform: rotate(90deg);\r\n}\r\n\r\n.ts-modal-body {\r\n padding: var(--ts-spacing-lg);\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n.ts-modal-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: var(--ts-spacing-sm);\r\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\r\n border-top: 1px solid var(--ts-border);\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n/* ========================================\r\n Form Fields\r\n ======================================== */\r\n.ts-form-field {\r\n margin-bottom: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-form-field label {\r\n display: block;\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin-bottom: 8px;\r\n}\r\n\r\n.ts-field-help {\r\n font-size: 13px;\r\n color: var(--ts-text-muted);\r\n margin: 4px 0 0 0;\r\n line-height: 1.5;\r\n}\r\n\r\n.ts-form-field input[type="text"],\r\n.ts-form-field textarea,\r\n.ts-form-field select {\r\n width: 100%;\r\n padding: 10px 14px;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n font-size: 14px;\r\n color: var(--ts-text);\r\n background: var(--ts-surface);\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-form-field input[type="text"]:focus,\r\n.ts-form-field textarea:focus,\r\n.ts-form-field select:focus {\r\n outline: none;\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 0 0 3px var(--ts-primary-soft);\r\n}\r\n\r\n.ts-form-field textarea {\r\n resize: vertical;\r\n min-height: 100px;\r\n font-family: inherit;\r\n line-height: 1.6;\r\n}\r\n\r\n/* ========================================\r\n Condition Rows\r\n ======================================== */\r\n.ts-condition-row {\r\n display: flex;\r\n gap: var(--ts-spacing-sm);\r\n margin-bottom: var(--ts-spacing-sm);\r\n align-items: flex-start;\r\n}\r\n\r\n.ts-condition-param,\r\n.ts-condition-operator,\r\n.ts-condition-value {\r\n flex: 1;\r\n}\r\n\r\n.ts-condition-row .ts-btn-icon {\r\n flex-shrink: 0;\r\n margin-top: 2px;\r\n}\r\n\r\n/* ========================================\r\n Checkbox\r\n ======================================== */\r\n.ts-checkbox-label {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm);\r\n cursor: pointer;\r\n font-weight: normal !important;\r\n padding: var(--ts-spacing-sm);\r\n border-radius: var(--ts-radius-md);\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.ts-checkbox-label:hover {\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n.ts-checkbox-label input[type="checkbox"] {\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n accent-color: var(--ts-primary);\r\n}\r\n\r\n.ts-checkbox-label span {\r\n font-size: 14px;\r\n color: var(--ts-text);\r\n line-height: 1.5;\r\n}\r\n\r\n/* ========================================\r\n Buttons\r\n ======================================== */\r\n.ts-btn {\r\n padding: 10px 20px;\r\n border: none;\r\n border-radius: var(--ts-radius-md);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ts-spacing-sm);\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.ts-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n transform: none !important;\r\n}\r\n\r\n.ts-btn-primary {\r\n background: var(--ts-primary);\r\n color: var(--ts-bg-elevated);\r\n}\r\n\r\n.ts-btn-primary:hover:not(:disabled) {\r\n background: var(--ts-primary-hover);\r\n box-shadow: var(--ts-shadow-md);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.ts-btn-primary:active:not(:disabled) {\r\n transform: translateY(0);\r\n box-shadow: var(--ts-shadow-sm);\r\n}\r\n\r\n.ts-btn-secondary {\r\n background: var(--ts-surface-hover);\r\n color: var(--ts-text);\r\n border: 1px solid var(--ts-border);\r\n}\r\n\r\n.ts-btn-secondary:hover:not(:disabled) {\r\n background: var(--ts-bg-tertiary);\r\n border-color: var(--ts-text-muted);\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.ts-btn-sm {\r\n padding: 6px 14px;\r\n font-size: 13px;\r\n}\r\n\r\n/* ========================================\r\n Loading State\r\n ======================================== */\r\n.ts-loading-state {\r\n text-align: center;\r\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-spinner {\r\n width: 48px;\r\n height: 48px;\r\n border: 4px solid var(--ts-border);\r\n border-top-color: var(--ts-primary);\r\n border-radius: 50%;\r\n animation: spin 0.8s linear infinite;\r\n margin: 0 auto var(--ts-spacing-md);\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.ts-loading-state p {\r\n color: var(--ts-text-muted);\r\n font-size: 15px;\r\n font-weight: 500;\r\n}\r\n\r\n/* ========================================\r\n Templates Grid\r\n ======================================== */\r\n.ts-templates-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n gap: var(--ts-spacing-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-template-card {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.ts-template-card .ts-card-body {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n}\r\n\r\n.ts-template-icon {\r\n font-size: 48px;\r\n margin-bottom: var(--ts-spacing-md);\r\n text-align: center;\r\n}\r\n\r\n.ts-template-name {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0 0 8px 0;\r\n line-height: 1.4;\r\n}\r\n\r\n.ts-template-description {\r\n font-size: 14px;\r\n color: var(--ts-text-muted);\r\n margin: 0 0 var(--ts-spacing-md) 0;\r\n line-height: 1.6;\r\n flex: 1;\r\n}\r\n\r\n.ts-template-meta {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--ts-spacing-sm);\r\n margin-bottom: var(--ts-spacing-md);\r\n padding-top: var(--ts-spacing-md);\r\n border-top: 1px solid var(--ts-border);\r\n}\r\n\r\n.ts-template-add-btn {\r\n margin-top: auto;\r\n}\r\n\r\n/* ========================================\r\n Responsive Design\r\n ======================================== */\r\n\r\n/* Tablet and below */\r\n@media (max-width: 768px) {\r\n .ts-goals-page {\r\n padding: var(--ts-spacing-md);\r\n }\r\n\r\n .ts-templates-grid {\r\n grid-template-columns: 1fr;\r\n gap: var(--ts-spacing-md);\r\n }\r\n\r\n .ts-goal-card {\r\n padding: var(--ts-spacing-md);\r\n }\r\n\r\n .ts-goal-header {\r\n flex-direction: column;\r\n gap: var(--ts-spacing-sm);\r\n padding-left: 30px;\r\n }\r\n\r\n .ts-goal-actions {\r\n flex-wrap: wrap;\r\n }\r\n\r\n .ts-goal-performance {\r\n grid-template-columns: 1fr 1fr;\r\n gap: var(--ts-spacing-sm);\r\n }\r\n\r\n .ts-goal-stat-value {\r\n font-size: 18px;\r\n }\r\n\r\n .ts-condition-row {\r\n flex-direction: column;\r\n }\r\n\r\n .ts-modal {\r\n width: 95%;\r\n max-height: 95vh;\r\n }\r\n\r\n .ts-modal-footer {\r\n flex-direction: column;\r\n }\r\n\r\n .ts-modal-footer .ts-btn {\r\n width: 100%;\r\n }\r\n}\r\n\r\n/* Small mobile */\r\n@media (max-width: 480px) {\r\n .ts-goal-performance {\r\n grid-template-columns: 1fr;\r\n }\r\n \r\n .ts-goal-header {\r\n padding-left: 28px;\r\n }\r\n \r\n .ts-goal-name {\r\n font-size: 15px;\r\n }\r\n}\r\n\r\n/* ========================================\r\n Dark Theme Support\r\n ======================================== */\r\n[data-theme="dark"] .ts-goals-page {\r\n background: var(--ts-bg-dark, #0f1419);\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-card,\r\n[data-theme="dark"] .ts-template-card,\r\n[data-theme="dark"] .ts-modal-content,\r\n[data-theme="dark"] .ts-card {\r\n background: var(--ts-surface-dark, #1a1f26);\r\n border-color: var(--ts-border-dark, #2d3748);\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-card:hover,\r\n[data-theme="dark"] .ts-template-card:hover {\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--ts-primary);\r\n}\r\n\r\n[data-theme="dark"] .ts-page-title,\r\n[data-theme="dark"] .ts-goal-title,\r\n[data-theme="dark"] .ts-template-title,\r\n[data-theme="dark"] .ts-modal-title {\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-page-description,\r\n[data-theme="dark"] .ts-goal-description,\r\n[data-theme="dark"] .ts-template-description,\r\n[data-theme="dark"] .ts-text-muted {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n}\r\n\r\n[data-theme="dark"] .ts-kpi-value,\r\n[data-theme="dark"] .ts-perf-value {\r\n color: var(--ts-text-dark, #ffffff);\r\n}\r\n\r\n[data-theme="dark"] .ts-kpi-label,\r\n[data-theme="dark"] .ts-perf-label {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-outline {\r\n border-color: var(--ts-border-dark, #2d3748);\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-outline:hover {\r\n background: var(--ts-surface-dark, #2d3748);\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-danger-outline {\r\n border-color: var(--ts-danger);\r\n color: var(--ts-danger);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-danger-outline:hover {\r\n background: var(--ts-danger);\r\n color: #ffffff;\r\n}\r\n\r\n[data-theme="dark"] .ts-input,\r\n[data-theme="dark"] .ts-select,\r\n[data-theme="dark"] .ts-textarea {\r\n background: var(--ts-surface-dark, #0f1419);\r\n border-color: var(--ts-border-dark, #2d3748);\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-input:focus,\r\n[data-theme="dark"] .ts-select:focus,\r\n[data-theme="dark"] .ts-textarea:focus {\r\n border-color: var(--ts-primary);\r\n background: var(--ts-surface-dark, #1a1f26);\r\n}\r\n\r\n[data-theme="dark"] .ts-badge {\r\n background: rgba(59, 130, 246, 0.15);\r\n color: #60a5fa;\r\n}\r\n\r\n[data-theme="dark"] .ts-badge-success {\r\n background: rgba(16, 185, 129, 0.15);\r\n color: #34d399;\r\n}\r\n\r\n[data-theme="dark"] .ts-badge-warning {\r\n background: rgba(245, 158, 11, 0.15);\r\n color: #fbbf24;\r\n}\r\n\r\n[data-theme="dark"] .ts-badge-danger {\r\n background: rgba(239, 68, 68, 0.15);\r\n color: #f87171;\r\n}\r\n\r\n[data-theme="dark"] .ts-divider {\r\n border-color: var(--ts-border-dark, #2d3748);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-status-inactive {\r\n background: rgba(156, 163, 175, 0.1);\r\n color: #9ca3af;\r\n}\r\n\r\n[data-theme="dark"] .ts-empty-state {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n}\r\n\r\n[data-theme="dark"] .ts-empty-state-title {\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-condition-row {\r\n background: var(--ts-bg-dark, #0f1419);\r\n border-color: var(--ts-border-dark, #2d3748);\r\n}\r\n\r\n[data-theme="dark"] .ts-template-category {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n text-transform: uppercase;\r\n font-size: 12px;\r\n font-weight: 600;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n[data-theme="dark"] .ts-modal-overlay {\r\n background: rgba(0, 0, 0, 0.85);\r\n}\r\n\r\n[data-theme="dark"] .ts-skeleton {\r\n background: linear-gradient(\r\n 90deg,\r\n var(--ts-surface-dark, #1a1f26) 0%,\r\n var(--ts-border-dark, #2d3748) 50%,\r\n var(--ts-surface-dark, #1a1f26) 100%\r\n );\r\n background-size: 200% 100%;\r\n}\r\n'],sourceRoot:""}]);const i=s},80126:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Goal Modal Styles\n * \n * Unified styling for goal creation/editing modal\n * Supports dark/light themes with CSS variables\n * \n * @since 2.1.0\n * @package TrackSure\n */\n\n/* ============================================================\n Modal Content\n ============================================================ */\n\n.ts-goal-modal__content {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-lg, 1.5rem);\n padding: var(--ts-spacing-md, 1rem);\n}\n\n/* ============================================================\n Banner (Info/Error Messages)\n ============================================================ */\n\n.ts-goal-modal__banner {\n display: flex;\n align-items: flex-start;\n gap: var(--ts-spacing-sm, 0.75rem);\n padding: var(--ts-spacing-md, 1rem);\n border-radius: var(--ts-radius-lg, 8px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.ts-goal-modal__banner-icon {\n flex-shrink: 0;\n font-size: 1.25rem;\n line-height: 1;\n}\n\n.ts-goal-modal__banner--info {\n background: var(--ts-info-bg, #e0f2fe);\n border: 1px solid var(--ts-info-border, #7dd3fc);\n color: var(--ts-info-text, #0c4a6e);\n}\n\n[data-theme="dark"] .ts-goal-modal__banner--info {\n background: rgba(14, 116, 144, 0.1);\n border-color: rgba(6, 182, 212, 0.3);\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__banner--error {\n background: var(--ts-error-bg, #fef2f2);\n border: 1px solid var(--ts-error-border, #fca5a5);\n color: var(--ts-error-text, #991b1b);\n}\n\n[data-theme="dark"] .ts-goal-modal__banner--error {\n background: rgba(127, 29, 29, 0.2);\n border-color: rgba(248, 113, 113, 0.3);\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__banner strong {\n display: block;\n font-weight: 600;\n margin-bottom: 0.25rem;\n}\n\n.ts-goal-modal__banner p {\n margin: 0;\n color: inherit;\n opacity: 0.9;\n}\n\n/* ============================================================\n Sections\n ============================================================ */\n\n.ts-goal-modal__section {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-md, 1rem);\n}\n\n.ts-goal-modal__section-title {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm, 0.75rem);\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--ts-text-primary, #1e293b);\n}\n\n[data-theme="dark"] .ts-goal-modal__section-title {\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__section-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.25rem;\n line-height: 1;\n}\n\n/* ============================================================\n Form Fields\n ============================================================ */\n\n.ts-goal-modal__field {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-xs, 0.5rem);\n}\n\n.ts-goal-modal__label {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs, 0.5rem);\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--ts-text-primary, #334155);\n}\n\n[data-theme="dark"] .ts-goal-modal__label {\n color: var(--ts-text-primary, #e2e8f0);\n}\n\n.ts-goal-modal__label--required::after {\n content: \'*\';\n color: var(--ts-danger, #ef4444);\n margin-left: 0.125rem;\n}\n\n.ts-goal-modal__label-optional {\n font-size: 0.75rem;\n font-weight: 400;\n color: var(--ts-text-tertiary, #94a3b8);\n}\n\n/* Input Styles */\n.ts-goal-modal__input,\n.ts-goal-modal__textarea,\n.ts-goal-modal__select {\n width: 100%;\n padding: 0.625rem 0.875rem;\n font-size: 0.875rem;\n font-family: var(--ts-font-sans);\n color: var(--ts-text-primary, #1e293b);\n background: var(--ts-bg-primary, #ffffff);\n border: 1px solid var(--ts-border-color, #e2e8f0);\n border-radius: var(--ts-radius-md, 6px);\n transition: all var(--ts-fast, 120ms);\n outline: none;\n}\n\n[data-theme="dark"] .ts-goal-modal__input,\n[data-theme="dark"] .ts-goal-modal__textarea,\n[data-theme="dark"] .ts-goal-modal__select {\n color: var(--ts-text-primary, #f9fafb);\n background: var(--ts-bg-secondary, #1e293b);\n border-color: var(--ts-border-color, #334155);\n}\n\n.ts-goal-modal__input:hover,\n.ts-goal-modal__textarea:hover,\n.ts-goal-modal__select:hover {\n border-color: var(--ts-border-color-hover, #cbd5e1);\n}\n\n[data-theme="dark"] .ts-goal-modal__input:hover,\n[data-theme="dark"] .ts-goal-modal__textarea:hover,\n[data-theme="dark"] .ts-goal-modal__select:hover {\n border-color: var(--ts-border-color-hover, #475569);\n}\n\n.ts-goal-modal__input:focus,\n.ts-goal-modal__textarea:focus,\n.ts-goal-modal__select:focus {\n border-color: var(--ts-primary, #6366f1);\n box-shadow: var(--ts-ring, 0 0 0 3px rgba(99, 102, 241, 0.1));\n}\n\n[data-theme="dark"] .ts-goal-modal__input:focus,\n[data-theme="dark"] .ts-goal-modal__textarea:focus,\n[data-theme="dark"] .ts-goal-modal__select:focus {\n border-color: var(--ts-primary, #818cf8);\n box-shadow: 0 0 0 3px rgba(129, 140, 248, 0.2);\n}\n\n.ts-goal-modal__input::placeholder,\n.ts-goal-modal__textarea::placeholder {\n color: var(--ts-text-tertiary, #94a3b8);\n opacity: 1;\n}\n\n[data-theme="dark"] .ts-goal-modal__input::placeholder,\n[data-theme="dark"] .ts-goal-modal__textarea::placeholder {\n color: var(--ts-text-tertiary, #64748b);\n}\n\n.ts-goal-modal__textarea {\n resize: vertical;\n min-height: 80px;\n}\n\n/* Error State */\n.ts-goal-modal__input--error,\n.ts-goal-modal__textarea--error {\n border-color: var(--ts-danger, #ef4444);\n}\n\n[data-theme="dark"] .ts-goal-modal__input--error,\n[data-theme="dark"] .ts-goal-modal__textarea--error {\n border-color: var(--ts-danger, #f87171);\n}\n\n.ts-goal-modal__input--error:focus,\n.ts-goal-modal__textarea--error:focus {\n box-shadow: var(--ts-ring-danger, 0 0 0 3px rgba(239, 68, 68, 0.1));\n}\n\n[data-theme="dark"] .ts-goal-modal__input--error:focus,\n[data-theme="dark"] .ts-goal-modal__textarea--error:focus {\n box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.2);\n}\n\n/* ============================================================\n Help Text & Errors\n ============================================================ */\n\n.ts-goal-modal__help {\n margin: 0;\n font-size: 0.75rem;\n color: var(--ts-text-secondary, #64748b);\n line-height: 1.5;\n}\n\n[data-theme="dark"] .ts-goal-modal__help {\n color: var(--ts-text-secondary, #94a3b8);\n}\n\n.ts-goal-modal__error {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n margin: 0;\n font-size: 0.75rem;\n color: var(--ts-danger, #ef4444);\n line-height: 1.5;\n}\n\n[data-theme="dark"] .ts-goal-modal__error {\n color: var(--ts-danger, #f87171);\n}\n\n.ts-goal-modal__error::before {\n content: \'⚠\';\n font-size: 0.875rem;\n}\n\n.ts-goal-modal__error-list {\n margin: 0.5rem 0 0 0;\n padding-left: 1.25rem;\n list-style: disc;\n}\n\n.ts-goal-modal__error-list li {\n margin: 0.25rem 0;\n}\n\n/* ============================================================\n Toggle Switch\n ============================================================ */\n\n.ts-goal-modal__toggle {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm, 0.75rem);\n padding: var(--ts-spacing-md, 1rem);\n background: var(--ts-bg-secondary, #f8fafc);\n border: 1px solid var(--ts-border-color, #e2e8f0);\n border-radius: var(--ts-radius-lg, 8px);\n cursor: pointer;\n transition: all var(--ts-fast, 120ms);\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle {\n background: var(--ts-bg-tertiary, #0f172a);\n border-color: var(--ts-border-color, #1e293b);\n}\n\n.ts-goal-modal__toggle:hover {\n background: var(--ts-surface-hover, #f1f5f9);\n border-color: var(--ts-border-color-hover, #cbd5e1);\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle:hover {\n background: var(--ts-surface-hover, #1e293b);\n border-color: var(--ts-border-color-hover, #334155);\n}\n\n.ts-goal-modal__toggle-input {\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n cursor: pointer;\n accent-color: var(--ts-primary, #6366f1);\n}\n\n.ts-goal-modal__toggle-content {\n flex: 1;\n}\n\n.ts-goal-modal__toggle-title {\n font-weight: 600;\n font-size: 0.875rem;\n color: var(--ts-text-primary, #1e293b);\n margin-bottom: 0.125rem;\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle-title {\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__toggle-description {\n font-size: 0.75rem;\n color: var(--ts-text-secondary, #64748b);\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle-description {\n color: var(--ts-text-secondary, #94a3b8);\n}\n\n/* ============================================================\n Footer\n ============================================================ */\n\n.ts-goal-modal__footer {\n display: flex;\n gap: var(--ts-spacing-sm, 0.75rem);\n justify-content: flex-end;\n}\n\n/* ============================================================\n Responsive Design\n ============================================================ */\n\n@media (max-width: 768px) {\n .ts-goal-modal__content {\n padding: var(--ts-spacing-sm, 0.75rem);\n gap: var(--ts-spacing-md, 1rem);\n }\n\n .ts-goal-modal__section {\n gap: var(--ts-spacing-sm, 0.75rem);\n }\n\n .ts-goal-modal__footer {\n flex-direction: column;\n }\n\n .ts-goal-modal__footer .ts-btn {\n width: 100%;\n }\n}\n\n/* ============================================================\n Accessibility Improvements\n ============================================================ */\n\n/* Focus visible (keyboard navigation) */\n.ts-goal-modal__input:focus-visible,\n.ts-goal-modal__textarea:focus-visible,\n.ts-goal-modal__select:focus-visible,\n.ts-goal-modal__toggle-input:focus-visible {\n outline: 2px solid var(--ts-primary, #6366f1);\n outline-offset: 2px;\n}\n\n[data-theme="dark"] .ts-goal-modal__input:focus-visible,\n[data-theme="dark"] .ts-goal-modal__textarea:focus-visible,\n[data-theme="dark"] .ts-goal-modal__select:focus-visible,\n[data-theme="dark"] .ts-goal-modal__toggle-input:focus-visible {\n outline-color: var(--ts-primary, #818cf8);\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n .ts-goal-modal__input,\n .ts-goal-modal__textarea,\n .ts-goal-modal__select,\n .ts-goal-modal__toggle {\n border-width: 2px;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n .ts-goal-modal__input,\n .ts-goal-modal__textarea,\n .ts-goal-modal__select,\n .ts-goal-modal__toggle {\n transition: none;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/components/GoalModal.css"],names:[],mappings:"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",sourcesContent:['/**\r\n * Goal Modal Styles\r\n * \r\n * Unified styling for goal creation/editing modal\r\n * Supports dark/light themes with CSS variables\r\n * \r\n * @since 2.1.0\r\n * @package TrackSure\r\n */\r\n\r\n/* ============================================================\r\n Modal Content\r\n ============================================================ */\r\n\r\n.ts-goal-modal__content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-lg, 1.5rem);\r\n padding: var(--ts-spacing-md, 1rem);\r\n}\r\n\r\n/* ============================================================\r\n Banner (Info/Error Messages)\r\n ============================================================ */\r\n\r\n.ts-goal-modal__banner {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n padding: var(--ts-spacing-md, 1rem);\r\n border-radius: var(--ts-radius-lg, 8px);\r\n font-size: 0.875rem;\r\n line-height: 1.5;\r\n}\r\n\r\n.ts-goal-modal__banner-icon {\r\n flex-shrink: 0;\r\n font-size: 1.25rem;\r\n line-height: 1;\r\n}\r\n\r\n.ts-goal-modal__banner--info {\r\n background: var(--ts-info-bg, #e0f2fe);\r\n border: 1px solid var(--ts-info-border, #7dd3fc);\r\n color: var(--ts-info-text, #0c4a6e);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__banner--info {\r\n background: rgba(14, 116, 144, 0.1);\r\n border-color: rgba(6, 182, 212, 0.3);\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__banner--error {\r\n background: var(--ts-error-bg, #fef2f2);\r\n border: 1px solid var(--ts-error-border, #fca5a5);\r\n color: var(--ts-error-text, #991b1b);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__banner--error {\r\n background: rgba(127, 29, 29, 0.2);\r\n border-color: rgba(248, 113, 113, 0.3);\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__banner strong {\r\n display: block;\r\n font-weight: 600;\r\n margin-bottom: 0.25rem;\r\n}\r\n\r\n.ts-goal-modal__banner p {\r\n margin: 0;\r\n color: inherit;\r\n opacity: 0.9;\r\n}\r\n\r\n/* ============================================================\r\n Sections\r\n ============================================================ */\r\n\r\n.ts-goal-modal__section {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-md, 1rem);\r\n}\r\n\r\n.ts-goal-modal__section-title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n margin: 0;\r\n font-size: 1rem;\r\n font-weight: 600;\r\n color: var(--ts-text-primary, #1e293b);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__section-title {\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__section-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 1.25rem;\r\n line-height: 1;\r\n}\r\n\r\n/* ============================================================\r\n Form Fields\r\n ============================================================ */\r\n\r\n.ts-goal-modal__field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-xs, 0.5rem);\r\n}\r\n\r\n.ts-goal-modal__label {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs, 0.5rem);\r\n font-size: 0.875rem;\r\n font-weight: 500;\r\n color: var(--ts-text-primary, #334155);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__label {\r\n color: var(--ts-text-primary, #e2e8f0);\r\n}\r\n\r\n.ts-goal-modal__label--required::after {\r\n content: \'*\';\r\n color: var(--ts-danger, #ef4444);\r\n margin-left: 0.125rem;\r\n}\r\n\r\n.ts-goal-modal__label-optional {\r\n font-size: 0.75rem;\r\n font-weight: 400;\r\n color: var(--ts-text-tertiary, #94a3b8);\r\n}\r\n\r\n/* Input Styles */\r\n.ts-goal-modal__input,\r\n.ts-goal-modal__textarea,\r\n.ts-goal-modal__select {\r\n width: 100%;\r\n padding: 0.625rem 0.875rem;\r\n font-size: 0.875rem;\r\n font-family: var(--ts-font-sans);\r\n color: var(--ts-text-primary, #1e293b);\r\n background: var(--ts-bg-primary, #ffffff);\r\n border: 1px solid var(--ts-border-color, #e2e8f0);\r\n border-radius: var(--ts-radius-md, 6px);\r\n transition: all var(--ts-fast, 120ms);\r\n outline: none;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input,\r\n[data-theme="dark"] .ts-goal-modal__textarea,\r\n[data-theme="dark"] .ts-goal-modal__select {\r\n color: var(--ts-text-primary, #f9fafb);\r\n background: var(--ts-bg-secondary, #1e293b);\r\n border-color: var(--ts-border-color, #334155);\r\n}\r\n\r\n.ts-goal-modal__input:hover,\r\n.ts-goal-modal__textarea:hover,\r\n.ts-goal-modal__select:hover {\r\n border-color: var(--ts-border-color-hover, #cbd5e1);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input:hover,\r\n[data-theme="dark"] .ts-goal-modal__textarea:hover,\r\n[data-theme="dark"] .ts-goal-modal__select:hover {\r\n border-color: var(--ts-border-color-hover, #475569);\r\n}\r\n\r\n.ts-goal-modal__input:focus,\r\n.ts-goal-modal__textarea:focus,\r\n.ts-goal-modal__select:focus {\r\n border-color: var(--ts-primary, #6366f1);\r\n box-shadow: var(--ts-ring, 0 0 0 3px rgba(99, 102, 241, 0.1));\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input:focus,\r\n[data-theme="dark"] .ts-goal-modal__textarea:focus,\r\n[data-theme="dark"] .ts-goal-modal__select:focus {\r\n border-color: var(--ts-primary, #818cf8);\r\n box-shadow: 0 0 0 3px rgba(129, 140, 248, 0.2);\r\n}\r\n\r\n.ts-goal-modal__input::placeholder,\r\n.ts-goal-modal__textarea::placeholder {\r\n color: var(--ts-text-tertiary, #94a3b8);\r\n opacity: 1;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input::placeholder,\r\n[data-theme="dark"] .ts-goal-modal__textarea::placeholder {\r\n color: var(--ts-text-tertiary, #64748b);\r\n}\r\n\r\n.ts-goal-modal__textarea {\r\n resize: vertical;\r\n min-height: 80px;\r\n}\r\n\r\n/* Error State */\r\n.ts-goal-modal__input--error,\r\n.ts-goal-modal__textarea--error {\r\n border-color: var(--ts-danger, #ef4444);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input--error,\r\n[data-theme="dark"] .ts-goal-modal__textarea--error {\r\n border-color: var(--ts-danger, #f87171);\r\n}\r\n\r\n.ts-goal-modal__input--error:focus,\r\n.ts-goal-modal__textarea--error:focus {\r\n box-shadow: var(--ts-ring-danger, 0 0 0 3px rgba(239, 68, 68, 0.1));\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input--error:focus,\r\n[data-theme="dark"] .ts-goal-modal__textarea--error:focus {\r\n box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.2);\r\n}\r\n\r\n/* ============================================================\r\n Help Text & Errors\r\n ============================================================ */\r\n\r\n.ts-goal-modal__help {\r\n margin: 0;\r\n font-size: 0.75rem;\r\n color: var(--ts-text-secondary, #64748b);\r\n line-height: 1.5;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__help {\r\n color: var(--ts-text-secondary, #94a3b8);\r\n}\r\n\r\n.ts-goal-modal__error {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.375rem;\r\n margin: 0;\r\n font-size: 0.75rem;\r\n color: var(--ts-danger, #ef4444);\r\n line-height: 1.5;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__error {\r\n color: var(--ts-danger, #f87171);\r\n}\r\n\r\n.ts-goal-modal__error::before {\r\n content: \'⚠\';\r\n font-size: 0.875rem;\r\n}\r\n\r\n.ts-goal-modal__error-list {\r\n margin: 0.5rem 0 0 0;\r\n padding-left: 1.25rem;\r\n list-style: disc;\r\n}\r\n\r\n.ts-goal-modal__error-list li {\r\n margin: 0.25rem 0;\r\n}\r\n\r\n/* ============================================================\r\n Toggle Switch\r\n ============================================================ */\r\n\r\n.ts-goal-modal__toggle {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n padding: var(--ts-spacing-md, 1rem);\r\n background: var(--ts-bg-secondary, #f8fafc);\r\n border: 1px solid var(--ts-border-color, #e2e8f0);\r\n border-radius: var(--ts-radius-lg, 8px);\r\n cursor: pointer;\r\n transition: all var(--ts-fast, 120ms);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle {\r\n background: var(--ts-bg-tertiary, #0f172a);\r\n border-color: var(--ts-border-color, #1e293b);\r\n}\r\n\r\n.ts-goal-modal__toggle:hover {\r\n background: var(--ts-surface-hover, #f1f5f9);\r\n border-color: var(--ts-border-color-hover, #cbd5e1);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle:hover {\r\n background: var(--ts-surface-hover, #1e293b);\r\n border-color: var(--ts-border-color-hover, #334155);\r\n}\r\n\r\n.ts-goal-modal__toggle-input {\r\n width: 20px;\r\n height: 20px;\r\n flex-shrink: 0;\r\n cursor: pointer;\r\n accent-color: var(--ts-primary, #6366f1);\r\n}\r\n\r\n.ts-goal-modal__toggle-content {\r\n flex: 1;\r\n}\r\n\r\n.ts-goal-modal__toggle-title {\r\n font-weight: 600;\r\n font-size: 0.875rem;\r\n color: var(--ts-text-primary, #1e293b);\r\n margin-bottom: 0.125rem;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle-title {\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__toggle-description {\r\n font-size: 0.75rem;\r\n color: var(--ts-text-secondary, #64748b);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle-description {\r\n color: var(--ts-text-secondary, #94a3b8);\r\n}\r\n\r\n/* ============================================================\r\n Footer\r\n ============================================================ */\r\n\r\n.ts-goal-modal__footer {\r\n display: flex;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n justify-content: flex-end;\r\n}\r\n\r\n/* ============================================================\r\n Responsive Design\r\n ============================================================ */\r\n\r\n@media (max-width: 768px) {\r\n .ts-goal-modal__content {\r\n padding: var(--ts-spacing-sm, 0.75rem);\r\n gap: var(--ts-spacing-md, 1rem);\r\n }\r\n\r\n .ts-goal-modal__section {\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n }\r\n\r\n .ts-goal-modal__footer {\r\n flex-direction: column;\r\n }\r\n\r\n .ts-goal-modal__footer .ts-btn {\r\n width: 100%;\r\n }\r\n}\r\n\r\n/* ============================================================\r\n Accessibility Improvements\r\n ============================================================ */\r\n\r\n/* Focus visible (keyboard navigation) */\r\n.ts-goal-modal__input:focus-visible,\r\n.ts-goal-modal__textarea:focus-visible,\r\n.ts-goal-modal__select:focus-visible,\r\n.ts-goal-modal__toggle-input:focus-visible {\r\n outline: 2px solid var(--ts-primary, #6366f1);\r\n outline-offset: 2px;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input:focus-visible,\r\n[data-theme="dark"] .ts-goal-modal__textarea:focus-visible,\r\n[data-theme="dark"] .ts-goal-modal__select:focus-visible,\r\n[data-theme="dark"] .ts-goal-modal__toggle-input:focus-visible {\r\n outline-color: var(--ts-primary, #818cf8);\r\n}\r\n\r\n/* High contrast mode support */\r\n@media (prefers-contrast: high) {\r\n .ts-goal-modal__input,\r\n .ts-goal-modal__textarea,\r\n .ts-goal-modal__select,\r\n .ts-goal-modal__toggle {\r\n border-width: 2px;\r\n }\r\n}\r\n\r\n/* Reduced motion support */\r\n@media (prefers-reduced-motion: reduce) {\r\n .ts-goal-modal__input,\r\n .ts-goal-modal__textarea,\r\n .ts-goal-modal__select,\r\n .ts-goal-modal__toggle {\r\n transition: none;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},96478:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'.goal-bulk-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--ts-bg-secondary);\n border: 1px solid var(--ts-border-color);\n border-radius: 8px;\n margin-bottom: 16px;\n gap: 16px;\n}\n\n.bulk-actions-left {\n display: flex;\n align-items: center;\n}\n\n.bulk-select-all {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n cursor: pointer;\n user-select: none;\n}\n\n.bulk-select-all input[type="checkbox"] {\n margin: 0;\n cursor: pointer;\n}\n\n.bulk-select-all span {\n font-weight: 500;\n color: var(--ts-text-primary);\n}\n\n.bulk-actions-right {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.bulk-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n line-height: 1.4;\n border-radius: 4px;\n transition: all 0.2s ease;\n border: 1px solid var(--ts-border-color);\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n cursor: pointer;\n font-weight: 500;\n}\n\n.bulk-action-btn .dashicons {\n font-size: 16px;\n width: 16px;\n height: 16px;\n line-height: 16px;\n}\n\n.bulk-action-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n background: var(--ts-bg-hover);\n border-color: var(--ts-primary-color);\n}\n\n.bulk-action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background: var(--ts-bg-secondary);\n color: var(--ts-text-tertiary);\n}\n\n.bulk-action-btn.bulk-delete {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.bulk-action-btn.bulk-delete:hover {\n background: #dc3545;\n color: #fff;\n}\n\n/* Confirmation Dialog */\n.bulk-confirm-dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100000;\n backdrop-filter: blur(2px);\n}\n\n.bulk-confirm-dialog {\n background: var(--ts-bg-primary);\n border-radius: 8px;\n padding: 24px;\n max-width: 500px;\n width: 90%;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n}\n\n.bulk-confirm-dialog h3 {\n margin: 0 0 12px;\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.bulk-confirm-dialog p {\n margin: 0 0 20px;\n color: var(--ts-text-secondary);\n line-height: 1.5;\n}\n\n.bulk-confirm-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n}\n\n.bulk-confirm-actions .button {\n min-width: 80px;\n background: var(--ts-bg-primary);\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .goal-bulk-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .bulk-actions-left,\n .bulk-actions-right {\n justify-content: center;\n }\n\n .bulk-actions-right {\n width: 100%;\n }\n\n .bulk-action-btn {\n flex: 1;\n justify-content: center;\n }\n}\n\n@media (max-width: 480px) {\n .bulk-actions-right {\n flex-direction: column;\n }\n\n .bulk-action-btn {\n width: 100%;\n }\n\n .bulk-confirm-dialog {\n padding: 16px;\n }\n\n .bulk-confirm-actions {\n flex-direction: column-reverse;\n }\n\n .bulk-confirm-actions .button {\n width: 100%;\n }\n}\n\n/* Dark Theme */\n[data-theme="dark"] .bulk-confirm-dialog {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);\n}\n',"",{version:3,sources:["webpack://./src/components/goals/features/bulk-actions/GoalBulkActions.css"],names:[],mappings:"AAAA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,kBAAkB;EAClB,kCAAkC;EAClC,wCAAwC;EACxC,kBAAkB;EAClB,mBAAmB;EACnB,SAAS;AACX;;AAEA;EACE,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,SAAS;EACT,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,SAAS;EACT,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,eAAe;AACjB;;AAEA;EACE,oBAAoB;EACpB,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,kBAAkB;EAClB,yBAAyB;EACzB,wCAAwC;EACxC,gCAAgC;EAChC,6BAA6B;EAC7B,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,iBAAiB;AACnB;;AAEA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,qCAAqC;AACvC;;AAEA;EACE,YAAY;EACZ,mBAAmB;EACnB,kCAAkC;EAClC,8BAA8B;AAChC;;AAEA;EACE,cAAc;EACd,qBAAqB;AACvB;;AAEA;EACE,mBAAmB;EACnB,WAAW;AACb;;AAEA,wBAAwB;AACxB;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAS;EACT,8BAA8B;EAC9B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,eAAe;EACf,0BAA0B;AAC5B;;AAEA;EACE,gCAAgC;EAChC,kBAAkB;EAClB,aAAa;EACb,gBAAgB;EAChB,UAAU;EACV,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,gBAAgB;EAChB,+BAA+B;EAC/B,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,yBAAyB;AAC3B;;AAEA;EACE,eAAe;EACf,gCAAgC;AAClC;;AAEA,sBAAsB;AACtB;EACE;IACE,sBAAsB;IACtB,oBAAoB;EACtB;;EAEA;;IAEE,uBAAuB;EACzB;;EAEA;IACE,WAAW;EACb;;EAEA;IACE,OAAO;IACP,uBAAuB;EACzB;AACF;;AAEA;EACE;IACE,sBAAsB;EACxB;;EAEA;IACE,WAAW;EACb;;EAEA;IACE,aAAa;EACf;;EAEA;IACE,8BAA8B;EAChC;;EAEA;IACE,WAAW;EACb;AACF;;AAEA,eAAe;AACf;EACE,yCAAyC;AAC3C",sourcesContent:['.goal-bulk-actions {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n background: var(--ts-bg-secondary);\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 8px;\r\n margin-bottom: 16px;\r\n gap: 16px;\r\n}\r\n\r\n.bulk-actions-left {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.bulk-select-all {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin: 0;\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.bulk-select-all input[type="checkbox"] {\r\n margin: 0;\r\n cursor: pointer;\r\n}\r\n\r\n.bulk-select-all span {\r\n font-weight: 500;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.bulk-actions-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.bulk-action-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 6px 12px;\r\n font-size: 13px;\r\n line-height: 1.4;\r\n border-radius: 4px;\r\n transition: all 0.2s ease;\r\n border: 1px solid var(--ts-border-color);\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n cursor: pointer;\r\n font-weight: 500;\r\n}\r\n\r\n.bulk-action-btn .dashicons {\r\n font-size: 16px;\r\n width: 16px;\r\n height: 16px;\r\n line-height: 16px;\r\n}\r\n\r\n.bulk-action-btn:hover:not(:disabled) {\r\n transform: translateY(-1px);\r\n background: var(--ts-bg-hover);\r\n border-color: var(--ts-primary-color);\r\n}\r\n\r\n.bulk-action-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n background: var(--ts-bg-secondary);\r\n color: var(--ts-text-tertiary);\r\n}\r\n\r\n.bulk-action-btn.bulk-delete {\r\n color: #dc3545;\r\n border-color: #dc3545;\r\n}\r\n\r\n.bulk-action-btn.bulk-delete:hover {\r\n background: #dc3545;\r\n color: #fff;\r\n}\r\n\r\n/* Confirmation Dialog */\r\n.bulk-confirm-dialog-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 100000;\r\n backdrop-filter: blur(2px);\r\n}\r\n\r\n.bulk-confirm-dialog {\r\n background: var(--ts-bg-primary);\r\n border-radius: 8px;\r\n padding: 24px;\r\n max-width: 500px;\r\n width: 90%;\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n.bulk-confirm-dialog h3 {\r\n margin: 0 0 12px;\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.bulk-confirm-dialog p {\r\n margin: 0 0 20px;\r\n color: var(--ts-text-secondary);\r\n line-height: 1.5;\r\n}\r\n\r\n.bulk-confirm-actions {\r\n display: flex;\r\n gap: 8px;\r\n justify-content: flex-end;\r\n}\r\n\r\n.bulk-confirm-actions .button {\r\n min-width: 80px;\r\n background: var(--ts-bg-primary);\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 768px) {\r\n .goal-bulk-actions {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .bulk-actions-left,\r\n .bulk-actions-right {\r\n justify-content: center;\r\n }\r\n\r\n .bulk-actions-right {\r\n width: 100%;\r\n }\r\n\r\n .bulk-action-btn {\r\n flex: 1;\r\n justify-content: center;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .bulk-actions-right {\r\n flex-direction: column;\r\n }\r\n\r\n .bulk-action-btn {\r\n width: 100%;\r\n }\r\n\r\n .bulk-confirm-dialog {\r\n padding: 16px;\r\n }\r\n\r\n .bulk-confirm-actions {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .bulk-confirm-actions .button {\r\n width: 100%;\r\n }\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme="dark"] .bulk-confirm-dialog {\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);\r\n}\r\n'],sourceRoot:""}]);const i=s}}]);1 "use strict";(self.webpackChunktracksure_admin=self.webpackChunktracksure_admin||[]).push([[637],{9570:r=>{r.exports="data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2712%27 height=%2712%27 viewBox=%270 0 12 12%27%3E%3Cpath fill=%27%23666%27 d=%27M6 8L2 4h8z%27/%3E%3C/svg%3E"},12577:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Goals Overview Dashboard Styles\n * \n * Theme-aware styling for the goals dashboard with:\n * - KPI cards grid\n * - Chart visualization\n * - Top goals list\n * - Dark/light theme support\n * - Responsive design\n * \n * @package TrackSure\n * @since 2.1.0\n */\n\n/* ========================================\n Overview Container\n ======================================== */\n.ts-goals-overview {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-lg);\n}\n\n/* ========================================\n KPIs Row\n ======================================== */\n.ts-goals-overview__kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: var(--ts-spacing-md);\n}\n\n/* ========================================\n Chart Card\n ======================================== */\n.ts-goals-overview__chart {\n margin-top: var(--ts-spacing-md);\n}\n\n/* ========================================\n Premium Chart Container\n ======================================== */\n.ts-simple-chart {\n position: relative;\n padding: var(--ts-spacing-lg) var(--ts-spacing-md) var(--ts-spacing-md);\n}\n\n/* Chart Grid Lines - Background Reference */\n.ts-simple-chart::before {\n content: \'\';\n position: absolute;\n top: var(--ts-spacing-lg);\n left: var(--ts-spacing-md);\n right: var(--ts-spacing-md);\n height: 280px;\n background-image: \n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px);\n background-size: 100% 25%, 100% 25%, 100% 25%, 100% 25%;\n background-position: 0 0, 0 25%, 0 50%, 0 75%;\n background-repeat: no-repeat;\n opacity: 0.3;\n pointer-events: none;\n z-index: 0;\n}\n\n.ts-simple-chart__bars {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n height: 280px;\n gap: 12px;\n padding: 0;\n position: relative;\n z-index: 1;\n}\n\n.ts-simple-chart__bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ts-spacing-sm);\n height: 100%;\n justify-content: flex-end;\n animation: fadeInUp 0.4s ease-out backwards;\n}\n\n@keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Stagger animation for each bar */\n.ts-simple-chart__bar-wrapper:nth-child(1) { animation-delay: 0.05s; }\n.ts-simple-chart__bar-wrapper:nth-child(2) { animation-delay: 0.1s; }\n.ts-simple-chart__bar-wrapper:nth-child(3) { animation-delay: 0.15s; }\n.ts-simple-chart__bar-wrapper:nth-child(4) { animation-delay: 0.2s; }\n.ts-simple-chart__bar-wrapper:nth-child(5) { animation-delay: 0.25s; }\n.ts-simple-chart__bar-wrapper:nth-child(6) { animation-delay: 0.3s; }\n.ts-simple-chart__bar-wrapper:nth-child(7) { animation-delay: 0.35s; }\n\n.ts-simple-chart__bar {\n width: 100%;\n min-height: 20px;\n background: linear-gradient(\n 180deg, \n rgba(37, 99, 235, 0.9) 0%,\n rgba(37, 99, 235, 1) 50%,\n rgba(29, 78, 216, 1) 100%\n );\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 8px;\n cursor: pointer;\n box-shadow: \n 0 -2px 8px rgba(37, 99, 235, 0.15),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n}\n\n.ts-simple-chart__bar::after {\n content: \'\';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: rgba(255, 255, 255, 0.4);\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\n}\n\n.ts-simple-chart__bar:hover {\n background: linear-gradient(\n 180deg,\n rgba(16, 185, 129, 0.9) 0%,\n rgba(16, 185, 129, 1) 50%,\n rgba(5, 150, 105, 1) 100%\n );\n transform: translateY(-4px) scale(1.02);\n box-shadow: \n 0 -4px 16px rgba(16, 185, 129, 0.3),\n 0 4px 12px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\n z-index: 2;\n}\n\n[data-theme="dark"] .ts-simple-chart__bar {\n background: linear-gradient(\n 180deg,\n rgba(96, 165, 250, 0.8) 0%,\n rgba(59, 130, 246, 0.9) 50%,\n rgba(37, 99, 235, 1) 100%\n );\n box-shadow: \n 0 -2px 12px rgba(96, 165, 250, 0.25),\n inset 0 1px 0 rgba(255, 255, 255, 0.15);\n}\n\n[data-theme="dark"] .ts-simple-chart__bar:hover {\n background: linear-gradient(\n 180deg,\n rgba(52, 211, 153, 0.8) 0%,\n rgba(16, 185, 129, 0.9) 50%,\n rgba(5, 150, 105, 1) 100%\n );\n box-shadow: \n 0 -4px 20px rgba(52, 211, 153, 0.4),\n 0 4px 16px rgba(0, 0, 0, 0.2),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n}\n\n.ts-simple-chart__bar-value {\n font-size: 12px;\n font-weight: 700;\n color: white;\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n opacity: 0.9;\n transition: all 0.2s ease;\n line-height: 1;\n}\n\n.ts-simple-chart__bar:hover .ts-simple-chart__bar-value {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.ts-simple-chart__bar-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--ts-text-secondary);\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n transition: color 0.2s ease;\n}\n\n.ts-simple-chart__bar-wrapper:hover .ts-simple-chart__bar-label {\n color: var(--ts-text-primary);\n font-weight: 600;\n}\n\n/* ========================================\n Top Goals List\n ======================================== */\n.ts-goals-overview__top-goals {\n margin-top: var(--ts-spacing-md);\n}\n\n.ts-top-goals-list {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-sm);\n}\n\n.ts-top-goal {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-md);\n padding: var(--ts-spacing-md);\n background: var(--ts-bg);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n transition: all 0.2s ease;\n}\n\n.ts-top-goal:hover {\n background: var(--ts-surface-hover);\n border-color: var(--ts-primary);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n[data-theme="dark"] .ts-top-goal {\n background: var(--ts-surface-dark);\n}\n\n[data-theme="dark"] .ts-top-goal:hover {\n background: var(--ts-surface-hover-dark);\n}\n\n.ts-top-goal__rank {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--ts-primary);\n color: var(--ts-surface);\n border-radius: 50%;\n font-size: 13px;\n font-weight: 700;\n}\n\n.ts-top-goal__info {\n flex: 1;\n min-width: 0;\n}\n\n.ts-top-goal__name {\n font-size: 15px;\n font-weight: 600;\n color: var(--ts-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ts-top-goal__type {\n font-size: 13px;\n color: var(--ts-text-muted);\n text-transform: capitalize;\n}\n\n.ts-top-goal__metrics {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-md);\n flex-shrink: 0;\n}\n\n.ts-top-goal__conversions,\n.ts-top-goal__value {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs);\n font-size: 14px;\n font-weight: 600;\n color: var(--ts-text);\n}\n\n.ts-top-goal__conversions {\n color: var(--ts-success);\n}\n\n.ts-top-goal__value {\n color: var(--ts-primary);\n}\n\n/* ========================================\n Empty State\n ======================================== */\n.ts-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\n text-align: center;\n gap: var(--ts-spacing-md);\n}\n\n.ts-empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0;\n}\n\n.ts-empty-state p {\n font-size: 14px;\n color: var(--ts-text-muted);\n margin: 0;\n max-width: 400px;\n}\n\n.ts-empty-state--error {\n color: var(--ts-error);\n}\n\n.ts-empty-state--error h3 {\n color: var(--ts-error);\n}\n\n/* ========================================\n Responsive Design\n ======================================== */\n@media (max-width: 768px) {\n .ts-goals-overview__kpis {\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n }\n\n .ts-simple-chart::before {\n height: 200px;\n }\n\n .ts-simple-chart__bars {\n height: 200px;\n }\n\n .ts-simple-chart__bar-label {\n font-size: 10px;\n }\n\n .ts-top-goal {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--ts-spacing-sm);\n }\n\n .ts-top-goal__metrics {\n width: 100%;\n justify-content: space-between;\n }\n}\n\n/* ========================================\n Accessibility\n ======================================== */\n@media (prefers-reduced-motion: reduce) {\n .ts-simple-chart__bar,\n .ts-top-goal {\n transition: none;\n }\n}\n\n@media (prefers-contrast: high) {\n .ts-simple-chart__bar {\n border: 2px solid currentColor;\n }\n\n .ts-top-goal {\n border-width: 2px;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/views/GoalsOverview.css"],names:[],mappings:"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",sourcesContent:['/**\r\n * Goals Overview Dashboard Styles\r\n * \r\n * Theme-aware styling for the goals dashboard with:\r\n * - KPI cards grid\r\n * - Chart visualization\r\n * - Top goals list\r\n * - Dark/light theme support\r\n * - Responsive design\r\n * \r\n * @package TrackSure\r\n * @since 2.1.0\r\n */\r\n\r\n/* ========================================\r\n Overview Container\r\n ======================================== */\r\n.ts-goals-overview {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-lg);\r\n}\r\n\r\n/* ========================================\r\n KPIs Row\r\n ======================================== */\r\n.ts-goals-overview__kpis {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\r\n gap: var(--ts-spacing-md);\r\n}\r\n\r\n/* ========================================\r\n Chart Card\r\n ======================================== */\r\n.ts-goals-overview__chart {\r\n margin-top: var(--ts-spacing-md);\r\n}\r\n\r\n/* ========================================\r\n Premium Chart Container\r\n ======================================== */\r\n.ts-simple-chart {\r\n position: relative;\r\n padding: var(--ts-spacing-lg) var(--ts-spacing-md) var(--ts-spacing-md);\r\n}\r\n\r\n/* Chart Grid Lines - Background Reference */\r\n.ts-simple-chart::before {\r\n content: \'\';\r\n position: absolute;\r\n top: var(--ts-spacing-lg);\r\n left: var(--ts-spacing-md);\r\n right: var(--ts-spacing-md);\r\n height: 280px;\r\n background-image: \r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px),\r\n linear-gradient(to bottom, var(--ts-border-color) 1px, transparent 1px);\r\n background-size: 100% 25%, 100% 25%, 100% 25%, 100% 25%;\r\n background-position: 0 0, 0 25%, 0 50%, 0 75%;\r\n background-repeat: no-repeat;\r\n opacity: 0.3;\r\n pointer-events: none;\r\n z-index: 0;\r\n}\r\n\r\n.ts-simple-chart__bars {\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: space-between;\r\n height: 280px;\r\n gap: 12px;\r\n padding: 0;\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.ts-simple-chart__bar-wrapper {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm);\r\n height: 100%;\r\n justify-content: flex-end;\r\n animation: fadeInUp 0.4s ease-out backwards;\r\n}\r\n\r\n@keyframes fadeInUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n/* Stagger animation for each bar */\r\n.ts-simple-chart__bar-wrapper:nth-child(1) { animation-delay: 0.05s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(2) { animation-delay: 0.1s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(3) { animation-delay: 0.15s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(4) { animation-delay: 0.2s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(5) { animation-delay: 0.25s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(6) { animation-delay: 0.3s; }\r\n.ts-simple-chart__bar-wrapper:nth-child(7) { animation-delay: 0.35s; }\r\n\r\n.ts-simple-chart__bar {\r\n width: 100%;\r\n min-height: 20px;\r\n background: linear-gradient(\r\n 180deg, \r\n rgba(37, 99, 235, 0.9) 0%,\r\n rgba(37, 99, 235, 1) 50%,\r\n rgba(29, 78, 216, 1) 100%\r\n );\r\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n position: relative;\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: center;\r\n padding-top: 8px;\r\n cursor: pointer;\r\n box-shadow: \r\n 0 -2px 8px rgba(37, 99, 235, 0.15),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n.ts-simple-chart__bar::after {\r\n content: \'\';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 3px;\r\n background: rgba(255, 255, 255, 0.4);\r\n border-radius: var(--ts-radius-md) var(--ts-radius-md) 0 0;\r\n}\r\n\r\n.ts-simple-chart__bar:hover {\r\n background: linear-gradient(\r\n 180deg,\r\n rgba(16, 185, 129, 0.9) 0%,\r\n rgba(16, 185, 129, 1) 50%,\r\n rgba(5, 150, 105, 1) 100%\r\n );\r\n transform: translateY(-4px) scale(1.02);\r\n box-shadow: \r\n 0 -4px 16px rgba(16, 185, 129, 0.3),\r\n 0 4px 12px rgba(0, 0, 0, 0.1),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.3);\r\n z-index: 2;\r\n}\r\n\r\n[data-theme="dark"] .ts-simple-chart__bar {\r\n background: linear-gradient(\r\n 180deg,\r\n rgba(96, 165, 250, 0.8) 0%,\r\n rgba(59, 130, 246, 0.9) 50%,\r\n rgba(37, 99, 235, 1) 100%\r\n );\r\n box-shadow: \r\n 0 -2px 12px rgba(96, 165, 250, 0.25),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.15);\r\n}\r\n\r\n[data-theme="dark"] .ts-simple-chart__bar:hover {\r\n background: linear-gradient(\r\n 180deg,\r\n rgba(52, 211, 153, 0.8) 0%,\r\n rgba(16, 185, 129, 0.9) 50%,\r\n rgba(5, 150, 105, 1) 100%\r\n );\r\n box-shadow: \r\n 0 -4px 20px rgba(52, 211, 153, 0.4),\r\n 0 4px 16px rgba(0, 0, 0, 0.2),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n.ts-simple-chart__bar-value {\r\n font-size: 12px;\r\n font-weight: 700;\r\n color: white;\r\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\r\n opacity: 0.9;\r\n transition: all 0.2s ease;\r\n line-height: 1;\r\n}\r\n\r\n.ts-simple-chart__bar:hover .ts-simple-chart__bar-value {\r\n opacity: 1;\r\n transform: scale(1.1);\r\n}\r\n\r\n.ts-simple-chart__bar-label {\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: var(--ts-text-secondary);\r\n text-align: center;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n max-width: 100%;\r\n transition: color 0.2s ease;\r\n}\r\n\r\n.ts-simple-chart__bar-wrapper:hover .ts-simple-chart__bar-label {\r\n color: var(--ts-text-primary);\r\n font-weight: 600;\r\n}\r\n\r\n/* ========================================\r\n Top Goals List\r\n ======================================== */\r\n.ts-goals-overview__top-goals {\r\n margin-top: var(--ts-spacing-md);\r\n}\r\n\r\n.ts-top-goals-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-sm);\r\n}\r\n\r\n.ts-top-goal {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-md);\r\n padding: var(--ts-spacing-md);\r\n background: var(--ts-bg);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-top-goal:hover {\r\n background: var(--ts-surface-hover);\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n[data-theme="dark"] .ts-top-goal {\r\n background: var(--ts-surface-dark);\r\n}\r\n\r\n[data-theme="dark"] .ts-top-goal:hover {\r\n background: var(--ts-surface-hover-dark);\r\n}\r\n\r\n.ts-top-goal__rank {\r\n flex-shrink: 0;\r\n width: 32px;\r\n height: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--ts-primary);\r\n color: var(--ts-surface);\r\n border-radius: 50%;\r\n font-size: 13px;\r\n font-weight: 700;\r\n}\r\n\r\n.ts-top-goal__info {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-top-goal__name {\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.ts-top-goal__type {\r\n font-size: 13px;\r\n color: var(--ts-text-muted);\r\n text-transform: capitalize;\r\n}\r\n\r\n.ts-top-goal__metrics {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-md);\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-top-goal__conversions,\r\n.ts-top-goal__value {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs);\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n}\r\n\r\n.ts-top-goal__conversions {\r\n color: var(--ts-success);\r\n}\r\n\r\n.ts-top-goal__value {\r\n color: var(--ts-primary);\r\n}\r\n\r\n/* ========================================\r\n Empty State\r\n ======================================== */\r\n.ts-empty-state {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\r\n text-align: center;\r\n gap: var(--ts-spacing-md);\r\n}\r\n\r\n.ts-empty-state h3 {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0;\r\n}\r\n\r\n.ts-empty-state p {\r\n font-size: 14px;\r\n color: var(--ts-text-muted);\r\n margin: 0;\r\n max-width: 400px;\r\n}\r\n\r\n.ts-empty-state--error {\r\n color: var(--ts-error);\r\n}\r\n\r\n.ts-empty-state--error h3 {\r\n color: var(--ts-error);\r\n}\r\n\r\n/* ========================================\r\n Responsive Design\r\n ======================================== */\r\n@media (max-width: 768px) {\r\n .ts-goals-overview__kpis {\r\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\r\n }\r\n\r\n .ts-simple-chart::before {\r\n height: 200px;\r\n }\r\n\r\n .ts-simple-chart__bars {\r\n height: 200px;\r\n }\r\n\r\n .ts-simple-chart__bar-label {\r\n font-size: 10px;\r\n }\r\n\r\n .ts-top-goal {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: var(--ts-spacing-sm);\r\n }\r\n\r\n .ts-top-goal__metrics {\r\n width: 100%;\r\n justify-content: space-between;\r\n }\r\n}\r\n\r\n/* ========================================\r\n Accessibility\r\n ======================================== */\r\n@media (prefers-reduced-motion: reduce) {\r\n .ts-simple-chart__bar,\r\n .ts-top-goal {\r\n transition: none;\r\n }\r\n}\r\n\r\n@media (prefers-contrast: high) {\r\n .ts-simple-chart__bar {\r\n border: 2px solid currentColor;\r\n }\r\n\r\n .ts-top-goal {\r\n border-width: 2px;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},21421:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'.goal-filters {\n background: var(--ts-bg-secondary);\n border: 1px solid var(--ts-border-color);\n border-radius: 8px;\n margin-bottom: 16px;\n}\n\n.filters-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n gap: 16px;\n}\n\n.filters-search {\n position: relative;\n flex: 1;\n max-width: 400px;\n}\n\n.filters-search .dashicons-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--ts-text-tertiary);\n font-size: 18px;\n width: 18px;\n height: 18px;\n pointer-events: none;\n}\n\n.search-input {\n width: 100%;\n padding: 8px 36px 8px 36px;\n border: 1px solid var(--ts-border-color);\n border-radius: 6px;\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--ts-primary-color);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.clear-search {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--ts-text-tertiary);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.clear-search:hover {\n background: var(--ts-bg-hover);\n color: var(--ts-text-primary);\n}\n\n.clear-search .dashicons {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.filters-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filters-toggle {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--ts-border-color);\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n.filters-toggle .dashicons {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.filters-toggle:hover {\n background: var(--ts-bg-hover);\n border-color: var(--ts-primary-color);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.filters-toggle.active {\n background: var(--ts-primary-color);\n color: white;\n border-color: var(--ts-primary-color);\n}\n\n.filters-toggle.active:hover {\n background: var(--ts-primary-hover, #1d4ed8);\n}\n\n.filter-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 8px;\n height: 8px;\n background: #dc3545;\n border-radius: 50%;\n border: 2px solid var(--ts-bg-secondary);\n}\n\n.filters-panel {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 16px;\n padding: 16px;\n border-top: 1px solid var(--ts-border-color);\n animation: slideDown 0.2s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.filters-panel .filter-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n width:100%;\n background: var(--ts-surface);\n}\n\n.filter-group label {\n font-size: 12px;\n font-weight: 600;\n color: var(--ts-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.filter-group select {\n padding: 8px 12px;\n border: 1px solid var(--ts-border-color);\n border-radius: 6px;\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-group select:focus {\n outline: none;\n border-color: var(--ts-primary-color);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.filter-group select:hover {\n border-color: var(--ts-primary-color);\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .filters-header {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filters-search {\n max-width: none;\n }\n\n .filters-actions {\n justify-content: space-between;\n }\n\n .filters-panel {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 480px) {\n .filters-header {\n padding: 12px;\n }\n\n .filters-panel {\n padding: 12px;\n gap: 12px;\n }\n\n .search-input {\n font-size: 16px; /* Prevent zoom on iOS */\n }\n}\n\n/* Dark Theme */\n[data-theme="dark"] .search-input,\n[data-theme="dark"] .filter-group select {\n background: var(--ts-bg-secondary);\n}\n\n[data-theme="dark"] .search-input:focus,\n[data-theme="dark"] .filter-group select:focus {\n background: var(--ts-bg-primary);\n}\n',"",{version:3,sources:["webpack://./src/components/goals/features/filters/GoalFilters.css"],names:[],mappings:"AAAA;EACE,kCAAkC;EAClC,wCAAwC;EACxC,kBAAkB;EAClB,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,kBAAkB;EAClB,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;EAClB,UAAU;EACV,QAAQ;EACR,2BAA2B;EAC3B,8BAA8B;EAC9B,eAAe;EACf,WAAW;EACX,YAAY;EACZ,oBAAoB;AACtB;;AAEA;EACE,WAAW;EACX,0BAA0B;EAC1B,wCAAwC;EACxC,kBAAkB;EAClB,gCAAgC;EAChC,6BAA6B;EAC7B,eAAe;EACf,yBAAyB;AAC3B;;AAEA;EACE,aAAa;EACb,qCAAqC;EACrC,4CAA4C;AAC9C;;AAEA;EACE,kBAAkB;EAClB,UAAU;EACV,QAAQ;EACR,2BAA2B;EAC3B,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,eAAe;EACf,8BAA8B;EAC9B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;AAC3B;;AAEA;EACE,8BAA8B;EAC9B,6BAA6B;AAC/B;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;AACd;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;AACV;;AAEA;EACE,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;EACjB,wCAAwC;EACxC,gCAAgC;EAChC,6BAA6B;EAC7B,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,yBAAyB;AAC3B;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;AACd;;AAEA;EACE,8BAA8B;EAC9B,qCAAqC;EACrC,2BAA2B;EAC3B,wCAAwC;AAC1C;;AAEA;EACE,mCAAmC;EACnC,YAAY;EACZ,qCAAqC;AACvC;;AAEA;EACE,4CAA4C;AAC9C;;AAEA;EACE,kBAAkB;EAClB,SAAS;EACT,WAAW;EACX,UAAU;EACV,WAAW;EACX,mBAAmB;EACnB,kBAAkB;EAClB,wCAAwC;AAC1C;;AAEA;EACE,aAAa;EACb,2DAA2D;EAC3D,SAAS;EACT,aAAa;EACb,4CAA4C;EAC5C,8BAA8B;AAChC;;AAEA;EACE;IACE,UAAU;IACV,4BAA4B;EAC9B;EACA;IACE,UAAU;IACV,wBAAwB;EAC1B;AACF;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,QAAQ;EACR,UAAU;EACV,6BAA6B;AAC/B;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,+BAA+B;EAC/B,yBAAyB;EACzB,qBAAqB;AACvB;;AAEA;EACE,iBAAiB;EACjB,wCAAwC;EACxC,kBAAkB;EAClB,gCAAgC;EAChC,6BAA6B;EAC7B,eAAe;EACf,eAAe;EACf,yBAAyB;AAC3B;;AAEA;EACE,aAAa;EACb,qCAAqC;EACrC,4CAA4C;AAC9C;;AAEA;EACE,qCAAqC;AACvC;;AAEA,sBAAsB;AACtB;EACE;IACE,sBAAsB;IACtB,oBAAoB;EACtB;;EAEA;IACE,eAAe;EACjB;;EAEA;IACE,8BAA8B;EAChC;;EAEA;IACE,0BAA0B;EAC5B;AACF;;AAEA;EACE;IACE,aAAa;EACf;;EAEA;IACE,aAAa;IACb,SAAS;EACX;;EAEA;IACE,eAAe,EAAE,wBAAwB;EAC3C;AACF;;AAEA,eAAe;AACf;;EAEE,kCAAkC;AACpC;;AAEA;;EAEE,gCAAgC;AAClC",sourcesContent:['.goal-filters {\r\n background: var(--ts-bg-secondary);\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 8px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.filters-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n gap: 16px;\r\n}\r\n\r\n.filters-search {\r\n position: relative;\r\n flex: 1;\r\n max-width: 400px;\r\n}\r\n\r\n.filters-search .dashicons-search {\r\n position: absolute;\r\n left: 12px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: var(--ts-text-tertiary);\r\n font-size: 18px;\r\n width: 18px;\r\n height: 18px;\r\n pointer-events: none;\r\n}\r\n\r\n.search-input {\r\n width: 100%;\r\n padding: 8px 36px 8px 36px;\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 6px;\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n font-size: 14px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.search-input:focus {\r\n outline: none;\r\n border-color: var(--ts-primary-color);\r\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\r\n}\r\n\r\n.clear-search {\r\n position: absolute;\r\n right: 8px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n background: none;\r\n border: none;\r\n padding: 4px;\r\n cursor: pointer;\r\n color: var(--ts-text-tertiary);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.clear-search:hover {\r\n background: var(--ts-bg-hover);\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.clear-search .dashicons {\r\n font-size: 16px;\r\n width: 16px;\r\n height: 16px;\r\n}\r\n\r\n.filters-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.filters-toggle {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 6px 12px;\r\n border: 1px solid var(--ts-border-color);\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 13px;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.filters-toggle .dashicons {\r\n font-size: 16px;\r\n width: 16px;\r\n height: 16px;\r\n}\r\n\r\n.filters-toggle:hover {\r\n background: var(--ts-bg-hover);\r\n border-color: var(--ts-primary-color);\r\n transform: translateY(-1px);\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.filters-toggle.active {\r\n background: var(--ts-primary-color);\r\n color: white;\r\n border-color: var(--ts-primary-color);\r\n}\r\n\r\n.filters-toggle.active:hover {\r\n background: var(--ts-primary-hover, #1d4ed8);\r\n}\r\n\r\n.filter-badge {\r\n position: absolute;\r\n top: -4px;\r\n right: -4px;\r\n width: 8px;\r\n height: 8px;\r\n background: #dc3545;\r\n border-radius: 50%;\r\n border: 2px solid var(--ts-bg-secondary);\r\n}\r\n\r\n.filters-panel {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\r\n gap: 16px;\r\n padding: 16px;\r\n border-top: 1px solid var(--ts-border-color);\r\n animation: slideDown 0.2s ease;\r\n}\r\n\r\n@keyframes slideDown {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.filters-panel .filter-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n width:100%;\r\n background: var(--ts-surface);\r\n}\r\n\r\n.filter-group label {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--ts-text-secondary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.filter-group select {\r\n padding: 8px 12px;\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 6px;\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.filter-group select:focus {\r\n outline: none;\r\n border-color: var(--ts-primary-color);\r\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\r\n}\r\n\r\n.filter-group select:hover {\r\n border-color: var(--ts-primary-color);\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 768px) {\r\n .filters-header {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .filters-search {\r\n max-width: none;\r\n }\r\n\r\n .filters-actions {\r\n justify-content: space-between;\r\n }\r\n\r\n .filters-panel {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .filters-header {\r\n padding: 12px;\r\n }\r\n\r\n .filters-panel {\r\n padding: 12px;\r\n gap: 12px;\r\n }\r\n\r\n .search-input {\r\n font-size: 16px; /* Prevent zoom on iOS */\r\n }\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme="dark"] .search-input,\r\n[data-theme="dark"] .filter-group select {\r\n background: var(--ts-bg-secondary);\r\n}\r\n\r\n[data-theme="dark"] .search-input:focus,\r\n[data-theme="dark"] .filter-group select:focus {\r\n background: var(--ts-bg-primary);\r\n}\r\n'],sourceRoot:""}]);const i=s},27691:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'.goal-import-modal {\n background: var(--ts-bg-primary);\n border-radius: 12px;\n max-width: 600px;\n width: 90%;\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\n}\n\n.goal-import-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--ts-border-color);\n}\n\n.goal-import-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-close {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--ts-text-tertiary);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.goal-import-close:hover {\n background: var(--ts-bg-hover);\n color: var(--ts-text-primary);\n}\n\n.goal-import-close .dashicons {\n font-size: 20px;\n width: 20px;\n height: 20px;\n}\n\n.goal-import-body {\n padding: 24px;\n overflow-y: auto;\n flex: 1;\n}\n\n/* Dropzone */\n.goal-import-dropzone {\n border: 2px dashed var(--ts-border-color);\n border-radius: 8px;\n padding: 48px 24px;\n text-align: center;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--ts-bg-secondary);\n}\n\n.goal-import-dropzone:hover,\n.goal-import-dropzone.dragging {\n border-color: var(--ts-primary-color);\n background: var(--ts-primary-soft);\n}\n\n.goal-import-dropzone .dashicons {\n font-size: 48px;\n width: 48px;\n height: 48px;\n color: var(--ts-text-tertiary);\n margin-bottom: 16px;\n}\n\n.goal-import-dropzone h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-dropzone p {\n margin: 0;\n color: var(--ts-text-secondary);\n font-size: 14px;\n}\n\n/* Preview */\n.goal-import-preview h3 {\n margin: 0 0 12px;\n font-size: 16px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-preview > p {\n margin: 0 0 16px;\n color: var(--ts-text-secondary);\n}\n\n.preview-list {\n max-height: 400px;\n overflow-y: auto;\n border: 1px solid var(--ts-border-color);\n border-radius: 8px;\n background: var(--ts-bg-secondary);\n margin-bottom: 20px;\n}\n\n.preview-item {\n padding: 16px;\n border-bottom: 1px solid var(--ts-border-color);\n}\n\n.preview-item:last-child {\n border-bottom: none;\n}\n\n.preview-item-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n gap: 12px;\n}\n\n.preview-item-header strong {\n font-size: 15px;\n color: var(--ts-text-primary);\n flex: 1;\n}\n\n.preview-badge {\n display: inline-block;\n padding: 4px 10px;\n background: var(--ts-primary-soft);\n color: var(--ts-primary-color);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.preview-description {\n margin: 0 0 8px;\n color: var(--ts-text-secondary);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.preview-meta {\n display: flex;\n gap: 12px;\n font-size: 12px;\n color: var(--ts-text-tertiary);\n}\n\n.preview-meta span {\n text-transform: capitalize;\n}\n\n/* Actions */\n.goal-import-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.goal-import-actions .button {\n min-width: 100px;\n}\n\n/* Result */\n.goal-import-result {\n text-align: center;\n padding: 24px;\n}\n\n.goal-import-result .dashicons {\n font-size: 64px;\n width: 64px;\n height: 64px;\n margin-bottom: 16px;\n}\n\n.goal-import-result.success .dashicons {\n color: #10b981;\n}\n\n.goal-import-result.error .dashicons {\n color: #dc3545;\n}\n\n.goal-import-result h3 {\n margin: 0 0 12px;\n font-size: 20px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.goal-import-result p {\n margin: 0 0 20px;\n color: var(--ts-text-secondary);\n}\n\n.error-list {\n text-align: left;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 6px;\n padding: 12px 16px;\n margin-bottom: 20px;\n}\n\n[data-theme="dark"] .error-list {\n background: rgba(220, 53, 69, 0.1);\n border-color: rgba(220, 53, 69, 0.3);\n}\n\n.error-message {\n margin: 6px 0;\n color: #dc3545;\n font-size: 13px;\n line-height: 1.5;\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .goal-import-modal {\n max-width: 100%;\n width: 100%;\n height: 100%;\n max-height: 100vh;\n border-radius: 0;\n }\n\n .goal-import-dropzone {\n padding: 32px 16px;\n }\n\n .goal-import-actions {\n flex-direction: column-reverse;\n }\n\n .goal-import-actions .button {\n width: 100%;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/features/import/GoalImport.css"],names:[],mappings:"AAAA;EACE,gCAAgC;EAChC,mBAAmB;EACnB,gBAAgB;EAChB,UAAU;EACV,gBAAgB;EAChB,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,0CAA0C;AAC5C;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,kBAAkB;EAClB,+CAA+C;AACjD;;AAEA;EACE,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,eAAe;EACf,8BAA8B;EAC9B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;AAC3B;;AAEA;EACE,8BAA8B;EAC9B,6BAA6B;AAC/B;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;AACd;;AAEA;EACE,aAAa;EACb,gBAAgB;EAChB,OAAO;AACT;;AAEA,aAAa;AACb;EACE,yCAAyC;EACzC,kBAAkB;EAClB,kBAAkB;EAClB,kBAAkB;EAClB,eAAe;EACf,yBAAyB;EACzB,kCAAkC;AACpC;;AAEA;;EAEE,qCAAqC;EACrC,kCAAkC;AACpC;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,8BAA8B;EAC9B,mBAAmB;AACrB;;AAEA;EACE,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,SAAS;EACT,+BAA+B;EAC/B,eAAe;AACjB;;AAEA,YAAY;AACZ;EACE,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,gBAAgB;EAChB,+BAA+B;AACjC;;AAEA;EACE,iBAAiB;EACjB,gBAAgB;EAChB,wCAAwC;EACxC,kBAAkB;EAClB,kCAAkC;EAClC,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,+CAA+C;AACjD;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,kBAAkB;EAClB,SAAS;AACX;;AAEA;EACE,eAAe;EACf,6BAA6B;EAC7B,OAAO;AACT;;AAEA;EACE,qBAAqB;EACrB,iBAAiB;EACjB,kCAAkC;EAClC,8BAA8B;EAC9B,mBAAmB;EACnB,eAAe;EACf,gBAAgB;EAChB,0BAA0B;AAC5B;;AAEA;EACE,eAAe;EACf,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,SAAS;EACT,eAAe;EACf,8BAA8B;AAChC;;AAEA;EACE,0BAA0B;AAC5B;;AAEA,YAAY;AACZ;EACE,aAAa;EACb,SAAS;EACT,yBAAyB;AAC3B;;AAEA;EACE,gBAAgB;AAClB;;AAEA,WAAW;AACX;EACE,kBAAkB;EAClB,aAAa;AACf;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,gBAAgB;EAChB,+BAA+B;AACjC;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;EACnB,yBAAyB;EACzB,kBAAkB;EAClB,kBAAkB;EAClB,mBAAmB;AACrB;;AAEA;EACE,kCAAkC;EAClC,oCAAoC;AACtC;;AAEA;EACE,aAAa;EACb,cAAc;EACd,eAAe;EACf,gBAAgB;AAClB;;AAEA,eAAe;AACf;EACE;IACE,eAAe;IACf,WAAW;IACX,YAAY;IACZ,iBAAiB;IACjB,gBAAgB;EAClB;;EAEA;IACE,kBAAkB;EACpB;;EAEA;IACE,8BAA8B;EAChC;;EAEA;IACE,WAAW;EACb;AACF",sourcesContent:['.goal-import-modal {\r\n background: var(--ts-bg-primary);\r\n border-radius: 12px;\r\n max-width: 600px;\r\n width: 90%;\r\n max-height: 80vh;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.goal-import-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 20px 24px;\r\n border-bottom: 1px solid var(--ts-border-color);\r\n}\r\n\r\n.goal-import-header h2 {\r\n margin: 0;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-close {\r\n background: none;\r\n border: none;\r\n padding: 4px;\r\n cursor: pointer;\r\n color: var(--ts-text-tertiary);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.goal-import-close:hover {\r\n background: var(--ts-bg-hover);\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-close .dashicons {\r\n font-size: 20px;\r\n width: 20px;\r\n height: 20px;\r\n}\r\n\r\n.goal-import-body {\r\n padding: 24px;\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n/* Dropzone */\r\n.goal-import-dropzone {\r\n border: 2px dashed var(--ts-border-color);\r\n border-radius: 8px;\r\n padding: 48px 24px;\r\n text-align: center;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n background: var(--ts-bg-secondary);\r\n}\r\n\r\n.goal-import-dropzone:hover,\r\n.goal-import-dropzone.dragging {\r\n border-color: var(--ts-primary-color);\r\n background: var(--ts-primary-soft);\r\n}\r\n\r\n.goal-import-dropzone .dashicons {\r\n font-size: 48px;\r\n width: 48px;\r\n height: 48px;\r\n color: var(--ts-text-tertiary);\r\n margin-bottom: 16px;\r\n}\r\n\r\n.goal-import-dropzone h3 {\r\n margin: 0 0 8px;\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-dropzone p {\r\n margin: 0;\r\n color: var(--ts-text-secondary);\r\n font-size: 14px;\r\n}\r\n\r\n/* Preview */\r\n.goal-import-preview h3 {\r\n margin: 0 0 12px;\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-preview > p {\r\n margin: 0 0 16px;\r\n color: var(--ts-text-secondary);\r\n}\r\n\r\n.preview-list {\r\n max-height: 400px;\r\n overflow-y: auto;\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 8px;\r\n background: var(--ts-bg-secondary);\r\n margin-bottom: 20px;\r\n}\r\n\r\n.preview-item {\r\n padding: 16px;\r\n border-bottom: 1px solid var(--ts-border-color);\r\n}\r\n\r\n.preview-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.preview-item-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 8px;\r\n gap: 12px;\r\n}\r\n\r\n.preview-item-header strong {\r\n font-size: 15px;\r\n color: var(--ts-text-primary);\r\n flex: 1;\r\n}\r\n\r\n.preview-badge {\r\n display: inline-block;\r\n padding: 4px 10px;\r\n background: var(--ts-primary-soft);\r\n color: var(--ts-primary-color);\r\n border-radius: 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n text-transform: capitalize;\r\n}\r\n\r\n.preview-description {\r\n margin: 0 0 8px;\r\n color: var(--ts-text-secondary);\r\n font-size: 13px;\r\n line-height: 1.5;\r\n}\r\n\r\n.preview-meta {\r\n display: flex;\r\n gap: 12px;\r\n font-size: 12px;\r\n color: var(--ts-text-tertiary);\r\n}\r\n\r\n.preview-meta span {\r\n text-transform: capitalize;\r\n}\r\n\r\n/* Actions */\r\n.goal-import-actions {\r\n display: flex;\r\n gap: 12px;\r\n justify-content: flex-end;\r\n}\r\n\r\n.goal-import-actions .button {\r\n min-width: 100px;\r\n}\r\n\r\n/* Result */\r\n.goal-import-result {\r\n text-align: center;\r\n padding: 24px;\r\n}\r\n\r\n.goal-import-result .dashicons {\r\n font-size: 64px;\r\n width: 64px;\r\n height: 64px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.goal-import-result.success .dashicons {\r\n color: #10b981;\r\n}\r\n\r\n.goal-import-result.error .dashicons {\r\n color: #dc3545;\r\n}\r\n\r\n.goal-import-result h3 {\r\n margin: 0 0 12px;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.goal-import-result p {\r\n margin: 0 0 20px;\r\n color: var(--ts-text-secondary);\r\n}\r\n\r\n.error-list {\r\n text-align: left;\r\n background: #fef2f2;\r\n border: 1px solid #fecaca;\r\n border-radius: 6px;\r\n padding: 12px 16px;\r\n margin-bottom: 20px;\r\n}\r\n\r\n[data-theme="dark"] .error-list {\r\n background: rgba(220, 53, 69, 0.1);\r\n border-color: rgba(220, 53, 69, 0.3);\r\n}\r\n\r\n.error-message {\r\n margin: 6px 0;\r\n color: #dc3545;\r\n font-size: 13px;\r\n line-height: 1.5;\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 640px) {\r\n .goal-import-modal {\r\n max-width: 100%;\r\n width: 100%;\r\n height: 100%;\r\n max-height: 100vh;\r\n border-radius: 0;\r\n }\r\n\r\n .goal-import-dropzone {\r\n padding: 32px 16px;\r\n }\r\n\r\n .goal-import-actions {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .goal-import-actions .button {\r\n width: 100%;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},31637:(r,n,e)=>{e.r(n),e.d(n,{default:()=>mr});var a=e(74848),t=e(41594),o=e(37090),s=e(82381),i=e(87387);const A=["pageview","click","form_submit","scroll_depth","time_on_page","engagement","video_play","download","outbound_link","custom_event"],l=["equals","not_equals","contains","not_contains","starts_with","ends_with","greater_than","less_than","greater_than_or_equal","less_than_or_equal","matches_regex"],d=["none","fixed","dynamic"],c=["once","session","unlimited"];var p=e(87318),g=e(84013),m=e(51481),C=e(45767);const u={engagement:{id:"engagement",label:"Engagement",description:"Track user interactions and content engagement",icon:"MousePointer",color:"var(--color-primary)"},leads:{id:"leads",label:"Lead Generation",description:"Capture contact requests, forms, and inquiries",icon:"Users",color:"var(--color-success)"},ecommerce:{id:"ecommerce",label:"Ecommerce",description:"Track purchases, cart actions, and revenue",icon:"ShoppingCart",color:"var(--color-warning)"},content:{id:"content",label:"Content",description:"Monitor content consumption and downloads",icon:"FileText",color:"var(--color-info)"}},E=[{id:"eng_time_on_page",name:"Deep Content Engagement",description:"Visitors who spent 3+ minutes on a page",event_name:"page_exit",trigger_type:"time_on_page",category:"engagement",priority:1,recommended:!0,icon:"Timer",conditions:[{param:"time_seconds",operator:"greater_than_or_equal",value:180}],trigger_config:{time_seconds:180}},{id:"eng_scroll_depth",name:"Read to Bottom",description:"Visitors who scrolled to 80% of page",event_name:"scroll",trigger_type:"scroll_depth",category:"engagement",priority:2,recommended:!0,icon:"ArrowDown",conditions:[{param:"scroll_depth",operator:"greater_than_or_equal",value:80}],trigger_config:{scroll_depth:80}},{id:"eng_video_complete",name:"Video Completed",description:"Track video completion",event_name:"video_complete",trigger_type:"video_play",category:"engagement",priority:3,recommended:!0,icon:"Film",conditions:[]},{id:"eng_outbound_click",name:"Outbound Link Click",description:"Track external link clicks (affiliate, partner sites)",event_name:"outbound_click",trigger_type:"outbound_link",category:"engagement",priority:4,recommended:!1,icon:"ExternalLink",conditions:[]},{id:"eng_social_share",name:"Social Share Click",description:"Track content shares on social media",event_name:"click",trigger_type:"click",category:"engagement",priority:5,recommended:!1,icon:"Share2",conditions:[{param:"element_class",operator:"contains",value:"share"}],trigger_config:{css_selector:".share-button, .social-share"}},{id:"eng_search",name:"Site Search Used",description:"Track what visitors are searching for",event_name:"search",trigger_type:"custom_event",category:"engagement",priority:6,recommended:!1,icon:"Search",conditions:[]},{id:"eng_pricing_view",name:"Pricing Page Viewed",description:"High-intent visitors checking pricing",event_name:"page_view",trigger_type:"pageview",category:"engagement",priority:7,recommended:!0,icon:"DollarSign",conditions:[{param:"page_url",operator:"contains",value:"/pricing"}]},{id:"lead_contact_form",name:"Contact Form Submitted",description:"Track contact form submissions",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:1,recommended:!0,icon:"Mail",conditions:[{param:"form_name",operator:"contains",value:"contact"}],trigger_config:{form_id:"contact-form"},value_type:"fixed",typical_value:50},{id:"lead_phone_click",name:"Phone Number Clicked",description:"Track when visitors click your phone number",event_name:"click",trigger_type:"click",category:"leads",priority:2,recommended:!0,icon:"Phone",conditions:[{param:"element_type",operator:"equals",value:"tel"}],trigger_config:{css_selector:'a[href^="tel:"]'},value_type:"fixed",typical_value:60},{id:"lead_quote_request",name:"Quote Requested",description:"Track quote or estimate requests",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:3,recommended:!0,icon:"FileText",conditions:[{param:"form_name",operator:"contains",value:"quote"}],value_type:"fixed",typical_value:75},{id:"lead_email_click",name:"Email Link Clicked",description:"Track when visitors click your email address",event_name:"click",trigger_type:"click",category:"leads",priority:4,recommended:!1,icon:"AtSign",conditions:[{param:"element_type",operator:"equals",value:"mailto"}],trigger_config:{css_selector:'a[href^="mailto:"]'},value_type:"fixed",typical_value:40},{id:"lead_appointment",name:"Appointment Booked",description:"Track appointment/meeting bookings",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:5,recommended:!0,icon:"Calendar",conditions:[{param:"form_name",operator:"contains",value:"appointment"}],value_type:"fixed",typical_value:100},{id:"lead_chat_started",name:"Live Chat Started",description:"Track when visitors initiate live chat",event_name:"chat_started",trigger_type:"custom_event",category:"leads",priority:6,recommended:!1,icon:"MessageCircle",conditions:[],value_type:"fixed",typical_value:45},{id:"lead_callback_request",name:"Callback Requested",description:"Track callback form submissions",event_name:"form_submit",trigger_type:"form_submit",category:"leads",priority:7,recommended:!1,icon:"PhoneCall",conditions:[{param:"form_name",operator:"contains",value:"callback"}],value_type:"fixed",typical_value:55},{id:"ecom_purchase",name:"Purchase Completed",description:"Track completed transactions and revenue",event_name:"purchase",trigger_type:"custom_event",category:"ecommerce",priority:1,recommended:!0,icon:"DollarSign",conditions:[],value_type:"dynamic"},{id:"ecom_add_to_cart",name:"Add to Cart",description:"Track product additions to cart",event_name:"add_to_cart",trigger_type:"custom_event",category:"ecommerce",priority:2,recommended:!0,icon:"ShoppingCart",conditions:[]},{id:"ecom_checkout_start",name:"Checkout Started",description:"Track when customers begin checkout",event_name:"begin_checkout",trigger_type:"custom_event",category:"ecommerce",priority:3,recommended:!0,icon:"CreditCard",conditions:[]},{id:"ecom_product_view",name:"Product Viewed",description:"Track product page views",event_name:"view_item",trigger_type:"custom_event",category:"ecommerce",priority:4,recommended:!1,icon:"Package",conditions:[]},{id:"ecom_view_cart",name:"Cart Viewed",description:"Track cart page views",event_name:"view_cart",trigger_type:"custom_event",category:"ecommerce",priority:5,recommended:!1,icon:"Eye",conditions:[]},{id:"ecom_payment_info",name:"Payment Info Added",description:"Track when payment details are entered",event_name:"add_payment_info",trigger_type:"custom_event",category:"ecommerce",priority:6,recommended:!1,icon:"Lock",conditions:[]},{id:"ecom_remove_from_cart",name:"Remove from Cart",description:"Track cart abandonment signals",event_name:"remove_from_cart",trigger_type:"custom_event",category:"ecommerce",priority:7,recommended:!1,icon:"XCircle",conditions:[]},{id:"content_newsletter",name:"Newsletter Signup",description:"Track newsletter subscriptions",event_name:"form_submit",trigger_type:"form_submit",category:"content",priority:1,recommended:!0,icon:"Newspaper",conditions:[{param:"form_name",operator:"contains",value:"newsletter"}],trigger_config:{form_id:"newsletter-form"},value_type:"fixed",typical_value:10},{id:"content_download",name:"Resource Downloaded",description:"Track PDF, ebook, or template downloads",event_name:"file_download",trigger_type:"download",category:"content",priority:2,recommended:!0,icon:"Download",conditions:[],value_type:"fixed",typical_value:15},{id:"content_ebook",name:"Ebook Downloaded",description:"Track ebook or guide downloads",event_name:"file_download",trigger_type:"download",category:"content",priority:3,recommended:!0,icon:"BookOpen",conditions:[{param:"file_name",operator:"contains",value:".pdf"}],value_type:"fixed",typical_value:20},{id:"content_case_study",name:"Case Study Viewed",description:"Track case study page views",event_name:"page_view",trigger_type:"pageview",category:"content",priority:4,recommended:!1,icon:"BarChart2",conditions:[{param:"page_url",operator:"contains",value:"/case-stud"}]},{id:"content_webinar",name:"Webinar Registration",description:"Track webinar signups",event_name:"form_submit",trigger_type:"form_submit",category:"content",priority:5,recommended:!1,icon:"Video",conditions:[{param:"form_name",operator:"contains",value:"webinar"}],value_type:"fixed",typical_value:30},{id:"content_whitepaper",name:"Whitepaper Downloaded",description:"Track whitepaper downloads",event_name:"file_download",trigger_type:"download",category:"content",priority:6,recommended:!1,icon:"FileDown",conditions:[{param:"file_name",operator:"contains",value:"whitepaper"}],value_type:"fixed",typical_value:25},{id:"content_portfolio",name:"Portfolio Viewed",description:"Track portfolio or work samples page views",event_name:"page_view",trigger_type:"pageview",category:"content",priority:7,recommended:!1,icon:"Folder",conditions:[{param:"page_url",operator:"contains",value:"/portfolio"}]}],x=r=>E.filter(n=>n.category===r);var v=e(66557);const h={pageview:[{value:"page_url",label:"Page URL",example:"/pricing",description:"Full page URL (e.g., https://site.com/pricing or /pricing)"},{value:"page_path",label:"Page Path",example:"/products",description:"URL path only (without domain)"},{value:"page_title",label:"Page Title",example:"Pricing",description:"Browser page title"}],form_submit:[{value:"form_id",label:"Form ID",example:"gform_3",description:"HTML form ID attribute (e.g., gform_3, wpforms-form-1245)"},{value:"form_name",label:"Form Name",example:"contact",description:"Form name or type (e.g., contact, inquiry, newsletter)"},{value:"form_builder",label:"Form Builder",example:"gravity_forms",description:"Form builder plugin (gravity_forms, wpforms, contact_form_7, etc.)"},{value:"form_type",label:"Form Type",example:"contact",description:"Form category (contact, newsletter, inquiry, etc.)"}],click:[{value:"element_text",label:"Button/Link Text",example:"Buy Now",description:"Text inside the clicked element"},{value:"element_id",label:"Element ID",example:"cta-button",description:"HTML ID attribute of the element"},{value:"element_class",label:"Element Class",example:"btn-primary",description:"CSS class of the element"},{value:"element_type",label:"Element Type",example:"tel",description:"Link type (tel, mailto, etc.)"},{value:"link_url",label:"Link URL",example:"https://example.com",description:"Destination URL for links"}],scroll_depth:[{value:"scroll_depth",label:"Scroll Depth %",example:"75",description:"Scroll percentage (0-100)"},{value:"page_url",label:"Page URL",example:"/blog",description:"Track scroll on specific pages"}],time_on_page:[{value:"time_seconds",label:"Time (seconds)",example:"180",description:"Time spent on page in seconds"},{value:"page_url",label:"Page URL",example:"/blog",description:"Track time on specific pages"}],engagement:[{value:"scroll_depth",label:"Scroll Depth %",example:"50",description:"Minimum scroll percentage"},{value:"time_seconds",label:"Time (seconds)",example:"120",description:"Minimum time on page"},{value:"page_url",label:"Page URL",example:"/blog",description:"Track engagement on specific pages"}],video_play:[{value:"video_title",label:"Video Title",example:"product demo",description:"Video title or name"},{value:"video_url",label:"Video URL",example:"youtube.com/watch?v=",description:"Video source URL"},{value:"video_type",label:"Video Type",example:"youtube",description:"Video platform (html5, youtube, vimeo)"}],download:[{value:"file_name",label:"File Name",example:"pricing-guide",description:"Name of downloaded file"},{value:"file_type",label:"File Type",example:"pdf",description:"File extension (pdf, doc, jpg, etc.)"},{value:"link_url",label:"Download URL",example:"/downloads/",description:"Download link URL"}],outbound_link:[{value:"link_domain",label:"Link Domain",example:"partner.com",description:"External website domain"},{value:"link_url",label:"Link URL",example:"https://partner.com",description:"Full external URL"},{value:"link_text",label:"Link Text",example:"Visit Partner",description:"Text of the clicked link"}],custom_event:[{value:"event_name",label:"Event Name",example:"calculator_completed",description:"Custom event identifier"},{value:"page_url",label:"Page URL",example:"/pricing",description:"Full page URL where event fires"},{value:"page_path",label:"Page Path",example:"/products",description:"URL path only (without domain)"},{value:"page_title",label:"Page Title",example:"Pricing",description:"Browser page title when event fires"},{value:"referrer",label:"Referrer URL",example:"https://google.com",description:"Referring page URL"}]},b=[{value:"equals",label:"Equals",description:"Exact match (case-sensitive)"},{value:"not_equals",label:"Not equals",description:"Does not exactly match"},{value:"contains",label:"Contains",description:"Partial match (most flexible)"},{value:"not_contains",label:"Does not contain",description:"Excludes partial match"},{value:"starts_with",label:"Starts with",description:"Begins with the value"},{value:"ends_with",label:"Ends with",description:"Finishes with the value"},{value:"matches_regex",label:"Matches regex",description:"Advanced pattern matching"},{value:"greater_than",label:"Greater than",description:"For numbers only"},{value:"greater_than_or_equal",label:"Greater than or equal",description:"For numbers only"},{value:"less_than",label:"Less than",description:"For numbers only"},{value:"less_than_or_equal",label:"Less than or equal",description:"For numbers only"}],B=({conditions:r,onChange:n,triggerType:e,matchLogic:t="all",onMatchLogicChange:o})=>{const s=h[e]||[],i=(e,a,t)=>{const o=[...r];o[e]={...o[e],[a]:t},n(o)},A=r=>""!==r&&"__custom__"!==r&&!s.some(n=>n.value===r),l=r=>A(r)?"__custom__":r;return(0,a.jsxs)("div",{className:"ts-condition-builder",children:[(0,a.jsxs)("div",{className:"ts-condition-builder-header",children:[(0,a.jsx)("h4",{style:{margin:0},children:"Conditions"}),0===r.length&&(0,a.jsxs)("p",{style:{margin:"8px 0",color:"#666",fontSize:"13px"},children:["💡 No conditions = Goal will fire for ",(0,a.jsx)("strong",{children:"ALL"})," ",e," events"]})]}),(0,a.jsx)("div",{className:"ts-conditions-list",children:r.map((t,o)=>{const d=(c=t.param,s.find(r=>r.value===c));var c;return(0,a.jsxs)("div",{className:"ts-condition-row",style:{display:"grid",gridTemplateColumns:"1fr 1fr 1.5fr auto",gap:"12px",alignItems:"start",padding:"16px",background:"#f9fafb",borderRadius:"8px",marginBottom:"12px",border:"1px solid #e5e7eb"},children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"6px",fontSize:"13px",fontWeight:500},children:"Parameter"}),(0,a.jsxs)("select",{value:l(t.param),onChange:r=>{const n=r.target.value;i(o,"param","__custom__"===n?"":n)},style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px"},children:[(0,a.jsx)("option",{value:"",children:"Select parameter..."}),s.map(r=>(0,a.jsx)("option",{value:r.value,children:r.label},r.value)),"custom_event"===e&&(0,a.jsx)("option",{value:"__custom__",children:"✏️ Custom Data Key..."})]}),"custom_event"===e&&("__custom__"===l(t.param)||A(t.param))&&(0,a.jsx)("input",{type:"text",value:A(t.param)?t.param:"",onChange:r=>i(o,"param",r.target.value),placeholder:"e.g. product_id, amount, category",style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px",marginTop:"6px",background:"#fefce8"}}),d&&(0,a.jsx)("p",{style:{margin:"4px 0 0",fontSize:"12px",color:"#6b7280"},children:d.description}),"custom_event"===e&&A(t.param)&&(0,a.jsxs)("p",{style:{margin:"4px 0 0",fontSize:"12px",color:"#92400e"},children:["Matches key “",(0,a.jsx)("strong",{children:t.param}),"” from fireCustomEvent() data"]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"6px",fontSize:"13px",fontWeight:500},children:"Operator"}),(0,a.jsx)("select",{value:t.operator,onChange:r=>i(o,"operator",r.target.value),style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px"},children:b.map(r=>(0,a.jsx)("option",{value:r.value,title:r.description,children:r.label},r.value))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"6px",fontSize:"13px",fontWeight:500},children:"Value"}),(0,a.jsx)("input",{type:"text",value:t.value,onChange:r=>i(o,"value",r.target.value),placeholder:d?.example||"Enter value...",style:{width:"100%",padding:"8px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px"}}),d&&(0,a.jsxs)("p",{style:{margin:"4px 0 0",fontSize:"12px",color:"#6b7280"},children:["Example: ",(0,a.jsx)("code",{style:{background:"#e5e7eb",padding:"2px 6px",borderRadius:"4px"},children:d.example})]})]}),(0,a.jsx)("div",{style:{paddingTop:"28px"},children:(0,a.jsx)("button",{onClick:()=>(e=>{n(r.filter((r,n)=>n!==e))})(o),style:{padding:"8px 12px",background:"#ef4444",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:500},title:"Remove condition",children:"🗑️"})})]},o)})}),(0,a.jsx)("button",{onClick:()=>{n([...r,{param:"",operator:"contains",value:""}])},style:{padding:"10px 16px",background:"#3b82f6",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:500,marginBottom:"16px"},children:"➕ Add Condition"}),r.length>1&&o&&(0,a.jsxs)("div",{style:{padding:"16px",background:"#eff6ff",borderRadius:"8px",border:"1px solid #bfdbfe"},children:[(0,a.jsx)("label",{style:{display:"block",marginBottom:"8px",fontSize:"13px",fontWeight:500},children:"Match Logic"}),(0,a.jsxs)("div",{style:{display:"flex",gap:"12px"},children:[(0,a.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"6px",cursor:"pointer"},children:[(0,a.jsx)("input",{type:"radio",name:"match_logic",value:"all",checked:"all"===t,onChange:r=>o(r.target.value)}),(0,a.jsxs)("span",{style:{fontSize:"14px"},children:[(0,a.jsx)("strong",{children:"ALL"})," conditions must match (AND)"]})]}),(0,a.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"6px",cursor:"pointer"},children:[(0,a.jsx)("input",{type:"radio",name:"match_logic",value:"any",checked:"any"===t,onChange:r=>o(r.target.value)}),(0,a.jsxs)("span",{style:{fontSize:"14px"},children:[(0,a.jsx)("strong",{children:"ANY"})," condition can match (OR)"]})]})]}),(0,a.jsx)("p",{style:{margin:"8px 0 0",fontSize:"12px",color:"#1e40af"},children:"all"===t?"✓ Goal fires only when ALL conditions are satisfied":"✓ Goal fires when ANY ONE condition is satisfied"})]}),s.length>0&&(0,a.jsxs)("details",{style:{marginTop:"16px",fontSize:"13px",color:"#6b7280"},children:[(0,a.jsxs)("summary",{style:{cursor:"pointer",fontWeight:500},children:["💡 Available Parameters for ",e]}),(0,a.jsx)("ul",{style:{marginTop:"8px",paddingLeft:"20px"},children:s.map(r=>(0,a.jsxs)("li",{style:{marginBottom:"4px"},children:[(0,a.jsxs)("strong",{children:[r.label,":"]})," ",r.description,(0,a.jsx)("br",{}),(0,a.jsxs)("code",{style:{background:"#e5e7eb",padding:"2px 6px",borderRadius:"4px",fontSize:"12px"},children:["Example: ",r.example]})]},r.value))}),"custom_event"===e&&(0,a.jsxs)("div",{style:{marginTop:"12px",padding:"12px",background:"#fefce8",borderRadius:"6px",border:"1px solid #fde68a"},children:[(0,a.jsx)("strong",{style:{color:"#92400e"},children:"💡 Custom Data Keys"}),(0,a.jsx)("p",{style:{margin:"6px 0 0",fontSize:"12px",color:"#78350f"},children:"Select “Custom Data Key” to match any key from your event data. For example:"}),(0,a.jsx)("pre",{style:{margin:"6px 0 0",padding:"8px",background:"#fffbeb",borderRadius:"4px",fontSize:"11px",color:"#78350f",whiteSpace:"pre-wrap"},children:"window.trackSureGoals.fireCustomEvent('purchase', {\n product_id: 'sku-123',\n amount: '49.99',\n category: 'software'\n});"}),(0,a.jsxs)("p",{style:{margin:"6px 0 0",fontSize:"12px",color:"#78350f"},children:["Then use ",(0,a.jsx)("strong",{children:"product_id"}),", ",(0,a.jsx)("strong",{children:"amount"}),", or ",(0,a.jsx)("strong",{children:"category"})," as custom data keys in your conditions."]})]})]})]})};var f=e(71255),k=e(85072),_=e.n(k),y=e(97825),w=e.n(y),j=e(77659),z=e.n(j),N=e(55056),I=e.n(N),S=e(10540),T=e.n(S),D=e(41113),q=e.n(D),Y=e(80126),F={};F.styleTagTransform=q(),F.setAttributes=I(),F.insert=z().bind(null,"head"),F.domAPI=w(),F.insertStyleElement=T();_()(Y.A,F);Y.A&&Y.A.locals&&Y.A.locals;const R=[{value:"pageview",label:(0,f.__)("Page View","tracksure"),eventName:"page_view",icon:"📄"},{value:"click",label:(0,f.__)("Element Click","tracksure"),eventName:"click",icon:"👆"},{value:"form_submit",label:(0,f.__)("Form Submission","tracksure"),eventName:"form_submit",icon:"📝"},{value:"scroll_depth",label:(0,f.__)("Scroll Depth","tracksure"),eventName:"scroll",icon:"📜"},{value:"time_on_page",label:(0,f.__)("Time on Page","tracksure"),eventName:"time_on_page",icon:"⏱️"},{value:"engagement",label:(0,f.__)("Engagement Rate","tracksure"),eventName:"engagement",icon:"❤️"},{value:"video_play",label:(0,f.__)("Video Play","tracksure"),eventName:"video_play",icon:"🎬"},{value:"download",label:(0,f.__)("File Download","tracksure"),eventName:"file_download",icon:"💾"},{value:"outbound_link",label:(0,f.__)("Outbound Link","tracksure"),eventName:"outbound_click",icon:"🔗"},{value:"custom_event",label:(0,f.__)("Custom Event","tracksure"),eventName:"custom_event",icon:"⚡"}],G=({isOpen:r,onClose:n,onSave:e,mode:o,template:s,existingGoal:i})=>{const A=()=>"edit"===o&&i?{...i}:"create-from-template"===o&&s?{name:s.name,description:s.description,event_name:s.event_name,trigger_type:s.trigger_type,category:s.category,conditions:[...s.conditions||[]],match_logic:s.match_logic||"all",value_type:s.value_type||"none",value:s.typical_value||0,attribution_window:30,frequency:"unlimited",is_active:!0}:{name:"",description:"",event_name:"page_view",trigger_type:"pageview",category:"engagement",conditions:[],match_logic:"all",value_type:"none",value:0,attribution_window:30,frequency:"unlimited",is_active:!0},[l,d]=(0,t.useState)(A()),[c,p]=(0,t.useState)({}),[g,m]=(0,t.useState)(!1);(0,t.useEffect)(()=>{r&&(d(A()),p({}),m(!1))},[r,o,s,i]);const C=(r,n)=>{const e={...l,[r]:n};if("trigger_type"===r){const r=R.find(r=>r.value===n);r&&(e.event_name=r.eventName)}d(e),c[r]&&p(n=>({...n,[r]:void 0}))};return(0,a.jsx)(v.a,{isOpen:r,onClose:n,size:"lg",title:(()=>{switch(o){case"edit":return(0,f.__)("Edit Goal");case"create-from-template":return(0,f.__)("Customize Goal Template");default:return(0,f.__)("Create Custom Goal")}})(),footer:(0,a.jsxs)("div",{className:"ts-goal-modal__footer",children:[(0,a.jsx)("button",{onClick:n,className:"ts-btn ts-btn--secondary",disabled:g,"aria-label":(0,f.__)("Cancel"),children:(0,f.__)("Cancel")}),(0,a.jsx)("button",{onClick:async()=>{if((()=>{const r={};return l.name.trim()?l.name.trim().length<3?r.name=(0,f.__)("Goal name must be at least 3 characters"):l.name.trim().length>100&&(r.name=(0,f.__)("Goal name must not exceed 100 characters")):r.name=(0,f.__)("Goal name is required"),l.description&&l.description.length>500&&(r.description=(0,f.__)("Description must not exceed 500 characters")),"fixed"===l.value_type&&(!l.value||l.value<=0)&&(r.fixed_value=(0,f.__)("Fixed value must be greater than 0")),p(r),0===Object.keys(r).length})()){m(!0);try{const r={...l,name:l.name.trim(),description:l.description?.trim()||""};await e(r),n()}catch(r){p({name:(0,f.__)("An error occurred while saving. Please try again.")})}finally{m(!1)}}},className:"ts-btn ts-btn--primary",disabled:g,"aria-label":"edit"===o?(0,f.__)("Update goal"):(0,f.__)("Create goal"),children:g?(0,f.__)("Saving..."):"edit"===o?(0,f.__)("Update Goal"):(0,f.__)("Create Goal")})]}),children:(0,a.jsxs)("div",{className:"ts-goal-modal__content",children:["create-from-template"===o&&(0,a.jsxs)("div",{className:"ts-goal-modal__banner ts-goal-modal__banner--info",role:"alert",children:[(0,a.jsx)("span",{className:"ts-goal-modal__banner-icon",children:"💡"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Customize this template")}),(0,a.jsx)("p",{children:(0,f.__)("Modify the conditions to match your website's URLs, form IDs, or other specific values before creating.")})]})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"basic-info-heading",children:[(0,a.jsxs)("h3",{id:"basic-info-heading",className:"ts-goal-modal__section-title",children:[(0,a.jsx)("span",{className:"ts-goal-modal__section-icon",children:"📝"}),(0,f.__)("Basic Information")]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"goal-name",className:"ts-goal-modal__label ts-goal-modal__label--required",children:(0,f.__)("Goal Name")}),(0,a.jsx)("input",{id:"goal-name",type:"text",className:"ts-goal-modal__input "+(c.name?"ts-goal-modal__input--error":""),value:l.name,onChange:r=>C("name",r.target.value),placeholder:(0,f.__)("e.g., Pricing Page Viewed"),required:!0,"aria-required":"true","aria-invalid":!!c.name,"aria-describedby":c.name?"goal-name-error":void 0,maxLength:100}),c.name&&(0,a.jsx)("p",{id:"goal-name-error",className:"ts-goal-modal__error",role:"alert",children:c.name})]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsxs)("label",{htmlFor:"goal-description",className:"ts-goal-modal__label",children:[(0,f.__)("Description"),(0,a.jsxs)("span",{className:"ts-goal-modal__label-optional",children:[" (",(0,f.__)("optional"),")"]})]}),(0,a.jsx)("textarea",{id:"goal-description",className:"ts-goal-modal__textarea "+(c.description?"ts-goal-modal__input--error":""),value:l.description,onChange:r=>C("description",r.target.value),placeholder:(0,f.__)("Describe what this goal tracks..."),rows:3,"aria-invalid":!!c.description,"aria-describedby":c.description?"goal-description-error":void 0,maxLength:500}),c.description&&(0,a.jsx)("p",{id:"goal-description-error",className:"ts-goal-modal__error",role:"alert",children:c.description}),(0,a.jsxs)("p",{className:"ts-goal-modal__help",children:[(l.description||"").length,"/500 ",(0,f.__)("characters")]})]})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"trigger-heading",children:[(0,a.jsxs)("h3",{id:"trigger-heading",className:"ts-goal-modal__section-title",children:[(0,a.jsx)("span",{className:"ts-goal-modal__section-icon",children:"⚡"}),(0,f.__)("Trigger Type")]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"trigger-type",className:"ts-goal-modal__label ts-goal-modal__label--required",children:(0,f.__)("When should this goal fire?")}),(0,a.jsx)("select",{id:"trigger-type",className:"ts-goal-modal__select",value:l.trigger_type,onChange:r=>C("trigger_type",r.target.value),"aria-required":"true",children:R.map(r=>(0,a.jsxs)("option",{value:r.value,children:[r.icon," ",r.label]},r.value))}),(0,a.jsx)("p",{className:"ts-goal-modal__help",children:(r=>{const n={pageview:(0,f.__)("Fires when a specific page is viewed"),click:(0,f.__)("Fires when a specific element is clicked"),form_submit:(0,f.__)("Fires when a form is submitted"),scroll_depth:(0,f.__)("Fires when user scrolls to a specific depth"),time_on_page:(0,f.__)("Fires when user spends specific time on page"),engagement:(0,f.__)("Fires when user meets scroll + time engagement thresholds"),video_play:(0,f.__)("Fires when a video is played or completed"),download:(0,f.__)("Fires when a file is downloaded"),outbound_link:(0,f.__)("Fires when an external link is clicked"),custom_event:(0,f.__)("Fires when a custom event occurs (e.g., WooCommerce purchase)")};return r in n?n[r]:""})(l.trigger_type)})]}),"custom_event"===l.trigger_type&&(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"custom-event-name",className:"ts-goal-modal__label ts-goal-modal__label--required",children:(0,f.__)("Event Name")}),(0,a.jsx)("input",{id:"custom-event-name",type:"text",className:"ts-goal-modal__input",value:l.event_name||"",onChange:r=>C("event_name",r.target.value),placeholder:(0,f.__)("e.g., purchase, add_to_cart, calculator_completed")}),(0,a.jsx)("p",{className:"ts-goal-modal__help",children:(0,f.__)("The exact event name your custom code or WooCommerce dispatches")})]})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"conditions-heading",children:[(0,a.jsx)(B,{conditions:l.conditions,onChange:r=>C("conditions",r),triggerType:l.trigger_type,matchLogic:l.match_logic,onMatchLogicChange:r=>C("match_logic",r)}),c.conditions&&(0,a.jsx)("p",{className:"ts-goal-modal__error",role:"alert",children:c.conditions})]}),(0,a.jsxs)("section",{className:"ts-goal-modal__section","aria-labelledby":"value-heading",children:[(0,a.jsxs)("h3",{id:"value-heading",className:"ts-goal-modal__section-title",children:[(0,a.jsx)("span",{className:"ts-goal-modal__section-icon",children:"💰"}),(0,f.__)("Conversion Value")]}),(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsx)("label",{htmlFor:"value-type",className:"ts-goal-modal__label",children:(0,f.__)("Value Type")}),(0,a.jsxs)("select",{id:"value-type",className:"ts-goal-modal__select",value:l.value_type,onChange:r=>C("value_type",r.target.value),children:[(0,a.jsx)("option",{value:"none",children:(0,f.__)("No Value (Engagement Metric)")}),(0,a.jsx)("option",{value:"fixed",children:(0,f.__)("Fixed Value (Same for all conversions)")}),(0,a.jsx)("option",{value:"dynamic",children:(0,f.__)("Dynamic Value (Use transaction amount)")})]})]}),"fixed"===l.value_type&&(0,a.jsxs)("div",{className:"ts-goal-modal__field",children:[(0,a.jsxs)("label",{htmlFor:"fixed-value",className:"ts-goal-modal__label ts-goal-modal__label--required",children:[(0,f.__)("Fixed Value")," ($)"]}),(0,a.jsx)("input",{id:"fixed-value",type:"number",className:"ts-goal-modal__input "+(c.fixed_value?"ts-goal-modal__input--error":""),value:l.value||0,onChange:r=>C("value",parseFloat(r.target.value)||0),placeholder:"0",min:"0",step:"0.01",required:!0,"aria-required":"true","aria-invalid":!!c.fixed_value,"aria-describedby":c.fixed_value?"fixed-value-error":"fixed-value-help"}),c.fixed_value?(0,a.jsx)("p",{id:"fixed-value-error",className:"ts-goal-modal__error",role:"alert",children:c.fixed_value}):(0,a.jsx)("p",{id:"fixed-value-help",className:"ts-goal-modal__help",children:(0,f.__)("This value will be assigned to every conversion (e.g., lead value, estimated revenue)")})]}),"dynamic"===l.value_type&&(0,a.jsxs)("div",{className:"ts-goal-modal__banner ts-goal-modal__banner--info",children:[(0,a.jsx)("span",{className:"ts-goal-modal__banner-icon",children:"💡"}),(0,a.jsx)("div",{children:(0,f.__)("Value will be automatically pulled from transaction data (e.g., WooCommerce order total)")})]})]}),"edit"===o&&(0,a.jsx)("section",{className:"ts-goal-modal__section",children:(0,a.jsxs)("label",{className:"ts-goal-modal__toggle",children:[(0,a.jsx)("input",{type:"checkbox",className:"ts-goal-modal__toggle-input",checked:l.is_active,onChange:r=>C("is_active",r.target.checked),"aria-label":(0,f.__)("Activate this goal")}),(0,a.jsxs)("div",{className:"ts-goal-modal__toggle-content",children:[(0,a.jsx)("div",{className:"ts-goal-modal__toggle-title",children:(0,f.__)("Activate this goal")}),(0,a.jsx)("div",{className:"ts-goal-modal__toggle-description",children:(0,f.__)("Start tracking conversions for this goal")})]})]})}),Object.keys(c).length>0&&(0,a.jsxs)("div",{className:"ts-goal-modal__banner ts-goal-modal__banner--error",role:"alert",children:[(0,a.jsx)("span",{className:"ts-goal-modal__banner-icon",children:"⚠️"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Please fix the following errors:")}),(0,a.jsx)("ul",{className:"ts-goal-modal__error-list",children:Object.entries(c).map(([r,n])=>n&&(0,a.jsx)("li",{children:n},r))})]})]})]})})};var W=e(26604),L=e(99003),P=e(28343),U=e(51768),O={};O.styleTagTransform=q(),O.setAttributes=I(),O.insert=z().bind(null,"head"),O.domAPI=w(),O.insertStyleElement=T();_()(U.A,O);U.A&&U.A.locals&&U.A.locals;const M=({goal:r,onClose:n})=>{const{config:e,dateRange:s}=(0,o.n)(),A=(0,L.iW)(),[l,d]=(0,t.useState)("overview"),[c,p]=(0,t.useState)(1),[g,u]=(0,t.useState)("date"),[E,x]=(0,t.useState)("desc"),[h,b]=(0,t.useState)("all"),[B,k]=(0,t.useState)([]),[_,y]=(0,t.useState)(0),[w,j]=(0,t.useState)(!1),[z,N]=(0,t.useState)(null),[I,S]=(0,t.useState)(null),[T,D]=(0,t.useState)([]),[q,Y]=(0,t.useState)([]),[F,R]=(0,t.useState)(!0),[G,U]=(0,t.useState)(!1);(0,t.useEffect)(()=>{(async()=>{R(!0);try{const n=new i.n(e),a=await n.getGoalSources(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA"),attribution_model:"last_touch"});D(a.sources||[]);const t=await n.getGoalPerformance(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA")});t&&S({total_conversions:t.conversions||0,total_value:t.revenue||0,conversion_rate:t.conversion_rate||0,avg_value:t.avg_value||0,unique_visitors:t.unique_visitors||0,top_pages:(t.top_pages||[]).map(r=>({page_url:r.page,conversions:r.count}))})}catch(r){}finally{R(!1)}})()},[r.goal_id,s,e]),(0,t.useEffect)(()=>{if("timeline"!==l)return;(async()=>{j(!0),N(null);try{const n=new i.n(e),a=await n.getGoalTimeline(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA"),page:c,per_page:20});k(a.conversions||[]),y(a.total||0)}catch(r){const n=r instanceof Error?r.message:(0,f.__)("Failed to load conversions","tracksure");N(n)}finally{j(!1)}})()},[r.goal_id,s,c,e,l]),(0,t.useEffect)(()=>{if("devices"!==l)return;(async()=>{U(!0);try{const n=new i.n(e),a=await n.getGoalDevices(r.goal_id,{date_start:s.start.toLocaleDateString("en-CA"),date_end:s.end.toLocaleDateString("en-CA")});Y((a.devices||[]).map(r=>({device:r.device||"desktop",browser:r.browser||"unknown",conversions:r.conversions||0,percentage:r.percentage||0})))}catch(r){}finally{U(!1)}})()},[r.goal_id,s,e,l]);const O=(0,t.useMemo)(()=>{const r=new Set(B.map(r=>r.source||"direct"));return["all",...Array.from(r)]},[B]),M=(0,t.useMemo)(()=>{let r=[...B];return"all"!==h&&(r=r.filter(r=>(r.source||"direct")===h)),r.sort((r,n)=>{let e=0;return"date"===g?e=new Date(r.converted_at.replace(" ","T")+"Z").getTime()-new Date(n.converted_at.replace(" ","T")+"Z").getTime():"value"===g?e=(r.value||0)-(n.value||0):"page"===g&&(e=(r.page_url||"").localeCompare(n.page_url||"")),"asc"===E?e:-e}),r},[B,h,g,E]),Z=r=>{g===r?x("asc"===E?"desc":"asc"):(u(r),x("desc"))},V=r=>r.product_name?r.product_name:r.product_id?`Product #${r.product_id}`:r.form_id?`Form: ${r.form_id}`:r.element_selector?r.element_selector:null,$=Math.ceil(_/20),X=()=>{const n=[(0,f.__)("Date","tracksure"),(0,f.__)("Page URL","tracksure"),"none"!==r.value_type?(0,f.__)("Value","tracksure"):null,(0,f.__)("Context","tracksure"),(0,f.__)("Source","tracksure"),(0,f.__)("Medium","tracksure"),(0,f.__)("Campaign","tracksure"),(0,f.__)("Device","tracksure"),(0,f.__)("Browser","tracksure")].filter(Boolean),e=M.map(e=>[e.converted_at,e.page_url,"none"!==r.value_type?e.value:null,V(e)||"-",e.source||"direct",e.medium||"-",e.campaign||"-",e.device||"-",e.browser||"-"].filter((r,e)=>null!==n[e])),a=[n.join(","),...e.map(r=>r.map(r=>`"${r}"`).join(","))].join("\n"),t=new Blob([a],{type:"text/csv"}),o=window.URL.createObjectURL(t),s=document.createElement("a");s.href=o,s.download=`${r.name.replace(/[^a-z0-9]/gi,"_")}_conversions.csv`,s.click(),window.URL.revokeObjectURL(o)},Q=()=>F?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading overview...","tracksure")})]}):I?(0,a.jsxs)("div",{className:"ts-goal-overview-tab",children:[(0,a.jsxs)("div",{className:"ts-overview-metrics",children:[(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Total Conversions","tracksure")}),(0,a.jsx)("div",{className:"ts-metric-value",children:I.total_conversions.toLocaleString()})]})})}),"none"!==r.value_type&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Total Value","tracksure")}),(0,a.jsx)("div",{className:"ts-metric-value",children:(0,P.vv)(I.total_value)})]})})}),(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Average Value","tracksure")}),(0,a.jsx)("div",{className:"ts-metric-value",children:(0,P.vv)(I.avg_value)})]})})})]}),(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-metric",children:[(0,a.jsx)("div",{className:"ts-metric-label",children:(0,f.__)("Conversion Rate","tracksure")}),(0,a.jsxs)("div",{className:"ts-metric-value",children:[I.conversion_rate.toFixed(2),"%"]})]})})})]}),I.top_pages&&I.top_pages.length>0&&(0,a.jsxs)(C.Zp,{children:[(0,a.jsx)(C.aR,{children:(0,f.__)("Top Converting Pages","tracksure")}),(0,a.jsx)(C.bw,{children:(0,a.jsx)("div",{className:"ts-top-pages",children:I.top_pages.map((r,n)=>(0,a.jsxs)("div",{className:"ts-top-page",children:[(0,a.jsxs)("div",{className:"ts-top-page-rank",children:["#",n+1]}),(0,a.jsx)("div",{className:"ts-top-page-url",children:(0,a.jsx)("a",{href:r.page_url,target:"_blank",rel:"noopener noreferrer",children:r.page_url})}),(0,a.jsx)("div",{className:"ts-top-page-conversions",children:(0,a.jsxs)(W.E,{variant:"success",children:[r.conversions," ",(0,f.__)("conversions","tracksure")]})})]},n))})})]})]}):(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"BarChart3",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No data available for this period.","tracksure")})]}),H=()=>(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"ts-modal-filters",children:[(0,a.jsxs)("div",{className:"ts-filter-group",children:[(0,a.jsx)("label",{children:(0,f.__)("Filter by Source:","tracksure")}),(0,a.jsx)("select",{value:h,onChange:r=>b(r.target.value),className:"ts-filter-select",children:O.map(r=>(0,a.jsx)("option",{value:r,children:"all"===r?(0,f.__)("All Sources","tracksure"):r},r))})]}),(0,a.jsxs)("button",{className:"ts-export-btn",onClick:X,children:[(0,a.jsx)(m.I,{name:"Download",size:14}),(0,f.__)("Export CSV","tracksure")]})]}),(0,a.jsx)("div",{className:"ts-modal-content",children:w?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading conversions...","tracksure")})]}):z?(0,a.jsxs)("div",{className:"ts-error",children:[(0,a.jsx)(m.I,{name:"AlertCircle",size:24}),(0,a.jsx)("span",{children:z})]}):0===M.length?(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"FileText",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No conversions found for this date range.","tracksure")})]}):(0,a.jsx)("div",{className:"ts-table-scroll",children:(0,a.jsxs)("table",{className:"ts-conversions-table",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{children:[(0,a.jsxs)("th",{onClick:()=>Z("date"),className:"date"===g?"ts-sorted":"",children:[(0,f.__)("Date","tracksure")," ","date"===g&&("asc"===E?"↑":"↓")]}),(0,a.jsxs)("th",{onClick:()=>Z("page"),className:"page"===g?"ts-sorted":"",children:[(0,f.__)("Page URL","tracksure")," ","page"===g&&("asc"===E?"↑":"↓")]}),(0,a.jsx)("th",{children:(0,f.__)("Context","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Source","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Device","tracksure")}),"none"!==r.value_type&&(0,a.jsxs)("th",{onClick:()=>Z("value"),className:"value"===g?"ts-sorted":"",children:[(0,f.__)("Value","tracksure")," ","value"===g&&("asc"===E?"↑":"↓")]})]})}),(0,a.jsx)("tbody",{children:M.map(n=>{return(0,a.jsxs)("tr",{children:[(0,a.jsx)("td",{className:"ts-date-cell",children:(e=n.converted_at,(0,L.oD)(e,A))}),(0,a.jsx)("td",{className:"ts-url-cell",children:n.page_url?(0,a.jsxs)("a",{href:n.page_url,target:"_blank",rel:"noopener noreferrer",className:"ts-url-link",children:[n.page_url,(0,a.jsx)(m.I,{name:"ExternalLink",size:12})]}):(0,a.jsx)("span",{className:"ts-url-empty",children:"-"})}),(0,a.jsx)("td",{className:"ts-context-cell",children:V(n)?(0,a.jsxs)("span",{className:"ts-context-badge",children:[(0,a.jsx)(m.I,{name:"Tag",size:12}),V(n)]}):(0,a.jsx)("span",{className:"ts-context-empty",children:"-"})}),(0,a.jsx)("td",{className:"ts-source-cell",children:(0,a.jsxs)("div",{className:"ts-source-info",children:[(0,a.jsx)("strong",{children:n.source||"direct"}),n.medium&&(0,a.jsxs)("span",{className:"ts-medium",children:[" / ",n.medium]}),n.campaign&&(0,a.jsx)("div",{className:"ts-campaign",children:n.campaign})]})}),(0,a.jsx)("td",{className:"ts-device-cell",children:(0,a.jsxs)("span",{className:"ts-device-badge",children:[(0,a.jsx)(m.I,{name:"mobile"===n.device?"Smartphone":"tablet"===n.device?"Tablet":"Monitor",size:12}),n.device||"desktop"]})}),"none"!==r.value_type&&(0,a.jsx)("td",{className:"ts-value-cell",children:(0,P.vv)(n.value||0)})]},n.conversion_id);var e})})]})})}),!w&&$>1&&(0,a.jsxs)("div",{className:"ts-modal-pagination",children:[(0,a.jsxs)("button",{onClick:()=>p(r=>Math.max(1,r-1)),disabled:1===c,className:"ts-page-btn",children:[(0,a.jsx)(m.I,{name:"ChevronLeft",size:16}),(0,f.__)("Previous","tracksure")]}),(0,a.jsxs)("span",{className:"ts-page-info",children:[(0,f.__)("Page","tracksure")," ",c," ",(0,f.__)("of","tracksure")," ",$," (",_," ",(0,f.__)("total conversions","tracksure"),")"]}),(0,a.jsxs)("button",{onClick:()=>p(r=>Math.min($,r+1)),disabled:c===$,className:"ts-page-btn",children:[(0,f.__)("Next","tracksure"),(0,a.jsx)(m.I,{name:"ChevronRight",size:16})]})]})]}),J=()=>F?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading sources...","tracksure")})]}):0===T.length?(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"Globe",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No source data available for this period.","tracksure")})]}):(0,a.jsx)("div",{className:"ts-sources-tab",children:(0,a.jsxs)("table",{className:"ts-sources-table",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{children:(0,f.__)("Source","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Medium","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Conversions","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Percentage","tracksure")}),"none"!==r.value_type&&(0,a.jsx)("th",{children:(0,f.__)("Revenue","tracksure")})]})}),(0,a.jsx)("tbody",{children:T.map((n,e)=>(0,a.jsxs)("tr",{children:[(0,a.jsx)("td",{className:"ts-source-name",children:n.source}),(0,a.jsx)("td",{className:"ts-source-medium",children:n.medium||"-"}),(0,a.jsx)("td",{className:"ts-source-conversions",children:n.conversions}),(0,a.jsxs)("td",{className:"ts-source-percentage",children:[(0,a.jsx)("div",{className:"ts-progress-bar",children:(0,a.jsx)("div",{className:"ts-progress-fill",style:{width:`${n.percentage}%`}})}),(0,a.jsxs)("span",{children:[n.percentage.toFixed(1),"%"]})]}),"none"!==r.value_type&&(0,a.jsx)("td",{className:"ts-source-revenue",children:(0,P.vv)(n.revenue)})]},e))})]})}),K=()=>G?(0,a.jsxs)("div",{className:"ts-loading",children:[(0,a.jsx)(m.I,{name:"Loader",size:24}),(0,a.jsx)("span",{children:(0,f.__)("Loading devices...","tracksure")})]}):0===q.length?(0,a.jsxs)("div",{className:"ts-empty",children:[(0,a.jsx)(m.I,{name:"Monitor",size:48}),(0,a.jsx)("p",{children:(0,f.__)("No device data available for this period.","tracksure")})]}):(0,a.jsx)("div",{className:"ts-devices-tab",children:(0,a.jsxs)("table",{className:"ts-devices-table",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{children:(0,f.__)("Device","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Browser","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Conversions","tracksure")}),(0,a.jsx)("th",{children:(0,f.__)("Percentage","tracksure")})]})}),(0,a.jsx)("tbody",{children:q.map((r,n)=>(0,a.jsxs)("tr",{children:[(0,a.jsxs)("td",{className:"ts-device-name",children:[(0,a.jsx)(m.I,{name:"mobile"===r.device?"Smartphone":"tablet"===r.device?"Tablet":"Monitor",size:16}),r.device]}),(0,a.jsx)("td",{className:"ts-device-browser",children:r.browser}),(0,a.jsx)("td",{className:"ts-device-conversions",children:r.conversions}),(0,a.jsxs)("td",{className:"ts-device-percentage",children:[(0,a.jsx)("div",{className:"ts-progress-bar",children:(0,a.jsx)("div",{className:"ts-progress-fill",style:{width:`${r.percentage}%`}})}),(0,a.jsxs)("span",{children:[r.percentage.toFixed(1),"%"]})]})]},n))})]})});return(0,a.jsx)(v.a,{isOpen:!0,onClose:n,size:"xl",title:(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{children:r.name}),(0,a.jsx)("p",{className:"ts-modal-subtitle",children:r.description})]}),children:(0,a.jsxs)("div",{className:"ts-goal-details-modal",children:[(0,a.jsxs)("div",{className:"ts-modal-tabs",children:[(0,a.jsxs)("button",{className:"ts-modal-tab "+("overview"===l?"ts-modal-tab--active":""),onClick:()=>d("overview"),children:[(0,a.jsx)(m.I,{name:"BarChart3",size:18}),(0,f.__)("Overview","tracksure")]}),(0,a.jsxs)("button",{className:"ts-modal-tab "+("timeline"===l?"ts-modal-tab--active":""),onClick:()=>d("timeline"),children:[(0,a.jsx)(m.I,{name:"Clock",size:18}),(0,f.__)("Timeline","tracksure")]}),(0,a.jsxs)("button",{className:"ts-modal-tab "+("sources"===l?"ts-modal-tab--active":""),onClick:()=>d("sources"),children:[(0,a.jsx)(m.I,{name:"Globe",size:18}),(0,f.__)("Sources","tracksure")]}),(0,a.jsxs)("button",{className:"ts-modal-tab "+("devices"===l?"ts-modal-tab--active":""),onClick:()=>d("devices"),children:[(0,a.jsx)(m.I,{name:"Monitor",size:18}),(0,f.__)("Devices","tracksure")]})]}),(0,a.jsx)("div",{className:"ts-modal-tab-content",children:(()=>{switch(l){case"overview":return Q();case"timeline":return H();case"sources":return J();case"devices":return K();default:return null}})()})]})})};var Z=e(66522),V=e(87791),$=e(56883),X={};X.styleTagTransform=q(),X.setAttributes=I(),X.insert=z().bind(null,"head"),X.domAPI=w(),X.insertStyleElement=T();_()($.A,X);$.A&&$.A.locals&&$.A.locals;const Q=[{id:"basic",title:(0,f.__)("Basic Information","tracksure"),description:(0,f.__)("Name and describe your goal","tracksure"),icon:"FileText"},{id:"trigger",title:(0,f.__)("Trigger Configuration","tracksure"),description:(0,f.__)("Choose what triggers this goal","tracksure"),icon:"Zap"},{id:"conditions",title:(0,f.__)("Conditions","tracksure"),description:(0,f.__)("Define when the goal converts","tracksure"),icon:"Filter"},{id:"advanced",title:(0,f.__)("Advanced Settings","tracksure"),description:(0,f.__)("Value, frequency, and attribution","tracksure"),icon:"Settings"},{id:"preview",title:(0,f.__)("Review & Save","tracksure"),description:(0,f.__)("Preview and confirm your goal","tracksure"),icon:"Eye"}],H=[{value:"pageview",label:(0,f.__)("Page View","tracksure"),description:(0,f.__)("Track visits to specific pages or sections","tracksure"),icon:"FileText",eventName:"page_view"},{value:"click",label:(0,f.__)("Element Click","tracksure"),description:(0,f.__)("Track clicks on buttons, links, or elements","tracksure"),icon:"MousePointer",eventName:"click"},{value:"form_submit",label:(0,f.__)("Form Submission","tracksure"),description:(0,f.__)("Track form completions and leads","tracksure"),icon:"Send",eventName:"form_submit"},{value:"scroll_depth",label:(0,f.__)("Scroll Depth","tracksure"),description:(0,f.__)("Track how far users scroll on a page","tracksure"),icon:"ArrowDown",eventName:"scroll"},{value:"time_on_page",label:(0,f.__)("Time on Page","tracksure"),description:(0,f.__)("Track engagement duration","tracksure"),icon:"Clock",eventName:"time_on_page"},{value:"engagement",label:(0,f.__)("Engagement Rate","tracksure"),description:(0,f.__)("Track combined scroll + time engagement","tracksure"),icon:"Heart",eventName:"engagement"},{value:"video_play",label:(0,f.__)("Video Play","tracksure"),description:(0,f.__)("Track video interactions","tracksure"),icon:"Play",eventName:"video_play"},{value:"download",label:(0,f.__)("File Download","tracksure"),description:(0,f.__)("Track file and document downloads","tracksure"),icon:"Download",eventName:"file_download"},{value:"outbound_link",label:(0,f.__)("Outbound Link","tracksure"),description:(0,f.__)("Track clicks to external websites","tracksure"),icon:"ExternalLink",eventName:"outbound_click"},{value:"custom_event",label:(0,f.__)("Custom Event","tracksure"),description:(0,f.__)("Track custom JavaScript events","tracksure"),icon:"Code",eventName:"custom_event"}],J=[{value:"engagement",label:(0,f.__)("Engagement","tracksure"),icon:"Heart"},{value:"leads",label:(0,f.__)("Leads & Conversions","tracksure"),icon:"Users"},{value:"ecommerce",label:(0,f.__)("E-commerce","tracksure"),icon:"ShoppingCart"},{value:"content",label:(0,f.__)("Content & Media","tracksure"),icon:"FileText"}],K=({isOpen:r,onClose:n,onSave:e,onSaveAsTemplate:o})=>{const[s,i]=(0,t.useState)("basic"),[A,l]=(0,t.useState)({name:"",description:"",category:"engagement",trigger_type:"pageview",event_name:"page_view",conditions:[],match_logic:"all",value_type:"none",value:0,attribution_window:30,frequency:"unlimited",is_active:!0}),[d,c]=(0,t.useState)({}),[p,g]=(0,t.useState)(!1),C=Q.findIndex(r=>r.id===s),u=0===C,E=C===Q.length-1,x=r=>{const n={};if("basic"===r){const r=A.name?.trim()||"";r?r.length<3?n.name=(0,f.__)("Goal name must be at least 3 characters","tracksure"):r.length>100&&(n.name=(0,f.__)("Goal name cannot exceed 100 characters","tracksure")):n.name=(0,f.__)("Goal name is required","tracksure"),A.description&&A.description.length>500&&(n.description=(0,f.__)("Description cannot exceed 500 characters","tracksure")),A.category||(n.category=(0,f.__)("Please select a category","tracksure"))}if("trigger"===r){A.trigger_type||(n.trigger_type=(0,f.__)("Please select a trigger type","tracksure"));const r=A.event_name?.trim()||"";r?r.length>100?n.event_name=(0,f.__)("Event name cannot exceed 100 characters","tracksure"):/^[a-z0-9_]+$/.test(r)||(n.event_name=(0,f.__)("Event name must contain only lowercase letters, numbers, and underscores","tracksure")):n.event_name=(0,f.__)("Event name is required","tracksure")}return"advanced"===r&&"fixed"===A.value_type&&(!A.value||A.value<=0)&&(n.value=(0,f.__)("Fixed value must be greater than 0","tracksure")),c(n),0===Object.keys(n).length},h=()=>{for(const r of Q)if(!x(r.id))return i(r.id),!1;return!0};(0,t.useEffect)(()=>{if(!r)return;const n=localStorage.getItem("tracksure_goal_draft");if(n)try{const r=JSON.parse(n);l(r),g(!0)}catch(r){}},[r]),(0,t.useEffect)(()=>{if("custom_event"===A.trigger_type)return;const r=H.find(r=>r.value===A.trigger_type);r&&l(n=>({...n,event_name:r.eventName}))},[A.trigger_type]);return(0,a.jsx)(v.a,{isOpen:r,onClose:n,size:"xl",title:(0,f.__)("Create Custom Goal","tracksure"),children:(0,a.jsxs)("div",{className:"ts-custom-goal-builder",children:[(0,a.jsx)("div",{className:"ts-goal-builder-steps",children:Q.map((r,n)=>(0,a.jsxs)("div",{className:`ts-step ${s===r.id?"ts-step--active":""} ${n<C?"ts-step--completed":""}`,children:[(0,a.jsx)("div",{className:"ts-step-number",children:n<C?(0,a.jsx)(m.I,{name:"Check",size:16}):(0,a.jsx)("span",{children:n+1})}),(0,a.jsxs)("div",{className:"ts-step-info",children:[(0,a.jsx)("div",{className:"ts-step-title",children:r.title}),(0,a.jsx)("div",{className:"ts-step-description",children:r.description})]})]},r.id))}),(0,a.jsxs)("div",{className:"ts-builder-content",children:[p&&(0,a.jsxs)("div",{className:"ts-draft-notice",children:[(0,a.jsx)(m.I,{name:"Info",size:16}),(0,f.__)("Draft loaded from previous session","tracksure")]}),(()=>{switch(s){case"basic":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"FileText",size:20}),(0,f.__)("Basic Information","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsxs)("label",{htmlFor:"goal-name",children:[(0,f.__)("Goal Name","tracksure")," ",(0,a.jsx)("span",{className:"ts-required",children:"*"})]}),(0,a.jsx)("input",{id:"goal-name",type:"text",value:A.name||"",onChange:r=>l({...A,name:r.target.value}),placeholder:(0,f.__)("e.g., Newsletter Signup, Product Purchase","tracksure"),className:d.name?"ts-input-error":"",autoFocus:!0}),d.name&&(0,a.jsx)("span",{className:"ts-error-message",children:d.name}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Choose a clear, descriptive name that identifies this goal","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsxs)("label",{htmlFor:"goal-description",children:[(0,f.__)("Description","tracksure")," ",(0,a.jsxs)("span",{className:"ts-optional",children:["(",(0,f.__)("optional","tracksure"),")"]})]}),(0,a.jsx)("textarea",{id:"goal-description",value:A.description||"",onChange:r=>l({...A,description:r.target.value}),placeholder:(0,f.__)("Describe the purpose of this goal and what success looks like","tracksure"),rows:3}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Help team members understand what this goal measures","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsxs)("label",{children:[(0,f.__)("Category","tracksure")," ",(0,a.jsx)("span",{className:"ts-required",children:"*"})]}),(0,a.jsx)("div",{className:"ts-category-grid",children:J.map(r=>(0,a.jsxs)("button",{type:"button",className:"ts-category-card "+(A.category===r.value?"ts-category-card--selected":""),onClick:()=>l({...A,category:r.value}),children:[(0,a.jsx)(m.I,{name:r.icon,size:24}),(0,a.jsx)("span",{children:r.label})]},r.value))}),d.category&&(0,a.jsx)("span",{className:"ts-error-message",children:d.category})]})]})]})});case"trigger":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Zap",size:20}),(0,f.__)("Choose Trigger Type","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsx)("p",{className:"ts-section-intro",children:(0,f.__)("Select what user action will trigger this goal conversion","tracksure")}),(0,a.jsx)("div",{className:"ts-trigger-grid",children:H.map(r=>(0,a.jsxs)("button",{type:"button",className:"ts-trigger-card "+(A.trigger_type===r.value?"ts-trigger-card--selected":""),onClick:()=>l({...A,trigger_type:r.value}),children:[(0,a.jsx)("div",{className:"ts-trigger-icon",children:(0,a.jsx)(m.I,{name:r.icon,size:32})}),(0,a.jsxs)("div",{className:"ts-trigger-info",children:[(0,a.jsx)("div",{className:"ts-trigger-label",children:r.label}),(0,a.jsx)("div",{className:"ts-trigger-description",children:r.description})]}),A.trigger_type===r.value&&(0,a.jsx)("div",{className:"ts-trigger-check",children:(0,a.jsx)(m.I,{name:"CheckCircle",size:20})})]},r.value))}),d.trigger_type&&(0,a.jsx)("span",{className:"ts-error-message",children:d.trigger_type}),"custom_event"===A.trigger_type&&(0,a.jsxs)("div",{className:"ts-form-field",style:{marginTop:"16px"},children:[(0,a.jsxs)("label",{htmlFor:"custom-event-name",children:[(0,f.__)("Event Name","tracksure")," ",(0,a.jsx)("span",{className:"ts-required",children:"*"})]}),(0,a.jsx)("input",{id:"custom-event-name",type:"text",value:A.event_name||"",onChange:r=>l({...A,event_name:r.target.value}),placeholder:(0,f.__)("e.g., purchase, add_to_cart, calculator_completed","tracksure"),maxLength:100}),d.event_name&&(0,a.jsx)("p",{className:"ts-field-error",children:d.event_name}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("The exact event name your custom code dispatches","tracksure")})]})]})]})});case"conditions":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Filter",size:20}),(0,f.__)("Define Conditions","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsx)("p",{className:"ts-section-intro",children:(0,f.__)("Add conditions to specify exactly when this goal should convert","tracksure")}),(0,a.jsx)(B,{conditions:A.conditions||[],onChange:r=>l({...A,conditions:r}),triggerType:A.trigger_type||"pageview",matchLogic:A.match_logic,onMatchLogicChange:r=>l({...A,match_logic:r})}),d.conditions&&(0,a.jsx)("span",{className:"ts-error-message",children:d.conditions}),A.conditions&&A.conditions.length>0&&(0,a.jsxs)("div",{className:"ts-conditions-preview",children:[(0,a.jsxs)("h4",{children:[(0,a.jsx)(m.I,{name:"Eye",size:16}),(0,f.__)("Condition Logic Preview","tracksure")]}),(0,a.jsxs)("div",{className:"ts-logic-preview",children:["all"===A.match_logic?(0,a.jsxs)("p",{children:[(0,f.__)("Goal converts when","tracksure")," ",(0,a.jsx)("strong",{children:(0,f.__)("ALL","tracksure")})," ",(0,f.__)("of the following are true:","tracksure")]}):(0,a.jsxs)("p",{children:[(0,f.__)("Goal converts when","tracksure")," ",(0,a.jsx)("strong",{children:(0,f.__)("ANY","tracksure")})," ",(0,f.__)("of the following are true:","tracksure")]}),(0,a.jsx)("ul",{className:"ts-condition-list",children:A.conditions.map((r,n)=>(0,a.jsxs)("li",{children:[(0,a.jsx)("code",{children:r.param})," ",(0,a.jsx)("em",{children:r.operator})," ",(0,a.jsxs)("code",{children:['"',r.value,'"']})]},n))})]})]})]})]})});case"advanced":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Settings",size:20}),(0,f.__)("Advanced Settings","tracksure")]}),(0,a.jsxs)(Z.bw,{children:[(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsx)("label",{children:(0,f.__)("Conversion Value","tracksure")}),(0,a.jsxs)("div",{className:"ts-radio-group",children:[(0,a.jsxs)("label",{className:"ts-radio-option",children:[(0,a.jsx)("input",{type:"radio",name:"value_type",value:"none",checked:"none"===A.value_type,onChange:r=>l({...A,value_type:"none"})}),(0,a.jsxs)("span",{children:[(0,a.jsx)("strong",{children:(0,f.__)("No Value","tracksure")}),(0,a.jsx)("small",{children:(0,f.__)("Track conversions only (most common)","tracksure")})]})]}),(0,a.jsxs)("label",{className:"ts-radio-option",children:[(0,a.jsx)("input",{type:"radio",name:"value_type",value:"fixed",checked:"fixed"===A.value_type,onChange:r=>l({...A,value_type:"fixed"})}),(0,a.jsxs)("span",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Fixed Value","tracksure")}),(0,a.jsx)("small",{children:(0,f.__)("Assign a specific value to each conversion","tracksure")})]})]}),(0,a.jsxs)("label",{className:"ts-radio-option",children:[(0,a.jsx)("input",{type:"radio",name:"value_type",value:"dynamic",checked:"dynamic"===A.value_type,onChange:r=>l({...A,value_type:"dynamic"})}),(0,a.jsxs)("span",{children:[(0,a.jsx)("strong",{children:(0,f.__)("Dynamic Value","tracksure")}),(0,a.jsx)("small",{children:(0,f.__)("Use actual transaction amounts (e.g., order totals)","tracksure")})]})]})]}),"fixed"===A.value_type&&(0,a.jsxs)("div",{className:"ts-value-input",children:[(0,a.jsx)("input",{type:"number",value:A.value||0,onChange:r=>l({...A,value:parseFloat(r.target.value)||0}),min:"0",step:"0.01",placeholder:"0.00",className:d.value?"ts-input-error":""}),d.value&&(0,a.jsx)("span",{className:"ts-error-message",children:d.value}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Enter the monetary value for each conversion (e.g., average lead value)","tracksure")})]})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsx)("label",{htmlFor:"attribution-window",children:(0,f.__)("Attribution Window","tracksure")}),(0,a.jsxs)("select",{id:"attribution-window",value:A.attribution_window||30,onChange:r=>l({...A,attribution_window:parseInt(r.target.value)}),children:[(0,a.jsx)("option",{value:"1",children:(0,f.__)("1 day","tracksure")}),(0,a.jsx)("option",{value:"7",children:(0,f.__)("7 days","tracksure")}),(0,a.jsx)("option",{value:"14",children:(0,f.__)("14 days","tracksure")}),(0,a.jsx)("option",{value:"30",children:(0,f.__)("30 days (recommended)","tracksure")}),(0,a.jsx)("option",{value:"60",children:(0,f.__)("60 days","tracksure")}),(0,a.jsx)("option",{value:"90",children:(0,f.__)("90 days","tracksure")})]}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("How long to connect conversions to original traffic sources","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-form-field",children:[(0,a.jsx)("label",{htmlFor:"frequency",children:(0,f.__)("Conversion Frequency","tracksure")}),(0,a.jsxs)("select",{id:"frequency",value:A.frequency||"unlimited",onChange:r=>l({...A,frequency:r.target.value}),children:[(0,a.jsx)("option",{value:"unlimited",children:(0,f.__)("Unlimited (track every occurrence)","tracksure")}),(0,a.jsx)("option",{value:"session",children:(0,f.__)("Once per session","tracksure")}),(0,a.jsx)("option",{value:"once",children:(0,f.__)("Once per visitor (lifetime)","tracksure")})]}),(0,a.jsx)("p",{className:"ts-field-help",children:(0,f.__)("Control how often the same user can trigger this goal","tracksure")})]})]})]})});case"preview":return(0,a.jsx)("div",{className:"ts-step-content",children:(0,a.jsxs)(Z.Zp,{children:[(0,a.jsxs)(Z.aR,{children:[(0,a.jsx)(m.I,{name:"Eye",size:20}),(0,f.__)("Review Your Goal","tracksure")]}),(0,a.jsx)(Z.bw,{children:(0,a.jsxs)("div",{className:"ts-goal-preview",children:[(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Basic Information","tracksure")}),(0,a.jsxs)("dl",{children:[(0,a.jsx)("dt",{children:(0,f.__)("Name","tracksure")}),(0,a.jsx)("dd",{children:A.name}),A.description&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("dt",{children:(0,f.__)("Description","tracksure")}),(0,a.jsx)("dd",{children:A.description})]}),(0,a.jsx)("dt",{children:(0,f.__)("Category","tracksure")}),(0,a.jsx)("dd",{children:J.find(r=>r.value===A.category)?.label})]})]}),(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Trigger Configuration","tracksure")}),(0,a.jsxs)("dl",{children:[(0,a.jsx)("dt",{children:(0,f.__)("Trigger Type","tracksure")}),(0,a.jsx)("dd",{children:H.find(r=>r.value===A.trigger_type)?.label}),(0,a.jsx)("dt",{children:(0,f.__)("Event Name","tracksure")}),(0,a.jsx)("dd",{children:(0,a.jsx)("code",{children:A.event_name})})]})]}),(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Conditions","tracksure")}),(0,a.jsx)("p",{children:"all"===A.match_logic?(0,f.__)("Must match ALL conditions:","tracksure"):(0,f.__)("Must match ANY condition:","tracksure")}),A.conditions&&A.conditions.length>0?(0,a.jsx)("ul",{className:"ts-condition-list",children:A.conditions.map((r,n)=>(0,a.jsxs)("li",{children:[(0,a.jsx)("code",{children:r.param})," ",(0,a.jsx)("em",{children:r.operator})," ",(0,a.jsxs)("code",{children:['"',r.value,'"']})]},n))}):(0,a.jsx)("p",{className:"ts-no-conditions",children:(0,f.__)("No conditions defined","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-preview-section",children:[(0,a.jsx)("h4",{children:(0,f.__)("Advanced Settings","tracksure")}),(0,a.jsxs)("dl",{children:[(0,a.jsx)("dt",{children:(0,f.__)("Value Type","tracksure")}),(0,a.jsxs)("dd",{children:["none"===A.value_type&&(0,f.__)("No value tracked","tracksure"),"fixed"===A.value_type&&`${(0,f.__)("Fixed:","tracksure")} $${A.value}`,"dynamic"===A.value_type&&(0,f.__)("Dynamic (from transaction)","tracksure")]}),(0,a.jsx)("dt",{children:(0,f.__)("Attribution Window","tracksure")}),(0,a.jsxs)("dd",{children:[A.attribution_window," ",(0,f.__)("days","tracksure")]}),(0,a.jsx)("dt",{children:(0,f.__)("Frequency","tracksure")}),(0,a.jsxs)("dd",{children:["unlimited"===A.frequency&&(0,f.__)("Unlimited","tracksure"),"session"===A.frequency&&(0,f.__)("Once per session","tracksure"),"once"===A.frequency&&(0,f.__)("Once per visitor","tracksure")]})]})]})]})})]})});default:return null}})()]}),(0,a.jsxs)("div",{className:"ts-builder-actions",children:[(0,a.jsx)("div",{className:"ts-actions-left",children:!u&&(0,a.jsxs)(V.$,{variant:"outline",onClick:()=>{const r=C-1;if(r>=0){const n=Q[r];n&&(i(n.id),c({}))}},children:[(0,a.jsx)(m.I,{name:"ChevronLeft",size:16}),(0,f.__)("Back","tracksure")]})}),(0,a.jsxs)("div",{className:"ts-actions-right",children:[(0,a.jsxs)(V.$,{variant:"ghost",onClick:()=>{g(!0),localStorage.setItem("tracksure_goal_draft",JSON.stringify(A))},children:[(0,a.jsx)(m.I,{name:"Save",size:16}),(0,f.__)("Save Draft","tracksure")]}),E?(0,a.jsxs)(a.Fragment,{children:[o&&(0,a.jsxs)(V.$,{variant:"outline",onClick:()=>{o&&h()&&o(A)},children:[(0,a.jsx)(m.I,{name:"Bookmark",size:16}),(0,f.__)("Save as Template","tracksure")]}),(0,a.jsxs)(V.$,{variant:"primary",onClick:()=>{h()&&(e(A),localStorage.removeItem("tracksure_goal_draft"),g(!1))},children:[(0,a.jsx)(m.I,{name:"Check",size:16}),(0,f.__)("Create Goal","tracksure")]})]}):(0,a.jsxs)(V.$,{variant:"primary",onClick:()=>{if(x(s)){const r=C+1;if(r<Q.length){const n=Q[r];n&&i(n.id)}}},children:[(0,f.__)("Next","tracksure"),(0,a.jsx)(m.I,{name:"ChevronRight",size:16})]})]})]})]})})};var rr=e(96478),nr={};nr.styleTagTransform=q(),nr.setAttributes=I(),nr.insert=z().bind(null,"head"),nr.domAPI=w(),nr.insertStyleElement=T();_()(rr.A,nr);rr.A&&rr.A.locals&&rr.A.locals;const er=({selectedGoals:r,allGoals:n,onActionComplete:e,onSelectionChange:o})=>{const[s,i]=(0,t.useState)(!1),[A,l]=(0,t.useState)(null);(0,t.useEffect)(()=>{const r=r=>{"Escape"===r.key&&A&&l(null)};if(A)return document.addEventListener("keydown",r),()=>document.removeEventListener("keydown",r)},[A]);const d=async n=>{if(0!==r.length)if("delete"!==n)if("disable"!==n){i(!0);try{"export"===n?await p():await c(n)}catch(r){alert((0,f.__)("Failed to perform bulk action. Please try again.","tracksure"))}finally{i(!1)}}else l("disable");else l("delete");else alert((0,f.__)("Please select at least one goal.","tracksure"))},c=async n=>{const a="enable"===n?1:0,t=r.map(r=>window.wp.apiFetch({path:`/ts/v1/goals/${r}`,method:"POST",data:{is_active:a}}));await Promise.all(t),o([]),e(),alert(1===r.length?(0,f.__)("Goal updated successfully.","tracksure"):(0,f.__)(`${r.length} goals updated successfully.`,"tracksure"))},p=async()=>{const e=n.filter(n=>r.includes(n.goal_id)),a={version:"2.1.0",exported_at:(new Date).toISOString(),goals:e.map(r=>({name:r.name,description:r.description,category:r.category,trigger_type:r.trigger_type,event_name:r.event_name,conditions:r.conditions,match_logic:r.match_logic,value_type:r.value_type,value:r.value,attribution_window:r.attribution_window,frequency:r.frequency,is_active:r.is_active}))},t=new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),s=URL.createObjectURL(t),i=document.createElement("a");i.href=s,i.download=`tracksure-goals-${Date.now()}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(s),alert(1===r.length?(0,f.__)("Goal exported successfully.","tracksure"):(0,f.__)(`${r.length} goals exported successfully.`,"tracksure")),o([])},g=r.length===n.length&&n.length>0,m=r.length>0&&r.length<n.length;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"goal-bulk-actions",role:"toolbar","aria-label":(0,f.__)("Bulk actions for goals","tracksure"),children:[(0,a.jsx)("div",{className:"bulk-actions-left",children:(0,a.jsxs)("label",{className:"bulk-select-all",children:[(0,a.jsx)("input",{type:"checkbox",checked:g,ref:r=>{r&&(r.indeterminate=m)},onChange:()=>{r.length===n.length?o([]):o(n.map(r=>r.goal_id))},disabled:0===n.length,"aria-label":g?(0,f.__)("Deselect all goals","tracksure"):(0,f.__)("Select all goals","tracksure")}),(0,a.jsx)("span",{children:r.length>0?(0,f.__)(`${r.length} selected`,"tracksure"):(0,f.__)("Select all","tracksure")})]})}),r.length>0&&(0,a.jsxs)("div",{className:"bulk-actions-right",role:"group","aria-label":(0,f.__)("Available bulk actions","tracksure"),children:[(0,a.jsxs)("button",{className:"bulk-action-btn",onClick:()=>d("enable"),disabled:s,"aria-label":(0,f.__)("Enable selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-yes-alt","aria-hidden":"true"}),(0,f.__)("Enable","tracksure")]}),(0,a.jsxs)("button",{className:"bulk-action-btn",onClick:()=>d("disable"),disabled:s,"aria-label":(0,f.__)("Disable selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-dismiss","aria-hidden":"true"}),(0,f.__)("Disable","tracksure")]}),(0,a.jsxs)("button",{className:"bulk-action-btn",onClick:()=>d("export"),disabled:s,"aria-label":(0,f.__)("Export selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-download","aria-hidden":"true"}),(0,f.__)("Export","tracksure")]}),(0,a.jsxs)("button",{className:"bulk-action-btn bulk-delete",onClick:()=>d("delete"),disabled:s,"aria-label":(0,f.__)("Delete selected goals","tracksure"),children:[(0,a.jsx)("span",{className:"dashicons dashicons-trash","aria-hidden":"true"}),(0,f.__)("Delete","tracksure")]})]})]}),A&&(0,a.jsx)("div",{className:"bulk-confirm-dialog-overlay",onClick:()=>l(null),role:"dialog","aria-modal":"true","aria-labelledby":"bulk-confirm-title",children:(0,a.jsxs)("div",{className:"bulk-confirm-dialog",onClick:r=>r.stopPropagation(),children:[(0,a.jsx)("h3",{id:"bulk-confirm-title",children:"delete"===A?(0,f.__)("Confirm Deletion","tracksure"):(0,f.__)("Confirm Disable","tracksure")}),(0,a.jsx)("p",{children:"delete"===A?1===r.length?(0,f.__)("Are you sure you want to delete this goal? This action cannot be undone.","tracksure"):`${(0,f.__)("Are you sure you want to delete","tracksure")} ${r.length} ${(0,f.__)("goals? This action cannot be undone.","tracksure")}`:1===r.length?(0,f.__)("Are you sure you want to disable this goal?","tracksure"):`${(0,f.__)("Are you sure you want to disable","tracksure")} ${r.length} ${(0,f.__)("goals?","tracksure")}`}),(0,a.jsxs)("div",{className:"bulk-confirm-actions",children:[(0,a.jsx)("button",{className:"button",onClick:()=>l(null),children:(0,f.__)("Cancel","tracksure")}),(0,a.jsx)("button",{className:"button button-primary",onClick:"delete"===A?async()=>{l(null),i(!0);try{const n=r.map(r=>window.wp.apiFetch({path:`/ts/v1/goals/${r}`,method:"DELETE"}));await Promise.all(n),o([]),e(),alert(1===r.length?(0,f.__)("Goal deleted successfully.","tracksure"):(0,f.__)(`${r.length} goals deleted successfully.`,"tracksure"))}catch(r){alert((0,f.__)("Failed to delete goals. Please try again.","tracksure"))}finally{i(!1)}}:()=>{l(null),c("disable")},autoFocus:!0,children:(0,f.__)("Confirm","tracksure")})]})]})})]})};var ar=e(21421),tr={};tr.styleTagTransform=q(),tr.setAttributes=I(),tr.insert=z().bind(null,"head"),tr.domAPI=w(),tr.insertStyleElement=T();_()(ar.A,tr);ar.A&&ar.A.locals&&ar.A.locals;const or=({filters:r,onFiltersChange:n,onReset:e})=>{const[o,s]=(0,t.useState)(!1),[i,A]=(0,t.useState)(r.search);(0,t.useEffect)(()=>{const e=setTimeout(()=>{i!==r.search&&n({...r,search:i})},300);return()=>clearTimeout(e)},[i]);const l=(e,a)=>{n({...r,[e]:a})},d=""!==r.search||"all"!==r.category||"all"!==r.triggerType||"all"!==r.status||"name"!==r.sortBy||"asc"!==r.sortOrder;return(0,a.jsxs)("div",{className:"goal-filters",role:"search","aria-label":(0,f.__)("Filter and search goals","tracksure"),children:[(0,a.jsxs)("div",{className:"filters-header",children:[(0,a.jsxs)("div",{className:"filters-search",children:[(0,a.jsx)("span",{className:"dashicons dashicons-search","aria-hidden":"true"}),(0,a.jsx)("input",{type:"text",placeholder:(0,f.__)("Search goals...","tracksure"),value:i,onChange:r=>A(r.target.value),className:"search-input","aria-label":(0,f.__)("Search goals","tracksure")}),i&&(0,a.jsx)("button",{className:"clear-search",onClick:()=>A(""),title:(0,f.__)("Clear search","tracksure"),"aria-label":(0,f.__)("Clear search","tracksure"),children:(0,a.jsx)("span",{className:"dashicons dashicons-no-alt","aria-hidden":"true"})})]}),(0,a.jsxs)("div",{className:"filters-actions",children:[(0,a.jsxs)("button",{className:"filters-toggle "+(d?"active":""),onClick:()=>s(!o),"aria-expanded":o,"aria-controls":"filter-panel",children:[(0,a.jsx)("span",{className:"dashicons dashicons-filter","aria-hidden":"true"}),(0,f.__)("Filters","tracksure"),d&&(0,a.jsx)("span",{className:"filter-badge","aria-label":(0,f.__)("Active filters","tracksure")})]}),d&&(0,a.jsx)("button",{className:"button",onClick:e,"aria-label":(0,f.__)("Reset all filters","tracksure"),children:(0,f.__)("Reset","tracksure")})]})]}),o&&(0,a.jsxs)("div",{className:"filters-panel",id:"filter-panel",children:[(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-category",children:(0,f.__)("Category","tracksure")}),(0,a.jsxs)("select",{id:"filter-category",value:r.category,onChange:r=>l("category",r.target.value),children:[(0,a.jsx)("option",{value:"all",children:(0,f.__)("All Categories","tracksure")}),(0,a.jsx)("option",{value:"engagement",children:(0,f.__)("Engagement","tracksure")}),(0,a.jsx)("option",{value:"leads",children:(0,f.__)("Leads","tracksure")}),(0,a.jsx)("option",{value:"ecommerce",children:(0,f.__)("E-commerce","tracksure")}),(0,a.jsx)("option",{value:"content",children:(0,f.__)("Content","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-trigger",children:(0,f.__)("Trigger Type","tracksure")}),(0,a.jsxs)("select",{id:"filter-trigger",value:r.triggerType,onChange:r=>l("triggerType",r.target.value),children:[(0,a.jsx)("option",{value:"all",children:(0,f.__)("All Triggers","tracksure")}),(0,a.jsx)("option",{value:"page_visit",children:(0,f.__)("Page Visit","tracksure")}),(0,a.jsx)("option",{value:"element_click",children:(0,f.__)("Element Click","tracksure")}),(0,a.jsx)("option",{value:"form_submission",children:(0,f.__)("Form Submission","tracksure")}),(0,a.jsx)("option",{value:"scroll_depth",children:(0,f.__)("Scroll Depth","tracksure")}),(0,a.jsx)("option",{value:"time_on_page",children:(0,f.__)("Time on Page","tracksure")}),(0,a.jsx)("option",{value:"custom_event",children:(0,f.__)("Custom Event","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-status",children:(0,f.__)("Status","tracksure")}),(0,a.jsxs)("select",{id:"filter-status",value:r.status,onChange:r=>l("status",r.target.value),children:[(0,a.jsx)("option",{value:"all",children:(0,f.__)("All Status","tracksure")}),(0,a.jsx)("option",{value:"active",children:(0,f.__)("Active","tracksure")}),(0,a.jsx)("option",{value:"inactive",children:(0,f.__)("Inactive","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-sortby",children:(0,f.__)("Sort By","tracksure")}),(0,a.jsxs)("select",{id:"filter-sortby",value:r.sortBy,onChange:r=>l("sortBy",r.target.value),children:[(0,a.jsx)("option",{value:"name",children:(0,f.__)("Name","tracksure")}),(0,a.jsx)("option",{value:"created_at",children:(0,f.__)("Date Created","tracksure")}),(0,a.jsx)("option",{value:"conversions",children:(0,f.__)("Conversions","tracksure")})]})]}),(0,a.jsxs)("div",{className:"filter-group",children:[(0,a.jsx)("label",{htmlFor:"filter-order",children:(0,f.__)("Order","tracksure")}),(0,a.jsxs)("select",{id:"filter-order",value:r.sortOrder,onChange:r=>l("sortOrder",r.target.value),children:[(0,a.jsx)("option",{value:"asc",children:(0,f.__)("Ascending","tracksure")}),(0,a.jsx)("option",{value:"desc",children:(0,f.__)("Descending","tracksure")})]})]})]})]})};var sr=e(27691),ir={};ir.styleTagTransform=q(),ir.setAttributes=I(),ir.insert=z().bind(null,"head"),ir.domAPI=w(),ir.insertStyleElement=T();_()(sr.A,ir);sr.A&&sr.A.locals&&sr.A.locals;const Ar=({onImport:r,onClose:n})=>{const[e,o]=(0,t.useState)(!1),[s,i]=(0,t.useState)(!1),[A,l]=(0,t.useState)(null),[d,c]=(0,t.useState)([]),[p,g]=(0,t.useState)(!1),m=(0,t.useRef)(null),C=async r=>{try{const n=await r.text(),e=JSON.parse(n),a=(r=>{const n=[];if(!r||"object"!=typeof r)return n.push((0,f.__)("Invalid JSON format","tracksure")),{valid:!1,errors:n};const e=r;return e.goals&&Array.isArray(e.goals)?0===e.goals.length?(n.push((0,f.__)("Import file contains no goals","tracksure")),{valid:!1,errors:n}):(e.goals.forEach((r,e)=>{r.name||n.push((0,f.__)(`Goal ${e+1}: Missing name`,"tracksure")),r.category||n.push((0,f.__)(`Goal ${e+1}: Missing category`,"tracksure")),r.trigger_type||n.push((0,f.__)(`Goal ${e+1}: Missing trigger type`,"tracksure"))}),{valid:0===n.length,errors:n}):(n.push((0,f.__)("No goals array found in import file","tracksure")),{valid:!1,errors:n})})(e);if(!a.valid)return void l({success:!1,imported:0,skipped:0,errors:a.errors});const t=e.goals.map(r=>({name:String(r.name||""),description:String(r.description||""),event_name:String(r.event_name||r.trigger_type||""),trigger_type:r.trigger_type||"custom_event",category:r.category||void 0,conditions:Array.isArray(r.conditions)?r.conditions:[],match_logic:r.match_logic||"all",value_type:r.value_type||"none",value:"number"==typeof r.conversion_value?r.conversion_value:void 0,frequency:["once","session","unlimited"].includes(String(r.frequency))?String(r.frequency):"once",is_active:void 0===r.is_active||Boolean(r.is_active)}));c(t),g(!0)}catch(r){l({success:!1,imported:0,skipped:0,errors:[(0,f.__)("Failed to parse JSON file. Please check the file format.","tracksure")]})}},u=r=>{r.name.endsWith(".json")?C(r):l({success:!1,imported:0,skipped:0,errors:[(0,f.__)("Please select a JSON file","tracksure")]})};return(0,a.jsxs)("div",{className:"goal-import-modal",role:"dialog","aria-modal":"true","aria-labelledby":"import-title",children:[(0,a.jsxs)("div",{className:"goal-import-header",children:[(0,a.jsx)("h2",{id:"import-title",children:(0,f.__)("Import Goals","tracksure")}),(0,a.jsx)("button",{className:"goal-import-close",onClick:n,"aria-label":(0,f.__)("Close import dialog","tracksure"),children:(0,a.jsx)("span",{className:"dashicons dashicons-no-alt","aria-hidden":"true"})})]}),(0,a.jsxs)("div",{className:"goal-import-body",children:[!p&&!A&&(0,a.jsxs)("div",{className:"goal-import-dropzone "+(e?"dragging":""),onDrop:r=>{r.preventDefault(),o(!1);const n=Array.from(r.dataTransfer.files);n.length>0&&u(n[0])},onDragOver:r=>{r.preventDefault(),o(!0)},onDragLeave:()=>{o(!1)},onClick:()=>m.current?.click(),children:[(0,a.jsx)("span",{className:"dashicons dashicons-upload","aria-hidden":"true"}),(0,a.jsx)("h3",{children:(0,f.__)("Drop JSON file here","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("or click to browse files","tracksure")}),(0,a.jsx)("input",{ref:m,type:"file",accept:".json",onChange:r=>{const n=r.target.files;n&&n.length>0&&u(n[0])},style:{display:"none"},"aria-label":(0,f.__)("Select JSON file","tracksure")})]}),p&&(0,a.jsxs)("div",{className:"goal-import-preview",children:[(0,a.jsx)("h3",{children:(0,f.__)("Preview Import","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)(`${d.length} goal(s) will be imported:`,"tracksure")}),(0,a.jsx)("div",{className:"preview-list",children:d.map((r,n)=>(0,a.jsxs)("div",{className:"preview-item",children:[(0,a.jsxs)("div",{className:"preview-item-header",children:[(0,a.jsx)("strong",{children:r.name}),(0,a.jsx)("span",{className:"preview-badge",children:r.category})]}),(0,a.jsx)("p",{className:"preview-description",children:r.description}),(0,a.jsxs)("div",{className:"preview-meta",children:[(0,a.jsx)("span",{children:r.trigger_type.replace(/_/g," ")}),r.conditions.length>0&&(0,a.jsxs)("span",{children:[r.conditions.length," conditions"]})]})]},n))}),(0,a.jsxs)("div",{className:"goal-import-actions",children:[(0,a.jsx)("button",{className:"button",onClick:()=>{g(!1),c([])},disabled:s,children:(0,f.__)("Cancel","tracksure")}),(0,a.jsx)("button",{className:"button button-primary",onClick:async()=>{i(!0);try{await r(d),l({success:!0,imported:d.length,skipped:0,errors:[]}),g(!1),setTimeout(()=>{n()},2e3)}catch(r){l({success:!1,imported:0,skipped:d.length,errors:[(0,f.__)("Failed to import goals. Please try again.","tracksure")]})}finally{i(!1)}},disabled:s,children:s?(0,f.__)("Importing...","tracksure"):(0,f.__)(`Import ${d.length} Goal(s)`,"tracksure")})]})]}),A&&(0,a.jsxs)("div",{className:"goal-import-result "+(A.success?"success":"error"),children:[(0,a.jsx)("span",{className:"dashicons "+(A.success?"dashicons-yes-alt":"dashicons-warning"),"aria-hidden":"true"}),(0,a.jsx)("h3",{children:A.success?(0,f.__)("Import Successful!","tracksure"):(0,f.__)("Import Failed","tracksure")}),A.success?(0,a.jsx)("p",{children:(0,f.__)(`Successfully imported ${A.imported} goal(s)`,"tracksure")}):(0,a.jsx)("div",{className:"error-list",children:A.errors.map((r,n)=>(0,a.jsx)("p",{className:"error-message",children:r},n))}),(0,a.jsx)("button",{className:"button button-primary",onClick:n,children:(0,f.__)("Close","tracksure")})]})]})]})};var lr=e(12577),dr={};dr.styleTagTransform=q(),dr.setAttributes=I(),dr.insert=z().bind(null,"head"),dr.domAPI=w(),dr.insertStyleElement=T();_()(lr.A,dr);lr.A&&lr.A.locals&&lr.A.locals;const cr=()=>{const{dateRange:r}=(0,o.n)(),{data:n,isLoading:e,error:i,refetch:A}=(0,s.S)("getGoalsOverview",{start_date:(0,P.TJ)(r.start),end_date:(0,P.TJ)(r.end)},{staleTime:3e4}),l=(0,t.useMemo)(()=>{if(!n?.conversions_trend)return null;const r=n.total_conversions,e=n.conversions_trend.previous_period||0;if(0===e)return{direction:"neutral",percentage:0};const a=(r-e)/e*100;return{direction:a>0?"up":a<0?"down":"neutral",percentage:Math.abs(Math.round(a))}},[n]),d=(0,t.useMemo)(()=>{if(!n?.value_trend)return null;const r=n.total_value,e=n.value_trend.previous_period||0;if(0===e)return{direction:"neutral",percentage:0};const a=(r-e)/e*100;return{direction:a>0?"up":a<0?"down":"neutral",percentage:Math.abs(Math.round(a))}},[n]),c=(0,t.useMemo)(()=>{if(!n?.rate_trend)return null;const r=n.conversion_rate,e=n.rate_trend.previous_period||0;if(0===e)return{direction:"neutral",percentage:0};const a=(r-e)/e*100;return{direction:a>0?"up":a<0?"down":"neutral",percentage:Math.abs(Math.round(a))}},[n]);return e?(0,a.jsx)("div",{className:"ts-goals-overview",children:(0,a.jsxs)("div",{className:"ts-goals-overview__kpis",children:[(0,a.jsx)(g.or,{}),(0,a.jsx)(g.or,{}),(0,a.jsx)(g.or,{}),(0,a.jsx)(g.or,{})]})}):i?(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-empty-state ts-empty-state--error",children:[(0,a.jsx)(m.I,{name:"AlertCircle",size:48,color:"var(--ts-error)"}),(0,a.jsx)("h3",{children:(0,f.__)("Failed to load goals overview","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("There was an error loading the dashboard data.","tracksure")}),(0,a.jsx)("button",{onClick:A,className:"ts-btn ts-btn--primary",children:(0,f.__)("Retry","tracksure")})]})})}):n?(0,a.jsxs)("div",{className:"ts-goals-overview",children:[(0,a.jsxs)("div",{className:"ts-goals-overview__kpis",children:[(0,a.jsx)(p.l,{metric:{label:(0,f.__)("All Conversions","tracksure"),value:n.total_conversions,format:"number",change:l?.percentage||0}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Conversion Value","tracksure"),value:n.total_value,format:"currency",change:d?.percentage||0}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Avg Conversion Rate","tracksure"),value:n.conversion_rate,format:"percent",change:c?.percentage||0}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Active Goals","tracksure"),value:n.active_goals,format:"number"}})]}),n.daily_conversions&&n.daily_conversions.length>0&&(0,a.jsxs)(C.Zp,{className:"ts-goals-overview__chart",children:[(0,a.jsxs)(C.aR,{children:[(0,a.jsx)("h3",{children:(0,f.__)("Conversions Trend","tracksure")}),(0,a.jsx)("span",{className:"ts-card-header__subtitle",children:(0,f.__)("Last 30 days","tracksure")})]}),(0,a.jsx)(C.bw,{children:(0,a.jsx)("div",{className:"ts-simple-chart",children:(0,a.jsx)("div",{className:"ts-simple-chart__bars",children:(()=>{const r=Math.max(...n.daily_conversions.map(r=>r.conversions));return n.daily_conversions.map((n,e)=>{const t=r>0?n.conversions/r*100:0;return(0,a.jsxs)("div",{className:"ts-simple-chart__bar-wrapper",children:[(0,a.jsx)("div",{className:"ts-simple-chart__bar",style:{height:`${t}%`},title:`${n.date}: ${n.conversions} conversions`,children:(0,a.jsx)("span",{className:"ts-simple-chart__bar-value",children:n.conversions})}),(0,a.jsx)("span",{className:"ts-simple-chart__bar-label",children:new Date(n.date+"T00:00:00").toLocaleDateString(void 0,{month:"short",day:"numeric"})})]},e)})})()})})})]}),n.top_goals&&n.top_goals.length>0&&(0,a.jsxs)(C.Zp,{className:"ts-goals-overview__top-goals",children:[(0,a.jsxs)(C.aR,{children:[(0,a.jsx)("h3",{children:(0,f.__)("Top Performing Goals","tracksure")}),(0,a.jsx)("span",{className:"ts-card-header__subtitle",children:(0,f.__)("By conversion count","tracksure")})]}),(0,a.jsx)(C.bw,{children:(0,a.jsx)("div",{className:"ts-top-goals-list",children:n.top_goals.slice(0,5).map((r,n)=>(0,a.jsxs)("div",{className:"ts-top-goal",children:[(0,a.jsxs)("div",{className:"ts-top-goal__rank",children:["#",n+1]}),(0,a.jsxs)("div",{className:"ts-top-goal__info",children:[(0,a.jsx)("div",{className:"ts-top-goal__name",children:r.name}),(0,a.jsx)("div",{className:"ts-top-goal__type",children:r.trigger_type})]}),(0,a.jsxs)("div",{className:"ts-top-goal__metrics",children:[(0,a.jsxs)("div",{className:"ts-top-goal__conversions",children:[(0,a.jsx)(m.I,{name:"CheckCircle",size:16}),r.conversions.toLocaleString()]}),r.value>0&&(0,a.jsx)("div",{className:"ts-top-goal__value",children:(0,P.vv)(r.value)})]})]},r.goal_id))})})]}),0===n.total_conversions&&(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-empty-state",children:[(0,a.jsx)(m.I,{name:"Inbox",size:64,color:"var(--ts-text-muted)"}),(0,a.jsx)("h3",{children:(0,f.__)("No conversions yet","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Start tracking conversions by creating your first goal.","tracksure")})]})})})]}):null};var pr=e(76840),gr={};gr.styleTagTransform=q(),gr.setAttributes=I(),gr.insert=z().bind(null,"head"),gr.domAPI=w(),gr.insertStyleElement=T();_()(pr.A,gr);pr.A&&pr.A.locals&&pr.A.locals;const mr=()=>{const{config:r,dateRange:n}=(0,o.n)(),[e,v]=(0,t.useState)("overview"),[h,b]=(0,t.useState)("list"),[B,k]=(0,t.useState)("all"),[_,y]=(0,t.useState)(""),[w,j]=(0,t.useState)(!1),[z,N]=(0,t.useState)(null),[I,S]=(0,t.useState)(null),[T,D]=(0,t.useState)([]),[q,Y]=(0,t.useState)(!1),[F,R]=(0,t.useState)({search:"",category:"all",triggerType:"all",status:"all",sortBy:"name",sortOrder:"asc"}),[W,L]=(0,t.useState)(null),[U,O]=(0,t.useState)(null),[Z,V]=(0,t.useState)(null),{data:$,isLoading:X,error:Q,refetch:H}=(0,s.S)("getGoals",{},{staleTime:3e4,retry:2,onError:r=>{}}),J=(0,t.useMemo)(()=>$?.goals||[],[$]),rr=J.map(r=>r.goal_id).join(","),nr=(0,t.useMemo)(()=>({goal_ids:rr,date_start:(0,P.TJ)(n.start),date_end:(0,P.TJ)(n.end)}),[rr,n]),{data:ar,isLoading:tr}=(0,s.S)("getGoalsPerformance",nr,{enabled:J.length>0&&rr.length>0,staleTime:3e4,refetchInterval:3e5,retry:2,onError:r=>{}}),sr=(0,t.useMemo)(()=>ar?.performance||{},[ar]),ir=Q?Q.message:null,lr=async n=>{try{const a=function(r){const n=[];return r.name&&""!==r.name.trim()||n.push("Goal name is required"),r.event_name&&""!==r.event_name.trim()||n.push("Event name is required"),r.trigger_type?A.includes(r.trigger_type)||n.push(`Invalid trigger type: ${r.trigger_type}. Allowed: ${A.join(", ")}`):n.push("Trigger type is required"),r.conditions&&Array.isArray(r.conditions)&&r.conditions.forEach((r,e)=>{const a=e+1;if(r.param&&""!==r.param.trim()||n.push(`Condition #${a}: Parameter (param) is required`),r.operator?l.includes(r.operator)||n.push(`Condition #${a}: Invalid operator '${r.operator}'. Allowed: ${l.join(", ")}`):n.push(`Condition #${a}: Operator is required`),void 0!==r.value&&""!==r.value||n.push(`Condition #${a}: Value is required`),"matches_regex"===r.operator)try{new RegExp(String(r.value))}catch(e){n.push(`Condition #${a}: Invalid regex pattern: ${r.value}`)}}),r.match_logic&&!["all","any"].includes(r.match_logic)&&n.push(`Match logic must be 'all' or 'any', got: ${r.match_logic}`),r.value_type&&!d.includes(r.value_type)&&n.push(`Invalid value_type. Must be: ${d.join(", ")}`),"fixed"===r.value_type&&(void 0===r.value||null===r.value?n.push('Fixed value is required when value_type is "fixed"'):isNaN(Number(r.value))&&n.push("Fixed value must be a number")),r.frequency&&!c.includes(r.frequency)&&n.push(`Invalid frequency. Must be: ${c.join(", ")}`),{valid:0===n.length,errors:n}}(n);if(!a.valid){const r=0===(e=a.errors).length?"":1===e.length?e[0]:`Please fix the following errors:\n• ${e.join("\n• ")}`;throw new Error("Goal validation failed:\n\n"+r)}const t=new i.n(r);if("edit"===W&&Z){const r=Z.goal_id;await t.put(`/goals/${r}`,n)}else await t.post("/goals",n);H(),L(null),O(null),V(null),b("list")}catch(r){throw r}var e},dr=()=>{let r=[];return r="all"===B?E:x(B),_?(r=>{const n=r.toLowerCase();return E.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n))})(_):r},pr=(0,t.useMemo)(()=>{let r=[...J];if(F.search){const n=F.search.toLowerCase();r=r.filter(r=>r.name&&r.name.toLowerCase().includes(n)||r.description&&r.description.toLowerCase().includes(n))}return"all"!==F.category&&(r=r.filter(r=>r.category===F.category)),"all"!==F.triggerType&&(r=r.filter(r=>r.trigger_type===F.triggerType)),"all"!==F.status&&(r=r.filter(r=>r.is_active===("active"===F.status))),r.sort((r,n)=>{let e=0;switch(F.sortBy){case"name":e=(r.name||"").localeCompare(n.name||"");break;case"created_at":e=new Date(r.created_at.replace(" ","T")+"Z").getTime()-new Date(n.created_at.replace(" ","T")+"Z").getTime();break;case"conversions":e=(sr[r.goal_id]?.conversions||0)-(sr[n.goal_id]?.conversions||0);break}return"asc"===F.sortOrder?e:-e}),r},[J,F,sr]),gr=()=>{R({search:"",category:"all",triggerType:"all",status:"all",sortBy:"name",sortOrder:"asc"})};return(0,a.jsxs)("div",{className:"ts-goals-page",children:[(0,a.jsxs)("div",{className:"ts-goals-header",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"ts-page-title",children:(0,f.__)("Goals","tracksure")}),(0,a.jsx)("p",{className:"ts-page-subtitle",children:(0,f.__)("Track conversions and measure what matters most","tracksure")})]}),(0,a.jsxs)("div",{className:"ts-goals-header-actions",children:["goals"===e&&"list"===h&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(C.$n,{variant:"ghost",onClick:()=>Y(!0),icon:(0,a.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M10 14V6M10 6L7 9M10 6L13 9M4 16h12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),children:(0,f.__)("Import Goals","tracksure")}),(0,a.jsx)(C.$n,{variant:"outline",onClick:()=>{v("templates"),b("templates")},icon:(0,a.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M4 6h12M4 10h12M4 14h12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),children:(0,f.__)("Browse Templates","tracksure")}),(0,a.jsx)(C.$n,{variant:"primary",onClick:()=>b("custom-builder"),icon:(0,a.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M10 5v10M5 10h10",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),children:(0,f.__)("Create Custom Goal","tracksure")})]}),"list"!==h&&(0,a.jsx)(C.$n,{variant:"ghost",onClick:()=>{b("list"),v("goals")},children:(0,f.__)("← Back to Goals","tracksure")})]})]}),(0,a.jsxs)("div",{className:"ts-goals-tabs",children:[(0,a.jsxs)("button",{className:"ts-goals-tab "+("overview"===e?"ts-goals-tab--active":""),onClick:()=>{v("overview"),b("list")},children:[(0,a.jsx)(m.I,{name:"BarChart3",size:18}),(0,f.__)("Overview","tracksure")]}),(0,a.jsxs)("button",{className:"ts-goals-tab "+("goals"===e?"ts-goals-tab--active":""),onClick:()=>{v("goals"),b("list")},children:[(0,a.jsx)(m.I,{name:"Target",size:18}),(0,f.__)("All Goals","tracksure"),J.length>0&&(0,a.jsx)(C.Ex,{variant:"default",size:"sm",children:J.length})]}),(0,a.jsxs)("button",{className:"ts-goals-tab "+("templates"===e?"ts-goals-tab--active":""),onClick:()=>{v("templates"),b("templates")},children:[(0,a.jsx)(m.I,{name:"LayoutTemplate",size:18}),(0,f.__)("Templates","tracksure")]})]}),ir&&(0,a.jsxs)("div",{className:"ts-error-banner",children:[(0,a.jsx)(m.I,{name:"AlertTriangle",size:20,color:"warning"}),(0,a.jsx)("p",{children:ir})]}),"overview"===e&&(0,a.jsx)(cr,{}),"goals"===e&&(0,a.jsxs)(a.Fragment,{children:["list"===h&&(()=>{if(X)return(0,a.jsxs)("div",{className:"ts-goals-loading",children:[(0,a.jsx)("div",{className:"ts-goals-summary",children:[1,2,3].map(r=>(0,a.jsx)(g.or,{},r))}),(0,a.jsx)("div",{className:"ts-goals-table",children:(0,a.jsx)(g.cU,{rows:6,columns:5})})]});if(0===J.length)return(0,a.jsxs)("div",{className:"ts-empty-state",children:[(0,a.jsx)("div",{className:"ts-empty-icon",children:(0,a.jsx)(m.I,{name:"Target",size:64,color:"muted"})}),(0,a.jsx)("h2",{children:(0,f.__)("No goals yet","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Start tracking conversions by creating your first goal from a template or building a custom one.","tracksure")}),(0,a.jsxs)("div",{style:{display:"flex",gap:"12px",justifyContent:"center",marginTop:"16px"},children:[(0,a.jsx)(C.$n,{variant:"primary",onClick:()=>b("templates"),children:(0,f.__)("Browse Templates","tracksure")}),(0,a.jsx)(C.$n,{variant:"outline",onClick:()=>b("custom-builder"),children:(0,f.__)("Create Custom Goal","tracksure")})]})]});if(0===pr.length&&J.length>0)return(0,a.jsxs)("div",{style:{textAlign:"center",padding:"40px 20px"},children:[(0,a.jsx)("h2",{children:(0,f.__)("No Goals Found","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Try adjusting your filters or search query.","tracksure")}),(0,a.jsx)(C.$n,{onClick:gr,children:(0,f.__)("Clear Filters","tracksure")})]});const n=pr.filter(r=>r.is_active),e=n.reduce((r,n)=>{const e=sr[n.goal_id];return r+(e?.conversions||0)},0),t=n.reduce((r,n)=>{const e=sr[n.goal_id];return r+(e?.revenue||0)},0),o=n.filter(r=>"none"!==r.value_type).length,s=n.length>0?n.reduce((r,n)=>{const e=sr[n.goal_id];return r+(e?.conversion_rate||0)},0)/n.length:0;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"ts-goals-summary ts-goals-summary-row",children:[(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Total Achievements","tracksure"),value:e,format:"number"}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Active Goals","tracksure"),value:n.length,format:"number"}}),(0,a.jsx)(p.l,{metric:{label:t>0?(0,f.__)("Total Value","tracksure"):(0,f.__)("Goals with Value","tracksure"),value:t>0?t:o,format:t>0?"currency":"number",currency:(0,P._1)()}}),(0,a.jsx)(p.l,{metric:{label:(0,f.__)("Avg Conversion Rate","tracksure"),value:s,format:"percent"}})]}),(0,a.jsx)(or,{filters:F,onFiltersChange:R,onReset:gr}),(0,a.jsx)(er,{selectedGoals:T,allGoals:pr,onActionComplete:H,onSelectionChange:D}),0===pr.length?(0,a.jsxs)("div",{className:"ts-empty-state",children:[(0,a.jsx)("div",{className:"ts-empty-icon",children:(0,a.jsx)(m.I,{name:"Search",size:64,color:"muted"})}),(0,a.jsx)("h2",{children:(0,f.__)("No Goals Found","tracksure")}),(0,a.jsx)("p",{children:(0,f.__)("Try adjusting your filters or search query.","tracksure")}),(0,a.jsx)(C.$n,{variant:"outline",onClick:gr,children:(0,f.__)("Clear Filters","tracksure")})]}):(0,a.jsx)("div",{className:"ts-goals-grid",children:pr.map(n=>{const e=sr[n.goal_id],t=T.includes(n.goal_id);return(0,a.jsxs)("div",{className:"ts-goal-card "+(t?"ts-goal-card-selected":""),children:[(0,a.jsx)("div",{className:"ts-goal-checkbox",children:(0,a.jsx)("input",{type:"checkbox",checked:t,onChange:r=>{r.target.checked?D([...T,n.goal_id]):D(T.filter(r=>r!==n.goal_id))}})}),(0,a.jsxs)("div",{className:"ts-goal-header",children:[(0,a.jsxs)("div",{className:"ts-goal-title-section",children:[(0,a.jsxs)("div",{className:"ts-goal-title-row",children:[(0,a.jsx)("h3",{className:"ts-goal-name",children:n.name}),(0,a.jsx)("span",{className:"ts-goal-status "+(n.is_active?"ts-active":"ts-inactive"),children:n.is_active?(0,f.__)("Active","tracksure"):(0,f.__)("Inactive","tracksure")})]}),(0,a.jsx)("p",{className:"ts-goal-description",children:n.description})]}),(0,a.jsxs)("div",{className:"ts-goal-actions",children:[(0,a.jsx)("button",{className:"ts-btn-icon",onClick:()=>{L("edit"),V(n)},title:(0,f.__)("Edit goal","tracksure"),children:(0,a.jsx)(m.I,{name:"Edit2",size:16})}),(0,a.jsx)("button",{className:"ts-btn-icon",onClick:()=>(async n=>{try{const e=new i.n(r);await e.put(`/goals/${n.goal_id}`,{is_active:n.is_active?0:1}),H()}catch(r){throw r}})(n),title:n.is_active?(0,f.__)("Deactivate","tracksure"):(0,f.__)("Activate","tracksure"),children:(0,a.jsx)(m.I,{name:n.is_active?"Pause":"Play",size:16})}),(0,a.jsx)("button",{className:"ts-btn-icon ts-btn-danger",onClick:()=>{N(n),j(!0)},title:(0,f.__)("Delete goal","tracksure"),children:(0,a.jsx)(m.I,{name:"Trash2",size:16,color:"danger"})})]})]}),(0,a.jsx)("div",{className:"ts-goal-details",children:(0,a.jsxs)("div",{className:"ts-goal-meta",children:[(0,a.jsxs)("span",{className:"ts-goal-event",children:[(0,a.jsx)(m.I,{name:"BarChart2",size:16})," ",n.event_name]}),n.conditions.length>0&&(0,a.jsxs)("span",{className:"ts-goal-conditions",children:[(0,a.jsx)(m.I,{name:"Target",size:16})," ",n.conditions.length," ",1===n.conditions.length?(0,f.__)("condition","tracksure"):(0,f.__)("conditions","tracksure")]})]})}),e?(0,a.jsxs)("div",{className:"ts-goal-performance",children:[(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Conversions","tracksure")}),(0,a.jsx)("span",{className:"ts-goal-stat-value",children:e.conversions.toLocaleString()})]}),"none"!==n.value_type&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Revenue","tracksure")}),(0,a.jsx)("span",{className:"ts-goal-stat-value",children:(0,P.vv)(e.revenue)})]}),(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Avg. Value","tracksure")}),(0,a.jsx)("span",{className:"ts-goal-stat-value",children:(0,P.vv)(e.avg_value)})]})]}),(0,a.jsxs)("div",{className:"ts-goal-stat",children:[(0,a.jsx)("span",{className:"ts-goal-stat-label",children:(0,f.__)("Conv. Rate","tracksure")}),(0,a.jsxs)("span",{className:"ts-goal-stat-value",children:[e.conversion_rate.toFixed(2),"%"]})]})]}):tr?(0,a.jsxs)("div",{className:"ts-goal-performance ts-goal-performance--loading",children:[(0,a.jsx)("div",{className:"ts-goal-stat",children:(0,a.jsx)("span",{className:"ts-skeleton ts-skeleton--sm"})}),(0,a.jsx)("div",{className:"ts-goal-stat",children:(0,a.jsx)("span",{className:"ts-skeleton ts-skeleton--sm"})}),(0,a.jsx)("div",{className:"ts-goal-stat",children:(0,a.jsx)("span",{className:"ts-skeleton ts-skeleton--sm"})})]}):null,e&&e.conversions>0&&(0,a.jsxs)("button",{className:"ts-goal-view-details",onClick:()=>{S(n)},children:[(0,a.jsx)(m.I,{name:"Eye",size:14}),(0,f.__)("View Details","tracksure")]})]},n.goal_id)})})]})})(),"custom-builder"===h&&null]}),"templates"===e&&(()=>{const r=dr();return(0,a.jsxs)("div",{className:"ts-templates-view",children:[(0,a.jsx)(C.Zp,{className:"ts-templates-filters",children:(0,a.jsx)(C.bw,{children:(0,a.jsxs)("div",{className:"ts-filters-row",children:[(0,a.jsx)(C.l6,{label:(0,f.__)("Goal Category","tracksure"),value:B,onChange:r=>k(r.target.value),options:[{value:"all",label:(0,f.__)("All Categories","tracksure")},...Object.values(u).map(r=>({value:r.id,label:r.label}))],fullWidth:!0}),(0,a.jsx)(C.pd,{placeholder:(0,f.__)("Search templates...","tracksure"),value:_,onChange:r=>y(r.target.value),icon:(0,a.jsx)("svg",{width:"18",height:"18",viewBox:"0 0 20 20",fill:"none",children:(0,a.jsx)("path",{d:"M9 17A8 8 0 109 1a8 8 0 000 16zM19 19l-4.35-4.35",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),fullWidth:!0})]})})}),(0,a.jsx)("div",{className:"ts-templates-grid",children:r.map(r=>(0,a.jsx)(C.Zp,{variant:"elevated",hoverable:!0,className:"ts-template-card",children:(0,a.jsxs)(C.bw,{children:[(0,a.jsx)("div",{className:"ts-template-icon",children:(0,a.jsx)(m.I,{name:r.icon,size:32,color:"primary"})}),(0,a.jsx)("h3",{className:"ts-template-name",children:r.name}),(0,a.jsx)("p",{className:"ts-template-description",children:r.description}),(0,a.jsxs)("div",{className:"ts-template-meta",children:[(0,a.jsx)(C.Ex,{variant:"default",size:"sm",children:r.event_name}),(0,a.jsx)(C.Ex,{variant:"leads"===r.category?"success":"ecommerce"===r.category?"info":"default",size:"sm",children:r.category})]}),(0,a.jsx)(C.$n,{variant:"primary",fullWidth:!0,onClick:()=>{L("create-from-template"),O(r)},className:"ts-template-add-btn",children:(0,f.__)("Customize & Add","tracksure")})]})},r.id))}),0===r.length&&(0,a.jsx)(C.Zp,{children:(0,a.jsx)(C.bw,{children:(0,a.jsx)(C.pp,{icon:"Search",title:(0,f.__)("No templates found","tracksure"),message:(0,f.__)("Try adjusting your filters or search query.","tracksure")})})})]})})(),I&&(0,a.jsx)(M,{goal:I,onClose:()=>{S(null)}}),W&&(0,a.jsx)(G,{isOpen:!0,onClose:()=>{L(null),O(null),V(null)},onSave:lr,mode:W,template:U||void 0,existingGoal:Z||void 0}),"custom-builder"===h&&(0,a.jsx)(K,{isOpen:!0,onClose:()=>b("list"),onSave:r=>{lr(r),b("list")},onSaveAsTemplate:r=>{}}),(0,a.jsxs)(C.aF,{isOpen:w,onClose:()=>{j(!1),N(null)},title:(0,f.__)("Delete Goal","tracksure"),size:"sm",footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(C.$n,{variant:"ghost",onClick:()=>{j(!1),N(null)},children:(0,f.__)("Cancel","tracksure")}),(0,a.jsx)(C.$n,{variant:"danger",onClick:()=>z&&(async n=>{try{const e=new i.n(r);await e.delete(`/goals/${n.goal_id}`),H(),j(!1),N(null)}catch(r){}})(z),children:(0,f.__)("Delete","tracksure")})]}),children:[(0,a.jsxs)("p",{children:[(0,f.__)("Are you sure you want to delete","tracksure")," ",(0,a.jsx)("strong",{children:z?.name}),"?"]}),(0,a.jsx)("p",{style:{marginTop:"12px",color:"var(--ts-text-secondary)"},children:(0,f.__)("This action cannot be undone.","tracksure")})]}),q&&(0,a.jsx)("div",{className:"ts-modal-overlay",onClick:()=>Y(!1),children:(0,a.jsx)("div",{onClick:r=>r.stopPropagation(),children:(0,a.jsx)(Ar,{onImport:async n=>{const e=new i.n(r);for(const r of n)await e.post("/goals",r);H()},onClose:()=>Y(!1)})})})]})}},51768:(r,n,e)=>{e.d(n,{A:()=>p});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o),i=e(4417),A=e.n(i),l=new URL(e(9570),e.b),d=s()(t()),c=A()(l);d.push([r.id,`/**\n * Goal Details Modal Styles\n * Enhanced with tab navigation and analytics views\n * \n * @since 2.1.0\n * @package TrackSure\n */\n\n/* Main Container */\n.ts-goal-details-modal {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 600px;\n}\n\n/* Modal Subtitle */\n.ts-modal-subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n font-weight: 400;\n color: var(--text-tertiary);\n opacity: 0.8;\n}\n\n/* Tab Navigation */\n.ts-modal-tabs {\n display: flex;\n gap: 0;\n border-bottom: 1px solid var(--border-color);\n margin-bottom: 20px;\n padding: 0 4px;\n}\n\n.ts-modal-tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 20px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--text-secondary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n bottom: -1px;\n}\n\n.ts-modal-tab:hover {\n color: var(--text-primary);\n background: var(--background-secondary);\n}\n\n.ts-modal-tab--active {\n color: var(--primary);\n border-bottom-color: var(--primary);\n font-weight: 600;\n}\n\n.ts-modal-tab--active:hover {\n background: transparent;\n}\n\n/* Tab Content */\n.ts-modal-tab-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Overview Tab */\n.ts-goal-overview-tab {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.ts-overview-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.ts-metric {\n text-align: center;\n padding: 8px 0;\n}\n\n.ts-metric-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 8px;\n}\n\n.ts-metric .ts-metric-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary);\n line-height: 1.2;\n}\n\n.ts-top-pages {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.ts-top-page {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 12px;\n background: var(--background-secondary);\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.ts-top-page:hover {\n background: var(--background-tertiary);\n transform: translateX(4px);\n}\n\n.ts-top-page-rank {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--primary);\n color: white;\n border-radius: 50%;\n font-size: 14px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n.ts-top-page-url {\n flex: 1;\n min-width: 0;\n}\n\n.ts-top-page-url a {\n color: var(--text-primary);\n text-decoration: none;\n font-size: 14px;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ts-top-page-url a:hover {\n color: var(--primary);\n text-decoration: underline;\n}\n\n.ts-top-page-conversions {\n flex-shrink: 0;\n}\n\n/* Timeline Tab */\n.ts-modal-filters {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n margin-bottom: 16px;\n padding: 12px 16px;\n background: var(--background-secondary);\n border-radius: 8px;\n}\n\n.ts-filter-group {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.ts-filter-group label {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-secondary);\n white-space: nowrap;\n}\n\n.ts-filter-select {\n padding: 6px 32px 6px 12px;\n border: 1px solid var(--border-color);\n border-radius: 6px;\n background: var(--background-primary);\n color: var(--text-primary);\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n appearance: none;\n background-image: url(${c});\n background-repeat: no-repeat;\n background-position: right 8px center;\n}\n\n.ts-filter-select:hover {\n border-color: var(--primary);\n}\n\n.ts-filter-select:focus {\n outline: none;\n border-color: var(--primary);\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\n}\n\n.ts-export-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: var(--primary);\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.ts-export-btn:hover {\n background: var(--primary-dark);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px var(--primary-alpha-20);\n}\n\n.ts-modal-content {\n flex: 1;\n overflow: auto;\n margin-bottom: 16px;\n}\n\n.ts-table-scroll {\n overflow-x: auto;\n border-radius: 8px;\n border: 1px solid var(--border-color);\n}\n\n.ts-conversions-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-conversions-table thead {\n background: var(--background-secondary);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.ts-conversions-table thead th {\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--text-secondary);\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.05em;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition: background 0.2s ease;\n}\n\n.ts-conversions-table thead th:hover {\n background: var(--background-tertiary);\n}\n\n.ts-conversions-table thead th.ts-sorted {\n color: var(--primary);\n}\n\n.ts-conversions-table tbody tr {\n border-bottom: 1px solid var(--border-color);\n transition: background 0.15s ease;\n}\n\n.ts-conversions-table tbody tr:hover {\n background: var(--background-secondary);\n}\n\n.ts-conversions-table tbody td {\n padding: 12px;\n color: var(--text-primary);\n}\n\n.ts-date-cell {\n white-space: nowrap;\n color: var(--text-secondary);\n font-size: 12px;\n}\n\n.ts-url-cell {\n max-width: 300px;\n}\n\n.ts-url-link {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--primary);\n text-decoration: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ts-url-link:hover {\n text-decoration: underline;\n}\n\n.ts-url-empty,\n.ts-context-empty {\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.ts-context-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n background: var(--background-secondary);\n border-radius: 4px;\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.ts-source-info strong {\n color: var(--text-primary);\n font-weight: 600;\n}\n\n.ts-medium {\n color: var(--text-secondary);\n font-size: 12px;\n}\n\n.ts-campaign {\n font-size: 11px;\n color: var(--text-tertiary);\n margin-top: 2px;\n}\n\n.ts-device-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--background-secondary);\n border-radius: 12px;\n font-size: 12px;\n color: var(--text-secondary);\n text-transform: capitalize;\n}\n\n.ts-value-cell {\n font-weight: 600;\n color: var(--success);\n white-space: nowrap;\n}\n\n/* Pagination */\n.ts-modal-pagination {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n padding: 12px 16px;\n background: var(--background-secondary);\n border-radius: 8px;\n margin-top: auto;\n}\n\n.ts-page-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n background: var(--background-primary);\n border: 1px solid var(--border-color);\n border-radius: 6px;\n color: var(--text-primary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ts-page-btn:hover:not(:disabled) {\n background: var(--background-tertiary);\n border-color: var(--primary);\n color: var(--primary);\n}\n\n.ts-page-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.ts-page-info {\n font-size: 13px;\n color: var(--text-secondary);\n}\n\n/* Sources Tab */\n.ts-sources-tab {\n overflow: auto;\n}\n\n.ts-sources-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-sources-table thead {\n background: var(--background-secondary);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.ts-sources-table thead th {\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--text-secondary);\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.05em;\n}\n\n.ts-sources-table tbody tr {\n border-bottom: 1px solid var(--border-color);\n transition: background 0.15s ease;\n}\n\n.ts-sources-table tbody tr:hover {\n background: var(--background-secondary);\n}\n\n.ts-sources-table tbody td {\n padding: 12px;\n}\n\n.ts-source-name {\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.ts-source-medium {\n color: var(--text-secondary);\n font-size: 12px;\n}\n\n.ts-source-conversions {\n font-weight: 600;\n color: var(--primary);\n}\n\n.ts-source-percentage {\n min-width: 200px;\n}\n\n.ts-progress-bar {\n display: inline-block;\n width: 100px;\n height: 6px;\n background: var(--background-secondary);\n border-radius: 3px;\n overflow: hidden;\n margin-right: 12px;\n vertical-align: middle;\n}\n\n.ts-progress-fill {\n height: 100%;\n background: linear-gradient(90deg, var(--primary), var(--primary-dark));\n border-radius: 3px;\n transition: width 0.3s ease;\n}\n\n.ts-source-revenue {\n font-weight: 600;\n color: var(--success);\n white-space: nowrap;\n}\n\n/* Devices Tab */\n.ts-devices-tab {\n overflow: auto;\n}\n\n.ts-devices-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.ts-devices-table thead {\n background: var(--background-secondary);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n.ts-devices-table thead th {\n padding: 12px;\n text-align: left;\n font-weight: 600;\n color: var(--text-secondary);\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.05em;\n}\n\n.ts-devices-table tbody tr {\n border-bottom: 1px solid var(--border-color);\n transition: background 0.15s ease;\n}\n\n.ts-devices-table tbody tr:hover {\n background: var(--background-secondary);\n}\n\n.ts-devices-table tbody td {\n padding: 12px;\n}\n\n.ts-device-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--text-primary);\n text-transform: capitalize;\n}\n\n.ts-device-browser {\n color: var(--text-secondary);\n}\n\n.ts-device-conversions {\n font-weight: 600;\n color: var(--primary);\n}\n\n.ts-device-percentage {\n min-width: 200px;\n}\n\n/* Loading & Empty States */\n.ts-loading,\n.ts-error,\n.ts-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 20px;\n text-align: center;\n color: var(--text-secondary);\n}\n\n.ts-loading svg,\n.ts-error svg,\n.ts-empty svg {\n color: var(--text-tertiary);\n opacity: 0.4;\n animation: pulse 2s ease-in-out infinite;\n}\n\n.ts-loading svg {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 0.3;\n }\n 50% {\n opacity: 0.6;\n }\n}\n\n.ts-error {\n color: var(--danger);\n}\n\n/* Dark Theme */\n[data-theme="dark"] {\n .ts-modal-tabs {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-modal-tab {\n color: var(--text-dark-secondary);\n }\n\n .ts-modal-tab:hover {\n color: var(--text-dark-primary);\n background: var(--background-dark-secondary);\n }\n\n .ts-modal-tab--active {\n color: var(--primary-light);\n border-bottom-color: var(--primary-light);\n }\n\n .ts-metric-label {\n color: var(--text-dark-tertiary);\n }\n\n .ts-metric-value {\n color: var(--text-dark-primary);\n }\n\n .ts-top-page {\n background: var(--background-dark-secondary);\n }\n\n .ts-top-page:hover {\n background: var(--background-dark-tertiary);\n }\n\n .ts-top-page-url a {\n color: var(--text-dark-primary);\n }\n\n .ts-top-page-url a:hover {\n color: var(--primary-light);\n }\n\n .ts-modal-filters {\n background: var(--background-dark-secondary);\n }\n\n .ts-filter-group label {\n color: var(--text-dark-secondary);\n }\n\n .ts-filter-select {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n color: var(--text-dark-primary);\n }\n\n .ts-filter-select:hover {\n border-color: var(--primary-light);\n }\n\n .ts-export-btn {\n background: var(--primary-dark);\n }\n\n .ts-export-btn:hover {\n background: var(--primary);\n }\n\n .ts-table-scroll {\n border-color: var(--border-dark);\n }\n\n .ts-conversions-table thead {\n background: var(--background-dark-secondary);\n }\n\n .ts-conversions-table thead th {\n color: var(--text-dark-secondary);\n }\n\n .ts-conversions-table thead th.ts-sorted {\n color: var(--primary-light);\n }\n\n .ts-conversions-table tbody tr {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-conversions-table tbody tr:hover {\n background: var(--background-dark-secondary);\n }\n\n .ts-conversions-table tbody td {\n color: var(--text-dark-primary);\n }\n\n .ts-url-link {\n color: var(--primary-light);\n }\n\n .ts-context-badge {\n background: var(--background-dark-secondary);\n color: var(--text-dark-secondary);\n }\n\n .ts-device-badge {\n background: var(--background-dark-secondary);\n color: var(--text-dark-secondary);\n }\n\n .ts-modal-pagination {\n background: var(--background-dark-secondary);\n }\n\n .ts-page-btn {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n color: var(--text-dark-primary);\n }\n\n .ts-page-btn:hover:not(:disabled) {\n background: var(--background-dark-tertiary);\n border-color: var(--primary-light);\n color: var(--primary-light);\n }\n\n .ts-page-info {\n color: var(--text-dark-secondary);\n }\n\n .ts-sources-table thead,\n .ts-devices-table thead {\n background: var(--background-dark-secondary);\n }\n\n .ts-sources-table thead th,\n .ts-devices-table thead th {\n color: var(--text-dark-secondary);\n }\n\n .ts-sources-table tbody tr,\n .ts-devices-table tbody tr {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-sources-table tbody tr:hover,\n .ts-devices-table tbody tr:hover {\n background: var(--background-dark-secondary);\n }\n\n .ts-source-name,\n .ts-device-name {\n color: var(--text-dark-primary);\n }\n\n .ts-source-medium,\n .ts-device-browser {\n color: var(--text-dark-secondary);\n }\n\n .ts-source-conversions,\n .ts-device-conversions {\n color: var(--primary-light);\n }\n\n .ts-progress-bar {\n background: var(--background-dark-secondary);\n }\n\n .ts-progress-fill {\n background: linear-gradient(90deg, var(--primary-light), var(--primary));\n }\n\n .ts-loading,\n .ts-error,\n .ts-empty {\n color: var(--text-dark-secondary);\n }\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .ts-modal-tabs {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n\n .ts-modal-tab {\n padding: 10px 16px;\n font-size: 13px;\n }\n\n .ts-overview-metrics {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .ts-modal-filters {\n flex-direction: column;\n align-items: stretch;\n }\n\n .ts-filter-group {\n flex-direction: column;\n align-items: stretch;\n }\n\n .ts-export-btn {\n width: 100%;\n justify-content: center;\n }\n\n .ts-table-scroll {\n font-size: 12px;\n }\n\n .ts-conversions-table thead th,\n .ts-sources-table thead th,\n .ts-devices-table thead th {\n padding: 8px;\n font-size: 10px;\n }\n\n .ts-conversions-table tbody td,\n .ts-sources-table tbody td,\n .ts-devices-table tbody td {\n padding: 8px;\n }\n\n .ts-modal-pagination {\n flex-direction: column;\n gap: 12px;\n }\n\n .ts-page-info {\n font-size: 12px;\n text-align: center;\n }\n\n .ts-top-page {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .ts-top-page-url {\n width: 100%;\n }\n\n .ts-source-percentage,\n .ts-device-percentage {\n min-width: 150px;\n }\n\n .ts-progress-bar {\n width: 60px;\n }\n}\n\n/* Accessibility */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n@media (prefers-contrast: high) {\n .ts-modal-tab--active {\n border-bottom-width: 3px;\n }\n\n .ts-progress-fill {\n background: var(--primary);\n }\n\n .ts-url-link {\n text-decoration: underline;\n }\n}\n`,"",{version:3,sources:["webpack://./src/components/goals/components/GoalDetailsModal.css"],names:[],mappings:"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",sourcesContent:["/**\r\n * Goal Details Modal Styles\r\n * Enhanced with tab navigation and analytics views\r\n * \r\n * @since 2.1.0\r\n * @package TrackSure\r\n */\r\n\r\n/* Main Container */\r\n.ts-goal-details-modal {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n min-height: 600px;\r\n}\r\n\r\n/* Modal Subtitle */\r\n.ts-modal-subtitle {\r\n margin: 4px 0 0;\r\n font-size: 13px;\r\n font-weight: 400;\r\n color: var(--text-tertiary);\r\n opacity: 0.8;\r\n}\r\n\r\n/* Tab Navigation */\r\n.ts-modal-tabs {\r\n display: flex;\r\n gap: 0;\r\n border-bottom: 1px solid var(--border-color);\r\n margin-bottom: 20px;\r\n padding: 0 4px;\r\n}\r\n\r\n.ts-modal-tab {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 12px 20px;\r\n background: transparent;\r\n border: none;\r\n border-bottom: 2px solid transparent;\r\n color: var(--text-secondary);\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n position: relative;\r\n bottom: -1px;\r\n}\r\n\r\n.ts-modal-tab:hover {\r\n color: var(--text-primary);\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-modal-tab--active {\r\n color: var(--primary);\r\n border-bottom-color: var(--primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-modal-tab--active:hover {\r\n background: transparent;\r\n}\r\n\r\n/* Tab Content */\r\n.ts-modal-tab-content {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n}\r\n\r\n/* Overview Tab */\r\n.ts-goal-overview-tab {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 20px;\r\n}\r\n\r\n.ts-overview-metrics {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: 16px;\r\n}\r\n\r\n.ts-metric {\r\n text-align: center;\r\n padding: 8px 0;\r\n}\r\n\r\n.ts-metric-label {\r\n font-size: 12px;\r\n font-weight: 500;\r\n color: var(--text-tertiary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.ts-metric .ts-metric-value {\r\n font-size: 28px;\r\n font-weight: 700;\r\n color: var(--text-primary);\r\n line-height: 1.2;\r\n}\r\n\r\n.ts-top-pages {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.ts-top-page {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n padding: 12px;\r\n background: var(--background-secondary);\r\n border-radius: 8px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-top-page:hover {\r\n background: var(--background-tertiary);\r\n transform: translateX(4px);\r\n}\r\n\r\n.ts-top-page-rank {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n background: var(--primary);\r\n color: white;\r\n border-radius: 50%;\r\n font-size: 14px;\r\n font-weight: 700;\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-top-page-url {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-top-page-url a {\r\n color: var(--text-primary);\r\n text-decoration: none;\r\n font-size: 14px;\r\n display: block;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-top-page-url a:hover {\r\n color: var(--primary);\r\n text-decoration: underline;\r\n}\r\n\r\n.ts-top-page-conversions {\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Timeline Tab */\r\n.ts-modal-filters {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 16px;\r\n margin-bottom: 16px;\r\n padding: 12px 16px;\r\n background: var(--background-secondary);\r\n border-radius: 8px;\r\n}\r\n\r\n.ts-filter-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n}\r\n\r\n.ts-filter-group label {\r\n font-size: 13px;\r\n font-weight: 500;\r\n color: var(--text-secondary);\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-filter-select {\r\n padding: 6px 32px 6px 12px;\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n background: var(--background-primary);\r\n color: var(--text-primary);\r\n font-size: 13px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n appearance: none;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L2 4h8z'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 8px center;\r\n}\r\n\r\n.ts-filter-select:hover {\r\n border-color: var(--primary);\r\n}\r\n\r\n.ts-filter-select:focus {\r\n outline: none;\r\n border-color: var(--primary);\r\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-export-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 6px 14px;\r\n background: var(--primary);\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n font-size: 13px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-export-btn:hover {\r\n background: var(--primary-dark);\r\n transform: translateY(-1px);\r\n box-shadow: 0 2px 8px var(--primary-alpha-20);\r\n}\r\n\r\n.ts-modal-content {\r\n flex: 1;\r\n overflow: auto;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.ts-table-scroll {\r\n overflow-x: auto;\r\n border-radius: 8px;\r\n border: 1px solid var(--border-color);\r\n}\r\n\r\n.ts-conversions-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-conversions-table thead {\r\n background: var(--background-secondary);\r\n position: sticky;\r\n top: 0;\r\n z-index: 10;\r\n}\r\n\r\n.ts-conversions-table thead th {\r\n padding: 12px;\r\n text-align: left;\r\n font-weight: 600;\r\n color: var(--text-secondary);\r\n text-transform: uppercase;\r\n font-size: 11px;\r\n letter-spacing: 0.05em;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n user-select: none;\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.ts-conversions-table thead th:hover {\r\n background: var(--background-tertiary);\r\n}\r\n\r\n.ts-conversions-table thead th.ts-sorted {\r\n color: var(--primary);\r\n}\r\n\r\n.ts-conversions-table tbody tr {\r\n border-bottom: 1px solid var(--border-color);\r\n transition: background 0.15s ease;\r\n}\r\n\r\n.ts-conversions-table tbody tr:hover {\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-conversions-table tbody td {\r\n padding: 12px;\r\n color: var(--text-primary);\r\n}\r\n\r\n.ts-date-cell {\r\n white-space: nowrap;\r\n color: var(--text-secondary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-url-cell {\r\n max-width: 300px;\r\n}\r\n\r\n.ts-url-link {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n color: var(--primary);\r\n text-decoration: none;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.ts-url-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.ts-url-empty,\r\n.ts-context-empty {\r\n color: var(--text-tertiary);\r\n font-style: italic;\r\n}\r\n\r\n.ts-context-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 4px 8px;\r\n background: var(--background-secondary);\r\n border-radius: 4px;\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-source-info strong {\r\n color: var(--text-primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-medium {\r\n color: var(--text-secondary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-campaign {\r\n font-size: 11px;\r\n color: var(--text-tertiary);\r\n margin-top: 2px;\r\n}\r\n\r\n.ts-device-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 4px 10px;\r\n background: var(--background-secondary);\r\n border-radius: 12px;\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n text-transform: capitalize;\r\n}\r\n\r\n.ts-value-cell {\r\n font-weight: 600;\r\n color: var(--success);\r\n white-space: nowrap;\r\n}\r\n\r\n/* Pagination */\r\n.ts-modal-pagination {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 16px;\r\n padding: 12px 16px;\r\n background: var(--background-secondary);\r\n border-radius: 8px;\r\n margin-top: auto;\r\n}\r\n\r\n.ts-page-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 14px;\r\n background: var(--background-primary);\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n color: var(--text-primary);\r\n font-size: 13px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-page-btn:hover:not(:disabled) {\r\n background: var(--background-tertiary);\r\n border-color: var(--primary);\r\n color: var(--primary);\r\n}\r\n\r\n.ts-page-btn:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.ts-page-info {\r\n font-size: 13px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n/* Sources Tab */\r\n.ts-sources-tab {\r\n overflow: auto;\r\n}\r\n\r\n.ts-sources-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-sources-table thead {\r\n background: var(--background-secondary);\r\n position: sticky;\r\n top: 0;\r\n z-index: 10;\r\n}\r\n\r\n.ts-sources-table thead th {\r\n padding: 12px;\r\n text-align: left;\r\n font-weight: 600;\r\n color: var(--text-secondary);\r\n text-transform: uppercase;\r\n font-size: 11px;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.ts-sources-table tbody tr {\r\n border-bottom: 1px solid var(--border-color);\r\n transition: background 0.15s ease;\r\n}\r\n\r\n.ts-sources-table tbody tr:hover {\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-sources-table tbody td {\r\n padding: 12px;\r\n}\r\n\r\n.ts-source-name {\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n}\r\n\r\n.ts-source-medium {\r\n color: var(--text-secondary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-source-conversions {\r\n font-weight: 600;\r\n color: var(--primary);\r\n}\r\n\r\n.ts-source-percentage {\r\n min-width: 200px;\r\n}\r\n\r\n.ts-progress-bar {\r\n display: inline-block;\r\n width: 100px;\r\n height: 6px;\r\n background: var(--background-secondary);\r\n border-radius: 3px;\r\n overflow: hidden;\r\n margin-right: 12px;\r\n vertical-align: middle;\r\n}\r\n\r\n.ts-progress-fill {\r\n height: 100%;\r\n background: linear-gradient(90deg, var(--primary), var(--primary-dark));\r\n border-radius: 3px;\r\n transition: width 0.3s ease;\r\n}\r\n\r\n.ts-source-revenue {\r\n font-weight: 600;\r\n color: var(--success);\r\n white-space: nowrap;\r\n}\r\n\r\n/* Devices Tab */\r\n.ts-devices-tab {\r\n overflow: auto;\r\n}\r\n\r\n.ts-devices-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 13px;\r\n}\r\n\r\n.ts-devices-table thead {\r\n background: var(--background-secondary);\r\n position: sticky;\r\n top: 0;\r\n z-index: 10;\r\n}\r\n\r\n.ts-devices-table thead th {\r\n padding: 12px;\r\n text-align: left;\r\n font-weight: 600;\r\n color: var(--text-secondary);\r\n text-transform: uppercase;\r\n font-size: 11px;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.ts-devices-table tbody tr {\r\n border-bottom: 1px solid var(--border-color);\r\n transition: background 0.15s ease;\r\n}\r\n\r\n.ts-devices-table tbody tr:hover {\r\n background: var(--background-secondary);\r\n}\r\n\r\n.ts-devices-table tbody td {\r\n padding: 12px;\r\n}\r\n\r\n.ts-device-name {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n text-transform: capitalize;\r\n}\r\n\r\n.ts-device-browser {\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-device-conversions {\r\n font-weight: 600;\r\n color: var(--primary);\r\n}\r\n\r\n.ts-device-percentage {\r\n min-width: 200px;\r\n}\r\n\r\n/* Loading & Empty States */\r\n.ts-loading,\r\n.ts-error,\r\n.ts-empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 16px;\r\n padding: 60px 20px;\r\n text-align: center;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-loading svg,\r\n.ts-error svg,\r\n.ts-empty svg {\r\n color: var(--text-tertiary);\r\n opacity: 0.4;\r\n animation: pulse 2s ease-in-out infinite;\r\n}\r\n\r\n.ts-loading svg {\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@keyframes pulse {\r\n 0%, 100% {\r\n opacity: 0.3;\r\n }\r\n 50% {\r\n opacity: 0.6;\r\n }\r\n}\r\n\r\n.ts-error {\r\n color: var(--danger);\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme=\"dark\"] {\r\n .ts-modal-tabs {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-modal-tab {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-modal-tab:hover {\r\n color: var(--text-dark-primary);\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-modal-tab--active {\r\n color: var(--primary-light);\r\n border-bottom-color: var(--primary-light);\r\n }\r\n\r\n .ts-metric-label {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-metric-value {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-top-page {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-top-page:hover {\r\n background: var(--background-dark-tertiary);\r\n }\r\n\r\n .ts-top-page-url a {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-top-page-url a:hover {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-modal-filters {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-filter-group label {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-filter-select {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-filter-select:hover {\r\n border-color: var(--primary-light);\r\n }\r\n\r\n .ts-export-btn {\r\n background: var(--primary-dark);\r\n }\r\n\r\n .ts-export-btn:hover {\r\n background: var(--primary);\r\n }\r\n\r\n .ts-table-scroll {\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-conversions-table thead {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-conversions-table thead th {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-conversions-table thead th.ts-sorted {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-conversions-table tbody tr {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-conversions-table tbody tr:hover {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-conversions-table tbody td {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-url-link {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-context-badge {\r\n background: var(--background-dark-secondary);\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-device-badge {\r\n background: var(--background-dark-secondary);\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-modal-pagination {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-page-btn {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-page-btn:hover:not(:disabled) {\r\n background: var(--background-dark-tertiary);\r\n border-color: var(--primary-light);\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-page-info {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-sources-table thead,\r\n .ts-devices-table thead {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-sources-table thead th,\r\n .ts-devices-table thead th {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-sources-table tbody tr,\r\n .ts-devices-table tbody tr {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-sources-table tbody tr:hover,\r\n .ts-devices-table tbody tr:hover {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-source-name,\r\n .ts-device-name {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-source-medium,\r\n .ts-device-browser {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-source-conversions,\r\n .ts-device-conversions {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-progress-bar {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-progress-fill {\r\n background: linear-gradient(90deg, var(--primary-light), var(--primary));\r\n }\r\n\r\n .ts-loading,\r\n .ts-error,\r\n .ts-empty {\r\n color: var(--text-dark-secondary);\r\n }\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 768px) {\r\n .ts-modal-tabs {\r\n overflow-x: auto;\r\n -webkit-overflow-scrolling: touch;\r\n }\r\n\r\n .ts-modal-tab {\r\n padding: 10px 16px;\r\n font-size: 13px;\r\n }\r\n\r\n .ts-overview-metrics {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n\r\n .ts-modal-filters {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .ts-filter-group {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .ts-export-btn {\r\n width: 100%;\r\n justify-content: center;\r\n }\r\n\r\n .ts-table-scroll {\r\n font-size: 12px;\r\n }\r\n\r\n .ts-conversions-table thead th,\r\n .ts-sources-table thead th,\r\n .ts-devices-table thead th {\r\n padding: 8px;\r\n font-size: 10px;\r\n }\r\n\r\n .ts-conversions-table tbody td,\r\n .ts-sources-table tbody td,\r\n .ts-devices-table tbody td {\r\n padding: 8px;\r\n }\r\n\r\n .ts-modal-pagination {\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n\r\n .ts-page-info {\r\n font-size: 12px;\r\n text-align: center;\r\n }\r\n\r\n .ts-top-page {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 8px;\r\n }\r\n\r\n .ts-top-page-url {\r\n width: 100%;\r\n }\r\n\r\n .ts-source-percentage,\r\n .ts-device-percentage {\r\n min-width: 150px;\r\n }\r\n\r\n .ts-progress-bar {\r\n width: 60px;\r\n }\r\n}\r\n\r\n/* Accessibility */\r\n@media (prefers-reduced-motion: reduce) {\r\n *,\r\n *::before,\r\n *::after {\r\n animation-duration: 0.01ms !important;\r\n animation-iteration-count: 1 !important;\r\n transition-duration: 0.01ms !important;\r\n }\r\n}\r\n\r\n@media (prefers-contrast: high) {\r\n .ts-modal-tab--active {\r\n border-bottom-width: 3px;\r\n }\r\n\r\n .ts-progress-fill {\r\n background: var(--primary);\r\n }\r\n\r\n .ts-url-link {\r\n text-decoration: underline;\r\n }\r\n}\r\n"],sourceRoot:""}]);const p=d},56883:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Custom Goal Builder Styles\n * \n * Step-by-step wizard interface with clear visual hierarchy,\n * contextual help, and premium UI/UX\n * \n * @since 2.1.0\n * @package TrackSure\n */\n\n/* Main Container */\n.ts-custom-goal-builder {\n display: flex;\n flex-direction: column;\n gap: 24px;\n min-height: 600px;\n}\n\n/* Step Indicator */\n.ts-goal-builder-steps {\n display: flex;\n gap: 12px;\n padding: 20px;\n background: var(--background-secondary);\n border-radius: 12px;\n overflow-x: auto;\n}\n\n.ts-step {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 160px;\n padding: 12px 16px;\n background: var(--background-primary);\n border: 2px solid var(--border-color);\n border-radius: 8px;\n transition: all 0.3s ease;\n cursor: default;\n}\n\n.ts-step--active {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\n}\n\n.ts-step--completed {\n border-color: var(--success);\n background: var(--success-alpha-5);\n}\n\n.ts-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--background-secondary);\n border-radius: 50%;\n font-size: 14px;\n font-weight: 700;\n color: var(--text-secondary);\n flex-shrink: 0;\n transition: all 0.3s ease;\n}\n\n.ts-step--active .ts-step-number {\n background: var(--primary);\n color: white;\n}\n\n.ts-step--completed .ts-step-number {\n background: var(--success);\n color: white;\n}\n\n.ts-step-info {\n flex: 1;\n min-width: 0;\n}\n\n.ts-step-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ts-step-description {\n font-size: 11px;\n color: var(--text-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ts-step--active .ts-step-title {\n color: var(--primary);\n}\n\n/* Builder Content */\n.ts-builder-content {\n flex: 1;\n overflow-y: auto;\n max-height: 500px;\n}\n\n.ts-step-content {\n animation: fadeIn 0.3s ease;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.ts-draft-notice {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n background: var(--info-alpha-10);\n border-left: 4px solid var(--info);\n border-radius: 6px;\n color: var(--info);\n font-size: 13px;\n margin-bottom: 16px;\n}\n\n/* Section Intro */\n.ts-section-intro {\n font-size: 14px;\n color: var(--text-secondary);\n margin-bottom: 20px;\n line-height: 1.6;\n}\n\n/* Form Fields */\n.ts-form-field {\n margin-bottom: 24px;\n}\n\n.ts-form-field label {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 8px;\n}\n\n.ts-required {\n color: var(--danger);\n margin-left: 2px;\n}\n\n.ts-optional {\n font-weight: 400;\n color: var(--text-tertiary);\n font-size: 12px;\n}\n\n.ts-form-field input[type="text"],\n.ts-form-field input[type="number"],\n.ts-form-field textarea,\n.ts-form-field select {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--border-color);\n border-radius: 6px;\n background: var(--background-primary);\n color: var(--text-primary);\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.ts-form-field input:focus,\n.ts-form-field textarea:focus,\n.ts-form-field select:focus {\n outline: none;\n border-color: var(--primary);\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\n}\n\n.ts-input-error {\n border-color: var(--danger) !important;\n}\n\n.ts-error-message {\n display: block;\n margin-top: 6px;\n font-size: 12px;\n color: var(--danger);\n}\n\n.ts-field-help {\n margin-top: 6px;\n font-size: 12px;\n color: var(--text-tertiary);\n line-height: 1.5;\n}\n\n/* Category Grid */\n.ts-category-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n}\n\n.ts-category-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 20px 16px;\n background: var(--background-secondary);\n border: 2px solid var(--border-color);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: center;\n}\n\n.ts-category-card:hover {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px var(--shadow-color);\n}\n\n.ts-category-card--selected {\n border-color: var(--primary);\n background: var(--primary-alpha-10);\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\n}\n\n.ts-category-card span {\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n/* Trigger Grid */\n.ts-trigger-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n\n.ts-trigger-card {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 16px;\n background: var(--background-secondary);\n border: 2px solid var(--border-color);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n}\n\n.ts-trigger-card:hover {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n box-shadow: 0 4px 12px var(--shadow-color);\n}\n\n.ts-trigger-card--selected {\n border-color: var(--primary);\n background: var(--primary-alpha-10);\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\n}\n\n.ts-trigger-icon {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--background-primary);\n border-radius: 8px;\n color: var(--primary);\n}\n\n.ts-trigger-card--selected .ts-trigger-icon {\n background: var(--primary);\n color: white;\n}\n\n.ts-trigger-info {\n flex: 1;\n min-width: 0;\n}\n\n.ts-trigger-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 4px;\n}\n\n.ts-trigger-description {\n font-size: 12px;\n color: var(--text-secondary);\n line-height: 1.4;\n}\n\n.ts-trigger-check {\n position: absolute;\n top: 12px;\n right: 12px;\n color: var(--primary);\n}\n\n/* Radio Options */\n.ts-radio-group {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.ts-radio-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--border-color);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.ts-radio-option:hover {\n border-color: var(--primary);\n background: var(--primary-alpha-5);\n}\n\n.ts-radio-option input[type="radio"] {\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.ts-radio-option span {\n flex: 1;\n}\n\n.ts-radio-option strong {\n display: block;\n font-size: 14px;\n color: var(--text-primary);\n margin-bottom: 4px;\n}\n\n.ts-radio-option small {\n display: block;\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.ts-value-input {\n margin-top: 12px;\n padding-left: 24px;\n}\n\n.ts-value-input input[type="number"] {\n max-width: 200px;\n}\n\n/* Conditions Preview */\n.ts-conditions-preview {\n margin-top: 24px;\n padding: 16px;\n background: var(--background-secondary);\n border-left: 4px solid var(--primary);\n border-radius: 6px;\n}\n\n.ts-conditions-preview h4 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 12px;\n}\n\n.ts-logic-preview {\n font-size: 13px;\n color: var(--text-secondary);\n}\n\n.ts-logic-preview p {\n margin-bottom: 12px;\n}\n\n.ts-logic-preview strong {\n color: var(--primary);\n font-weight: 700;\n}\n\n.ts-condition-list {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\n.ts-condition-list li {\n padding: 8px 12px;\n background: var(--background-primary);\n border-radius: 4px;\n margin-bottom: 6px;\n font-size: 12px;\n font-family: \'Courier New\', monospace;\n}\n\n.ts-condition-list code {\n color: var(--primary);\n font-weight: 600;\n}\n\n.ts-condition-list em {\n color: var(--text-tertiary);\n font-style: normal;\n margin: 0 6px;\n}\n\n/* Goal Preview */\n.ts-goal-preview {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.ts-preview-section {\n padding-bottom: 20px;\n border-bottom: 1px solid var(--border-color);\n}\n\n.ts-preview-section:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n\n.ts-preview-section h4 {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary);\n margin-bottom: 12px;\n}\n\n.ts-preview-section p {\n font-size: 13px;\n color: var(--text-secondary);\n margin-bottom: 12px;\n}\n\n.ts-preview-section dl {\n display: grid;\n grid-template-columns: 140px 1fr;\n gap: 12px 16px;\n margin: 0;\n}\n\n.ts-preview-section dt {\n font-size: 12px;\n font-weight: 600;\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.ts-preview-section dd {\n font-size: 14px;\n color: var(--text-primary);\n margin: 0;\n}\n\n.ts-preview-section code {\n padding: 2px 6px;\n background: var(--background-secondary);\n border-radius: 3px;\n font-size: 12px;\n color: var(--primary);\n font-family: \'Courier New\', monospace;\n}\n\n.ts-no-conditions {\n font-style: italic;\n color: var(--text-tertiary);\n}\n\n/* Builder Actions */\n.ts-builder-actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n padding: 16px 20px;\n background: var(--background-secondary);\n border-top: 1px solid var(--border-color);\n border-radius: 0 0 12px 12px;\n margin: 0 -24px -24px;\n}\n\n.ts-actions-left,\n.ts-actions-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* Dark Theme */\n[data-theme="dark"] {\n .ts-goal-builder-steps {\n background: var(--background-dark-secondary);\n }\n\n .ts-step {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n }\n\n .ts-step--active {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-10);\n }\n\n .ts-step--completed {\n border-color: var(--success-light);\n background: var(--success-dark-alpha-10);\n }\n\n .ts-step-number {\n background: var(--background-dark-secondary);\n color: var(--text-dark-secondary);\n }\n\n .ts-step--active .ts-step-number {\n background: var(--primary-light);\n }\n\n .ts-step--completed .ts-step-number {\n background: var(--success-light);\n }\n\n .ts-step-title {\n color: var(--text-dark-primary);\n }\n\n .ts-step-description {\n color: var(--text-dark-tertiary);\n }\n\n .ts-step--active .ts-step-title {\n color: var(--primary-light);\n }\n\n .ts-draft-notice {\n background: var(--info-dark-alpha-10);\n border-left-color: var(--info-light);\n color: var(--info-light);\n }\n\n .ts-section-intro {\n color: var(--text-dark-secondary);\n }\n\n .ts-form-field label {\n color: var(--text-dark-primary);\n }\n\n .ts-form-field input,\n .ts-form-field textarea,\n .ts-form-field select {\n background: var(--background-dark-primary);\n border-color: var(--border-dark);\n color: var(--text-dark-primary);\n }\n\n .ts-field-help {\n color: var(--text-dark-tertiary);\n }\n\n .ts-category-card,\n .ts-trigger-card {\n background: var(--background-dark-secondary);\n border-color: var(--border-dark);\n }\n\n .ts-category-card:hover,\n .ts-trigger-card:hover {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-5);\n }\n\n .ts-category-card--selected,\n .ts-trigger-card--selected {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-10);\n }\n\n .ts-trigger-icon {\n background: var(--background-dark-primary);\n color: var(--primary-light);\n }\n\n .ts-trigger-card--selected .ts-trigger-icon {\n background: var(--primary-light);\n }\n\n .ts-trigger-label {\n color: var(--text-dark-primary);\n }\n\n .ts-trigger-description {\n color: var(--text-dark-secondary);\n }\n\n .ts-trigger-check {\n color: var(--primary-light);\n }\n\n .ts-radio-option {\n border-color: var(--border-dark);\n }\n\n .ts-radio-option:hover {\n border-color: var(--primary-light);\n background: var(--primary-dark-alpha-5);\n }\n\n .ts-radio-option strong {\n color: var(--text-dark-primary);\n }\n\n .ts-radio-option small {\n color: var(--text-dark-secondary);\n }\n\n .ts-conditions-preview {\n background: var(--background-dark-secondary);\n border-left-color: var(--primary-light);\n }\n\n .ts-conditions-preview h4 {\n color: var(--text-dark-primary);\n }\n\n .ts-logic-preview {\n color: var(--text-dark-secondary);\n }\n\n .ts-logic-preview strong {\n color: var(--primary-light);\n }\n\n .ts-condition-list li {\n background: var(--background-dark-primary);\n }\n\n .ts-condition-list code {\n color: var(--primary-light);\n }\n\n .ts-condition-list em {\n color: var(--text-dark-tertiary);\n }\n\n .ts-preview-section {\n border-bottom-color: var(--border-dark);\n }\n\n .ts-preview-section h4 {\n color: var(--text-dark-primary);\n }\n\n .ts-preview-section p {\n color: var(--text-dark-secondary);\n }\n\n .ts-preview-section dt {\n color: var(--text-dark-tertiary);\n }\n\n .ts-preview-section dd {\n color: var(--text-dark-primary);\n }\n\n .ts-preview-section code {\n background: var(--background-dark-secondary);\n color: var(--primary-light);\n }\n\n .ts-no-conditions {\n color: var(--text-dark-tertiary);\n }\n\n .ts-builder-actions {\n background: var(--background-dark-secondary);\n border-top-color: var(--border-dark);\n }\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .ts-goal-builder-steps {\n flex-wrap: nowrap;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n\n .ts-step {\n min-width: 140px;\n }\n\n .ts-trigger-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 768px) {\n .ts-step-description {\n display: none;\n }\n\n .ts-category-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .ts-preview-section dl {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .ts-preview-section dt {\n font-weight: 700;\n }\n\n .ts-builder-actions {\n flex-direction: column;\n gap: 12px;\n }\n\n .ts-actions-left,\n .ts-actions-right {\n width: 100%;\n justify-content: space-between;\n }\n}\n\n/* Accessibility */\n@media (prefers-reduced-motion: reduce) {\n .ts-step-content {\n animation: none;\n }\n\n .ts-step,\n .ts-category-card,\n .ts-trigger-card,\n .ts-radio-option {\n transition: none;\n }\n}\n\n@media (prefers-contrast: high) {\n .ts-step--active {\n border-width: 3px;\n }\n\n .ts-category-card--selected,\n .ts-trigger-card--selected {\n border-width: 3px;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/components/CustomGoalBuilder.css"],names:[],mappings:"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",sourcesContent:['/**\r\n * Custom Goal Builder Styles\r\n * \r\n * Step-by-step wizard interface with clear visual hierarchy,\r\n * contextual help, and premium UI/UX\r\n * \r\n * @since 2.1.0\r\n * @package TrackSure\r\n */\r\n\r\n/* Main Container */\r\n.ts-custom-goal-builder {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 24px;\r\n min-height: 600px;\r\n}\r\n\r\n/* Step Indicator */\r\n.ts-goal-builder-steps {\r\n display: flex;\r\n gap: 12px;\r\n padding: 20px;\r\n background: var(--background-secondary);\r\n border-radius: 12px;\r\n overflow-x: auto;\r\n}\r\n\r\n.ts-step {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex: 1;\r\n min-width: 160px;\r\n padding: 12px 16px;\r\n background: var(--background-primary);\r\n border: 2px solid var(--border-color);\r\n border-radius: 8px;\r\n transition: all 0.3s ease;\r\n cursor: default;\r\n}\r\n\r\n.ts-step--active {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-step--completed {\r\n border-color: var(--success);\r\n background: var(--success-alpha-5);\r\n}\r\n\r\n.ts-step-number {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n background: var(--background-secondary);\r\n border-radius: 50%;\r\n font-size: 14px;\r\n font-weight: 700;\r\n color: var(--text-secondary);\r\n flex-shrink: 0;\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.ts-step--active .ts-step-number {\r\n background: var(--primary);\r\n color: white;\r\n}\r\n\r\n.ts-step--completed .ts-step-number {\r\n background: var(--success);\r\n color: white;\r\n}\r\n\r\n.ts-step-info {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-step-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 2px;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.ts-step-description {\r\n font-size: 11px;\r\n color: var(--text-tertiary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.ts-step--active .ts-step-title {\r\n color: var(--primary);\r\n}\r\n\r\n/* Builder Content */\r\n.ts-builder-content {\r\n flex: 1;\r\n overflow-y: auto;\r\n max-height: 500px;\r\n}\r\n\r\n.ts-step-content {\r\n animation: fadeIn 0.3s ease;\r\n}\r\n\r\n@keyframes fadeIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.ts-draft-notice {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 12px 16px;\r\n background: var(--info-alpha-10);\r\n border-left: 4px solid var(--info);\r\n border-radius: 6px;\r\n color: var(--info);\r\n font-size: 13px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n/* Section Intro */\r\n.ts-section-intro {\r\n font-size: 14px;\r\n color: var(--text-secondary);\r\n margin-bottom: 20px;\r\n line-height: 1.6;\r\n}\r\n\r\n/* Form Fields */\r\n.ts-form-field {\r\n margin-bottom: 24px;\r\n}\r\n\r\n.ts-form-field label {\r\n display: block;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 8px;\r\n}\r\n\r\n.ts-required {\r\n color: var(--danger);\r\n margin-left: 2px;\r\n}\r\n\r\n.ts-optional {\r\n font-weight: 400;\r\n color: var(--text-tertiary);\r\n font-size: 12px;\r\n}\r\n\r\n.ts-form-field input[type="text"],\r\n.ts-form-field input[type="number"],\r\n.ts-form-field textarea,\r\n.ts-form-field select {\r\n width: 100%;\r\n padding: 10px 14px;\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n background: var(--background-primary);\r\n color: var(--text-primary);\r\n font-size: 14px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-form-field input:focus,\r\n.ts-form-field textarea:focus,\r\n.ts-form-field select:focus {\r\n outline: none;\r\n border-color: var(--primary);\r\n box-shadow: 0 0 0 3px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-input-error {\r\n border-color: var(--danger) !important;\r\n}\r\n\r\n.ts-error-message {\r\n display: block;\r\n margin-top: 6px;\r\n font-size: 12px;\r\n color: var(--danger);\r\n}\r\n\r\n.ts-field-help {\r\n margin-top: 6px;\r\n font-size: 12px;\r\n color: var(--text-tertiary);\r\n line-height: 1.5;\r\n}\r\n\r\n/* Category Grid */\r\n.ts-category-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\r\n gap: 12px;\r\n}\r\n\r\n.ts-category-card {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 20px 16px;\r\n background: var(--background-secondary);\r\n border: 2px solid var(--border-color);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n text-align: center;\r\n}\r\n\r\n.ts-category-card:hover {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 12px var(--shadow-color);\r\n}\r\n\r\n.ts-category-card--selected {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-10);\r\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-category-card span {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n}\r\n\r\n/* Trigger Grid */\r\n.ts-trigger-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n gap: 12px;\r\n}\r\n\r\n.ts-trigger-card {\r\n position: relative;\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 16px;\r\n padding: 16px;\r\n background: var(--background-secondary);\r\n border: 2px solid var(--border-color);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n text-align: left;\r\n}\r\n\r\n.ts-trigger-card:hover {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n box-shadow: 0 4px 12px var(--shadow-color);\r\n}\r\n\r\n.ts-trigger-card--selected {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-10);\r\n box-shadow: 0 0 0 4px var(--primary-alpha-10);\r\n}\r\n\r\n.ts-trigger-icon {\r\n flex-shrink: 0;\r\n width: 48px;\r\n height: 48px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--background-primary);\r\n border-radius: 8px;\r\n color: var(--primary);\r\n}\r\n\r\n.ts-trigger-card--selected .ts-trigger-icon {\r\n background: var(--primary);\r\n color: white;\r\n}\r\n\r\n.ts-trigger-info {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-trigger-label {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 4px;\r\n}\r\n\r\n.ts-trigger-description {\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n line-height: 1.4;\r\n}\r\n\r\n.ts-trigger-check {\r\n position: absolute;\r\n top: 12px;\r\n right: 12px;\r\n color: var(--primary);\r\n}\r\n\r\n/* Radio Options */\r\n.ts-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.ts-radio-option {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n padding: 12px;\r\n border: 1px solid var(--border-color);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-radio-option:hover {\r\n border-color: var(--primary);\r\n background: var(--primary-alpha-5);\r\n}\r\n\r\n.ts-radio-option input[type="radio"] {\r\n margin-top: 2px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-radio-option span {\r\n flex: 1;\r\n}\r\n\r\n.ts-radio-option strong {\r\n display: block;\r\n font-size: 14px;\r\n color: var(--text-primary);\r\n margin-bottom: 4px;\r\n}\r\n\r\n.ts-radio-option small {\r\n display: block;\r\n font-size: 12px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-value-input {\r\n margin-top: 12px;\r\n padding-left: 24px;\r\n}\r\n\r\n.ts-value-input input[type="number"] {\r\n max-width: 200px;\r\n}\r\n\r\n/* Conditions Preview */\r\n.ts-conditions-preview {\r\n margin-top: 24px;\r\n padding: 16px;\r\n background: var(--background-secondary);\r\n border-left: 4px solid var(--primary);\r\n border-radius: 6px;\r\n}\r\n\r\n.ts-conditions-preview h4 {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-logic-preview {\r\n font-size: 13px;\r\n color: var(--text-secondary);\r\n}\r\n\r\n.ts-logic-preview p {\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-logic-preview strong {\r\n color: var(--primary);\r\n font-weight: 700;\r\n}\r\n\r\n.ts-condition-list {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.ts-condition-list li {\r\n padding: 8px 12px;\r\n background: var(--background-primary);\r\n border-radius: 4px;\r\n margin-bottom: 6px;\r\n font-size: 12px;\r\n font-family: \'Courier New\', monospace;\r\n}\r\n\r\n.ts-condition-list code {\r\n color: var(--primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-condition-list em {\r\n color: var(--text-tertiary);\r\n font-style: normal;\r\n margin: 0 6px;\r\n}\r\n\r\n/* Goal Preview */\r\n.ts-goal-preview {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 24px;\r\n}\r\n\r\n.ts-preview-section {\r\n padding-bottom: 20px;\r\n border-bottom: 1px solid var(--border-color);\r\n}\r\n\r\n.ts-preview-section:last-child {\r\n border-bottom: none;\r\n padding-bottom: 0;\r\n}\r\n\r\n.ts-preview-section h4 {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--text-primary);\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-preview-section p {\r\n font-size: 13px;\r\n color: var(--text-secondary);\r\n margin-bottom: 12px;\r\n}\r\n\r\n.ts-preview-section dl {\r\n display: grid;\r\n grid-template-columns: 140px 1fr;\r\n gap: 12px 16px;\r\n margin: 0;\r\n}\r\n\r\n.ts-preview-section dt {\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--text-tertiary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.ts-preview-section dd {\r\n font-size: 14px;\r\n color: var(--text-primary);\r\n margin: 0;\r\n}\r\n\r\n.ts-preview-section code {\r\n padding: 2px 6px;\r\n background: var(--background-secondary);\r\n border-radius: 3px;\r\n font-size: 12px;\r\n color: var(--primary);\r\n font-family: \'Courier New\', monospace;\r\n}\r\n\r\n.ts-no-conditions {\r\n font-style: italic;\r\n color: var(--text-tertiary);\r\n}\r\n\r\n/* Builder Actions */\r\n.ts-builder-actions {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 16px;\r\n padding: 16px 20px;\r\n background: var(--background-secondary);\r\n border-top: 1px solid var(--border-color);\r\n border-radius: 0 0 12px 12px;\r\n margin: 0 -24px -24px;\r\n}\r\n\r\n.ts-actions-left,\r\n.ts-actions-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme="dark"] {\r\n .ts-goal-builder-steps {\r\n background: var(--background-dark-secondary);\r\n }\r\n\r\n .ts-step {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-step--active {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-10);\r\n }\r\n\r\n .ts-step--completed {\r\n border-color: var(--success-light);\r\n background: var(--success-dark-alpha-10);\r\n }\r\n\r\n .ts-step-number {\r\n background: var(--background-dark-secondary);\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-step--active .ts-step-number {\r\n background: var(--primary-light);\r\n }\r\n\r\n .ts-step--completed .ts-step-number {\r\n background: var(--success-light);\r\n }\r\n\r\n .ts-step-title {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-step-description {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-step--active .ts-step-title {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-draft-notice {\r\n background: var(--info-dark-alpha-10);\r\n border-left-color: var(--info-light);\r\n color: var(--info-light);\r\n }\r\n\r\n .ts-section-intro {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-form-field label {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-form-field input,\r\n .ts-form-field textarea,\r\n .ts-form-field select {\r\n background: var(--background-dark-primary);\r\n border-color: var(--border-dark);\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-field-help {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-category-card,\r\n .ts-trigger-card {\r\n background: var(--background-dark-secondary);\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-category-card:hover,\r\n .ts-trigger-card:hover {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-5);\r\n }\r\n\r\n .ts-category-card--selected,\r\n .ts-trigger-card--selected {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-10);\r\n }\r\n\r\n .ts-trigger-icon {\r\n background: var(--background-dark-primary);\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-trigger-card--selected .ts-trigger-icon {\r\n background: var(--primary-light);\r\n }\r\n\r\n .ts-trigger-label {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-trigger-description {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-trigger-check {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-radio-option {\r\n border-color: var(--border-dark);\r\n }\r\n\r\n .ts-radio-option:hover {\r\n border-color: var(--primary-light);\r\n background: var(--primary-dark-alpha-5);\r\n }\r\n\r\n .ts-radio-option strong {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-radio-option small {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-conditions-preview {\r\n background: var(--background-dark-secondary);\r\n border-left-color: var(--primary-light);\r\n }\r\n\r\n .ts-conditions-preview h4 {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-logic-preview {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-logic-preview strong {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-condition-list li {\r\n background: var(--background-dark-primary);\r\n }\r\n\r\n .ts-condition-list code {\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-condition-list em {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-preview-section {\r\n border-bottom-color: var(--border-dark);\r\n }\r\n\r\n .ts-preview-section h4 {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-preview-section p {\r\n color: var(--text-dark-secondary);\r\n }\r\n\r\n .ts-preview-section dt {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-preview-section dd {\r\n color: var(--text-dark-primary);\r\n }\r\n\r\n .ts-preview-section code {\r\n background: var(--background-dark-secondary);\r\n color: var(--primary-light);\r\n }\r\n\r\n .ts-no-conditions {\r\n color: var(--text-dark-tertiary);\r\n }\r\n\r\n .ts-builder-actions {\r\n background: var(--background-dark-secondary);\r\n border-top-color: var(--border-dark);\r\n }\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 1024px) {\r\n .ts-goal-builder-steps {\r\n flex-wrap: nowrap;\r\n overflow-x: auto;\r\n -webkit-overflow-scrolling: touch;\r\n }\r\n\r\n .ts-step {\r\n min-width: 140px;\r\n }\r\n\r\n .ts-trigger-grid {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .ts-step-description {\r\n display: none;\r\n }\r\n\r\n .ts-category-grid {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n\r\n .ts-preview-section dl {\r\n grid-template-columns: 1fr;\r\n gap: 8px;\r\n }\r\n\r\n .ts-preview-section dt {\r\n font-weight: 700;\r\n }\r\n\r\n .ts-builder-actions {\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n\r\n .ts-actions-left,\r\n .ts-actions-right {\r\n width: 100%;\r\n justify-content: space-between;\r\n }\r\n}\r\n\r\n/* Accessibility */\r\n@media (prefers-reduced-motion: reduce) {\r\n .ts-step-content {\r\n animation: none;\r\n }\r\n\r\n .ts-step,\r\n .ts-category-card,\r\n .ts-trigger-card,\r\n .ts-radio-option {\r\n transition: none;\r\n }\r\n}\r\n\r\n@media (prefers-contrast: high) {\r\n .ts-step--active {\r\n border-width: 3px;\r\n }\r\n\r\n .ts-category-card--selected,\r\n .ts-trigger-card--selected {\r\n border-width: 3px;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},76840:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Goals Page - Modern, User-Friendly Design\n * Features: CSS Variables, Dark Mode Support, Smooth Animations\n * Now using global CSS variables for consistent theming\n */\n\n/* ========================================\n Page Container\n\n ======================================== */\n.ts-goals-page {\n padding: var(--ts-spacing-lg);\n background: var(--ts-bg);\n min-height: 100vh;\n}\n\n/* ========================================\n Page Header\n ======================================== */\n.ts-page-header {\n margin-bottom: var(--ts-spacing-xl);\n}\n\n.ts-page-title {\n font-size: 28px;\n font-weight: 700;\n color: var(--ts-text);\n margin: 0 0 8px 0;\n letter-spacing: -0.025em;\n}\n\n.ts-page-description {\n font-size: 15px;\n color: var(--ts-text-muted);\n margin: 0;\n line-height: 1.6;\n}\n\n/* ========================================\n Tab Navigation\n ======================================== */\n.ts-goals-tabs {\n display: flex;\n gap: var(--ts-spacing-xs);\n margin-bottom: var(--ts-spacing-lg);\n border-bottom: 1px solid var(--ts-border);\n padding: 0;\n}\n\n.ts-goals-tab {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs);\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n color: var(--ts-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n top: 1px;\n}\n\n.ts-goals-tab:hover {\n color: var(--ts-text);\n background: var(--ts-surface-hover);\n}\n\n.ts-goals-tab--active {\n color: var(--ts-primary);\n border-bottom-color: var(--ts-primary);\n font-weight: 600;\n}\n\n.ts-goals-tab--active:hover {\n background: transparent;\n}\n\n[data-theme="dark"] .ts-goals-tab:hover {\n background: var(--ts-surface-hover-dark);\n}\n\n/* ========================================\n Goals Grid\n ======================================== */\n\n/* Summary Cards - Row Layout */\n.ts-goals-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: var(--ts-spacing-md);\n margin-bottom: var(--ts-spacing-xl);\n}\n\n.ts-goals-summary-row {\n display: flex;\n flex-direction: row;\n gap: var(--ts-spacing-md);\n margin-bottom: var(--ts-spacing-xl);\n flex-wrap: wrap;\n}\n\n.ts-goals-summary-row > * {\n flex: 1;\n min-width: 200px;\n}\n\n.ts-goals-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));\n gap: var(--ts-spacing-lg);\n margin-top: var(--ts-spacing-lg);\n}\n\n/* ========================================\n Goal Card\n ======================================== */\n.ts-goal-card {\n background: var(--ts-surface);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-lg);\n padding: var(--ts-spacing-lg);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.ts-goal-card::before {\n content: \'\';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: linear-gradient(90deg, var(--ts-primary), var(--ts-success));\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.ts-goal-card:hover {\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08);\n transform: translateY(-3px);\n border-color: var(--ts-primary);\n}\n\n.ts-goal-card:hover::before {\n opacity: 1;\n}\n\n.ts-goal-card-selected {\n border-color: var(--ts-primary);\n background: var(--ts-surface-hover);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n/* Goal Checkbox - Inline with header */\n.ts-goal-checkbox {\n position: absolute;\n top: var(--ts-spacing-lg);\n left: var(--ts-spacing-lg);\n z-index: 1;\n}\n\n.ts-goal-checkbox input[type="checkbox"] {\n margin: 0;\n cursor: pointer;\n width: 18px;\n height: 18px;\n accent-color: var(--ts-primary);\n}\n\n/* Goal Header */\n.ts-goal-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: var(--ts-spacing-md);\n gap: var(--ts-spacing-md);\n padding-left: 30px; /* Space for absolute checkbox */\n}\n\n.ts-goal-title-section {\n flex: 1;\n min-width: 0;\n}\n\n.ts-goal-title-row {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm);\n flex-wrap: wrap;\n}\n\n.ts-goal-name {\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0;\n line-height: 1.4;\n}\n\n.ts-goal-description {\n font-size: 14px;\n color: var(--ts-text-muted);\n margin: 6px 0 0 0;\n line-height: 1.5;\n display: -webkit-box;\n line-clamp: 2;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Goal Actions */\n.ts-goal-actions {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs);\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.ts-goal-status {\n font-size: 12px;\n font-weight: 600;\n padding: 6px 12px;\n border-radius: var(--ts-radius-full);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n transition: all 0.2s ease;\n}\n\n.ts-goal-status.ts-active {\n background: var(--ts-success-soft);\n color: var(--ts-success);\n border: 1px solid var(--ts-success);\n}\n\n.ts-goal-status.ts-inactive {\n background: var(--ts-danger-soft);\n color: var(--ts-danger);\n border: 1px solid var(--ts-danger);\n}\n\n.ts-btn-icon {\n background: var(--ts-surface-hover);\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n color: var(--ts-text-muted);\n transition: all 0.2s ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n}\n\n.ts-btn-icon:hover {\n background: var(--ts-primary-soft);\n color: var(--ts-primary);\n border-color: var(--ts-primary);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.ts-btn-icon.ts-btn-danger:hover {\n background: var(--ts-danger-soft);\n color: var(--ts-danger);\n border-color: var(--ts-danger);\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.2);\n}\n\n/* Goal Details */\n.ts-goal-details {\n margin-bottom: var(--ts-spacing-md);\n}\n\n.ts-goal-meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ts-spacing-sm);\n}\n\n.ts-goal-event,\n.ts-goal-conditions {\n font-size: 13px;\n color: var(--ts-text);\n background: var(--ts-bg-tertiary);\n padding: 6px 12px;\n border-radius: var(--ts-radius-md);\n border: 1px solid var(--ts-border);\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n.ts-goal-event:hover,\n.ts-goal-conditions:hover {\n background: var(--ts-primary-soft);\n border-color: var(--ts-primary);\n color: var(--ts-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n}\n\n/* Goal Performance */\n.ts-goal-performance {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: var(--ts-spacing-md);\n padding-top: var(--ts-spacing-md);\n border-top: 1px solid var(--ts-border);\n margin-top: auto;\n}\n\n.ts-goal-stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ts-goal-stat-label {\n font-size: 11px;\n color: var(--ts-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.8px;\n font-weight: 600;\n}\n\n.ts-goal-stat-value {\n font-size: 24px;\n font-weight: 700;\n color: var(--ts-text);\n line-height: 1;\n}\n\n/* View Details Button */\n.ts-goal-view-details {\n width: 100%;\n margin-top: var(--ts-spacing-md);\n padding: var(--ts-spacing-sm) var(--ts-spacing-md);\n background: var(--ts-primary-soft);\n border: 1px solid var(--ts-primary);\n color: var(--ts-primary);\n border-radius: var(--ts-radius-md);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ts-spacing-xs);\n position: relative;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.ts-goal-view-details svg {\n flex-shrink: 0;\n}\n\n.ts-goal-view-details::before {\n content: \'\';\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);\n transition: left 0.5s ease;\n}\n\n.ts-goal-view-details:hover::before {\n left: 100%;\n}\n\n.ts-goal-view-details:hover {\n background: var(--ts-primary);\n color: var(--ts-bg-elevated);\n transform: translateY(-1px);\n box-shadow: var(--ts-shadow-md);\n}\n\n/* ========================================\n Empty State\n ======================================== */\n.ts-empty-state {\n text-align: center;\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\n background: var(--ts-surface);\n border: 2px dashed var(--ts-border);\n border-radius: var(--ts-radius-lg);\n margin-top: var(--ts-spacing-lg);\n}\n\n.ts-empty-icon {\n font-size: 64px;\n margin-bottom: var(--ts-spacing-md);\n opacity: 0.5;\n}\n\n.ts-empty-state h2 {\n font-size: 22px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0 0 8px 0;\n}\n\n.ts-empty-state p {\n font-size: 15px;\n color: var(--ts-text-muted);\n margin: 0 0 var(--ts-spacing-lg) 0;\n line-height: 1.6;\n}\n\n/* ========================================\n Error Banner\n ======================================== */\n.ts-error-banner {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-md);\n background: var(--ts-danger-soft);\n border: 1px solid var(--ts-danger);\n border-radius: var(--ts-radius-lg);\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\n margin-bottom: var(--ts-spacing-lg);\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.15);\n}\n\n.ts-error-banner span {\n font-size: 24px;\n flex-shrink: 0;\n color: var(--ts-danger);\n}\n\n.ts-error-banner p {\n margin: 0;\n color: var(--ts-danger);\n font-size: 14px;\n font-weight: 500;\n line-height: 1.5;\n}\n\n/* ========================================\n Modal\n ======================================== */\n.ts-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.65);\n backdrop-filter: blur(8px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.ts-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: var(--ts-spacing-lg);\n border-bottom: 1px solid var(--ts-border);\n background: var(--ts-surface-hover);\n}\n\n.ts-modal-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--ts-text);\n}\n\n.ts-modal-close {\n background: transparent;\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: var(--ts-text-muted);\n padding: 8px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--ts-radius-md);\n transition: all 0.2s ease;\n}\n\n.ts-modal-close:hover {\n background: var(--ts-danger-soft);\n color: var(--ts-danger);\n transform: rotate(90deg);\n}\n\n.ts-modal-body {\n padding: var(--ts-spacing-lg);\n overflow-y: auto;\n flex: 1;\n}\n\n.ts-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--ts-spacing-sm);\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\n border-top: 1px solid var(--ts-border);\n background: var(--ts-surface-hover);\n}\n\n/* ========================================\n Form Fields\n ======================================== */\n.ts-form-field {\n margin-bottom: var(--ts-spacing-lg);\n}\n\n.ts-form-field label {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--ts-text);\n margin-bottom: 8px;\n}\n\n.ts-field-help {\n font-size: 13px;\n color: var(--ts-text-muted);\n margin: 4px 0 0 0;\n line-height: 1.5;\n}\n\n.ts-form-field input[type="text"],\n.ts-form-field textarea,\n.ts-form-field select {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--ts-border);\n border-radius: var(--ts-radius-md);\n font-size: 14px;\n color: var(--ts-text);\n background: var(--ts-surface);\n transition: all 0.2s ease;\n}\n\n.ts-form-field input[type="text"]:focus,\n.ts-form-field textarea:focus,\n.ts-form-field select:focus {\n outline: none;\n border-color: var(--ts-primary);\n box-shadow: 0 0 0 3px var(--ts-primary-soft);\n}\n\n.ts-form-field textarea {\n resize: vertical;\n min-height: 100px;\n font-family: inherit;\n line-height: 1.6;\n}\n\n/* ========================================\n Condition Rows\n ======================================== */\n.ts-condition-row {\n display: flex;\n gap: var(--ts-spacing-sm);\n margin-bottom: var(--ts-spacing-sm);\n align-items: flex-start;\n}\n\n.ts-condition-param,\n.ts-condition-operator,\n.ts-condition-value {\n flex: 1;\n}\n\n.ts-condition-row .ts-btn-icon {\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n/* ========================================\n Checkbox\n ======================================== */\n.ts-checkbox-label {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm);\n cursor: pointer;\n font-weight: normal !important;\n padding: var(--ts-spacing-sm);\n border-radius: var(--ts-radius-md);\n transition: background 0.2s ease;\n}\n\n.ts-checkbox-label:hover {\n background: var(--ts-surface-hover);\n}\n\n.ts-checkbox-label input[type="checkbox"] {\n width: 20px;\n height: 20px;\n cursor: pointer;\n accent-color: var(--ts-primary);\n}\n\n.ts-checkbox-label span {\n font-size: 14px;\n color: var(--ts-text);\n line-height: 1.5;\n}\n\n/* ========================================\n Buttons\n ======================================== */\n.ts-btn {\n padding: 10px 20px;\n border: none;\n border-radius: var(--ts-radius-md);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ts-spacing-sm);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.ts-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none !important;\n}\n\n.ts-btn-primary {\n background: var(--ts-primary);\n color: var(--ts-bg-elevated);\n}\n\n.ts-btn-primary:hover:not(:disabled) {\n background: var(--ts-primary-hover);\n box-shadow: var(--ts-shadow-md);\n transform: translateY(-1px);\n}\n\n.ts-btn-primary:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: var(--ts-shadow-sm);\n}\n\n.ts-btn-secondary {\n background: var(--ts-surface-hover);\n color: var(--ts-text);\n border: 1px solid var(--ts-border);\n}\n\n.ts-btn-secondary:hover:not(:disabled) {\n background: var(--ts-bg-tertiary);\n border-color: var(--ts-text-muted);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n.ts-btn-sm {\n padding: 6px 14px;\n font-size: 13px;\n}\n\n/* ========================================\n Loading State\n ======================================== */\n.ts-loading-state {\n text-align: center;\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\n}\n\n.ts-spinner {\n width: 48px;\n height: 48px;\n border: 4px solid var(--ts-border);\n border-top-color: var(--ts-primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin: 0 auto var(--ts-spacing-md);\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.ts-loading-state p {\n color: var(--ts-text-muted);\n font-size: 15px;\n font-weight: 500;\n}\n\n/* ========================================\n Templates Grid\n ======================================== */\n.ts-templates-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: var(--ts-spacing-lg);\n margin-top: var(--ts-spacing-lg);\n}\n\n.ts-template-card {\n display: flex;\n flex-direction: column;\n}\n\n.ts-template-card .ts-card-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n}\n\n.ts-template-icon {\n font-size: 48px;\n margin-bottom: var(--ts-spacing-md);\n text-align: center;\n}\n\n.ts-template-name {\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text);\n margin: 0 0 8px 0;\n line-height: 1.4;\n}\n\n.ts-template-description {\n font-size: 14px;\n color: var(--ts-text-muted);\n margin: 0 0 var(--ts-spacing-md) 0;\n line-height: 1.6;\n flex: 1;\n}\n\n.ts-template-meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ts-spacing-sm);\n margin-bottom: var(--ts-spacing-md);\n padding-top: var(--ts-spacing-md);\n border-top: 1px solid var(--ts-border);\n}\n\n.ts-template-add-btn {\n margin-top: auto;\n}\n\n/* ========================================\n Responsive Design\n ======================================== */\n\n/* Tablet and below */\n@media (max-width: 768px) {\n .ts-goals-page {\n padding: var(--ts-spacing-md);\n }\n\n .ts-templates-grid {\n grid-template-columns: 1fr;\n gap: var(--ts-spacing-md);\n }\n\n .ts-goal-card {\n padding: var(--ts-spacing-md);\n }\n\n .ts-goal-header {\n flex-direction: column;\n gap: var(--ts-spacing-sm);\n padding-left: 30px;\n }\n\n .ts-goal-actions {\n flex-wrap: wrap;\n }\n\n .ts-goal-performance {\n grid-template-columns: 1fr 1fr;\n gap: var(--ts-spacing-sm);\n }\n\n .ts-goal-stat-value {\n font-size: 18px;\n }\n\n .ts-condition-row {\n flex-direction: column;\n }\n\n .ts-modal {\n width: 95%;\n max-height: 95vh;\n }\n\n .ts-modal-footer {\n flex-direction: column;\n }\n\n .ts-modal-footer .ts-btn {\n width: 100%;\n }\n}\n\n/* Small mobile */\n@media (max-width: 480px) {\n .ts-goal-performance {\n grid-template-columns: 1fr;\n }\n \n .ts-goal-header {\n padding-left: 28px;\n }\n \n .ts-goal-name {\n font-size: 15px;\n }\n}\n\n/* ========================================\n Dark Theme Support\n ======================================== */\n[data-theme="dark"] .ts-goals-page {\n background: var(--ts-bg-dark, #0f1419);\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-goal-card,\n[data-theme="dark"] .ts-template-card,\n[data-theme="dark"] .ts-modal-content,\n[data-theme="dark"] .ts-card {\n background: var(--ts-surface-dark, #1a1f26);\n border-color: var(--ts-border-dark, #2d3748);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);\n}\n\n[data-theme="dark"] .ts-goal-card:hover,\n[data-theme="dark"] .ts-template-card:hover {\n border-color: var(--ts-primary);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--ts-primary);\n}\n\n[data-theme="dark"] .ts-page-title,\n[data-theme="dark"] .ts-goal-title,\n[data-theme="dark"] .ts-template-title,\n[data-theme="dark"] .ts-modal-title {\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-page-description,\n[data-theme="dark"] .ts-goal-description,\n[data-theme="dark"] .ts-template-description,\n[data-theme="dark"] .ts-text-muted {\n color: var(--ts-text-muted-dark, #9ca3af);\n}\n\n[data-theme="dark"] .ts-kpi-value,\n[data-theme="dark"] .ts-perf-value {\n color: var(--ts-text-dark, #ffffff);\n}\n\n[data-theme="dark"] .ts-kpi-label,\n[data-theme="dark"] .ts-perf-label {\n color: var(--ts-text-muted-dark, #9ca3af);\n}\n\n[data-theme="dark"] .ts-btn-outline {\n border-color: var(--ts-border-dark, #2d3748);\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-btn-outline:hover {\n background: var(--ts-surface-dark, #2d3748);\n border-color: var(--ts-primary);\n}\n\n[data-theme="dark"] .ts-btn-danger-outline {\n border-color: var(--ts-danger);\n color: var(--ts-danger);\n}\n\n[data-theme="dark"] .ts-btn-danger-outline:hover {\n background: var(--ts-danger);\n color: #ffffff;\n}\n\n[data-theme="dark"] .ts-input,\n[data-theme="dark"] .ts-select,\n[data-theme="dark"] .ts-textarea {\n background: var(--ts-surface-dark, #0f1419);\n border-color: var(--ts-border-dark, #2d3748);\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-input:focus,\n[data-theme="dark"] .ts-select:focus,\n[data-theme="dark"] .ts-textarea:focus {\n border-color: var(--ts-primary);\n background: var(--ts-surface-dark, #1a1f26);\n}\n\n[data-theme="dark"] .ts-badge {\n background: rgba(59, 130, 246, 0.15);\n color: #60a5fa;\n}\n\n[data-theme="dark"] .ts-badge-success {\n background: rgba(16, 185, 129, 0.15);\n color: #34d399;\n}\n\n[data-theme="dark"] .ts-badge-warning {\n background: rgba(245, 158, 11, 0.15);\n color: #fbbf24;\n}\n\n[data-theme="dark"] .ts-badge-danger {\n background: rgba(239, 68, 68, 0.15);\n color: #f87171;\n}\n\n[data-theme="dark"] .ts-divider {\n border-color: var(--ts-border-dark, #2d3748);\n}\n\n[data-theme="dark"] .ts-goal-status-inactive {\n background: rgba(156, 163, 175, 0.1);\n color: #9ca3af;\n}\n\n[data-theme="dark"] .ts-empty-state {\n color: var(--ts-text-muted-dark, #9ca3af);\n}\n\n[data-theme="dark"] .ts-empty-state-title {\n color: var(--ts-text-dark, #e8eaed);\n}\n\n[data-theme="dark"] .ts-condition-row {\n background: var(--ts-bg-dark, #0f1419);\n border-color: var(--ts-border-dark, #2d3748);\n}\n\n[data-theme="dark"] .ts-template-category {\n color: var(--ts-text-muted-dark, #9ca3af);\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.05em;\n}\n\n[data-theme="dark"] .ts-modal-overlay {\n background: rgba(0, 0, 0, 0.85);\n}\n\n[data-theme="dark"] .ts-skeleton {\n background: linear-gradient(\n 90deg,\n var(--ts-surface-dark, #1a1f26) 0%,\n var(--ts-border-dark, #2d3748) 50%,\n var(--ts-surface-dark, #1a1f26) 100%\n );\n background-size: 200% 100%;\n}\n\n/* Performance skeleton loading state */\n.ts-goal-performance--loading {\n opacity: 0.6;\n}\n\n.ts-goal-performance--loading .ts-skeleton--sm {\n display: inline-block;\n width: 48px;\n height: 14px;\n border-radius: 4px;\n}\n',"",{version:3,sources:["webpack://./src/styles/pages/GoalsPage.css"],names:[],mappings:"AAAA;;;;EAIE;;AAEF;;;6CAG6C;AAC7C;EACE,6BAA6B;EAC7B,wBAAwB;EACxB,iBAAiB;AACnB;;AAEA;;6CAE6C;AAC7C;EACE,mCAAmC;AACrC;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,iBAAiB;EACjB,wBAAwB;AAC1B;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,SAAS;EACT,gBAAgB;AAClB;;AAEA;;6CAE6C;AAC7C;EACE,aAAa;EACb,yBAAyB;EACzB,mCAAmC;EACnC,yCAAyC;EACzC,UAAU;AACZ;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,kDAAkD;EAClD,uBAAuB;EACvB,YAAY;EACZ,oCAAoC;EACpC,2BAA2B;EAC3B,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,yBAAyB;EACzB,kBAAkB;EAClB,QAAQ;AACV;;AAEA;EACE,qBAAqB;EACrB,mCAAmC;AACrC;;AAEA;EACE,wBAAwB;EACxB,sCAAsC;EACtC,gBAAgB;AAClB;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,wCAAwC;AAC1C;;AAEA;;6CAE6C;;AAE7C,+BAA+B;AAC/B;EACE,aAAa;EACb,2DAA2D;EAC3D,yBAAyB;EACzB,mCAAmC;AACrC;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,mCAAmC;EACnC,eAAe;AACjB;;AAEA;EACE,OAAO;EACP,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sEAAsE;EACtE,yBAAyB;EACzB,gCAAgC;AAClC;;AAEA;;6CAE6C;AAC7C;EACE,6BAA6B;EAC7B,kCAAkC;EAClC,kCAAkC;EAClC,6BAA6B;EAC7B,iDAAiD;EACjD,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,MAAM;AACR;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,MAAM;EACN,OAAO;EACP,QAAQ;EACR,WAAW;EACX,wEAAwE;EACxE,UAAU;EACV,6BAA6B;AAC/B;;AAEA;EACE,0EAA0E;EAC1E,2BAA2B;EAC3B,+BAA+B;AACjC;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,+BAA+B;EAC/B,mCAAmC;EACnC,4CAA4C;AAC9C;;AAEA,uCAAuC;AACvC;EACE,kBAAkB;EAClB,yBAAyB;EACzB,0BAA0B;EAC1B,UAAU;AACZ;;AAEA;EACE,SAAS;EACT,eAAe;EACf,WAAW;EACX,YAAY;EACZ,+BAA+B;AACjC;;AAEA,gBAAgB;AAChB;EACE,aAAa;EACb,8BAA8B;EAC9B,uBAAuB;EACvB,mCAAmC;EACnC,yBAAyB;EACzB,kBAAkB,EAAE,gCAAgC;AACtD;;AAEA;EACE,OAAO;EACP,YAAY;AACd;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,eAAe;AACjB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,SAAS;EACT,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,iBAAiB;EACjB,gBAAgB;EAChB,oBAAoB;EACpB,aAAa;EACb,qBAAqB;EACrB,4BAA4B;EAC5B,gBAAgB;AAClB;;AAEA,iBAAiB;AACjB;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,oCAAoC;EACpC,yBAAyB;EACzB,qBAAqB;EACrB,yBAAyB;AAC3B;;AAEA;EACE,kCAAkC;EAClC,wBAAwB;EACxB,mCAAmC;AACrC;;AAEA;EACE,iCAAiC;EACjC,uBAAuB;EACvB,kCAAkC;AACpC;;AAEA;EACE,mCAAmC;EACnC,kCAAkC;EAClC,kCAAkC;EAClC,eAAe;EACf,eAAe;EACf,YAAY;EACZ,2BAA2B;EAC3B,yBAAyB;EACzB,oBAAoB;EACpB,mBAAmB;EACnB,uBAAuB;EACvB,WAAW;EACX,YAAY;AACd;;AAEA;EACE,kCAAkC;EAClC,wBAAwB;EACxB,+BAA+B;EAC/B,wCAAwC;AAC1C;;AAEA;EACE,iCAAiC;EACjC,uBAAuB;EACvB,8BAA8B;EAC9B,4CAA4C;AAC9C;;AAEA,iBAAiB;AACjB;EACE,mCAAmC;AACrC;;AAEA;EACE,aAAa;EACb,eAAe;EACf,yBAAyB;AAC3B;;AAEA;;EAEE,eAAe;EACf,qBAAqB;EACrB,iCAAiC;EACjC,iBAAiB;EACjB,kCAAkC;EAClC,kCAAkC;EAClC,gBAAgB;EAChB,yBAAyB;AAC3B;;AAEA;;EAEE,kCAAkC;EAClC,+BAA+B;EAC/B,wBAAwB;EACxB,2BAA2B;EAC3B,yCAAyC;AAC3C;;AAEA,qBAAqB;AACrB;EACE,aAAa;EACb,qCAAqC;EACrC,yBAAyB;EACzB,iCAAiC;EACjC,sCAAsC;EACtC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,yBAAyB;EACzB,qBAAqB;EACrB,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,cAAc;AAChB;;AAEA,wBAAwB;AACxB;EACE,WAAW;EACX,gCAAgC;EAChC,kDAAkD;EAClD,kCAAkC;EAClC,mCAAmC;EACnC,wBAAwB;EACxB,kCAAkC;EAClC,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,iDAAiD;EACjD,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,yBAAyB;EACzB,kBAAkB;EAClB,mBAAmB;EACnB,gBAAgB;AAClB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,MAAM;EACN,WAAW;EACX,WAAW;EACX,YAAY;EACZ,sFAAsF;EACtF,0BAA0B;AAC5B;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,6BAA6B;EAC7B,4BAA4B;EAC5B,2BAA2B;EAC3B,+BAA+B;AACjC;;AAEA;;6CAE6C;AAC7C;EACE,kBAAkB;EAClB,kDAAkD;EAClD,6BAA6B;EAC7B,mCAAmC;EACnC,kCAAkC;EAClC,gCAAgC;AAClC;;AAEA;EACE,eAAe;EACf,mCAAmC;EACnC,YAAY;AACd;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,kCAAkC;EAClC,gBAAgB;AAClB;;AAEA;;6CAE6C;AAC7C;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,iCAAiC;EACjC,kCAAkC;EAClC,kCAAkC;EAClC,kDAAkD;EAClD,mCAAmC;EACnC,8CAA8C;AAChD;;AAEA;EACE,eAAe;EACf,cAAc;EACd,uBAAuB;AACzB;;AAEA;EACE,SAAS;EACT,uBAAuB;EACvB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;;6CAE6C;AAC7C;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAS;EACT,+BAA+B;EAC/B,0BAA0B;EAC1B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,cAAc;EACd,oDAAoD;AACtD;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;;;AAIA;EACE;IACE,UAAU;IACV,2BAA2B;EAC7B;EACA;IACE,UAAU;IACV,wBAAwB;EAC1B;AACF;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,6BAA6B;EAC7B,yCAAyC;EACzC,mCAAmC;AACrC;;AAEA;EACE,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,qBAAqB;AACvB;;AAEA;EACE,uBAAuB;EACvB,YAAY;EACZ,eAAe;EACf,eAAe;EACf,2BAA2B;EAC3B,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,kCAAkC;EAClC,yBAAyB;AAC3B;;AAEA;EACE,iCAAiC;EACjC,uBAAuB;EACvB,wBAAwB;AAC1B;;AAEA;EACE,6BAA6B;EAC7B,gBAAgB;EAChB,OAAO;AACT;;AAEA;EACE,aAAa;EACb,yBAAyB;EACzB,yBAAyB;EACzB,kDAAkD;EAClD,sCAAsC;EACtC,mCAAmC;AACrC;;AAEA;;6CAE6C;AAC7C;EACE,mCAAmC;AACrC;;AAEA;EACE,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,kBAAkB;AACpB;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;;;EAGE,WAAW;EACX,kBAAkB;EAClB,kCAAkC;EAClC,kCAAkC;EAClC,eAAe;EACf,qBAAqB;EACrB,6BAA6B;EAC7B,yBAAyB;AAC3B;;AAEA;;;EAGE,aAAa;EACb,+BAA+B;EAC/B,4CAA4C;AAC9C;;AAEA;EACE,gBAAgB;EAChB,iBAAiB;EACjB,oBAAoB;EACpB,gBAAgB;AAClB;;AAEA;;6CAE6C;AAC7C;EACE,aAAa;EACb,yBAAyB;EACzB,mCAAmC;EACnC,uBAAuB;AACzB;;AAEA;;;EAGE,OAAO;AACT;;AAEA;EACE,cAAc;EACd,eAAe;AACjB;;AAEA;;6CAE6C;AAC7C;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;EACzB,eAAe;EACf,8BAA8B;EAC9B,6BAA6B;EAC7B,kCAAkC;EAClC,gCAAgC;AAClC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,eAAe;EACf,+BAA+B;AACjC;;AAEA;EACE,eAAe;EACf,qBAAqB;EACrB,gBAAgB;AAClB;;AAEA;;6CAE6C;AAC7C;EACE,kBAAkB;EAClB,YAAY;EACZ,kCAAkC;EAClC,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,iDAAiD;EACjD,oBAAoB;EACpB,mBAAmB;EACnB,uBAAuB;EACvB,yBAAyB;EACzB,yCAAyC;AAC3C;;AAEA;EACE,YAAY;EACZ,mBAAmB;EACnB,0BAA0B;AAC5B;;AAEA;EACE,6BAA6B;EAC7B,4BAA4B;AAC9B;;AAEA;EACE,mCAAmC;EACnC,+BAA+B;EAC/B,2BAA2B;AAC7B;;AAEA;EACE,wBAAwB;EACxB,+BAA+B;AACjC;;AAEA;EACE,mCAAmC;EACnC,qBAAqB;EACrB,kCAAkC;AACpC;;AAEA;EACE,iCAAiC;EACjC,kCAAkC;EAClC,yCAAyC;AAC3C;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;;6CAE6C;AAC7C;EACE,kBAAkB;EAClB,kDAAkD;AACpD;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,kCAAkC;EAClC,mCAAmC;EACnC,kBAAkB;EAClB,oCAAoC;EACpC,mCAAmC;AACrC;;AAEA;EACE;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,2BAA2B;EAC3B,eAAe;EACf,gBAAgB;AAClB;;AAEA;;6CAE6C;AAC7C;EACE,aAAa;EACb,4DAA4D;EAC5D,yBAAyB;EACzB,gCAAgC;AAClC;;AAEA;EACE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,OAAO;AACT;;AAEA;EACE,eAAe;EACf,mCAAmC;EACnC,kBAAkB;AACpB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,iBAAiB;EACjB,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,2BAA2B;EAC3B,kCAAkC;EAClC,gBAAgB;EAChB,OAAO;AACT;;AAEA;EACE,aAAa;EACb,eAAe;EACf,yBAAyB;EACzB,mCAAmC;EACnC,iCAAiC;EACjC,sCAAsC;AACxC;;AAEA;EACE,gBAAgB;AAClB;;AAEA;;6CAE6C;;AAE7C,qBAAqB;AACrB;EACE;IACE,6BAA6B;EAC/B;;EAEA;IACE,0BAA0B;IAC1B,yBAAyB;EAC3B;;EAEA;IACE,6BAA6B;EAC/B;;EAEA;IACE,sBAAsB;IACtB,yBAAyB;IACzB,kBAAkB;EACpB;;EAEA;IACE,eAAe;EACjB;;EAEA;IACE,8BAA8B;IAC9B,yBAAyB;EAC3B;;EAEA;IACE,eAAe;EACjB;;EAEA;IACE,sBAAsB;EACxB;;EAEA;IACE,UAAU;IACV,gBAAgB;EAClB;;EAEA;IACE,sBAAsB;EACxB;;EAEA;IACE,WAAW;EACb;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,0BAA0B;EAC5B;;EAEA;IACE,kBAAkB;EACpB;;EAEA;IACE,eAAe;EACjB;AACF;;AAEA;;6CAE6C;AAC7C;EACE,sCAAsC;EACtC,mCAAmC;AACrC;;AAEA;;;;EAIE,2CAA2C;EAC3C,4CAA4C;EAC5C,yCAAyC;AAC3C;;AAEA;;EAEE,+BAA+B;EAC/B,sEAAsE;AACxE;;AAEA;;;;EAIE,mCAAmC;AACrC;;AAEA;;;;EAIE,yCAAyC;AAC3C;;AAEA;;EAEE,mCAAmC;AACrC;;AAEA;;EAEE,yCAAyC;AAC3C;;AAEA;EACE,4CAA4C;EAC5C,mCAAmC;AACrC;;AAEA;EACE,2CAA2C;EAC3C,+BAA+B;AACjC;;AAEA;EACE,8BAA8B;EAC9B,uBAAuB;AACzB;;AAEA;EACE,4BAA4B;EAC5B,cAAc;AAChB;;AAEA;;;EAGE,2CAA2C;EAC3C,4CAA4C;EAC5C,mCAAmC;AACrC;;AAEA;;;EAGE,+BAA+B;EAC/B,2CAA2C;AAC7C;;AAEA;EACE,oCAAoC;EACpC,cAAc;AAChB;;AAEA;EACE,oCAAoC;EACpC,cAAc;AAChB;;AAEA;EACE,oCAAoC;EACpC,cAAc;AAChB;;AAEA;EACE,mCAAmC;EACnC,cAAc;AAChB;;AAEA;EACE,4CAA4C;AAC9C;;AAEA;EACE,oCAAoC;EACpC,cAAc;AAChB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,sCAAsC;EACtC,4CAA4C;AAC9C;;AAEA;EACE,yCAAyC;EACzC,yBAAyB;EACzB,eAAe;EACf,gBAAgB;EAChB,sBAAsB;AACxB;;AAEA;EACE,+BAA+B;AACjC;;AAEA;EACE;;;;;GAKC;EACD,0BAA0B;AAC5B;;AAEA,uCAAuC;AACvC;EACE,YAAY;AACd;;AAEA;EACE,qBAAqB;EACrB,WAAW;EACX,YAAY;EACZ,kBAAkB;AACpB",sourcesContent:['/**\r\n * Goals Page - Modern, User-Friendly Design\r\n * Features: CSS Variables, Dark Mode Support, Smooth Animations\r\n * Now using global CSS variables for consistent theming\r\n */\r\n\r\n/* ========================================\r\n Page Container\r\n\r\n ======================================== */\r\n.ts-goals-page {\r\n padding: var(--ts-spacing-lg);\r\n background: var(--ts-bg);\r\n min-height: 100vh;\r\n}\r\n\r\n/* ========================================\r\n Page Header\r\n ======================================== */\r\n.ts-page-header {\r\n margin-bottom: var(--ts-spacing-xl);\r\n}\r\n\r\n.ts-page-title {\r\n font-size: 28px;\r\n font-weight: 700;\r\n color: var(--ts-text);\r\n margin: 0 0 8px 0;\r\n letter-spacing: -0.025em;\r\n}\r\n\r\n.ts-page-description {\r\n font-size: 15px;\r\n color: var(--ts-text-muted);\r\n margin: 0;\r\n line-height: 1.6;\r\n}\r\n\r\n/* ========================================\r\n Tab Navigation\r\n ======================================== */\r\n.ts-goals-tabs {\r\n display: flex;\r\n gap: var(--ts-spacing-xs);\r\n margin-bottom: var(--ts-spacing-lg);\r\n border-bottom: 1px solid var(--ts-border);\r\n padding: 0;\r\n}\r\n\r\n.ts-goals-tab {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs);\r\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\r\n background: transparent;\r\n border: none;\r\n border-bottom: 2px solid transparent;\r\n color: var(--ts-text-muted);\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n position: relative;\r\n top: 1px;\r\n}\r\n\r\n.ts-goals-tab:hover {\r\n color: var(--ts-text);\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n.ts-goals-tab--active {\r\n color: var(--ts-primary);\r\n border-bottom-color: var(--ts-primary);\r\n font-weight: 600;\r\n}\r\n\r\n.ts-goals-tab--active:hover {\r\n background: transparent;\r\n}\r\n\r\n[data-theme="dark"] .ts-goals-tab:hover {\r\n background: var(--ts-surface-hover-dark);\r\n}\r\n\r\n/* ========================================\r\n Goals Grid\r\n ======================================== */\r\n\r\n/* Summary Cards - Row Layout */\r\n.ts-goals-summary {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: var(--ts-spacing-md);\r\n margin-bottom: var(--ts-spacing-xl);\r\n}\r\n\r\n.ts-goals-summary-row {\r\n display: flex;\r\n flex-direction: row;\r\n gap: var(--ts-spacing-md);\r\n margin-bottom: var(--ts-spacing-xl);\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-goals-summary-row > * {\r\n flex: 1;\r\n min-width: 200px;\r\n}\r\n\r\n.ts-goals-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));\r\n gap: var(--ts-spacing-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n}\r\n\r\n/* ========================================\r\n Goal Card\r\n ======================================== */\r\n.ts-goal-card {\r\n background: var(--ts-surface);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n padding: var(--ts-spacing-lg);\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\r\n position: relative;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n}\r\n\r\n.ts-goal-card::before {\r\n content: \'\';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 3px;\r\n background: linear-gradient(90deg, var(--ts-primary), var(--ts-success));\r\n opacity: 0;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.ts-goal-card:hover {\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08);\r\n transform: translateY(-3px);\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n.ts-goal-card:hover::before {\r\n opacity: 1;\r\n}\r\n\r\n.ts-goal-card-selected {\r\n border-color: var(--ts-primary);\r\n background: var(--ts-surface-hover);\r\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\r\n}\r\n\r\n/* Goal Checkbox - Inline with header */\r\n.ts-goal-checkbox {\r\n position: absolute;\r\n top: var(--ts-spacing-lg);\r\n left: var(--ts-spacing-lg);\r\n z-index: 1;\r\n}\r\n\r\n.ts-goal-checkbox input[type="checkbox"] {\r\n margin: 0;\r\n cursor: pointer;\r\n width: 18px;\r\n height: 18px;\r\n accent-color: var(--ts-primary);\r\n}\r\n\r\n/* Goal Header */\r\n.ts-goal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n margin-bottom: var(--ts-spacing-md);\r\n gap: var(--ts-spacing-md);\r\n padding-left: 30px; /* Space for absolute checkbox */\r\n}\r\n\r\n.ts-goal-title-section {\r\n flex: 1;\r\n min-width: 0;\r\n}\r\n\r\n.ts-goal-title-row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm);\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-goal-name {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0;\r\n line-height: 1.4;\r\n}\r\n\r\n.ts-goal-description {\r\n font-size: 14px;\r\n color: var(--ts-text-muted);\r\n margin: 6px 0 0 0;\r\n line-height: 1.5;\r\n display: -webkit-box;\r\n line-clamp: 2;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n}\r\n\r\n/* Goal Actions */\r\n.ts-goal-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs);\r\n flex-shrink: 0;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.ts-goal-status {\r\n font-size: 12px;\r\n font-weight: 600;\r\n padding: 6px 12px;\r\n border-radius: var(--ts-radius-full);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-goal-status.ts-active {\r\n background: var(--ts-success-soft);\r\n color: var(--ts-success);\r\n border: 1px solid var(--ts-success);\r\n}\r\n\r\n.ts-goal-status.ts-inactive {\r\n background: var(--ts-danger-soft);\r\n color: var(--ts-danger);\r\n border: 1px solid var(--ts-danger);\r\n}\r\n\r\n.ts-btn-icon {\r\n background: var(--ts-surface-hover);\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n cursor: pointer;\r\n font-size: 18px;\r\n padding: 8px;\r\n color: var(--ts-text-muted);\r\n transition: all 0.2s ease;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n}\r\n\r\n.ts-btn-icon:hover {\r\n background: var(--ts-primary-soft);\r\n color: var(--ts-primary);\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.ts-btn-icon.ts-btn-danger:hover {\r\n background: var(--ts-danger-soft);\r\n color: var(--ts-danger);\r\n border-color: var(--ts-danger);\r\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.2);\r\n}\r\n\r\n/* Goal Details */\r\n.ts-goal-details {\r\n margin-bottom: var(--ts-spacing-md);\r\n}\r\n\r\n.ts-goal-meta {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--ts-spacing-sm);\r\n}\r\n\r\n.ts-goal-event,\r\n.ts-goal-conditions {\r\n font-size: 13px;\r\n color: var(--ts-text);\r\n background: var(--ts-bg-tertiary);\r\n padding: 6px 12px;\r\n border-radius: var(--ts-radius-md);\r\n border: 1px solid var(--ts-border);\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-goal-event:hover,\r\n.ts-goal-conditions:hover {\r\n background: var(--ts-primary-soft);\r\n border-color: var(--ts-primary);\r\n color: var(--ts-primary);\r\n transform: translateY(-1px);\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n/* Goal Performance */\r\n.ts-goal-performance {\r\n display: grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: var(--ts-spacing-md);\r\n padding-top: var(--ts-spacing-md);\r\n border-top: 1px solid var(--ts-border);\r\n margin-top: auto;\r\n}\r\n\r\n.ts-goal-stat {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.ts-goal-stat-label {\r\n font-size: 11px;\r\n color: var(--ts-text-muted);\r\n text-transform: uppercase;\r\n letter-spacing: 0.8px;\r\n font-weight: 600;\r\n}\r\n\r\n.ts-goal-stat-value {\r\n font-size: 24px;\r\n font-weight: 700;\r\n color: var(--ts-text);\r\n line-height: 1;\r\n}\r\n\r\n/* View Details Button */\r\n.ts-goal-view-details {\r\n width: 100%;\r\n margin-top: var(--ts-spacing-md);\r\n padding: var(--ts-spacing-sm) var(--ts-spacing-md);\r\n background: var(--ts-primary-soft);\r\n border: 1px solid var(--ts-primary);\r\n color: var(--ts-primary);\r\n border-radius: var(--ts-radius-md);\r\n font-size: 13px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ts-spacing-xs);\r\n position: relative;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n}\r\n\r\n.ts-goal-view-details svg {\r\n flex-shrink: 0;\r\n}\r\n\r\n.ts-goal-view-details::before {\r\n content: \'\';\r\n position: absolute;\r\n top: 0;\r\n left: -100%;\r\n width: 100%;\r\n height: 100%;\r\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);\r\n transition: left 0.5s ease;\r\n}\r\n\r\n.ts-goal-view-details:hover::before {\r\n left: 100%;\r\n}\r\n\r\n.ts-goal-view-details:hover {\r\n background: var(--ts-primary);\r\n color: var(--ts-bg-elevated);\r\n transform: translateY(-1px);\r\n box-shadow: var(--ts-shadow-md);\r\n}\r\n\r\n/* ========================================\r\n Empty State\r\n ======================================== */\r\n.ts-empty-state {\r\n text-align: center;\r\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\r\n background: var(--ts-surface);\r\n border: 2px dashed var(--ts-border);\r\n border-radius: var(--ts-radius-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-empty-icon {\r\n font-size: 64px;\r\n margin-bottom: var(--ts-spacing-md);\r\n opacity: 0.5;\r\n}\r\n\r\n.ts-empty-state h2 {\r\n font-size: 22px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0 0 8px 0;\r\n}\r\n\r\n.ts-empty-state p {\r\n font-size: 15px;\r\n color: var(--ts-text-muted);\r\n margin: 0 0 var(--ts-spacing-lg) 0;\r\n line-height: 1.6;\r\n}\r\n\r\n/* ========================================\r\n Error Banner\r\n ======================================== */\r\n.ts-error-banner {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-md);\r\n background: var(--ts-danger-soft);\r\n border: 1px solid var(--ts-danger);\r\n border-radius: var(--ts-radius-lg);\r\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\r\n margin-bottom: var(--ts-spacing-lg);\r\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.15);\r\n}\r\n\r\n.ts-error-banner span {\r\n font-size: 24px;\r\n flex-shrink: 0;\r\n color: var(--ts-danger);\r\n}\r\n\r\n.ts-error-banner p {\r\n margin: 0;\r\n color: var(--ts-danger);\r\n font-size: 14px;\r\n font-weight: 500;\r\n line-height: 1.5;\r\n}\r\n\r\n/* ========================================\r\n Modal\r\n ======================================== */\r\n.ts-modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.65);\r\n backdrop-filter: blur(8px);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10000;\r\n animation: fadeIn 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n@keyframes fadeIn {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n\r\n\r\n@keyframes slideUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(20px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.ts-modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: var(--ts-spacing-lg);\r\n border-bottom: 1px solid var(--ts-border);\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n.ts-modal-header h2 {\r\n margin: 0;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n}\r\n\r\n.ts-modal-close {\r\n background: transparent;\r\n border: none;\r\n font-size: 24px;\r\n cursor: pointer;\r\n color: var(--ts-text-muted);\r\n padding: 8px;\r\n width: 40px;\r\n height: 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--ts-radius-md);\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-modal-close:hover {\r\n background: var(--ts-danger-soft);\r\n color: var(--ts-danger);\r\n transform: rotate(90deg);\r\n}\r\n\r\n.ts-modal-body {\r\n padding: var(--ts-spacing-lg);\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n.ts-modal-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: var(--ts-spacing-sm);\r\n padding: var(--ts-spacing-md) var(--ts-spacing-lg);\r\n border-top: 1px solid var(--ts-border);\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n/* ========================================\r\n Form Fields\r\n ======================================== */\r\n.ts-form-field {\r\n margin-bottom: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-form-field label {\r\n display: block;\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin-bottom: 8px;\r\n}\r\n\r\n.ts-field-help {\r\n font-size: 13px;\r\n color: var(--ts-text-muted);\r\n margin: 4px 0 0 0;\r\n line-height: 1.5;\r\n}\r\n\r\n.ts-form-field input[type="text"],\r\n.ts-form-field textarea,\r\n.ts-form-field select {\r\n width: 100%;\r\n padding: 10px 14px;\r\n border: 1px solid var(--ts-border);\r\n border-radius: var(--ts-radius-md);\r\n font-size: 14px;\r\n color: var(--ts-text);\r\n background: var(--ts-surface);\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.ts-form-field input[type="text"]:focus,\r\n.ts-form-field textarea:focus,\r\n.ts-form-field select:focus {\r\n outline: none;\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 0 0 3px var(--ts-primary-soft);\r\n}\r\n\r\n.ts-form-field textarea {\r\n resize: vertical;\r\n min-height: 100px;\r\n font-family: inherit;\r\n line-height: 1.6;\r\n}\r\n\r\n/* ========================================\r\n Condition Rows\r\n ======================================== */\r\n.ts-condition-row {\r\n display: flex;\r\n gap: var(--ts-spacing-sm);\r\n margin-bottom: var(--ts-spacing-sm);\r\n align-items: flex-start;\r\n}\r\n\r\n.ts-condition-param,\r\n.ts-condition-operator,\r\n.ts-condition-value {\r\n flex: 1;\r\n}\r\n\r\n.ts-condition-row .ts-btn-icon {\r\n flex-shrink: 0;\r\n margin-top: 2px;\r\n}\r\n\r\n/* ========================================\r\n Checkbox\r\n ======================================== */\r\n.ts-checkbox-label {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm);\r\n cursor: pointer;\r\n font-weight: normal !important;\r\n padding: var(--ts-spacing-sm);\r\n border-radius: var(--ts-radius-md);\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.ts-checkbox-label:hover {\r\n background: var(--ts-surface-hover);\r\n}\r\n\r\n.ts-checkbox-label input[type="checkbox"] {\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n accent-color: var(--ts-primary);\r\n}\r\n\r\n.ts-checkbox-label span {\r\n font-size: 14px;\r\n color: var(--ts-text);\r\n line-height: 1.5;\r\n}\r\n\r\n/* ========================================\r\n Buttons\r\n ======================================== */\r\n.ts-btn {\r\n padding: 10px 20px;\r\n border: none;\r\n border-radius: var(--ts-radius-md);\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ts-spacing-sm);\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.ts-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n transform: none !important;\r\n}\r\n\r\n.ts-btn-primary {\r\n background: var(--ts-primary);\r\n color: var(--ts-bg-elevated);\r\n}\r\n\r\n.ts-btn-primary:hover:not(:disabled) {\r\n background: var(--ts-primary-hover);\r\n box-shadow: var(--ts-shadow-md);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.ts-btn-primary:active:not(:disabled) {\r\n transform: translateY(0);\r\n box-shadow: var(--ts-shadow-sm);\r\n}\r\n\r\n.ts-btn-secondary {\r\n background: var(--ts-surface-hover);\r\n color: var(--ts-text);\r\n border: 1px solid var(--ts-border);\r\n}\r\n\r\n.ts-btn-secondary:hover:not(:disabled) {\r\n background: var(--ts-bg-tertiary);\r\n border-color: var(--ts-text-muted);\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.ts-btn-sm {\r\n padding: 6px 14px;\r\n font-size: 13px;\r\n}\r\n\r\n/* ========================================\r\n Loading State\r\n ======================================== */\r\n.ts-loading-state {\r\n text-align: center;\r\n padding: var(--ts-spacing-xl) var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-spinner {\r\n width: 48px;\r\n height: 48px;\r\n border: 4px solid var(--ts-border);\r\n border-top-color: var(--ts-primary);\r\n border-radius: 50%;\r\n animation: spin 0.8s linear infinite;\r\n margin: 0 auto var(--ts-spacing-md);\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n.ts-loading-state p {\r\n color: var(--ts-text-muted);\r\n font-size: 15px;\r\n font-weight: 500;\r\n}\r\n\r\n/* ========================================\r\n Templates Grid\r\n ======================================== */\r\n.ts-templates-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n gap: var(--ts-spacing-lg);\r\n margin-top: var(--ts-spacing-lg);\r\n}\r\n\r\n.ts-template-card {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.ts-template-card .ts-card-body {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n}\r\n\r\n.ts-template-icon {\r\n font-size: 48px;\r\n margin-bottom: var(--ts-spacing-md);\r\n text-align: center;\r\n}\r\n\r\n.ts-template-name {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text);\r\n margin: 0 0 8px 0;\r\n line-height: 1.4;\r\n}\r\n\r\n.ts-template-description {\r\n font-size: 14px;\r\n color: var(--ts-text-muted);\r\n margin: 0 0 var(--ts-spacing-md) 0;\r\n line-height: 1.6;\r\n flex: 1;\r\n}\r\n\r\n.ts-template-meta {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--ts-spacing-sm);\r\n margin-bottom: var(--ts-spacing-md);\r\n padding-top: var(--ts-spacing-md);\r\n border-top: 1px solid var(--ts-border);\r\n}\r\n\r\n.ts-template-add-btn {\r\n margin-top: auto;\r\n}\r\n\r\n/* ========================================\r\n Responsive Design\r\n ======================================== */\r\n\r\n/* Tablet and below */\r\n@media (max-width: 768px) {\r\n .ts-goals-page {\r\n padding: var(--ts-spacing-md);\r\n }\r\n\r\n .ts-templates-grid {\r\n grid-template-columns: 1fr;\r\n gap: var(--ts-spacing-md);\r\n }\r\n\r\n .ts-goal-card {\r\n padding: var(--ts-spacing-md);\r\n }\r\n\r\n .ts-goal-header {\r\n flex-direction: column;\r\n gap: var(--ts-spacing-sm);\r\n padding-left: 30px;\r\n }\r\n\r\n .ts-goal-actions {\r\n flex-wrap: wrap;\r\n }\r\n\r\n .ts-goal-performance {\r\n grid-template-columns: 1fr 1fr;\r\n gap: var(--ts-spacing-sm);\r\n }\r\n\r\n .ts-goal-stat-value {\r\n font-size: 18px;\r\n }\r\n\r\n .ts-condition-row {\r\n flex-direction: column;\r\n }\r\n\r\n .ts-modal {\r\n width: 95%;\r\n max-height: 95vh;\r\n }\r\n\r\n .ts-modal-footer {\r\n flex-direction: column;\r\n }\r\n\r\n .ts-modal-footer .ts-btn {\r\n width: 100%;\r\n }\r\n}\r\n\r\n/* Small mobile */\r\n@media (max-width: 480px) {\r\n .ts-goal-performance {\r\n grid-template-columns: 1fr;\r\n }\r\n \r\n .ts-goal-header {\r\n padding-left: 28px;\r\n }\r\n \r\n .ts-goal-name {\r\n font-size: 15px;\r\n }\r\n}\r\n\r\n/* ========================================\r\n Dark Theme Support\r\n ======================================== */\r\n[data-theme="dark"] .ts-goals-page {\r\n background: var(--ts-bg-dark, #0f1419);\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-card,\r\n[data-theme="dark"] .ts-template-card,\r\n[data-theme="dark"] .ts-modal-content,\r\n[data-theme="dark"] .ts-card {\r\n background: var(--ts-surface-dark, #1a1f26);\r\n border-color: var(--ts-border-dark, #2d3748);\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-card:hover,\r\n[data-theme="dark"] .ts-template-card:hover {\r\n border-color: var(--ts-primary);\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--ts-primary);\r\n}\r\n\r\n[data-theme="dark"] .ts-page-title,\r\n[data-theme="dark"] .ts-goal-title,\r\n[data-theme="dark"] .ts-template-title,\r\n[data-theme="dark"] .ts-modal-title {\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-page-description,\r\n[data-theme="dark"] .ts-goal-description,\r\n[data-theme="dark"] .ts-template-description,\r\n[data-theme="dark"] .ts-text-muted {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n}\r\n\r\n[data-theme="dark"] .ts-kpi-value,\r\n[data-theme="dark"] .ts-perf-value {\r\n color: var(--ts-text-dark, #ffffff);\r\n}\r\n\r\n[data-theme="dark"] .ts-kpi-label,\r\n[data-theme="dark"] .ts-perf-label {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-outline {\r\n border-color: var(--ts-border-dark, #2d3748);\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-outline:hover {\r\n background: var(--ts-surface-dark, #2d3748);\r\n border-color: var(--ts-primary);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-danger-outline {\r\n border-color: var(--ts-danger);\r\n color: var(--ts-danger);\r\n}\r\n\r\n[data-theme="dark"] .ts-btn-danger-outline:hover {\r\n background: var(--ts-danger);\r\n color: #ffffff;\r\n}\r\n\r\n[data-theme="dark"] .ts-input,\r\n[data-theme="dark"] .ts-select,\r\n[data-theme="dark"] .ts-textarea {\r\n background: var(--ts-surface-dark, #0f1419);\r\n border-color: var(--ts-border-dark, #2d3748);\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-input:focus,\r\n[data-theme="dark"] .ts-select:focus,\r\n[data-theme="dark"] .ts-textarea:focus {\r\n border-color: var(--ts-primary);\r\n background: var(--ts-surface-dark, #1a1f26);\r\n}\r\n\r\n[data-theme="dark"] .ts-badge {\r\n background: rgba(59, 130, 246, 0.15);\r\n color: #60a5fa;\r\n}\r\n\r\n[data-theme="dark"] .ts-badge-success {\r\n background: rgba(16, 185, 129, 0.15);\r\n color: #34d399;\r\n}\r\n\r\n[data-theme="dark"] .ts-badge-warning {\r\n background: rgba(245, 158, 11, 0.15);\r\n color: #fbbf24;\r\n}\r\n\r\n[data-theme="dark"] .ts-badge-danger {\r\n background: rgba(239, 68, 68, 0.15);\r\n color: #f87171;\r\n}\r\n\r\n[data-theme="dark"] .ts-divider {\r\n border-color: var(--ts-border-dark, #2d3748);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-status-inactive {\r\n background: rgba(156, 163, 175, 0.1);\r\n color: #9ca3af;\r\n}\r\n\r\n[data-theme="dark"] .ts-empty-state {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n}\r\n\r\n[data-theme="dark"] .ts-empty-state-title {\r\n color: var(--ts-text-dark, #e8eaed);\r\n}\r\n\r\n[data-theme="dark"] .ts-condition-row {\r\n background: var(--ts-bg-dark, #0f1419);\r\n border-color: var(--ts-border-dark, #2d3748);\r\n}\r\n\r\n[data-theme="dark"] .ts-template-category {\r\n color: var(--ts-text-muted-dark, #9ca3af);\r\n text-transform: uppercase;\r\n font-size: 12px;\r\n font-weight: 600;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n[data-theme="dark"] .ts-modal-overlay {\r\n background: rgba(0, 0, 0, 0.85);\r\n}\r\n\r\n[data-theme="dark"] .ts-skeleton {\r\n background: linear-gradient(\r\n 90deg,\r\n var(--ts-surface-dark, #1a1f26) 0%,\r\n var(--ts-border-dark, #2d3748) 50%,\r\n var(--ts-surface-dark, #1a1f26) 100%\r\n );\r\n background-size: 200% 100%;\r\n}\r\n\r\n/* Performance skeleton loading state */\r\n.ts-goal-performance--loading {\r\n opacity: 0.6;\r\n}\r\n\r\n.ts-goal-performance--loading .ts-skeleton--sm {\r\n display: inline-block;\r\n width: 48px;\r\n height: 14px;\r\n border-radius: 4px;\r\n}\r\n'],sourceRoot:""}]);const i=s},80126:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'/**\n * Goal Modal Styles\n * \n * Unified styling for goal creation/editing modal\n * Supports dark/light themes with CSS variables\n * \n * @since 2.1.0\n * @package TrackSure\n */\n\n/* ============================================================\n Modal Content\n ============================================================ */\n\n.ts-goal-modal__content {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-lg, 1.5rem);\n padding: var(--ts-spacing-md, 1rem);\n}\n\n/* ============================================================\n Banner (Info/Error Messages)\n ============================================================ */\n\n.ts-goal-modal__banner {\n display: flex;\n align-items: flex-start;\n gap: var(--ts-spacing-sm, 0.75rem);\n padding: var(--ts-spacing-md, 1rem);\n border-radius: var(--ts-radius-lg, 8px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.ts-goal-modal__banner-icon {\n flex-shrink: 0;\n font-size: 1.25rem;\n line-height: 1;\n}\n\n.ts-goal-modal__banner--info {\n background: var(--ts-info-bg, #e0f2fe);\n border: 1px solid var(--ts-info-border, #7dd3fc);\n color: var(--ts-info-text, #0c4a6e);\n}\n\n[data-theme="dark"] .ts-goal-modal__banner--info {\n background: rgba(14, 116, 144, 0.1);\n border-color: rgba(6, 182, 212, 0.3);\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__banner--error {\n background: var(--ts-error-bg, #fef2f2);\n border: 1px solid var(--ts-error-border, #fca5a5);\n color: var(--ts-error-text, #991b1b);\n}\n\n[data-theme="dark"] .ts-goal-modal__banner--error {\n background: rgba(127, 29, 29, 0.2);\n border-color: rgba(248, 113, 113, 0.3);\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__banner strong {\n display: block;\n font-weight: 600;\n margin-bottom: 0.25rem;\n}\n\n.ts-goal-modal__banner p {\n margin: 0;\n color: inherit;\n opacity: 0.9;\n}\n\n/* ============================================================\n Sections\n ============================================================ */\n\n.ts-goal-modal__section {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-md, 1rem);\n}\n\n.ts-goal-modal__section-title {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm, 0.75rem);\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--ts-text-primary, #1e293b);\n}\n\n[data-theme="dark"] .ts-goal-modal__section-title {\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__section-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.25rem;\n line-height: 1;\n}\n\n/* ============================================================\n Form Fields\n ============================================================ */\n\n.ts-goal-modal__field {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-xs, 0.5rem);\n}\n\n.ts-goal-modal__label {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-xs, 0.5rem);\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--ts-text-primary, #334155);\n}\n\n[data-theme="dark"] .ts-goal-modal__label {\n color: var(--ts-text-primary, #e2e8f0);\n}\n\n.ts-goal-modal__label--required::after {\n content: \'*\';\n color: var(--ts-danger, #ef4444);\n margin-left: 0.125rem;\n}\n\n.ts-goal-modal__label-optional {\n font-size: 0.75rem;\n font-weight: 400;\n color: var(--ts-text-tertiary, #94a3b8);\n}\n\n/* Input Styles */\n.ts-goal-modal__input,\n.ts-goal-modal__textarea,\n.ts-goal-modal__select {\n width: 100%;\n padding: 0.625rem 0.875rem;\n font-size: 0.875rem;\n font-family: var(--ts-font-sans);\n color: var(--ts-text-primary, #1e293b);\n background: var(--ts-bg-primary, #ffffff);\n border: 1px solid var(--ts-border-color, #e2e8f0);\n border-radius: var(--ts-radius-md, 6px);\n transition: all var(--ts-fast, 120ms);\n outline: none;\n}\n\n[data-theme="dark"] .ts-goal-modal__input,\n[data-theme="dark"] .ts-goal-modal__textarea,\n[data-theme="dark"] .ts-goal-modal__select {\n color: var(--ts-text-primary, #f9fafb);\n background: var(--ts-bg-secondary, #1e293b);\n border-color: var(--ts-border-color, #334155);\n}\n\n.ts-goal-modal__input:hover,\n.ts-goal-modal__textarea:hover,\n.ts-goal-modal__select:hover {\n border-color: var(--ts-border-color-hover, #cbd5e1);\n}\n\n[data-theme="dark"] .ts-goal-modal__input:hover,\n[data-theme="dark"] .ts-goal-modal__textarea:hover,\n[data-theme="dark"] .ts-goal-modal__select:hover {\n border-color: var(--ts-border-color-hover, #475569);\n}\n\n.ts-goal-modal__input:focus,\n.ts-goal-modal__textarea:focus,\n.ts-goal-modal__select:focus {\n border-color: var(--ts-primary, #6366f1);\n box-shadow: var(--ts-ring, 0 0 0 3px rgba(99, 102, 241, 0.1));\n}\n\n[data-theme="dark"] .ts-goal-modal__input:focus,\n[data-theme="dark"] .ts-goal-modal__textarea:focus,\n[data-theme="dark"] .ts-goal-modal__select:focus {\n border-color: var(--ts-primary, #818cf8);\n box-shadow: 0 0 0 3px rgba(129, 140, 248, 0.2);\n}\n\n.ts-goal-modal__input::placeholder,\n.ts-goal-modal__textarea::placeholder {\n color: var(--ts-text-tertiary, #94a3b8);\n opacity: 1;\n}\n\n[data-theme="dark"] .ts-goal-modal__input::placeholder,\n[data-theme="dark"] .ts-goal-modal__textarea::placeholder {\n color: var(--ts-text-tertiary, #64748b);\n}\n\n.ts-goal-modal__textarea {\n resize: vertical;\n min-height: 80px;\n}\n\n/* Error State */\n.ts-goal-modal__input--error,\n.ts-goal-modal__textarea--error {\n border-color: var(--ts-danger, #ef4444);\n}\n\n[data-theme="dark"] .ts-goal-modal__input--error,\n[data-theme="dark"] .ts-goal-modal__textarea--error {\n border-color: var(--ts-danger, #f87171);\n}\n\n.ts-goal-modal__input--error:focus,\n.ts-goal-modal__textarea--error:focus {\n box-shadow: var(--ts-ring-danger, 0 0 0 3px rgba(239, 68, 68, 0.1));\n}\n\n[data-theme="dark"] .ts-goal-modal__input--error:focus,\n[data-theme="dark"] .ts-goal-modal__textarea--error:focus {\n box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.2);\n}\n\n/* ============================================================\n Help Text & Errors\n ============================================================ */\n\n.ts-goal-modal__help {\n margin: 0;\n font-size: 0.75rem;\n color: var(--ts-text-secondary, #64748b);\n line-height: 1.5;\n}\n\n[data-theme="dark"] .ts-goal-modal__help {\n color: var(--ts-text-secondary, #94a3b8);\n}\n\n.ts-goal-modal__error {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n margin: 0;\n font-size: 0.75rem;\n color: var(--ts-danger, #ef4444);\n line-height: 1.5;\n}\n\n[data-theme="dark"] .ts-goal-modal__error {\n color: var(--ts-danger, #f87171);\n}\n\n.ts-goal-modal__error::before {\n content: \'⚠\';\n font-size: 0.875rem;\n}\n\n.ts-goal-modal__error-list {\n margin: 0.5rem 0 0 0;\n padding-left: 1.25rem;\n list-style: disc;\n}\n\n.ts-goal-modal__error-list li {\n margin: 0.25rem 0;\n}\n\n/* ============================================================\n Toggle Switch\n ============================================================ */\n\n.ts-goal-modal__toggle {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-sm, 0.75rem);\n padding: var(--ts-spacing-md, 1rem);\n background: var(--ts-bg-secondary, #f8fafc);\n border: 1px solid var(--ts-border-color, #e2e8f0);\n border-radius: var(--ts-radius-lg, 8px);\n cursor: pointer;\n transition: all var(--ts-fast, 120ms);\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle {\n background: var(--ts-bg-tertiary, #0f172a);\n border-color: var(--ts-border-color, #1e293b);\n}\n\n.ts-goal-modal__toggle:hover {\n background: var(--ts-surface-hover, #f1f5f9);\n border-color: var(--ts-border-color-hover, #cbd5e1);\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle:hover {\n background: var(--ts-surface-hover, #1e293b);\n border-color: var(--ts-border-color-hover, #334155);\n}\n\n.ts-goal-modal__toggle-input {\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n cursor: pointer;\n accent-color: var(--ts-primary, #6366f1);\n}\n\n.ts-goal-modal__toggle-content {\n flex: 1;\n}\n\n.ts-goal-modal__toggle-title {\n font-weight: 600;\n font-size: 0.875rem;\n color: var(--ts-text-primary, #1e293b);\n margin-bottom: 0.125rem;\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle-title {\n color: var(--ts-text-primary, #f9fafb);\n}\n\n.ts-goal-modal__toggle-description {\n font-size: 0.75rem;\n color: var(--ts-text-secondary, #64748b);\n}\n\n[data-theme="dark"] .ts-goal-modal__toggle-description {\n color: var(--ts-text-secondary, #94a3b8);\n}\n\n/* ============================================================\n Footer\n ============================================================ */\n\n.ts-goal-modal__footer {\n display: flex;\n gap: var(--ts-spacing-sm, 0.75rem);\n justify-content: flex-end;\n}\n\n/* ============================================================\n Responsive Design\n ============================================================ */\n\n@media (max-width: 768px) {\n .ts-goal-modal__content {\n padding: var(--ts-spacing-sm, 0.75rem);\n gap: var(--ts-spacing-md, 1rem);\n }\n\n .ts-goal-modal__section {\n gap: var(--ts-spacing-sm, 0.75rem);\n }\n\n .ts-goal-modal__footer {\n flex-direction: column;\n }\n\n .ts-goal-modal__footer .ts-btn {\n width: 100%;\n }\n}\n\n/* ============================================================\n Accessibility Improvements\n ============================================================ */\n\n/* Focus visible (keyboard navigation) */\n.ts-goal-modal__input:focus-visible,\n.ts-goal-modal__textarea:focus-visible,\n.ts-goal-modal__select:focus-visible,\n.ts-goal-modal__toggle-input:focus-visible {\n outline: 2px solid var(--ts-primary, #6366f1);\n outline-offset: 2px;\n}\n\n[data-theme="dark"] .ts-goal-modal__input:focus-visible,\n[data-theme="dark"] .ts-goal-modal__textarea:focus-visible,\n[data-theme="dark"] .ts-goal-modal__select:focus-visible,\n[data-theme="dark"] .ts-goal-modal__toggle-input:focus-visible {\n outline-color: var(--ts-primary, #818cf8);\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n .ts-goal-modal__input,\n .ts-goal-modal__textarea,\n .ts-goal-modal__select,\n .ts-goal-modal__toggle {\n border-width: 2px;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n .ts-goal-modal__input,\n .ts-goal-modal__textarea,\n .ts-goal-modal__select,\n .ts-goal-modal__toggle {\n transition: none;\n }\n}\n',"",{version:3,sources:["webpack://./src/components/goals/components/GoalModal.css"],names:[],mappings:"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",sourcesContent:['/**\r\n * Goal Modal Styles\r\n * \r\n * Unified styling for goal creation/editing modal\r\n * Supports dark/light themes with CSS variables\r\n * \r\n * @since 2.1.0\r\n * @package TrackSure\r\n */\r\n\r\n/* ============================================================\r\n Modal Content\r\n ============================================================ */\r\n\r\n.ts-goal-modal__content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-lg, 1.5rem);\r\n padding: var(--ts-spacing-md, 1rem);\r\n}\r\n\r\n/* ============================================================\r\n Banner (Info/Error Messages)\r\n ============================================================ */\r\n\r\n.ts-goal-modal__banner {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n padding: var(--ts-spacing-md, 1rem);\r\n border-radius: var(--ts-radius-lg, 8px);\r\n font-size: 0.875rem;\r\n line-height: 1.5;\r\n}\r\n\r\n.ts-goal-modal__banner-icon {\r\n flex-shrink: 0;\r\n font-size: 1.25rem;\r\n line-height: 1;\r\n}\r\n\r\n.ts-goal-modal__banner--info {\r\n background: var(--ts-info-bg, #e0f2fe);\r\n border: 1px solid var(--ts-info-border, #7dd3fc);\r\n color: var(--ts-info-text, #0c4a6e);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__banner--info {\r\n background: rgba(14, 116, 144, 0.1);\r\n border-color: rgba(6, 182, 212, 0.3);\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__banner--error {\r\n background: var(--ts-error-bg, #fef2f2);\r\n border: 1px solid var(--ts-error-border, #fca5a5);\r\n color: var(--ts-error-text, #991b1b);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__banner--error {\r\n background: rgba(127, 29, 29, 0.2);\r\n border-color: rgba(248, 113, 113, 0.3);\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__banner strong {\r\n display: block;\r\n font-weight: 600;\r\n margin-bottom: 0.25rem;\r\n}\r\n\r\n.ts-goal-modal__banner p {\r\n margin: 0;\r\n color: inherit;\r\n opacity: 0.9;\r\n}\r\n\r\n/* ============================================================\r\n Sections\r\n ============================================================ */\r\n\r\n.ts-goal-modal__section {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-md, 1rem);\r\n}\r\n\r\n.ts-goal-modal__section-title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n margin: 0;\r\n font-size: 1rem;\r\n font-weight: 600;\r\n color: var(--ts-text-primary, #1e293b);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__section-title {\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__section-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 1.25rem;\r\n line-height: 1;\r\n}\r\n\r\n/* ============================================================\r\n Form Fields\r\n ============================================================ */\r\n\r\n.ts-goal-modal__field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ts-spacing-xs, 0.5rem);\r\n}\r\n\r\n.ts-goal-modal__label {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-xs, 0.5rem);\r\n font-size: 0.875rem;\r\n font-weight: 500;\r\n color: var(--ts-text-primary, #334155);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__label {\r\n color: var(--ts-text-primary, #e2e8f0);\r\n}\r\n\r\n.ts-goal-modal__label--required::after {\r\n content: \'*\';\r\n color: var(--ts-danger, #ef4444);\r\n margin-left: 0.125rem;\r\n}\r\n\r\n.ts-goal-modal__label-optional {\r\n font-size: 0.75rem;\r\n font-weight: 400;\r\n color: var(--ts-text-tertiary, #94a3b8);\r\n}\r\n\r\n/* Input Styles */\r\n.ts-goal-modal__input,\r\n.ts-goal-modal__textarea,\r\n.ts-goal-modal__select {\r\n width: 100%;\r\n padding: 0.625rem 0.875rem;\r\n font-size: 0.875rem;\r\n font-family: var(--ts-font-sans);\r\n color: var(--ts-text-primary, #1e293b);\r\n background: var(--ts-bg-primary, #ffffff);\r\n border: 1px solid var(--ts-border-color, #e2e8f0);\r\n border-radius: var(--ts-radius-md, 6px);\r\n transition: all var(--ts-fast, 120ms);\r\n outline: none;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input,\r\n[data-theme="dark"] .ts-goal-modal__textarea,\r\n[data-theme="dark"] .ts-goal-modal__select {\r\n color: var(--ts-text-primary, #f9fafb);\r\n background: var(--ts-bg-secondary, #1e293b);\r\n border-color: var(--ts-border-color, #334155);\r\n}\r\n\r\n.ts-goal-modal__input:hover,\r\n.ts-goal-modal__textarea:hover,\r\n.ts-goal-modal__select:hover {\r\n border-color: var(--ts-border-color-hover, #cbd5e1);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input:hover,\r\n[data-theme="dark"] .ts-goal-modal__textarea:hover,\r\n[data-theme="dark"] .ts-goal-modal__select:hover {\r\n border-color: var(--ts-border-color-hover, #475569);\r\n}\r\n\r\n.ts-goal-modal__input:focus,\r\n.ts-goal-modal__textarea:focus,\r\n.ts-goal-modal__select:focus {\r\n border-color: var(--ts-primary, #6366f1);\r\n box-shadow: var(--ts-ring, 0 0 0 3px rgba(99, 102, 241, 0.1));\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input:focus,\r\n[data-theme="dark"] .ts-goal-modal__textarea:focus,\r\n[data-theme="dark"] .ts-goal-modal__select:focus {\r\n border-color: var(--ts-primary, #818cf8);\r\n box-shadow: 0 0 0 3px rgba(129, 140, 248, 0.2);\r\n}\r\n\r\n.ts-goal-modal__input::placeholder,\r\n.ts-goal-modal__textarea::placeholder {\r\n color: var(--ts-text-tertiary, #94a3b8);\r\n opacity: 1;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input::placeholder,\r\n[data-theme="dark"] .ts-goal-modal__textarea::placeholder {\r\n color: var(--ts-text-tertiary, #64748b);\r\n}\r\n\r\n.ts-goal-modal__textarea {\r\n resize: vertical;\r\n min-height: 80px;\r\n}\r\n\r\n/* Error State */\r\n.ts-goal-modal__input--error,\r\n.ts-goal-modal__textarea--error {\r\n border-color: var(--ts-danger, #ef4444);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input--error,\r\n[data-theme="dark"] .ts-goal-modal__textarea--error {\r\n border-color: var(--ts-danger, #f87171);\r\n}\r\n\r\n.ts-goal-modal__input--error:focus,\r\n.ts-goal-modal__textarea--error:focus {\r\n box-shadow: var(--ts-ring-danger, 0 0 0 3px rgba(239, 68, 68, 0.1));\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input--error:focus,\r\n[data-theme="dark"] .ts-goal-modal__textarea--error:focus {\r\n box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.2);\r\n}\r\n\r\n/* ============================================================\r\n Help Text & Errors\r\n ============================================================ */\r\n\r\n.ts-goal-modal__help {\r\n margin: 0;\r\n font-size: 0.75rem;\r\n color: var(--ts-text-secondary, #64748b);\r\n line-height: 1.5;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__help {\r\n color: var(--ts-text-secondary, #94a3b8);\r\n}\r\n\r\n.ts-goal-modal__error {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.375rem;\r\n margin: 0;\r\n font-size: 0.75rem;\r\n color: var(--ts-danger, #ef4444);\r\n line-height: 1.5;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__error {\r\n color: var(--ts-danger, #f87171);\r\n}\r\n\r\n.ts-goal-modal__error::before {\r\n content: \'⚠\';\r\n font-size: 0.875rem;\r\n}\r\n\r\n.ts-goal-modal__error-list {\r\n margin: 0.5rem 0 0 0;\r\n padding-left: 1.25rem;\r\n list-style: disc;\r\n}\r\n\r\n.ts-goal-modal__error-list li {\r\n margin: 0.25rem 0;\r\n}\r\n\r\n/* ============================================================\r\n Toggle Switch\r\n ============================================================ */\r\n\r\n.ts-goal-modal__toggle {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n padding: var(--ts-spacing-md, 1rem);\r\n background: var(--ts-bg-secondary, #f8fafc);\r\n border: 1px solid var(--ts-border-color, #e2e8f0);\r\n border-radius: var(--ts-radius-lg, 8px);\r\n cursor: pointer;\r\n transition: all var(--ts-fast, 120ms);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle {\r\n background: var(--ts-bg-tertiary, #0f172a);\r\n border-color: var(--ts-border-color, #1e293b);\r\n}\r\n\r\n.ts-goal-modal__toggle:hover {\r\n background: var(--ts-surface-hover, #f1f5f9);\r\n border-color: var(--ts-border-color-hover, #cbd5e1);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle:hover {\r\n background: var(--ts-surface-hover, #1e293b);\r\n border-color: var(--ts-border-color-hover, #334155);\r\n}\r\n\r\n.ts-goal-modal__toggle-input {\r\n width: 20px;\r\n height: 20px;\r\n flex-shrink: 0;\r\n cursor: pointer;\r\n accent-color: var(--ts-primary, #6366f1);\r\n}\r\n\r\n.ts-goal-modal__toggle-content {\r\n flex: 1;\r\n}\r\n\r\n.ts-goal-modal__toggle-title {\r\n font-weight: 600;\r\n font-size: 0.875rem;\r\n color: var(--ts-text-primary, #1e293b);\r\n margin-bottom: 0.125rem;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle-title {\r\n color: var(--ts-text-primary, #f9fafb);\r\n}\r\n\r\n.ts-goal-modal__toggle-description {\r\n font-size: 0.75rem;\r\n color: var(--ts-text-secondary, #64748b);\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__toggle-description {\r\n color: var(--ts-text-secondary, #94a3b8);\r\n}\r\n\r\n/* ============================================================\r\n Footer\r\n ============================================================ */\r\n\r\n.ts-goal-modal__footer {\r\n display: flex;\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n justify-content: flex-end;\r\n}\r\n\r\n/* ============================================================\r\n Responsive Design\r\n ============================================================ */\r\n\r\n@media (max-width: 768px) {\r\n .ts-goal-modal__content {\r\n padding: var(--ts-spacing-sm, 0.75rem);\r\n gap: var(--ts-spacing-md, 1rem);\r\n }\r\n\r\n .ts-goal-modal__section {\r\n gap: var(--ts-spacing-sm, 0.75rem);\r\n }\r\n\r\n .ts-goal-modal__footer {\r\n flex-direction: column;\r\n }\r\n\r\n .ts-goal-modal__footer .ts-btn {\r\n width: 100%;\r\n }\r\n}\r\n\r\n/* ============================================================\r\n Accessibility Improvements\r\n ============================================================ */\r\n\r\n/* Focus visible (keyboard navigation) */\r\n.ts-goal-modal__input:focus-visible,\r\n.ts-goal-modal__textarea:focus-visible,\r\n.ts-goal-modal__select:focus-visible,\r\n.ts-goal-modal__toggle-input:focus-visible {\r\n outline: 2px solid var(--ts-primary, #6366f1);\r\n outline-offset: 2px;\r\n}\r\n\r\n[data-theme="dark"] .ts-goal-modal__input:focus-visible,\r\n[data-theme="dark"] .ts-goal-modal__textarea:focus-visible,\r\n[data-theme="dark"] .ts-goal-modal__select:focus-visible,\r\n[data-theme="dark"] .ts-goal-modal__toggle-input:focus-visible {\r\n outline-color: var(--ts-primary, #818cf8);\r\n}\r\n\r\n/* High contrast mode support */\r\n@media (prefers-contrast: high) {\r\n .ts-goal-modal__input,\r\n .ts-goal-modal__textarea,\r\n .ts-goal-modal__select,\r\n .ts-goal-modal__toggle {\r\n border-width: 2px;\r\n }\r\n}\r\n\r\n/* Reduced motion support */\r\n@media (prefers-reduced-motion: reduce) {\r\n .ts-goal-modal__input,\r\n .ts-goal-modal__textarea,\r\n .ts-goal-modal__select,\r\n .ts-goal-modal__toggle {\r\n transition: none;\r\n }\r\n}\r\n'],sourceRoot:""}]);const i=s},96478:(r,n,e)=>{e.d(n,{A:()=>i});var a=e(71354),t=e.n(a),o=e(76314),s=e.n(o)()(t());s.push([r.id,'.goal-bulk-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--ts-bg-secondary);\n border: 1px solid var(--ts-border-color);\n border-radius: 8px;\n margin-bottom: 16px;\n gap: 16px;\n}\n\n.bulk-actions-left {\n display: flex;\n align-items: center;\n}\n\n.bulk-select-all {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n cursor: pointer;\n user-select: none;\n}\n\n.bulk-select-all input[type="checkbox"] {\n margin: 0;\n cursor: pointer;\n}\n\n.bulk-select-all span {\n font-weight: 500;\n color: var(--ts-text-primary);\n}\n\n.bulk-actions-right {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.bulk-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n line-height: 1.4;\n border-radius: 4px;\n transition: all 0.2s ease;\n border: 1px solid var(--ts-border-color);\n background: var(--ts-bg-primary);\n color: var(--ts-text-primary);\n cursor: pointer;\n font-weight: 500;\n}\n\n.bulk-action-btn .dashicons {\n font-size: 16px;\n width: 16px;\n height: 16px;\n line-height: 16px;\n}\n\n.bulk-action-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n background: var(--ts-bg-hover);\n border-color: var(--ts-primary-color);\n}\n\n.bulk-action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background: var(--ts-bg-secondary);\n color: var(--ts-text-tertiary);\n}\n\n.bulk-action-btn.bulk-delete {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.bulk-action-btn.bulk-delete:hover {\n background: #dc3545;\n color: #fff;\n}\n\n/* Confirmation Dialog */\n.bulk-confirm-dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100000;\n backdrop-filter: blur(2px);\n}\n\n.bulk-confirm-dialog {\n background: var(--ts-bg-primary);\n border-radius: 8px;\n padding: 24px;\n max-width: 500px;\n width: 90%;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n}\n\n.bulk-confirm-dialog h3 {\n margin: 0 0 12px;\n font-size: 18px;\n font-weight: 600;\n color: var(--ts-text-primary);\n}\n\n.bulk-confirm-dialog p {\n margin: 0 0 20px;\n color: var(--ts-text-secondary);\n line-height: 1.5;\n}\n\n.bulk-confirm-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n}\n\n.bulk-confirm-actions .button {\n min-width: 80px;\n background: var(--ts-bg-primary);\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .goal-bulk-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .bulk-actions-left,\n .bulk-actions-right {\n justify-content: center;\n }\n\n .bulk-actions-right {\n width: 100%;\n }\n\n .bulk-action-btn {\n flex: 1;\n justify-content: center;\n }\n}\n\n@media (max-width: 480px) {\n .bulk-actions-right {\n flex-direction: column;\n }\n\n .bulk-action-btn {\n width: 100%;\n }\n\n .bulk-confirm-dialog {\n padding: 16px;\n }\n\n .bulk-confirm-actions {\n flex-direction: column-reverse;\n }\n\n .bulk-confirm-actions .button {\n width: 100%;\n }\n}\n\n/* Dark Theme */\n[data-theme="dark"] .bulk-confirm-dialog {\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);\n}\n',"",{version:3,sources:["webpack://./src/components/goals/features/bulk-actions/GoalBulkActions.css"],names:[],mappings:"AAAA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,kBAAkB;EAClB,kCAAkC;EAClC,wCAAwC;EACxC,kBAAkB;EAClB,mBAAmB;EACnB,SAAS;AACX;;AAEA;EACE,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,SAAS;EACT,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,SAAS;EACT,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,eAAe;AACjB;;AAEA;EACE,oBAAoB;EACpB,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,kBAAkB;EAClB,yBAAyB;EACzB,wCAAwC;EACxC,gCAAgC;EAChC,6BAA6B;EAC7B,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,WAAW;EACX,YAAY;EACZ,iBAAiB;AACnB;;AAEA;EACE,2BAA2B;EAC3B,8BAA8B;EAC9B,qCAAqC;AACvC;;AAEA;EACE,YAAY;EACZ,mBAAmB;EACnB,kCAAkC;EAClC,8BAA8B;AAChC;;AAEA;EACE,cAAc;EACd,qBAAqB;AACvB;;AAEA;EACE,mBAAmB;EACnB,WAAW;AACb;;AAEA,wBAAwB;AACxB;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAS;EACT,8BAA8B;EAC9B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,eAAe;EACf,0BAA0B;AAC5B;;AAEA;EACE,gCAAgC;EAChC,kBAAkB;EAClB,aAAa;EACb,gBAAgB;EAChB,UAAU;EACV,0CAA0C;AAC5C;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,6BAA6B;AAC/B;;AAEA;EACE,gBAAgB;EAChB,+BAA+B;EAC/B,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,yBAAyB;AAC3B;;AAEA;EACE,eAAe;EACf,gCAAgC;AAClC;;AAEA,sBAAsB;AACtB;EACE;IACE,sBAAsB;IACtB,oBAAoB;EACtB;;EAEA;;IAEE,uBAAuB;EACzB;;EAEA;IACE,WAAW;EACb;;EAEA;IACE,OAAO;IACP,uBAAuB;EACzB;AACF;;AAEA;EACE;IACE,sBAAsB;EACxB;;EAEA;IACE,WAAW;EACb;;EAEA;IACE,aAAa;EACf;;EAEA;IACE,8BAA8B;EAChC;;EAEA;IACE,WAAW;EACb;AACF;;AAEA,eAAe;AACf;EACE,yCAAyC;AAC3C",sourcesContent:['.goal-bulk-actions {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n background: var(--ts-bg-secondary);\r\n border: 1px solid var(--ts-border-color);\r\n border-radius: 8px;\r\n margin-bottom: 16px;\r\n gap: 16px;\r\n}\r\n\r\n.bulk-actions-left {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.bulk-select-all {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin: 0;\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.bulk-select-all input[type="checkbox"] {\r\n margin: 0;\r\n cursor: pointer;\r\n}\r\n\r\n.bulk-select-all span {\r\n font-weight: 500;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.bulk-actions-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.bulk-action-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 6px 12px;\r\n font-size: 13px;\r\n line-height: 1.4;\r\n border-radius: 4px;\r\n transition: all 0.2s ease;\r\n border: 1px solid var(--ts-border-color);\r\n background: var(--ts-bg-primary);\r\n color: var(--ts-text-primary);\r\n cursor: pointer;\r\n font-weight: 500;\r\n}\r\n\r\n.bulk-action-btn .dashicons {\r\n font-size: 16px;\r\n width: 16px;\r\n height: 16px;\r\n line-height: 16px;\r\n}\r\n\r\n.bulk-action-btn:hover:not(:disabled) {\r\n transform: translateY(-1px);\r\n background: var(--ts-bg-hover);\r\n border-color: var(--ts-primary-color);\r\n}\r\n\r\n.bulk-action-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n background: var(--ts-bg-secondary);\r\n color: var(--ts-text-tertiary);\r\n}\r\n\r\n.bulk-action-btn.bulk-delete {\r\n color: #dc3545;\r\n border-color: #dc3545;\r\n}\r\n\r\n.bulk-action-btn.bulk-delete:hover {\r\n background: #dc3545;\r\n color: #fff;\r\n}\r\n\r\n/* Confirmation Dialog */\r\n.bulk-confirm-dialog-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 100000;\r\n backdrop-filter: blur(2px);\r\n}\r\n\r\n.bulk-confirm-dialog {\r\n background: var(--ts-bg-primary);\r\n border-radius: 8px;\r\n padding: 24px;\r\n max-width: 500px;\r\n width: 90%;\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n.bulk-confirm-dialog h3 {\r\n margin: 0 0 12px;\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--ts-text-primary);\r\n}\r\n\r\n.bulk-confirm-dialog p {\r\n margin: 0 0 20px;\r\n color: var(--ts-text-secondary);\r\n line-height: 1.5;\r\n}\r\n\r\n.bulk-confirm-actions {\r\n display: flex;\r\n gap: 8px;\r\n justify-content: flex-end;\r\n}\r\n\r\n.bulk-confirm-actions .button {\r\n min-width: 80px;\r\n background: var(--ts-bg-primary);\r\n}\r\n\r\n/* Responsive Design */\r\n@media (max-width: 768px) {\r\n .goal-bulk-actions {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .bulk-actions-left,\r\n .bulk-actions-right {\r\n justify-content: center;\r\n }\r\n\r\n .bulk-actions-right {\r\n width: 100%;\r\n }\r\n\r\n .bulk-action-btn {\r\n flex: 1;\r\n justify-content: center;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .bulk-actions-right {\r\n flex-direction: column;\r\n }\r\n\r\n .bulk-action-btn {\r\n width: 100%;\r\n }\r\n\r\n .bulk-confirm-dialog {\r\n padding: 16px;\r\n }\r\n\r\n .bulk-confirm-actions {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .bulk-confirm-actions .button {\r\n width: 100%;\r\n }\r\n}\r\n\r\n/* Dark Theme */\r\n[data-theme="dark"] .bulk-confirm-dialog {\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);\r\n}\r\n'],sourceRoot:""}]);const i=s}}]); 2 2 //# sourceMappingURL=637.js.map -
tracksure/trunk/admin/tracking-goals.js
r3472561 r3473414 321 321 // ── Timing / scroll params ────────────────────────────── 322 322 case 'time_seconds': 323 case 'time_on_page': 323 324 // ConditionBuilder stores 'time_seconds'; handlers pass 'time_on_page'. 325 // Accept both param names for forward/backward compatibility. 324 326 actualValue = eventData.time_on_page ?? eventData.time_seconds ?? ''; 325 327 break; … … 386 388 */ 387 389 function evaluateOperator(actualValue, operator, expectedValue) { 390 // Coerce both values to strings for consistent comparison. 391 // wp_localize_script serialises all values to strings, and runtime 392 // values from DOM/events might be numbers. Normalising here avoids 393 // subtle type-mismatch bugs (e.g. 180 !== "180"). 394 const a = actualValue != null ? String(actualValue) : ''; 395 const e = expectedValue != null ? String(expectedValue) : ''; 396 388 397 switch (operator) { 389 398 case 'equals': 390 return a ctualValue === expectedValue;399 return a === e; 391 400 case 'not_equals': 392 return a ctualValue !== expectedValue;401 return a !== e; 393 402 case 'contains': 394 return a ctualValue && String(actualValue).includes(expectedValue);403 return a.includes(e); 395 404 case 'not_contains': 396 return !a ctualValue || !String(actualValue).includes(expectedValue);405 return !a.includes(e); 397 406 case 'starts_with': 398 return a ctualValue && String(actualValue).startsWith(expectedValue);407 return a.startsWith(e); 399 408 case 'ends_with': 400 return a ctualValue && String(actualValue).endsWith(expectedValue);409 return a.endsWith(e); 401 410 case 'matches_regex': 402 411 case 'regex': -
tracksure/trunk/admin/tracksure-goal-constants.js
r3472561 r3473414 24 24 form_submit: ['form_submit', 'form_submission'], 25 25 scroll_depth: ['scroll'], // Maps scroll_depth trigger → scroll event 26 time_on_page: ['page_exit', 'time_on_page' ],27 engagement: ['engagement' ], // Added: engagement trigger28 video_play: ['video_play', 'video_start' ],26 time_on_page: ['page_exit', 'time_on_page', 'time_on_page_threshold'], 27 engagement: ['engagement', 'page_exit'], // engagement evaluates scroll+time from page_exit data 28 video_play: ['video_play', 'video_start', 'video_complete'], 29 29 download: ['file_download', 'download'], 30 30 outbound_link: ['outbound_click', 'external_link'], -
tracksure/trunk/includes/core/admin/class-tracksure-admin-ui.php
r3472561 r3473414 20 20 21 21 // Exit if accessed directly. 22 if ( ! defined( 'ABSPATH' )) {22 if (! defined('ABSPATH')) { 23 23 exit; 24 24 } … … 27 27 * Admin UI class. 28 28 */ 29 class TrackSure_Admin_UI { 29 class TrackSure_Admin_UI 30 { 30 31 31 32 … … 46 47 * @return TrackSure_Admin_UI 47 48 */ 48 public static function get_instance() { 49 if ( null === self::$instance ) { 49 public static function get_instance() 50 { 51 if (null === self::$instance) { 50 52 self::$instance = new self(); 51 53 } … … 56 58 * Constructor. 57 59 */ 58 private function __construct() { 59 add_action( 'admin_menu', array( $this, 'register_menu' ) ); 60 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); 60 private function __construct() 61 { 62 add_action('admin_menu', array($this, 'register_menu')); 63 add_action('admin_enqueue_scripts', array($this, 'enqueue_assets')); 61 64 } 62 65 … … 64 67 * Register admin menu. 65 68 */ 66 public function register_menu() { 69 public function register_menu() 70 { 67 71 add_menu_page( 68 __( 'TrackSure', 'tracksure'),69 __( 'TrackSure', 'tracksure'),72 __('TrackSure', 'tracksure'), 73 __('TrackSure', 'tracksure'), 70 74 'manage_options', 71 75 'tracksure', 72 array( $this, 'render_admin_page'),76 array($this, 'render_admin_page'), 73 77 'dashicons-chart-area', 74 78 56 … … 79 83 * Render admin page. 80 84 */ 81 public function render_admin_page() { 82 ?> 85 public function render_admin_page() 86 { 87 ?> 83 88 <div id="tracksure-admin-root"></div> 84 <?php89 <?php 85 90 } 86 91 … … 90 95 * @param string $hook Current admin page hook. 91 96 */ 92 public function enqueue_assets( $hook ) { 97 public function enqueue_assets($hook) 98 { 93 99 // Only load on TrackSure admin pages. 94 if ( empty( $hook ) || strpos( $hook, 'tracksure' ) === false) {100 if (empty($hook) || strpos($hook, 'tracksure') === false) { 95 101 return; 96 102 } 97 103 98 104 // Use TRACKSURE_ADMIN_DIR which points to plugin root admin folder. 99 $admin_dir = defined( 'TRACKSURE_ADMIN_DIR') ? TRACKSURE_ADMIN_DIR : TRACKSURE_PLUGIN_DIR . 'admin/';105 $admin_dir = defined('TRACKSURE_ADMIN_DIR') ? TRACKSURE_ADMIN_DIR : TRACKSURE_PLUGIN_DIR . 'admin/'; 100 106 $admin_url = defined( 101 107 'TRACKSURE_ADMIN_DIR' … … 108 114 // Check if built assets exist. 109 115 $script_file = $admin_dir . 'dist/tracksure-admin.js'; 110 if ( ! file_exists( $script_file )) {116 if (! file_exists($script_file)) { 111 117 printf( 112 118 '<div class="notice notice-error"><p>%s</p></div>', 113 esc_html__( 'TrackSure admin assets not built. Run: cd admin && npm install && npm run build', 'tracksure')119 esc_html__('TrackSure admin assets not built. Run: cd admin && npm install && npm run build', 'tracksure') 114 120 ); 115 121 return; … … 117 123 118 124 // Enqueue React and ReactDOM from WordPress core. 119 wp_enqueue_script( 'react');120 wp_enqueue_script( 'react-dom');121 wp_enqueue_script( 'wp-i18n');125 wp_enqueue_script('react'); 126 wp_enqueue_script('react-dom'); 127 wp_enqueue_script('wp-i18n'); 122 128 123 129 // Webpack code splitting: Enqueue chunks in correct order 124 130 // 1. Runtime (webpack module loader - MUST be first) 125 131 $runtime_file = $admin_dir . 'dist/runtime.js'; 126 if ( file_exists( $runtime_file )) {132 if (file_exists($runtime_file)) { 127 133 wp_enqueue_script( 128 134 'tracksure-runtime', 129 135 $admin_url . 'dist/runtime.js', 130 array( 'react', 'react-dom', 'wp-i18n'),131 filemtime( $runtime_file),136 array('react', 'react-dom', 'wp-i18n'), 137 filemtime($runtime_file), 132 138 true 133 139 ); … … 136 142 // 2. Core vendors (axios, react-query, etc. - small, frequently used) 137 143 $vendors_file = $admin_dir . 'dist/vendors.js'; 138 if ( file_exists( $vendors_file )) {144 if (file_exists($vendors_file)) { 139 145 wp_enqueue_script( 140 146 'tracksure-vendors', 141 147 $admin_url . 'dist/vendors.js', 142 array( 'react', 'react-dom', 'tracksure-runtime'),143 filemtime( $vendors_file),148 array('react', 'react-dom', 'tracksure-runtime'), 149 filemtime($vendors_file), 144 150 true 145 151 ); … … 148 154 // 3. React Router (navigation - needed immediately) 149 155 $router_file = $admin_dir . 'dist/react-router.js'; 150 if ( file_exists( $router_file )) {156 if (file_exists($router_file)) { 151 157 wp_enqueue_script( 152 158 'tracksure-react-router', 153 159 $admin_url . 'dist/react-router.js', 154 array( 'react', 'react-dom', 'tracksure-runtime', 'tracksure-vendors'),155 filemtime( $router_file),160 array('react', 'react-dom', 'tracksure-runtime', 'tracksure-vendors'), 161 filemtime($router_file), 156 162 true 157 163 ); … … 160 166 // 4. Lucide icons (tree-shaken icons - loaded upfront for UI) 161 167 $lucide_file = $admin_dir . 'dist/lucide.js'; 162 if ( file_exists( $lucide_file )) {168 if (file_exists($lucide_file)) { 163 169 wp_enqueue_script( 164 170 'tracksure-lucide', 165 171 $admin_url . 'dist/lucide.js', 166 array( 'react', 'react-dom', 'tracksure-runtime'),167 filemtime( $lucide_file),172 array('react', 'react-dom', 'tracksure-runtime'), 173 filemtime($lucide_file), 168 174 true 169 175 ); … … 172 178 // 5. Common code (shared across pages) 173 179 $common_file = $admin_dir . 'dist/common.js'; 174 if ( file_exists( $common_file )) {180 if (file_exists($common_file)) { 175 181 wp_enqueue_script( 176 182 'tracksure-common', 177 183 $admin_url . 'dist/common.js', 178 array( 'react', 'react-dom', 'tracksure-runtime', 'tracksure-vendors'),179 filemtime( $common_file),184 array('react', 'react-dom', 'tracksure-runtime', 'tracksure-vendors'), 185 filemtime($common_file), 180 186 true 181 187 ); … … 183 189 184 190 // 6. Main app (depends on all core chunks) 185 $deps = array( 'react', 'react-dom', 'tracksure-runtime');186 if ( file_exists( $vendors_file )) {191 $deps = array('react', 'react-dom', 'tracksure-runtime'); 192 if (file_exists($vendors_file)) { 187 193 $deps[] = 'tracksure-vendors'; 188 194 } 189 if ( file_exists( $router_file )) {195 if (file_exists($router_file)) { 190 196 $deps[] = 'tracksure-react-router'; 191 197 } 192 if ( file_exists( $lucide_file )) {198 if (file_exists($lucide_file)) { 193 199 $deps[] = 'tracksure-lucide'; 194 200 } 195 if ( file_exists( $common_file )) {201 if (file_exists($common_file)) { 196 202 $deps[] = 'tracksure-common'; 197 203 } … … 201 207 $admin_url . 'dist/tracksure-admin.js', 202 208 $deps, 203 filemtime( $script_file),209 filemtime($script_file), 204 210 true 205 211 ); … … 210 216 $currency_symbol = '$'; 211 217 212 if ( function_exists( 'get_woocommerce_currency' )) {218 if (function_exists('get_woocommerce_currency')) { 213 219 // WooCommerce (also covers CartFlows which uses WooCommerce). 214 220 $currency = get_woocommerce_currency(); 215 $currency_symbol = html_entity_decode( get_woocommerce_currency_symbol());216 } elseif ( class_exists( 'FluentCart\App\Helpers\Helper' )) {221 $currency_symbol = html_entity_decode(get_woocommerce_currency_symbol()); 222 } elseif (class_exists('FluentCart\App\Helpers\Helper')) { 217 223 // FluentCart. 218 224 try { 219 $fc_currency = \FluentCart\App\Helpers\Helper::shopConfig( 'currency');220 if ( ! empty( $fc_currency )) {225 $fc_currency = \FluentCart\App\Helpers\Helper::shopConfig('currency'); 226 if (! empty($fc_currency)) { 221 227 $currency = $fc_currency; 222 228 // FluentCart may provide symbol via shopConfig. 223 $fc_symbol = \FluentCart\App\Helpers\Helper::shopConfig( 'currency_sign');224 if ( ! empty( $fc_symbol )) {225 $currency_symbol = html_entity_decode( $fc_symbol);229 $fc_symbol = \FluentCart\App\Helpers\Helper::shopConfig('currency_sign'); 230 if (! empty($fc_symbol)) { 231 $currency_symbol = html_entity_decode($fc_symbol); 226 232 } 227 233 } 228 } catch ( \Exception $e) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch234 } catch (\Exception $e) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch 229 235 // Fallback to USD if FluentCart API fails. 230 236 } 231 } elseif ( function_exists( 'edd_get_currency' )) {237 } elseif (function_exists('edd_get_currency')) { 232 238 // Easy Digital Downloads. 233 239 $currency = edd_get_currency(); 234 if ( function_exists( 'edd_currency_symbol' )) {235 $currency_symbol = html_entity_decode( edd_currency_symbol( $currency ));236 } 237 } elseif ( function_exists( 'surecart' ) && class_exists( '\SureCart\Models\ApiToken' )) {240 if (function_exists('edd_currency_symbol')) { 241 $currency_symbol = html_entity_decode(edd_currency_symbol($currency)); 242 } 243 } elseif (function_exists('surecart') && class_exists('\SureCart\Models\ApiToken')) { 238 244 // SureCart — currency comes from store settings. 239 $sc_currency = get_option( 'surecart_store_currency', 'USD');240 if ( ! empty( $sc_currency )) {241 $currency = strtoupper( $sc_currency);245 $sc_currency = get_option('surecart_store_currency', 'USD'); 246 if (! empty($sc_currency)) { 247 $currency = strtoupper($sc_currency); 242 248 } 243 249 } … … 252 258 * @param string $currency_symbol Currency symbol. 253 259 */ 254 $currency = apply_filters( 'tracksure_admin_currency', $currency, $currency_symbol);260 $currency = apply_filters('tracksure_admin_currency', $currency, $currency_symbol); 255 261 256 262 $config = array( 257 'apiUrl' => rest_url( 'ts/v1'),258 'nonce' => wp_create_nonce( 'wp_rest'),263 'apiUrl' => rest_url('ts/v1'), 264 'nonce' => wp_create_nonce('wp_rest'), 259 265 'siteUrl' => get_site_url(), 260 266 'timezone' => wp_timezone_string(), 261 'dateFormat' => get_option( 'date_format'),267 'dateFormat' => get_option('date_format'), 262 268 'isEcommerce' => $this->is_ecommerce_active(), 263 269 'currency' => $currency, … … 265 271 ); 266 272 267 wp_localize_script( 'tracksure-admin', 'trackSureAdmin', $config);273 wp_localize_script('tracksure-admin', 'trackSureAdmin', $config); 268 274 269 275 // Trigger extension registration hook for UI organization. … … 278 284 * @param TrackSure_Admin_Extensions $extensions Extensions registry instance. 279 285 */ 280 do_action( 'tracksure_register_admin_extensions', $extensions_registry);286 do_action('tracksure_register_admin_extensions', $extensions_registry); 281 287 282 288 // Get registered extensions with enriched destination/integration metadata from Managers. 283 $extensions_data = $this->get_extensions_with_manager_data( $extensions_registry);284 285 wp_localize_script( 'tracksure-admin', 'trackSureExtensions', $extensions_data);289 $extensions_data = $this->get_extensions_with_manager_data($extensions_registry); 290 291 wp_localize_script('tracksure-admin', 'trackSureExtensions', $extensions_data); 286 292 287 293 /** … … 292 298 * @param string $hook Current admin page hook. 293 299 */ 294 do_action( 'tracksure_admin_enqueue_scripts', $hook);300 do_action('tracksure_admin_enqueue_scripts', $hook); 295 301 } 296 302 … … 311 317 * @return bool True if any e-commerce platform is active. 312 318 */ 313 private function is_ecommerce_active() { 314 return class_exists( 'WooCommerce' ) || 315 class_exists( 'Easy_Digital_Downloads' ) || 316 class_exists( 'SureCart' ) || 317 class_exists( 'FluentCart\\App\\App' ) || 318 class_exists( 'Cartflows_Loader' ); 319 private function is_ecommerce_active() 320 { 321 return class_exists('WooCommerce') || 322 class_exists('Easy_Digital_Downloads') || 323 class_exists('SureCart') || defined('SURECART_PLUGIN_FILE') || 324 class_exists('FluentCart\\App\\App') || 325 class_exists('Cartflows_Loader') || class_exists('FunnelKit_Funnel_Builder_Loader'); 319 326 } 320 327 … … 331 338 * @return array Extensions data for React. 332 339 */ 333 private function get_extensions_with_manager_data( $registry ) { 340 private function get_extensions_with_manager_data($registry) 341 { 334 342 $core = TrackSure_Core::get_instance(); 335 $destinations_manager = $core->get_service( 'destinations_manager');336 $integrations_manager = $core->get_service( 'integrations_manager');343 $destinations_manager = $core->get_service('destinations_manager'); 344 $integrations_manager = $core->get_service('integrations_manager'); 337 345 338 346 // Get base extensions (with settings groups). … … 346 354 347 355 // Enrich each extension with Manager data. 348 foreach ( $extensions as &$extension) {356 foreach ($extensions as &$extension) { 349 357 // Determine extension's enabled_key prefix. 350 358 $extension_prefix = ''; 351 if ( $extension['id'] === 'tracksure-free') {359 if ($extension['id'] === 'tracksure-free') { 352 360 $extension_prefix = 'tracksure_free_'; 353 } elseif ( $extension['id'] === 'tracksure-pro') {361 } elseif ($extension['id'] === 'tracksure-pro') { 354 362 // Pro destinations use 'tracksure_google_ads_enabled', 'tracksure_tiktok_enabled', etc. 355 363 // Pro integrations use 'tracksure_edd_enabled', etc. … … 359 367 // Auto-assign destinations to this extension by matching enabled_key prefix. 360 368 $extension['destinations'] = array(); 361 if ( $extension_prefix && $destinations_manager) {362 foreach ( $all_destinations as $dest) {369 if ($extension_prefix && $destinations_manager) { 370 foreach ($all_destinations as $dest) { 363 371 // Match destinations to extension by enabled_key prefix. 364 372 // Skip Free destinations (tracksure_free_*) when processing Pro. 365 if ( strpos( $dest['enabled_key'], $extension_prefix ) === 0) {366 if ( $extension['id'] === 'tracksure-pro' && strpos( $dest['enabled_key'], 'tracksure_free_' ) === 0) {373 if (strpos($dest['enabled_key'], $extension_prefix) === 0) { 374 if ($extension['id'] === 'tracksure-pro' && strpos($dest['enabled_key'], 'tracksure_free_') === 0) { 367 375 continue; // Skip Free destinations in Pro. 368 376 } 369 $extension['destinations'][] = $this->format_destination_for_react( $dest);377 $extension['destinations'][] = $this->format_destination_for_react($dest); 370 378 } 371 379 } … … 374 382 // Auto-assign integrations to this extension by matching enabled_key prefix. 375 383 $extension['integrations'] = array(); 376 if ( $extension_prefix && $integrations_manager) {377 foreach ( $all_integrations as $int) {384 if ($extension_prefix && $integrations_manager) { 385 foreach ($all_integrations as $int) { 378 386 // Match integrations to extension by enabled_key prefix. 379 387 // Skip Free integrations when processing Pro. 380 388 // Special case: woo_integration_enabled and fluentcart_integration_enabled are Free 381 $is_free_integration = strpos( $int['enabled_key'], 'tracksure_free_') === 0389 $is_free_integration = strpos($int['enabled_key'], 'tracksure_free_') === 0 382 390 || $int['enabled_key'] === 'woo_integration_enabled' 383 391 || $int['enabled_key'] === 'fluentcart_integration_enabled'; 384 392 385 if ( $extension['id'] === 'tracksure-free') {393 if ($extension['id'] === 'tracksure-free') { 386 394 // Free: Only tracksure_free_* or old naming (woo_*, fluentcart_*) 387 if ( $is_free_integration) {388 $extension['integrations'][] = $this->format_integration_for_react( $int, $integrations_manager);395 if ($is_free_integration) { 396 $extension['integrations'][] = $this->format_integration_for_react($int, $integrations_manager); 389 397 } 390 } elseif ( $extension['id'] === 'tracksure-pro') {398 } elseif ($extension['id'] === 'tracksure-pro') { 391 399 // Pro: Only tracksure_* (but NOT tracksure_free_*) 392 if ( strpos( $int['enabled_key'], 'tracksure_' ) === 0 && ! $is_free_integration) {393 $extension['integrations'][] = $this->format_integration_for_react( $int, $integrations_manager);400 if (strpos($int['enabled_key'], 'tracksure_') === 0 && ! $is_free_integration) { 401 $extension['integrations'][] = $this->format_integration_for_react($int, $integrations_manager); 394 402 } 395 403 } … … 410 418 * @return array Formatted for React. 411 419 */ 412 private function format_destination_for_react( $dest ) { 420 private function format_destination_for_react($dest) 421 { 413 422 return array( 414 423 'id' => $dest['id'], 415 424 'name' => $dest['name'], 416 'description' => isset( $dest['description']) ? $dest['description'] : '',417 'icon' => isset( $dest['icon']) ? $dest['icon'] : 'Target',418 'order' => isset( $dest['order']) ? $dest['order'] : 999,425 'description' => isset($dest['description']) ? $dest['description'] : '', 426 'icon' => isset($dest['icon']) ? $dest['icon'] : 'Target', 427 'order' => isset($dest['order']) ? $dest['order'] : 999, 419 428 'enabledKey' => $dest['enabled_key'], 420 'custom_config' => isset( $dest['custom_config']) ? $dest['custom_config'] : null,421 'fields' => $this->enrich_fields( isset( $dest['settings_fields'] ) ? $dest['settings_fields'] : array(), TrackSure_Settings_Schema::get_all_settings()),429 'custom_config' => isset($dest['custom_config']) ? $dest['custom_config'] : null, 430 'fields' => $this->enrich_fields(isset($dest['settings_fields']) ? $dest['settings_fields'] : array(), TrackSure_Settings_Schema::get_all_settings()), 422 431 ); 423 432 } … … 434 443 * @return array Formatted for React. 435 444 */ 436 private function format_integration_for_react( $int, $integrations_manager = null ) { 445 private function format_integration_for_react($int, $integrations_manager = null) 446 { 437 447 // Resolve auto_detect path to boolean — React only needs the result, not the file path. 438 448 $detected = false; 439 if ( $integrations_manager && ! empty( $int['auto_detect'] )) {440 $detected = $integrations_manager->is_plugin_active( $int['auto_detect']);449 if ($integrations_manager && ! empty($int['auto_detect'])) { 450 $detected = $integrations_manager->is_plugin_active($int['auto_detect']); 441 451 } 442 452 … … 444 454 'id' => $int['id'], 445 455 'name' => $int['name'], 446 'description' => isset( $int['description']) ? $int['description'] : '',447 'icon' => isset( $int['icon']) ? $int['icon'] : 'Puzzle',448 'order' => isset( $int['order']) ? $int['order'] : 999,456 'description' => isset($int['description']) ? $int['description'] : '', 457 'icon' => isset($int['icon']) ? $int['icon'] : 'Puzzle', 458 'order' => isset($int['order']) ? $int['order'] : 999, 449 459 'enabledKey' => $int['enabled_key'], 450 460 'detected' => $detected, 451 'events' => isset( $int['tracked_events']) ? $int['tracked_events'] : array(),452 'fields' => $this->enrich_fields( isset( $int['settings_fields'] ) ? $int['settings_fields'] : array(), TrackSure_Settings_Schema::get_all_settings()),461 'events' => isset($int['tracked_events']) ? $int['tracked_events'] : array(), 462 'fields' => $this->enrich_fields(isset($int['settings_fields']) ? $int['settings_fields'] : array(), TrackSure_Settings_Schema::get_all_settings()), 453 463 ); 454 464 } … … 461 471 * @return array Enriched field objects. 462 472 */ 463 private function enrich_fields( $field_keys, $schema ) { 473 private function enrich_fields($field_keys, $schema) 474 { 464 475 $enriched = array(); 465 476 466 foreach ( $field_keys as $key) {467 if ( ! isset( $schema[ $key ] )) {477 foreach ($field_keys as $key) { 478 if (! isset($schema[$key])) { 468 479 continue; 469 480 } 470 481 471 $field = $schema[ $key];472 $type = $this->map_field_type( $field['type'], $field);482 $field = $schema[$key]; 483 $type = $this->map_field_type($field['type'], $field); 473 484 474 485 $enriched_field = array( … … 480 491 ); 481 492 482 if ( $type === 'select' && isset( $field['options'] )) {483 $enriched_field['options'] = $this->format_options( $field['options']);484 } 485 486 if ( $type === 'number') {487 if ( isset( $field['min'] )) {493 if ($type === 'select' && isset($field['options'])) { 494 $enriched_field['options'] = $this->format_options($field['options']); 495 } 496 497 if ($type === 'number') { 498 if (isset($field['min'])) { 488 499 $enriched_field['min'] = $field['min']; 489 500 } 490 if ( isset( $field['max'] )) {501 if (isset($field['max'])) { 491 502 $enriched_field['max'] = $field['max']; 492 503 } 493 504 } 494 505 495 if ( isset( $field['placeholder'] )) {506 if (isset($field['placeholder'])) { 496 507 $enriched_field['placeholder'] = $field['placeholder']; 497 508 } 498 509 499 if ( isset( $field['sensitive'] ) && $field['sensitive']) {510 if (isset($field['sensitive']) && $field['sensitive']) { 500 511 $enriched_field['sensitive'] = true; 501 512 } … … 514 525 * @return string React input type. 515 526 */ 516 private function map_field_type( $type, $field = array() ) { 517 if ( isset( $field['options'] ) ) { 527 private function map_field_type($type, $field = array()) 528 { 529 if (isset($field['options'])) { 518 530 return 'select'; 519 531 } 520 if ( isset( $field['sensitive'] ) && $field['sensitive']) {532 if (isset($field['sensitive']) && $field['sensitive']) { 521 533 return 'password'; 522 534 } … … 529 541 ); 530 542 531 return $map[ $type] ?? 'text';543 return $map[$type] ?? 'text'; 532 544 } 533 545 … … 538 550 * @return array Formatted options. 539 551 */ 540 private function format_options( $options ) { 552 private function format_options($options) 553 { 541 554 $formatted = array(); 542 foreach ( $options as $value => $label) {555 foreach ($options as $value => $label) { 543 556 $formatted[] = array( 544 557 'value' => $value, -
tracksure/trunk/includes/core/api/class-tracksure-rest-goals-controller.php
r3472561 r3473414 53 53 54 54 // Exit if accessed directly. 55 if ( ! defined( 'ABSPATH' )) {55 if (! defined('ABSPATH')) { 56 56 exit; 57 57 } … … 64 64 * @since 1.0.0 65 65 */ 66 class TrackSure_REST_Goals_Controller extends TrackSure_REST_Controller { 66 class TrackSure_REST_Goals_Controller extends TrackSure_REST_Controller 67 { 67 68 68 69 … … 85 86 * @since 1.0.0 86 87 */ 87 public function __construct() { 88 public function __construct() 89 { 88 90 $core = TrackSure_Core::get_instance(); 89 $this->db = $core->get_service( 'db');91 $this->db = $core->get_service('db'); 90 92 } 91 93 … … 101 103 * @return void 102 104 */ 103 public function register_routes() { 105 public function register_routes() 106 { 104 107 // GET /goals - List all goals. 105 108 register_rest_route( … … 108 111 array( 109 112 'methods' => WP_REST_Server::READABLE, 110 'callback' => array( $this, 'get_goals'),111 'permission_callback' => array( $this, 'check_admin_permission'),113 'callback' => array($this, 'get_goals'), 114 'permission_callback' => array($this, 'check_admin_permission'), 112 115 ) 113 116 ); … … 119 122 array( 120 123 'methods' => WP_REST_Server::CREATABLE, 121 'callback' => array( $this, 'create_goal'),122 'permission_callback' => array( $this, 'check_admin_permission'),124 'callback' => array($this, 'create_goal'), 125 'permission_callback' => array($this, 'check_admin_permission'), 123 126 'args' => $this->get_goal_schema(), 124 127 ) … … 131 134 array( 132 135 'methods' => WP_REST_Server::EDITABLE, 133 'callback' => array( $this, 'update_goal'),134 'permission_callback' => array( $this, 'check_admin_permission'),135 'args' => $this->get_goal_schema( true),136 'callback' => array($this, 'update_goal'), 137 'permission_callback' => array($this, 'check_admin_permission'), 138 'args' => $this->get_goal_schema(true), 136 139 ) 137 140 ); … … 143 146 array( 144 147 'methods' => WP_REST_Server::DELETABLE, 145 'callback' => array( $this, 'delete_goal'),146 'permission_callback' => array( $this, 'check_admin_permission'),148 'callback' => array($this, 'delete_goal'), 149 'permission_callback' => array($this, 'check_admin_permission'), 147 150 ) 148 151 ); … … 154 157 array( 155 158 'methods' => WP_REST_Server::READABLE, 156 'callback' => array( $this, 'get_goal_performance'),157 'permission_callback' => array( $this, 'check_admin_permission'),159 'callback' => array($this, 'get_goal_performance'), 160 'permission_callback' => array($this, 'check_admin_permission'), 158 161 'args' => array( 159 162 'date_start' => array( … … 177 180 array( 178 181 'methods' => WP_REST_Server::READABLE, 179 'callback' => array( $this, 'get_batch_performance'),180 'permission_callback' => array( $this, 'check_admin_permission'),182 'callback' => array($this, 'get_batch_performance'), 183 'permission_callback' => array($this, 'check_admin_permission'), 181 184 'args' => array( 182 185 'goal_ids' => array( … … 207 210 array( 208 211 'methods' => WP_REST_Server::READABLE, 209 'callback' => array( $this, 'get_goal_timeline'),210 'permission_callback' => array( $this, 'check_admin_permission'),212 'callback' => array($this, 'get_goal_timeline'), 213 'permission_callback' => array($this, 'check_admin_permission'), 211 214 'args' => array( 212 215 'page' => array( … … 241 244 array( 242 245 'methods' => WP_REST_Server::READABLE, 243 'callback' => array( $this, 'get_goal_sources'),244 'permission_callback' => array( $this, 'check_admin_permission'),246 'callback' => array($this, 'get_goal_sources'), 247 'permission_callback' => array($this, 'check_admin_permission'), 245 248 'args' => array( 246 249 'attribution_model' => array( 247 250 'type' => 'string', 248 'enum' => array( 'first_touch', 'last_touch', 'linear', 'time_decay', 'position_based'),251 'enum' => array('first_touch', 'last_touch', 'linear', 'time_decay', 'position_based'), 249 252 'default' => 'last_touch', 250 253 ), … … 269 272 array( 270 273 'methods' => WP_REST_Server::READABLE, 271 'callback' => array( $this, 'get_goal_devices'),272 'permission_callback' => array( $this, 'check_admin_permission'),274 'callback' => array($this, 'get_goal_devices'), 275 'permission_callback' => array($this, 'check_admin_permission'), 273 276 'args' => array( 274 277 'date_start' => array( … … 292 295 array( 293 296 'methods' => WP_REST_Server::READABLE, 294 'callback' => array( $this, 'get_goals_overview'),295 'permission_callback' => array( $this, 'check_admin_permission'),297 'callback' => array($this, 'get_goals_overview'), 298 'permission_callback' => array($this, 'check_admin_permission'), 296 299 'args' => array( 297 300 'start_date' => array( … … 299 302 'format' => 'date', 300 303 'required' => false, 301 'description' => __( 'Start date for the reporting period (YYYY-MM-DD)', 'tracksure'),304 'description' => __('Start date for the reporting period (YYYY-MM-DD)', 'tracksure'), 302 305 ), 303 306 'end_date' => array( … … 305 308 'format' => 'date', 306 309 'required' => false, 307 'description' => __( 'End date for the reporting period (YYYY-MM-DD)', 'tracksure'),310 'description' => __('End date for the reporting period (YYYY-MM-DD)', 'tracksure'), 308 311 ), 309 312 ), … … 324 327 * @return WP_REST_Response|WP_Error Response with goals array or error. 325 328 */ 326 public function get_goals( $request ) { 329 public function get_goals($request) 330 { 327 331 global $wpdb; 328 332 … … 353 357 354 358 // Parse conditions JSON, trigger_config JSON, and type-cast values. 355 foreach ( $goals as $goal) {356 if ( ! empty( $goal->conditions )) {357 $goal->conditions = json_decode( $goal->conditions, true);359 foreach ($goals as $goal) { 360 if (! empty($goal->conditions)) { 361 $goal->conditions = json_decode($goal->conditions, true); 358 362 } else { 359 363 $goal->conditions = array(); 360 364 } 361 if ( ! empty( $goal->trigger_config )) {362 $decoded = json_decode( $goal->trigger_config);365 if (! empty($goal->trigger_config)) { 366 $decoded = json_decode($goal->trigger_config); 363 367 $goal->trigger_config = $decoded !== null ? $decoded : null; 364 368 } else { … … 366 370 } 367 371 // match_logic is a plain string ('all' or 'any'), NOT JSON. 368 if ( empty( $goal->match_logic ) || ! in_array( $goal->match_logic, array( 'all', 'any' ), true )) {372 if (empty($goal->match_logic) || ! in_array($goal->match_logic, array('all', 'any'), true)) { 369 373 $goal->match_logic = 'all'; 370 374 } 371 $goal->cooldown_minutes = (int) ( $goal->cooldown_minutes ?? 0);375 $goal->cooldown_minutes = (int) ($goal->cooldown_minutes ?? 0); 372 376 } 373 377 … … 376 380 array( 377 381 'goals' => $goals, 378 'total' => count( $goals),382 'total' => count($goals), 379 383 ) 380 384 ); … … 393 397 * @return WP_REST_Response|WP_Error Success response with created goal or error. 394 398 */ 395 public function create_goal( $request ) { 399 public function create_goal($request) 400 { 396 401 global $wpdb; 397 402 … … 399 404 $validator = new TrackSure_Goal_Validator(); 400 405 $goal_data = array( 401 'name' => $request->get_param( 'name'),402 'description' => $request->get_param( 'description'),403 'event_name' => $request->get_param( 'event_name'),404 'trigger_type' => $request->get_param( 'trigger_type'),405 'conditions' => $request->get_param( 'conditions'),406 'match_logic' => $request->get_param( 'match_logic'),407 'value_type' => $request->get_param( 'value_type'),408 'fixed_value' => $request->get_param( 'fixed_value' ) ?? $request->get_param( 'value'),409 'trigger_config' => $request->get_param( 'trigger_config'),410 'frequency' => $request->get_param( 'frequency'),411 'cooldown_minutes' => $request->get_param( 'cooldown_minutes'),412 'is_active' => $request->get_param( 'is_active'),413 ); 414 415 $validation = $validator->validate_and_prepare( $goal_data);416 417 if ( ! $validation['valid']) {406 'name' => $request->get_param('name'), 407 'description' => $request->get_param('description'), 408 'event_name' => $request->get_param('event_name'), 409 'trigger_type' => $request->get_param('trigger_type'), 410 'conditions' => $request->get_param('conditions'), 411 'match_logic' => $request->get_param('match_logic'), 412 'value_type' => $request->get_param('value_type'), 413 'fixed_value' => $request->get_param('fixed_value') ?? $request->get_param('value'), 414 'trigger_config' => $request->get_param('trigger_config'), 415 'frequency' => $request->get_param('frequency'), 416 'cooldown_minutes' => $request->get_param('cooldown_minutes'), 417 'is_active' => $request->get_param('is_active'), 418 ); 419 420 $validation = $validator->validate_and_prepare($goal_data); 421 422 if (! $validation['valid']) { 418 423 return new WP_Error( 419 424 'invalid_goal_data', 420 implode( ' ', $validation['errors']),421 array( 'status' => 400)425 implode(' ', $validation['errors']), 426 array('status' => 400) 422 427 ); 423 428 } … … 427 432 // Use validated and sanitized data. 428 433 $data = $validation['data']; 429 $data['created_at'] = gmdate( 'Y-m-d H:i:s');430 $data['updated_at'] = gmdate( 'Y-m-d H:i:s');434 $data['created_at'] = gmdate('Y-m-d H:i:s'); 435 $data['updated_at'] = gmdate('Y-m-d H:i:s'); 431 436 432 437 /** … … 440 445 * @param WP_REST_Request $request Original REST request object. 441 446 */ 442 $data = apply_filters( 'tracksure_before_create_goal', $data, $request);447 $data = apply_filters('tracksure_before_create_goal', $data, $request); 443 448 444 449 // Determine formats dynamically based on data keys. 445 450 $formats = array(); 446 foreach ( $data as $key => $value) {447 if ( in_array( $key, array( 'is_active', 'cooldown_minutes' ), true )) {451 foreach ($data as $key => $value) { 452 if (in_array($key, array('is_active', 'cooldown_minutes'), true)) { 448 453 $formats[] = '%d'; 449 } elseif ( $key === 'fixed_value') {454 } elseif ($key === 'fixed_value') { 450 455 $formats[] = '%f'; 451 456 } else { … … 454 459 } 455 460 456 $result = $wpdb->insert( $table, $data, $formats);457 458 if ( ! $result) {459 if ( defined( 'WP_DEBUG' ) && WP_DEBUG) {460 461 error_log( '[TrackSure] Goal creation failed. Last error: ' . $wpdb->last_error);461 $result = $wpdb->insert($table, $data, $formats); 462 463 if (! $result) { 464 if (defined('WP_DEBUG') && WP_DEBUG) { 465 466 error_log('[TrackSure] Goal creation failed. Last error: ' . $wpdb->last_error); 462 467 } 463 468 464 469 return new WP_Error( 465 470 'goal_create_failed', 466 $wpdb->last_error ? $wpdb->last_error : __( 'Failed to create goal.', 'tracksure'),467 array( 'status' => 500)471 $wpdb->last_error ? $wpdb->last_error : __('Failed to create goal.', 'tracksure'), 472 array('status' => 500) 468 473 ); 469 474 } … … 480 485 481 486 // Decode JSON fields. 482 $goal->conditions = json_decode( $goal->conditions, true);483 if ( ! empty( $goal->trigger_config )) {484 $goal->trigger_config = json_decode( $goal->trigger_config, true);487 $goal->conditions = json_decode($goal->conditions, true); 488 if (! empty($goal->trigger_config)) { 489 $goal->trigger_config = json_decode($goal->trigger_config, true); 485 490 } 486 491 $goal->is_active = (bool) $goal->is_active; 487 if ( isset( $goal->fixed_value ) && $goal->fixed_value) {492 if (isset($goal->fixed_value) && $goal->fixed_value) { 488 493 $goal->fixed_value = (float) $goal->fixed_value; 489 494 } 490 495 491 496 // Sanitize output. 492 $goal->name = esc_html( $goal->name);493 $goal->description = ! empty( $goal->description ) ? esc_html( $goal->description) : '';497 $goal->name = esc_html($goal->name); 498 $goal->description = ! empty($goal->description) ? esc_html($goal->description) : ''; 494 499 495 500 // Clear goal caches. … … 505 510 * @param WP_REST_Request $request Original REST request. 506 511 */ 507 do_action( 'tracksure_after_create_goal', $goal_id, $goal, $request);508 509 return $this->prepare_success( $goal, 201);512 do_action('tracksure_after_create_goal', $goal_id, $goal, $request); 513 514 return $this->prepare_success($goal, 201); 510 515 } 511 516 … … 522 527 * @return WP_REST_Response|WP_Error Success response with updated goal or error. 523 528 */ 524 public function update_goal( $request ) { 529 public function update_goal($request) 530 { 525 531 global $wpdb; 526 532 527 533 $table = $wpdb->prefix . 'tracksure_goals'; 528 $goal_id = absint( $request->get_param( 'id' ));534 $goal_id = absint($request->get_param('id')); 529 535 530 536 // Check if goal exists. … … 538 544 // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared 539 545 540 if ( ! $exists) {546 if (! $exists) { 541 547 return new WP_Error( 542 548 'goal_not_found', 543 __( 'Goal not found.', 'tracksure'),544 array( 'status' => 404)549 __('Goal not found.', 'tracksure'), 550 array('status' => 404) 545 551 ); 546 552 } … … 549 555 $validator = new TrackSure_Goal_Validator(); 550 556 $goal_data = array( 551 'name' => $request->get_param( 'name'),552 'description' => $request->get_param( 'description'),553 'event_name' => $request->get_param( 'event_name'),554 'trigger_type' => $request->get_param( 'trigger_type'),555 'conditions' => $request->get_param( 'conditions'),556 'match_logic' => $request->get_param( 'match_logic'),557 'value_type' => $request->get_param( 'value_type'),558 'fixed_value' => $request->get_param( 'fixed_value' ) ?? $request->get_param( 'value'),559 'trigger_config' => $request->get_param( 'trigger_config'),560 'frequency' => $request->get_param( 'frequency'),561 'cooldown_minutes' => $request->get_param( 'cooldown_minutes'),562 'is_active' => $request->get_param( 'is_active'),563 ); 564 565 $validation = $validator->validate_and_prepare( $goal_data);566 567 if ( ! $validation['valid']) {557 'name' => $request->get_param('name'), 558 'description' => $request->get_param('description'), 559 'event_name' => $request->get_param('event_name'), 560 'trigger_type' => $request->get_param('trigger_type'), 561 'conditions' => $request->get_param('conditions'), 562 'match_logic' => $request->get_param('match_logic'), 563 'value_type' => $request->get_param('value_type'), 564 'fixed_value' => $request->get_param('fixed_value') ?? $request->get_param('value'), 565 'trigger_config' => $request->get_param('trigger_config'), 566 'frequency' => $request->get_param('frequency'), 567 'cooldown_minutes' => $request->get_param('cooldown_minutes'), 568 'is_active' => $request->get_param('is_active'), 569 ); 570 571 $validation = $validator->validate_and_prepare($goal_data); 572 573 if (! $validation['valid']) { 568 574 return new WP_Error( 569 575 'invalid_goal_data', 570 implode( ' ', $validation['errors']),571 array( 'status' => 400)576 implode(' ', $validation['errors']), 577 array('status' => 400) 572 578 ); 573 579 } … … 575 581 // Use validated and sanitized data. 576 582 $data = $validation['data']; 577 $data['updated_at'] = current_time( 'mysql', true);583 $data['updated_at'] = current_time('mysql', true); 578 584 579 585 /** … … 586 592 * @param WP_REST_Request $request Original REST request object. 587 593 */ 588 $data = apply_filters( 'tracksure_before_update_goal', $data, $goal_id, $request);589 590 $result = $wpdb->update( $table, $data, array( 'goal_id' => $goal_id ));591 592 if ( $result === false) {594 $data = apply_filters('tracksure_before_update_goal', $data, $goal_id, $request); 595 596 $result = $wpdb->update($table, $data, array('goal_id' => $goal_id)); 597 598 if ($result === false) { 593 599 return new WP_Error( 594 600 'goal_update_failed', 595 __( 'Failed to update goal.', 'tracksure'),596 array( 'status' => 500)601 __('Failed to update goal.', 'tracksure'), 602 array('status' => 500) 597 603 ); 598 604 } … … 608 614 609 615 // Decode JSON fields. 610 $goal->conditions = json_decode( $goal->conditions, true);611 if ( ! empty( $goal->trigger_config )) {612 $goal->trigger_config = json_decode( $goal->trigger_config, true);616 $goal->conditions = json_decode($goal->conditions, true); 617 if (! empty($goal->trigger_config)) { 618 $goal->trigger_config = json_decode($goal->trigger_config, true); 613 619 } 614 620 $goal->is_active = (bool) $goal->is_active; 615 if ( $goal->fixed_value) {621 if ($goal->fixed_value) { 616 622 $goal->fixed_value = (float) $goal->fixed_value; 617 623 } 618 624 619 625 // Sanitize output. 620 $goal->name = esc_html( $goal->name);621 $goal->description = ! empty( $goal->description ) ? esc_html( $goal->description) : '';626 $goal->name = esc_html($goal->name); 627 $goal->description = ! empty($goal->description) ? esc_html($goal->description) : ''; 622 628 623 629 // Clear goal caches. … … 633 639 * @param WP_REST_Request $request Original REST request. 634 640 */ 635 do_action( 'tracksure_after_update_goal', $goal_id, $goal, $request);641 do_action('tracksure_after_update_goal', $goal_id, $goal, $request); 636 642 637 643 return $this->prepare_success( 638 644 array( 639 645 'goal' => $goal, 640 'message' => __( 'Goal updated successfully.', 'tracksure'),646 'message' => __('Goal updated successfully.', 'tracksure'), 641 647 ) 642 648 ); … … 655 661 * @return WP_REST_Response|WP_Error Success message or error. 656 662 */ 657 public function delete_goal( $request ) { 663 public function delete_goal($request) 664 { 658 665 global $wpdb; 659 666 660 667 $table = $wpdb->prefix . 'tracksure_goals'; 661 $goal_id = absint( $request->get_param( 'id' ));668 $goal_id = absint($request->get_param('id')); 662 669 663 670 /** … … 670 677 * @param int $goal_id Goal ID being deleted. 671 678 */ 672 do_action( 'tracksure_before_delete_goal', $goal_id);673 674 $result = $wpdb->delete( $table, array( 'goal_id' => $goal_id ), array( '%d' ));675 676 if ( ! $result) {679 do_action('tracksure_before_delete_goal', $goal_id); 680 681 $result = $wpdb->delete($table, array('goal_id' => $goal_id), array('%d')); 682 683 if (! $result) { 677 684 return new WP_Error( 678 685 'goal_delete_failed', 679 __( 'Failed to delete goal. Goal may not exist.', 'tracksure'),680 array( 'status' => 500)686 __('Failed to delete goal. Goal may not exist.', 'tracksure'), 687 array('status' => 500) 681 688 ); 682 689 } … … 692 699 * @param int $goal_id Goal ID that was deleted. 693 700 */ 694 do_action( 'tracksure_after_delete_goal', $goal_id);701 do_action('tracksure_after_delete_goal', $goal_id); 695 702 696 703 return $this->prepare_success( 697 704 array( 698 'message' => __( 'Goal deleted successfully.', 'tracksure'),705 'message' => __('Goal deleted successfully.', 'tracksure'), 699 706 ) 700 707 ); … … 707 714 * @return WP_REST_Response 708 715 */ 709 public function get_goal_performance( $request ) { 716 public function get_goal_performance($request) 717 { 710 718 global $wpdb; 711 719 712 $goal_id = absint( $request->get_param( 'id' ));720 $goal_id = absint($request->get_param('id')); 713 721 714 722 // Accept both parameter naming conventions for compatibility. 715 $date_start = sanitize_text_field( $request->get_param( 'date_start' ))716 ? sanitize_text_field( $request->get_param( 'date_start' ))717 : sanitize_text_field( $request->get_param( 'start_date' ));718 $date_end = sanitize_text_field( $request->get_param( 'date_end' ))719 ? sanitize_text_field( $request->get_param( 'date_end' ))720 : sanitize_text_field( $request->get_param( 'end_date' ));721 722 // Check cache first ( 5minute TTL).723 $cache_key = 'tracksure_goal_perf_' . $goal_id . '_' . md5( $date_start . $date_end);724 $cached = get_transient( $cache_key);725 726 if ( $cached !== false) {727 return $this->prepare_success( $cached);723 $date_start = sanitize_text_field($request->get_param('date_start')) 724 ? sanitize_text_field($request->get_param('date_start')) 725 : sanitize_text_field($request->get_param('start_date')); 726 $date_end = sanitize_text_field($request->get_param('date_end')) 727 ? sanitize_text_field($request->get_param('date_end')) 728 : sanitize_text_field($request->get_param('end_date')); 729 730 // Check cache first (1 minute TTL). 731 $cache_key = 'tracksure_goal_perf_' . $goal_id . '_' . md5($date_start . $date_end); 732 $cached = get_transient($cache_key); 733 734 if ($cached !== false) { 735 return $this->prepare_success($cached); 728 736 } 729 737 … … 761 769 762 770 763 $conversion_rate = $total_sessions > 0 ? round( ( $performance->conversions / $total_sessions ) * 100, 2) : 0;771 $conversion_rate = $total_sessions > 0 ? round(($performance->conversions / $total_sessions) * 100, 2) : 0; 764 772 765 773 $result = array( … … 770 778 ); 771 779 772 // Cache for 5 minutes.773 set_transient( $cache_key, $result, 5 * MINUTE_IN_SECONDS);774 775 return $this->prepare_success( $result);780 // Cache for 1 minute. 781 set_transient($cache_key, $result, MINUTE_IN_SECONDS); 782 783 return $this->prepare_success($result); 776 784 } 777 785 … … 785 793 * @return WP_REST_Response 786 794 */ 787 public function get_batch_performance( $request ) { 795 public function get_batch_performance($request) 796 { 788 797 global $wpdb; 789 798 790 799 // Parse parameters (accept both naming conventions). 791 $goal_ids_param = $request->get_param( 'goal_ids');792 $date_start = $request->get_param( 'date_start' ) ? $request->get_param( 'date_start' ) : $request->get_param( 'start_date');793 $date_end = $request->get_param( 'date_end' ) ? $request->get_param( 'date_end' ) : $request->get_param( 'end_date');800 $goal_ids_param = $request->get_param('goal_ids'); 801 $date_start = $request->get_param('date_start') ? $request->get_param('date_start') : $request->get_param('start_date'); 802 $date_end = $request->get_param('date_end') ? $request->get_param('date_end') : $request->get_param('end_date'); 794 803 795 804 // Validate goal_ids. 796 if ( empty( $goal_ids_param )) {805 if (empty($goal_ids_param)) { 797 806 return new WP_Error( 798 807 'missing_goal_ids', 799 __( 'goal_ids parameter is required', 'tracksure'),800 array( 'status' => 400)808 __('goal_ids parameter is required', 'tracksure'), 809 array('status' => 400) 801 810 ); 802 811 } 803 812 804 // Check cache first (5 minute TTL). 805 $cache_key = 'tracksure_goals_perf_' . md5( $goal_ids_param . $date_start . $date_end ); 806 $cached = get_transient( $cache_key ); 807 808 if ( $cached !== false ) { 809 return $this->prepare_success( $cached ); 810 } 811 812 $goal_ids = array_map( 'intval', explode( ',', $goal_ids_param ) ); 813 $goal_ids = array_filter( $goal_ids ); // Remove zeros 814 815 if ( empty( $goal_ids ) ) { 813 // Check cache first (1 minute TTL). 814 $cache_key = 'tracksure_goals_perf_' . md5($goal_ids_param . $date_start . $date_end); 815 $cached = get_transient($cache_key); 816 817 if ($cached !== false) { 818 // Normalize: legacy caches stored just the performance map 819 // without the 'performance' wrapper key. 820 if (! isset($cached['performance'])) { 821 $cached = array('performance' => $cached); 822 } 823 return $this->prepare_success($cached); 824 } 825 826 $goal_ids = array_map('intval', explode(',', $goal_ids_param)); 827 $goal_ids = array_filter($goal_ids); // Remove zeros 828 829 if (empty($goal_ids)) { 816 830 return new WP_Error( 817 831 'invalid_goal_ids', 818 __( 'No valid goal IDs provided after parsing', 'tracksure'),819 array( 'status' => 400)832 __('No valid goal IDs provided after parsing', 'tracksure'), 833 array('status' => 400) 820 834 ); 821 835 } 822 836 823 837 // Default to last 30 days if dates not provided. 824 if ( empty( $date_start )) {825 $date_start = gmdate( 'Y-m-d', strtotime( '-30 days' ));826 } 827 if ( empty( $date_end )) {828 $date_end = gmdate( 'Y-m-d');838 if (empty($date_start)) { 839 $date_start = gmdate('Y-m-d', strtotime('-30 days')); 840 } 841 if (empty($date_end)) { 842 $date_end = gmdate('Y-m-d'); 829 843 } 830 844 831 845 // Build placeholders for IN clause. 832 $placeholders = implode( ',', array_fill( 0, count( $goal_ids ), '%d' ));846 $placeholders = implode(',', array_fill(0, count($goal_ids), '%d')); 833 847 834 848 // Prepare query parameters (datetime format for index usage). 835 849 $query_params = array_merge( 836 array( $date_start . ' 00:00:00', $date_end . ' 23:59:59'),850 array($date_start . ' 00:00:00', $date_end . ' 23:59:59'), 837 851 $goal_ids 838 852 ); … … 864 878 865 879 // Check for database errors. 866 if ( $wpdb->last_error) {867 if ( defined( 'WP_DEBUG' ) && WP_DEBUG) {868 869 error_log( '[TrackSure] Goals batch performance query failed: ' . $wpdb->last_error);880 if ($wpdb->last_error) { 881 if (defined('WP_DEBUG') && WP_DEBUG) { 882 883 error_log('[TrackSure] Goals batch performance query failed: ' . $wpdb->last_error); 870 884 } 871 885 return $this->prepare_error( … … 894 908 // Format response. 895 909 $performance = array(); 896 foreach ( $results as $row) {910 foreach ($results as $row) { 897 911 $goal_id = (int) $row['goal_id']; 898 912 $conversions = (int) $row['conversions']; … … 902 916 // Calculate conversion rate. 903 917 $conversion_rate = $total_sessions > 0 904 ? ( $conversions / $total_sessions) * 100918 ? ($conversions / $total_sessions) * 100 905 919 : 0; 906 920 907 $performance[ $goal_id] = array(921 $performance[$goal_id] = array( 908 922 'conversions' => $conversions, 909 'revenue' => round( $revenue, 2),910 'avg_value' => round( $avg_value, 2),911 'conversion_rate' => round( $conversion_rate, 2),923 'revenue' => round($revenue, 2), 924 'avg_value' => round($avg_value, 2), 925 'conversion_rate' => round($conversion_rate, 2), 912 926 ); 913 927 } 914 928 915 929 // Fill in missing goals with zero data. 916 foreach ( $goal_ids as $goal_id) {917 if ( ! isset( $performance[ $goal_id ] )) {918 $performance[ $goal_id] = array(930 foreach ($goal_ids as $goal_id) { 931 if (! isset($performance[$goal_id])) { 932 $performance[$goal_id] = array( 919 933 'conversions' => 0, 920 934 'revenue' => 0, … … 925 939 } 926 940 927 // Cache for 5 minutes. 928 set_transient( $cache_key, $performance, 5 * MINUTE_IN_SECONDS ); 929 930 return $this->prepare_success( array( 'performance' => $performance ) ); 941 // Cache for 1 minute (shorter TTL so dashboard data stays fresh). 942 $response_data = array('performance' => $performance); 943 set_transient($cache_key, $response_data, MINUTE_IN_SECONDS); 944 945 return $this->prepare_success($response_data); 931 946 } 932 947 … … 937 952 * @return WP_REST_Response 938 953 */ 939 public function get_goal_timeline( $request ) { 954 public function get_goal_timeline($request) 955 { 940 956 global $wpdb; 941 957 942 $goal_id = absint( $request->get_param( 'id' ));943 $page = absint( $request->get_param( 'page' ) ) ? absint( $request->get_param( 'page' )) : 1;944 $per_page = absint( $request->get_param( 'per_page' ) ) ? absint( $request->get_param( 'per_page' )) : 20;945 $date_start = $request->get_param( 'date_start' ) ? $request->get_param( 'date_start' ) : gmdate( 'Y-m-d', strtotime( '-30 days' ));946 $date_end = $request->get_param( 'date_end' ) ? $request->get_param( 'date_end' ) : gmdate( 'Y-m-d');947 948 $offset = ( $page - 1) * $per_page;958 $goal_id = absint($request->get_param('id')); 959 $page = absint($request->get_param('page')) ? absint($request->get_param('page')) : 1; 960 $per_page = absint($request->get_param('per_page')) ? absint($request->get_param('per_page')) : 20; 961 $date_start = $request->get_param('date_start') ? $request->get_param('date_start') : gmdate('Y-m-d', strtotime('-30 days')); 962 $date_end = $request->get_param('date_end') ? $request->get_param('date_end') : gmdate('Y-m-d'); 963 964 $offset = ($page - 1) * $per_page; 949 965 950 966 // ========================================. … … 959 975 ); 960 976 961 $cached = get_transient( $cache_key);962 if ( $cached !== false && is_array( $cached )) {963 return $this->prepare_success( $cached);977 $cached = get_transient($cache_key); 978 if ($cached !== false && is_array($cached)) { 979 return $this->prepare_success($cached); 964 980 } 965 981 … … 1018 1034 1019 1035 // Format conversions and extract context from event_params. 1020 foreach ( $conversions as &$conversion) {1036 foreach ($conversions as &$conversion) { 1021 1037 $conversion['conversion_id'] = (int) $conversion['conversion_id']; 1022 1038 $conversion['value'] = (float) $conversion['value']; 1023 1039 1024 1040 // Parse event_params to extract product/form/click context. 1025 if ( ! empty( $conversion['event_params'] )) {1026 $event_params = json_decode( $conversion['event_params'], true);1027 if ( is_array( $event_params )) {1041 if (! empty($conversion['event_params'])) { 1042 $event_params = json_decode($conversion['event_params'], true); 1043 if (is_array($event_params)) { 1028 1044 // Product/Item data (WooCommerce standard). 1029 if ( isset( $event_params['item_id'] )) {1045 if (isset($event_params['item_id'])) { 1030 1046 $conversion['product_id'] = $event_params['item_id']; 1031 1047 } 1032 if ( isset( $event_params['item_name'] )) {1048 if (isset($event_params['item_name'])) { 1033 1049 $conversion['product_name'] = $event_params['item_name']; 1034 1050 } 1035 1051 1036 1052 // Use item_url if page_url is missing (server-side WooCommerce events). 1037 if ( empty( $conversion['page_url'] ) && isset( $event_params['item_url'] )) {1053 if (empty($conversion['page_url']) && isset($event_params['item_url'])) { 1038 1054 $conversion['page_url'] = $event_params['item_url']; 1039 1055 } 1040 1056 1041 1057 // Form data 1042 if ( isset( $event_params['form_id'] )) {1058 if (isset($event_params['form_id'])) { 1043 1059 $conversion['form_id'] = $event_params['form_id']; 1044 1060 } 1045 1061 1046 1062 // Click data. 1047 if ( isset( $event_params['element_selector'] )) {1063 if (isset($event_params['element_selector'])) { 1048 1064 $conversion['element_selector'] = $event_params['element_selector']; 1049 1065 } 1050 1066 } 1051 1067 } 1052 unset( $conversion['event_params']); // Remove raw params from response1068 unset($conversion['event_params']); // Remove raw params from response 1053 1069 1054 1070 // Set defaults for null values. 1055 $conversion['source'] = ! empty( $conversion['source']) ? $conversion['source'] : '(direct)';1056 $conversion['medium'] = ! empty( $conversion['medium']) ? $conversion['medium'] : '(none)';1057 $conversion['campaign'] = ! empty( $conversion['campaign']) ? $conversion['campaign'] : '';1058 $conversion['referrer'] = ! empty( $conversion['referrer']) ? $conversion['referrer'] : '';1059 $conversion['device'] = ! empty( $conversion['device']) ? $conversion['device'] : 'desktop';1060 $conversion['browser'] = ! empty( $conversion['browser']) ? $conversion['browser'] : 'unknown';1071 $conversion['source'] = ! empty($conversion['source']) ? $conversion['source'] : '(direct)'; 1072 $conversion['medium'] = ! empty($conversion['medium']) ? $conversion['medium'] : '(none)'; 1073 $conversion['campaign'] = ! empty($conversion['campaign']) ? $conversion['campaign'] : ''; 1074 $conversion['referrer'] = ! empty($conversion['referrer']) ? $conversion['referrer'] : ''; 1075 $conversion['device'] = ! empty($conversion['device']) ? $conversion['device'] : 'desktop'; 1076 $conversion['browser'] = ! empty($conversion['browser']) ? $conversion['browser'] : 'unknown'; 1061 1077 } 1062 1078 … … 1072 1088 ); 1073 1089 1074 set_transient( $cache_key, $result, 5 * MINUTE_IN_SECONDS);1075 1076 return $this->prepare_success( $result);1090 set_transient($cache_key, $result, 5 * MINUTE_IN_SECONDS); 1091 1092 return $this->prepare_success($result); 1077 1093 } 1078 1094 … … 1083 1099 * @return WP_REST_Response 1084 1100 */ 1085 public function get_goal_sources( $request ) { 1101 public function get_goal_sources($request) 1102 { 1086 1103 global $wpdb; 1087 1104 1088 $goal_id = absint( $request->get_param( 'id' ));1089 $attribution_model = sanitize_text_field( $request->get_param( 'attribution_model' ) ) ? sanitize_text_field( $request->get_param( 'attribution_model' )) : 'last_touch';1090 $date_start = $request->get_param( 'date_start' ) ? $request->get_param( 'date_start' ) : gmdate( 'Y-m-d', strtotime( '-30 days' ));1091 $date_end = $request->get_param( 'date_end' ) ? $request->get_param( 'date_end' ) : gmdate( 'Y-m-d');1105 $goal_id = absint($request->get_param('id')); 1106 $attribution_model = sanitize_text_field($request->get_param('attribution_model')) ? sanitize_text_field($request->get_param('attribution_model')) : 'last_touch'; 1107 $date_start = $request->get_param('date_start') ? $request->get_param('date_start') : gmdate('Y-m-d', strtotime('-30 days')); 1108 $date_end = $request->get_param('date_end') ? $request->get_param('date_end') : gmdate('Y-m-d'); 1092 1109 1093 1110 // ========================================. … … 1102 1119 ); 1103 1120 1104 $cached = get_transient( $cache_key);1105 if ( $cached !== false && is_array( $cached )) {1106 return $this->prepare_success( $cached);1121 $cached = get_transient($cache_key); 1122 if ($cached !== false && is_array($cached)) { 1123 return $this->prepare_success($cached); 1107 1124 } 1108 1125 1109 1126 1110 1127 // Multi-touch models use the conversion_attribution table. 1111 $multi_touch_models = array( 'linear', 'time_decay', 'position_based');1112 1113 if ( in_array( $attribution_model, $multi_touch_models, true )) {1128 $multi_touch_models = array('linear', 'time_decay', 'position_based'); 1129 1130 if (in_array($attribution_model, $multi_touch_models, true)) { 1114 1131 // Query conversion_attribution table for multi-touch models. 1115 1132 // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared … … 1165 1182 1166 1183 // Calculate total for percentages. 1167 $total_conversions = array_sum( array_column( $sources, 'conversions' ));1184 $total_conversions = array_sum(array_column($sources, 'conversions')); 1168 1185 1169 1186 // Format sources with percentages. 1170 foreach ( $sources as &$source) {1187 foreach ($sources as &$source) { 1171 1188 $source['conversions'] = (int) $source['conversions']; 1172 1189 $source['revenue'] = (float) $source['revenue']; 1173 1190 $source['percentage'] = $total_conversions > 0 1174 ? round( ( $source['conversions'] / $total_conversions ) * 100, 1)1191 ? round(($source['conversions'] / $total_conversions) * 100, 1) 1175 1192 : 0; 1176 1193 } … … 1185 1202 ); 1186 1203 1187 set_transient( $cache_key, $result, 5 * MINUTE_IN_SECONDS);1188 1189 return $this->prepare_success( $result);1204 set_transient($cache_key, $result, 5 * MINUTE_IN_SECONDS); 1205 1206 return $this->prepare_success($result); 1190 1207 } 1191 1208 … … 1211 1228 * @return WP_REST_Response Response object with overview data. 1212 1229 */ 1213 public function get_goals_overview( $request ) { 1230 public function get_goals_overview($request) 1231 { 1214 1232 global $wpdb; 1215 1233 … … 1217 1235 // PHASE 1: PARSE & VALIDATE DATE RANGE. 1218 1236 // ========================================. 1219 $end_date = $request->get_param( 'end_date');1220 $start_date = $request->get_param( 'start_date');1237 $end_date = $request->get_param('end_date'); 1238 $start_date = $request->get_param('start_date'); 1221 1239 1222 1240 // Default to last 30 days if not specified. 1223 if ( empty( $end_date )) {1224 $end_date = gmdate( 'Y-m-d');1225 } 1226 if ( empty( $start_date )) {1227 $start_date = gmdate( 'Y-m-d', strtotime( $end_date . ' -30 days' ));1241 if (empty($end_date)) { 1242 $end_date = gmdate('Y-m-d'); 1243 } 1244 if (empty($start_date)) { 1245 $start_date = gmdate('Y-m-d', strtotime($end_date . ' -30 days')); 1228 1246 } 1229 1247 … … 1231 1249 // PHASE 2: CHECK CACHE. 1232 1250 // ========================================. 1233 $cache_key = 'tracksure_goals_overview_' . md5( $start_date . '_' . $end_date);1234 $cached = get_transient( $cache_key);1235 if ( $cached !== false) {1236 return $this->prepare_success( $cached);1251 $cache_key = 'tracksure_goals_overview_' . md5($start_date . '_' . $end_date); 1252 $cached = get_transient($cache_key); 1253 if ($cached !== false) { 1254 return $this->prepare_success($cached); 1237 1255 } 1238 1256 … … 1259 1277 // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared 1260 1278 1261 $total_conversions = (int) ( $current_stats['total_conversions'] ?? 0);1262 $total_value = (float) ( $current_stats['total_value'] ?? 0);1263 $unique_visitors = (int) ( $current_stats['unique_visitors'] ?? 0);1279 $total_conversions = (int) ($current_stats['total_conversions'] ?? 0); 1280 $total_value = (float) ($current_stats['total_value'] ?? 0); 1281 $unique_visitors = (int) ($current_stats['unique_visitors'] ?? 0); 1264 1282 1265 1283 // Calculate conversion rate (conversions / unique visitors). 1266 1284 // Note: In production, you'd want to get total sessions instead 1267 1285 $conversion_rate = $unique_visitors > 0 1268 ? round( ( $total_conversions / $unique_visitors ) * 100, 2)1286 ? round(($total_conversions / $unique_visitors) * 100, 2) 1269 1287 : 0; 1270 1288 … … 1273 1291 // ========================================. 1274 1292 // Calculate date difference to determine previous period. 1275 $period_length = ( strtotime( $end_date ) - strtotime( $start_date )) / DAY_IN_SECONDS;1276 $prev_start_date = gmdate( 'Y-m-d', strtotime( $start_date . ' -' . ceil( $period_length ) . ' days' ));1277 $prev_end_date = gmdate( 'Y-m-d', strtotime( $end_date . ' -' . ceil( $period_length ) . ' days' ));1293 $period_length = (strtotime($end_date) - strtotime($start_date)) / DAY_IN_SECONDS; 1294 $prev_start_date = gmdate('Y-m-d', strtotime($start_date . ' -' . ceil($period_length) . ' days')); 1295 $prev_end_date = gmdate('Y-m-d', strtotime($end_date . ' -' . ceil($period_length) . ' days')); 1278 1296 1279 1297 // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared … … 1294 1312 // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared 1295 1313 1296 $prev_conversions = (int) ( $previous_stats['total_conversions'] ?? 0);1297 $prev_value = (float) ( $previous_stats['total_value'] ?? 0);1298 $prev_visitors = (int) ( $previous_stats['unique_visitors'] ?? 0);1314 $prev_conversions = (int) ($previous_stats['total_conversions'] ?? 0); 1315 $prev_value = (float) ($previous_stats['total_value'] ?? 0); 1316 $prev_visitors = (int) ($previous_stats['unique_visitors'] ?? 0); 1299 1317 $prev_rate = $prev_visitors > 0 1300 ? round( ( $prev_conversions / $prev_visitors ) * 100, 2)1318 ? round(($prev_conversions / $prev_visitors) * 100, 2) 1301 1319 : 0; 1302 1320 … … 1334 1352 // Format daily data. 1335 1353 $daily_conversions = array(); 1336 foreach ( $daily_data as $day) {1354 foreach ($daily_data as $day) { 1337 1355 $daily_conversions[] = array( 1338 1356 'date' => $day['date'], … … 1373 1391 // Format top goals. 1374 1392 $top_goals = array(); 1375 foreach ( $top_goals_data as $goal) {1393 foreach ($top_goals_data as $goal) { 1376 1394 $top_goals[] = array( 1377 1395 'goal_id' => (int) $goal['goal_id'], 1378 'name' => esc_html( $goal['name']),1396 'name' => esc_html($goal['name']), 1379 1397 'trigger_type' => $goal['trigger_type'], 1380 1398 'conversions' => (int) $goal['conversions'], … … 1407 1425 // PHASE 9: CACHE RESULT (5 min TTL). 1408 1426 // ========================================. 1409 set_transient( $cache_key, $result, 5 * MINUTE_IN_SECONDS);1410 1411 return $this->prepare_success( $result);1427 set_transient($cache_key, $result, 5 * MINUTE_IN_SECONDS); 1428 1429 return $this->prepare_success($result); 1412 1430 } 1413 1431 … … 1426 1444 * @return WP_REST_Response Response with devices array. 1427 1445 */ 1428 public function get_goal_devices( $request ) { 1446 public function get_goal_devices($request) 1447 { 1429 1448 global $wpdb; 1430 1449 1431 $goal_id = absint( $request->get_param( 'id' ));1432 $date_start = $request->get_param( 'date_start' ) ? $request->get_param( 'date_start' ) : gmdate( 'Y-m-d', strtotime( '-30 days' ));1433 $date_end = $request->get_param( 'date_end' ) ? $request->get_param( 'date_end' ) : gmdate( 'Y-m-d');1450 $goal_id = absint($request->get_param('id')); 1451 $date_start = $request->get_param('date_start') ? $request->get_param('date_start') : gmdate('Y-m-d', strtotime('-30 days')); 1452 $date_end = $request->get_param('date_end') ? $request->get_param('date_end') : gmdate('Y-m-d'); 1434 1453 1435 1454 // Check cache. … … 1441 1460 ); 1442 1461 1443 $cached = get_transient( $cache_key);1444 if ( $cached !== false && is_array( $cached )) {1445 return $this->prepare_success( $cached);1462 $cached = get_transient($cache_key); 1463 if ($cached !== false && is_array($cached)) { 1464 return $this->prepare_success($cached); 1446 1465 } 1447 1466 … … 1470 1489 // Calculate total for percentages. 1471 1490 $total_conversions = 0; 1472 foreach ( $devices as $row) {1491 foreach ($devices as $row) { 1473 1492 $total_conversions += (int) $row['conversions']; 1474 1493 } 1475 1494 1476 1495 // Format response with percentages. 1477 foreach ( $devices as &$row) {1496 foreach ($devices as &$row) { 1478 1497 $row['conversions'] = (int) $row['conversions']; 1479 1498 $row['percentage'] = $total_conversions > 0 1480 ? round( ( $row['conversions'] / $total_conversions ) * 100, 1)1499 ? round(($row['conversions'] / $total_conversions) * 100, 1) 1481 1500 : 0; 1482 1501 } … … 1489 1508 1490 1509 // Cache for 5 minutes. 1491 set_transient( $cache_key, $result, 5 * MINUTE_IN_SECONDS);1492 1493 return $this->prepare_success( $result);1510 set_transient($cache_key, $result, 5 * MINUTE_IN_SECONDS); 1511 1512 return $this->prepare_success($result); 1494 1513 } 1495 1514 … … 1500 1519 * @return array Schema arguments. 1501 1520 */ 1502 private function get_goal_schema( $update = false ) { 1521 private function get_goal_schema($update = false) 1522 { 1503 1523 return array( 1504 1524 'name' => array( … … 1532 1552 * server-side and client-side goal lists are refreshed. 1533 1553 */ 1534 private function clear_goals_cache() { 1554 private function clear_goals_cache() 1555 { 1535 1556 // Clear server-side cache (used by Goal Evaluator). 1536 delete_transient( 'tracksure_active_goals_server');1557 delete_transient('tracksure_active_goals_server'); 1537 1558 1538 1559 // Clear client-side cache (used by front-end tracking). 1539 delete_transient( 'tracksure_active_goals');1560 delete_transient('tracksure_active_goals'); 1540 1561 1541 1562 // Clear Goal Evaluator in-memory cache. -
tracksure/trunk/includes/core/services/class-tracksure-goal-evaluator.php
r3472561 r3473414 44 44 45 45 // Exit if accessed directly. 46 if ( ! defined( 'ABSPATH' )) {46 if (! defined('ABSPATH')) { 47 47 exit; 48 48 } … … 56 56 * @since 1.0.0 57 57 */ 58 class TrackSure_Goal_Evaluator { 58 class TrackSure_Goal_Evaluator 59 { 59 60 60 61 … … 119 120 * @return TrackSure_Goal_Evaluator Singleton instance. 120 121 */ 121 public static function get_instance(): self { 122 if ( null === self::$instance ) { 122 public static function get_instance(): self 123 { 124 if (null === self::$instance) { 123 125 self::$instance = new self(); 124 126 } … … 133 135 * @since 1.0.0 134 136 */ 135 private function __construct() { 137 private function __construct() 138 { 136 139 $this->db = TrackSure_DB::get_instance(); 137 140 } … … 155 158 * @return bool True if any goal was triggered, false otherwise. 156 159 */ 157 public function evaluate_event( string $event_id, array $event_data, array $session ): bool { 158 $event_name = isset( $event_data['event_name'] ) ? sanitize_text_field( $event_data['event_name'] ) : ''; 159 160 if ( empty( $event_name ) ) { 160 public function evaluate_event(string $event_id, array $event_data, array $session): bool 161 { 162 $event_name = isset($event_data['event_name']) ? sanitize_text_field($event_data['event_name']) : ''; 163 164 if (empty($event_name)) { 161 165 return false; 162 166 } 163 167 164 168 // O(1) lookup: only get goals that match this event_name. 165 $matching_goals = $this->get_goals_for_event( $event_name);166 167 if ( empty( $matching_goals )) {169 $matching_goals = $this->get_goals_for_event($event_name); 170 171 if (empty($matching_goals)) { 168 172 return false; 169 173 } 170 174 171 $event_params = isset( $event_data['event_params']) ? $event_data['event_params'] : array();175 $event_params = isset($event_data['event_params']) ? $event_data['event_params'] : array(); 172 176 173 177 // Decode JSON string if needed. 174 if ( is_string( $event_params )) {175 $event_params = ! empty( $event_params ) ? json_decode( $event_params, true) : array();176 } 177 178 if ( ! is_array( $event_params )) {178 if (is_string($event_params)) { 179 $event_params = ! empty($event_params) ? json_decode($event_params, true) : array(); 180 } 181 182 if (! is_array($event_params)) { 179 183 $event_params = array(); 180 184 } … … 183 187 // can resolve page_url, page_path, page_title regardless of whether 184 188 // they were stored inside the event_params JSON or as separate columns. 185 $page_fields = array( 'page_url', 'page_path', 'page_title');186 foreach ( $page_fields as $field) {187 if ( ! isset( $event_params[ $field ] ) && isset( $event_data[ $field ] )) {188 $event_params[ $field ] = $event_data[ $field];189 } 190 } 191 192 $session_id = isset( $session['session_id']) ? $session['session_id'] : '';189 $page_fields = array('page_url', 'page_path', 'page_title'); 190 foreach ($page_fields as $field) { 191 if (! isset($event_params[$field]) && isset($event_data[$field])) { 192 $event_params[$field] = $event_data[$field]; 193 } 194 } 195 196 $session_id = isset($session['session_id']) ? $session['session_id'] : ''; 193 197 $triggered = false; 194 198 195 foreach ( $matching_goals as $goal) {199 foreach ($matching_goals as $goal) { 196 200 // Session-level dedup: skip if this goal+session already converted. 197 201 $dedup_key = $goal->goal_id . '_' . $session_id; 198 if ( isset( $this->session_conversions[ $dedup_key ] )) {202 if (isset($this->session_conversions[$dedup_key])) { 199 203 continue; 200 204 } 201 205 202 206 // Evaluate trigger type match. 203 if ( ! $this->evaluate_trigger_match( $goal, $event_data, $event_params )) {207 if (! $this->evaluate_trigger_match($goal, $event_data, $event_params)) { 204 208 continue; 205 209 } 206 210 207 211 // Evaluate conditions. 208 if ( $this->evaluate_conditions( $goal, $event_params )) {209 $this->trigger_conversion( $event_id, $goal, $event_data, $session);210 $this->session_conversions[ $dedup_key] = true;212 if ($this->evaluate_conditions($goal, $event_params)) { 213 $this->trigger_conversion($event_id, $goal, $event_data, $session); 214 $this->session_conversions[$dedup_key] = true; 211 215 $triggered = true; 212 216 } … … 227 231 * @return array Array of goal objects matching the event_name. 228 232 */ 229 private function get_goals_for_event( string $event_name ): array { 233 private function get_goals_for_event(string $event_name): array 234 { 230 235 // Build index if not yet done. 231 if ( null === $this->goals_by_event) {236 if (null === $this->goals_by_event) { 232 237 $all_goals = $this->get_active_goals(); 233 238 $this->goals_by_event = array(); 234 239 235 foreach ( $all_goals as $goal ) { 240 // Trigger-type → event-name mapping (mirrors JS TRIGGER_EVENT_MAP). 241 // Ensures goals are findable even if event_name doesn't exactly match. 242 $trigger_event_map = array( 243 'pageview' => array('page_view'), 244 'click' => array('click'), 245 'form_submit' => array('form_submit', 'form_submission'), 246 'scroll_depth' => array('scroll'), 247 'time_on_page' => array('page_exit', 'time_on_page', 'time_on_page_threshold'), 248 'engagement' => array('engagement', 'page_exit'), 249 'video_play' => array('video_play', 'video_start', 'video_complete'), 250 'download' => array('file_download', 'download'), 251 'outbound_link' => array('outbound_click', 'external_link'), 252 ); 253 254 foreach ($all_goals as $goal) { 255 // Primary index: goal's own event_name. 236 256 $key = $goal->event_name; 237 if ( ! isset( $this->goals_by_event[ $key ] ) ) { 238 $this->goals_by_event[ $key ] = array(); 239 } 240 $this->goals_by_event[ $key ][] = $goal; 241 } 242 } 243 244 return isset( $this->goals_by_event[ $event_name ] ) ? $this->goals_by_event[ $event_name ] : array(); 257 if (! isset($this->goals_by_event[$key])) { 258 $this->goals_by_event[$key] = array(); 259 } 260 $this->goals_by_event[$key][] = $goal; 261 262 // Secondary index: all event names for this trigger_type. 263 // This ensures a 'scroll_depth' trigger goal is found when 264 // a 'scroll' event arrives, even if event_name is mismatched. 265 if (! empty($goal->trigger_type) && isset($trigger_event_map[$goal->trigger_type])) { 266 foreach ($trigger_event_map[$goal->trigger_type] as $mapped_event) { 267 if ($mapped_event !== $key) { // Avoid duplicate. 268 if (! isset($this->goals_by_event[$mapped_event])) { 269 $this->goals_by_event[$mapped_event] = array(); 270 } 271 $this->goals_by_event[$mapped_event][] = $goal; 272 } 273 } 274 } 275 276 // Custom events: also index by event_name directly (already done above). 277 } 278 } 279 280 return isset($this->goals_by_event[$event_name]) ? $this->goals_by_event[$event_name] : array(); 245 281 } 246 282 … … 259 295 * @return array Array of goal objects with decoded JSON fields. 260 296 */ 261 private function get_active_goals(): array { 297 private function get_active_goals(): array 298 { 262 299 // Check in-memory cache first (fastest). 263 if ( null !== $this->active_goals) {300 if (null !== $this->active_goals) { 264 301 return $this->active_goals; 265 302 } … … 267 304 // Check transient cache (5 minute TTL). 268 305 $cache_key = 'tracksure_active_goals_server'; 269 $cached = get_transient( $cache_key);270 271 if ( $cached !== false && is_array( $cached )) {306 $cached = get_transient($cache_key); 307 308 if ($cached !== false && is_array($cached)) { 272 309 $this->active_goals = $cached; 273 310 return $this->active_goals; … … 306 343 * @param string $query SQL query string (no user input). 307 344 */ 308 $query = apply_filters( 'tracksure_active_goals_query', $base_query);345 $query = apply_filters('tracksure_active_goals_query', $base_query); 309 346 310 347 // Query active goals (explicit columns for performance). 311 $this->active_goals = $wpdb->get_results( $query); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Static query; filter may modify.312 313 if ( ! is_array( $this->active_goals )) {348 $this->active_goals = $wpdb->get_results($query); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Static query; filter may modify. 349 350 if (! is_array($this->active_goals)) { 314 351 $this->active_goals = array(); 315 352 } 316 353 317 354 // Parse JSON columns. 318 foreach ( $this->active_goals as $goal) {319 if ( ! empty( $goal->conditions )) {320 $goal->conditions = json_decode( $goal->conditions, true);355 foreach ($this->active_goals as $goal) { 356 if (! empty($goal->conditions)) { 357 $goal->conditions = json_decode($goal->conditions, true); 321 358 } else { 322 359 $goal->conditions = array(); … … 324 361 325 362 // match_logic is a plain string ('all' or 'any'), NOT JSON. 326 if ( empty( $goal->match_logic ) || ! in_array( $goal->match_logic, array( 'all', 'any' ), true )) {363 if (empty($goal->match_logic) || ! in_array($goal->match_logic, array('all', 'any'), true)) { 327 364 $goal->match_logic = 'all'; 328 365 } 329 366 330 367 // Decode trigger_config JSON. 331 if ( ! empty( $goal->trigger_config )) {332 $goal->trigger_config = json_decode( $goal->trigger_config);368 if (! empty($goal->trigger_config)) { 369 $goal->trigger_config = json_decode($goal->trigger_config); 333 370 } else { 334 371 $goal->trigger_config = null; … … 346 383 * @param array $goals Array of goal objects. 347 384 */ 348 $this->active_goals = apply_filters( 'tracksure_active_goals', $this->active_goals);385 $this->active_goals = apply_filters('tracksure_active_goals', $this->active_goals); 349 386 350 387 // Cache for 5 minutes. 351 set_transient( $cache_key, $this->active_goals, 5 * MINUTE_IN_SECONDS);388 set_transient($cache_key, $this->active_goals, 5 * MINUTE_IN_SECONDS); 352 389 353 390 return $this->active_goals; … … 379 416 * @return bool True if trigger conditions are met, false otherwise. 380 417 */ 381 private function evaluate_trigger_match( object $goal, array $event_data, array $event_params ): bool { 418 private function evaluate_trigger_match(object $goal, array $event_data, array $event_params): bool 419 { 382 420 /** 383 421 * Filter for custom trigger type evaluation. … … 401 439 ); 402 440 403 if ( $custom_match !== null) {441 if ($custom_match !== null) { 404 442 return (bool) $custom_match; 405 443 } 406 444 407 445 // If no trigger_type set, default behavior (always match). 408 if ( empty( $goal->trigger_type ) || $goal->trigger_type === 'pageview') {446 if (empty($goal->trigger_type) || $goal->trigger_type === 'pageview') { 409 447 return true; 410 448 } … … 413 451 $trigger_config = $goal->trigger_config; 414 452 415 $page_url = isset( $event_params['page_url'] ) ? sanitize_url( $event_params['page_url']) : '';416 $page_path = isset( $event_params['page_path'] ) ? sanitize_text_field( $event_params['page_path']) : '';453 $page_url = isset($event_params['page_url']) ? sanitize_url($event_params['page_url']) : ''; 454 $page_path = isset($event_params['page_path']) ? sanitize_text_field($event_params['page_path']) : ''; 417 455 418 456 // Evaluate based on trigger type. 419 switch ( $goal->trigger_type) {457 switch ($goal->trigger_type) { 420 458 case 'click': 421 $css_selector = isset( $trigger_config->css_selector)459 $css_selector = isset($trigger_config->css_selector) 422 460 ? $trigger_config->css_selector 423 461 : null; 424 462 425 if ( $css_selector && ! empty( $event_params['element_selector'] )) {426 return $this->match_css_selector( $event_params['element_selector'], $css_selector);427 } 428 429 $element_id = isset( $trigger_config->element_id)463 if ($css_selector && ! empty($event_params['element_selector'])) { 464 return $this->match_css_selector($event_params['element_selector'], $css_selector); 465 } 466 467 $element_id = isset($trigger_config->element_id) 430 468 ? $trigger_config->element_id 431 469 : null; 432 470 433 if ( $element_id && ! empty( $event_params['element_id'] )) {471 if ($element_id && ! empty($event_params['element_id'])) { 434 472 return $event_params['element_id'] === $element_id; 435 473 } … … 437 475 438 476 case 'form_submit': 439 $form_id = isset( $trigger_config->form_id)477 $form_id = isset($trigger_config->form_id) 440 478 ? $trigger_config->form_id 441 479 : null; 442 480 443 if ( $form_id && ! empty( $event_params['form_id'] )) {481 if ($form_id && ! empty($event_params['form_id'])) { 444 482 return $event_params['form_id'] === $form_id; 445 483 } … … 448 486 case 'scroll_depth': 449 487 case 'scroll': // Backward compatibility 450 $depth_threshold = isset( $trigger_config->scroll_depth)488 $depth_threshold = isset($trigger_config->scroll_depth) 451 489 ? (int) $trigger_config->scroll_depth 452 490 : 75; 453 491 454 if ( ! empty( $event_params['scroll_depth'] )) {492 if (! empty($event_params['scroll_depth'])) { 455 493 return (int) $event_params['scroll_depth'] >= $depth_threshold; 456 494 } … … 458 496 459 497 case 'time_on_page': 460 $time_threshold = isset( $trigger_config->time_seconds)498 $time_threshold = isset($trigger_config->time_seconds) 461 499 ? (int) $trigger_config->time_seconds 462 500 : 30; 463 501 464 if ( ! empty( $event_params['time_on_page'] )) {502 if (! empty($event_params['time_on_page'])) { 465 503 return (int) $event_params['time_on_page'] >= $time_threshold; 466 504 } … … 469 507 case 'engagement': 470 508 // Requires both scroll and time thresholds to be met. 471 $scroll_threshold = isset( $trigger_config->scroll_depth)509 $scroll_threshold = isset($trigger_config->scroll_depth) 472 510 ? (int) $trigger_config->scroll_depth 473 511 : 50; // Default 50% scroll 474 $time_threshold = isset( $trigger_config->time_seconds)512 $time_threshold = isset($trigger_config->time_seconds) 475 513 ? (int) $trigger_config->time_seconds 476 514 : 30; // Default 30 seconds 477 515 478 $scroll_met = ! empty( $event_params['scroll_depth']) &&516 $scroll_met = ! empty($event_params['scroll_depth']) && 479 517 (int) $event_params['scroll_depth'] >= $scroll_threshold; 480 $time_met = ! empty( $event_params['time_on_page']) &&518 $time_met = ! empty($event_params['time_on_page']) && 481 519 (int) $event_params['time_on_page'] >= $time_threshold; 482 520 … … 489 527 case 'video_play': 490 528 // Match video URL or title from trigger_config against event params. 491 if ( ! empty( $trigger_config->video_url ) && ! empty( $event_params['video_url'] )) {492 if ( stripos( $event_params['video_url'], $trigger_config->video_url ) === false) {529 if (! empty($trigger_config->video_url) && ! empty($event_params['video_url'])) { 530 if (stripos($event_params['video_url'], $trigger_config->video_url) === false) { 493 531 return false; 494 532 } 495 533 } 496 if ( ! empty( $trigger_config->video_title ) && ! empty( $event_params['video_title'] )) {497 if ( stripos( $event_params['video_title'], $trigger_config->video_title ) === false) {534 if (! empty($trigger_config->video_title) && ! empty($event_params['video_title'])) { 535 if (stripos($event_params['video_title'], $trigger_config->video_title) === false) { 498 536 return false; 499 537 } 500 538 } 501 if ( ! empty( $trigger_config->video_type ) && ! empty( $event_params['video_type'] )) {502 if ( strtolower( $event_params['video_type'] ) !== strtolower( $trigger_config->video_type )) {539 if (! empty($trigger_config->video_type) && ! empty($event_params['video_type'])) { 540 if (strtolower($event_params['video_type']) !== strtolower($trigger_config->video_type)) { 503 541 return false; 504 542 } … … 508 546 case 'download': 509 547 // Match file type or file name from trigger_config against event params. 510 if ( ! empty( $trigger_config->file_type ) && ! empty( $event_params['file_type'] )) {511 if ( strtolower( $event_params['file_type'] ) !== strtolower( $trigger_config->file_type )) {548 if (! empty($trigger_config->file_type) && ! empty($event_params['file_type'])) { 549 if (strtolower($event_params['file_type']) !== strtolower($trigger_config->file_type)) { 512 550 return false; 513 551 } 514 552 } 515 if ( ! empty( $trigger_config->file_name ) && ! empty( $event_params['file_name'] )) {516 if ( stripos( $event_params['file_name'], $trigger_config->file_name ) === false) {553 if (! empty($trigger_config->file_name) && ! empty($event_params['file_name'])) { 554 if (stripos($event_params['file_name'], $trigger_config->file_name) === false) { 517 555 return false; 518 556 } 519 557 } 520 if ( ! empty( $trigger_config->link_url ) && ! empty( $event_params['link_url'] )) {521 if ( stripos( $event_params['link_url'], $trigger_config->link_url ) === false) {558 if (! empty($trigger_config->link_url) && ! empty($event_params['link_url'])) { 559 if (stripos($event_params['link_url'], $trigger_config->link_url) === false) { 522 560 return false; 523 561 } … … 527 565 case 'outbound_link': 528 566 // Match link domain or URL from trigger_config against event params. 529 if ( ! empty( $trigger_config->link_domain ) && ! empty( $event_params['link_domain'] )) {530 if ( stripos( $event_params['link_domain'], $trigger_config->link_domain ) === false) {567 if (! empty($trigger_config->link_domain) && ! empty($event_params['link_domain'])) { 568 if (stripos($event_params['link_domain'], $trigger_config->link_domain) === false) { 531 569 return false; 532 570 } 533 571 } 534 if ( ! empty( $trigger_config->link_url ) && ! empty( $event_params['link_url'] )) {535 if ( stripos( $event_params['link_url'], $trigger_config->link_url ) === false) {572 if (! empty($trigger_config->link_url) && ! empty($event_params['link_url'])) { 573 if (stripos($event_params['link_url'], $trigger_config->link_url) === false) { 536 574 return false; 537 575 } … … 550 588 * @param array $event_params Event parameters. 551 589 */ 552 $custom_result = apply_filters( 'tracksure_goal_custom_trigger_eval', null, $goal, $event_data, $event_params);553 if ( $custom_result !== null) {590 $custom_result = apply_filters('tracksure_goal_custom_trigger_eval', null, $goal, $event_data, $event_params); 591 if ($custom_result !== null) { 554 592 return (bool) $custom_result; 555 593 } … … 565 603 * @return bool True if matches. 566 604 */ 567 private function match_css_selector( $actual_selector, $pattern ) { 568 if ( empty( $actual_selector ) || empty( $pattern ) ) { 605 private function match_css_selector($actual_selector, $pattern) 606 { 607 if (empty($actual_selector) || empty($pattern)) { 569 608 return false; 570 609 } 571 610 572 611 // Exact match. 573 if ( $actual_selector === $pattern) {612 if ($actual_selector === $pattern) { 574 613 return true; 575 614 } 576 615 577 616 // ID selector: #contact-form. 578 if ( strpos( $pattern, '#' ) === 0) {579 $pattern_id = substr( $pattern, 1);617 if (strpos($pattern, '#') === 0) { 618 $pattern_id = substr($pattern, 1); 580 619 // Check if actual selector contains this ID. 581 return strpos( $actual_selector, '#' . $pattern_id) !== false;620 return strpos($actual_selector, '#' . $pattern_id) !== false; 582 621 } 583 622 584 623 // Class selector: .btn or .btn.primary. 585 if ( strpos( $pattern, '.' ) === 0) {624 if (strpos($pattern, '.') === 0) { 586 625 // Extract all classes from pattern. 587 $pattern_classes = array_filter( explode( '.', $pattern ));588 foreach ( $pattern_classes as $class) {589 if ( ! empty( $class ) && strpos( $actual_selector, '.' . $class ) === false) {626 $pattern_classes = array_filter(explode('.', $pattern)); 627 foreach ($pattern_classes as $class) { 628 if (! empty($class) && strpos($actual_selector, '.' . $class) === false) { 590 629 return false; // All classes must match 591 630 } … … 595 634 596 635 // Attribute selector: a[href^="tel:"], button[type="submit"]. 597 if ( preg_match( '/^([a-z]+)\[([^\]]+)\]$/i', $pattern, $matches )) {636 if (preg_match('/^([a-z]+)\[([^\]]+)\]$/i', $pattern, $matches)) { 598 637 $tag = $matches[1]; // e.g., 'a' 599 638 $attr = $matches[2]; // e.g., 'href^="tel:"' 600 639 601 640 // Check if actual selector starts with this tag. 602 if ( strpos( $actual_selector, $tag ) !== 0) {641 if (strpos($actual_selector, $tag) !== 0) { 603 642 return false; 604 643 } 605 644 606 645 // Parse attribute condition. 607 if ( preg_match( '/^([a-z-]+)([\^\$\*]?)="([^"]+)"$/i', $attr, $attr_matches )) {646 if (preg_match('/^([a-z-]+)([\^\$\*]?)="([^"]+)"$/i', $attr, $attr_matches)) { 608 647 // We can't check actual attributes from CSS selector alone,. 609 648 // but we can match against event params if provided separately. … … 614 653 615 654 // Tag selector with classes: a.phone-link, button.cta. 616 if ( preg_match( '/^([a-z]+)(\.[\w.-]+)?$/i', $pattern )) {617 $pattern_parts = explode( '.', $pattern);655 if (preg_match('/^([a-z]+)(\.[\w.-]+)?$/i', $pattern)) { 656 $pattern_parts = explode('.', $pattern); 618 657 $pattern_tag = $pattern_parts[0]; 619 658 620 659 // Check tag 621 if ( strpos( $actual_selector, $pattern_tag ) !== 0) {660 if (strpos($actual_selector, $pattern_tag) !== 0) { 622 661 return false; 623 662 } 624 663 625 664 // Check classes if present. 626 $pattern_parts_count = count( $pattern_parts);627 for ( $i = 1; $i < $pattern_parts_count; $i++) {628 if ( strpos( $actual_selector, '.' . $pattern_parts[ $i ] ) === false) {665 $pattern_parts_count = count($pattern_parts); 666 for ($i = 1; $i < $pattern_parts_count; $i++) { 667 if (strpos($actual_selector, '.' . $pattern_parts[$i]) === false) { 629 668 return false; 630 669 } … … 634 673 635 674 // Fallback: simple contains matching (backwards compatibility). 636 return strpos( $actual_selector, $pattern) !== false;675 return strpos($actual_selector, $pattern) !== false; 637 676 } 638 677 … … 644 683 * @return bool True if all conditions met. 645 684 */ 646 private function evaluate_conditions( $goal, $event_params ) { 685 private function evaluate_conditions($goal, $event_params) 686 { 647 687 // No conditions = always match. 648 if ( empty( $goal->conditions ) || ! is_array( $goal->conditions )) {688 if (empty($goal->conditions) || ! is_array($goal->conditions)) { 649 689 return true; 650 690 } 651 691 652 $match_logic = isset( $goal->match_logic) && $goal->match_logic === 'any' ? 'any' : 'all';653 654 foreach ( $goal->conditions as $condition) {655 $param_key = isset( $condition['param']) ? $condition['param'] : '';656 $operator = isset( $condition['operator']) ? $condition['operator'] : 'equals';657 $value = isset( $condition['value']) ? $condition['value'] : '';692 $match_logic = isset($goal->match_logic) && $goal->match_logic === 'any' ? 'any' : 'all'; 693 694 foreach ($goal->conditions as $condition) { 695 $param_key = isset($condition['param']) ? $condition['param'] : ''; 696 $operator = isset($condition['operator']) ? $condition['operator'] : 'equals'; 697 $value = isset($condition['value']) ? $condition['value'] : ''; 658 698 659 699 // Get actual value from event params. 660 $actual_value = isset( $event_params[ $param_key ] ) ? $event_params[ $param_key] : null;700 $actual_value = isset($event_params[$param_key]) ? $event_params[$param_key] : null; 661 701 662 702 // Evaluate condition. 663 $result = $this->evaluate_condition_operator( $actual_value, $operator, $value);664 665 if ( $match_logic === 'any' && $result) {703 $result = $this->evaluate_condition_operator($actual_value, $operator, $value); 704 705 if ($match_logic === 'any' && $result) { 666 706 return true; // At least one condition passed. 667 707 } 668 708 669 if ( $match_logic === 'all' && ! $result) {709 if ($match_logic === 'all' && ! $result) { 670 710 return false; // All conditions must pass. 671 711 } … … 695 735 * @return bool True if condition is satisfied. 696 736 */ 697 private function evaluate_condition_operator( $actual_value, $operator, $expected_value ) { 698 switch ( $operator ) { 737 private function evaluate_condition_operator($actual_value, $operator, $expected_value) 738 { 739 switch ($operator) { 699 740 case 'equals': 700 741 // Use string comparison for consistency with JS strict ===. … … 720 761 721 762 case 'contains': 722 return strpos( (string) $actual_value, (string) $expected_value) !== false;763 return strpos((string) $actual_value, (string) $expected_value) !== false; 723 764 724 765 case 'not_contains': 725 return strpos( (string) $actual_value, (string) $expected_value) === false;766 return strpos((string) $actual_value, (string) $expected_value) === false; 726 767 727 768 case 'starts_with': 728 return strpos( (string) $actual_value, (string) $expected_value) === 0;769 return strpos((string) $actual_value, (string) $expected_value) === 0; 729 770 730 771 case 'ends_with': 731 $expected_len = strlen( (string) $expected_value);732 return $expected_len > 0 && substr( (string) $actual_value, -$expected_len) === (string) $expected_value;772 $expected_len = strlen((string) $expected_value); 773 return $expected_len > 0 && substr((string) $actual_value, -$expected_len) === (string) $expected_value; 733 774 734 775 case 'matches_regex': … … 736 777 $pattern = (string) $expected_value; 737 778 // Auto-add delimiters if missing (JS sends bare patterns like "^foo.*$"). 738 if ( ! empty( $pattern ) && $pattern[0] !== '/' && $pattern[0] !== '#' && $pattern[0] !== '~') {739 $pattern = '/' . str_replace( '/', '\\/', $pattern) . '/';779 if (! empty($pattern) && $pattern[0] !== '/' && $pattern[0] !== '#' && $pattern[0] !== '~') { 780 $pattern = '/' . str_replace('/', '\\/', $pattern) . '/'; 740 781 } 741 782 // Suppress warnings for invalid regex. 742 return @preg_match( $pattern, (string) $actual_value) === 1;783 return @preg_match($pattern, (string) $actual_value) === 1; 743 784 744 785 default: … … 755 796 * @param mixed $expected_value Expected value from condition. 756 797 */ 757 $result = apply_filters( 'tracksure_goal_custom_operator', null, $operator, $actual_value, $expected_value);758 if ( $result !== null) {798 $result = apply_filters('tracksure_goal_custom_operator', null, $operator, $actual_value, $expected_value); 799 if ($result !== null) { 759 800 return $result; 760 801 } … … 779 820 * @return void 780 821 */ 781 private function trigger_conversion( $event_id, $goal, $event_data, $session ) { 822 private function trigger_conversion($event_id, $goal, $event_data, $session) 823 { 782 824 global $wpdb; 783 825 … … 788 830 // Prevents duplicate conversions from browser + server tracking! 789 831 790 $existing_conversion = $this->db->get_conversion_by_event_and_goal( $event_id, $goal->goal_id);791 792 if ( $existing_conversion) {793 if ( defined( 'WP_DEBUG' ) && WP_DEBUG) {832 $existing_conversion = $this->db->get_conversion_by_event_and_goal($event_id, $goal->goal_id); 833 834 if ($existing_conversion) { 835 if (defined('WP_DEBUG') && WP_DEBUG) { 794 836 error_log( 795 837 '[TrackSure] Goal Evaluator: Duplicate conversion prevented - event_id=' . … … 802 844 // Extract conversion value based on value_type. 803 845 $conversion_value = 0; 804 $value_type = isset( $goal->value_type) ? $goal->value_type : 'none';805 806 switch ( $value_type) {846 $value_type = isset($goal->value_type) ? $goal->value_type : 'none'; 847 848 switch ($value_type) { 807 849 case 'fixed': 808 850 // Use fixed_value from goal definition. 809 $conversion_value = isset( $goal->fixed_value) ? (float) $goal->fixed_value : 0;851 $conversion_value = isset($goal->fixed_value) ? (float) $goal->fixed_value : 0; 810 852 break; 811 853 812 854 case 'dynamic': 813 855 // Extract from event data (ecommerce, form, etc.). 814 if ( isset( $event_data['value'] )) {856 if (isset($event_data['value'])) { 815 857 $conversion_value = (float) $event_data['value']; 816 } elseif ( isset( $event_data['order_total'] )) {858 } elseif (isset($event_data['order_total'])) { 817 859 $conversion_value = (float) $event_data['order_total']; 818 } elseif ( isset( $event_data['conversion_value'] )) {860 } elseif (isset($event_data['conversion_value'])) { 819 861 $conversion_value = (float) $event_data['conversion_value']; 820 862 } … … 845 887 'goal_id' => $goal->goal_id, 846 888 'conversion_value' => $conversion_value, 847 'currency' => isset( $event_data['currency']) ? $event_data['currency'] : 'USD',848 'converted_at' => current_time( 'mysql', 1),889 'currency' => isset($event_data['currency']) ? $event_data['currency'] : 'USD', 890 'converted_at' => current_time('mysql', 1), 849 891 ); 850 892 … … 861 903 * @param array $session Session data. 862 904 */ 863 $conversion_data = apply_filters( 'tracksure_goal_conversion_data', $conversion_data, $goal, $event_data, $session);905 $conversion_data = apply_filters('tracksure_goal_conversion_data', $conversion_data, $goal, $event_data, $session); 864 906 865 907 // Use Conversion Recorder for the single source of truth. … … 867 909 $conversion_id = 0; 868 910 869 if ( class_exists( 'TrackSure_Conversion_Recorder' )) {911 if (class_exists('TrackSure_Conversion_Recorder')) { 870 912 $conversion_recorder = TrackSure_Conversion_Recorder::get_instance(); 871 $conversion_id = $conversion_recorder->record_conversion( $conversion_data);872 873 if ( $conversion_id && defined( 'WP_DEBUG' ) && WP_DEBUG) {874 error_log( '[TrackSure] Goal Evaluator: Conversion + attribution recorded for goal conversion ' . $conversion_id);913 $conversion_id = $conversion_recorder->record_conversion($conversion_data); 914 915 if ($conversion_id && defined('WP_DEBUG') && WP_DEBUG) { 916 error_log('[TrackSure] Goal Evaluator: Conversion + attribution recorded for goal conversion ' . $conversion_id); 875 917 } 876 918 } … … 886 928 * @param array $session Session data. 887 929 */ 888 do_action( 'tracksure_goal_conversion', $conversion_id, $goal, $event_id, $session);930 do_action('tracksure_goal_conversion', $conversion_id, $goal, $event_id, $session); 889 931 } 890 932 … … 903 945 * @return void 904 946 */ 905 public function clear_cache(): void { 947 public function clear_cache(): void 948 { 906 949 $this->active_goals = null; 907 950 $this->goals_by_event = null; 908 delete_transient( 'tracksure_active_goals_server');951 delete_transient('tracksure_active_goals_server'); 909 952 } 910 953 } -
tracksure/trunk/includes/core/tracking/class-tracksure-tracker-assets.php
r3472561 r3473414 20 20 21 21 // Exit if accessed directly. 22 if ( ! defined( 'ABSPATH' )) {22 if (! defined('ABSPATH')) { 23 23 exit; 24 24 } … … 27 27 * Tracker assets class. 28 28 */ 29 class TrackSure_Tracker_Assets { 29 class TrackSure_Tracker_Assets 30 { 30 31 31 32 … … 46 47 * @return TrackSure_Tracker_Assets 47 48 */ 48 public static function get_instance() { 49 if ( null === self::$instance ) { 49 public static function get_instance() 50 { 51 if (null === self::$instance) { 50 52 self::$instance = new self(); 51 53 } … … 56 58 * Constructor. 57 59 */ 58 private function __construct() { 59 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_tracking_script' ) ); 60 private function __construct() 61 { 62 add_action('wp_enqueue_scripts', array($this, 'enqueue_tracking_script')); 60 63 } 61 64 … … 63 66 * Enqueue tracking script. 64 67 */ 65 public function enqueue_tracking_script() { 68 public function enqueue_tracking_script() 69 { 66 70 // Don't track if user opted out. 67 if ( ! $this->should_enqueue()) {71 if (! $this->should_enqueue()) { 68 72 return; 69 73 } 70 74 71 // 1. Enqueue currency handler (no dependencies - pure utility). 72 wp_enqueue_script( 73 'ts-currency', 74 TRACKSURE_PLUGIN_URL . 'assets/js/ts-currency.js', 75 array(), 76 TRACKSURE_VERSION, 77 true 78 ); 79 80 // 2. Enqueue goal constants (shared constants for JS/React/PHP). 81 wp_enqueue_script( 82 'ts-goal-constants', 83 TRACKSURE_PLUGIN_URL . 'admin/tracksure-goal-constants.js', 84 array(), 85 TRACKSURE_VERSION, 86 true 87 ); 88 89 // 3. Enqueue main tracking script (neutral name avoids ad-blocker keyword matching). 75 // 1. Enqueue main tracking script (neutral name avoids ad-blocker keyword matching). 90 76 // Uses 'defer' strategy (WP 6.3+) so the script doesn't block HTML parsing. 91 77 // Falls back to footer loading on older WP versions. … … 109 95 ); 110 96 111 // 4. Enqueue Universal MiniCart tracking (depends on ts-web + ts-currency). 112 wp_enqueue_script( 113 'ts-minicart', 114 TRACKSURE_PLUGIN_URL . 'assets/js/ts-minicart.js', 115 array( 'ts-web', 'ts-currency' ), 116 TRACKSURE_VERSION, 117 true 118 ); 119 120 // 5. Enqueue consent change listeners (depends on ts-web for config). 97 // 2. Enqueue currency handler + minicart only when ecommerce is active. 98 // No need to load 33 KB of JS on non-ecommerce sites. 99 if ($this->is_ecommerce_active()) { 100 wp_enqueue_script( 101 'ts-currency', 102 TRACKSURE_PLUGIN_URL . 'assets/js/ts-currency.js', 103 array(), 104 TRACKSURE_VERSION, 105 array( 106 'strategy' => 'defer', 107 'in_footer' => true, 108 ) 109 ); 110 111 wp_enqueue_script( 112 'ts-minicart', 113 TRACKSURE_PLUGIN_URL . 'assets/js/ts-minicart.js', 114 array('ts-web', 'ts-currency'), 115 TRACKSURE_VERSION, 116 array( 117 'strategy' => 'defer', 118 'in_footer' => true, 119 ) 120 ); 121 } 122 123 // 3. Enqueue consent change listeners (depends on ts-web for config). 121 124 wp_enqueue_script( 122 125 'ts-consent-listeners', 123 126 TRACKSURE_PLUGIN_URL . 'assets/js/consent-listeners.js', 124 array( 'ts-web'),127 array('ts-web'), 125 128 TRACKSURE_VERSION, 126 true 127 ); 128 129 // 6. Enqueue goals tracking script (depends on constants + main tracker). 130 wp_enqueue_script( 131 'ts-goals', 132 TRACKSURE_PLUGIN_URL . 'admin/tracking-goals.js', 133 array( 'ts-goal-constants', 'ts-web' ), // Depends on both 134 TRACKSURE_VERSION, 135 true 136 ); 137 138 // Pass active goals to script. 139 wp_localize_script( 140 'ts-goals', 141 'tracksure_goals', 142 $this->get_active_goals() 143 ); 129 array( 130 'strategy' => 'defer', 131 'in_footer' => true, 132 ) 133 ); 134 135 // 4. Enqueue goals tracking only when active goals exist. 136 $active_goals = $this->get_active_goals(); 137 if (! empty($active_goals)) { 138 wp_enqueue_script( 139 'ts-goal-constants', 140 TRACKSURE_PLUGIN_URL . 'admin/tracksure-goal-constants.js', 141 array(), 142 TRACKSURE_VERSION, 143 array( 144 'strategy' => 'defer', 145 'in_footer' => true, 146 ) 147 ); 148 149 wp_enqueue_script( 150 'ts-goals', 151 TRACKSURE_PLUGIN_URL . 'admin/tracking-goals.js', 152 array('ts-goal-constants', 'ts-web'), 153 TRACKSURE_VERSION, 154 array( 155 'strategy' => 'defer', 156 'in_footer' => true, 157 ) 158 ); 159 160 wp_localize_script( 161 'ts-goals', 162 'tracksure_goals', 163 $active_goals 164 ); 165 } 144 166 } 145 167 … … 149 171 * @return array 150 172 */ 151 private function get_active_goals() { 173 private function get_active_goals() 174 { 152 175 global $wpdb; 153 176 … … 155 178 // Check cache first (5 minute TTL). 156 179 $cache_key = 'tracksure_active_goals'; 157 $cached = get_transient( $cache_key);158 159 if ( $cached !== false) {180 $cached = get_transient($cache_key); 181 182 if ($cached !== false) { 160 183 return $cached; 161 184 } … … 182 205 ); 183 206 184 if ( $wpdb->last_error) {185 if ( defined( 'WP_DEBUG' ) && WP_DEBUG) {186 187 error_log( '[TrackSure] Failed to fetch active goals: ' . $wpdb->last_error);207 if ($wpdb->last_error) { 208 if (defined('WP_DEBUG') && WP_DEBUG) { 209 210 error_log('[TrackSure] Failed to fetch active goals: ' . $wpdb->last_error); 188 211 } 189 212 return array(); … … 192 215 // Parse JSON fields. 193 216 $goals = array_map( 194 function ( $goal) {195 if ( isset( $goal['conditions'] ) && is_string( $goal['conditions'] )) {196 $decoded_conditions = json_decode( $goal['conditions'], true);197 $goal['conditions'] = ! empty( $decoded_conditions) ? $decoded_conditions : array();217 function ($goal) { 218 if (isset($goal['conditions']) && is_string($goal['conditions'])) { 219 $decoded_conditions = json_decode($goal['conditions'], true); 220 $goal['conditions'] = ! empty($decoded_conditions) ? $decoded_conditions : array(); 198 221 } 199 if ( isset( $goal['match_logic'] ) && is_string( $goal['match_logic'] )) {200 $goal['match_logic'] = json_decode( $goal['match_logic'], true);222 if (isset($goal['match_logic']) && is_string($goal['match_logic'])) { 223 $goal['match_logic'] = json_decode($goal['match_logic'], true); 201 224 } 202 225 return $goal; … … 206 229 207 230 // Cache for 5 minutes. 208 set_transient( $cache_key, $goals, 5 * MINUTE_IN_SECONDS);231 set_transient($cache_key, $goals, 5 * MINUTE_IN_SECONDS); 209 232 210 233 return $goals; … … 212 235 213 236 /** 237 * Check if any supported ecommerce plugin is active. 238 * 239 * Prevents loading ~33 KB of minicart + currency JS on non-ecommerce sites. 240 * 241 * @return bool 242 */ 243 private function is_ecommerce_active() 244 { 245 return class_exists('WooCommerce') || 246 class_exists('Easy_Digital_Downloads') || 247 class_exists('SureCart') || defined('SURECART_PLUGIN_FILE') || 248 class_exists('FluentCart\\App\\App') || 249 class_exists('Cartflows_Loader') || class_exists('FunnelKit_Funnel_Builder_Loader'); 250 } 251 252 /** 214 253 * Check if script should be enqueued. 215 254 * 216 255 * @return bool 217 256 */ 218 private function should_enqueue() { 257 private function should_enqueue() 258 { 219 259 // Master switch - tracking enabled? 220 $tracking_enabled = get_option( 'tracksure_tracking_enabled', false);221 if ( ! $tracking_enabled) {260 $tracking_enabled = get_option('tracksure_tracking_enabled', false); 261 if (! $tracking_enabled) { 222 262 return false; 223 263 } 224 264 225 265 // Don't track admins if disabled. 226 $track_admins = get_option( 'tracksure_track_admins', false);227 $is_admin = current_user_can( 'manage_options');228 if ( ! $track_admins && $is_admin) {266 $track_admins = get_option('tracksure_track_admins', false); 267 $is_admin = current_user_can('manage_options'); 268 if (! $track_admins && $is_admin) { 229 269 return false; 230 270 } 231 271 232 272 // Check excluded IPs. 233 $excluded_ips = get_option( 'tracksure_exclude_ips', '');234 if ( $excluded_ips) {235 $excluded_ips = array_map( 'trim', explode( ',', $excluded_ips ));273 $excluded_ips = get_option('tracksure_exclude_ips', ''); 274 if ($excluded_ips) { 275 $excluded_ips = array_map('trim', explode(',', $excluded_ips)); 236 276 $client_ip = TrackSure_Utilities::get_client_ip(); 237 277 238 if ( in_array( $client_ip, $excluded_ips, true )) {278 if (in_array($client_ip, $excluded_ips, true)) { 239 279 return false; 240 280 } … … 248 288 * @param bool $should_enqueue Whether to enqueue script. 249 289 */ 250 return apply_filters( 'tracksure_should_enqueue_tracker', true);290 return apply_filters('tracksure_should_enqueue_tracker', true); 251 291 } 252 292 … … 256 296 * @return bool 257 297 */ 258 private function is_auto_track_enabled() { 298 private function is_auto_track_enabled() 299 { 259 300 /** 260 301 * Filter whether auto-tracking is enabled. … … 264 305 * @param bool $auto_track Whether auto-tracking is enabled. 265 306 */ 266 return apply_filters( 'tracksure_auto_track', true);307 return apply_filters('tracksure_auto_track', true); 267 308 } 268 309 } -
tracksure/trunk/readme.txt
r3472561 r3473414 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 1.0. 07 Stable tag: 1.0.1 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 822 822 == Changelog == 823 823 824 = 1.0.1 - 2026-03-03 = 825 * Fix: Goal cards now correctly display performance data (conversions, revenue, conversion rate) — batch performance cache was returning data without the expected wrapper key 826 * Fix: 3 broken goal templates (scroll_depth, time_on_page, video_complete) now fire correctly 827 * Fix: Goal condition evaluator type coercion — wp_localize_script sends numbers as strings, causing operator comparisons to fail 828 * Fix: Ecommerce platform detection now recognizes SureCart and FunnelKit 829 * Improvement: All 6 frontend scripts now use defer loading strategy for better page speed 830 * Improvement: Conditional script loading — minicart/currency scripts only load when ecommerce is active, goal scripts only when goals exist 831 * Improvement: Added loading skeleton placeholders on goal cards while performance data loads 832 * Improvement: PHP goal evaluator uses secondary trigger_type index for faster lookups 833 * Improvement: Reduced goal cache TTL from 5 minutes to 1 minute for fresher dashboard data 834 * Improvement: Added auto-refresh (5 min) for performance queries 835 824 836 = 1.0.0 - 2026-02-05 = 825 837 - Initial release … … 835 847 == Upgrade Notice == 836 848 849 = 1.0.1 = 850 Bug fix release: Fixes goal performance data not displaying on cards, broken goal templates, and type coercion issues. Adds deferred script loading for better page speed. 851 837 852 = 1.0.0 = 838 853 Initial release of TrackSure - Complete first-party analytics and attribution platform for WordPress. -
tracksure/trunk/tracksure.php
r3472561 r3473414 5 5 * Plugin URI: https://tracksure.cloud 6 6 * Description: Server-side tracking, analytics and pixel manager for WordPress. Boost ROAS with Conversion API (CAPI), recover lost conversions from ad blockers, and run first-party analytics. 7 * Version: 1.0. 07 * Version: 1.0.1 8 8 * Author: TrackSure Team 9 9 * Author URI: https://profiles.wordpress.org/tracksure/ … … 19 19 20 20 // Exit if accessed directly. 21 if ( ! defined( 'ABSPATH' )) {21 if (! defined('ABSPATH')) { 22 22 exit; 23 23 } 24 24 25 25 // Define plugin constants. 26 define( 'TRACKSURE_VERSION', '1.0.0');27 define( 'TRACKSURE_DB_VERSION', '1.0.0');28 define( 'TRACKSURE_PLUGIN_FILE', __FILE__);29 define( 'TRACKSURE_PLUGIN_DIR', plugin_dir_path( __FILE__ ));30 define( 'TRACKSURE_PLUGIN_URL', plugin_dir_url( __FILE__ ));31 define( 'TRACKSURE_PLUGIN_BASENAME', plugin_basename( __FILE__ ));26 define('TRACKSURE_VERSION', '1.0.1'); 27 define('TRACKSURE_DB_VERSION', '1.0.0'); 28 define('TRACKSURE_PLUGIN_FILE', __FILE__); 29 define('TRACKSURE_PLUGIN_DIR', plugin_dir_path(__FILE__)); 30 define('TRACKSURE_PLUGIN_URL', plugin_dir_url(__FILE__)); 31 define('TRACKSURE_PLUGIN_BASENAME', plugin_basename(__FILE__)); 32 32 33 33 // Core paths (bundled inside free plugin). 34 define( 'TRACKSURE_CORE_DIR', TRACKSURE_PLUGIN_DIR . 'includes/core/');35 define( 'TRACKSURE_CORE_URL', TRACKSURE_PLUGIN_URL . 'includes/core/');36 define( 'TRACKSURE_FREE_DIR', TRACKSURE_PLUGIN_DIR . 'includes/free/');37 define( 'TRACKSURE_REGISTRY_DIR', TRACKSURE_PLUGIN_DIR . 'registry/');38 define( 'TRACKSURE_ADMIN_DIR', TRACKSURE_PLUGIN_DIR . 'admin/');34 define('TRACKSURE_CORE_DIR', TRACKSURE_PLUGIN_DIR . 'includes/core/'); 35 define('TRACKSURE_CORE_URL', TRACKSURE_PLUGIN_URL . 'includes/core/'); 36 define('TRACKSURE_FREE_DIR', TRACKSURE_PLUGIN_DIR . 'includes/free/'); 37 define('TRACKSURE_REGISTRY_DIR', TRACKSURE_PLUGIN_DIR . 'registry/'); 38 define('TRACKSURE_ADMIN_DIR', TRACKSURE_PLUGIN_DIR . 'admin/'); 39 39 40 40 /** … … 46 46 * @since 1.0.0 47 47 */ 48 final class TrackSure { 48 final class TrackSure 49 { 49 50 50 51 … … 80 81 * @return TrackSure 81 82 */ 82 public static function instance() { 83 if ( is_null( self::$instance ) ) { 83 public static function instance() 84 { 85 if (is_null(self::$instance)) { 84 86 self::$instance = new self(); 85 87 } … … 92 94 * @since 1.0.0 93 95 */ 94 private function __construct() { 95 add_action( 'plugins_loaded', array( $this, 'init' ), 10 ); 96 private function __construct() 97 { 98 add_action('plugins_loaded', array($this, 'init'), 10); 96 99 } 97 100 … … 102 105 * @return void 103 106 */ 104 public function init() { 107 public function init() 108 { 105 109 // 1. Load Core engine (bundled inside). 106 if ( ! file_exists( TRACKSURE_CORE_DIR . 'class-tracksure-core.php' )) {110 if (! file_exists(TRACKSURE_CORE_DIR . 'class-tracksure-core.php')) { 107 111 add_action( 108 112 'admin_notices', … … 110 114 printf( 111 115 '<div class="notice notice-error"><p>%s</p></div>', 112 esc_html__( 'TrackSure Error: Core engine file not found. Please reinstall the plugin.', 'tracksure')116 esc_html__('TrackSure Error: Core engine file not found. Please reinstall the plugin.', 'tracksure') 113 117 ); 114 118 } … … 121 125 122 126 // 2. Load Free module pack. 123 if ( ! file_exists( TRACKSURE_FREE_DIR . 'class-tracksure-free.php' )) {127 if (! file_exists(TRACKSURE_FREE_DIR . 'class-tracksure-free.php')) { 124 128 add_action( 125 129 'admin_notices', … … 127 131 printf( 128 132 '<div class="notice notice-error"><p>%s</p></div>', 129 esc_html__( 'TrackSure Error: Free module file not found. Please reinstall the plugin.', 'tracksure')133 esc_html__('TrackSure Error: Free module file not found. Please reinstall the plugin.', 'tracksure') 130 134 ); 131 135 } … … 135 139 136 140 require_once TRACKSURE_FREE_DIR . 'class-tracksure-free.php'; 137 $this->free = new TrackSure_Free( $this->core);141 $this->free = new TrackSure_Free($this->core); 138 142 139 143 // 3. Fire extension hook (Pro/3rd-party can register features). 140 do_action( 'tracksure_loaded', $this->core);144 do_action('tracksure_loaded', $this->core); 141 145 } 142 146 … … 147 151 * @return void 148 152 */ 149 public static function activate() { 153 public static function activate() 154 { 150 155 // Load required core files. 151 156 require_once TRACKSURE_CORE_DIR . 'class-tracksure-db.php'; … … 158 163 // Set flag to flush permalinks on next admin load. 159 164 // Can't flush here because TrackSure_Core isn't loaded yet. 160 update_option( 'tracksure_needs_permalink_flush', '1');165 update_option('tracksure_needs_permalink_flush', '1'); 161 166 162 167 // Set flag to redirect to settings page on first admin load. 163 set_transient( 'tracksure_activation_redirect', true, 60);168 set_transient('tracksure_activation_redirect', true, 60); 164 169 165 170 // Clear all scheduled cron jobs to prevent duplicates. 166 wp_clear_scheduled_hook( 'tracksure_aggregate_hourly');167 wp_clear_scheduled_hook( 'tracksure_aggregate_daily');168 wp_clear_scheduled_hook( 'tracksure_delivery_worker');169 wp_clear_scheduled_hook( 'tracksure_cleanup_data');170 wp_clear_scheduled_hook( 'tracksure_cleanup_logs');171 wp_clear_scheduled_hook('tracksure_aggregate_hourly'); 172 wp_clear_scheduled_hook('tracksure_aggregate_daily'); 173 wp_clear_scheduled_hook('tracksure_delivery_worker'); 174 wp_clear_scheduled_hook('tracksure_cleanup_data'); 175 wp_clear_scheduled_hook('tracksure_cleanup_logs'); 171 176 172 177 // Clear Action Scheduler delivery tasks (prevents duplicates on reactivation). 173 wp_clear_scheduled_hook( 'tracksure_deliver_events');174 if ( function_exists( 'as_unschedule_all_actions' )) {175 as_unschedule_all_actions( 'tracksure_deliver_events', array(), 'tracksure');178 wp_clear_scheduled_hook('tracksure_deliver_events'); 179 if (function_exists('as_unschedule_all_actions')) { 180 as_unschedule_all_actions('tracksure_deliver_events', array(), 'tracksure'); 176 181 } 177 182 … … 186 191 * @return void 187 192 */ 188 public static function deactivate() { 193 public static function deactivate() 194 { 189 195 // Clear all WP-Cron scheduled hooks. 190 wp_clear_scheduled_hook( 'tracksure_aggregate_hourly');191 wp_clear_scheduled_hook( 'tracksure_aggregate_daily');192 wp_clear_scheduled_hook( 'tracksure_delivery_worker');193 wp_clear_scheduled_hook( 'tracksure_cleanup_data');194 wp_clear_scheduled_hook( 'tracksure_cleanup_logs');196 wp_clear_scheduled_hook('tracksure_aggregate_hourly'); 197 wp_clear_scheduled_hook('tracksure_aggregate_daily'); 198 wp_clear_scheduled_hook('tracksure_delivery_worker'); 199 wp_clear_scheduled_hook('tracksure_cleanup_data'); 200 wp_clear_scheduled_hook('tracksure_cleanup_logs'); 195 201 196 202 // Clean up Action Scheduler tasks (if AS is available). … … 213 219 * @return TrackSure 214 220 */ 215 function tracksure() { 221 function tracksure() 222 { 216 223 return TrackSure::instance(); 217 224 } … … 226 233 * @return void 227 234 */ 228 function tracksure_activation_redirect() { 235 function tracksure_activation_redirect() 236 { 229 237 // Check if we need to redirect. 230 if ( ! get_transient( 'tracksure_activation_redirect' )) {238 if (! get_transient('tracksure_activation_redirect')) { 231 239 return; 232 240 } 233 241 234 242 // Delete the transient so this only runs once. 235 delete_transient( 'tracksure_activation_redirect');243 delete_transient('tracksure_activation_redirect'); 236 244 237 245 // Don't redirect during bulk activation (activating multiple plugins at once). 238 246 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only check, no data processed. 239 if ( isset( $_GET['activate-multi'] )) {247 if (isset($_GET['activate-multi'])) { 240 248 return; 241 249 } 242 250 243 251 // Don't redirect during AJAX, WP-CLI, or REST API requests. 244 if ( wp_doing_ajax() || ( defined( 'WP_CLI' ) && constant( 'WP_CLI' ) ) || defined( 'REST_REQUEST' )) {252 if (wp_doing_ajax() || (defined('WP_CLI') && constant('WP_CLI')) || defined('REST_REQUEST')) { 245 253 return; 246 254 } 247 255 248 256 // Only redirect if user has permission to access TrackSure. 249 if ( ! current_user_can( 'manage_options' )) {257 if (! current_user_can('manage_options')) { 250 258 return; 251 259 } 252 260 253 261 // Redirect to TrackSure settings page (React app #/settings route). 254 wp_safe_redirect( admin_url( 'admin.php?page=tracksure#/settings' ));262 wp_safe_redirect(admin_url('admin.php?page=tracksure#/settings')); 255 263 exit; 256 264 } 257 265 258 266 // Register activation/deactivation hooks BEFORE initializing plugin. 259 register_activation_hook( TRACKSURE_PLUGIN_FILE, array( 'TrackSure', 'activate' ));260 register_deactivation_hook( TRACKSURE_PLUGIN_FILE, array( 'TrackSure', 'deactivate' ));267 register_activation_hook(TRACKSURE_PLUGIN_FILE, array('TrackSure', 'activate')); 268 register_deactivation_hook(TRACKSURE_PLUGIN_FILE, array('TrackSure', 'deactivate')); 261 269 262 270 // Redirect to settings page after first activation. 263 add_action( 'admin_init', 'tracksure_activation_redirect');271 add_action('admin_init', 'tracksure_activation_redirect'); 264 272 265 273 // Initialize plugin.
Note: See TracChangeset
for help on using the changeset viewer.