diff --git a/Client-Client/dist/bundle.js b/Client-Client/dist/bundle.js index 7bfef7f..0ecca80 100644 --- a/Client-Client/dist/bundle.js +++ b/Client-Client/dist/bundle.js @@ -1,2 +1,2 @@ /*! For license information please see bundle.js.LICENSE.txt */ -(()=>{"use strict";var e={20(e,t,n){var r=n(540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,c={key:!0,ref:!0,__self:!0,__source:!0};function l(e,t,n){var r,a={},l=null,d=null;for(r in void 0!==n&&(l=""+n),void 0!==t.key&&(l=""+t.key),void 0!==t.ref&&(d=t.ref),t)i.call(t,r)&&!c.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:l,ref:d,props:a,_owner:s.current}}t.Fragment=a,t.jsx=l,t.jsxs=l},27(e,t,n){n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,"/* ═══════════════════════════════════════════════════\n Campaign Intelligence Styles\n ═══════════════════════════════════════════════════ */\n\n/* Tabs */\n.intel-tabs {\n display: flex;\n gap: 4px;\n padding: 4px;\n background: var(--color-bg-subtle);\n border-radius: var(--radius-lg);\n margin-bottom: 24px;\n}\n.intel-tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: none;\n border: none;\n border-radius: var(--radius-md);\n font-size: 14px;\n font-weight: 500;\n font-family: var(--font-sans);\n color: var(--color-text-secondary);\n cursor: pointer;\n transition: all var(--transition-fast);\n position: relative;\n}\n.intel-tab:hover { background: var(--color-bg-elevated); color: var(--color-text); }\n.intel-tab.active {\n background: var(--color-bg-elevated);\n color: var(--color-primary);\n box-shadow: var(--shadow-sm);\n font-weight: 600;\n}\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: var(--color-danger);\n color: white;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 700;\n}\n\n/* Alert Summary */\n.intel-alert-summary { display: flex; gap: 8px; align-items: center; }\n.intel-alert-badge {\n display: inline-flex;\n align-items: center;\n padding: 4px 12px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 600;\n}\n.intel-alert-badge.sev-critical { background: var(--color-danger-light); color: var(--color-danger); }\n.intel-alert-badge.sev-warning { background: var(--color-warning-light); color: var(--color-warning); }\n.intel-alert-badge.sev-info { background: var(--color-primary-light); color: var(--color-primary); }\n\n/* Section Header */\n.intel-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n}\n.intel-section-header h3 { font-size: 16px; font-weight: 600; }\n\n/* ─── Health Cards ─── */\n.health-grid { display: flex; flex-direction: column; gap: 16px; }\n.health-card {\n background: var(--color-bg-elevated);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-lg);\n padding: 20px;\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n.health-card:hover { box-shadow: var(--shadow-md); border-color: var(--color-text-muted); }\n.health-card.health-red { border-left: 4px solid var(--color-danger); }\n.health-card.health-yellow { border-left: 4px solid var(--color-warning); }\n.health-card.health-green { border-left: 4px solid var(--color-success); }\n\n.health-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n.health-card-title { display: flex; align-items: center; gap: 8px; font-size: 16px; font-weight: 600; }\n.health-dot { font-size: 14px; }\n.health-status-label {\n font-size: 12px;\n font-weight: 600;\n padding: 2px 10px;\n border-radius: 12px;\n}\n.health-status-label.health-green { background: var(--color-success-light); color: var(--color-success); }\n.health-status-label.health-yellow { background: var(--color-warning-light); color: var(--color-warning); }\n.health-status-label.health-red { background: var(--color-danger-light); color: var(--color-danger); }\n\n.health-card-meta {\n display: flex;\n gap: 8px;\n font-size: 13px;\n color: var(--color-text-muted);\n margin-bottom: 14px;\n}\n\n.health-channels { display: flex; flex-direction: column; gap: 6px; }\n.health-channel-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--color-bg-subtle);\n border-radius: var(--radius-md);\n font-size: 13px;\n}\n.health-channel-info { display: flex; align-items: center; gap: 8px; min-width: 140px; }\n.health-channel-dot { font-size: 10px; }\n.health-channel-name { font-weight: 500; }\n.health-channel-stats { display: flex; gap: 16px; color: var(--color-text-secondary); }\n.health-channel-alerts { display: flex; gap: 4px; }\n.alert-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 6px;\n border-radius: 11px;\n font-size: 11px;\n font-weight: 700;\n}\n.alert-count.sev-critical { background: var(--color-danger-light); color: var(--color-danger); }\n.alert-count.sev-warning { background: var(--color-warning-light); color: var(--color-warning); }\n\n/* ─── Recommendations ─── */\n.rec-filters { display: flex; gap: 6px; }\n.rec-list { display: flex; flex-direction: column; gap: 12px; }\n.rec-card {\n background: var(--color-bg-elevated);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-lg);\n padding: 16px 20px;\n transition: all var(--transition-fast);\n}\n.rec-card.sev-critical { border-left: 4px solid var(--color-danger); }\n.rec-card.sev-warning { border-left: 4px solid var(--color-warning); }\n.rec-card.sev-info { border-left: 4px solid var(--color-primary); }\n\n.rec-card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 10px;\n font-size: 12px;\n}\n.rec-severity {\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 8px;\n}\n.rec-severity.sev-critical { background: var(--color-danger-light); color: var(--color-danger); }\n.rec-severity.sev-warning { background: var(--color-warning-light); color: var(--color-warning); }\n.rec-severity.sev-info { background: var(--color-primary-light); color: var(--color-primary); }\n\n.rec-category {\n color: var(--color-text-muted);\n text-transform: capitalize;\n}\n.rec-channel { color: var(--color-text-secondary); font-weight: 500; }\n.rec-time { color: var(--color-text-muted); margin-left: auto; }\n\n.rec-card-body { margin-bottom: 12px; }\n.rec-initiative { font-size: 13px; font-weight: 600; color: var(--color-text-secondary); margin-bottom: 4px; }\n.rec-message { font-size: 14px; color: var(--color-text); line-height: 1.5; }\n.rec-metric {\n margin-top: 8px;\n font-size: 12px;\n color: var(--color-text-muted);\n font-family: var(--font-mono);\n}\n.rec-metric strong { color: var(--color-text-secondary); }\n\n.rec-card-actions {\n display: flex;\n gap: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--color-border-light);\n}\n\n/* ─── Budget Pacing ─── */\n.pacing-select-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n}\n.pacing-select-card {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 16px 20px;\n background: var(--color-bg-elevated);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-lg);\n cursor: pointer;\n text-align: left;\n transition: all var(--transition-fast);\n font-family: var(--font-sans);\n}\n.pacing-select-card:hover { box-shadow: var(--shadow-md); border-color: var(--color-primary); }\n.pacing-select-name { font-size: 15px; font-weight: 600; color: var(--color-text); }\n.pacing-select-meta { font-size: 13px; color: var(--color-text-muted); }\n\n.pacing-bar-container {\n background: var(--color-bg-elevated);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-lg);\n padding: 20px;\n margin-top: 20px;\n}\n.pacing-bar-labels {\n display: flex;\n justify-content: space-between;\n font-size: 13px;\n color: var(--color-text-secondary);\n margin-bottom: 10px;\n}\n.pacing-bar {\n position: relative;\n height: 24px;\n background: var(--color-bg-subtle);\n border-radius: 12px;\n overflow: hidden;\n}\n.pacing-bar-expected {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: var(--color-bg-muted);\n border-radius: 12px;\n z-index: 1;\n}\n.pacing-bar-actual {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n border-radius: 12px;\n z-index: 2;\n transition: width 0.5s ease;\n}\n.pacing-bar-actual.on-track { background: var(--color-success); opacity: 0.8; }\n.pacing-bar-actual.overpacing { background: var(--color-danger); opacity: 0.8; }\n.pacing-bar-actual.underpacing { background: var(--color-warning); opacity: 0.8; }\n\n.pacing-bar-legend {\n display: flex;\n gap: 20px;\n margin-top: 10px;\n font-size: 12px;\n color: var(--color-text-muted);\n}\n.legend-dot {\n display: inline-block;\n width: 10px;\n height: 10px;\n border-radius: 5px;\n margin-right: 6px;\n vertical-align: middle;\n}\n.legend-dot.expected { background: var(--color-bg-muted); }\n.legend-dot.actual { background: var(--color-success); }\n\n/* Color helpers */\n.text-red { color: var(--color-danger) !important; }\n.text-orange { color: var(--color-warning) !important; }\n.text-green { color: var(--color-success) !important; }\n.text-blue { color: var(--color-primary) !important; }\n\n/* Responsive */\n@media (max-width: 900px) {\n .health-channel-stats { display: none; }\n .rec-card-header { flex-wrap: wrap; }\n .pacing-select-grid { grid-template-columns: 1fr; }\n}\n",""]);const s=i},56(e,t,n){e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},72(e){var t=[];function n(e){for(var n=-1,r=0;r0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n}).join("")},t.i=function(e,n,r,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var s=0;s0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=a),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),t.push(d))}},t}},321(e,t,n){n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,"/* ════════════════════════════════════════════════\n Forecast Comparison Card — AllocationStep\n Add to existing wizard stylesheet\n ════════════════════════════════════════════════ */\n\n.forecast-section {\n margin: 16px 0 24px;\n}\n\n.forecast-loading {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 20px;\n background: var(--surface-secondary, #f8f9fb);\n border-radius: 12px;\n color: var(--text-secondary, #6b7280);\n font-size: 0.9rem;\n}\n\n.forecast-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #fef3c7;\n border-radius: 8px;\n color: #92400e;\n font-size: 0.85rem;\n}\n\n/* ── Card container ── */\n\n.forecast-card {\n background: var(--surface-secondary, #f8f9fb);\n border: 1px solid var(--border-light, #e5e7eb);\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 16px;\n}\n\n.forecast-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--border-light, #e5e7eb);\n background: white;\n}\n\n.forecast-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 0.95rem;\n color: var(--text-primary, #1a1a2e);\n}\n\n.forecast-objective-tag {\n font-size: 0.78rem;\n padding: 3px 10px;\n border-radius: 20px;\n background: var(--primary-light, #eef2ff);\n color: var(--primary, #4F46E5);\n font-weight: 500;\n}\n\n/* ── Channel comparison columns ── */\n\n.forecast-channels {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: 1px;\n background: var(--border-light, #e5e7eb);\n}\n\n.forecast-channel {\n background: white;\n padding: 16px 18px;\n}\n\n.forecast-channel-template {\n background: #fafafa;\n}\n\n.forecast-ch-header {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 12px;\n flex-wrap: wrap;\n}\n\n.forecast-ch-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.forecast-ch-name {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--text-primary, #1a1a2e);\n}\n\n.forecast-ch-budget {\n margin-left: auto;\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--text-secondary, #6b7280);\n}\n\n/* ── Metrics grid ── */\n\n.forecast-ch-metrics {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 8px;\n margin-bottom: 10px;\n}\n\n.forecast-metric {\n display: flex;\n flex-direction: column;\n}\n\n.forecast-metric-value {\n font-size: 1.15rem;\n font-weight: 700;\n color: var(--text-primary, #1a1a2e);\n line-height: 1.2;\n}\n\n.forecast-metric-label {\n font-size: 0.75rem;\n color: var(--text-tertiary, #9ca3af);\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n\n/* ── Detail row (CPC, CPM, CPA) ── */\n\n.forecast-ch-detail {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n font-size: 0.8rem;\n color: var(--text-secondary, #6b7280);\n margin-bottom: 8px;\n}\n\n/* ── Strength label ── */\n\n.forecast-ch-strength {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--text-secondary, #6b7280);\n padding-top: 8px;\n border-top: 1px solid var(--border-light, #e5e7eb);\n}\n\n.forecast-strength-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n}\n\n/* ── Confidence indicator ── */\n\n.forecast-ch-confidence {\n font-size: 0.75rem;\n color: var(--text-tertiary, #9ca3af);\n margin-top: 4px;\n}\n\n/* ── Template-only note (TikTok etc.) ── */\n\n.forecast-ch-template-note {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 0.82rem;\n color: var(--text-tertiary, #9ca3af);\n line-height: 1.4;\n padding: 8px 0;\n}\n\n.forecast-ch-template-note svg {\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n/* ── Recommendation highlights ── */\n\n.forecast-highlights {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 18px;\n background: white;\n border-top: 1px solid var(--border-light, #e5e7eb);\n}\n\n.forecast-highlight {\n font-size: 0.82rem;\n padding: 4px 12px;\n background: var(--surface-secondary, #f8f9fb);\n border-radius: 20px;\n color: var(--text-secondary, #6b7280);\n}\n\n/* ── Reset button ── */\n\n.forecast-reset-btn {\n margin: 8px 18px 12px;\n}\n",""]);const s=i},338(e,t,n){var r=n(961);t.H=r.createRoot,r.hydrateRoot},463(e,t){function n(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(!(0>>1;ra(c,n))la(d,c)?(e[r]=d,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else{if(!(la(d,n)))break e;e[r]=d,e[l]=n,r=l}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,c=s.now();t.unstable_now=function(){return s.now()-c}}var l=[],d=[],u=1,h=null,p=3,f=!1,g=!1,m=!1,v="function"==typeof setTimeout?setTimeout:null,b="function"==typeof clearTimeout?clearTimeout:null,y="undefined"!=typeof setImmediate?setImmediate:null;function x(e){for(var t=r(d);null!==t;){if(null===t.callback)o(d);else{if(!(t.startTime<=e))break;o(d),t.sortIndex=t.expirationTime,n(l,t)}t=r(d)}}function w(e){if(m=!1,x(e),!g)if(null!==r(l))g=!0,O(k);else{var t=r(d);null!==t&&R(w,t.startTime-e)}}function k(e,n){g=!1,m&&(m=!1,b(T),T=-1),f=!0;var a=p;try{for(x(n),h=r(l);null!==h&&(!(h.expirationTime>n)||e&&!N());){var i=h.callback;if("function"==typeof i){h.callback=null,p=h.priorityLevel;var s=i(h.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?h.callback=s:h===r(l)&&o(l),x(n)}else o(l);h=r(l)}if(null!==h)var c=!0;else{var u=r(d);null!==u&&R(w,u.startTime-n),c=!1}return c}finally{h=null,p=a,f=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var C,S=!1,j=null,T=-1,I=5,A=-1;function N(){return!(t.unstable_now()-Ae||125i?(e.sortIndex=a,n(d,e),null===r(l)&&e===r(d)&&(m?(b(T),T=-1):m=!0,R(w,a-i))):(e.sortIndex=s,n(l,e),g||f||(g=!0,O(k))),e},t.unstable_shouldYield=N,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},540(e,t,n){e.exports=n(287)},551(e,t,n){var r=n(540),o=n(982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n