From 451a47cdcd09fd18f5b27708fe5cbd0641c5c0ca Mon Sep 17 00:00:00 2001 From: myprestarocks Date: Wed, 4 Feb 2026 11:49:01 +0000 Subject: [PATCH] Add schedule preview dropdown styles and various improvements - Add .schedule-preview-dropdown and .schedule-preview-item CSS classes - Add .btn-schedule-preview badge styling - Add preview functionality for entity list views - Improve modal and dropdown styling - Various JS and SCSS enhancements Co-Authored-By: Claude Opus 4.5 --- assets/css/admin/entity-selector.css | 61 + assets/css/admin/entity-selector.css.map | 2 +- assets/js/admin/entity-selector.js.bak | 10186 ++++++++++++++++ gulpfile.js | 6 +- sources/js/admin/entity-selector/_core.js | 42 +- sources/js/admin/entity-selector/_dropdown.js | 14 + sources/js/admin/entity-selector/_events.js | 64 +- sources/js/admin/entity-selector/_filters.js | 61 +- sources/js/admin/entity-selector/_preview.js | 467 + sources/scss/_mixins.scss | 3 +- sources/scss/components/_combinations.scss | 3 +- sources/scss/components/_condition-trait.scss | 65 + sources/scss/components/_entity-selector.scss | 49 + sources/scss/components/_groups.scss | 14 + sources/scss/components/_list-preview.scss | 70 + sources/scss/components/_modal.scss | 215 +- sources/scss/components/_tree.scss | 3 +- sources/scss/components/_value-picker.scss | 26 +- src/EntitySelector.php | 303 + src/EntitySelector/EntitySearchEngine.php | 50 +- src/EntitySelector/EntitySelectorRenderer.php | 179 +- src/ScheduleConditions.php | 18 +- 22 files changed, 11860 insertions(+), 41 deletions(-) create mode 100644 assets/js/admin/entity-selector.js.bak diff --git a/assets/css/admin/entity-selector.css b/assets/css/admin/entity-selector.css index a3831eb..b069df0 100644 --- a/assets/css/admin/entity-selector.css +++ b/assets/css/admin/entity-selector.css @@ -8579,6 +8579,67 @@ body > .target-search-dropdown .dropdown-item:not(:last-child) { opacity: 0.9; } +.schedule-preview-dropdown { + display: none; + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); + margin-top: 4px; + z-index: 1000; + min-width: 180px; + padding: 0.5rem; + background: #ffffff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175); + font-size: 0.875rem; + text-align: left; + white-space: nowrap; +} + +.schedule-preview-item { + display: flex; + align-items: flex-start; + gap: 0.5rem; + padding: 0.25rem 0; + color: #212529; +} +.schedule-preview-item .material-icons { + flex-shrink: 0; + font-size: 16px; + color: #6c757d; +} +.schedule-preview-item strong { + font-weight: 600; +} +.schedule-preview-item .schedule-time { + color: #6c757d; +} + +.btn-schedule-preview { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.25rem; + min-width: 20px; + height: 20px; + padding: 0 0.5rem; + background: #25b9d7; + color: #ffffff; + font-size: 0.75rem; + font-weight: 600; + border-radius: 50rem; + cursor: pointer; + text-transform: none; +} +.btn-schedule-preview .icon-eye { + font-size: 10px; + line-height: 1; + opacity: 0.8; +} + /** * Entity Selector Styles * @package prestashop-entity-selector diff --git a/assets/css/admin/entity-selector.css.map b/assets/css/admin/entity-selector.css.map index fd142c1..bd2dbaf 100644 --- a/assets/css/admin/entity-selector.css.map +++ b/assets/css/admin/entity-selector.css.map @@ -1 +1 @@ -{"version":3,"sources":["main.scss","_variables.scss","../../../prestashop-admin/assets/scss/_variables.scss","_mixins.scss","layouts/_form-integration.scss","layouts/_responsive.scss","components/_entity-selector.scss","components/_entity-item.scss","components/_dropdown.scss","components/_chips.scss","components/_groups.scss","components/_value-picker.scss","components/_modal.scss","components/_list-preview.scss","components/_schedule.scss","components/_tips.scss","components/_condition-trait.scss","components/_combinations.scss","components/_method-dropdown.scss","components/_tooltip.scss","components/_tree.scss","components/_validation.scss"],"names":[],"mappings":"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;EACA,OJjJC;;AIqJL;AAAA;EACI;EACA,YL5JG;EK6JH;;AAIJ;AAAA;EACI;EACA;EACA;EACA;EACA,YL/HO;EKgIP;;AAGJ;AAAA;EACI;EACA;EACA;EACA,KL9FQ;EK+FR;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OJnLI;EIoLJ,WLvDU;EKwDV,aLnDgB;EKoDhB;EACA;;AAEA;AAAA;EACI,YLrJG;EKsJH,OLjJG;;AKoJP;AAAA;EACI,YLlMD;EKmMC,qBL9IE;EK+IF,OJlMF;;AIqMF;AAAA;EACI,WLxEM;;AK2EV;AAAA;EACI;;AAGJ;AAAA;EH5CJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AK4Ed;AAAA;EHhDJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YFhIW;EEiIX,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AKkFlB;AAAA;EACI;EACA;EACA,YLrLO;EKsLP;EACA;;AAEA;AAAA;EACI;EACA;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,YLtMO;EKuMP;EACA,OL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EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,KPhSQ;EOiSR,SP9RQ;EO+RR;EACA,ONhXI;;AMkXJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA,WP5PM;;AOiQd;AAAA;EACI;EACA;EACA;EACA,SPlTQ;EOmTR,ONnYI;;AMqYJ;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA,KN5ZC;EM6ZD;EACA,YP/WM;EOgXN;EACA;;AAIJ;AAAA;EACI;EACA;EACA,KP/UQ;EOgVR,WPhSU;EOiSV,ON7ZI;;AM+ZJ;AAAA;EACI,ONhaA;;AMmaJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eNlZO;EMmZP;EACA;EACA,WP/SM;EOgTN,OP9YE;EO+YF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cNlbN;;AMqbE;AAAA;AAAA;AAAA;EACI;EACA,cNvbN;;AM2bF;AAAA;EACI,ON3bA;;AM6bA;AAAA;EACI,OPhaF;EOiaE,aP5TU;;AOgUlB;AAAA;ELvaJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK8ZA;AAAA;EAEI;EACA,WP1UM;EO2UN,ONxcF;EMycE;EACA,eNnbO;EMobP;;AAEA;AAAA;EACI,YP1cG;;AOgdf;AAAA;EACI;EACA;EACA,KPzYQ;;AO4YZ;AAAA;EL7bA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKobJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WPnWU;EOoWV,aP9VgB;EO+VhB,eN3cW;EM4cX;;AAEA;AAAA;EACI;EACA;EACA;EACA;EACA,aPxWY;;AO2WhB;AAAA;EACI,OP/cE;EOgdF,YPjfD;EOkfC;;AAEA;AAAA;EACI,YP9cD;EO+cC,cPxdF;;AO4dN;AAAA;AAAA;EAEI,OP5fD;EO6fC,YN3fF;EM4fE;;AAEA;AAAA;AAAA;EACI,YP5fG;EO6fH,cP7fG;;AOggBP;AAAA;AAAA;EACI;;AAMZ;AAAA;EACI;;AAGJ;AAAA;EACI;;AAIJ;AAAA;EACI,SN/hBC;EMgiBD,YPjfM;EOkfN;;AAGJ;AAAA;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xBR,SNl3BC;EMm3BD,YNl2BA;EMm2BA;EACA;EACA;;AAGJ;AAAA;EACI,WPjvBU;EOkvBV,aP5uBkB;EO6uBlB,OPh1BM;EOi1BN;;AAGJ;AAAA;EACI;EACA;EACA,KP3yBQ;EO4yBR;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;ELj2BA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AKw1BJ;AAAA;AAAA;AAAA;EAGI;EACA;EACA;EACA;EACA,WPxwBU;EOywBV,OPv2BM;EOw2BN,YPz4BG;EO04BH;EACA,eNl3BW;EMm3BX;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,YPp3BE;EOq3BF,cPx2BG;;AO22BP;AAAA;AAAA;AAAA;EACI;EACA;EACA,YPh3BG;EOi3BH;EACA,ONt5BA;;AM05BR;AAAA;EACI;EACA;;AAIJ;AAAA;ELj0BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AOo4BV;AAAA;EAEI;EACA,WPvyBU;EOwyBV;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ONp7BI;EMq7BJ,YPx7BG;EOy7BH;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI,YPv6BE;EOw6BF,OPj6BE;;AOo6BN;AAAA;EACI,YPl8BO;EOm8BP,cNv8BF;EMw8BE,ONx8BF;;AM48BN;AAAA;EL52BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AO+6BV;AAAA;EAEI;EACA,WPl1BU;EOm1BV;EACA;;AAGJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON99BI;EM+9BJ,YPl+BG;EOm+BH;EACA,eN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EACI,WP/tCM;EOguCN,aPztCc;EO0tCd,OP/zCE;EOg0CF;;AAGJ;AAAA;ELr0CJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK4zCA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,ONz2CA;EM02CA,eNp1CO;;AMs1CP;AAAA;EACI,YPx0CD;EOy0CC,OP90CF;;AOo1CV;AAAA;EACI,aPnvCgB;;AOsvCpB;AAAA;EACI;EACA,ON13CI;EM23CJ;;AAGJ;AAAA;AAAA;AAAA;EACI;;AAIJ;AAAA;EACI;EACA;;AL7wCJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;EC0HA;;AAGJ;AAAA;EACI,YD/GO;ECgHP;;AAEA;AAAA;EACI,YF5GE;;AO82CV;AAAA;EACI;EACA;EACA,KPh0CQ;EOi0CR,SPh0CQ;;AOm0CZ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI,YN15CF;EM25CE,cN35CF;;AM+5CN;AAAA;EACI;EACA;EACA;EACA;EACA,eN74CW;EM84CX,YPh4CO;;AOm4CX;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,WPhzCU;EOizCV,aP5yCgB;EO6yChB,OP/4CM;EEfV;EACA;EACA;;AKg6CA;AAAA;EACI,WPxzCU;EOyzCV,ONr7CI;ECiBR;EACA;EACA;;AKu6CA;AAAA;EACI;EACA;EACA;EACA,KN18CC;EM28CD;EACA,YP75CM;EO85CN;EACA;;AAGJ;AAAA;EACI;EACA;EACA,KP53CQ;EO63CR,WP70CU;EO80CV,ON18CI;;AM48CJ;AAAA;EACI,ON78CA;;AMg9CJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eN/7CO;EMg8CP;EACA;EACA,WP51CM;EO61CN,OP37CE;EO47CF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cN/9CN;;AMk+CE;AAAA;AAAA;AAAA;EACI;EACA,cNp+CN;;AMw+CF;AAAA;EACI,ONx+CA;;AM0+CA;AAAA;EACI,OP78CF;EO88CE,aPz2CU;;AO82CtB;AAAA;EACI;EACA;EACA,KPv6CQ;;AO06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;EACA,YR3vBO;EQ4vBP,ePluBe;EOmuBf,YRvpBW;EQwpBX;;AAEA;EACI;EACA;EACA;EACA,KRprBQ;EQqrBR;EACA,YP9vBA;EO+vBA;;AAGJ;EACI;EACA;EACA,KR7rBQ;EQ8rBR,WR9oBU;EQ+oBV,aRzoBkB;EQ0oBlB,OR7uBM;;AQgvBV;EACI;EACA;;AAGJ;ENzvBA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AMgvBJ;EAEI;EACA;EACA;EACA;EACA;EACA,OP5xBI;EO6xBJ,ePxwBQ;EOywBR;;AAEA;EACI,YR5vBG;EQ6vBH,ORpwBE;;AQuwBN;EACI;;AAIR;EACI;EACA;EACA,SRhuBQ;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AQuxBV;EACI;EACA;EACA;EACA,KRzuBQ;EQ0uBR;EACA,OPxzBI;EOyzBJ,WR5rBU;;AQ8rBV;EACI;;AAGJ;EACI;;AAKR;EACI;EACA;EACA,OPx0BI;;AO00BJ;EACI;EACA;EACA,eRhwBI;EQiwBJ;;AAGJ;EACI;EACA,WRttBM;;AQ2tBd;EACI;EACA;EACA,KR/wBQ;;AQkxBZ;EACI;EACA;EACA,KP72BC;EO82BD;EACA,YRh0BM;EQi0BN,eP/0BQ;EOg1BR;;AAEA;EAEI,mBPr2BL;;AOw2BC;EACI,mBP12BF;;AO62BF;EAEI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WR/vBM;EQgwBN,aR1vBc;EQ2vBd,OR91BE;;AQi2BN;EACI;EACA,WRvwBM;EQwwBN,OPp4BA;;AOw4BR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA,WRzxBU;EQ0xBV,ORv3BM;EQw3BN;;AAGJ;EACI;EACA,aRh1BQ;EQi1BR;EACA;EACA,aR9xBgB;EQ+xBhB;EACA,YR73BO;EQ83BP,ORr4BM;EQs4BN,eP94BW;EO+4BX;;AAGJ;EACI,YPr7BC;EOs7BD,WR9yBU;EQ+yBV,OP36BI;EO46BJ;;AAIJ;EACI;EACA;EACA,KRv2BQ;EQw2BR;EACA;EACA,YRn5BM;;AQq5BN;EACI;EACA,OP17BA;;AO67BJ;EACI;EACA;EACA;EACA,WRp0BM;EQq0BN,ORl6BE;EQm6BF;EACA;;AAEA;EACI,OPv8BJ;;;AO88BZ;EACI;IACI;;EAEJ;IACI;;;AAcI;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ePt9BG;EOu9BH;EACA;EACA,OR/8BF;EQg9BE;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,OPp/BR;EOq/BQ;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cP3/BV;EO4/BU;;AAKR;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA,eP/+BG;EOg/BH;EACA;EACA;EACA;EACA,OR5+BF;EQ6+BE;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,cPlhCV;;AOqhCM;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cPvhCV;EOwhCU;;;ATziCpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AUAA;AAAA;AAAA;AAAA;AAYI;AAAA;EACI,YTEG;ESDH;EACA,eR0BW;EQzBX;;AAIJ;AAAA;EACI;EACA;EACA;EACA,KRlBC;EQmBD;EACA,YRHA;EQIA;;AAGJ;AAAA;EACI;EACA;EACA,KT8DQ;ES7DR,WT6GU;ES5GV,aTkHkB;ESjHlB,OTcM;;ASZN;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YR5BF;EQ6BE,OT/BD;ESgCC,WT+FM;ES9FN,aTsGU;ESrGV,eT2DK;;ASvDb;AAAA;EACI;EACA;EACA,KTsCQ;;ASnCZ;AAAA;EPbA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOIJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORhDI;EQiDJ,eR3BW;EQ4BX;;AAEA;AAAA;EACI,YThBG;ESiBH,OTxBE;;AS2BN;AAAA;EACI,YT/CM;ESgDN,ORzDH;;AQ8DL;AAAA;AAAA;AAAA;EAEI,SR9EC;;AQkFL;AAAA;EACI,eRnFC;;AQsFL;AAAA;EACI;EACA;EACA,KTDQ;ESER,eTDQ;ESER,WT6CU;ES5CV,aTmDkB;ESlDlB;EACA;;AAEA;AAAA;EACI,OT7EM;;AS+EN;AAAA;EACI,ORvFN;;AQ2FF;AAAA;EACI,OR3FH;;AQ6FG;AAAA;EACI,OR9FP;;AQoGL;AAAA;EACI;EACA;EACA,KT5BQ;ES6BR,eT7BQ;;ASgCZ;AAAA;EACI;EACA;;AAGJ;AAAA;EPnBA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASsFV;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EPjGA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOwFJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORpII;EQqIJ,eT3CS;ES4CT;;AAEA;AAAA;EACI,YTrGG;ESsGH,OR3IF;;AQgJN;AAAA;EACI;;AAGJ;AAAA;EPvHA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO8GJ;AAAA;EAEI;EACA;EACA,KT1EQ;ES2ER;EACA;EACA,YT7JG;ES8JH;EACA,eRvIQ;EQwIR,OR7JI;EQ8JJ,WTjCU;ESkCV;EACA;;AAEA;AAAA;EACI,cT7HG;;ASgIP;AAAA;EACI,cRxKF;EC4CN;EACA;;AO+HI;AAAA;EACI,OThJE;;ASqJV;AAAA;EACI;;AAGJ;AAAA;EPtFA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASyJV;AAAA;EAEI;;AAGJ;AAAA;EP9JA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ORtME;EQuMF,eRhLW;EQiLX;;AAEA;AAAA;EACI,YTvMO;;AS4Mf;AAAA;EACI;EACA;EACA,KTrIQ;;ASwIZ;AAAA;EACI;EACA;EACA,KT3IQ;;AS8IZ;AAAA;EP5HA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AS+LV;AAAA;EAEI;EACA;;AAGJ;AAAA;EACI,ORlOI;EQmOJ,WTtGU;;ASyGd;AAAA;EP1MA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOiMJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,OR7OI;EQ8OJ,eRxNW;EQyNX;;AAEA;AAAA;EACI,YTvOM;ESwON,ORjPH;;AQqPL;AAAA;EP3NA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOkNJ;AAAA;EAEI;EACA;EACA;EACA;EACA,OR9PE;EQ+PF,WTlIU;ESmIV,aT7HgB;ES8HhB,eR1OW;EQ2OX;;AAEA;AAAA;EACI,YTjQO;;ASsQf;AAAA;EACI;EACA;EACA,KThMQ;;ASmMZ;AAAA;EPnPA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO0OJ;AAAA;EAEI;EACA;EACA;EACA;EACA,YTjPO;ESkPP,OTxPM;ESyPN,WT3JU;ES4JV,aTtJgB;ESuJhB;EACA,eThMS;ESiMT;;AAEA;AAAA;EACI,YTzPG;;AS4PP;AAAA;EACI,YT/RO;ESgSP,ORpSF;EQqSE,cRrSF;;AQ0SN;AAAA;EACI,YRtTC;EQuTD,aRvTC;EQwTD;;AAIJ;AAAA;EACI;EACA;EACA,KTtOQ;;ASyOZ;AAAA;EACI;;AAGJ;AAAA;EP9RA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqRJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORjUI;EQkUJ,eR5SW;EQ6SX;EACA;;AAEA;AAAA;EACI,YT5TM;ES6TN,ORtUH;;AQ0UL;AAAA;EPhTA;EACA;EACA;EACA;E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CI;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAKR;AAAA;ERlGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AU8HlB;AAAA;EAEI,aVvLQ;;;AD/FhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AYAA;AAAA;AAAA;AAAA;AAUA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SXmHS;EWlHT;EACA;;AAEA;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YXrBO;EWsBP,eXsEW;EWrEX,YX+EW;EW9EX;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;;AAKR;EACI;EACA;EACA;EACA,KVrEK;EUsEL;EACA,YVtDI;EUuDJ;EACA;;;AAGJ;EACI,WX6DgB;EW5DhB,aXiEsB;EWhEtB,OXnCU;EWoCV;;;AAGJ;ET3CI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkCR;EAEI;EACA;EACA;EACA;EACA;EACA,OV9EQ;EU+ER,eV1DY;EU2DZ;;AAEA;EACI,YX9CO;EW+CP,OXtDM;;AWyDV;EACI,WXuCU;;;AWlClB;EACI;EACA;EACA,SXjBY;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW0Ed;EACI;EACA;EACA;EACA,KX5BY;EW6BZ;EACA,YVtGI;EUuGJ;EACA;;;AAGJ;ETpFI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2ER;EAEI;EACA;EACA;EACA,KXzCY;EW0CZ;EACA,WXMc;EWLd,aXUoB;EWTpB,eVpGY;EUqGZ;;AAEA;EACI,OX/FM;EWgGN,YX1FO;;AW4FP;EACI,YX5FG;;AWgGX;EACI,OXzIG;EW0IH,YVxIE;;AU0IF;EACI,YXxIO;;AW4If;EACI,OXlJG;EWmJH,YV9IC;;AUgJD;EACI;;AAIR;EACI;EACA;;;AAMR;EACI;EACA;EACA;EACA,KXtFY;EWuFZ;EACA,YVhKI;EUiKJ;EACA;;;AAGJ;EACI,WX9Cc;EW+Cd,aXzCsB;EW0CtB,OX7IU;;;AWgJd;ETpJI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2IR;EAEI;EACA;EACA;EACA;EACA;EACA,OVvLQ;EUwLR,eVlKe;EUmKf;;AAEA;EACI,YXvJO;EWwJP,OX/JM;;;AWmKd;EACI;EACA;EACA,SXvHY;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW6Kd;EACI;EACA;EACA;EACA,KX/HY;EWgIZ;EACA,YVzMI;EU0MJ;EACA;;;AAGJ;EACI,WXxFc;EWyFd,OVrNQ;;;AUwNZ;ET5LI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASmLR;EAEI;EACA;EACA;EACA;EACA,WXlGc;EWmGd,aX7FoB;EW8FpB,OVjOM;EUkON,eV3Me;EU4Mf;;AAEA;EACI,YXlOW;;;AWuOnB;EACI;EACA;EACA;EACA,YXjPO;EWkPP;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAQR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SX5JS;;AW8JT;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,YXxSG;EWySH,eV/QW;EUgRX,YXpMO;EWqMP;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,KV7TC;EU8TD;EACA,YV9SA;EU+SA;EACA;;AAGJ;EACI;EACA;EACA,KX9OQ;EW+OR,WX9LY;EW+LZ,aX1LkB;EW2LlB,OX9RM;EW+RN;;AAEA;EACI;EACA,OVpUF;;AUwUN;ET3SA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkSJ;EAEI;EACA;EACA;EACA;EACA;EACA,OV9UI;EU+UJ,eV1TQ;EU2TR;;AAEA;EACI,YX9SG;EW+SH,OXtTE;;AWyTN;EACI;;AAIR;EACI;EACA;EACA,SXhRQ;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AWyUV;EACI;EACA;EACA;EACA,KX3RQ;EW4RR;EACA,OV1WI;EU2WJ,WX9OU;;AWgPV;EACI,WX/OM;;AWoPd;EACI;EACA;EACA,OVtXI;;AUwXJ;EACI;EACA;EACA,eVvYH;;AU0YD;EACI;;AAGJ;EACI,WXvQM;EWwQN,OVpYA;;AUyYR;EACI;EACA;EACA,KX/TQ;;AWkUZ;EACI;EACA;EACA,KV9ZC;EU+ZD;EACA,YXjXM;EWkXN,eVhYQ;EUiYR;;AAEA;EACI,mBVrZL;;AUwZC;EACI,mBV1ZF;;AU6ZF;EACI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WX9SM;EW+SN,aXzSc;EW0Sd,OX7YE;;AWgZN;EACI;EACA,WXtTM;EWuTN,OVnbA;;AUubR;EACI;EACA;;AAGJ;EACI;EACA,WXjUU;EWkUV,OX/ZM;EWgaN;;AAGJ;EACI;EACA,YXzXQ;EW0XR;EACA;EACA,aXtUgB;EWuUhB;EACA,YXraO;EWsaP,OX7aM;EW8aN,eVtbW;;AUybf;EACI,YV5dC;EU6dD,WXrVU;EWsVV,OVldI;EUmdJ;;;AZreR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AaAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;AAAA;EAEI;EACA;EACA;EACA;EACA,YZNO;EYOP;EACA,eXkBe;EWjBf,YZ4FW;EY3FX;;AAGA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKA;AAAA;AAAA;EAEI;EACA;;AAMJ;AAAA;AAAA;EAEI;EACA;EACA;;;AASZ;EACI;EACA;EACA;EACA;EACA,YXxDI;EWyDJ;;AAEA;EACI,WZ4DU;EY3DV,aZiEkB;EYhElB,OZnCM;;AYsCV;EV1CA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AUiCJ;EAEI;EACA;EACA;EACA;EACA;EACA,OX7EI;EW8EJ,eXxDW;EWyDX;;AAEA;EACI,YZ7CG;EY8CH,OZnDE;;;AY4Dd;EACI;EACA;EACA;EACA;EACA,YZ9DU;EY+DV;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OX9GQ;EW+GR,WZac;EYZd,aZkBoB;EYjBpB;EACA;EACA;;AAEA;EACI,YZlFO;EYmFP,OZzFM;;AY4FV;EACI,YZ9HG;EY+HH,qBX7HE;EW8HF,OX9HE;;AWiIN;EACI;;;AAQR;EACI;EACA;EACA,KZ/DY;EYgEZ;EACA,YZjJO;EYkJP;;AAEA;EACI,OXlJI;EWmJJ;;AAGJ;EACI;EACA;EACA;EACA,WZ9BU;EY+BV,OZ3HM;EY4HN;;AAEA;EACI,OX/JA;;;AWwKZ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AVxDA;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AYwJV;EACI;;;AAQR;EACI;EACA;EACA;;;AAQJ;EACI;EACA;EACA,KZ7HY;EY8HZ,SZ9HY;EY+HZ,YZ/MO;EYgNP,eXvLe;EWwLf;;AAEA;EACI,YZxLM;;AY4LV;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA,eX1Me;EW2Mf,YZ7LW;;;AYiMf;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YZxMW;EYyMX,OX7OQ;EW8OR,eXxNe;EWyNf,WZlHc;;;AYsHlB;EACI;EACA;EACA;EACA;EACA;;;AAIJ;EACI,WZhIc;EYiId,aZ5HoB;EY6HpB,OZ/NU;EEfV;EACA;EACA;;;AUiPJ;AAAA;EAEI,WZ1Ic;EY2Id,OXvQQ;ECiBR;EACA;EACA;;;AUyPJ;EACI;EACA;EACA,WZnJc;EYoJd,aZ7IsB;EY8ItB,OXlRM;EWmRN,YZ/Qe;EYgRf,eX7Pe;;;AWoQnB;EACI;EACA,YZzPU;EY0PV;;;AAGJ;EACI;EACA;EACA;EACA,KZvNY;EYwNZ,WZzKc;EY0Kd,OXtSQ;;AWwSR;EACI;;AAGJ;EACI;EACA;EACA;EACA,eX1RW;EW2RX;EACA;EACA,WZvLU;EYwLV,aZlLgB;EYmLhB,OXtTE;EWuTF;EACA;EACA;EACA;EACA;;AAEA;EACI,cX9TF;EW+TE,kBZ3TO;;AY8TX;EACI;EACA,cXpUF;EWqUE;;AAIR;EACI;;AAGJ;EACI,aZ1MkB;EY2MlB,OZhTM;;AYmTV;EACI;EACA;EACA;EACA,SZzQQ;EY0QR;EACA;EACA,OXzVE;EW0VF,YZtVW;EYuVX,eXpUW;EWqUX;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;;;AAUhB;EACI;EACA;EACA;EACA;EACA,KZ7SY;EY8SZ,SZ3SY;EY4SZ;EACA,OX7XQ;;AW+XR;EACI;EACA;;AAGJ;EACI;EACA,WZzQU;;;AY6QlB;EACI;EACA;EACA;EACA,SZ9TY;EY+TZ,OX/YQ;;AWiZR;EACI;EACA,OXpZE;EWqZF;;;AAQR;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA,KXhbC;EWibD;EACA,YXjaA;EWkaA;;AAEA;EACI,aZvSc;EYwSd,OZ3YE;EY4YF,WZ/SM;;AYkTV;EACI;EACA,WZrTM;EYsTN,aZhTY;EYiTZ,OXnbA;EWobA,YZ/YG;EYgZH;EACA,eXhaO;;AWoaf;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA,KZ1XQ;EY2XR;EACA;EACA;;AAEA;EACI,YZ1aE;;AY6aN;EACI;EACA;EACA,OXndA;EWodA;;AAGJ;EACI;EACA,WZ5VM;EY6VN,OZ1bE;;AY6bN;EACI,WZjWM;EYkWN,aZ5Vc;EY6Vd,OXjeF;EWkeE;EACA;EACA,eX7cO;;;AWmdnB;EACI;EACA;;AAEA;EACI;;AAGJ;EACI;;;AbpgBR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AcAA;AAAA;AAAA;AAAA;AASA;EACI,YbKO;EaJP;EACA,eZ6Be;;;AYzBnB;EACI;EACA;EACA;EACA,KZdK;EYeL;EACA,YZCI;EYAJ;EACA;EACA;EACA;EACA;;AAEA;EACI,YbaM;;;AaTd;EACI;EACA;EACA;EACA,WbyGc;EaxGd,ab8GsB;Ea7GtB,ObUU;;AaRV;EACI,OZzBI;;;AY8BZ;EACI,SZ3CK;;;AY+CT;EACI,eb2CY;;AazCZ;EACI;;;AAIR;EACI;EACA;EACA,Kb+BY;Ea9BZ,eb8BY;Ea7BZ,Wb6Ec;Ea5Ed,abkFsB;EajFtB,OblBU;;AaoBV;EACI,OZrDI;;;AYyDZ;EACI,eZtEK;EYuEL,WbiEc;EahEd,OZ5DQ;;;AYgEZ;EACI;EACA;EACA,KZ/EK;;;AYkFT;EACI;EACA;;;AAGJ;EACI;EACA;EACA,Wb8Cc;Ea7Cd,abmDoB;EalDpB,OblDU;;;AaqDd;EXYI;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;EACI,cD3GE;EC4CN;EACA;;AAkEA;EACI,OFnFM;;;Aa4Dd;EACI;EACA;EACA,KbdY;;;AaiBhB;EACI;EACA;EACA,KZ7GK;EY8GL,SbrBY;EasBZ,YbhEU;EaiEV,eZ/EY;;AYiFZ;EACI;;;AAIR;EACI;EACA;EACA,KbjCY;EakCZ;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,WbIc;EaHd,abQoB;EaPpB,Ob3FU;;;Aa+Fd;EACI;EACA;EACA;EACA,Yb9FW;Ea+FX,eb1Ca;Ea2Cb;;;AAGJ;EACI;EACA;EACA;EACA,YZ7IM;EY8IN,ebnDa;EaoDb;;;AAGJ;EACI;EACA;EACA;EACA;EACA,YbzJO;Ea0JP;EACA;EACA;EACA;EACA,Yb3DW;Ea4DX;;AAEA;EACI,Yb9DO;;AaiEX;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAKR;EACI;EACA;EACA,KbvGY;EawGZ;EACA,WbzDc;Ea0Dd;EACA,ObzJU;;;Aa4Jd;EACI,OZ3LQ;;;AY+LZ;EACI,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GO;;AgByGP;AAAA;EACI,YhBtGC;EgBuGD,qBhBrGE;;AgByGV;AAAA;EACI;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA,YflJO;EemJP,ehB7ES;EgB8ET;EACA,ahBtCkB;EgBuClB;EACA;EACA,Of5KI;;Ae8KJ;AAAA;EACI,YfhLF;EeiLE,OhBnLD;;AgBwLP;AAAA;EACI;EACA;EACA;EACA;EACA,YhBvJM;EgBwJN;;AAGJ;AAAA;EdlKA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AcyJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,YhBzMG;EgB0MH;EACA,eflLW;EemLX,OfzMI;Ee0MJ;EACA,WhB/EU;EgBgFV;;AAEA;AAAA;EACI,YhB3KG;EgB4KH,chBzKG;EgB0KH,OhBtKG;;AgB0KX;AAAA;EACI;EACA;EACA;EACA;EACA,efpMW;EeqMX;EACA;;AAEA;AAAA;EACI,cfhOF;;AemOF;AAAA;EACI,OhB5LG;;AgBiMX;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AdtHJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;EC0HA;;AAGJ;AAAA;EACI,YD/GO;ECgHP;;AAEA;AAAA;EACI,YF5GE;;AgBuNV;AAAA;AAAA;AAAA;AAAA;AAAA;EAGI;EACA;EACA,OhBhNO;EgBiNP;EACA;;AAGJ;AAAA;EACI,Of3PC;;Ae+PL;AAAA;EACI;EACA;EACA;EACA;EACA,YhBzQG;EgB0QH;EACA;EACA;EACA,OhBjOO;EgBkOP;EACA;EACA;;AAEA;AAAA;EACI,YhB5OG;EgB6OH,cfjRA;;AeoRJ;AAAA;EACI,YftRF;EeuRE,chBpRO;EgBqRP,OhB1RD;;AgB4RC;AAAA;EACI,YhBxRG;EgByRH;;AAKZ;AAAA;EACI;EACA,OhB3PO;EgB4PP,YhB/PO;EgBgQP;EACA;EACA;EACA;;AAEA;AAAA;EACI,OhB7SD;EgB8SC;;AAQR;AAAA;EACI;EACA;EACA,KhBzOQ;;AgB4OZ;AAAA;EACI;EACA;EACA,KhB/OQ;EgBgPR,ShBh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","file":"entity-selector.css","sourcesContent":["/**\n * Entity Selector Styles\n * @package prestashop-entity-selector\n * @version 2.0.0\n *\n * Compiles to: assets/css/admin/entity-selector.css\n */\n\n// Foundation\n@use 'variables' as *;\n@use 'mixins' as *;\n\n// Layouts\n@use 'layouts/form-integration';\n@use 'layouts/responsive';\n\n// Components\n@use 'components/entity-selector';\n@use 'components/entity-item'; // Shared base for chips and list items\n@use 'components/dropdown';\n@use 'components/chips';\n@use 'components/groups';\n@use 'components/value-picker';\n@use 'components/modal';\n@use 'components/list-preview';\n@use 'components/schedule';\n@use 'components/tips';\n@use 'components/condition-trait';\n@use 'components/combinations';\n@use 'components/method-dropdown';\n@use 'components/tooltip';\n@use 'components/tree';\n@use 'components/validation';\n","/**\n * Entity Selector Variables\n * Bootstrap 4 compatible values for PrestaShop admin theme\n *\n * Imports shared variables from prestashop-admin package\n * and maps them to $es-* prefixed aliases for this package\n */\n\n// Import shared variables from prestashop-admin\n@use '../../../prestashop-admin/assets/scss/variables' as admin;\n\n// =============================================================================\n// Base Colors\n// =============================================================================\n\n$es-white: #ffffff !default;\n$es-black: #000000 !default;\n\n// Primary (from prestashop-admin)\n$es-primary: admin.$primary !default;\n$es-primary-hover: #1a9ab7 !default;\n$es-primary-light: rgba(37, 185, 215, 0.1) !default;\n\n// Semantic colors (from prestashop-admin)\n$es-success: admin.$success !default;\n$es-success-light: #d4edda !default;\n$es-success-dark: #1e7e34 !default;\n\n$es-danger: admin.$danger !default;\n$es-danger-light: #f8d7da !default;\n$es-danger-dark: #bd2130 !default;\n\n$es-warning: admin.$warning !default;\n$es-warning-light: #fff3cd !default;\n\n$es-info: admin.$info !default;\n$es-info-light: #d1ecf1 !default;\n\n// =============================================================================\n// Gray Scale (Bootstrap 4)\n// =============================================================================\n\n$es-gray-100: admin.$light !default;\n$es-gray-200: #e9ecef !default;\n$es-gray-300: admin.$border-color !default;\n$es-gray-400: #ced4da !default;\n$es-gray-500: #adb5bd !default;\n$es-gray-600: admin.$secondary !default;\n$es-gray-700: #495057 !default;\n$es-gray-800: admin.$dark !default;\n$es-gray-900: #212529 !default;\n\n// Slate (subtle variations)\n$es-slate-50: #f8fafc !default;\n$es-slate-100: #f1f5f9 !default;\n$es-slate-200: #e2e8f0 !default;\n$es-slate-300: #cbd5e1 !default;\n$es-slate-400: #94a3b8 !default;\n$es-slate-500: #64748b !default;\n$es-slate-600: #475569 !default;\n$es-slate-700: #334155 !default;\n$es-slate-800: #1e293b !default;\n$es-slate-900: #0f172a !default;\n\n// Cyan\n$es-cyan-50: #ecfeff !default;\n$es-cyan-100: #cffafe !default;\n$es-cyan-200: #a5f3fc !default;\n$es-cyan-500: #06b6d4 !default;\n$es-cyan-600: #0891b2 !default;\n$es-cyan-700: #0e7490 !default;\n\n// =============================================================================\n// Semantic Aliases\n// =============================================================================\n\n$es-bg-header: $es-gray-100 !default;\n$es-bg-hover: $es-gray-200 !default;\n$es-bg-active: $es-gray-200 !default;\n$es-bg-body: $es-white !default;\n\n$es-border-color: admin.$border-color !default;\n$es-border-light: $es-gray-200 !default;\n$es-border-dark: $es-gray-400 !default;\n\n$es-text-primary: $es-gray-900 !default;\n$es-text-secondary: $es-gray-700 !default;\n$es-text-muted: $es-gray-600 !default;\n$es-text-light: $es-gray-500 !default;\n\n// =============================================================================\n// Spacing (Bootstrap 4 compatible, derived from admin.$spacer)\n// =============================================================================\n\n$es-spacing-xs: admin.$spacer * 0.25 !default; // 4px\n$es-spacing-sm: admin.$spacer * 0.5 !default; // 8px\n$es-spacing-md: admin.$spacer !default; // 16px\n$es-spacing-lg: admin.$spacer * 1.5 !default; // 24px\n$es-spacing-xl: admin.$spacer * 2 !default; // 32px\n\n// =============================================================================\n// Border Radius (from prestashop-admin)\n// =============================================================================\n\n$es-radius-sm: admin.$border-radius-sm !default;\n$es-radius-md: admin.$border-radius !default;\n$es-radius-lg: admin.$border-radius-lg !default;\n$es-radius-xl: 0.5rem !default;\n$es-radius-full: 50rem !default;\n\n// =============================================================================\n// Box Shadows (Bootstrap 4 compatible)\n// =============================================================================\n\n$es-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !default;\n$es-shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !default;\n$es-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175) !default;\n$es-shadow-xl: 0 1.5rem 4rem rgba(0, 0, 0, 0.2) !default;\n\n// =============================================================================\n// Transitions\n// =============================================================================\n\n$es-transition-fast: 0.15s ease-in-out !default;\n$es-transition-normal: 0.2s ease-in-out !default;\n$es-transition-slow: 0.3s ease-in-out !default;\n\n// =============================================================================\n// Z-Index (below Bootstrap modal)\n// =============================================================================\n\n$es-z-dropdown: 1000 !default;\n$es-z-modal: 1050 !default;\n$es-z-popover: 1060 !default;\n$es-z-tooltip: 1070 !default;\n\n// =============================================================================\n// Typography\n// =============================================================================\n\n$es-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !default;\n\n$es-font-size-xs: 0.75rem !default; // 12px\n$es-font-size-sm: 0.875rem !default; // 14px\n$es-font-size-base: 1rem !default; // 16px\n$es-font-size-lg: 1.125rem !default; // 18px\n\n$es-font-weight-normal: 400 !default;\n$es-font-weight-medium: 500 !default;\n$es-font-weight-semibold: 600 !default;\n$es-font-weight-bold: 700 !default;\n\n$es-line-height-tight: 1.25 !default;\n$es-line-height-normal: 1.5 !default;\n","/**\n * MPR Admin Variables\n * @package prestashop-admin\n */\n\n// Spacing scale (Bootstrap 4 compatible)\n$spacer: 1rem;\n$spacers: (\n 0: 0,\n 1: $spacer * 0.25,\n 2: $spacer * 0.5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3\n);\n\n// Colors - PrestaShop Admin Theme\n$primary: #25b9d7;\n$secondary: #6c757d;\n$success: #28a745;\n$danger: #dc3545;\n$warning: #ffc107;\n$info: #17a2b8;\n$light: #f8f9fa;\n$dark: #343a40;\n\n$colors: (\n primary: $primary,\n secondary: $secondary,\n success: $success,\n danger: $danger,\n warning: $warning,\n info: $info,\n light: $light,\n dark: $dark\n);\n\n// Border\n$border-color: #dee2e6;\n$border-radius: 0.25rem;\n$border-radius-sm: 0.2rem;\n$border-radius-lg: 0.3rem;\n\n// Breakpoints\n$breakpoint-sm: 576px;\n$breakpoint-md: 768px;\n$breakpoint-lg: 991px;\n$breakpoint-xl: 1200px;\n","/**\n * Entity Selector Mixins\n * Reusable patterns - prefer Bootstrap utilities in HTML where possible\n */\n\n@use \"sass:color\";\n@use 'variables' as *;\n\n// =============================================================================\n// Layout\n// =============================================================================\n\n@mixin flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n@mixin flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n@mixin grid-columns($cols) {\n display: grid;\n grid-template-columns: repeat($cols, 1fr);\n gap: $es-spacing-sm;\n}\n\n// =============================================================================\n// Text\n// =============================================================================\n\n@mixin text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// =============================================================================\n// Interactive Elements\n// =============================================================================\n\n// Reset button styles\n@mixin button-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n// Focus ring (Bootstrap 4 style)\n@mixin focus-ring($color: $es-primary) {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba($color, 0.25);\n}\n\n// Interactive hover state\n@mixin interactive-item {\n cursor: pointer;\n transition: background-color $es-transition-fast, color $es-transition-fast;\n\n &:hover {\n background-color: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Cards & Containers\n// =============================================================================\n\n@mixin card {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n@mixin dropdown-container {\n position: absolute;\n z-index: $es-z-dropdown;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n}\n\n// =============================================================================\n// Form Elements\n// =============================================================================\n\n// Reset input styles (for inputs in custom wrappers)\n@mixin input-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n@mixin input-base {\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n line-height: $es-line-height-normal;\n color: $es-text-primary;\n background-color: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: border-color $es-transition-fast, box-shadow $es-transition-fast;\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n &::placeholder {\n color: $es-text-light;\n }\n}\n\n// =============================================================================\n// Scrollbar\n// =============================================================================\n\n@mixin custom-scrollbar {\n &::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n &::-webkit-scrollbar-track {\n background: $es-gray-100;\n border-radius: 3px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: $es-gray-300;\n border-radius: 3px;\n\n &:hover {\n background: $es-gray-400;\n }\n }\n}\n\n// =============================================================================\n// Badges & Chips\n// =============================================================================\n\n@mixin badge($bg: $es-gray-200, $color: $es-gray-700) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n line-height: 1;\n background-color: $bg;\n color: $color;\n border-radius: $es-radius-full;\n}\n\n// Count badge with preview icon (used for tab badges, match counts, totals)\n// Note: Eye icon is provided in HTML via \n@mixin count-badge($bg: $es-primary) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n min-width: 20px;\n height: 20px;\n padding: 0 0.5rem;\n background: $bg;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Focus state - maintain styled appearance\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba($bg, 0.3), 0 2px 8px rgba($bg, 0.4);\n }\n\n // Loading state - spinner icon replaces eye\n &.loading {\n cursor: wait;\n\n i {\n font-size: 10px;\n animation: spin 0.6s linear infinite;\n }\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Inactive/empty state\n &.inactive,\n &.no-matches {\n background: $es-slate-400;\n cursor: default;\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Popover open state\n &.popover-open {\n background: color.adjust($bg, $lightness: -10%);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Icon inside badge (eye, spinner, etc.)\n i {\n font-size: 10px;\n line-height: 1;\n opacity: 0.8;\n }\n\n &:hover i {\n opacity: 1;\n }\n\n .preview-count {\n font-weight: $es-font-weight-bold;\n }\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n@mixin chip {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-gray-200;\n color: $es-gray-700;\n border-radius: $es-radius-full;\n\n .chip-remove {\n @include button-reset;\n @include flex-center;\n width: 14px;\n height: 14px;\n font-size: 10px;\n color: $es-text-muted;\n border-radius: 50%;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n }\n}\n\n// =============================================================================\n// Toggle Switch\n// =============================================================================\n\n@mixin toggle-switch($width: 36px, $height: 20px) {\n position: relative;\n width: $width;\n height: $height;\n border-radius: $height;\n background: $es-gray-400;\n transition: background-color $es-transition-normal;\n cursor: pointer;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: $height - 4px;\n height: $height - 4px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n\n &.active {\n background: $es-success;\n\n &::after {\n transform: translateX($width - $height);\n }\n }\n}\n\n// =============================================================================\n// Screen Reader Only\n// =============================================================================\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n","/**\n * Form Integration Styles\n * Handles PrestaShop admin form layout overrides\n */\n\n@use '../variables' as *;\n\n// Base border reset for all entity-selector elements\n.target-conditions-trait,\n.target-conditions-trait *,\n.entity-selector-trait,\n.entity-selector-trait *,\n.method-dropdown-menu,\n.method-dropdown-menu *,\n.target-preview-popover,\n.target-preview-popover * {\n border-style: solid;\n border-width: 0;\n border-color: $es-border-color;\n}\n\n// Full-width form group override using :has()\n// Excludes .layout-form-group which uses standard PrestaShop form layout\n.form-group:has(.entity-selector-trait:not(.layout-form-group)),\n.form-group:has(.target-conditions-trait:not(.layout-form-group)),\n.form-group:has(.condition-trait:not(.layout-form-group)) {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// Fallback class for browsers without :has() support\n.form-group.condition-trait-fullwidth {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// SAFEGUARD: Force label visibility for form-group layout widgets\n// This overrides any conflicting rules (including fallback class rules)\n// when the widget has layout-form-group class indicating standard form integration\n.form-group:has(.layout-form-group) > .control-label {\n display: flex !important;\n}\n\n// Dropdown overflow fix\n// When dropdown is open, parent containers must allow overflow\n.panel:has(.target-search-dropdown.show),\n.card:has(.target-search-dropdown.show),\n.form-wrapper:has(.target-search-dropdown.show),\n.panel-body:has(.target-search-dropdown.show),\n.card-body:has(.target-search-dropdown.show),\n.form-group:has(.target-search-dropdown.show),\n.col-lg-8:has(.target-search-dropdown.show),\n.col-lg-12:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// Target conditions wrapper hierarchy overflow fix\n.target-conditions-trait:has(.target-search-dropdown.show),\n.entity-selector-trait:has(.target-search-dropdown.show),\n.condition-trait-body:has(.target-search-dropdown.show),\n.target-block-content:has(.target-search-dropdown.show),\n.target-block-groups:has(.target-search-dropdown.show),\n.target-group:has(.target-search-dropdown.show),\n.target-group-body:has(.target-search-dropdown.show),\n.target-search-wrapper:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// =============================================================================\n// Embedded Layout\n// =============================================================================\n// Use .layout-embedded for entity selectors nested inside other components\n// Removes outer wrapper styling to avoid redundant borders/backgrounds\n\n.target-conditions-trait.layout-embedded,\n.entity-selector-trait.layout-embedded {\n background: transparent;\n border: none;\n border-radius: 0;\n\n // Remove padding from groups container when embedded\n .groups-container {\n padding: 0;\n }\n\n // Remove block body padding\n .block-body {\n padding: 0;\n }\n\n // Remove block footer border when embedded\n .block-footer {\n border-top: none;\n padding: $es-spacing-sm 0 0;\n }\n\n // Simplify selection group when embedded - single thin border only\n .selection-group {\n background: $es-white;\n border: 1px solid $es-slate-200;\n border-radius: $es-radius-md;\n\n // Lighter group header in embedded mode\n .group-header {\n background: $es-slate-50;\n border-bottom-color: $es-slate-200;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-md $es-radius-md 0 0;\n }\n\n // Reduce group body padding (slightly more than $es-spacing-sm for readability)\n .group-body {\n padding: 0.75rem;\n }\n\n // Reduce group-include section padding\n .group-include {\n padding: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n }\n\n // Smaller modifiers section\n .group-modifiers {\n padding: $es-spacing-xs $es-spacing-sm;\n margin: $es-spacing-sm (-$es-spacing-sm) (-$es-spacing-sm);\n }\n }\n\n // Empty state - smaller padding\n .groups-empty-state {\n padding: $es-spacing-md;\n }\n\n // Smaller add group button\n .btn-add-group {\n padding: 0.375rem 0.625rem;\n font-size: $es-font-size-xs;\n }\n}\n","/**\n * Responsive Styles\n * Media query adjustments for different screen sizes\n */\n\n@use '../variables' as *;\n\n// Tablet and below\n@media (max-width: 991px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .condition-trait-header {\n flex-direction: column;\n align-items: flex-start;\n gap: $es-spacing-sm;\n }\n\n .trait-header-right {\n width: 100%;\n justify-content: flex-end;\n }\n\n .target-block-tabs {\n flex-wrap: wrap;\n }\n }\n}\n\n// Mobile\n@media (max-width: 767px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .target-block-tab {\n padding: $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n\n .target-group-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .target-search-dropdown {\n width: 100% !important;\n left: 0 !important;\n right: 0 !important;\n }\n\n .dropdown-results-grid {\n grid-template-columns: 1fr !important;\n }\n }\n}\n\n// High-resolution displays\n@media (min-width: 1600px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .dropdown-results-grid.view-grid-3 {\n grid-template-columns: repeat(4, 1fr);\n }\n }\n}\n","/**\n * Entity Selector - Main Component Styles\n * Wrapper, header, body, tabs, blocks\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Main wrapper (supports both .target-conditions-trait and .entity-selector-trait)\n.target-conditions-trait,\n.entity-selector-trait {\n position: relative;\n overflow: visible;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n // Trait Header (collapsible)\n .condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n }\n\n .trait-header-left {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n min-width: 0;\n flex: 1;\n }\n\n .trait-icon {\n font-size: $es-font-size-lg;\n color: $es-text-muted;\n flex-shrink: 0;\n }\n\n .trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n }\n\n .trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Total count badge in header\n .trait-total-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n\n // Show all toggle switch\n .trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-right: 0.75rem;\n padding: 0.25rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .toggle-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .show-all-checkbox {\n display: none;\n }\n\n .toggle-slider {\n position: relative;\n width: 36px;\n height: 20px;\n background: $es-slate-300;\n border-radius: $es-radius-full;\n transition: background-color $es-transition-normal;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n }\n\n .show-all-checkbox:checked + .toggle-slider {\n background: $es-success;\n\n &::after {\n transform: translateX(16px);\n }\n }\n }\n\n // Validation error states\n &.has-validation-error {\n border-color: $es-danger;\n box-shadow: 0 0 0 3px rgba($es-danger, 0.1);\n\n .condition-trait-header {\n border-bottom-color: $es-danger;\n }\n }\n\n .trait-validation-error {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0.625rem $es-spacing-md;\n background: $es-danger-light;\n color: #b91c1c;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-bottom: 1px solid #fecaca;\n\n i {\n color: $es-danger;\n }\n }\n\n // Required indicator\n &.trait-required .trait-title::after {\n content: ' *';\n color: $es-danger;\n }\n\n // Body\n .condition-trait-body {\n padding: 0;\n background: $es-white;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Block type tabs\n .target-block-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-block-tab {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: none;\n min-width: 0;\n padding: 0.625rem $es-spacing-md;\n margin-bottom: -1px;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-slate-700;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-cyan-500;\n color: $es-primary;\n }\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .tab-label {\n white-space: nowrap;\n }\n\n .tab-badge {\n @include count-badge($es-primary);\n }\n\n &.has-data:not(.active) .tab-badge {\n @include count-badge($es-slate-400);\n }\n }\n\n // Tabs row with actions (form-content layout)\n .entity-selector-tabs-row {\n display: flex;\n align-items: stretch;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n\n .target-block-tabs {\n flex: 1;\n border-bottom: 0;\n border-radius: $es-radius-lg 0 0 0;\n }\n }\n\n // Expand/collapse toggle area (entire section is clickable)\n .entity-selector-actions.btn-toggle-blocks {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 $es-spacing-md;\n background: $es-slate-100;\n border-left: 1px solid $es-border-color;\n color: $es-slate-400;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-primary;\n }\n\n .material-icons {\n font-size: 20px !important;\n }\n }\n\n // When expanded - highlight the toggle area\n .entity-selector-trait:not(.blocks-collapsed) .entity-selector-actions.btn-toggle-blocks {\n background: $es-primary-light;\n border-left-color: $es-primary;\n color: $es-primary;\n }\n\n // Blocks content wrapper (for form-content layout collapse)\n .entity-selector-blocks-content {\n // Inherits styles from condition-trait-body context\n }\n\n // Block container\n .target-block-container {\n display: none;\n\n &.active {\n display: block;\n }\n }\n\n .target-block-content {\n padding: $es-spacing-md;\n }\n\n .target-block-groups {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n }\n\n // Block header (for standalone blocks)\n .target-block-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n // Empty state\n .target-block-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Collapse toggle\n .trait-collapse-toggle,\n .collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n cursor: pointer;\n transition: transform $es-transition-normal;\n\n &.collapsed {\n transform: rotate(-90deg);\n }\n }\n\n // Header actions\n .trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // Collapsed state\n &.collapsed {\n .condition-trait-body {\n display: none;\n }\n\n .condition-trait-header {\n border-radius: $es-radius-lg;\n }\n }\n}\n\n// Single mode specific styles\n.target-conditions-trait.single-mode,\n.entity-selector-trait.single-mode {\n .target-block-tabs {\n display: none;\n }\n\n .target-block-container {\n display: block;\n }\n}\n\n// Header action buttons\n.target-conditions-trait,\n.entity-selector-trait {\n .header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .header-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Entity Item - Shared Base Component\n * Unified styling for entity items in chips, lists, and previews\n *\n * Variants:\n * - .entity-item (base) - default list-row style\n * - .entity-item.chip-style - pill/chip style (compact)\n * - .entity-item.card-style - card/grid style\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Entity Item Sizing\n// =============================================================================\n\n$entity-item-image-sm: 20px;\n$entity-item-image-md: 32px;\n$entity-item-image-lg: 48px;\n\n// =============================================================================\n// Base Entity Item (list-row layout)\n// =============================================================================\n\n.entity-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable variant\n &.clickable {\n cursor: pointer;\n }\n\n // Selected state\n &.selected {\n background: $es-primary-light;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Image\n// -----------------------------------------------------------------------------\n\n.entity-item-image {\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// Size variants\n.entity-item-image--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n}\n\n.entity-item-image--lg {\n width: $entity-item-image-lg;\n height: $entity-item-image-lg;\n}\n\n// No-image placeholder\n.entity-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n\n &--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Info (name + meta)\n// -----------------------------------------------------------------------------\n\n.entity-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n.entity-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n.entity-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Badge/Price (right side)\n// -----------------------------------------------------------------------------\n\n.entity-item-badge {\n flex-shrink: 0;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n}\n\n.entity-item-price {\n flex-shrink: 0;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Actions (remove button, etc.)\n// -----------------------------------------------------------------------------\n\n.entity-item-action {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n}\n\n// =============================================================================\n// Chip Style Variant (compact pill)\n// =============================================================================\n\n.entity-item.chip-style {\n display: inline-flex;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n border-radius: $es-radius-full;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .entity-item-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n }\n\n .entity-item-no-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n\n .entity-item-info {\n flex-direction: row;\n align-items: center;\n gap: 0.25rem;\n }\n\n .entity-item-name {\n font-size: $es-font-size-xs;\n }\n\n .entity-item-meta {\n display: none;\n }\n\n .entity-item-action {\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n }\n}\n\n// =============================================================================\n// List Style Variant (bordered rows)\n// =============================================================================\n\n.entity-item.list-style {\n padding: $es-spacing-sm 0;\n background: transparent;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Entity Item Container (wrapper for multiple items)\n// =============================================================================\n\n.entity-items-container {\n display: flex;\n flex-direction: column;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n}\n\n// Toolbar (filter, sort, count, clear)\n.entity-items-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-items {\n display: flex;\n }\n}\n\n// Filter input\n.entity-items-filter {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Sort dropdown\n.entity-items-sort {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Count badge\n.entity-items-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n}\n\n// Clear button\n.entity-items-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n}\n\n// Items list area\n.entity-items-list {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &:empty {\n display: none;\n }\n\n // List layout (vertical)\n &.list-layout {\n flex-direction: column;\n flex-wrap: nowrap;\n gap: 0;\n padding: $es-spacing-sm;\n }\n}\n\n// Load more section\n.entity-items-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Empty & Loading States\n// =============================================================================\n\n.entity-items-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.entity-items-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n animation: spin 0.6s linear infinite;\n }\n}\n","/**\n * Search Dropdown Component\n * Includes search input, filter panel, results grid\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Search wrapper\n .target-search-wrapper {\n position: relative;\n }\n\n // Search dropdown\n .target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n }\n\n .dropdown-search-input {\n @include input-base;\n flex: 1;\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .dropdown-close-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n }\n\n // Dropdown controls bar\n .dropdown-controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n }\n\n .dropdown-controls-left,\n .dropdown-controls-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // View mode buttons\n .view-mode-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Results count\n .dropdown-results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n }\n\n // Results count text\n .results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: $es-spacing-xs $es-spacing-sm;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n // Grid view\n .dropdown-results-grid {\n display: grid;\n gap: $es-spacing-sm;\n\n &.view-list {\n grid-template-columns: 1fr;\n }\n\n &.view-grid-2 {\n grid-template-columns: repeat(2, 1fr);\n }\n\n &.view-grid-3 {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n // Result item (both class names for compatibility)\n // Note: Main dropdown-item styling is in the global .target-search-dropdown section below\n .dropdown-result-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n\n &:hover {\n background: $es-white;\n }\n }\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n &.result-flag {\n width: 32px;\n height: 24px;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n background: transparent;\n\n img {\n object-fit: contain;\n }\n\n .flag-fallback {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n font-size: 14px;\n color: #5f6368;\n }\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Empty state\n .dropdown-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Loading state\n .dropdown-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 1.5rem;\n animation: spin 1s linear infinite;\n }\n }\n\n // Unified dropdown footer - combines load more and actions\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Left side: load more controls\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .btn-load-all {\n @include button-reset;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n }\n\n // Right side: action buttons\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n // Legacy support - hide old load more section when new footer exists\n .dropdown-load-more {\n display: none;\n }\n\n .load-more-controls {\n display: none;\n }\n\n // Filter panel\n .dropdown-filter-panel {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .filter-panel-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .filter-panel-toggle {\n @include button-reset;\n font-size: $es-font-size-xs;\n color: $es-primary;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n .filter-panel-content {\n display: grid;\n gap: $es-spacing-sm;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n }\n\n .filter-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .filter-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n }\n\n .filter-select,\n .filter-input {\n @include input-base;\n padding: 0.375rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n}\n\n// Category tree view\n.target-conditions-trait,\n.entity-selector-trait {\n .category-tree {\n padding: $es-spacing-sm;\n }\n\n .tree-container {\n // Contains tree items\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Tree item (used by JavaScript)\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n &.has-children {\n // Parent node styling\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy category tree classes (for compatibility)\n .category-tree-item {\n padding: 0.25rem 0;\n }\n\n .category-tree-node {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n .category-tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-text-muted;\n transition: transform $es-transition-fast;\n\n &.expanded {\n transform: rotate(90deg);\n }\n\n &.empty {\n visibility: hidden;\n }\n }\n\n .category-tree-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n &.checked {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2713';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n\n &.indeterminate {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2212';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n }\n\n .category-tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .category-tree-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .category-tree-children {\n margin-left: 24px;\n }\n\n // Search history\n .search-history-list {\n padding: $es-spacing-sm;\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n > i {\n color: $es-text-muted;\n font-size: 14px;\n }\n }\n\n .history-query {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0;\n transition: all $es-transition-fast;\n\n .history-item:hover & {\n opacity: 1;\n }\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // View mode select\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n }\n}\n\n// =============================================================================\n// Global dropdown styles (when appended to body instead of inside wrapper)\n// Duplicates key styles for when dropdown is outside .entity-selector-trait\n// =============================================================================\nbody > .target-search-dropdown,\n.target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n flex-wrap: wrap;\n }\n\n .results-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .dropdown-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex-wrap: wrap;\n flex: 1;\n justify-content: flex-end;\n }\n\n .btn-select-all,\n .btn-clear-selection {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: $es-slate-100;\n border-radius: 2px;\n color: $es-text-muted;\n }\n }\n\n .sort-controls {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n }\n\n .sort-field-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n height: 28px; // Match btn-sort-dir height\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n }\n\n .btn-sort-dir {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n min-width: 38px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n margin-left: 0.25rem;\n }\n\n .btn-toggle-filters,\n .btn-show-history {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .refine-compact {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n\n // Connected to refine-input\n .btn-refine-negate {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-right: none;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-danger-light;\n color: $es-danger;\n border-color: $es-danger;\n }\n }\n\n .refine-input {\n @include input-base;\n width: 100px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n }\n\n .btn-clear-refine {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n margin: 0;\n margin-left: -1px; // Overlap input border when visible\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .filter-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n\n input[type=\"checkbox\"] {\n margin: 0;\n }\n }\n\n .filter-price-range {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n .filter-price-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .filter-price-min,\n .filter-price-max {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-price-sep {\n color: $es-text-muted;\n }\n }\n\n .btn-clear-filters {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n cursor: pointer;\n margin-left: auto;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n\n // Multi-row filters\n .filter-row-multi {\n flex-direction: column;\n align-items: stretch;\n gap: $es-spacing-sm;\n }\n\n .filter-subrow {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n }\n\n .filter-range-group,\n .filter-date-group,\n .filter-select-group {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .filter-range-label,\n .filter-date-label,\n .filter-select-label,\n .filter-row-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n\n i {\n margin-right: 0.25rem;\n }\n }\n\n .filter-range-sep {\n color: $es-text-muted;\n }\n\n .filter-product-count-min,\n .filter-product-count-max,\n .filter-sales-min,\n .filter-sales-max,\n .filter-turnover-min,\n .filter-turnover-max,\n .filter-date-add-from,\n .filter-date-add-to,\n .filter-last-product-from,\n .filter-last-product-to {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-depth-select,\n .filter-attribute-group-select,\n .filter-feature-group-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 100px;\n }\n\n .filter-attributes-container,\n .filter-features-container,\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n\n // Filter group toggle buttons (attribute/feature groups)\n .filter-group-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n\n .toggle-count {\n color: $es-primary;\n }\n }\n\n &.has-selection {\n border-color: $es-success;\n background: rgba($es-success, 0.05);\n\n .toggle-count {\n color: $es-success;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .toggle-name {\n font-weight: $es-font-weight-medium;\n }\n\n // Count with eye icon (like group-count-badge)\n .toggle-count {\n display: inline-flex;\n align-items: center;\n gap: 0.125rem;\n color: $es-text-muted;\n font-size: 0.65rem;\n\n i {\n font-size: 10px;\n color: $es-primary;\n }\n\n // Clickable preview badge\n &.clickable {\n cursor: pointer;\n padding: 0.125rem 0.25rem;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n color: $es-primary;\n\n i {\n color: $es-primary;\n }\n }\n\n &.popover-open {\n background: $es-primary;\n color: $es-white;\n\n i {\n color: $es-white;\n }\n }\n\n &.loading {\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n }\n }\n\n // Filter value chips\n .filter-chip {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-slate-100;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Filter attribute chip (specific)\n .filter-attr-chip,\n .filter-feat-chip {\n @extend .filter-chip;\n }\n\n // Filter row for values (expandable)\n .filter-row-values {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.25rem;\n flex: 1;\n }\n\n .filter-values-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n white-space: nowrap;\n }\n\n .btn-close-values {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter chip name and count\n .chip-name {\n font-weight: $es-font-weight-medium;\n }\n\n .chip-count {\n font-size: 0.6rem;\n color: $es-text-muted;\n margin-left: 0.125rem;\n }\n\n .filter-chip.active .chip-count {\n color: rgba(255, 255, 255, 0.8);\n }\n\n // Dropdown content\n .dropdown-content {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .dropdown-items {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm;\n }\n\n .item-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n }\n }\n\n .item-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n }\n\n // Dropdown footer - unified structure\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n }\n\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n .dropdown-footer-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy button support\n .btn-cancel-dropdown {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-sm;\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 2px;\n color: rgba(255, 255, 255, 0.8);\n }\n }\n\n // Filter chips in dropdown\n .filter-chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-chip {\n @include chip;\n }\n\n // Empty and loading states\n .dropdown-empty,\n .dropdown-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n margin-bottom: $es-spacing-sm;\n }\n }\n\n // Search history panel\n .search-history-panel {\n display: none;\n padding: $es-spacing-sm;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n i {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n span {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-remove-history,\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-danger;\n }\n }\n }\n\n // Search history list container\n .search-history-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n background: $es-white;\n min-height: 200px;\n }\n\n // Dropdown item (search result)\n .dropdown-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .result-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n color: $es-white;\n\n i {\n display: block;\n }\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n // Checkbox indicator\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n background: $es-white;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n }\n }\n\n // View mode classes (applied to dropdown container) - no gap/padding for shared borders\n &.view-cols-2 .dropdown-results { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-3 .dropdown-results { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-4 .dropdown-results { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-5 .dropdown-results { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-6 .dropdown-results { display: grid; grid-template-columns: repeat(6, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-7 .dropdown-results { display: grid; grid-template-columns: repeat(7, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-8 .dropdown-results { display: grid; grid-template-columns: repeat(8, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n\n // Grid view item styling (compact cards with shared borders)\n &.view-cols-2,\n &.view-cols-3,\n &.view-cols-4,\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: $es-spacing-sm;\n border: none;\n border-right: 1px solid $es-border-color;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .result-checkbox {\n position: absolute;\n top: $es-spacing-xs;\n left: $es-spacing-xs;\n }\n\n .result-image,\n .result-icon {\n width: 48px;\n height: 48px;\n margin-bottom: $es-spacing-xs;\n }\n\n .result-info {\n width: 100%;\n }\n\n .result-name {\n font-size: $es-font-size-xs;\n line-height: 1.3;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .result-subtitle {\n display: none;\n }\n\n // Show compact product info in grid\n .result-col {\n display: none;\n }\n\n .result-grid-info {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.25rem;\n margin-top: $es-spacing-xs;\n font-size: 0.65rem;\n\n .grid-price {\n color: $es-text-primary;\n font-weight: $es-font-weight-semibold;\n }\n\n .grid-stock {\n color: $es-text-muted;\n\n &.stock-out { color: $es-danger; }\n &.stock-low { color: $es-warning; }\n }\n\n .grid-discount {\n color: $es-success;\n font-weight: $es-font-weight-medium;\n }\n }\n }\n\n // Hide results header in grid views\n .results-header {\n display: none;\n }\n }\n\n // Remove right border from last item in each row (per column count)\n &.view-cols-2 .dropdown-results .dropdown-item:nth-child(2n) { border-right: none; }\n &.view-cols-3 .dropdown-results .dropdown-item:nth-child(3n) { border-right: none; }\n &.view-cols-4 .dropdown-results .dropdown-item:nth-child(4n) { border-right: none; }\n &.view-cols-5 .dropdown-results .dropdown-item:nth-child(5n) { border-right: none; }\n &.view-cols-6 .dropdown-results .dropdown-item:nth-child(6n) { border-right: none; }\n &.view-cols-7 .dropdown-results .dropdown-item:nth-child(7n) { border-right: none; }\n &.view-cols-8 .dropdown-results .dropdown-item:nth-child(8n) { border-right: none; }\n\n // Smaller items for higher column counts\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n .result-image,\n .result-icon {\n width: 40px;\n height: 40px;\n }\n\n .result-name {\n font-size: 0.65rem;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n // Result checkbox\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Load more controls\n .load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label,\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .load-more-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 60px;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light !important;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2) !important;\n }\n }\n }\n\n // Load more button\n .dropdown-load-more {\n display: flex;\n justify-content: center;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n\n .load-more-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n opacity: 0.7;\n cursor: wait;\n }\n }\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Tree view styles (for categories)\n .tree-container {\n padding: $es-spacing-sm;\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n}\n\n// ============================================================================\n// Standalone dropdown styles (for when dropdown is appended to body)\n// These selectors work because .target-search-dropdown is on the dropdown itself\n// ============================================================================\n\n.target-search-dropdown {\n // Results container - scrollable\n .dropdown-results {\n max-height: 400px;\n overflow-y: auto;\n padding: 0 $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Hide results-header by default, show only for products in list view\n &:not(.view-list) .results-header,\n &.view-tree .results-header {\n display: none;\n }\n\n // Result item for products\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n // Result columns for product data\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok { color: $es-success; }\n &.stock-low { color: $es-warning; }\n &.stock-out { color: $es-danger; }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n // Dropdown item styling\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n // Result checkbox styling\n .result-checkbox {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n font-size: 10px;\n color: transparent;\n }\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n color: $es-white;\n }\n }\n }\n\n // Result image\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n // Result icon (for non-image entities)\n .result-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n\n i {\n font-size: 16px;\n color: $es-text-muted;\n }\n }\n\n // Result info container\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Hide columns in grid/tree views\n &[class*=\"view-cols-\"] .result-col,\n &.view-tree .result-col {\n display: none;\n }\n\n // Entity search box - full width\n .entity-search-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .entity-search-icon {\n color: $es-text-muted;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override Bootstrap/parent form input styles\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n height: auto;\n padding: 0;\n margin: 0;\n border: none !important;\n outline: none;\n background: transparent !important;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n color: $es-text-muted;\n }\n }\n}\n\n// Body-level dropdown (when appended to body for z-index)\nbody > .target-search-dropdown {\n // Override dropdown-item border when inside body-appended dropdown\n .dropdown-item {\n border: none;\n border-radius: 0;\n\n &:not(:last-child) {\n border-bottom: 1px solid $es-border-color;\n }\n }\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","/**\n * Chips Component\n * Entity chips, selection pills, tags\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Chips container wrapper with toolbar\n .chips-wrapper {\n display: flex;\n flex-direction: column;\n margin-top: $es-spacing-sm;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n }\n\n // Chips toolbar - integrated filter bar inside chips area\n .chips-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-chips {\n display: flex;\n }\n\n // Filter input - takes available space, icon embedded as background\n // Using [type=\"text\"] for specificity over .bootstrap input[type=\"text\"]\n input[type=\"text\"].chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Sort dropdown - compact, auto width\n select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n\n // Count badge - smaller, pill style\n .chips-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n\n .count-filtered {\n font-weight: $es-font-weight-bold;\n }\n\n .count-separator {\n opacity: 0.6;\n margin: 0 0.125rem;\n }\n }\n\n .chips-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-left: auto;\n }\n\n // Clear button - subtle, chip-like\n .btn-chips-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap; // Prevent text wrapping\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n\n .clear-text {\n // Hide text on small screens, keep icon\n @media (max-width: 480px) {\n display: none;\n }\n }\n }\n\n // Chips container - flows naturally from toolbar\n .entity-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n\n &:empty {\n display: none;\n }\n }\n\n // Load more section with select dropdown\n .chips-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem !important;\n border: 1px solid $es-border-color !important;\n border-radius: $es-radius-sm !important;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center !important;\n background-size: 8px !important;\n font-size: $es-font-size-xs !important;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto !important;\n min-height: 0 !important;\n line-height: 1.3 !important;\n\n &:hover {\n border-color: $es-primary !important;\n background-color: $es-primary-light !important;\n }\n\n &:focus {\n outline: none !important;\n border-color: $es-primary !important;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1) !important;\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Individual chip\n .entity-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n // Chip with image\n &.has-image {\n padding-left: 0.25rem;\n }\n\n // Hidden by search filter or pagination\n &.chip-filtered-out,\n &.chip-paginated-out {\n display: none;\n }\n }\n\n .chip-image {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .chip-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: $es-text-muted;\n flex-shrink: 0;\n\n // Product/entity images inside chip\n img {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n }\n }\n\n // Country flag in chip\n .chip-flag {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n\n img {\n width: 18px;\n height: 12px;\n object-fit: cover;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .flag-fallback {\n width: 18px;\n height: 12px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n border-radius: 2px;\n font-size: 10px;\n color: #5f6368;\n }\n }\n\n // Holiday preview button in country chip\n .chip-preview-holidays {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: $es-primary;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.15);\n color: darken($es-primary, 10%);\n }\n\n i.material-icons {\n font-size: 14px;\n }\n }\n\n .chip-text,\n .chip-name {\n // Show full name, no truncation\n word-break: break-word;\n }\n\n .chip-remove {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n color: $es-text-muted;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Chip variants\n .entity-chip.chip-primary {\n background: $es-primary-light;\n color: $es-primary;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n }\n\n .entity-chip.chip-success {\n background: $es-success-light;\n color: $es-success-dark;\n\n &:hover {\n background: rgba($es-success, 0.2);\n }\n }\n\n .entity-chip.chip-danger {\n background: $es-danger-light;\n color: $es-danger;\n\n &:hover {\n background: rgba($es-danger, 0.2);\n }\n }\n\n .entity-chip.chip-warning {\n background: $es-warning-light;\n color: color.adjust($es-warning, $lightness: -20%);\n\n &:hover {\n background: rgba($es-warning, 0.3);\n }\n }\n\n // Chip loading state\n .entity-chip.loading,\n .entity-chip-loading {\n opacity: 0.7;\n\n .chip-remove {\n display: none;\n }\n\n .chip-icon i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Hidden chip (collapsed view)\n .entity-chip.chip-hidden {\n display: none;\n }\n\n // Chips expanded/collapsed states\n .entity-chips.chips-collapsed,\n .entity-chips.chips-expanded {\n position: relative;\n }\n\n // Show more/less toggle\n .chips-show-more-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .chips-collapse-toggle,\n .chips-expand-toggle {\n // Specific variants inherit from .chips-show-more-toggle\n }\n\n // More chips indicator\n .chips-more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-300;\n }\n }\n\n // Add chip button\n .chip-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: transparent;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Inline chips (compact mode)\n .entity-chips.inline {\n display: inline-flex;\n padding: 0;\n min-height: auto;\n\n .entity-chip {\n padding: 0.125rem 0.375rem;\n font-size: 11px;\n }\n }\n\n // Selected chips section in include/exclude\n .selected-chips-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .selected-chips-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n // Pattern chips (for name/reference patterns)\n .entity-chip.chip-pattern {\n background: #fef3c7;\n color: #92400e;\n font-family: monospace;\n\n &:hover {\n background: #fde68a;\n }\n\n .chip-icon {\n color: #d97706;\n }\n }\n\n // Range chips (price, quantity, etc.)\n .entity-chip.chip-range,\n .range-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-cyan-50;\n color: $es-cyan-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-cyan-100;\n }\n }\n\n .range-chip-text {\n font-family: monospace;\n }\n\n .btn-remove-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-cyan-600;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Multi-range chips container\n .multi-range-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-xs;\n\n &:empty {\n display: none;\n }\n }\n\n // Pattern chips container\n .pattern-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm 0;\n min-height: 32px;\n\n &:empty::before {\n content: attr(data-placeholder);\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-style: italic;\n }\n }\n\n // Pattern tag\n .pattern-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: #fef3c7;\n color: #92400e;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: #fde68a;\n }\n\n &.case-sensitive {\n .case-icon {\n color: $es-success;\n font-weight: $es-font-weight-bold;\n }\n }\n\n &.draft-tag {\n background: $es-white;\n border: 1px solid $es-border-color;\n padding: 0;\n flex: 1;\n min-width: 150px;\n\n &:hover {\n background: $es-white;\n }\n\n .pattern-input {\n flex: 1;\n min-width: 100px;\n padding: 0.375rem;\n border: 0;\n background: transparent;\n font-size: $es-font-size-sm;\n font-family: inherit;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-style: italic;\n }\n }\n }\n }\n\n .pattern-tag-text {\n font-family: monospace;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .btn-toggle-case {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n }\n }\n\n .case-icon {\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n font-family: monospace;\n }\n\n .btn-remove-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: #d97706;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-add-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Pattern match count (in draft tag)\n .pattern-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0 0.375rem;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n cursor: pointer;\n\n &.count-zero {\n color: $es-warning;\n }\n\n &.count-found {\n color: $es-success;\n }\n\n .count-value {\n font-weight: $es-font-weight-semibold;\n }\n }\n\n // Pattern input row\n .pattern-input-row {\n display: flex;\n align-items: stretch;\n gap: $es-spacing-xs;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Popover (Country chip eye button)\n// ==========================================================================\n\n.holiday-preview-popover {\n position: absolute;\n z-index: 10001;\n width: 320px;\n max-width: 90vw;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n overflow: hidden;\n\n .popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .popover-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .popover-flag {\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i.material-icons {\n font-size: 18px;\n }\n }\n\n .popover-body {\n max-height: 350px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i.material-icons {\n font-size: 20px;\n }\n\n .icon-spin {\n animation: spin 1s linear infinite;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: $es-spacing-sm;\n display: block;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank,\n &.holiday-type-bank-holiday {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional,\n &.holiday-type-local-holiday {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 80px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-country-flag {\n vertical-align: middle;\n margin-right: 0.25rem;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .holiday-name {\n display: inline;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-left: $es-spacing-sm;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n vertical-align: middle;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n\n // Filter input\n .popover-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n background: $es-slate-50;\n\n i.material-icons {\n font-size: 18px;\n color: $es-text-muted;\n }\n\n .holiday-filter-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n outline: none;\n padding: $es-spacing-xs 0;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n }\n}\n\n// Spin animation for loading icons\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n// Bootstrap specificity overrides for chips toolbar form elements\n// PrestaShop admin uses #content .mpr-config-form... with high specificity\n// We need to match or exceed that specificity\n#content.bootstrap,\n#content .bootstrap,\n.bootstrap #content {\n .target-conditions-trait,\n .entity-selector-trait {\n .chips-wrapper .chips-toolbar {\n // Double class for extra specificity\n input[type=\"text\"].chips-search-input.chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Double class for extra specificity\n select.chips-sort-select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n height: auto;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n }\n}\n","/**\n * Groups Component\n * Selection groups, include/exclude sections, method selectors\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Group container\n .target-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n }\n\n // Group header\n .target-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-group-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n .group-number {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 0.25rem;\n background: $es-primary;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-bold;\n border-radius: $es-radius-full;\n }\n }\n\n .target-group-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .group-action-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n &.danger:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group body\n .target-group-body,\n .group-body {\n padding: $es-spacing-md;\n }\n\n // Include section\n .include-section {\n margin-bottom: $es-spacing-md;\n }\n\n .section-label {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n &.label-include {\n color: $es-success-dark;\n\n i {\n color: $es-success;\n }\n }\n\n &.label-exclude {\n color: $es-danger;\n\n i {\n color: $es-danger;\n }\n }\n }\n\n // Method selector\n .method-selector {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n }\n\n .method-selector-wrapper {\n flex: 1;\n position: relative;\n }\n\n .method-select {\n @include input-base;\n padding-right: 2rem;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n }\n\n .method-help-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-primary;\n }\n }\n\n // Value picker (search trigger)\n .value-picker {\n position: relative;\n }\n\n .value-picker-trigger {\n @include button-reset;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n text-align: left;\n transition: all $es-transition-fast;\n\n &:hover {\n border-color: $es-slate-300;\n }\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n i {\n color: $es-text-light;\n }\n }\n\n // Pattern input (text input for patterns)\n .pattern-input-wrapper {\n position: relative;\n }\n\n .pattern-input {\n @include input-base;\n font-family: monospace;\n }\n\n .pattern-add-btn {\n @include button-reset;\n position: absolute;\n right: 0.25rem;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-range input (price ranges)\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .range-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .range-input {\n @include input-base;\n width: 100px;\n text-align: center;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n .range-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .range-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-select tiles (stock status, etc.)\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .multi-select-tile {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px solid transparent;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n border-color: $es-primary;\n }\n }\n\n // Exclude section\n .exclude-section {\n margin-top: $es-spacing-md;\n padding-top: $es-spacing-md;\n border-top: 1px dashed $es-border-color;\n }\n\n // Legacy exclude-rows (if used elsewhere)\n .exclude-rows {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row-content {\n flex: 1;\n }\n\n .exclude-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .add-exclude-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.25rem 0.5rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-danger;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n }\n }\n\n // Add group button (used in block-footer)\n .btn-add-group {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.875rem;\n color: $es-primary;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n background: rgba($es-primary, 0.05);\n border: 1px dashed $es-primary;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Block footer\n .block-footer {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n // Block body\n .block-body {\n padding: 0;\n }\n\n // Groups container\n .groups-container {\n padding: $es-spacing-md;\n }\n\n // Groups empty state\n .groups-empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n // Selection group\n .selection-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-md;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &.collapsed {\n .group-body {\n display: none;\n }\n\n .group-collapse-toggle i {\n transform: rotate(-90deg);\n }\n }\n }\n\n // Group header\n .group-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n\n &.group-header-single {\n padding: $es-spacing-xs $es-spacing-md;\n background: transparent;\n border-bottom: none;\n }\n }\n\n .group-collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n color: $es-text-muted;\n\n i {\n transition: transform $es-transition-fast;\n }\n }\n\n .group-name-wrapper {\n flex: 1;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .group-name-input {\n flex: 1;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n background: transparent;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover,\n &:focus {\n background: $es-white;\n border-color: $es-border-color;\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-weight: $es-font-weight-medium;\n }\n }\n\n .group-count-badge {\n @include count-badge($es-primary);\n }\n\n .btn-remove-group {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group include section - green accent to distinguish from exclude\n .group-include {\n margin-bottom: $es-spacing-md;\n padding: $es-spacing-sm;\n background: rgba($es-success, 0.03);\n border: 1px solid rgba($es-success, 0.2);\n border-radius: $es-radius-md;\n }\n\n .section-row {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Method selector wrapper (from PHP)\n .method-selector-wrapper {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .method-info-placeholder {\n display: flex;\n align-items: center;\n min-width: 20px;\n }\n\n .include-method-select,\n .exclude-method-select {\n flex: 1;\n @include input-base;\n cursor: pointer;\n }\n\n // Lock indicator for method selector (when excludes are present)\n .selector-locked {\n .include-method-select {\n opacity: 0.7;\n cursor: not-allowed;\n }\n }\n\n .lock-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-warning;\n cursor: help;\n\n i {\n font-size: 14px;\n }\n\n .mpr-tooltip {\n display: none;\n position: absolute;\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-800;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n white-space: nowrap;\n border-radius: $es-radius-sm;\n z-index: 100;\n }\n\n &:hover .mpr-tooltip {\n display: block;\n }\n }\n\n // Group excludes section\n .group-excludes {\n margin-top: $es-spacing-md;\n }\n\n .except-separator {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin: 0 0 $es-spacing-sm 0;\n\n // Lines on both sides\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: rgba($es-danger, 0.3);\n }\n }\n\n .except-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background: $es-danger-light;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n white-space: nowrap;\n flex-shrink: 0;\n\n i {\n font-size: 10px;\n }\n }\n\n .exclude-rows-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-sm;\n background: rgba($es-danger, 0.03);\n border: 1px solid rgba($es-danger, 0.15);\n border-radius: $es-radius-md;\n\n // Value picker inside exclude row - full width\n .value-picker {\n width: 100%;\n margin-top: $es-spacing-sm;\n }\n }\n\n .exclude-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n width: 100%;\n\n .method-selector-wrapper {\n flex: 1;\n }\n\n // Delete button at the far right\n .btn-remove-exclude-row {\n flex-shrink: 0;\n margin-left: auto;\n }\n }\n\n .btn-remove-exclude-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .btn-add-exclude,\n .btn-add-another-exclude {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.375rem 0.625rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: transparent;\n border: 1px dashed rgba($es-danger, 0.5);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n border-color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Group modifiers (inline version from PHP)\n // Uses negative margins to break out of .group-body padding\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n margin: $es-spacing-md (-$es-spacing-md) (-$es-spacing-md);\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .modifier-inline {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n }\n\n // Common height for all modifier controls\n $modifier-height: 26px;\n\n .group-modifier-limit {\n width: 50px;\n max-width: 50px;\n height: $modifier-height;\n padding: 0 0.375rem;\n font-size: $es-font-size-xs;\n text-align: center;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n // Sort modifier - input group style (select + button glued together)\n .modifier-sort {\n gap: 0; // Remove gap to glue select + button together\n\n .modifier-label {\n margin-right: 0.375rem; // Keep space between label and input group\n }\n\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n position: relative;\n z-index: 1;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 11px;\n }\n }\n }\n\n // Fallback for elements outside .modifier-sort context\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n }\n\n .group-preview-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &.clickable {\n cursor: pointer;\n\n &:hover {\n background: $es-primary-light;\n color: $es-primary;\n }\n }\n }\n\n // OR separator between groups\n .group-separator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-sm 0;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: $es-border-color;\n margin: 0 $es-spacing-md;\n }\n }\n\n // Group modifiers (limit, sort)\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding-top: $es-spacing-md;\n margin-top: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n .modifier-group {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .modifier-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n white-space: nowrap;\n }\n\n .modifier-input {\n @include input-base;\n width: 80px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .modifier-select {\n @include input-base;\n width: auto;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.25rem center;\n background-repeat: no-repeat;\n background-size: 1.25em 1.25em;\n }\n\n // Condition match count badge\n .condition-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.375rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.has-results {\n background: $es-primary-light;\n color: $es-primary;\n }\n\n // Country holidays variant - use calendar icon style\n &.country-holidays {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n\n &:hover {\n background: rgba(139, 92, 246, 0.2);\n }\n\n &.clickable {\n background: rgba(139, 92, 246, 0.15);\n }\n }\n\n i {\n font-size: 10px;\n }\n }\n}\n","/**\n * Value Picker Component\n * Search boxes, input types, range inputs\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Value picker container\n .value-picker {\n padding: $es-spacing-sm 0;\n\n &[style*=\"display: none\"],\n &[style*=\"display:none\"] {\n padding: 0;\n }\n }\n\n .include-picker,\n .exclude-picker {\n // Section-specific picker styles\n }\n\n // Entity search box\n .entity-search-box {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:focus-within {\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Separation between chips and search box\n .chips-wrapper + .entity-search-box {\n margin-top: $es-spacing-md;\n }\n\n .entity-search-icon {\n color: $es-text-muted;\n font-size: 14px;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override parent form's max-width on search input\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n @include input-reset;\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n padding: 0.375rem;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n border: none !important;\n background: transparent !important;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n color: $es-primary;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Browse tree button (for categories)\n .btn-browse-tree {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-left: auto;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary;\n color: $es-white;\n }\n\n i {\n font-size: 14px;\n }\n }\n\n // Numeric range box\n .numeric-range-box,\n .multi-range-input-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .range-min-input,\n .range-max-input {\n @include input-base;\n width: 100px;\n padding: $es-spacing-sm;\n text-align: center;\n font-size: $es-font-size-sm;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n -moz-appearance: textfield;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .btn-add-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-white;\n background: $es-primary;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-hover;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Multi-range container\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Date range box\n .date-range-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .date-from-input,\n .date-to-input {\n @include input-base;\n width: 140px;\n padding: $es-spacing-sm;\n font-size: $es-font-size-sm;\n }\n\n // Multi-select tiles\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .tile-option {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n color: $es-text-muted;\n background: transparent;\n border: 1px dashed $es-border-color;\n border-radius: 100px; // Pill shape\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n color: $es-text-secondary;\n border-color: $es-slate-400;\n border-style: solid;\n }\n\n &.selected {\n color: $es-primary;\n background: $es-primary-light;\n border: 1px solid $es-primary;\n font-weight: $es-font-weight-medium;\n }\n\n i {\n font-size: 11px;\n opacity: 0.6;\n }\n\n &.selected i {\n opacity: 1;\n }\n }\n\n .tile-label {\n white-space: nowrap;\n }\n\n // Select input box\n .select-input-box {\n display: inline-block;\n }\n\n .select-value-input {\n @include input-base;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n min-width: 150px;\n }\n\n // Boolean input box\n .boolean-input-box {\n display: inline-flex;\n align-items: center;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-success-light;\n color: $es-success-dark;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .boolean-label {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n &::before {\n content: '\\2713';\n font-weight: bold;\n }\n }\n\n // Condition match count badge\n .condition-match-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n}\n","/**\n * Modal Component\n * Preview modals, confirmation dialogs\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Modal backdrop\n.mpr-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: $es-z-modal;\n opacity: 0;\n transition: opacity $es-transition-normal;\n\n &.show {\n opacity: 1;\n }\n}\n\n// Modal container\n.mpr-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n z-index: $es-z-modal + 1;\n width: 90%;\n max-width: 600px;\n max-height: 90vh;\n background: $es-white;\n border-radius: $es-radius-xl;\n box-shadow: $es-shadow-xl;\n opacity: 0;\n transition: all $es-transition-normal;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &.show {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n &.modal-sm {\n max-width: 400px;\n }\n\n &.modal-lg {\n max-width: 800px;\n }\n\n &.modal-xl {\n max-width: 1000px;\n }\n\n &.modal-fullscreen {\n width: 95%;\n max-width: none;\n height: 90vh;\n max-height: none;\n }\n}\n\n// Modal header\n.mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-title {\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n}\n\n.mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: $es-font-size-lg;\n }\n}\n\n// Modal body\n.mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n}\n\n// Modal footer\n.mpr-modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: $es-spacing-sm;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &.btn-secondary {\n color: $es-text-secondary;\n background: $es-slate-100;\n\n &:hover {\n background: $es-slate-200;\n }\n }\n\n &.btn-primary {\n color: $es-white;\n background: $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n }\n }\n\n &.btn-danger {\n color: $es-white;\n background: $es-danger;\n\n &:hover {\n background: color.adjust($es-danger, $lightness: -10%);\n }\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n// Preview popover styles moved to _list-preview.scss\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n}\n\n.popover-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n}\n\n.popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n}\n\n.popover-body {\n max-height: 300px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n}\n\n.popover-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n}\n\n.popover-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n.popover-load-more {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n}\n\n// Popover arrow\n.popover-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: $es-white;\n border: 1px solid $es-border-color;\n transform: rotate(45deg);\n\n &.arrow-top {\n top: -7px;\n left: 50%;\n margin-left: -6px;\n border-right: none;\n border-bottom: none;\n }\n\n &.arrow-bottom {\n bottom: -7px;\n left: 50%;\n margin-left: -6px;\n border-left: none;\n border-top: none;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Modal\n// ==========================================================================\n\n#mpr-holiday-preview-modal {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: $es-z-modal;\n\n &.show {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .mpr-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n cursor: pointer;\n }\n\n .mpr-modal-dialog {\n position: relative;\n width: 90%;\n max-width: 480px;\n max-height: 80vh;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n }\n\n .mpr-modal-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n\n i.material-icons {\n font-size: 20px;\n color: $es-primary;\n }\n }\n\n .mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 18px;\n }\n }\n\n .mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: $es-font-size-lg;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.5;\n margin-bottom: $es-spacing-md;\n }\n\n p {\n margin: 0 0 $es-spacing-xs;\n }\n\n .hint {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 100px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-name {\n display: block;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-top: $es-spacing-xs;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n}\n","/**\n * List Preview Component\n * Popover and modal views for entity preview\n *\n * Uses shared entity-item base for item styling.\n * This file only contains popover/modal container styles.\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Preview Popover Container\n// =============================================================================\n\n.target-preview-popover,\n.target-list-preview-popover {\n position: absolute;\n z-index: 10000;\n min-width: 320px;\n max-width: 480px;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n overflow: hidden;\n\n // Arrow pointing to badge\n &::before {\n content: '';\n position: absolute;\n top: -8px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid $es-border-color;\n }\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid $es-white;\n }\n\n // Positioned to the right - arrow on left\n &.position-right {\n &::before,\n &::after {\n left: 20px;\n transform: none;\n }\n }\n\n // Positioned to the left - arrow on right\n &.position-left {\n &::before,\n &::after {\n left: auto;\n right: 20px;\n transform: none;\n }\n }\n}\n\n// =============================================================================\n// Preview Header\n// =============================================================================\n\n.preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .preview-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n}\n\n// =============================================================================\n// Preview Tabs (entity type switcher)\n// =============================================================================\n\n.preview-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n}\n\n.preview-tab {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.75rem;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-primary;\n color: $es-primary;\n }\n\n i {\n font-size: 12px;\n }\n}\n\n// =============================================================================\n// Preview Filter\n// =============================================================================\n\n.preview-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n i {\n color: $es-text-muted;\n font-size: 12px;\n }\n\n .preview-filter-input {\n all: unset;\n flex: 1;\n padding: 0.25rem 0;\n font-size: $es-font-size-xs;\n color: $es-text-primary;\n box-sizing: border-box;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n}\n\n// =============================================================================\n// Preview Contents (tabbed content areas)\n// =============================================================================\n\n.preview-contents {\n max-height: 350px;\n overflow: hidden;\n}\n\n.preview-content {\n display: none;\n max-height: 350px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &.active {\n display: block;\n }\n}\n\n// =============================================================================\n// Preview Items Container\n// =============================================================================\n\n.preview-items {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-xs $es-spacing-sm;\n}\n\n// =============================================================================\n// Preview Item - Uses entity-item patterns\n// Maps legacy classes to shared styling\n// =============================================================================\n\n.preview-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable items\n &[data-id] {\n cursor: pointer;\n }\n}\n\n// Image - matches chip image sizing for consistency\n.preview-item-image {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// No-image placeholder\n.preview-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n}\n\n// Info container\n.preview-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n// Name\n.preview-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n// Meta/ref (category, email, etc.)\n.preview-item-ref,\n.preview-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// Price badge\n.preview-item-price {\n flex-shrink: 0;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n}\n\n// =============================================================================\n// Preview Footer (load more)\n// =============================================================================\n\n.preview-footer {\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n}\n\n.load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label {\n white-space: nowrap;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Preview States\n// =============================================================================\n\n.preview-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n color: $es-primary;\n animation: spin 0.6s linear infinite;\n }\n}\n\n// =============================================================================\n// Total Summary Popover (header total badge click)\n// =============================================================================\n\n.total-preview-popover {\n min-width: 240px;\n max-width: 320px;\n\n .preview-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-popover-title {\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n font-size: $es-font-size-sm;\n }\n\n .preview-popover-count {\n flex-shrink: 0;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: $es-slate-200;\n padding: 0.125rem 0.5rem;\n border-radius: $es-radius-sm;\n }\n }\n\n .preview-popover-body {\n padding: $es-spacing-xs 0;\n }\n\n .total-summary-list {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .total-summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.15s ease;\n\n &:hover {\n background: $es-slate-50;\n }\n\n i {\n width: 18px;\n text-align: center;\n color: $es-text-muted;\n font-size: 14px;\n }\n\n .summary-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .summary-item-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n padding: 2px 8px;\n border-radius: $es-radius-sm;\n }\n }\n}\n\n// Make trait-total-count clickable\n.trait-total-count {\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n opacity: 0.8;\n }\n\n &.popover-open {\n opacity: 0.9;\n }\n}\n","/**\n * Schedule Conditions Component\n * DateTime picker, weekly timeline, holidays\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Schedule conditions wrapper\n.schedule-conditions-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n// Schedule header\n.schedule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n.schedule-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n// Schedule body\n.schedule-body {\n padding: $es-spacing-md;\n}\n\n// Schedule section\n.schedule-section {\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n.schedule-section-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n.schedule-section-description {\n margin-bottom: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n// DateTime range picker\n.datetime-range {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n}\n\n.datetime-field {\n flex: 1;\n min-width: 200px;\n}\n\n.datetime-label {\n display: block;\n margin-bottom: 0.25rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n}\n\n.datetime-input {\n @include input-base;\n}\n\n// Weekly schedule\n.weekly-schedule {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n}\n\n.day-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n\n &.disabled {\n opacity: 0.5;\n }\n}\n\n.day-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n min-width: 100px;\n}\n\n.day-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.day-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n// Timeline slider\n.timeline-slider {\n flex: 1;\n position: relative;\n height: 24px;\n background: $es-slate-200;\n border-radius: $es-radius-full;\n cursor: pointer;\n}\n\n.timeline-fill {\n position: absolute;\n top: 0;\n height: 100%;\n background: $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n}\n\n.timeline-handle {\n position: absolute;\n top: 50%;\n width: 16px;\n height: 16px;\n background: $es-white;\n border: 2px solid $es-primary;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: grab;\n box-shadow: $es-shadow-sm;\n transition: box-shadow $es-transition-fast;\n\n &:hover {\n box-shadow: $es-shadow-md;\n }\n\n &:active {\n cursor: grabbing;\n }\n\n &.handle-start {\n z-index: 2;\n }\n\n &.handle-end {\n z-index: 1;\n }\n}\n\n// Time display\n.day-times {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n min-width: 120px;\n font-size: $es-font-size-xs;\n font-family: monospace;\n color: $es-text-secondary;\n}\n\n.time-separator {\n color: $es-text-muted;\n}\n\n// Holiday exclusions\n.holiday-section {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n}\n\n.holiday-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-md;\n}\n\n.holiday-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.holiday-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n.holiday-countries {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n}\n\n.holiday-country-chip {\n @include chip;\n cursor: pointer;\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n }\n}\n\n// Server time display\n.server-time {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-info-light;\n border-radius: $es-radius-md;\n font-size: $es-font-size-xs;\n color: $es-info;\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .time-value {\n font-family: monospace;\n font-weight: $es-font-weight-semibold;\n }\n}\n\n// Schedule summary\n.schedule-summary {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n color: $es-text-secondary;\n\n .summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n\n i {\n color: $es-success;\n font-size: $es-font-size-sm;\n }\n\n &.inactive i {\n color: $es-text-muted;\n }\n }\n}\n\n// Collapsed state\n.schedule-conditions-trait.collapsed {\n .schedule-body {\n display: none;\n }\n\n .schedule-header {\n border-radius: $es-radius-lg;\n }\n}\n\n// Schedule toggle row (form-content layout)\n.schedule-toggle-row {\n display: flex;\n align-items: center;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n .schedule-toggle-switch {\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .schedule-toggle-actions {\n padding: $es-spacing-sm $es-spacing-md;\n border-left: 1px solid $es-border-color;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .material-icons {\n color: $es-slate-400;\n font-size: 20px;\n }\n }\n}\n\n// Schedule summary badges (read-only indicators in header)\n.schedule-summary-badges {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-left: auto;\n padding: 0 $es-spacing-sm;\n}\n\n.schedule-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-slate-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n white-space: nowrap;\n\n .material-icons {\n font-size: 14px;\n opacity: 0.7;\n }\n}\n\n// Section hint after embedded entity selector - add margin\n.schedule-holidays .section-hint {\n margin-top: $es-spacing-md;\n}\n","/**\n * Tips Box Component\n * Pro tips and help information display\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Tips box container\n .target-tips-box {\n margin: $es-spacing-lg $es-spacing-md $es-spacing-md;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n }\n\n // Tips header (clickable to expand/collapse)\n .tips-header {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: $es-spacing-md $es-spacing-lg;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.02);\n }\n\n // Lightbulb icon\n > i:first-child {\n font-size: 1rem;\n color: $es-warning;\n }\n\n // Title text\n > span {\n flex: 1;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n }\n }\n\n // Toggle chevron icon\n .tips-toggle {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n transition: transform 0.2s;\n }\n\n // Expanded state\n .target-tips-box.expanded {\n .tips-toggle {\n transform: rotate(180deg);\n }\n\n .tips-content {\n display: block;\n }\n }\n\n // Tips content (hidden by default)\n .tips-content {\n display: none;\n padding: 0 $es-spacing-lg $es-spacing-lg;\n }\n\n // Tips grid layout\n .tips-grid {\n display: grid;\n gap: $es-spacing-md;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n }\n\n // Individual tip item\n .tip-item {\n display: flex;\n gap: $es-spacing-md;\n padding: $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px solid $es-border-color;\n }\n\n // Tip icon\n .tip-icon {\n flex-shrink: 0;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n color: $es-primary;\n font-size: $es-font-size-sm;\n }\n\n // Tip text content\n .tip-text {\n flex: 1;\n min-width: 0;\n\n strong {\n display: block;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: 0.25rem;\n }\n\n p {\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n margin: 0;\n }\n }\n\n // Tips footer\n .tips-footer {\n margin-top: $es-spacing-md;\n padding: 0.625rem $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px dashed $es-gray-300;\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n\n i {\n color: $es-primary;\n margin-right: 0.25rem;\n }\n }\n}\n","/**\n * Condition Trait Base Styles\n * Shared styling for all condition trait components\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Base condition trait container\n.condition-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n// Collapsed state\n.condition-trait.collapsed {\n .condition-trait-header {\n border-bottom-color: transparent;\n border-radius: $es-radius-lg;\n }\n\n .collapse-icon {\n transform: rotate(180deg);\n }\n}\n\n// =============================================================================\n// Trait Header\n// =============================================================================\n\n.condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-lg;\n flex-wrap: wrap;\n padding: 0.875rem $es-spacing-lg;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n }\n}\n\n.trait-header-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n min-width: 0;\n flex: 1;\n}\n\n.trait-icon {\n font-size: 1.125rem;\n color: $es-text-muted;\n flex-shrink: 0;\n}\n\n.trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-800;\n white-space: nowrap;\n}\n\n.trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n// Schedule summary (shows current config at a glance)\n.trait-summary {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.625rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n border-radius: $es-radius-full;\n white-space: nowrap;\n margin-left: $es-spacing-md;\n flex-shrink: 0;\n max-width: 320px;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:empty {\n display: none;\n }\n}\n\n.trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.trait-header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n}\n\n// Collapse icon\n.collapse-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n cursor: pointer;\n transition: all 0.2s;\n border-radius: $es-radius-sm;\n background: transparent;\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n }\n}\n\n// Show all toggle\n.trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n// Trait total count badge (global fallback)\n.trait-total-count {\n @include count-badge($es-primary);\n}\n\n// Required indicator\n.trait-required {\n color: $es-danger;\n font-size: $es-font-size-xs;\n}\n\n// Validation error\n.trait-validation-error {\n color: $es-danger;\n font-size: $es-font-size-xs;\n margin-top: 0.25rem;\n}\n\n// Trait toggle button\n.trait-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &.active {\n color: $es-primary;\n border-color: $es-primary;\n background: $es-primary-light;\n }\n}\n\n// =============================================================================\n// Trait Body\n// =============================================================================\n\n.condition-trait-body {\n padding: $es-spacing-lg;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n background: $es-white;\n animation: slideDown 0.2s ease-out;\n}\n\n// Condition trait collapsed - hide body\n.condition-trait.collapsed .condition-trait-body {\n display: none;\n}\n\n// =============================================================================\n// Section Styles\n// =============================================================================\n\n.schedule-section,\n.context-section {\n margin-bottom: 1.25rem;\n padding-bottom: 1.25rem;\n border-bottom: 1px solid $es-slate-100;\n\n &:last-child {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: 0;\n }\n}\n\n.section-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n margin-bottom: $es-spacing-md;\n\n i {\n font-size: $es-font-size-sm;\n color: $es-slate-400;\n margin-right: 0.25rem;\n }\n}\n\n.section-content {\n // Container for section content\n}\n\n.section-hint {\n margin-top: 0.5rem;\n font-size: 11px;\n color: $es-slate-400;\n}\n\n// =============================================================================\n// Full-width Form Group Override\n// =============================================================================\n\n.form-group.condition-trait-fullwidth {\n display: block !important;\n\n > .control-label {\n display: none !important;\n }\n\n > .col-lg-8,\n > .col-lg-8.col-lg-offset-3 {\n width: 100% !important;\n max-width: 100% !important;\n flex: 0 0 100% !important;\n padding-left: $es-spacing-lg !important;\n padding-right: $es-spacing-lg !important;\n margin: 0 !important;\n margin-left: 0 !important;\n }\n}\n\n// Condition traits group label\n.condition-traits-group-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: $es-spacing-md;\n}\n\n.condition-traits-wrapper {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n}\n\n// =============================================================================\n// Collapse Header (form-content layout)\n// =============================================================================\n\n.entity-selector-collapse-header {\n padding: 0;\n margin-bottom: $es-spacing-sm;\n\n .btn-collapse-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0;\n background: none;\n border: none;\n color: $es-primary;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n .collapse-icon {\n font-size: 1.25rem;\n transition: transform 0.2s;\n }\n\n .collapse-label {\n font-weight: $es-font-weight-medium;\n }\n }\n}\n\n// When collapsed, rotate icon\n.condition-trait.collapsed .entity-selector-collapse-header {\n .collapse-icon {\n // Icon already shows expand_more when collapsed\n }\n}\n\n// =============================================================================\n// Animations\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 * Combination Attributes Picker Component\n * Product attribute combination selection styles\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Main container\n .combination-attributes-picker {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n }\n\n // Mode toggle (Any/All)\n .combination-mode-toggle {\n display: inline-flex;\n gap: 0.25rem;\n padding: 0.125rem;\n background: $es-slate-100;\n border-radius: $es-radius-md;\n margin-bottom: 0.5rem;\n }\n\n .combination-mode-option {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n cursor: pointer;\n font-size: 11px;\n color: $es-text-muted;\n padding: 0.25rem 0.625rem;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n input[type=\"radio\"] {\n display: none;\n }\n\n .mode-label {\n user-select: none;\n }\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n }\n\n &:has(input[type=\"radio\"]:checked) {\n background: $es-primary;\n color: $es-white;\n font-weight: $es-font-weight-medium;\n }\n }\n\n // Groups container\n .combination-groups-container {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n }\n\n // Loading/Empty/Error states\n .combination-loading,\n .combination-empty,\n .combination-error {\n color: $es-text-muted;\n font-style: italic;\n padding: 0.5rem;\n }\n\n .combination-error {\n color: $es-danger;\n }\n\n // Section header\n .combinations-section {\n margin-bottom: $es-spacing-md;\n }\n\n .combinations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .combinations-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .combinations-help {\n font-size: 11px;\n color: $es-slate-400;\n }\n\n // Toggle combinations button\n .btn-toggle-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n .btn-remove-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-danger;\n background: transparent;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n // =============================================================================\n // Attribute Group\n // =============================================================================\n\n .comb-attr-group {\n flex: none;\n min-width: 120px;\n max-width: 200px;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n overflow: hidden;\n\n &.has-selections {\n border-color: $es-primary;\n }\n }\n\n .comb-attr-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.375rem 0.625rem;\n background: $es-slate-100;\n border-bottom: 1px solid $es-gray-300;\n font-weight: $es-font-weight-semibold;\n font-size: $es-font-size-xs;\n color: $es-slate-800;\n\n .comb-attr-group.has-selections & {\n background: $es-cyan-50;\n border-bottom-color: $es-cyan-200;\n }\n }\n\n .comb-attr-group-name {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .comb-attr-group-count {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 0.25rem;\n background: $es-gray-300;\n border-radius: $es-radius-full;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n line-height: 18px;\n text-align: center;\n color: $es-text-muted;\n\n .comb-attr-group.has-selections & {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Toolbar\n .comb-attr-toolbar {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.375rem;\n background: $es-slate-50;\n border-bottom: 1px solid $es-slate-100;\n }\n\n .comb-toolbar-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n cursor: pointer;\n font-size: $es-font-size-xs;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-400;\n color: $es-slate-800;\n }\n }\n\n .comb-attr-search {\n flex: 1;\n min-width: 60px;\n padding: 0.125rem 0.375rem;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n outline: none;\n\n &:focus {\n border-color: $es-primary;\n }\n\n &::placeholder {\n color: $es-slate-400;\n }\n }\n\n // Values container\n .comb-attr-values {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.375rem;\n max-height: 150px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .comb-attr-loading,\n .comb-attr-empty,\n .comb-attr-error {\n width: 100%;\n text-align: center;\n color: $es-slate-400;\n font-size: 11px;\n padding: 0.25rem;\n }\n\n .comb-attr-error {\n color: $es-danger;\n }\n\n // Individual value\n .comb-attr-value {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.5rem;\n background: $es-white;\n border: 1px solid $es-slate-400;\n border-radius: 0.75rem;\n font-size: 11px;\n color: $es-slate-600;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-text-muted;\n }\n\n &.selected {\n background: $es-primary;\n border-color: $es-primary-hover;\n color: $es-white;\n\n &:hover {\n background: $es-primary-hover;\n border-color: color.adjust($es-primary-hover, $lightness: -5%);\n }\n }\n }\n\n .comb-attr-value-count {\n font-size: 9px;\n color: $es-slate-400;\n background: $es-slate-100;\n padding: 1px 0.25rem;\n border-radius: 0.5rem;\n min-width: 14px;\n text-align: center;\n\n .comb-attr-value.selected & {\n color: $es-white;\n background: rgba(255, 255, 255, 0.3);\n }\n }\n\n // =============================================================================\n // Combination Conditions (Row-based)\n // =============================================================================\n\n .combination-conditions-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .combination-condition-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-sm;\n }\n\n .combination-group-select,\n .combination-values-select {\n flex: 1;\n min-width: 120px;\n }\n\n .combination-equals {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: 0 0.25rem;\n }\n\n .btn-add-combination-condition {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: transparent;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-remove-combination-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-danger, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Method Dropdown Component\n * Custom select dropdown with icons for method selection\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Method dropdown trigger button\n .method-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n height: 36px;\n padding: 0 $es-spacing-md;\n border-radius: $es-radius-md;\n background: $es-white;\n color: $es-slate-800;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n min-width: 180px;\n max-width: 320px;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &:focus,\n &:active {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 3px rgba($es-primary, 0.1);\n }\n }\n\n .method-trigger-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n flex-shrink: 0;\n width: 18px;\n text-align: center;\n }\n\n .method-trigger-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: $es-font-weight-medium;\n }\n\n .method-trigger-caret {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n flex-shrink: 0;\n margin-left: auto;\n }\n\n // Locked state\n .selector-locked .method-dropdown-trigger {\n background: $es-slate-100;\n color: $es-slate-400;\n cursor: not-allowed;\n border-color: $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-color;\n }\n }\n\n // Method selector wrapper\n .method-selector-wrapper {\n position: relative;\n }\n\n // Hidden select (for form submission)\n .method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n }\n}\n\n// Global fallback for hidden method selects\n.method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n}\n\n// =============================================================================\n// Method Dropdown Menu (appended to body, outside trait wrappers)\n// =============================================================================\n\n.method-dropdown-menu {\n position: absolute;\n z-index: $es-z-dropdown + 1;\n min-width: 200px;\n max-width: 360px;\n max-height: 400px;\n overflow-y: auto;\n background: $es-white;\n border-radius: $es-radius-lg;\n padding: 0.375rem 0;\n border: 1px solid $es-border-color;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n animation: methodDropdownFadeIn 0.15s ease;\n @include custom-scrollbar;\n}\n\n@keyframes methodDropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n// Method dropdown item\n.method-dropdown-item {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.5rem $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.1s;\n position: relative;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: rgba($es-primary, 0.08);\n }\n\n .method-item-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n }\n\n &.selected .method-item-icon {\n color: $es-primary;\n }\n\n .method-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-slate-700;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.selected .method-item-label {\n color: $es-cyan-700;\n font-weight: $es-font-weight-medium;\n }\n\n .method-item-check {\n font-size: $es-font-size-xs;\n flex-shrink: 0;\n margin-left: auto;\n color: $es-primary;\n }\n}\n\n// Method dropdown optgroup\n.method-dropdown-optgroup {\n margin-top: 0.25rem;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.method-optgroup-label {\n padding: 0.5rem $es-spacing-md;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n color: $es-text-muted;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: $es-slate-50;\n border-top: 1px solid $es-slate-100;\n border-bottom: 1px solid $es-slate-100;\n\n .method-dropdown-optgroup:first-child & {\n border-top: 0;\n }\n}\n\n.method-optgroup-items {\n padding: 0.25rem 0;\n\n .method-dropdown-item {\n padding-left: $es-spacing-lg;\n }\n}\n\n// Method info placeholder\n.method-info-placeholder {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n font-style: italic;\n}\n","/**\n * Tooltip Component\n * Info tooltips for method help\n */\n\n@use '../variables' as *;\n\n// =============================================================================\n// Info Wrapper (tooltip trigger)\n// =============================================================================\n\n.mpr-info-wrapper {\n display: inline-flex;\n align-items: center;\n position: relative;\n cursor: help;\n vertical-align: middle;\n margin-left: 0.25rem;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n transition: color 0.15s ease;\n }\n\n &:hover .material-icons {\n color: $es-primary;\n }\n}\n\n// =============================================================================\n// Fixed Tooltip (appended to body on hover)\n// =============================================================================\n\n.mpr-tooltip-fixed {\n position: fixed;\n background: $es-white;\n color: $es-slate-800;\n padding: $es-spacing-md $es-spacing-lg;\n border-radius: $es-radius-md;\n font-size: 13px;\n line-height: 1.5;\n white-space: normal;\n z-index: 10500;\n max-width: 320px;\n min-width: 180px;\n text-align: left;\n box-shadow: rgba(0, 0, 0, 0.12) 0px 1px 1px 0px,\n rgba(64, 68, 82, 0.16) 0px 0px 0px 1px,\n rgba(64, 68, 82, 0.08) 0px 2px 5px 0px;\n pointer-events: none;\n\n // Pinned tooltip allows interaction\n &.pinned {\n pointer-events: auto;\n padding-right: $es-spacing-xl + 1rem;\n }\n\n strong {\n display: block;\n margin-bottom: 0.375rem;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n p {\n margin: 0;\n color: $es-text-secondary;\n }\n\n ul {\n margin: 0.5rem 0 0;\n padding-left: 1.25rem;\n\n li {\n margin: 0.25rem 0;\n color: $es-text-secondary;\n }\n }\n}\n\n// Close button for pinned tooltips\n.mpr-tooltip-close {\n position: absolute;\n top: 0.375rem;\n right: 0.375rem;\n padding: 0.125rem;\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: $es-radius-sm;\n line-height: 1;\n transition: background-color 0.15s ease;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n }\n\n &:hover {\n background: $es-slate-100;\n\n .material-icons {\n color: $es-slate-700;\n }\n }\n}\n","/**\n * Category Tree Component\n * Hierarchical tree view for category selection inside dropdown\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Category tree container (inside dropdown)\n.category-tree {\n display: flex;\n flex-direction: column;\n}\n\n// Tree toolbar inside dropdown\n.category-tree .tree-toolbar {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-light;\n flex-shrink: 0;\n\n .btn-expand-all,\n .btn-collapse-all {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-300;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n// Tree items container\n.category-tree .tree-items {\n padding: 0;\n}\n\n// Tree item\n.tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n border-radius: 0;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-name {\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n .tree-checkbox {\n color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n }\n\n &.inactive {\n opacity: 0.6;\n\n .tree-name {\n font-style: italic;\n }\n }\n\n &.filtered-out {\n display: none;\n }\n\n &.filter-match {\n background: $es-warning-light;\n\n &.selected {\n background: $es-primary-light;\n }\n }\n}\n\n// All tree element styles nested under .category-tree for specificity\n.category-tree {\n // Tree indentation\n .tree-indent {\n flex-shrink: 0;\n }\n\n // Tree toggle (expand/collapse)\n .tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-secondary;\n flex-shrink: 0;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n cursor: pointer;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n\n &.tree-leaf {\n cursor: default;\n visibility: hidden;\n\n &:hover {\n background: transparent;\n }\n }\n\n i {\n font-size: 10px;\n transition: transform $es-transition-fast;\n }\n }\n\n .tree-item.collapsed > .tree-toggle i {\n transform: rotate(-90deg);\n }\n\n // Tree checkbox indicator - 12x12 to match PrestaShop admin standards\n .tree-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n flex-shrink: 0;\n border: 1px solid $es-border-color;\n border-radius: 2px;\n background: $es-white;\n\n i {\n font-size: 8px;\n opacity: 0;\n color: $es-white;\n transition: opacity $es-transition-fast;\n }\n }\n\n .tree-item.selected .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n\n // Tree icon\n .tree-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n flex-shrink: 0;\n\n i {\n font-size: 12px; // match visual weight of other icons\n }\n }\n\n .tree-item.selected .tree-icon {\n color: $es-primary;\n }\n\n // Tree name\n .tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Tree product/page count with preview\n .tree-count {\n @include count-badge($es-primary);\n height: 18px;\n min-width: 18px;\n padding: 0 $es-spacing-sm;\n\n i {\n font-size: 10px;\n }\n\n &.clickable {\n &.loading {\n pointer-events: none;\n\n i {\n animation: spin 1s linear infinite;\n }\n }\n\n &.popover-open {\n background: color.adjust($es-primary, $lightness: -10%);\n }\n }\n }\n\n // Select children button - positioned on the left next to toggle\n .btn-select-children {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0.3;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n i {\n font-size: 14px; // larger to visually match other icons\n }\n\n &:hover {\n color: $es-primary;\n opacity: 1;\n }\n }\n\n .tree-item:hover .btn-select-children {\n opacity: 0.6;\n }\n\n // Tree badge (inactive, etc.)\n .tree-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem $es-spacing-xs;\n font-size: 9px;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n\n &.inactive {\n color: $es-warning;\n background: $es-warning-light;\n }\n }\n\n // Tree children container\n .tree-children {\n display: block;\n\n &.filter-expanded {\n display: block !important;\n }\n }\n\n .tree-item.collapsed + .tree-children {\n display: none;\n }\n\n // Filtering - must be inside .category-tree for specificity\n .tree-item.filtered-out {\n display: none !important;\n }\n} // end .category-tree\n\n// Loading/empty/error states\n.category-tree .tree-loading,\n.category-tree .dropdown-empty,\n.category-tree .dropdown-error {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n margin-right: $es-spacing-sm;\n }\n}\n\n.category-tree .dropdown-error {\n color: $es-danger;\n}\n\n// Tree view mode in dropdown\n.target-search-dropdown.view-tree {\n .dropdown-results {\n padding: 0;\n }\n\n .category-tree {\n max-height: 100%;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .tree-items {\n max-height: calc(100% - 40px);\n overflow-y: auto;\n @include custom-scrollbar;\n }\n}\n","/**\n * Validation Toast Component\n * Error notifications for selection conflicts\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Validation error toast\n.es-validation-toast {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-danger;\n border-left: 4px solid $es-danger;\n border-radius: $es-radius-md;\n box-shadow: $es-shadow-lg;\n max-width: 400px;\n animation: es-toast-slide-in 0.2s ease-out;\n\n .es-toast-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-danger;\n flex-shrink: 0;\n\n i {\n font-size: 18px;\n }\n }\n\n .es-toast-content {\n flex: 1;\n min-width: 0;\n }\n\n .es-toast-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-danger;\n margin-bottom: 2px;\n }\n\n .es-toast-message {\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n line-height: 1.4;\n }\n\n .es-toast-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-primary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n@keyframes es-toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["main.scss","_variables.scss","../../../prestashop-admin/assets/scss/_variables.scss","_mixins.scss","layouts/_form-integration.scss","layouts/_responsive.scss","components/_entity-selector.scss","components/_entity-item.scss","components/_dropdown.scss","components/_chips.scss","components/_groups.scss","components/_value-picker.scss","components/_modal.scss","components/_list-preview.scss","components/_schedule.scss","components/_tips.scss","components/_condition-trait.scss","components/_combinations.scss","components/_method-dropdown.scss","components/_tooltip.scss","components/_tree.scss","components/_validation.scss"],"names":[],"mappings":"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;EACA,OJjJC;;AIqJL;AAAA;EACI;EACA,YL5JG;EK6JH;;AAIJ;AAAA;EACI;EACA;EACA;EACA;EACA,YL/HO;EKgIP;;AAGJ;AAAA;EACI;EACA;EACA;EACA,KL9FQ;EK+FR;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OJnLI;EIoLJ,WLvDU;EKwDV,aLnDgB;EKoDhB;EACA;;AAEA;AAAA;EACI,YLrJG;EKsJH,OLjJG;;AKoJP;AAAA;EACI,YLlMD;EKmMC,qBL9IE;EK+IF,OJlMF;;AIqMF;AAAA;EACI,WLxEM;;AK2EV;AAAA;EACI;;AAGJ;AAAA;EH5CJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AK4Ed;AAAA;EHhDJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YFhIW;EEiIX,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AKkFlB;AAAA;EACI;EACA;EACA,YLrLO;EKsLP;EACA;;AAEA;AAAA;EACI;EACA;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,YLtMO;EKuMP;EACA,OL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EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA;EACA,KPhSQ;EOiSR,SP9RQ;EO+RR;EACA,ONhXI;;AMkXJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA,WP5PM;;AOiQd;AAAA;EACI;EACA;EACA;EACA,SPlTQ;EOmTR,ONnYI;;AMqYJ;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;EACA;EACA,KN5ZC;EM6ZD;EACA,YP/WM;EOgXN;EACA;;AAIJ;AAAA;EACI;EACA;EACA,KP/UQ;EOgVR,WPhSU;EOiSV,ON7ZI;;AM+ZJ;AAAA;EACI,ONhaA;;AMmaJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eNlZO;EMmZP;EACA;EACA,WP/SM;EOgTN,OP9YE;EO+YF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cNlbN;;AMqbE;AAAA;AAAA;AAAA;EACI;EACA,cNvbN;;AM2bF;AAAA;EACI,ON3bA;;AM6bA;AAAA;EACI,OPhaF;EOiaE,aP5TU;;AOgUlB;AAAA;ELvaJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK8ZA;AAAA;EAEI;EACA,WP1UM;EO2UN,ONxcF;EMycE;EACA,eNnbO;EMobP;;AAEA;AAAA;EACI,YP1cG;;AOgdf;AAAA;EACI;EACA;EACA,KPzYQ;;AO4YZ;AAAA;EL7bA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AKobJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WPnWU;EOoWV,aP9VgB;EO+VhB,eN3cW;EM4cX;;AAEA;AAAA;EACI;EACA;EACA;EACA;EACA,aPxWY;;AO2WhB;AAAA;EACI,OP/cE;EOgdF,YPjfD;EOkfC;;AAEA;AAAA;EACI,YP9cD;EO+cC,cPxdF;;AO4dN;AAAA;AAAA;EAEI,OP5fD;EO6fC,YN3fF;EM4fE;;AAEA;AAAA;AAAA;EACI,YP5fG;EO6fH,cP7fG;;AOggBP;AAAA;AAAA;EACI;;AAMZ;AAAA;EACI;;AAGJ;AAAA;EACI;;AAIJ;AAAA;EACI,SN/hBC;EMgiBD,YPjfM;EOkfN;;AAGJ;AAAA;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xBR,SNl3BC;EMm3BD,YNl2BA;EMm2BA;EACA;EACA;;AAGJ;AAAA;EACI,WPjvBU;EOkvBV,aP5uBkB;EO6uBlB,OPh1BM;EOi1BN;;AAGJ;AAAA;EACI;EACA;EACA,KP3yBQ;EO4yBR;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;ELj2BA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EACI;;AKw1BJ;AAAA;AAAA;AAAA;EAGI;EACA;EACA;EACA;EACA,WPxwBU;EOywBV,OPv2BM;EOw2BN,YPz4BG;EO04BH;EACA,eNl3BW;EMm3BX;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,YPp3BE;EOq3BF,cPx2BG;;AO22BP;AAAA;AAAA;AAAA;EACI;EACA;EACA,YPh3BG;EOi3BH;EACA,ONt5BA;;AM05BR;AAAA;EACI;EACA;;AAIJ;AAAA;ELj0BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AOo4BV;AAAA;EAEI;EACA,WPvyBU;EOwyBV;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ONp7BI;EMq7BJ,YPx7BG;EOy7BH;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI,YPv6BE;EOw6BF,OPj6BE;;AOo6BN;AAAA;EACI,YPl8BO;EOm8BP,cNv8BF;EMw8BE,ONx8BF;;AM48BN;AAAA;EL52BA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AO+6BV;AAAA;EAEI;EACA,WPl1BU;EOm1BV;EACA;;AAGJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON99BI;EM+9BJ,YPl+BG;EOm+BH;EACA,eN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EACI,WP/tCM;EOguCN,aPztCc;EO0tCd,OP/zCE;EOg0CF;;AAGJ;AAAA;ELr0CJ;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AK4zCA;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,ONz2CA;EM02CA,eNp1CO;;AMs1CP;AAAA;EACI,YPx0CD;EOy0CC,OP90CF;;AOo1CV;AAAA;EACI,aPnvCgB;;AOsvCpB;AAAA;EACI;EACA,ON13CI;EM23CJ;;AAGJ;AAAA;AAAA;AAAA;EACI;;AAIJ;AAAA;EACI;EACA;;AL7wCJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;EC0HA;;AAGJ;AAAA;EACI,YD/GO;ECgHP;;AAEA;AAAA;EACI,YF5GE;;AO82CV;AAAA;EACI;EACA;EACA,KPh0CQ;EOi0CR,SPh0CQ;;AOm0CZ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI,YN15CF;EM25CE,cN35CF;;AM+5CN;AAAA;EACI;EACA;EACA;EACA;EACA,eN74CW;EM84CX,YPh4CO;;AOm4CX;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,WPhzCU;EOizCV,aP5yCgB;EO6yChB,OP/4CM;EEfV;EACA;EACA;;AKg6CA;AAAA;EACI,WPxzCU;EOyzCV,ONr7CI;ECiBR;EACA;EACA;;AKu6CA;AAAA;EACI;EACA;EACA;EACA,KN18CC;EM28CD;EACA,YP75CM;EO85CN;EACA;;AAGJ;AAAA;EACI;EACA;EACA,KP53CQ;EO63CR,WP70CU;EO80CV,ON18CI;;AM48CJ;AAAA;EACI,ON78CA;;AMg9CJ;AAAA;AAAA;AAAA;EAEI;EACA;EACA;EACA,eN/7CO;EMg8CP;EACA;EACA,WP51CM;EO61CN,OP37CE;EO47CF;EACA;;AAEA;AAAA;AAAA;AAAA;EACI,cN/9CN;;AMk+CE;AAAA;AAAA;AAAA;EACI;EACA,cNp+CN;;AMw+CF;AAAA;EACI,ONx+CA;;AM0+CA;AAAA;EACI,OP78CF;EO88CE,aPz2CU;;AO82CtB;AAAA;EACI;EACA;EACA,KPv6CQ;;AO06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;EACA,YR3vBO;EQ4vBP,ePluBe;EOmuBf,YRvpBW;EQwpBX;;AAEA;EACI;EACA;EACA;EACA,KRprBQ;EQqrBR;EACA,YP9vBA;EO+vBA;;AAGJ;EACI;EACA;EACA,KR7rBQ;EQ8rBR,WR9oBU;EQ+oBV,aRzoBkB;EQ0oBlB,OR7uBM;;AQgvBV;EACI;EACA;;AAGJ;ENzvBA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AMgvBJ;EAEI;EACA;EACA;EACA;EACA;EACA,OP5xBI;EO6xBJ,ePxwBQ;EOywBR;;AAEA;EACI,YR5vBG;EQ6vBH,ORpwBE;;AQuwBN;EACI;;AAIR;EACI;EACA;EACA,SRhuBQ;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AQuxBV;EACI;EACA;EACA;EACA,KRzuBQ;EQ0uBR;EACA,OPxzBI;EOyzBJ,WR5rBU;;AQ8rBV;EACI;;AAGJ;EACI;;AAKR;EACI;EACA;EACA,OPx0BI;;AO00BJ;EACI;EACA;EACA,eRhwBI;EQiwBJ;;AAGJ;EACI;EACA,WRttBM;;AQ2tBd;EACI;EACA;EACA,KR/wBQ;;AQkxBZ;EACI;EACA;EACA,KP72BC;EO82BD;EACA,YRh0BM;EQi0BN,eP/0BQ;EOg1BR;;AAEA;EAEI,mBPr2BL;;AOw2BC;EACI,mBP12BF;;AO62BF;EAEI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WR/vBM;EQgwBN,aR1vBc;EQ2vBd,OR91BE;;AQi2BN;EACI;EACA,WRvwBM;EQwwBN,OPp4BA;;AOw4BR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA,WRzxBU;EQ0xBV,ORv3BM;EQw3BN;;AAGJ;EACI;EACA,aRh1BQ;EQi1BR;EACA;EACA,aR9xBgB;EQ+xBhB;EACA,YR73BO;EQ83BP,ORr4BM;EQs4BN,eP94BW;EO+4BX;;AAGJ;EACI,YPr7BC;EOs7BD,WR9yBU;EQ+yBV,OP36BI;EO46BJ;;AAIJ;EACI;EACA;EACA,KRv2BQ;EQw2BR;EACA;EACA,YRn5BM;;AQq5BN;EACI;EACA,OP17BA;;AO67BJ;EACI;EACA;EACA;EACA,WRp0BM;EQq0BN,ORl6BE;EQm6BF;EACA;;AAEA;EACI,OPv8BJ;;;AO88BZ;EACI;IACI;;EAEJ;IACI;;;AAcI;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ePt9BG;EOu9BH;EACA;EACA,OR/8BF;EQg9BE;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,OPp/BR;EOq/BQ;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cP3/BV;EO4/BU;;AAKR;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA;EACA;EACA;EACA,eP/+BG;EOg/BH;EACA;EACA;EACA;EACA,OR5+BF;EQ6+BE;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EACI,cPlhCV;;AOqhCM;AAAA;AAAA;AAAA;AAAA;AAAA;EACI;EACA,cPvhCV;EOwhCU;;;ATziCpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AUAA;AAAA;AAAA;AAAA;AAYI;AAAA;EACI,YTEG;ESDH;EACA,eR0BW;EQzBX;;AAIJ;AAAA;EACI;EACA;EACA;EACA,KRlBC;EQmBD;EACA,YRHA;EQIA;;AAGJ;AAAA;EACI;EACA;EACA,KT8DQ;ES7DR,WT6GU;ES5GV,aTkHkB;ESjHlB,OTcM;;ASZN;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YR5BF;EQ6BE,OT/BD;ESgCC,WT+FM;ES9FN,aTsGU;ESrGV,eT2DK;;ASvDb;AAAA;EACI;EACA;EACA,KTsCQ;;ASnCZ;AAAA;EPbA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOIJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORhDI;EQiDJ,eR3BW;EQ4BX;;AAEA;AAAA;EACI,YThBG;ESiBH,OTxBE;;AS2BN;AAAA;EACI,YT/CM;ESgDN,ORzDH;;AQ8DL;AAAA;AAAA;AAAA;EAEI,SR9EC;;AQkFL;AAAA;EACI,eRnFC;;AQsFL;AAAA;EACI;EACA;EACA,KTDQ;ESER,eTDQ;ESER,WT6CU;ES5CV,aTmDkB;ESlDlB;EACA;;AAEA;AAAA;EACI,OT7EM;;AS+EN;AAAA;EACI,ORvFN;;AQ2FF;AAAA;EACI,OR3FH;;AQ6FG;AAAA;EACI,OR9FP;;AQoGL;AAAA;EACI;EACA;EACA,KT5BQ;ES6BR,eT7BQ;;ASgCZ;AAAA;EACI;EACA;;AAGJ;AAAA;EPnBA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASsFV;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EPjGA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOwFJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORpII;EQqIJ,eT3CS;ES4CT;;AAEA;AAAA;EACI,YTrGG;ESsGH,OR3IF;;AQgJN;AAAA;EACI;;AAGJ;AAAA;EPvHA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO8GJ;AAAA;EAEI;EACA;EACA,KT1EQ;ES2ER;EACA;EACA,YT7JG;ES8JH;EACA,eRvIQ;EQwIR,OR7JI;EQ8JJ,WTjCU;ESkCV;EACA;;AAEA;AAAA;EACI,cT7HG;;ASgIP;AAAA;EACI,cRxKF;EC4CN;EACA;;AO+HI;AAAA;EACI,OThJE;;ASqJV;AAAA;EACI;;AAGJ;AAAA;EPtFA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;ASyJV;AAAA;EAEI;;AAGJ;AAAA;EP9JA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ORtME;EQuMF,eRhLW;EQiLX;;AAEA;AAAA;EACI,YTvMO;;AS4Mf;AAAA;EACI;EACA;EACA,KTrIQ;;ASwIZ;AAAA;EACI;EACA;EACA,KT3IQ;;AS8IZ;AAAA;EP5HA;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;AAAA;EACI,cD3GE;EC4CN;EACA;;AAkEA;AAAA;EACI,OFnFM;;AS+LV;AAAA;EAEI;EACA;;AAGJ;AAAA;EACI,ORlOI;EQmOJ,WTtGU;;ASyGd;AAAA;EP1MA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOiMJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,OR7OI;EQ8OJ,eRxNW;EQyNX;;AAEA;AAAA;EACI,YTvOM;ESwON,ORjPH;;AQqPL;AAAA;EP3NA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOkNJ;AAAA;EAEI;EACA;EACA;EACA;EACA,OR9PE;EQ+PF,WTlIU;ESmIV,aT7HgB;ES8HhB,eR1OW;EQ2OX;;AAEA;AAAA;EACI,YTjQO;;ASsQf;AAAA;EACI;EACA;EACA,KThMQ;;ASmMZ;AAAA;EPnPA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AO0OJ;AAAA;EAEI;EACA;EACA;EACA;EACA,YTjPO;ESkPP,OTxPM;ESyPN,WT3JU;ES4JV,aTtJgB;ESuJhB;EACA,eThMS;ESiMT;;AAEA;AAAA;EACI,YTzPG;;AS4PP;AAAA;EACI,YT/RO;ESgSP,ORpSF;EQqSE,cRrSF;;AQ0SN;AAAA;EACI,YRtTC;EQuTD,aRvTC;EQwTD;;AAIJ;AAAA;EACI;EACA;EACA,KTtOQ;;ASyOZ;AAAA;EACI;;AAGJ;AAAA;EP9RA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AOqRJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA,ORjUI;EQkUJ,eR5SW;EQ6SX;EACA;;AAEA;AAAA;EACI,YT5TM;ES6TN,ORtUH;;AQ0UL;AAAA;EPhTA;EACA;EACA;EACA;E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CI;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAKR;AAAA;ERlGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;;AAEA;AAAA;EACI;EACA;;AAGJ;AAAA;EACI;EACA;;AAKR;AAAA;AAAA;EAEI,YFtKO;EEuKP;;AAEA;AAAA;AAAA;EACI;EACA;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA;EACA;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,aFpGc;;AU8HlB;AAAA;EAEI,aVvLQ;;;AD/FhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AYAA;AAAA;AAAA;AAAA;AAUA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SXmHS;EWlHT;EACA;;AAEA;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YXrBO;EWsBP,eXsEW;EWrEX,YX+EW;EW9EX;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;;AAKR;EACI;EACA;EACA;EACA,KVrEK;EUsEL;EACA,YVtDI;EUuDJ;EACA;;;AAGJ;EACI,WX6DgB;EW5DhB,aXiEsB;EWhEtB,OXnCU;EWoCV;;;AAGJ;ET3CI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkCR;EAEI;EACA;EACA;EACA;EACA;EACA,OV9EQ;EU+ER,eV1DY;EU2DZ;;AAEA;EACI,YX9CO;EW+CP,OXtDM;;AWyDV;EACI,WXuCU;;;AWlClB;EACI;EACA;EACA,SXjBY;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW0Ed;EACI;EACA;EACA;EACA,KX5BY;EW6BZ;EACA,YVtGI;EUuGJ;EACA;;;AAGJ;ETpFI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2ER;EAEI;EACA;EACA;EACA,KXzCY;EW0CZ;EACA,WXMc;EWLd,aXUoB;EWTpB,eVpGY;EUqGZ;;AAEA;EACI,OX/FM;EWgGN,YX1FO;;AW4FP;EACI,YX5FG;;AWgGX;EACI,OXzIG;EW0IH,YVxIE;;AU0IF;EACI,YXxIO;;AW4If;EACI,OXlJG;EWmJH,YV9IC;;AUgJD;EACI;;AAIR;EACI;EACA;;;AAMR;EACI;EACA;EACA;EACA,KXtFY;EWuFZ;EACA,YVhKI;EUiKJ;EACA;;;AAGJ;EACI,WX9Cc;EW+Cd,aXzCsB;EW0CtB,OX7IU;;;AWgJd;ETpJI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AS2IR;EAEI;EACA;EACA;EACA;EACA;EACA,OVvLQ;EUwLR,eVlKe;EUmKf;;AAEA;EACI,YXvJO;EWwJP,OX/JM;;;AWmKd;EACI;EACA;EACA,SXvHY;;AE2CZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;;AW6Kd;EACI;EACA;EACA;EACA,KX/HY;EWgIZ;EACA,YVzMI;EU0MJ;EACA;;;AAGJ;EACI,WXxFc;EWyFd,OVrNQ;;;AUwNZ;ET5LI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASmLR;EAEI;EACA;EACA;EACA;EACA,WXlGc;EWmGd,aX7FoB;EW8FpB,OVjOM;EUkON,eV3Me;EU4Mf;;AAEA;EACI,YXlOW;;;AWuOnB;EACI;EACA;EACA;EACA,YXjPO;EWkPP;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAQR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,SX5JS;;AW8JT;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,YXxSG;EWySH,eV/QW;EUgRX,YXpMO;EWqMP;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,KV7TC;EU8TD;EACA,YV9SA;EU+SA;EACA;;AAGJ;EACI;EACA;EACA,KX9OQ;EW+OR,WX9LY;EW+LZ,aX1LkB;EW2LlB,OX9RM;EW+RN;;AAEA;EACI;EACA,OVpUF;;AUwUN;ET3SA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;ASkSJ;EAEI;EACA;EACA;EACA;EACA;EACA,OV9UI;EU+UJ,eV1TQ;EU2TR;;AAEA;EACI,YX9SG;EW+SH,OXtTE;;AWyTN;EACI;;AAIR;EACI;EACA;EACA,SXhRQ;;AEyCZ;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AWyUV;EACI;EACA;EACA;EACA,KX3RQ;EW4RR;EACA,OV1WI;EU2WJ,WX9OU;;AWgPV;EACI,WX/OM;;AWoPd;EACI;EACA;EACA,OVtXI;;AUwXJ;EACI;EACA;EACA,eVvYH;;AU0YD;EACI;;AAGJ;EACI,WXvQM;EWwQN,OVpYA;;AUyYR;EACI;EACA;EACA,KX/TQ;;AWkUZ;EACI;EACA;EACA,KV9ZC;EU+ZD;EACA,YXjXM;EWkXN,eVhYQ;EUiYR;;AAEA;EACI,mBVrZL;;AUwZC;EACI,mBV1ZF;;AU6ZF;EACI;;AAIR;EACI;EACA;;AAEA;EACI;EACA,WX9SM;EW+SN,aXzSc;EW0Sd,OX7YE;;AWgZN;EACI;EACA,WXtTM;EWuTN,OVnbA;;AUubR;EACI;EACA;;AAGJ;EACI;EACA,WXjUU;EWkUV,OX/ZM;EWgaN;;AAGJ;EACI;EACA,YXzXQ;EW0XR;EACA;EACA,aXtUgB;EWuUhB;EACA,YXraO;EWsaP,OX7aM;EW8aN,eVtbW;;AUybf;EACI,YV5dC;EU6dD,WXrVU;EWsVV,OVldI;EUmdJ;;;AZreR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AaAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;AAAA;EAEI;EACA;EACA;EACA;EACA,YZNO;EYOP;EACA,eXkBe;EWjBf,YZ4FW;EY3FX;;AAGA;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKA;AAAA;AAAA;EAEI;EACA;;AAMJ;AAAA;AAAA;EAEI;EACA;EACA;;;AASZ;EACI;EACA;EACA;EACA;EACA,YXxDI;EWyDJ;;AAEA;EACI,WZ4DU;EY3DV,aZiEkB;EYhElB,OZnCM;;AYsCV;EV1CA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AUiCJ;EAEI;EACA;EACA;EACA;EACA;EACA,OX7EI;EW8EJ,eXxDW;EWyDX;;AAEA;EACI,YZ7CG;EY8CH,OZnDE;;;AY4Dd;EACI;EACA;EACA;EACA;EACA,YZ9DU;EY+DV;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OX9GQ;EW+GR,WZac;EYZd,aZkBoB;EYjBpB;EACA;EACA;;AAEA;EACI,YZlFO;EYmFP,OZzFM;;AY4FV;EACI,YZ9HG;EY+HH,qBX7HE;EW8HF,OX9HE;;AWiIN;EACI;;;AAQR;EACI;EACA;EACA,KZ/DY;EYgEZ;EACA,YZjJO;EYkJP;;AAEA;EACI,OXlJI;EWmJJ;;AAGJ;EACI;EACA;EACA;EACA,WZ9BU;EY+BV,OZ3HM;EY4HN;;AAEA;EACI,OX/JA;;;AWwKZ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AVxDA;EACI;EACA;;AAGJ;EACI,YDzHA;EC0HA;;AAGJ;EACI,YD/GO;ECgHP;;AAEA;EACI,YF5GE;;AYwJV;EACI;;;AAQR;EACI;EACA;EACA;;;AAQJ;EACI;EACA;EACA,KZ7HY;EY8HZ,SZ9HY;EY+HZ,YZ/MO;EYgNP,eXvLe;EWwLf;;AAEA;EACI,YZxLM;;AY4LV;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA,eX1Me;EW2Mf,YZ7LW;;;AYiMf;EACI;EACA;EACA;EACA;EACA;EACA;EACA,YZxMW;EYyMX,OX7OQ;EW8OR,eXxNe;EWyNf,WZlHc;;;AYsHlB;EACI;EACA;EACA;EACA;EACA;;;AAIJ;EACI,WZhIc;EYiId,aZ5HoB;EY6HpB,OZ/NU;EEfV;EACA;EACA;;;AUiPJ;AAAA;EAEI,WZ1Ic;EY2Id,OXvQQ;ECiBR;EACA;EACA;;;AUyPJ;EACI;EACA;EACA,WZnJc;EYoJd,aZ7IsB;EY8ItB,OXlRM;EWmRN,YZ/Qe;EYgRf,eX7Pe;;;AWoQnB;EACI;EACA,YZzPU;EY0PV;;;AAGJ;EACI;EACA;EACA;EACA,KZvNY;EYwNZ,WZzKc;EY0Kd,OXtSQ;;AWwSR;EACI;;AAGJ;EACI;EACA;EACA;EACA,eX1RW;EW2RX;EACA;EACA,WZvLU;EYwLV,aZlLgB;EYmLhB,OXtTE;EWuTF;EACA;EACA;EACA;EACA;;AAEA;EACI,cX9TF;EW+TE,kBZ3TO;;AY8TX;EACI;EACA,cXpUF;EWqUE;;AAIR;EACI;;AAGJ;EACI,aZ1MkB;EY2MlB,OZhTM;;AYmTV;EACI;EACA;EACA;EACA,SZzQQ;EY0QR;EACA;EACA,OXzVE;EW0VF,YZtVW;EYuVX,eXpUW;EWqUX;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;;;AAUhB;EACI;EACA;EACA;EACA;EACA,KZ7SY;EY8SZ,SZ3SY;EY4SZ;EACA,OX7XQ;;AW+XR;EACI;EACA;;AAGJ;EACI;EACA,WZzQU;;;AY6QlB;EACI;EACA;EACA;EACA,SZ9TY;EY+TZ,OX/YQ;;AWiZR;EACI;EACA,OXpZE;EWqZF;;;AAQR;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA,KXhbC;EWibD;EACA,YXjaA;EWkaA;;AAEA;EACI,aZvSc;EYwSd,OZ3YE;EY4YF,WZ/SM;;AYkTV;EACI;EACA,WZrTM;EYsTN,aZhTY;EYiTZ,OXnbA;EWobA,YZ/YG;EYgZH;EACA,eXhaO;;AWoaf;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA,KZ1XQ;EY2XR;EACA;EACA;;AAEA;EACI,YZ1aE;;AY6aN;EACI;EACA;EACA,OXndA;EWodA;;AAGJ;EACI;EACA,WZ5VM;EY6VN,OZ1bE;;AY6bN;EACI,WZjWM;EYkWN,aZ5Vc;EY6Vd,OXjeF;EWkeE;EACA;EACA,eX7cO;;;AWmdnB;EACI;EACA;;AAEA;EACI;;AAGJ;EACI;;;AAQR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SZtbY;EYubZ,YZvgBO;EYwgBP;EACA,eXjfY;EWkfZ,YZraW;EYsaX,WZ3Yc;EY4Yd;EACA;;;AAGJ;EACI;EACA;EACA,KZncY;EYocZ;EACA,OZlfU;;AYofV;EACI;EACA;EACA,OXvhBI;;AW0hBR;EACI,aZxZkB;;AY2ZtB;EACI,OX/hBI;;;AWoiBZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YX9iBM;EW+iBN,OZjjBO;EYkjBP,WZnbc;EYobd,aZ7asB;EY8atB;EACA;EACA;;AAEA;EACI;EACA;EACA;;;Ab1kBR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AcAA;AAAA;AAAA;AAAA;AASA;EACI,YbKO;EaJP;EACA,eZ6Be;;;AYzBnB;EACI;EACA;EACA;EACA,KZdK;EYeL;EACA,YZCI;EYAJ;EACA;EACA;EACA;EACA;;AAEA;EACI,YbaM;;;AaTd;EACI;EACA;EACA;EACA,WbyGc;EaxGd,ab8GsB;Ea7GtB,ObUU;;AaRV;EACI,OZzBI;;;AY8BZ;EACI,SZ3CK;;;AY+CT;EACI,eb2CY;;AazCZ;EACI;;;AAIR;EACI;EACA;EACA,Kb+BY;Ea9BZ,eb8BY;Ea7BZ,Wb6Ec;Ea5Ed,abkFsB;EajFtB,OblBU;;AaoBV;EACI,OZrDI;;;AYyDZ;EACI,eZtEK;EYuEL,WbiEc;EahEd,OZ5DQ;;;AYgEZ;EACI;EACA;EACA,KZ/EK;;;AYkFT;EACI;EACA;;;AAGJ;EACI;EACA;EACA,Wb8Cc;Ea7Cd,abmDoB;EalDpB,OblDU;;;AaqDd;EXYI;EACA;EACA,WF4Bc;EE3Bd,aFqCoB;EEpCpB,OFnEU;EEoEV,kBFvGO;EEwGP;EACA,eDjFY;ECkFZ;;AAEA;EACI,cD3GE;EC4CN;EACA;;AAkEA;EACI,OFnFM;;;Aa4Dd;EACI;EACA;EACA,KbdY;;;AaiBhB;EACI;EACA;EACA,KZ7GK;EY8GL,SbrBY;EasBZ,YbhEU;EaiEV,eZ/EY;;AYiFZ;EACI;;;AAIR;EACI;EACA;EACA,KbjCY;EakCZ;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,WbIc;EaHd,abQoB;EaPpB,Ob3FU;;;Aa+Fd;EACI;EACA;EACA;EACA,Yb9FW;Ea+FX,eb1Ca;Ea2Cb;;;AAGJ;EACI;EACA;EACA;EACA,YZ7IM;EY8IN,ebnDa;EaoDb;;;AAGJ;EACI;EACA;EACA;EACA;EACA,YbzJO;Ea0JP;EACA;EACA;EACA;EACA,Yb3DW;Ea4DX;;AAEA;EACI,Yb9DO;;AaiEX;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAKR;EACI;EACA;EACA,KbvGY;EawGZ;EACA,WbzDc;Ea0Dd;EACA,ObzJU;;;Aa4Jd;EACI,OZ3LQ;;;AY+LZ;EACI,SZ5MK;EY6ML,Yb9JU;Ea+JV,eZ7KY;;;AYgLhB;EACI;EACA;EACA,Kb3HY;Ea4HZ,eZrNK;;;AYwNT;EACI;EACA;EACA;;;AAGJ;EACI,WbtFc;EauFd,ablFoB;EamFpB,ObrLU;;;AawLd;EACI;EACA;EACA,Kb/IY;;;AakJhB;EXoBI;EACA;EACA,KFxKY;EEyKZ;EACA,WF1Hc;EE2Hd,aFrHoB;EEsHpB,YF/NU;EEgOV,OF3NU;EE4NV,eFhKa;;AEkKb;EAhOA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAuNJ;EAjQA;EACA;EACA;EAkQI;EACA;EACA;EACA,ODlQI;ECmQJ;;AAEA;EACI;EACA,ODrQH;;AY4NT;EAEI;;AAEA;EACI,YbhOW;EaiOX,OZrOE;;;AY0OV;EACI;EACA;EACA,Kb/JY;EagKZ;EACA,Yb5NY;Ea6NZ,eZ1NY;EY2NZ,WbpHc;EaqHd,OZ7OG;;AY+OH;EACI,WbvHU;;Aa0Hd;EACI;EACA,abtHkB;;;Aa2H1B;EACI;EACA;EACA,KbrLY;EasLZ,SZ9QK;EY+QL,YbhOU;EaiOV,eZ/OY;EYgPZ,WbxIc;EayId,ObxOU;;Aa0OV;EACI;EACA;EACA,Kb9LQ;;AagMR;EACI,OZ7QF;EY8QE,WblJM;;AaqJV;EACI,OZnRA;;;AY0RR;EACI;;AAGJ;EACI,eZxQW;;;AY6QnB;EACI;EACA;EACA,YbnQW;EaoQX;EACA,eZlRe;;AYoRf;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI,YbjRG;;AaoRP;EACI,ObnRG;EaoRH;;;AAMZ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA,YbzSW;Ea0SX,ObtSW;EauSX,WbpNc;EaqNd,ab/MoB;EagNpB,ebxPa;EayPb;;AAEA;EACI;EACA;;;AAKR;EACI,YZzWK;;;AFNT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AeAA;AAAA;AAAA;AAAA;AAYI;AAAA;EACI;EACA;EACA,eb0BW;EazBX;EACA;;AAIJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AAIJ;AAAA;EACI;EACA,ObhBF;;AaoBF;AAAA;EACI;EACA;EACA,adyGc;EcxGd,OdcG;;AcTX;AAAA;EACI,Wd2FU;Ec1FV,OdKO;EcJP;;AAKA;AAAA;EACI;;AAGJ;AAAA;EACI;;AAKR;AAAA;EACI;EACA;;AAIJ;AAAA;EACI;EACA,KbtEC;EauED;;AAIJ;AAAA;EACI;EACA,Kb7EC;Ea8ED,Sb9EC;Ea+ED,YdtEG;EcuEH,eb/CQ;EagDR;;AAIJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA,Yd7EW;Ec8EX,eb5DQ;Ea6DR,ObnFE;EaoFF,Wd0CU;;ActCd;AAAA;EACI;EACA;;AAEA;AAAA;EACI;EACA,Wd+BM;Ec9BN,adqCc;EcpCd,OdrDG;EcsDH;;AAGJ;AAAA;EACI;EACA,ObrGA;EasGA;EACA;;AAKR;AAAA;EACI,YbzHC;Ea0HD;EACA,YdlHG;EcmHH,eb3FQ;Ea4FR;EACA;EACA,ObnHI;EaoHJ;;AAEA;AAAA;EACI,ObxHF;EayHE;;;Af1IZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AgBAA;AAAA;AAAA;AAAA;AASA;EACI,YfKO;EeJP;EACA,ed6Be;Ec5Bf,efoFY;;AelFZ;EACI;;;AAMJ;EACI;EACA,ediBW;;Acdf;EACI;;;AAQR;EACI;EACA;EACA;EACA,KfyDY;EexDZ;EACA;EACA,YfUU;EeTV;EACA;EACA;EACA;;AAEA;EACI,YfIO;;;AeAf;EACI;EACA;EACA,KdnDK;EcoDL;EACA;;;AAGJ;EACI;EACA,Od9CQ;Ec+CR;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,WfmEc;EelEd,afwEsB;EevEtB,OfjBW;EekBX;;;AAGJ;EACI,Wf2Dc;Ee1Dd,OdlEQ;EcmER;EACA;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA,Wf8Cc;Ee7Cd,afmDoB;EelDpB,OdjFM;EckFN;EACA,efQa;EePb;EACA,adhGK;EciGL;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA,Kd9GK;Ec+GL;EACA;;;AAGJ;EACI;EACA;EACA,Kf7BY;;;AeiChB;EACI;EACA;EACA;EACA;EACA;EACA,WfSc;EeRd,OdrHQ;EcsHR;EACA;EACA,edlGe;EcmGf;;AAEA;EACI,Od7HE;Ec8HF;;;AAKR;EACI;EACA;EACA;EACA,WfVc;EeWd,OdxIM;EcyIN;;AAEA;EACI;;;AAKR;EbgBI;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YDxKM;ECyKN,OF3KO;EE4KP,WF7Cc;EE8Cd,aFvCsB;EEwCtB,eFjFa;EEkFb;EACA;EACA;;AAEA;EACI;EACA;;AAIJ;EACI;EACA;;AAIJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;;AAKR;EAEI,YFtKO;EEuKP;;AAEA;EACI;EACA;;AAKR;EACI;EACA;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI,aFpGc;;;AeiBtB;EACI,OdpJK;EcqJL,Wf3Bc;;;Ae+BlB;EACI,Od1JK;Ec2JL,WfjCc;EekCd;;;AAIJ;EbtII;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;Aa6HR;EAEI;EACA;EACA;EACA;EACA,Wf5Cc;Ee6Cd,afvCoB;EewCpB,Of5IU;Ee6IV,Yf9KO;Ee+KP;EACA,edxJY;EcyJZ;;AAEA;EACI,Yf9IM;Ee+IN,cd9JO;;AciKX;EACI,OdvLE;EcwLF,cdxLE;EcyLF,YfrLW;;;Ae6LnB;EACI,SflHY;EemHZ;EACA,YftMO;EeuMP;;;AAIJ;EACI;;;AAOJ;AAAA;EAEI;EACA;EACA;;AAEA;AAAA;EACI;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA,af/FsB;EegGtB,Of1LW;Ee2LX,edhPK;;AckPL;EACI,Wf1GU;Ee2GV,OfjMO;EekMP;;;AAQR;EACI;EACA;EACA,Of7MW;;;AeoNf;EACI;;AAEA;EACI;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKR;EACI,WfnJc;EeoJd,af9IsB;Ee+ItB,OfxOW;EeyOX,ed/RK;;;AckST;EACI;EACA;EACA,KdrSK;;;Ac4ST;EACI;EACA,efrNY;;AeuNZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA,Od5SE;Ec6SF,Wf/KU;EegLV;EACA;;AAEA;EACI,Of/SO;;AekTX;EACI;EACA;;AAGJ;EACI,afxLY;;;AewMxB;EACI;IACI;IACA;;EAEJ;IACI;IACA;;;AhBnWR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AiBAA;AAAA;AAAA;AAAA;AAaI;AAAA;EACI;EACA;EACA;;AAIJ;AAAA;EACI;EACA;EACA;EACA,YhB8BO;EgB7BP,efcQ;EebR;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA;EACA,OfjBI;EekBJ;EACA,efGW;EeFX;;AAEA;AAAA;EACI;;AAGJ;AAAA;EACI;;AAGJ;AAAA;EACI,OfhCF;EeiCE;;AAGJ;AAAA;EACI,YfrCF;EesCE,OhBxCD;EgByCC,ahB4FY;;AgBvFpB;AAAA;EACI;EACA;EACA,Kf1DC;;Ae8DL;AAAA;AAAA;AAAA;AAAA;AAAA;EAGI,OfrDI;EesDJ;EACA;;AAGJ;AAAA;EACI,OfzDC;;Ae6DL;AAAA;EACI,ef5EC;;Ae+EL;AAAA;EACI;EACA;EACA;EACA,ehBMQ;;AgBHZ;AAAA;EACI,WhBiDU;EgBhDV,ahBsDgB;EgBrDhB,Of7EI;;AegFR;AAAA;EACI;EACA,OhB3CO;;AgB+CX;AAAA;Ed1DA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AciDJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WhBgCU;EgB/BV,Of9FE;Ee+FF;EACA;EACA,ef1EW;Ee2EX;;AAEA;AAAA;EACI,YhBjGO;;AgBqGf;AAAA;Ed5EA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AcmEJ;AAAA;EAEI;EACA;EACA;EACA;EACA,WhBcU;EgBbV,Of7GC;Ee8GD;;AAEA;AAAA;EACI;;AAQR;AAAA;EACI;EACA;EACA;EACA,YhBlIG;EgBmIH;EACA,ef3GW;Ee4GX;;AAEA;AAAA;EACI,cftIF;;Ae0IN;AAAA;EACI;EACA;EACA;EACA;EACA,YhB1GO;EgB2GP;EACA,ahBbkB;EgBclB,WhBrBU;EgBsBV,OhBvGO;;AgByGP;AAAA;EACI,YhBtGC;EgBuGD,qBhBrGE;;AgByGV;AAAA;EACI;EACA;EACA;EACA;;AAGJ;AAAA;EACI;EACA;EACA;EACA;EACA,YflJO;EemJP,ehB7ES;EgB8ET;EACA,ahBtCkB;EgBuClB;EACA;EACA,Of5KI;;Ae8KJ;AAAA;EACI,YfhLF;EeiLE,OhBnLD;;AgBwLP;AAAA;EACI;EACA;EACA;EACA;EACA,YhBvJM;EgBwJN;;AAGJ;AAAA;EdlKA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACI;;AcyJJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA,YhBzMG;EgB0MH;EACA,eflLW;EemLX,OfzMI;Ee0MJ;EACA,WhB/EU;EgBgFV;;AAEA;AAAA;EACI,YhB3KG;EgB4KH,chBzKG;EgB0KH,OhBtKG;;AgB0KX;AAAA;EACI;EACA;EACA;EACA;EACA,efpMW;EeqMX;EACA;;AAEA;AAAA;EACI,cfhOF;;AemOF;AAAA;EACI,OhB5LG;;AgBiMX;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;;AdtHJ;AAAA;EACI;EACA;;AAGJ;AAAA;EACI,YDzHA;EC0HA;;AAGJ;AAAA;EACI,YD/GO;ECgHP;;AAEA;AAAA;EACI,YF5GE;;AgBuNV;AAAA;AAAA;AAAA;AAAA;AAAA;EAGI;EACA;EACA,OhBhNO;EgBiNP;EACA;;AAGJ;AAAA;EACI,Of3PC;;Ae+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","file":"entity-selector.css","sourcesContent":["/**\n * Entity Selector Styles\n * @package prestashop-entity-selector\n * @version 2.0.0\n *\n * Compiles to: assets/css/admin/entity-selector.css\n */\n\n// Foundation\n@use 'variables' as *;\n@use 'mixins' as *;\n\n// Layouts\n@use 'layouts/form-integration';\n@use 'layouts/responsive';\n\n// Components\n@use 'components/entity-selector';\n@use 'components/entity-item'; // Shared base for chips and list items\n@use 'components/dropdown';\n@use 'components/chips';\n@use 'components/groups';\n@use 'components/value-picker';\n@use 'components/modal';\n@use 'components/list-preview';\n@use 'components/schedule';\n@use 'components/tips';\n@use 'components/condition-trait';\n@use 'components/combinations';\n@use 'components/method-dropdown';\n@use 'components/tooltip';\n@use 'components/tree';\n@use 'components/validation';\n","/**\n * Entity Selector Variables\n * Bootstrap 4 compatible values for PrestaShop admin theme\n *\n * Imports shared variables from prestashop-admin package\n * and maps them to $es-* prefixed aliases for this package\n */\n\n// Import shared variables from prestashop-admin\n@use '../../../prestashop-admin/assets/scss/variables' as admin;\n\n// =============================================================================\n// Base Colors\n// =============================================================================\n\n$es-white: #ffffff !default;\n$es-black: #000000 !default;\n\n// Primary (from prestashop-admin)\n$es-primary: admin.$primary !default;\n$es-primary-hover: #1a9ab7 !default;\n$es-primary-light: rgba(37, 185, 215, 0.1) !default;\n\n// Semantic colors (from prestashop-admin)\n$es-success: admin.$success !default;\n$es-success-light: #d4edda !default;\n$es-success-dark: #1e7e34 !default;\n\n$es-danger: admin.$danger !default;\n$es-danger-light: #f8d7da !default;\n$es-danger-dark: #bd2130 !default;\n\n$es-warning: admin.$warning !default;\n$es-warning-light: #fff3cd !default;\n\n$es-info: admin.$info !default;\n$es-info-light: #d1ecf1 !default;\n\n// =============================================================================\n// Gray Scale (Bootstrap 4)\n// =============================================================================\n\n$es-gray-100: admin.$light !default;\n$es-gray-200: #e9ecef !default;\n$es-gray-300: admin.$border-color !default;\n$es-gray-400: #ced4da !default;\n$es-gray-500: #adb5bd !default;\n$es-gray-600: admin.$secondary !default;\n$es-gray-700: #495057 !default;\n$es-gray-800: admin.$dark !default;\n$es-gray-900: #212529 !default;\n\n// Slate (subtle variations)\n$es-slate-50: #f8fafc !default;\n$es-slate-100: #f1f5f9 !default;\n$es-slate-200: #e2e8f0 !default;\n$es-slate-300: #cbd5e1 !default;\n$es-slate-400: #94a3b8 !default;\n$es-slate-500: #64748b !default;\n$es-slate-600: #475569 !default;\n$es-slate-700: #334155 !default;\n$es-slate-800: #1e293b !default;\n$es-slate-900: #0f172a !default;\n\n// Cyan\n$es-cyan-50: #ecfeff !default;\n$es-cyan-100: #cffafe !default;\n$es-cyan-200: #a5f3fc !default;\n$es-cyan-500: #06b6d4 !default;\n$es-cyan-600: #0891b2 !default;\n$es-cyan-700: #0e7490 !default;\n\n// =============================================================================\n// Semantic Aliases\n// =============================================================================\n\n$es-bg-header: $es-gray-100 !default;\n$es-bg-hover: $es-gray-200 !default;\n$es-bg-active: $es-gray-200 !default;\n$es-bg-body: $es-white !default;\n\n$es-border-color: admin.$border-color !default;\n$es-border-light: $es-gray-200 !default;\n$es-border-dark: $es-gray-400 !default;\n\n$es-text-primary: $es-gray-900 !default;\n$es-text-secondary: $es-gray-700 !default;\n$es-text-muted: $es-gray-600 !default;\n$es-text-light: $es-gray-500 !default;\n\n// =============================================================================\n// Spacing (Bootstrap 4 compatible, derived from admin.$spacer)\n// =============================================================================\n\n$es-spacing-xs: admin.$spacer * 0.25 !default; // 4px\n$es-spacing-sm: admin.$spacer * 0.5 !default; // 8px\n$es-spacing-md: admin.$spacer !default; // 16px\n$es-spacing-lg: admin.$spacer * 1.5 !default; // 24px\n$es-spacing-xl: admin.$spacer * 2 !default; // 32px\n\n// =============================================================================\n// Border Radius (from prestashop-admin)\n// =============================================================================\n\n$es-radius-sm: admin.$border-radius-sm !default;\n$es-radius-md: admin.$border-radius !default;\n$es-radius-lg: admin.$border-radius-lg !default;\n$es-radius-xl: 0.5rem !default;\n$es-radius-full: 50rem !default;\n\n// =============================================================================\n// Box Shadows (Bootstrap 4 compatible)\n// =============================================================================\n\n$es-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !default;\n$es-shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !default;\n$es-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175) !default;\n$es-shadow-xl: 0 1.5rem 4rem rgba(0, 0, 0, 0.2) !default;\n\n// =============================================================================\n// Transitions\n// =============================================================================\n\n$es-transition-fast: 0.15s ease-in-out !default;\n$es-transition-normal: 0.2s ease-in-out !default;\n$es-transition-slow: 0.3s ease-in-out !default;\n\n// =============================================================================\n// Z-Index (below Bootstrap modal)\n// =============================================================================\n\n$es-z-dropdown: 1000 !default;\n$es-z-modal: 1050 !default;\n$es-z-popover: 1060 !default;\n$es-z-tooltip: 1070 !default;\n\n// =============================================================================\n// Typography\n// =============================================================================\n\n$es-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !default;\n\n$es-font-size-xs: 0.75rem !default; // 12px\n$es-font-size-sm: 0.875rem !default; // 14px\n$es-font-size-base: 1rem !default; // 16px\n$es-font-size-lg: 1.125rem !default; // 18px\n\n$es-font-weight-normal: 400 !default;\n$es-font-weight-medium: 500 !default;\n$es-font-weight-semibold: 600 !default;\n$es-font-weight-bold: 700 !default;\n\n$es-line-height-tight: 1.25 !default;\n$es-line-height-normal: 1.5 !default;\n","/**\n * MPR Admin Variables\n * @package prestashop-admin\n */\n\n// Spacing scale (Bootstrap 4 compatible)\n$spacer: 1rem;\n$spacers: (\n 0: 0,\n 1: $spacer * 0.25,\n 2: $spacer * 0.5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3\n);\n\n// Colors - PrestaShop Admin Theme\n$primary: #25b9d7;\n$secondary: #6c757d;\n$success: #28a745;\n$danger: #dc3545;\n$warning: #ffc107;\n$info: #17a2b8;\n$light: #f8f9fa;\n$dark: #343a40;\n\n$colors: (\n primary: $primary,\n secondary: $secondary,\n success: $success,\n danger: $danger,\n warning: $warning,\n info: $info,\n light: $light,\n dark: $dark\n);\n\n// Border\n$border-color: #dee2e6;\n$border-radius: 0.25rem;\n$border-radius-sm: 0.2rem;\n$border-radius-lg: 0.3rem;\n\n// Breakpoints\n$breakpoint-sm: 576px;\n$breakpoint-md: 768px;\n$breakpoint-lg: 991px;\n$breakpoint-xl: 1200px;\n","/**\n * Entity Selector Mixins\n * Reusable patterns - prefer Bootstrap utilities in HTML where possible\n */\n\n@use \"sass:color\";\n@use 'variables' as *;\n\n// =============================================================================\n// Layout\n// =============================================================================\n\n@mixin flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n@mixin flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n@mixin grid-columns($cols) {\n display: grid;\n grid-template-columns: repeat($cols, 1fr);\n gap: $es-spacing-sm;\n}\n\n// =============================================================================\n// Text\n// =============================================================================\n\n@mixin text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// =============================================================================\n// Interactive Elements\n// =============================================================================\n\n// Reset button styles\n@mixin button-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n// Focus ring (Bootstrap 4 style)\n@mixin focus-ring($color: $es-primary) {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba($color, 0.25);\n}\n\n// Interactive hover state\n@mixin interactive-item {\n cursor: pointer;\n transition: background-color $es-transition-fast, color $es-transition-fast;\n\n &:hover {\n background-color: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Cards & Containers\n// =============================================================================\n\n@mixin card {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n@mixin dropdown-container {\n position: absolute;\n z-index: $es-z-dropdown;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n}\n\n// =============================================================================\n// Form Elements\n// =============================================================================\n\n// Reset input styles (for inputs in custom wrappers)\n@mixin input-reset {\n padding: 0;\n margin: 0;\n background: none;\n border: none;\n font: inherit;\n color: inherit;\n\n &:focus {\n outline: none;\n }\n}\n\n@mixin input-base {\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n line-height: $es-line-height-normal;\n color: $es-text-primary;\n background-color: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: border-color $es-transition-fast, box-shadow $es-transition-fast;\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n &::placeholder {\n color: $es-text-light;\n }\n}\n\n// =============================================================================\n// Scrollbar\n// =============================================================================\n\n@mixin custom-scrollbar {\n &::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n &::-webkit-scrollbar-track {\n background: $es-gray-100;\n border-radius: 3px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: $es-gray-300;\n border-radius: 3px;\n\n &:hover {\n background: $es-gray-400;\n }\n }\n}\n\n// =============================================================================\n// Badges & Chips\n// =============================================================================\n\n@mixin badge($bg: $es-gray-200, $color: $es-gray-700) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n line-height: 1;\n background-color: $bg;\n color: $color;\n border-radius: $es-radius-full;\n}\n\n// Count badge with preview icon (used for tab badges, match counts, totals)\n// Note: Eye icon is provided in HTML via \n@mixin count-badge($bg: $es-primary) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n min-width: 20px;\n height: 20px;\n padding: 0 0.5rem;\n background: $bg;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Focus state - maintain styled appearance\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba($bg, 0.3), 0 2px 8px rgba($bg, 0.4);\n }\n\n // Loading state - spinner icon replaces eye\n &.loading {\n cursor: wait;\n\n i {\n font-size: 10px;\n animation: spin 0.6s linear infinite;\n }\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Inactive/empty state\n &.inactive,\n &.no-matches {\n background: $es-slate-400;\n cursor: default;\n\n &:hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n // Popover open state\n &.popover-open {\n background: color.adjust($bg, $lightness: -10%);\n box-shadow: 0 2px 8px rgba($bg, 0.4);\n }\n\n // Icon inside badge (eye, spinner, etc.)\n i {\n font-size: 10px;\n line-height: 1;\n opacity: 0.8;\n }\n\n &:hover i {\n opacity: 1;\n }\n\n .preview-count {\n font-weight: $es-font-weight-bold;\n }\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n@mixin chip {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-gray-200;\n color: $es-gray-700;\n border-radius: $es-radius-full;\n\n .chip-remove {\n @include button-reset;\n @include flex-center;\n width: 14px;\n height: 14px;\n font-size: 10px;\n color: $es-text-muted;\n border-radius: 50%;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n }\n}\n\n// =============================================================================\n// Toggle Switch\n// =============================================================================\n\n@mixin toggle-switch($width: 36px, $height: 20px) {\n position: relative;\n width: $width;\n height: $height;\n border-radius: $height;\n background: $es-gray-400;\n transition: background-color $es-transition-normal;\n cursor: pointer;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: $height - 4px;\n height: $height - 4px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n\n &.active {\n background: $es-success;\n\n &::after {\n transform: translateX($width - $height);\n }\n }\n}\n\n// =============================================================================\n// Screen Reader Only\n// =============================================================================\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n","/**\n * Form Integration Styles\n * Handles PrestaShop admin form layout overrides\n */\n\n@use '../variables' as *;\n\n// Base border reset for all entity-selector elements\n.target-conditions-trait,\n.target-conditions-trait *,\n.entity-selector-trait,\n.entity-selector-trait *,\n.method-dropdown-menu,\n.method-dropdown-menu *,\n.target-preview-popover,\n.target-preview-popover * {\n border-style: solid;\n border-width: 0;\n border-color: $es-border-color;\n}\n\n// Full-width form group override using :has()\n// Excludes .layout-form-group which uses standard PrestaShop form layout\n.form-group:has(.entity-selector-trait:not(.layout-form-group)),\n.form-group:has(.target-conditions-trait:not(.layout-form-group)),\n.form-group:has(.condition-trait:not(.layout-form-group)) {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// Fallback class for browsers without :has() support\n.form-group.condition-trait-fullwidth {\n display: block;\n\n > .control-label {\n display: none;\n }\n\n > .col-lg-8 {\n width: 100%;\n max-width: 100%;\n padding-left: $es-spacing-md;\n padding-right: $es-spacing-md;\n flex: 0 0 100% !important;\n }\n}\n\n// SAFEGUARD: Force label visibility for form-group layout widgets\n// This overrides any conflicting rules (including fallback class rules)\n// when the widget has layout-form-group class indicating standard form integration\n.form-group:has(.layout-form-group) > .control-label {\n display: flex !important;\n}\n\n// Dropdown overflow fix\n// When dropdown is open, parent containers must allow overflow\n.panel:has(.target-search-dropdown.show),\n.card:has(.target-search-dropdown.show),\n.form-wrapper:has(.target-search-dropdown.show),\n.panel-body:has(.target-search-dropdown.show),\n.card-body:has(.target-search-dropdown.show),\n.form-group:has(.target-search-dropdown.show),\n.col-lg-8:has(.target-search-dropdown.show),\n.col-lg-12:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// Target conditions wrapper hierarchy overflow fix\n.target-conditions-trait:has(.target-search-dropdown.show),\n.entity-selector-trait:has(.target-search-dropdown.show),\n.condition-trait-body:has(.target-search-dropdown.show),\n.target-block-content:has(.target-search-dropdown.show),\n.target-block-groups:has(.target-search-dropdown.show),\n.target-group:has(.target-search-dropdown.show),\n.target-group-body:has(.target-search-dropdown.show),\n.target-search-wrapper:has(.target-search-dropdown.show) {\n overflow: visible !important;\n}\n\n// =============================================================================\n// Embedded Layout\n// =============================================================================\n// Use .layout-embedded for entity selectors nested inside other components\n// Removes outer wrapper styling to avoid redundant borders/backgrounds\n\n.target-conditions-trait.layout-embedded,\n.entity-selector-trait.layout-embedded {\n background: transparent;\n border: none;\n border-radius: 0;\n\n // Remove padding from groups container when embedded\n .groups-container {\n padding: 0;\n }\n\n // Remove block body padding\n .block-body {\n padding: 0;\n }\n\n // Remove block footer border when embedded\n .block-footer {\n border-top: none;\n padding: $es-spacing-sm 0 0;\n }\n\n // Simplify selection group when embedded - single thin border only\n .selection-group {\n background: $es-white;\n border: 1px solid $es-slate-200;\n border-radius: $es-radius-md;\n\n // Lighter group header in embedded mode\n .group-header {\n background: $es-slate-50;\n border-bottom-color: $es-slate-200;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-md $es-radius-md 0 0;\n }\n\n // Reduce group body padding (slightly more than $es-spacing-sm for readability)\n .group-body {\n padding: 0.75rem;\n }\n\n // Reduce group-include section padding\n .group-include {\n padding: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n }\n\n // Smaller modifiers section\n .group-modifiers {\n padding: $es-spacing-xs $es-spacing-sm;\n margin: $es-spacing-sm (-$es-spacing-sm) (-$es-spacing-sm);\n }\n }\n\n // Empty state - smaller padding\n .groups-empty-state {\n padding: $es-spacing-md;\n }\n\n // Smaller add group button\n .btn-add-group {\n padding: 0.375rem 0.625rem;\n font-size: $es-font-size-xs;\n }\n}\n","/**\n * Responsive Styles\n * Media query adjustments for different screen sizes\n */\n\n@use '../variables' as *;\n\n// Tablet and below\n@media (max-width: 991px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .condition-trait-header {\n flex-direction: column;\n align-items: flex-start;\n gap: $es-spacing-sm;\n }\n\n .trait-header-right {\n width: 100%;\n justify-content: flex-end;\n }\n\n .target-block-tabs {\n flex-wrap: wrap;\n }\n }\n}\n\n// Mobile\n@media (max-width: 767px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .target-block-tab {\n padding: $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n\n .target-group-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .target-search-dropdown {\n width: 100% !important;\n left: 0 !important;\n right: 0 !important;\n }\n\n .dropdown-results-grid {\n grid-template-columns: 1fr !important;\n }\n }\n}\n\n// High-resolution displays\n@media (min-width: 1600px) {\n .target-conditions-trait,\n .entity-selector-trait {\n .dropdown-results-grid.view-grid-3 {\n grid-template-columns: repeat(4, 1fr);\n }\n }\n}\n","/**\n * Entity Selector - Main Component Styles\n * Wrapper, header, body, tabs, blocks\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Main wrapper (supports both .target-conditions-trait and .entity-selector-trait)\n.target-conditions-trait,\n.entity-selector-trait {\n position: relative;\n overflow: visible;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n // Trait Header (collapsible)\n .condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n }\n\n .trait-header-left {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n min-width: 0;\n flex: 1;\n }\n\n .trait-icon {\n font-size: $es-font-size-lg;\n color: $es-text-muted;\n flex-shrink: 0;\n }\n\n .trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n }\n\n .trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Total count badge in header\n .trait-total-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n\n // Show all toggle switch\n .trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-right: 0.75rem;\n padding: 0.25rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .toggle-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .show-all-checkbox {\n display: none;\n }\n\n .toggle-slider {\n position: relative;\n width: 36px;\n height: 20px;\n background: $es-slate-300;\n border-radius: $es-radius-full;\n transition: background-color $es-transition-normal;\n\n &::after {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n background: $es-white;\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform $es-transition-normal;\n }\n }\n\n .show-all-checkbox:checked + .toggle-slider {\n background: $es-success;\n\n &::after {\n transform: translateX(16px);\n }\n }\n }\n\n // Validation error states\n &.has-validation-error {\n border-color: $es-danger;\n box-shadow: 0 0 0 3px rgba($es-danger, 0.1);\n\n .condition-trait-header {\n border-bottom-color: $es-danger;\n }\n }\n\n .trait-validation-error {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0.625rem $es-spacing-md;\n background: $es-danger-light;\n color: #b91c1c;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-bottom: 1px solid #fecaca;\n\n i {\n color: $es-danger;\n }\n }\n\n // Required indicator\n &.trait-required .trait-title::after {\n content: ' *';\n color: $es-danger;\n }\n\n // Body\n .condition-trait-body {\n padding: 0;\n background: $es-white;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Block type tabs\n .target-block-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-block-tab {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: none;\n min-width: 0;\n padding: 0.625rem $es-spacing-md;\n margin-bottom: -1px;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-slate-700;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-cyan-500;\n color: $es-primary;\n }\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .tab-label {\n white-space: nowrap;\n }\n\n .tab-badge {\n @include count-badge($es-primary);\n }\n\n &.has-data:not(.active) .tab-badge {\n @include count-badge($es-slate-400);\n }\n }\n\n // Tabs row with actions (form-content layout)\n .entity-selector-tabs-row {\n display: flex;\n align-items: stretch;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n\n .target-block-tabs {\n flex: 1;\n border-bottom: 0;\n border-radius: $es-radius-lg 0 0 0;\n }\n }\n\n // Expand/collapse toggle area (entire section is clickable)\n .entity-selector-actions.btn-toggle-blocks {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 $es-spacing-md;\n background: $es-slate-100;\n border-left: 1px solid $es-border-color;\n color: $es-slate-400;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-primary;\n }\n\n .material-icons {\n font-size: 20px !important;\n }\n }\n\n // When expanded - highlight the toggle area\n .entity-selector-trait:not(.blocks-collapsed) .entity-selector-actions.btn-toggle-blocks {\n background: $es-primary-light;\n border-left-color: $es-primary;\n color: $es-primary;\n }\n\n // Blocks content wrapper (for form-content layout collapse)\n .entity-selector-blocks-content {\n // Inherits styles from condition-trait-body context\n }\n\n // Block container\n .target-block-container {\n display: none;\n\n &.active {\n display: block;\n }\n }\n\n .target-block-content {\n padding: $es-spacing-md;\n }\n\n .target-block-groups {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n }\n\n // Block header (for standalone blocks)\n .target-block-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n // Empty state\n .target-block-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Collapse toggle\n .trait-collapse-toggle,\n .collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n cursor: pointer;\n transition: transform $es-transition-normal;\n\n &.collapsed {\n transform: rotate(-90deg);\n }\n }\n\n // Header actions\n .trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // Collapsed state\n &.collapsed {\n .condition-trait-body {\n display: none;\n }\n\n .condition-trait-header {\n border-radius: $es-radius-lg;\n }\n }\n}\n\n// Single mode specific styles\n.target-conditions-trait.single-mode,\n.entity-selector-trait.single-mode {\n .target-block-tabs {\n display: none;\n }\n\n .target-block-container {\n display: block;\n }\n}\n\n// Header action buttons\n.target-conditions-trait,\n.entity-selector-trait {\n .header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .header-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Entity Item - Shared Base Component\n * Unified styling for entity items in chips, lists, and previews\n *\n * Variants:\n * - .entity-item (base) - default list-row style\n * - .entity-item.chip-style - pill/chip style (compact)\n * - .entity-item.card-style - card/grid style\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Entity Item Sizing\n// =============================================================================\n\n$entity-item-image-sm: 20px;\n$entity-item-image-md: 32px;\n$entity-item-image-lg: 48px;\n\n// =============================================================================\n// Base Entity Item (list-row layout)\n// =============================================================================\n\n.entity-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable variant\n &.clickable {\n cursor: pointer;\n }\n\n // Selected state\n &.selected {\n background: $es-primary-light;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Image\n// -----------------------------------------------------------------------------\n\n.entity-item-image {\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// Size variants\n.entity-item-image--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n}\n\n.entity-item-image--lg {\n width: $entity-item-image-lg;\n height: $entity-item-image-lg;\n}\n\n// No-image placeholder\n.entity-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: $entity-item-image-md;\n height: $entity-item-image-md;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n\n &--sm {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Info (name + meta)\n// -----------------------------------------------------------------------------\n\n.entity-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n.entity-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n.entity-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Badge/Price (right side)\n// -----------------------------------------------------------------------------\n\n.entity-item-badge {\n flex-shrink: 0;\n padding: 0.125rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n}\n\n.entity-item-price {\n flex-shrink: 0;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n}\n\n// -----------------------------------------------------------------------------\n// Entity Item Actions (remove button, etc.)\n// -----------------------------------------------------------------------------\n\n.entity-item-action {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n}\n\n// =============================================================================\n// Chip Style Variant (compact pill)\n// =============================================================================\n\n.entity-item.chip-style {\n display: inline-flex;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n border-radius: $es-radius-full;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .entity-item-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n border-radius: 50%;\n }\n\n .entity-item-no-image {\n width: $entity-item-image-sm;\n height: $entity-item-image-sm;\n font-size: 10px;\n border-radius: 50%;\n }\n\n .entity-item-info {\n flex-direction: row;\n align-items: center;\n gap: 0.25rem;\n }\n\n .entity-item-name {\n font-size: $es-font-size-xs;\n }\n\n .entity-item-meta {\n display: none;\n }\n\n .entity-item-action {\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n }\n}\n\n// =============================================================================\n// List Style Variant (bordered rows)\n// =============================================================================\n\n.entity-item.list-style {\n padding: $es-spacing-sm 0;\n background: transparent;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n// =============================================================================\n// Entity Item Container (wrapper for multiple items)\n// =============================================================================\n\n.entity-items-container {\n display: flex;\n flex-direction: column;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n}\n\n// Toolbar (filter, sort, count, clear)\n.entity-items-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-items {\n display: flex;\n }\n}\n\n// Filter input\n.entity-items-filter {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Sort dropdown\n.entity-items-sort {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n}\n\n// Count badge\n.entity-items-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n}\n\n// Clear button\n.entity-items-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n}\n\n// Items list area\n.entity-items-list {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &:empty {\n display: none;\n }\n\n // List layout (vertical)\n &.list-layout {\n flex-direction: column;\n flex-wrap: nowrap;\n gap: 0;\n padding: $es-spacing-sm;\n }\n}\n\n// Load more section\n.entity-items-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Empty & Loading States\n// =============================================================================\n\n.entity-items-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.entity-items-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n animation: spin 0.6s linear infinite;\n }\n}\n","/**\n * Search Dropdown Component\n * Includes search input, filter panel, results grid\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Search wrapper\n .target-search-wrapper {\n position: relative;\n }\n\n // Search dropdown\n .target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n }\n\n .dropdown-search-input {\n @include input-base;\n flex: 1;\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .dropdown-close-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n }\n\n // Dropdown controls bar\n .dropdown-controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n }\n\n .dropdown-controls-left,\n .dropdown-controls-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // View mode buttons\n .view-mode-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Results count\n .dropdown-results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n }\n\n // Results count text\n .results-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: $es-spacing-xs $es-spacing-sm;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n // Grid view\n .dropdown-results-grid {\n display: grid;\n gap: $es-spacing-sm;\n\n &.view-list {\n grid-template-columns: 1fr;\n }\n\n &.view-grid-2 {\n grid-template-columns: repeat(2, 1fr);\n }\n\n &.view-grid-3 {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n // Result item (both class names for compatibility)\n // Note: Main dropdown-item styling is in the global .target-search-dropdown section below\n .dropdown-result-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n\n &:hover {\n background: $es-white;\n }\n }\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n &.result-flag {\n width: 32px;\n height: 24px;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n background: transparent;\n\n img {\n object-fit: contain;\n }\n\n .flag-fallback {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n font-size: 14px;\n color: #5f6368;\n }\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Empty state\n .dropdown-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Loading state\n .dropdown-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 1.5rem;\n animation: spin 1s linear infinite;\n }\n }\n\n // Unified dropdown footer - combines load more and actions\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n // Left side: load more controls\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .btn-load-all {\n @include button-reset;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n }\n\n // Right side: action buttons\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n // Legacy support - hide old load more section when new footer exists\n .dropdown-load-more {\n display: none;\n }\n\n .load-more-controls {\n display: none;\n }\n\n // Filter panel\n .dropdown-filter-panel {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .filter-panel-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .filter-panel-toggle {\n @include button-reset;\n font-size: $es-font-size-xs;\n color: $es-primary;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n .filter-panel-content {\n display: grid;\n gap: $es-spacing-sm;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n }\n\n .filter-group {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .filter-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n }\n\n .filter-select,\n .filter-input {\n @include input-base;\n padding: 0.375rem $es-spacing-sm;\n font-size: $es-font-size-xs;\n }\n}\n\n// Category tree view\n.target-conditions-trait,\n.entity-selector-trait {\n .category-tree {\n padding: $es-spacing-sm;\n }\n\n .tree-container {\n // Contains tree items\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Tree item (used by JavaScript)\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n &.has-children {\n // Parent node styling\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy category tree classes (for compatibility)\n .category-tree-item {\n padding: 0.25rem 0;\n }\n\n .category-tree-node {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n .category-tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-text-muted;\n transition: transform $es-transition-fast;\n\n &.expanded {\n transform: rotate(90deg);\n }\n\n &.empty {\n visibility: hidden;\n }\n }\n\n .category-tree-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n &.checked {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2713';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n\n &.indeterminate {\n background: $es-primary;\n border-color: $es-primary;\n\n &::after {\n content: '\\2212';\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: $es-white;\n font-size: 10px;\n }\n }\n }\n\n .category-tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .category-tree-count {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .category-tree-children {\n margin-left: 24px;\n }\n\n // Search history\n .search-history-list {\n padding: $es-spacing-sm;\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n > i {\n color: $es-text-muted;\n font-size: 14px;\n }\n }\n\n .history-query {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0;\n transition: all $es-transition-fast;\n\n .history-item:hover & {\n opacity: 1;\n }\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // View mode select\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n }\n}\n\n// =============================================================================\n// Global dropdown styles (when appended to body instead of inside wrapper)\n// Duplicates key styles for when dropdown is outside .entity-selector-trait\n// =============================================================================\nbody > .target-search-dropdown,\n.target-search-dropdown {\n @include dropdown-container;\n display: none;\n width: 600px;\n max-width: calc(100vw - 40px);\n\n &.show {\n display: block;\n }\n\n // Dropdown header\n .dropdown-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n flex-wrap: wrap;\n }\n\n .results-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n white-space: nowrap;\n }\n\n .dropdown-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex-wrap: wrap;\n flex: 1;\n justify-content: flex-end;\n }\n\n .btn-select-all,\n .btn-clear-selection {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: $es-slate-100;\n border-radius: 2px;\n color: $es-text-muted;\n }\n }\n\n .sort-controls {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n }\n\n .sort-field-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n height: 28px; // Match btn-sort-dir height\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n }\n\n .btn-sort-dir {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 38px;\n min-width: 38px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .view-mode-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 80px;\n margin-left: 0.25rem;\n }\n\n .btn-toggle-filters,\n .btn-show-history {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n }\n }\n\n .refine-compact {\n display: flex;\n align-items: center;\n // No gap - elements are connected\n\n // Connected to refine-input\n .btn-refine-negate {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n min-width: 32px;\n flex-shrink: 0;\n height: 28px;\n padding: 0;\n margin: 0;\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-right: none;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n\n &.active {\n background: $es-danger-light;\n color: $es-danger;\n border-color: $es-danger;\n }\n }\n\n .refine-input {\n @include input-base;\n width: 100px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n }\n\n .btn-clear-refine {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n margin: 0;\n margin-left: -1px; // Overlap input border when visible\n color: $es-text-muted;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter panel\n .filter-panel {\n display: none;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .filter-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n margin-bottom: $es-spacing-sm;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .filter-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n\n input[type=\"checkbox\"] {\n margin: 0;\n }\n }\n\n .filter-price-range {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n .filter-price-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .filter-price-min,\n .filter-price-max {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-price-sep {\n color: $es-text-muted;\n }\n }\n\n .btn-clear-filters {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n cursor: pointer;\n margin-left: auto;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n\n // Multi-row filters\n .filter-row-multi {\n flex-direction: column;\n align-items: stretch;\n gap: $es-spacing-sm;\n }\n\n .filter-subrow {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex-wrap: wrap;\n }\n\n .filter-range-group,\n .filter-date-group,\n .filter-select-group {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n\n .filter-range-label,\n .filter-date-label,\n .filter-select-label,\n .filter-row-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n\n i {\n margin-right: 0.25rem;\n }\n }\n\n .filter-range-sep {\n color: $es-text-muted;\n }\n\n .filter-product-count-min,\n .filter-product-count-max,\n .filter-sales-min,\n .filter-sales-max,\n .filter-turnover-min,\n .filter-turnover-max,\n .filter-date-add-from,\n .filter-date-add-to,\n .filter-last-product-from,\n .filter-last-product-to {\n @include input-base;\n width: 70px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .filter-depth-select,\n .filter-attribute-group-select,\n .filter-feature-group-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 100px;\n }\n\n .filter-attributes-container,\n .filter-features-container,\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n\n // Filter group toggle buttons (attribute/feature groups)\n .filter-group-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n border-color: $es-slate-300;\n }\n\n &.active {\n background: $es-primary-light;\n border-color: $es-primary;\n color: $es-primary;\n\n .toggle-count {\n color: $es-primary;\n }\n }\n\n &.has-selection {\n border-color: $es-success;\n background: rgba($es-success, 0.05);\n\n .toggle-count {\n color: $es-success;\n font-weight: $es-font-weight-semibold;\n }\n }\n\n .toggle-name {\n font-weight: $es-font-weight-medium;\n }\n\n // Count with eye icon (like group-count-badge)\n .toggle-count {\n display: inline-flex;\n align-items: center;\n gap: 0.125rem;\n color: $es-text-muted;\n font-size: 0.65rem;\n\n i {\n font-size: 10px;\n color: $es-primary;\n }\n\n // Clickable preview badge\n &.clickable {\n cursor: pointer;\n padding: 0.125rem 0.25rem;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n color: $es-primary;\n\n i {\n color: $es-primary;\n }\n }\n\n &.popover-open {\n background: $es-primary;\n color: $es-white;\n\n i {\n color: $es-white;\n }\n }\n\n &.loading {\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n }\n }\n\n // Filter value chips\n .filter-chip {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n background: $es-slate-100;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.active {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Filter attribute chip (specific)\n .filter-attr-chip,\n .filter-feat-chip {\n @extend .filter-chip;\n }\n\n // Filter row for values (expandable)\n .filter-row-values {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n .filter-values-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.25rem;\n flex: 1;\n }\n\n .filter-values-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n white-space: nowrap;\n }\n\n .btn-close-values {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n }\n\n // Filter chip name and count\n .chip-name {\n font-weight: $es-font-weight-medium;\n }\n\n .chip-count {\n font-size: 0.6rem;\n color: $es-text-muted;\n margin-left: 0.125rem;\n }\n\n .filter-chip.active .chip-count {\n color: rgba(255, 255, 255, 0.8);\n }\n\n // Dropdown content\n .dropdown-content {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .dropdown-items {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm;\n }\n\n .item-checkbox {\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n }\n }\n\n .item-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n }\n\n // Dropdown footer - unified structure\n .dropdown-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .dropdown-footer-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-label {\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.4rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n cursor: pointer;\n min-width: 55px;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n }\n }\n\n .remaining-text {\n color: $es-text-muted;\n\n strong {\n color: $es-text-secondary;\n font-weight: $es-font-weight-semibold;\n }\n }\n }\n\n .dropdown-footer-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .dropdown-action-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n .btn-shortcut {\n font-size: 10px;\n padding: 0.125rem 0.25rem;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 3px;\n font-weight: $es-font-weight-normal;\n }\n\n &.btn-cancel {\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-dark;\n }\n }\n\n &.btn-apply,\n &.btn-save {\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n .btn-shortcut {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n }\n\n .dropdown-footer-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n // Legacy button support\n .btn-cancel-dropdown {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-sm;\n color: $es-white;\n background: $es-primary;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:hover {\n background: $es-primary-hover;\n border-color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n\n kbd {\n font-size: 0.65rem;\n padding: 0.125rem 0.25rem;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 2px;\n color: rgba(255, 255, 255, 0.8);\n }\n }\n\n // Filter chips in dropdown\n .filter-chips-row {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n }\n\n .filter-chip {\n @include chip;\n }\n\n // Empty and loading states\n .dropdown-empty,\n .dropdown-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n margin-bottom: $es-spacing-sm;\n }\n }\n\n // Search history panel\n .search-history-panel {\n display: none;\n padding: $es-spacing-sm;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n &.show {\n display: block;\n }\n }\n\n .history-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n i {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n span {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .btn-remove-history,\n .btn-delete-history {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-danger;\n }\n }\n }\n\n // Search history list container\n .search-history-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Results container\n .dropdown-results {\n padding: 0 $es-spacing-sm;\n background: $es-white;\n min-height: 200px;\n }\n\n // Dropdown item (search result)\n .dropdown-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm 0;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .result-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n color: $es-white;\n\n i {\n display: block;\n }\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n // Checkbox indicator\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n background: $es-white;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n }\n }\n\n // View mode classes (applied to dropdown container) - no gap/padding for shared borders\n &.view-cols-2 .dropdown-results { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-3 .dropdown-results { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-4 .dropdown-results { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-5 .dropdown-results { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-6 .dropdown-results { display: grid; grid-template-columns: repeat(6, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-7 .dropdown-results { display: grid; grid-template-columns: repeat(7, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n &.view-cols-8 .dropdown-results { display: grid; grid-template-columns: repeat(8, 1fr); gap: 0; padding: 0; border-top: 1px solid $es-border-color; border-left: 1px solid $es-border-color; }\n\n // Grid view item styling (compact cards with shared borders)\n &.view-cols-2,\n &.view-cols-3,\n &.view-cols-4,\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: $es-spacing-sm;\n border: none;\n border-right: 1px solid $es-border-color;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .result-checkbox {\n position: absolute;\n top: $es-spacing-xs;\n left: $es-spacing-xs;\n }\n\n .result-image,\n .result-icon {\n width: 48px;\n height: 48px;\n margin-bottom: $es-spacing-xs;\n }\n\n .result-info {\n width: 100%;\n }\n\n .result-name {\n font-size: $es-font-size-xs;\n line-height: 1.3;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .result-subtitle {\n display: none;\n }\n\n // Show compact product info in grid\n .result-col {\n display: none;\n }\n\n .result-grid-info {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.25rem;\n margin-top: $es-spacing-xs;\n font-size: 0.65rem;\n\n .grid-price {\n color: $es-text-primary;\n font-weight: $es-font-weight-semibold;\n }\n\n .grid-stock {\n color: $es-text-muted;\n\n &.stock-out { color: $es-danger; }\n &.stock-low { color: $es-warning; }\n }\n\n .grid-discount {\n color: $es-success;\n font-weight: $es-font-weight-medium;\n }\n }\n }\n\n // Hide results header in grid views\n .results-header {\n display: none;\n }\n }\n\n // Remove right border from last item in each row (per column count)\n &.view-cols-2 .dropdown-results .dropdown-item:nth-child(2n) { border-right: none; }\n &.view-cols-3 .dropdown-results .dropdown-item:nth-child(3n) { border-right: none; }\n &.view-cols-4 .dropdown-results .dropdown-item:nth-child(4n) { border-right: none; }\n &.view-cols-5 .dropdown-results .dropdown-item:nth-child(5n) { border-right: none; }\n &.view-cols-6 .dropdown-results .dropdown-item:nth-child(6n) { border-right: none; }\n &.view-cols-7 .dropdown-results .dropdown-item:nth-child(7n) { border-right: none; }\n &.view-cols-8 .dropdown-results .dropdown-item:nth-child(8n) { border-right: none; }\n\n // Smaller items for higher column counts\n &.view-cols-5,\n &.view-cols-6,\n &.view-cols-7,\n &.view-cols-8 {\n .dropdown-item {\n .result-image,\n .result-icon {\n width: 40px;\n height: 40px;\n }\n\n .result-name {\n font-size: 0.65rem;\n }\n }\n }\n\n // Product-specific result item\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n .result-item-image,\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n .result-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n\n i {\n font-size: 16px;\n }\n }\n\n .result-item-info,\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-item-name,\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .result-item-meta,\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n @include text-truncate;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Result columns (for product list view)\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok {\n color: $es-success;\n }\n\n &.stock-low {\n color: $es-warning;\n }\n\n &.stock-out {\n color: $es-danger;\n }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n .col-value {\n display: block;\n }\n\n // Result checkbox\n .result-item-checkbox,\n .result-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n i {\n display: none;\n font-size: 10px;\n color: $es-white;\n }\n\n .dropdown-result-item.selected &,\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n\n // No results state\n .no-results {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: 1.25rem;\n opacity: 0.5;\n }\n }\n\n // Load more controls\n .load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label,\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .load-more-select {\n @include input-base;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n min-width: 60px;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light !important;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2) !important;\n }\n }\n }\n\n // Load more button\n .dropdown-load-more {\n display: flex;\n justify-content: center;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n\n .load-more-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n opacity: 0.7;\n cursor: wait;\n }\n }\n }\n\n // Dropdown body\n .dropdown-body {\n max-height: 400px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n // Tree view styles (for categories)\n .tree-container {\n padding: $es-spacing-sm;\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n .tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: 0.375rem $es-spacing-sm;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n display: block;\n }\n }\n }\n }\n\n // tree-toggle, btn-select-children, tree-checkbox, tree-icon styles in _tree.scss\n\n .tree-info {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n flex: 1;\n min-width: 0;\n }\n\n .tree-name {\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n @include text-truncate;\n }\n\n .tree-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n}\n\n// ============================================================================\n// Standalone dropdown styles (for when dropdown is appended to body)\n// These selectors work because .target-search-dropdown is on the dropdown itself\n// ============================================================================\n\n.target-search-dropdown {\n // Results container - scrollable\n .dropdown-results {\n max-height: 400px;\n overflow-y: auto;\n padding: 0 $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Results header (for list view columns)\n .results-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-md;\n background: $es-slate-100;\n border-bottom: 1px solid $es-border-color;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n\n .header-spacer {\n width: 58px; // checkbox + image width\n flex-shrink: 0;\n }\n\n .header-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n }\n\n .header-col-name {\n flex: 1;\n text-align: left;\n }\n }\n\n // Hide results-header by default, show only for products in list view\n &:not(.view-list) .results-header,\n &.view-tree .results-header {\n display: none;\n }\n\n // Result item for products\n .result-item-product {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n flex: 1;\n min-width: 0;\n }\n\n // Result columns for product data\n .result-col {\n flex-shrink: 0;\n width: 70px;\n text-align: right;\n font-size: $es-font-size-xs;\n }\n\n .result-col-price {\n color: $es-text-secondary;\n }\n\n .result-col-sale {\n color: $es-danger;\n font-weight: $es-font-weight-semibold;\n }\n\n .result-col-stock {\n .col-value {\n &.stock-ok { color: $es-success; }\n &.stock-low { color: $es-warning; }\n &.stock-out { color: $es-danger; }\n }\n }\n\n .result-col-sales {\n color: $es-text-muted;\n }\n\n // Dropdown item styling\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: 0;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background: $es-bg-hover;\n }\n\n &.selected {\n background: $es-primary-light;\n }\n }\n\n // Result checkbox styling\n .result-checkbox {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border: 2px solid $es-border-dark;\n border-radius: 3px;\n transition: all $es-transition-fast;\n\n i {\n font-size: 10px;\n color: transparent;\n }\n\n .dropdown-item.selected & {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n color: $es-white;\n }\n }\n }\n\n // Result image\n .result-image {\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n overflow: hidden;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n // Result icon (for non-image entities)\n .result-icon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: $es-slate-100;\n border-radius: $es-radius-sm;\n\n i {\n font-size: 16px;\n color: $es-text-muted;\n }\n }\n\n // Result info container\n .result-info {\n flex: 1;\n min-width: 0;\n }\n\n .result-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .result-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .subtitle-line {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .subtitle-line-primary {\n color: $es-text-secondary;\n }\n\n .subtitle-line-secondary {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n // Hide columns in grid/tree views\n &[class*=\"view-cols-\"] .result-col,\n &.view-tree .result-col {\n display: none;\n }\n\n // Entity search box - full width\n .entity-search-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: none;\n border-bottom: 1px solid $es-border-color;\n border-radius: 0;\n\n .entity-search-icon {\n color: $es-text-muted;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override Bootstrap/parent form input styles\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n height: auto;\n padding: 0;\n margin: 0;\n border: none !important;\n outline: none;\n background: transparent !important;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n color: $es-text-muted;\n }\n }\n}\n\n// Body-level dropdown (when appended to body for z-index)\nbody > .target-search-dropdown {\n // Override dropdown-item border when inside body-appended dropdown\n .dropdown-item {\n border: none;\n border-radius: 0;\n\n &:not(:last-child) {\n border-bottom: 1px solid $es-border-color;\n }\n }\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n","/**\n * Chips Component\n * Entity chips, selection pills, tags\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Chips container wrapper with toolbar\n .chips-wrapper {\n display: flex;\n flex-direction: column;\n margin-top: $es-spacing-sm;\n background: $es-slate-50;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n overflow: hidden;\n }\n\n // Chips toolbar - integrated filter bar inside chips area\n .chips-toolbar {\n display: none;\n align-items: center;\n flex-wrap: nowrap;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n padding-bottom: 0;\n background: transparent;\n\n &.has-chips {\n display: flex;\n }\n\n // Filter input - takes available space, icon embedded as background\n // Using [type=\"text\"] for specificity over .bootstrap input[type=\"text\"]\n input[type=\"text\"].chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Sort dropdown - compact, auto width\n select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n\n // Count badge - smaller, pill style\n .chips-count {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.125rem;\n padding: 0.2rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: 10px;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-sm;\n white-space: nowrap;\n line-height: 1.4;\n\n &.has-filter {\n background: $es-cyan-100;\n color: $es-cyan-700;\n }\n\n .count-filtered {\n font-weight: $es-font-weight-bold;\n }\n\n .count-separator {\n opacity: 0.6;\n margin: 0 0.125rem;\n }\n }\n\n .chips-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-left: auto;\n }\n\n // Clear button - subtle, chip-like\n .btn-chips-clear {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0; // Don't shrink\n gap: 0.25rem;\n padding: 0.2rem 0.5rem;\n color: $es-danger;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n background: rgba($es-danger, 0.1);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n white-space: nowrap; // Prevent text wrapping\n line-height: 1.4;\n\n &:hover {\n background: $es-danger;\n color: $es-white;\n }\n\n i {\n font-size: 9px;\n flex-shrink: 0;\n }\n\n .clear-text {\n // Hide text on small screens, keep icon\n @media (max-width: 480px) {\n display: none;\n }\n }\n }\n\n // Chips container - flows naturally from toolbar\n .entity-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md $es-spacing-md;\n min-height: 40px;\n max-height: 300px;\n overflow-y: auto;\n\n &:empty {\n display: none;\n }\n }\n\n // Load more section with select dropdown\n .chips-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: transparent;\n border-top: 1px dashed $es-border-color;\n\n .load-more-label {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n\n .load-more-select,\n select.load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem !important;\n border: 1px solid $es-border-color !important;\n border-radius: $es-radius-sm !important;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center !important;\n background-size: 8px !important;\n font-size: $es-font-size-xs !important;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto !important;\n min-height: 0 !important;\n line-height: 1.3 !important;\n\n &:hover {\n border-color: $es-primary !important;\n background-color: $es-primary-light !important;\n }\n\n &:focus {\n outline: none !important;\n border-color: $es-primary !important;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1) !important;\n }\n }\n\n .load-more-remaining {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Individual chip\n .entity-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n // Chip with image\n &.has-image {\n padding-left: 0.25rem;\n }\n\n // Hidden by search filter or pagination\n &.chip-filtered-out,\n &.chip-paginated-out {\n display: none;\n }\n }\n\n .chip-image {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .chip-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: $es-text-muted;\n flex-shrink: 0;\n\n // Product/entity images inside chip\n img {\n width: 20px;\n height: 20px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n }\n }\n\n // Country flag in chip\n .chip-flag {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n\n img {\n width: 18px;\n height: 12px;\n object-fit: cover;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .flag-fallback {\n width: 18px;\n height: 12px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #e8eaed 0%, #dadce0 100%);\n border-radius: 2px;\n font-size: 10px;\n color: #5f6368;\n }\n }\n\n // Holiday preview button in country chip\n .chip-preview-holidays {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: $es-primary;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.15);\n color: darken($es-primary, 10%);\n }\n\n i.material-icons {\n font-size: 14px;\n }\n }\n\n .chip-text,\n .chip-name {\n // Show full name, no truncation\n word-break: break-word;\n }\n\n .chip-remove {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 0.125rem;\n color: $es-text-muted;\n border-radius: 50%;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Chip variants\n .entity-chip.chip-primary {\n background: $es-primary-light;\n color: $es-primary;\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n }\n\n .entity-chip.chip-success {\n background: $es-success-light;\n color: $es-success-dark;\n\n &:hover {\n background: rgba($es-success, 0.2);\n }\n }\n\n .entity-chip.chip-danger {\n background: $es-danger-light;\n color: $es-danger;\n\n &:hover {\n background: rgba($es-danger, 0.2);\n }\n }\n\n .entity-chip.chip-warning {\n background: $es-warning-light;\n color: color.adjust($es-warning, $lightness: -20%);\n\n &:hover {\n background: rgba($es-warning, 0.3);\n }\n }\n\n // Chip loading state\n .entity-chip.loading,\n .entity-chip-loading {\n opacity: 0.7;\n\n .chip-remove {\n display: none;\n }\n\n .chip-icon i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Hidden chip (collapsed view)\n .entity-chip.chip-hidden {\n display: none;\n }\n\n // Chips expanded/collapsed states\n .entity-chips.chips-collapsed,\n .entity-chips.chips-expanded {\n position: relative;\n }\n\n // Show more/less toggle\n .chips-show-more-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .chips-collapse-toggle,\n .chips-expand-toggle {\n // Specific variants inherit from .chips-show-more-toggle\n }\n\n // More chips indicator\n .chips-more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-300;\n }\n }\n\n // Add chip button\n .chip-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: transparent;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Inline chips (compact mode)\n .entity-chips.inline {\n display: inline-flex;\n padding: 0;\n min-height: auto;\n\n .entity-chip {\n padding: 0.125rem 0.375rem;\n font-size: 11px;\n }\n }\n\n // Selected chips section in include/exclude\n .selected-chips-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .selected-chips-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n // Pattern chips (for name/reference patterns)\n .entity-chip.chip-pattern {\n background: #fef3c7;\n color: #92400e;\n font-family: monospace;\n\n &:hover {\n background: #fde68a;\n }\n\n .chip-icon {\n color: #d97706;\n }\n }\n\n // Range chips (price, quantity, etc.)\n .entity-chip.chip-range,\n .range-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.5rem;\n background: $es-cyan-50;\n color: $es-cyan-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-cyan-100;\n }\n }\n\n .range-chip-text {\n font-family: monospace;\n }\n\n .btn-remove-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: $es-cyan-600;\n border-radius: 50%;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Multi-range chips container\n .multi-range-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-xs;\n\n &:empty {\n display: none;\n }\n }\n\n // Pattern chips container\n .pattern-chips {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm 0;\n min-height: 32px;\n\n &:empty::before {\n content: attr(data-placeholder);\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-style: italic;\n }\n }\n\n // Pattern tag\n .pattern-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: #fef3c7;\n color: #92400e;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: #fde68a;\n }\n\n &.case-sensitive {\n .case-icon {\n color: $es-success;\n font-weight: $es-font-weight-bold;\n }\n }\n\n &.draft-tag {\n background: $es-white;\n border: 1px solid $es-border-color;\n padding: 0;\n flex: 1;\n min-width: 150px;\n\n &:hover {\n background: $es-white;\n }\n\n .pattern-input {\n flex: 1;\n min-width: 100px;\n padding: 0.375rem;\n border: 0;\n background: transparent;\n font-size: $es-font-size-sm;\n font-family: inherit;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-style: italic;\n }\n }\n }\n }\n\n .pattern-tag-text {\n font-family: monospace;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .btn-toggle-case {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n }\n }\n\n .case-icon {\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n font-family: monospace;\n }\n\n .btn-remove-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n color: #d97706;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-add-pattern {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Pattern match count (in draft tag)\n .pattern-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0 0.375rem;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n cursor: pointer;\n\n &.count-zero {\n color: $es-warning;\n }\n\n &.count-found {\n color: $es-success;\n }\n\n .count-value {\n font-weight: $es-font-weight-semibold;\n }\n }\n\n // Pattern input row\n .pattern-input-row {\n display: flex;\n align-items: stretch;\n gap: $es-spacing-xs;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Popover (Country chip eye button)\n// ==========================================================================\n\n.holiday-preview-popover {\n position: absolute;\n z-index: 10001;\n width: 320px;\n max-width: 90vw;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n overflow: hidden;\n\n .popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .popover-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .popover-flag {\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i.material-icons {\n font-size: 18px;\n }\n }\n\n .popover-body {\n max-height: 350px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i.material-icons {\n font-size: 20px;\n }\n\n .icon-spin {\n animation: spin 1s linear infinite;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: $es-spacing-sm;\n display: block;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank,\n &.holiday-type-bank-holiday {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional,\n &.holiday-type-local-holiday {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 80px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-country-flag {\n vertical-align: middle;\n margin-right: 0.25rem;\n border-radius: 2px;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\n }\n\n .holiday-name {\n display: inline;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-left: $es-spacing-sm;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n vertical-align: middle;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n\n // Filter input\n .popover-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-md;\n border-bottom: 1px solid $es-border-color;\n background: $es-slate-50;\n\n i.material-icons {\n font-size: 18px;\n color: $es-text-muted;\n }\n\n .holiday-filter-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n outline: none;\n padding: $es-spacing-xs 0;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n }\n}\n\n// Spin animation for loading icons\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n// Bootstrap specificity overrides for chips toolbar form elements\n// PrestaShop admin uses #content .mpr-config-form... with high specificity\n// We need to match or exceed that specificity\n#content.bootstrap,\n#content .bootstrap,\n.bootstrap #content {\n .target-conditions-trait,\n .entity-selector-trait {\n .chips-wrapper .chips-toolbar {\n // Double class for extra specificity\n input[type=\"text\"].chips-search-input.chips-search-input {\n all: unset;\n display: block;\n flex: 1 1 auto;\n min-width: 80px;\n width: auto;\n height: auto;\n padding: 0.2rem 0.5rem 0.2rem 1.5rem;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E\") no-repeat 0.375rem center;\n background-size: 10px;\n border: 1px solid $es-slate-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n line-height: 1.4;\n color: $es-text-primary;\n box-sizing: border-box;\n transition: all $es-transition-fast;\n\n &::placeholder {\n color: $es-text-muted;\n font-size: 11px;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Double class for extra specificity\n select.chips-sort-select.chips-sort-select {\n all: unset;\n flex: 0 0 auto;\n padding: 0.2rem 1.25rem 0.2rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.375rem center;\n background-size: 8px;\n font-size: 10px;\n line-height: 1.4;\n color: $es-text-secondary;\n cursor: pointer;\n box-sizing: border-box;\n white-space: nowrap;\n height: auto;\n\n &:hover {\n border-color: $es-primary;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n }\n }\n}\n","/**\n * Groups Component\n * Selection groups, include/exclude sections, method selectors\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Group container\n .target-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n }\n\n // Group header\n .target-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n }\n\n .target-group-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n .group-number {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 0.25rem;\n background: $es-primary;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-bold;\n border-radius: $es-radius-full;\n }\n }\n\n .target-group-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .group-action-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n &.danger:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group body\n .target-group-body,\n .group-body {\n padding: $es-spacing-md;\n }\n\n // Include section\n .include-section {\n margin-bottom: $es-spacing-md;\n }\n\n .section-label {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n &.label-include {\n color: $es-success-dark;\n\n i {\n color: $es-success;\n }\n }\n\n &.label-exclude {\n color: $es-danger;\n\n i {\n color: $es-danger;\n }\n }\n }\n\n // Method selector\n .method-selector {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n }\n\n .method-selector-wrapper {\n flex: 1;\n position: relative;\n }\n\n .method-select {\n @include input-base;\n padding-right: 2rem;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n }\n\n .method-help-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-primary;\n }\n }\n\n // Value picker (search trigger)\n .value-picker {\n position: relative;\n }\n\n .value-picker-trigger {\n @include button-reset;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n width: 100%;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n text-align: left;\n transition: all $es-transition-fast;\n\n &:hover {\n border-color: $es-slate-300;\n }\n\n &:focus {\n border-color: $es-primary;\n @include focus-ring($es-primary);\n }\n\n i {\n color: $es-text-light;\n }\n }\n\n // Pattern input (text input for patterns)\n .pattern-input-wrapper {\n position: relative;\n }\n\n .pattern-input {\n @include input-base;\n font-family: monospace;\n }\n\n .pattern-add-btn {\n @include button-reset;\n position: absolute;\n right: 0.25rem;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-range input (price ranges)\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .range-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .range-input {\n @include input-base;\n width: 100px;\n text-align: center;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n .range-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .range-add-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n color: $es-primary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n // Multi-select tiles (stock status, etc.)\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .multi-select-tile {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n background: $es-slate-100;\n color: $es-text-secondary;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px solid transparent;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n border-color: $es-primary;\n }\n }\n\n // Exclude section\n .exclude-section {\n margin-top: $es-spacing-md;\n padding-top: $es-spacing-md;\n border-top: 1px dashed $es-border-color;\n }\n\n // Legacy exclude-rows (if used elsewhere)\n .exclude-rows {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row-content {\n flex: 1;\n }\n\n .exclude-remove-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .add-exclude-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.25rem 0.5rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border: 1px dashed $es-danger;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n }\n }\n\n // Add group button (used in block-footer)\n .btn-add-group {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.875rem;\n color: $es-primary;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n background: rgba($es-primary, 0.05);\n border: 1px dashed $es-primary;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-primary, 0.1);\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Block footer\n .block-footer {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n // Block body\n .block-body {\n padding: 0;\n }\n\n // Groups container\n .groups-container {\n padding: $es-spacing-md;\n }\n\n // Groups empty state\n .groups-empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n }\n\n // Selection group\n .selection-group {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-md;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &.collapsed {\n .group-body {\n display: none;\n }\n\n .group-collapse-toggle i {\n transform: rotate(-90deg);\n }\n }\n }\n\n // Group header\n .group-header {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n\n &.group-header-single {\n padding: $es-spacing-xs $es-spacing-md;\n background: transparent;\n border-bottom: none;\n }\n }\n\n .group-collapse-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n color: $es-text-muted;\n\n i {\n transition: transform $es-transition-fast;\n }\n }\n\n .group-name-wrapper {\n flex: 1;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .group-name-input {\n flex: 1;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n background: transparent;\n border: 1px solid transparent;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover,\n &:focus {\n background: $es-white;\n border-color: $es-border-color;\n outline: none;\n }\n\n &::placeholder {\n color: $es-text-muted;\n font-weight: $es-font-weight-medium;\n }\n }\n\n .group-count-badge {\n @include count-badge($es-primary);\n }\n\n .btn-remove-group {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n // Group include section - green accent to distinguish from exclude\n .group-include {\n margin-bottom: $es-spacing-md;\n padding: $es-spacing-sm;\n background: rgba($es-success, 0.03);\n border: 1px solid rgba($es-success, 0.2);\n border-radius: $es-radius-md;\n }\n\n .section-row {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Method selector wrapper (from PHP)\n .method-selector-wrapper {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .method-info-placeholder {\n display: flex;\n align-items: center;\n min-width: 20px;\n }\n\n .include-method-select,\n .exclude-method-select {\n flex: 1;\n @include input-base;\n cursor: pointer;\n }\n\n // Lock indicator for method selector (when excludes are present)\n .selector-locked {\n .include-method-select {\n opacity: 0.7;\n cursor: not-allowed;\n }\n }\n\n .lock-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-warning;\n cursor: help;\n\n i {\n font-size: 14px;\n }\n\n .mpr-tooltip {\n display: none;\n position: absolute;\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-800;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n white-space: nowrap;\n border-radius: $es-radius-sm;\n z-index: 100;\n }\n\n &:hover .mpr-tooltip {\n display: block;\n }\n }\n\n // Group excludes section\n .group-excludes {\n margin-top: $es-spacing-md;\n }\n\n .except-separator {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin: 0 0 $es-spacing-sm 0;\n\n // Lines on both sides\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: rgba($es-danger, 0.3);\n }\n }\n\n .except-label {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background: $es-danger-light;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: $es-radius-full;\n white-space: nowrap;\n flex-shrink: 0;\n\n i {\n font-size: 10px;\n }\n }\n\n .exclude-rows-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .exclude-row {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-sm;\n background: rgba($es-danger, 0.03);\n border: 1px solid rgba($es-danger, 0.15);\n border-radius: $es-radius-md;\n\n // Value picker inside exclude row - full width\n .value-picker {\n width: 100%;\n margin-top: $es-spacing-sm;\n }\n }\n\n .exclude-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n width: 100%;\n\n .method-selector-wrapper {\n flex: 1;\n }\n\n // Delete button at the far right\n .btn-remove-exclude-row {\n flex-shrink: 0;\n margin-left: auto;\n }\n }\n\n .btn-remove-exclude-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n color: $es-danger;\n }\n }\n\n .btn-add-exclude,\n .btn-add-another-exclude {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: $es-spacing-sm;\n padding: 0.375rem 0.625rem;\n color: $es-danger;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n background: transparent;\n border: 1px dashed rgba($es-danger, 0.5);\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-danger-light;\n border-color: $es-danger;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n // Group modifiers (inline version from PHP)\n // Uses negative margins to break out of .group-body padding\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n margin: $es-spacing-md (-$es-spacing-md) (-$es-spacing-md);\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n }\n\n .modifier-inline {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n }\n\n // Common height for all modifier controls\n $modifier-height: 26px;\n\n .group-modifier-limit {\n width: 50px;\n max-width: 50px;\n height: $modifier-height;\n padding: 0 0.375rem;\n font-size: $es-font-size-xs;\n text-align: center;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n // Sort modifier - input group style (select + button glued together)\n .modifier-sort {\n gap: 0; // Remove gap to glue select + button together\n\n .modifier-label {\n margin-right: 0.375rem; // Keep space between label and input group\n }\n\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm 0 0 $es-radius-sm;\n border-right: none;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n position: relative;\n z-index: 1;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: 0 $es-radius-sm $es-radius-sm 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 11px;\n }\n }\n }\n\n // Fallback for elements outside .modifier-sort context\n .group-modifier-sort {\n height: $modifier-height;\n padding: 0 0.5rem;\n font-size: $es-font-size-xs;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n cursor: pointer;\n\n &:focus {\n border-color: $es-primary;\n outline: none;\n }\n }\n\n .btn-sort-dir {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: $modifier-height;\n height: $modifier-height;\n color: $es-text-muted;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n }\n\n .group-preview-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n\n &.clickable {\n cursor: pointer;\n\n &:hover {\n background: $es-primary-light;\n color: $es-primary;\n }\n }\n }\n\n // OR separator between groups\n .group-separator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-sm 0;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: $es-border-color;\n margin: 0 $es-spacing-md;\n }\n }\n\n // Group modifiers (limit, sort)\n .group-modifiers {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n padding-top: $es-spacing-md;\n margin-top: $es-spacing-md;\n border-top: 1px solid $es-border-color;\n }\n\n .modifier-group {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n }\n\n .modifier-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n white-space: nowrap;\n }\n\n .modifier-input {\n @include input-base;\n width: 80px;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n }\n\n .modifier-select {\n @include input-base;\n width: auto;\n padding: 0.25rem 1.5rem 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");\n background-position: right 0.25rem center;\n background-repeat: no-repeat;\n background-size: 1.25em 1.25em;\n }\n\n // Condition match count badge\n .condition-match-count {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.375rem;\n background: $es-slate-100;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n &.has-results {\n background: $es-primary-light;\n color: $es-primary;\n }\n\n // Country holidays variant - use calendar icon style\n &.country-holidays {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n\n &:hover {\n background: rgba(139, 92, 246, 0.2);\n }\n\n &.clickable {\n background: rgba(139, 92, 246, 0.15);\n }\n }\n\n i {\n font-size: 10px;\n }\n }\n}\n","/**\n * Value Picker Component\n * Search boxes, input types, range inputs\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Value picker container\n .value-picker {\n padding: $es-spacing-sm 0;\n\n &[style*=\"display: none\"],\n &[style*=\"display:none\"] {\n padding: 0;\n }\n }\n\n .include-picker,\n .exclude-picker {\n // Section-specific picker styles\n }\n\n // Entity search box\n .entity-search-box {\n position: relative;\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:focus-within {\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n // Separation between chips and search box\n .chips-wrapper + .entity-search-box {\n margin-top: $es-spacing-md;\n }\n\n .entity-search-icon {\n color: $es-text-muted;\n font-size: 14px;\n flex-shrink: 0;\n margin-left: $es-spacing-xs;\n }\n\n // Override parent form's max-width on search input\n input.entity-search-input,\n input.entity-search-input[type=\"text\"] {\n @include input-reset;\n flex: 1;\n min-width: 0;\n width: auto !important;\n max-width: none !important;\n padding: 0.375rem;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n border: none !important;\n background: transparent !important;\n box-shadow: none !important;\n\n &::placeholder {\n color: $es-text-muted;\n }\n\n &:focus {\n border: none !important;\n box-shadow: none !important;\n outline: none;\n }\n }\n\n .search-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n color: $es-primary;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n\n // Browse tree button (for categories)\n .btn-browse-tree {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-left: auto;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary;\n color: $es-white;\n }\n\n i {\n font-size: 14px;\n }\n }\n\n // Numeric range box\n .numeric-range-box,\n .multi-range-input-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .range-min-input,\n .range-max-input {\n @include input-base;\n width: 100px;\n padding: $es-spacing-sm;\n text-align: center;\n font-size: $es-font-size-sm;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n -moz-appearance: textfield;\n }\n\n .range-separator {\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .btn-add-range {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-white;\n background: $es-primary;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-hover;\n }\n\n i {\n font-size: 12px;\n }\n }\n\n // Multi-range container\n .multi-range-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n // Date range box\n .date-range-box {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n }\n\n .date-from-input,\n .date-to-input {\n @include input-base;\n width: 140px;\n padding: $es-spacing-sm;\n font-size: $es-font-size-sm;\n }\n\n // Multi-select tiles\n .multi-select-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n }\n\n .tile-option {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n color: $es-text-muted;\n background: transparent;\n border: 1px dashed $es-border-color;\n border-radius: 100px; // Pill shape\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-normal;\n cursor: pointer;\n transition: all $es-transition-fast;\n\n &:hover {\n color: $es-text-secondary;\n border-color: $es-slate-400;\n border-style: solid;\n }\n\n &.selected {\n color: $es-primary;\n background: $es-primary-light;\n border: 1px solid $es-primary;\n font-weight: $es-font-weight-medium;\n }\n\n i {\n font-size: 11px;\n opacity: 0.6;\n }\n\n &.selected i {\n opacity: 1;\n }\n }\n\n .tile-label {\n white-space: nowrap;\n }\n\n // Select input box\n .select-input-box {\n display: inline-block;\n }\n\n .select-value-input {\n @include input-base;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n min-width: 150px;\n }\n\n // Boolean input box\n .boolean-input-box {\n display: inline-flex;\n align-items: center;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-success-light;\n color: $es-success-dark;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n }\n\n .boolean-label {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n &::before {\n content: '\\2713';\n font-weight: bold;\n }\n }\n\n // Condition match count badge\n .condition-match-count {\n @include count-badge($es-primary);\n margin-left: $es-spacing-sm;\n }\n}\n","/**\n * Modal Component\n * Preview modals, confirmation dialogs\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Modal backdrop\n.mpr-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: $es-z-modal;\n opacity: 0;\n transition: opacity $es-transition-normal;\n\n &.show {\n opacity: 1;\n }\n}\n\n// Modal container\n.mpr-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n z-index: $es-z-modal + 1;\n width: 90%;\n max-width: 600px;\n max-height: 90vh;\n background: $es-white;\n border-radius: $es-radius-xl;\n box-shadow: $es-shadow-xl;\n opacity: 0;\n transition: all $es-transition-normal;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &.show {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n &.modal-sm {\n max-width: 400px;\n }\n\n &.modal-lg {\n max-width: 800px;\n }\n\n &.modal-xl {\n max-width: 1000px;\n }\n\n &.modal-fullscreen {\n width: 95%;\n max-width: none;\n height: 90vh;\n max-height: none;\n }\n}\n\n// Modal header\n.mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-title {\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n}\n\n.mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: $es-font-size-lg;\n }\n}\n\n// Modal body\n.mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n}\n\n// Modal footer\n.mpr-modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: $es-spacing-sm;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n flex-shrink: 0;\n}\n\n.mpr-modal-btn {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-sm $es-spacing-md;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &.btn-secondary {\n color: $es-text-secondary;\n background: $es-slate-100;\n\n &:hover {\n background: $es-slate-200;\n }\n }\n\n &.btn-primary {\n color: $es-white;\n background: $es-primary;\n\n &:hover {\n background: $es-primary-hover;\n }\n }\n\n &.btn-danger {\n color: $es-white;\n background: $es-danger;\n\n &:hover {\n background: color.adjust($es-danger, $lightness: -10%);\n }\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n// Preview popover styles moved to _list-preview.scss\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n}\n\n.popover-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n}\n\n.popover-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n}\n\n.popover-body {\n max-height: 300px;\n overflow-y: auto;\n padding: $es-spacing-sm;\n @include custom-scrollbar;\n}\n\n.popover-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-top: 1px solid $es-border-color;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n}\n\n.popover-info {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n.popover-load-more {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n}\n\n// Popover arrow\n.popover-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: $es-white;\n border: 1px solid $es-border-color;\n transform: rotate(45deg);\n\n &.arrow-top {\n top: -7px;\n left: 50%;\n margin-left: -6px;\n border-right: none;\n border-bottom: none;\n }\n\n &.arrow-bottom {\n bottom: -7px;\n left: 50%;\n margin-left: -6px;\n border-left: none;\n border-top: none;\n }\n}\n\n// ==========================================================================\n// Holiday Preview Modal\n// ==========================================================================\n\n#mpr-holiday-preview-modal {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: $es-z-modal;\n\n &.show {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .mpr-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n cursor: pointer;\n }\n\n .mpr-modal-dialog {\n position: relative;\n width: 90%;\n max-width: 480px;\n max-height: 80vh;\n background: $es-white;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-xl;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .mpr-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-md $es-spacing-lg;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n flex-shrink: 0;\n }\n\n .mpr-modal-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-base;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n margin: 0;\n\n i.material-icons {\n font-size: 20px;\n color: $es-primary;\n }\n }\n\n .mpr-modal-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: $es-text-muted;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-secondary;\n }\n\n i {\n font-size: 18px;\n }\n }\n\n .mpr-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: $es-spacing-lg;\n @include custom-scrollbar;\n }\n\n // Loading state\n .holiday-preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n font-size: $es-font-size-lg;\n }\n }\n\n // Empty state\n .holiday-preview-empty {\n text-align: center;\n padding: $es-spacing-xl 0;\n color: $es-text-muted;\n\n i.material-icons {\n font-size: 48px;\n opacity: 0.5;\n margin-bottom: $es-spacing-md;\n }\n\n p {\n margin: 0 0 $es-spacing-xs;\n }\n\n .hint {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n // Holiday list\n .holiday-list {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .holiday-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n border-left: 3px solid $es-success;\n\n &.holiday-type-bank {\n border-left-color: $es-info;\n }\n\n &.holiday-type-observance {\n border-left-color: $es-warning;\n }\n\n &.holiday-type-regional {\n border-left-color: #8b5cf6;\n }\n }\n\n .holiday-date {\n flex-shrink: 0;\n min-width: 100px;\n\n .holiday-day {\n display: block;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .holiday-weekday {\n display: block;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n }\n }\n\n .holiday-info {\n flex: 1;\n min-width: 0;\n }\n\n .holiday-name {\n display: block;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n word-wrap: break-word;\n }\n\n .holiday-type-badge {\n display: inline-block;\n margin-top: $es-spacing-xs;\n padding: 0.125rem 0.375rem;\n font-size: 10px;\n font-weight: $es-font-weight-medium;\n text-transform: capitalize;\n background: $es-slate-200;\n color: $es-text-secondary;\n border-radius: $es-radius-sm;\n }\n\n .holiday-preview-note {\n margin-top: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n text-align: center;\n }\n}\n","/**\n * List Preview Component\n * Popover and modal views for entity preview\n *\n * Uses shared entity-item base for item styling.\n * This file only contains popover/modal container styles.\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// =============================================================================\n// Preview Popover Container\n// =============================================================================\n\n.target-preview-popover,\n.target-list-preview-popover {\n position: absolute;\n z-index: 10000;\n min-width: 320px;\n max-width: 480px;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n box-shadow: $es-shadow-lg;\n overflow: hidden;\n\n // Arrow pointing to badge\n &::before {\n content: '';\n position: absolute;\n top: -8px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid $es-border-color;\n }\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n left: 50%;\n transform: translateX(-50%);\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid $es-white;\n }\n\n // Positioned to the right - arrow on left\n &.position-right {\n &::before,\n &::after {\n left: 20px;\n transform: none;\n }\n }\n\n // Positioned to the left - arrow on right\n &.position-left {\n &::before,\n &::after {\n left: auto;\n right: 20px;\n transform: none;\n }\n }\n}\n\n// =============================================================================\n// Preview Header\n// =============================================================================\n\n.preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n }\n\n .preview-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n }\n}\n\n// =============================================================================\n// Preview Tabs (entity type switcher)\n// =============================================================================\n\n.preview-tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n padding: 0;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n}\n\n.preview-tab {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.75rem;\n background: transparent;\n border: 0;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n color: $es-text-muted;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-secondary;\n }\n\n &.active {\n background: $es-white;\n border-bottom-color: $es-primary;\n color: $es-primary;\n }\n\n i {\n font-size: 12px;\n }\n}\n\n// =============================================================================\n// Preview Filter\n// =============================================================================\n\n.preview-filter {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-white;\n border-bottom: 1px solid $es-border-color;\n\n i {\n color: $es-text-muted;\n font-size: 12px;\n }\n\n .preview-filter-input {\n all: unset;\n flex: 1;\n padding: 0.25rem 0;\n font-size: $es-font-size-xs;\n color: $es-text-primary;\n box-sizing: border-box;\n\n &::placeholder {\n color: $es-text-muted;\n }\n }\n}\n\n// =============================================================================\n// Preview Contents (tabbed content areas)\n// =============================================================================\n\n.preview-contents {\n max-height: 350px;\n overflow: hidden;\n}\n\n.preview-content {\n display: none;\n max-height: 350px;\n overflow-y: auto;\n @include custom-scrollbar;\n\n &.active {\n display: block;\n }\n}\n\n// =============================================================================\n// Preview Items Container\n// =============================================================================\n\n.preview-items {\n display: flex;\n flex-direction: column;\n padding: $es-spacing-xs $es-spacing-sm;\n}\n\n// =============================================================================\n// Preview Item - Uses entity-item patterns\n// Maps legacy classes to shared styling\n// =============================================================================\n\n.preview-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-white;\n border-radius: $es-radius-sm;\n transition: background $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n\n // Clickable items\n &[data-id] {\n cursor: pointer;\n }\n}\n\n// Image - matches chip image sizing for consistency\n.preview-item-image {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n object-fit: cover;\n border-radius: $es-radius-sm;\n background: $es-slate-100;\n}\n\n// No-image placeholder\n.preview-item-no-image {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n background: $es-slate-100;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n font-size: $es-font-size-sm;\n}\n\n// Info container\n.preview-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n}\n\n// Name\n.preview-item-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n @include text-truncate;\n}\n\n// Meta/ref (category, email, etc.)\n.preview-item-ref,\n.preview-item-meta {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n @include text-truncate;\n}\n\n// Price badge\n.preview-item-price {\n flex-shrink: 0;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n}\n\n// =============================================================================\n// Preview Footer (load more)\n// =============================================================================\n\n.preview-footer {\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-slate-50;\n border-top: 1px solid $es-border-color;\n}\n\n.load-more-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n\n .load-more-label {\n white-space: nowrap;\n }\n\n .load-more-select {\n appearance: none;\n padding: 0.25rem 1.75rem 0.25rem 0.5rem;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n background: $es-white url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23666' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\") no-repeat right 0.5rem center;\n background-size: 8px;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n cursor: pointer;\n transition: all $es-transition-fast;\n height: auto;\n min-height: 0;\n line-height: 1.3;\n\n &:hover {\n border-color: $es-primary;\n background-color: $es-primary-light;\n }\n\n &:focus {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 2px rgba($es-primary, 0.1);\n }\n }\n\n .load-more-of {\n white-space: nowrap;\n }\n\n .remaining-count {\n font-weight: $es-font-weight-semibold;\n color: $es-text-secondary;\n }\n\n .btn-load-more {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xs;\n margin: 0;\n border: none;\n color: $es-primary;\n background: $es-primary-light;\n border-radius: $es-radius-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n font: inherit;\n\n i {\n font-size: 14px;\n }\n\n &:hover {\n background: rgba($es-primary, 0.2);\n }\n\n &.loading {\n cursor: wait;\n\n i {\n animation: spin 0.6s linear infinite;\n }\n }\n }\n}\n\n// =============================================================================\n// Preview States\n// =============================================================================\n\n.preview-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xl;\n text-align: center;\n color: $es-text-muted;\n\n i {\n font-size: 2rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: $es-font-size-sm;\n }\n}\n\n.preview-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n\n i {\n font-size: 20px;\n color: $es-primary;\n animation: spin 0.6s linear infinite;\n }\n}\n\n// =============================================================================\n// Total Summary Popover (header total badge click)\n// =============================================================================\n\n.total-preview-popover {\n min-width: 240px;\n max-width: 320px;\n\n .preview-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n\n .preview-popover-title {\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n font-size: $es-font-size-sm;\n }\n\n .preview-popover-count {\n flex-shrink: 0;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n background: $es-slate-200;\n padding: 0.125rem 0.5rem;\n border-radius: $es-radius-sm;\n }\n }\n\n .preview-popover-body {\n padding: $es-spacing-xs 0;\n }\n\n .total-summary-list {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .total-summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.15s ease;\n\n &:hover {\n background: $es-slate-50;\n }\n\n i {\n width: 18px;\n text-align: center;\n color: $es-text-muted;\n font-size: 14px;\n }\n\n .summary-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n }\n\n .summary-item-count {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n padding: 2px 8px;\n border-radius: $es-radius-sm;\n }\n }\n}\n\n// Make trait-total-count clickable\n.trait-total-count {\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n opacity: 0.8;\n }\n\n &.popover-open {\n opacity: 0.9;\n }\n}\n\n// =============================================================================\n// Schedule Preview Dropdown (for admin list columns)\n// =============================================================================\n\n.schedule-preview-dropdown {\n display: none;\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 4px;\n z-index: 1000;\n min-width: 180px;\n padding: $es-spacing-sm;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n box-shadow: $es-shadow-lg;\n font-size: $es-font-size-sm;\n text-align: left;\n white-space: nowrap;\n}\n\n.schedule-preview-item {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs 0;\n color: $es-text-primary;\n\n .material-icons {\n flex-shrink: 0;\n font-size: 16px;\n color: $es-text-muted;\n }\n\n strong {\n font-weight: $es-font-weight-semibold;\n }\n\n .schedule-time {\n color: $es-text-muted;\n }\n}\n\n// Badge trigger for schedule preview\n.btn-schedule-preview {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n min-width: 20px;\n height: 20px;\n padding: 0 0.5rem;\n background: $es-primary;\n color: $es-white;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n border-radius: 50rem;\n cursor: pointer;\n text-transform: none;\n\n .icon-eye {\n font-size: 10px;\n line-height: 1;\n opacity: 0.8;\n }\n}\n","/**\n * Schedule Conditions Component\n * DateTime picker, weekly timeline, holidays\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Schedule conditions wrapper\n.schedule-conditions-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n}\n\n// Schedule header\n.schedule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-md;\n padding: 0.875rem $es-spacing-md;\n background: $es-bg-header;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-bg-hover;\n }\n}\n\n.schedule-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n// Schedule body\n.schedule-body {\n padding: $es-spacing-md;\n}\n\n// Schedule section\n.schedule-section {\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n.schedule-section-title {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-sm;\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-text-primary;\n\n i {\n color: $es-text-muted;\n }\n}\n\n.schedule-section-description {\n margin-bottom: $es-spacing-md;\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n}\n\n// DateTime range picker\n.datetime-range {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n}\n\n.datetime-field {\n flex: 1;\n min-width: 200px;\n}\n\n.datetime-label {\n display: block;\n margin-bottom: 0.25rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n}\n\n.datetime-input {\n @include input-base;\n}\n\n// Weekly schedule\n.weekly-schedule {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n}\n\n.day-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n\n &.disabled {\n opacity: 0.5;\n }\n}\n\n.day-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n min-width: 100px;\n}\n\n.day-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.day-name {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n// Timeline slider\n.timeline-slider {\n flex: 1;\n position: relative;\n height: 24px;\n background: $es-slate-200;\n border-radius: $es-radius-full;\n cursor: pointer;\n}\n\n.timeline-fill {\n position: absolute;\n top: 0;\n height: 100%;\n background: $es-primary;\n border-radius: $es-radius-full;\n transition: all $es-transition-fast;\n}\n\n.timeline-handle {\n position: absolute;\n top: 50%;\n width: 16px;\n height: 16px;\n background: $es-white;\n border: 2px solid $es-primary;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: grab;\n box-shadow: $es-shadow-sm;\n transition: box-shadow $es-transition-fast;\n\n &:hover {\n box-shadow: $es-shadow-md;\n }\n\n &:active {\n cursor: grabbing;\n }\n\n &.handle-start {\n z-index: 2;\n }\n\n &.handle-end {\n z-index: 1;\n }\n}\n\n// Time display\n.day-times {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n min-width: 120px;\n font-size: $es-font-size-xs;\n font-family: monospace;\n color: $es-text-secondary;\n}\n\n.time-separator {\n color: $es-text-muted;\n}\n\n// Holiday exclusions\n.holiday-section {\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n}\n\n.holiday-toggle {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n margin-bottom: $es-spacing-md;\n}\n\n.holiday-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.holiday-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-medium;\n color: $es-text-primary;\n}\n\n.holiday-countries {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-xs;\n}\n\n.holiday-country-chip {\n @include chip;\n cursor: pointer;\n\n &.selected {\n background: $es-primary-light;\n color: $es-primary;\n }\n}\n\n// Server time display\n.server-time {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm $es-spacing-md;\n background: $es-info-light;\n border-radius: $es-radius-md;\n font-size: $es-font-size-xs;\n color: $es-info;\n\n i {\n font-size: $es-font-size-sm;\n }\n\n .time-value {\n font-family: monospace;\n font-weight: $es-font-weight-semibold;\n }\n}\n\n// Schedule summary\n.schedule-summary {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-xs;\n padding: $es-spacing-md;\n background: $es-slate-50;\n border-radius: $es-radius-md;\n font-size: $es-font-size-sm;\n color: $es-text-secondary;\n\n .summary-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n\n i {\n color: $es-success;\n font-size: $es-font-size-sm;\n }\n\n &.inactive i {\n color: $es-text-muted;\n }\n }\n}\n\n// Collapsed state\n.schedule-conditions-trait.collapsed {\n .schedule-body {\n display: none;\n }\n\n .schedule-header {\n border-radius: $es-radius-lg;\n }\n}\n\n// Schedule toggle row (form-content layout)\n.schedule-toggle-row {\n display: flex;\n align-items: center;\n background: $es-slate-100;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n\n .schedule-toggle-switch {\n padding: $es-spacing-sm $es-spacing-md;\n }\n\n .schedule-toggle-actions {\n padding: $es-spacing-sm $es-spacing-md;\n border-left: 1px solid $es-border-color;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-200;\n }\n\n .material-icons {\n color: $es-slate-400;\n font-size: 20px;\n }\n }\n}\n\n// Schedule summary badges (read-only indicators in header)\n.schedule-summary-badges {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-left: auto;\n padding: 0 $es-spacing-sm;\n}\n\n.schedule-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n background: $es-slate-200;\n color: $es-slate-600;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n border-radius: $es-radius-full;\n white-space: nowrap;\n\n .material-icons {\n font-size: 14px;\n opacity: 0.7;\n }\n}\n\n// Section hint after embedded entity selector - add margin\n.schedule-holidays .section-hint {\n margin-top: $es-spacing-md;\n}\n","/**\n * Tips Box Component\n * Pro tips and help information display\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Tips box container\n .target-tips-box {\n margin: $es-spacing-lg $es-spacing-md $es-spacing-md;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n overflow: hidden;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n }\n\n // Tips header (clickable to expand/collapse)\n .tips-header {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: $es-spacing-md $es-spacing-lg;\n cursor: pointer;\n user-select: none;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: rgba(0, 0, 0, 0.02);\n }\n\n // Lightbulb icon\n > i:first-child {\n font-size: 1rem;\n color: $es-warning;\n }\n\n // Title text\n > span {\n flex: 1;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n }\n }\n\n // Toggle chevron icon\n .tips-toggle {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n transition: transform 0.2s;\n }\n\n // Expanded state\n .target-tips-box.expanded {\n .tips-toggle {\n transform: rotate(180deg);\n }\n\n .tips-content {\n display: block;\n }\n }\n\n // Tips content (hidden by default)\n .tips-content {\n display: none;\n padding: 0 $es-spacing-lg $es-spacing-lg;\n }\n\n // Tips grid layout\n .tips-grid {\n display: grid;\n gap: $es-spacing-md;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n }\n\n // Individual tip item\n .tip-item {\n display: flex;\n gap: $es-spacing-md;\n padding: $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px solid $es-border-color;\n }\n\n // Tip icon\n .tip-icon {\n flex-shrink: 0;\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: $es-primary-light;\n border-radius: $es-radius-md;\n color: $es-primary;\n font-size: $es-font-size-sm;\n }\n\n // Tip text content\n .tip-text {\n flex: 1;\n min-width: 0;\n\n strong {\n display: block;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: 0.25rem;\n }\n\n p {\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n margin: 0;\n }\n }\n\n // Tips footer\n .tips-footer {\n margin-top: $es-spacing-md;\n padding: 0.625rem $es-spacing-md;\n background: $es-white;\n border-radius: $es-radius-md;\n border: 1px dashed $es-gray-300;\n font-size: 11px;\n color: $es-text-muted;\n line-height: 1.625;\n\n i {\n color: $es-primary;\n margin-right: 0.25rem;\n }\n }\n}\n","/**\n * Condition Trait Base Styles\n * Shared styling for all condition trait components\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Base condition trait container\n.condition-trait {\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-lg;\n margin-bottom: $es-spacing-lg;\n\n &:last-child {\n margin-bottom: 0;\n }\n}\n\n// Collapsed state\n.condition-trait.collapsed {\n .condition-trait-header {\n border-bottom-color: transparent;\n border-radius: $es-radius-lg;\n }\n\n .collapse-icon {\n transform: rotate(180deg);\n }\n}\n\n// =============================================================================\n// Trait Header\n// =============================================================================\n\n.condition-trait-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: $es-spacing-lg;\n flex-wrap: wrap;\n padding: 0.875rem $es-spacing-lg;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-color;\n border-radius: $es-radius-lg $es-radius-lg 0 0;\n cursor: pointer;\n transition: background-color $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n }\n}\n\n.trait-header-left {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n min-width: 0;\n flex: 1;\n}\n\n.trait-icon {\n font-size: 1.125rem;\n color: $es-text-muted;\n flex-shrink: 0;\n}\n\n.trait-title-group {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.trait-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-800;\n white-space: nowrap;\n}\n\n.trait-subtitle {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n// Schedule summary (shows current config at a glance)\n.trait-summary {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.625rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n border-radius: $es-radius-full;\n white-space: nowrap;\n margin-left: $es-spacing-md;\n flex-shrink: 0;\n max-width: 320px;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:empty {\n display: none;\n }\n}\n\n.trait-header-right {\n display: flex;\n align-items: center;\n gap: $es-spacing-md;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.trait-header-actions {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n}\n\n// Collapse icon\n.collapse-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n cursor: pointer;\n transition: all 0.2s;\n border-radius: $es-radius-sm;\n background: transparent;\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.08);\n }\n}\n\n// Show all toggle\n.trait-show-all-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n// Trait total count badge (global fallback)\n.trait-total-count {\n @include count-badge($es-primary);\n}\n\n// Required indicator\n.trait-required {\n color: $es-danger;\n font-size: $es-font-size-xs;\n}\n\n// Validation error\n.trait-validation-error {\n color: $es-danger;\n font-size: $es-font-size-xs;\n margin-top: 0.25rem;\n}\n\n// Trait toggle button\n.trait-toggle {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-md;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &.active {\n color: $es-primary;\n border-color: $es-primary;\n background: $es-primary-light;\n }\n}\n\n// =============================================================================\n// Trait Body\n// =============================================================================\n\n.condition-trait-body {\n padding: $es-spacing-lg;\n border-radius: 0 0 $es-radius-lg $es-radius-lg;\n background: $es-white;\n animation: slideDown 0.2s ease-out;\n}\n\n// Condition trait collapsed - hide body\n.condition-trait.collapsed .condition-trait-body {\n display: none;\n}\n\n// =============================================================================\n// Section Styles\n// =============================================================================\n\n.schedule-section,\n.context-section {\n margin-bottom: 1.25rem;\n padding-bottom: 1.25rem;\n border-bottom: 1px solid $es-slate-100;\n\n &:last-child {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: 0;\n }\n}\n\n.section-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 13px;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-600;\n margin-bottom: $es-spacing-md;\n\n i {\n font-size: $es-font-size-sm;\n color: $es-slate-400;\n margin-right: 0.25rem;\n }\n}\n\n.section-content {\n // Container for section content\n}\n\n.section-hint {\n margin-top: 0.5rem;\n font-size: 11px;\n color: $es-slate-400;\n}\n\n// =============================================================================\n// Full-width Form Group Override\n// =============================================================================\n\n.form-group.condition-trait-fullwidth {\n display: block !important;\n\n > .control-label {\n display: none !important;\n }\n\n > .col-lg-8,\n > .col-lg-8.col-lg-offset-3 {\n width: 100% !important;\n max-width: 100% !important;\n flex: 0 0 100% !important;\n padding-left: $es-spacing-lg !important;\n padding-right: $es-spacing-lg !important;\n margin: 0 !important;\n margin-left: 0 !important;\n }\n}\n\n// Condition traits group label\n.condition-traits-group-label {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-slate-700;\n margin-bottom: $es-spacing-md;\n}\n\n.condition-traits-wrapper {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-md;\n}\n\n// =============================================================================\n// Collapse Header (form-content layout)\n// =============================================================================\n\n.entity-selector-collapse-header {\n padding: 0;\n margin-bottom: $es-spacing-sm;\n\n .btn-collapse-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0;\n background: none;\n border: none;\n color: $es-primary;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: color $es-transition-fast;\n\n &:hover {\n color: $es-primary-hover;\n }\n\n .collapse-icon {\n font-size: 1.25rem;\n transition: transform 0.2s;\n }\n\n .collapse-label {\n font-weight: $es-font-weight-medium;\n }\n }\n}\n\n// When collapsed, rotate icon\n.condition-trait.collapsed .entity-selector-collapse-header {\n .collapse-icon {\n // Icon already shows expand_more when collapsed\n }\n}\n\n// =============================================================================\n// Animations\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 * Combination Attributes Picker Component\n * Product attribute combination selection styles\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Main container\n .combination-attributes-picker {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n }\n\n // Mode toggle (Any/All)\n .combination-mode-toggle {\n display: inline-flex;\n gap: 0.25rem;\n padding: 0.125rem;\n background: $es-slate-100;\n border-radius: $es-radius-md;\n margin-bottom: 0.5rem;\n }\n\n .combination-mode-option {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n cursor: pointer;\n font-size: 11px;\n color: $es-text-muted;\n padding: 0.25rem 0.625rem;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n input[type=\"radio\"] {\n display: none;\n }\n\n .mode-label {\n user-select: none;\n }\n\n &:hover {\n color: $es-primary;\n background: rgba($es-primary, 0.1);\n }\n\n &:has(input[type=\"radio\"]:checked) {\n background: $es-primary;\n color: $es-white;\n font-weight: $es-font-weight-medium;\n }\n }\n\n // Groups container\n .combination-groups-container {\n display: flex;\n flex-wrap: wrap;\n gap: $es-spacing-md;\n }\n\n // Loading/Empty/Error states\n .combination-loading,\n .combination-empty,\n .combination-error {\n color: $es-text-muted;\n font-style: italic;\n padding: 0.5rem;\n }\n\n .combination-error {\n color: $es-danger;\n }\n\n // Section header\n .combinations-section {\n margin-bottom: $es-spacing-md;\n }\n\n .combinations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $es-spacing-sm;\n }\n\n .combinations-label {\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-muted;\n }\n\n .combinations-help {\n font-size: 11px;\n color: $es-slate-400;\n }\n\n // Toggle combinations button\n .btn-toggle-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-primary;\n background: transparent;\n border: 1px solid $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n }\n\n .btn-remove-combinations {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n font-size: $es-font-size-xs;\n color: $es-danger;\n background: transparent;\n\n &:hover {\n text-decoration: underline;\n }\n }\n\n // =============================================================================\n // Attribute Group\n // =============================================================================\n\n .comb-attr-group {\n flex: none;\n min-width: 120px;\n max-width: 200px;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n overflow: hidden;\n\n &.has-selections {\n border-color: $es-primary;\n }\n }\n\n .comb-attr-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.375rem 0.625rem;\n background: $es-slate-100;\n border-bottom: 1px solid $es-gray-300;\n font-weight: $es-font-weight-semibold;\n font-size: $es-font-size-xs;\n color: $es-slate-800;\n\n .comb-attr-group.has-selections & {\n background: $es-cyan-50;\n border-bottom-color: $es-cyan-200;\n }\n }\n\n .comb-attr-group-name {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .comb-attr-group-count {\n flex-shrink: 0;\n min-width: 18px;\n height: 18px;\n padding: 0 0.25rem;\n background: $es-gray-300;\n border-radius: $es-radius-full;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n line-height: 18px;\n text-align: center;\n color: $es-text-muted;\n\n .comb-attr-group.has-selections & {\n background: $es-primary;\n color: $es-white;\n }\n }\n\n // Toolbar\n .comb-attr-toolbar {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.375rem;\n background: $es-slate-50;\n border-bottom: 1px solid $es-slate-100;\n }\n\n .comb-toolbar-btn {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n background: $es-white;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n color: $es-text-muted;\n cursor: pointer;\n font-size: $es-font-size-xs;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-400;\n color: $es-slate-800;\n }\n }\n\n .comb-attr-search {\n flex: 1;\n min-width: 60px;\n padding: 0.125rem 0.375rem;\n border: 1px solid $es-gray-300;\n border-radius: $es-radius-sm;\n font-size: 11px;\n outline: none;\n\n &:focus {\n border-color: $es-primary;\n }\n\n &::placeholder {\n color: $es-slate-400;\n }\n }\n\n // Values container\n .comb-attr-values {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.375rem;\n max-height: 150px;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .comb-attr-loading,\n .comb-attr-empty,\n .comb-attr-error {\n width: 100%;\n text-align: center;\n color: $es-slate-400;\n font-size: 11px;\n padding: 0.25rem;\n }\n\n .comb-attr-error {\n color: $es-danger;\n }\n\n // Individual value\n .comb-attr-value {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.5rem;\n background: $es-white;\n border: 1px solid $es-slate-400;\n border-radius: 0.75rem;\n font-size: 11px;\n color: $es-slate-600;\n cursor: pointer;\n transition: all $es-transition-fast;\n white-space: nowrap;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-text-muted;\n }\n\n &.selected {\n background: $es-primary;\n border-color: $es-primary-hover;\n color: $es-white;\n\n &:hover {\n background: $es-primary-hover;\n border-color: color.adjust($es-primary-hover, $lightness: -5%);\n }\n }\n }\n\n .comb-attr-value-count {\n font-size: 9px;\n color: $es-slate-400;\n background: $es-slate-100;\n padding: 1px 0.25rem;\n border-radius: 0.5rem;\n min-width: 14px;\n text-align: center;\n\n .comb-attr-value.selected & {\n color: $es-white;\n background: rgba(255, 255, 255, 0.3);\n }\n }\n\n // =============================================================================\n // Combination Conditions (Row-based)\n // =============================================================================\n\n .combination-conditions-container {\n display: flex;\n flex-direction: column;\n gap: $es-spacing-sm;\n }\n\n .combination-condition-row {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-sm;\n background: $es-slate-50;\n border-radius: $es-radius-sm;\n }\n\n .combination-group-select,\n .combination-values-select {\n flex: 1;\n min-width: 120px;\n }\n\n .combination-equals {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n padding: 0 0.25rem;\n }\n\n .btn-add-combination-condition {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.75rem;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-primary;\n background: transparent;\n border: 1px dashed $es-primary;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-primary-light;\n }\n\n i {\n font-size: 10px;\n }\n }\n\n .btn-remove-combination-row {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: rgba($es-danger, 0.1);\n color: $es-danger;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n","/**\n * Method Dropdown Component\n * Custom select dropdown with icons for method selection\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n.target-conditions-trait,\n.entity-selector-trait {\n\n // Method dropdown trigger button\n .method-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n height: 36px;\n padding: 0 $es-spacing-md;\n border-radius: $es-radius-md;\n background: $es-white;\n color: $es-slate-800;\n font-size: $es-font-size-sm;\n cursor: pointer;\n transition: all $es-transition-fast;\n min-width: 180px;\n max-width: 320px;\n border: 1px solid $es-border-color;\n\n &:hover {\n background: $es-slate-50;\n border-color: $es-gray-300;\n }\n\n &:focus,\n &:active {\n outline: none;\n border-color: $es-primary;\n box-shadow: 0 0 0 3px rgba($es-primary, 0.1);\n }\n }\n\n .method-trigger-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n flex-shrink: 0;\n width: 18px;\n text-align: center;\n }\n\n .method-trigger-label {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: $es-font-weight-medium;\n }\n\n .method-trigger-caret {\n font-size: $es-font-size-xs;\n color: $es-slate-400;\n flex-shrink: 0;\n margin-left: auto;\n }\n\n // Locked state\n .selector-locked .method-dropdown-trigger {\n background: $es-slate-100;\n color: $es-slate-400;\n cursor: not-allowed;\n border-color: $es-border-color;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-border-color;\n }\n }\n\n // Method selector wrapper\n .method-selector-wrapper {\n position: relative;\n }\n\n // Hidden select (for form submission)\n .method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n }\n}\n\n// Global fallback for hidden method selects\n.method-select-hidden {\n position: absolute !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n}\n\n// =============================================================================\n// Method Dropdown Menu (appended to body, outside trait wrappers)\n// =============================================================================\n\n.method-dropdown-menu {\n position: absolute;\n z-index: $es-z-dropdown + 1;\n min-width: 200px;\n max-width: 360px;\n max-height: 400px;\n overflow-y: auto;\n background: $es-white;\n border-radius: $es-radius-lg;\n padding: 0.375rem 0;\n border: 1px solid $es-border-color;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n animation: methodDropdownFadeIn 0.15s ease;\n @include custom-scrollbar;\n}\n\n@keyframes methodDropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n// Method dropdown item\n.method-dropdown-item {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.5rem $es-spacing-md;\n cursor: pointer;\n transition: background-color 0.1s;\n position: relative;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: rgba($es-primary, 0.08);\n }\n\n .method-item-icon {\n font-size: $es-font-size-sm;\n color: $es-text-muted;\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n }\n\n &.selected .method-item-icon {\n color: $es-primary;\n }\n\n .method-item-label {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-slate-700;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.selected .method-item-label {\n color: $es-cyan-700;\n font-weight: $es-font-weight-medium;\n }\n\n .method-item-check {\n font-size: $es-font-size-xs;\n flex-shrink: 0;\n margin-left: auto;\n color: $es-primary;\n }\n}\n\n// Method dropdown optgroup\n.method-dropdown-optgroup {\n margin-top: 0.25rem;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.method-optgroup-label {\n padding: 0.5rem $es-spacing-md;\n font-size: 11px;\n font-weight: $es-font-weight-semibold;\n color: $es-text-muted;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: $es-slate-50;\n border-top: 1px solid $es-slate-100;\n border-bottom: 1px solid $es-slate-100;\n\n .method-dropdown-optgroup:first-child & {\n border-top: 0;\n }\n}\n\n.method-optgroup-items {\n padding: 0.25rem 0;\n\n .method-dropdown-item {\n padding-left: $es-spacing-lg;\n }\n}\n\n// Method info placeholder\n.method-info-placeholder {\n font-size: $es-font-size-xs;\n color: $es-text-muted;\n font-style: italic;\n}\n","/**\n * Tooltip Component\n * Info tooltips for method help\n */\n\n@use '../variables' as *;\n\n// =============================================================================\n// Info Wrapper (tooltip trigger)\n// =============================================================================\n\n.mpr-info-wrapper {\n display: inline-flex;\n align-items: center;\n position: relative;\n cursor: help;\n vertical-align: middle;\n margin-left: 0.25rem;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n transition: color 0.15s ease;\n }\n\n &:hover .material-icons {\n color: $es-primary;\n }\n}\n\n// =============================================================================\n// Fixed Tooltip (appended to body on hover)\n// =============================================================================\n\n.mpr-tooltip-fixed {\n position: fixed;\n background: $es-white;\n color: $es-slate-800;\n padding: $es-spacing-md $es-spacing-lg;\n border-radius: $es-radius-md;\n font-size: 13px;\n line-height: 1.5;\n white-space: normal;\n z-index: 10500;\n max-width: 320px;\n min-width: 180px;\n text-align: left;\n box-shadow: rgba(0, 0, 0, 0.12) 0px 1px 1px 0px,\n rgba(64, 68, 82, 0.16) 0px 0px 0px 1px,\n rgba(64, 68, 82, 0.08) 0px 2px 5px 0px;\n pointer-events: none;\n\n // Pinned tooltip allows interaction\n &.pinned {\n pointer-events: auto;\n padding-right: $es-spacing-xl + 1rem;\n }\n\n strong {\n display: block;\n margin-bottom: 0.375rem;\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n p {\n margin: 0;\n color: $es-text-secondary;\n }\n\n ul {\n margin: 0.5rem 0 0;\n padding-left: 1.25rem;\n\n li {\n margin: 0.25rem 0;\n color: $es-text-secondary;\n }\n }\n}\n\n// Close button for pinned tooltips\n.mpr-tooltip-close {\n position: absolute;\n top: 0.375rem;\n right: 0.375rem;\n padding: 0.125rem;\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: $es-radius-sm;\n line-height: 1;\n transition: background-color 0.15s ease;\n\n .material-icons {\n font-size: 16px;\n color: $es-text-muted;\n }\n\n &:hover {\n background: $es-slate-100;\n\n .material-icons {\n color: $es-slate-700;\n }\n }\n}\n","/**\n * Category Tree Component\n * Hierarchical tree view for category selection inside dropdown\n */\n\n@use \"sass:color\";\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Category tree container (inside dropdown)\n.category-tree {\n display: flex;\n flex-direction: column;\n}\n\n// Tree toolbar inside dropdown\n.category-tree .tree-toolbar {\n display: flex;\n align-items: center;\n gap: $es-spacing-sm;\n padding: $es-spacing-xs $es-spacing-sm;\n background: $es-slate-50;\n border-bottom: 1px solid $es-border-light;\n flex-shrink: 0;\n\n .btn-expand-all,\n .btn-collapse-all {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: $es-spacing-xs $es-spacing-sm;\n font-size: $es-font-size-xs;\n font-weight: $es-font-weight-medium;\n color: $es-text-secondary;\n background: $es-white;\n border: 1px solid $es-border-color;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n border-color: $es-slate-300;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n// Tree items container\n.category-tree .tree-items {\n padding: 0;\n}\n\n// Tree item\n.tree-item {\n display: flex;\n align-items: center;\n gap: $es-spacing-xs;\n padding: $es-spacing-xs $es-spacing-sm;\n cursor: pointer;\n transition: background $es-transition-fast;\n border-radius: 0;\n\n &:hover {\n background: $es-slate-100;\n }\n\n &.selected {\n background: $es-primary-light;\n\n .tree-name {\n font-weight: $es-font-weight-semibold;\n color: $es-primary;\n }\n\n .tree-checkbox {\n color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n }\n\n &.inactive {\n opacity: 0.6;\n\n .tree-name {\n font-style: italic;\n }\n }\n\n &.filtered-out {\n display: none;\n }\n\n &.filter-match {\n background: $es-warning-light;\n\n &.selected {\n background: $es-primary-light;\n }\n }\n}\n\n// All tree element styles nested under .category-tree for specificity\n.category-tree {\n // Tree indentation\n .tree-indent {\n flex-shrink: 0;\n }\n\n // Tree toggle (expand/collapse)\n .tree-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-secondary;\n flex-shrink: 0;\n border-radius: $es-radius-sm;\n transition: all $es-transition-fast;\n cursor: pointer;\n\n &:hover {\n background: $es-slate-200;\n color: $es-text-primary;\n }\n\n &.tree-leaf {\n cursor: default;\n visibility: hidden;\n\n &:hover {\n background: transparent;\n }\n }\n\n i {\n font-size: 10px;\n transition: transform $es-transition-fast;\n }\n }\n\n .tree-item.collapsed > .tree-toggle i {\n transform: rotate(-90deg);\n }\n\n // Tree checkbox indicator - 12x12 to match PrestaShop admin standards\n .tree-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n flex-shrink: 0;\n border: 1px solid $es-border-color;\n border-radius: 2px;\n background: $es-white;\n\n i {\n font-size: 8px;\n opacity: 0;\n color: $es-white;\n transition: opacity $es-transition-fast;\n }\n }\n\n .tree-item.selected .tree-checkbox {\n background: $es-primary;\n border-color: $es-primary;\n\n i {\n opacity: 1;\n }\n }\n\n // Tree icon\n .tree-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n flex-shrink: 0;\n\n i {\n font-size: 12px; // match visual weight of other icons\n }\n }\n\n .tree-item.selected .tree-icon {\n color: $es-primary;\n }\n\n // Tree name\n .tree-name {\n flex: 1;\n font-size: $es-font-size-sm;\n color: $es-text-primary;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // Tree product/page count with preview\n .tree-count {\n @include count-badge($es-primary);\n height: 18px;\n min-width: 18px;\n padding: 0 $es-spacing-sm;\n\n i {\n font-size: 10px;\n }\n\n &.clickable {\n &.loading {\n pointer-events: none;\n\n i {\n animation: spin 1s linear infinite;\n }\n }\n\n &.popover-open {\n background: color.adjust($es-primary, $lightness: -10%);\n }\n }\n }\n\n // Select children button - positioned on the left next to toggle\n .btn-select-children {\n @include button-reset;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n opacity: 0.3;\n transition: all $es-transition-fast;\n flex-shrink: 0;\n\n i {\n font-size: 14px; // larger to visually match other icons\n }\n\n &:hover {\n color: $es-primary;\n opacity: 1;\n }\n }\n\n .tree-item:hover .btn-select-children {\n opacity: 0.6;\n }\n\n // Tree badge (inactive, etc.)\n .tree-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem $es-spacing-xs;\n font-size: 9px;\n font-weight: $es-font-weight-semibold;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n\n &.inactive {\n color: $es-warning;\n background: $es-warning-light;\n }\n }\n\n // Tree children container\n .tree-children {\n display: block;\n\n &.filter-expanded {\n display: block !important;\n }\n }\n\n .tree-item.collapsed + .tree-children {\n display: none;\n }\n\n // Filtering - must be inside .category-tree for specificity\n .tree-item.filtered-out {\n display: none !important;\n }\n} // end .category-tree\n\n// Loading/empty/error states\n.category-tree .tree-loading,\n.category-tree .dropdown-empty,\n.category-tree .dropdown-error {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $es-spacing-xl;\n color: $es-text-muted;\n font-size: $es-font-size-sm;\n\n i {\n margin-right: $es-spacing-sm;\n }\n}\n\n.category-tree .dropdown-error {\n color: $es-danger;\n}\n\n// Tree view mode in dropdown\n.target-search-dropdown.view-tree {\n .dropdown-results {\n padding: 0;\n }\n\n .category-tree {\n max-height: 100%;\n overflow-y: auto;\n @include custom-scrollbar;\n }\n\n .tree-items {\n max-height: calc(100% - 40px);\n overflow-y: auto;\n @include custom-scrollbar;\n }\n}\n","/**\n * Validation Toast Component\n * Error notifications for selection conflicts\n */\n\n@use '../variables' as *;\n@use '../mixins' as *;\n\n// Validation error toast\n.es-validation-toast {\n display: flex;\n align-items: flex-start;\n gap: $es-spacing-sm;\n padding: $es-spacing-md;\n background: $es-white;\n border: 1px solid $es-danger;\n border-left: 4px solid $es-danger;\n border-radius: $es-radius-md;\n box-shadow: $es-shadow-lg;\n max-width: 400px;\n animation: es-toast-slide-in 0.2s ease-out;\n\n .es-toast-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: $es-danger;\n flex-shrink: 0;\n\n i {\n font-size: 18px;\n }\n }\n\n .es-toast-content {\n flex: 1;\n min-width: 0;\n }\n\n .es-toast-title {\n font-size: $es-font-size-sm;\n font-weight: $es-font-weight-semibold;\n color: $es-danger;\n margin-bottom: 2px;\n }\n\n .es-toast-message {\n font-size: $es-font-size-xs;\n color: $es-text-secondary;\n line-height: 1.4;\n }\n\n .es-toast-close {\n @include button-reset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: $es-text-muted;\n border-radius: $es-radius-sm;\n flex-shrink: 0;\n transition: all $es-transition-fast;\n\n &:hover {\n background: $es-slate-100;\n color: $es-text-primary;\n }\n\n i {\n font-size: 12px;\n }\n }\n}\n\n@keyframes es-toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n"]} \ No newline at end of file diff --git a/assets/js/admin/entity-selector.js.bak b/assets/js/admin/entity-selector.js.bak new file mode 100644 index 0000000..ea22f35 --- /dev/null +++ b/assets/js/admin/entity-selector.js.bak @@ -0,0 +1,10186 @@ +/** + * Entity Selector - Utilities Module + * Helper functions: escape, validation, icons, search history + * @partial _utils.js (must be loaded first) + * + * EXTRACTION SOURCE: assets/js/admin/entity-selector.js + * Lines: 7552-7570 (escapeHtml, escapeAttr) + * 7577-7590 (getEntityTypeLabel) + * 6289-6350 (validate, showValidationError, clearValidationError) + * 7115-7137 (showRangeInputError) + * 7728-7745 (getBlockMode, isBlockSingleMode) + * 7707-7723 (getCurrentSingleSelection) + * 5411-5467 (search history methods) + */ + +(function($) { + 'use strict'; + + // Create mixin namespace + window._EntitySelectorMixins = window._EntitySelectorMixins || {}; + + // Utility functions mixin + window._EntitySelectorMixins.utils = { + + /** + * Debounce function - delays execution until after wait milliseconds + * @param {Function} func - Function to debounce + * @param {number} wait - Milliseconds to wait + * @returns {Function} Debounced function + */ + debounce: function(func, wait) { + var timeout; + return function() { + var context = this; + var args = arguments; + clearTimeout(timeout); + timeout = setTimeout(function() { + func.apply(context, args); + }, wait); + }; + }, + + escapeHtml: function(str) { + if (str === null || str === undefined) return ''; + return String(str) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }, + + escapeAttr: function(str) { + if (str === null || str === undefined) return ''; + return String(str) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }, + + getEntityTypeIcon: function(entityType) { + var icons = { + 'products': 'icon-shopping-cart', + 'categories': 'icon-folder-open', + 'manufacturers': 'icon-building', + 'suppliers': 'icon-truck', + 'attributes': 'icon-list-alt', + 'features': 'icon-tags', + 'cms': 'icon-file-text', + 'cms_categories': 'icon-folder' + }; + return icons[entityType] || 'icon-cube'; + }, + + getEntityTypeLabel: function(entityType) { + var trans = this.config.trans || {}; + var labels = { + 'products': trans.product || 'Product', + 'categories': trans.category || 'Category', + 'manufacturers': trans.manufacturer || 'Manufacturer', + 'suppliers': trans.supplier || 'Supplier', + 'attributes': trans.attribute || 'Attribute', + 'features': trans.feature || 'Feature', + 'cms': trans.cms_page || 'CMS Page', + 'cms_categories': trans.cms_category || 'CMS Category' + }; + return labels[entityType] || entityType; + }, + + validate: function() { + var isRequired = this.$wrapper.data('required') === 1 || this.$wrapper.data('required') === '1'; + if (!isRequired) return true; + + var hasData = false; + this.$wrapper.find('.target-block').each(function() { + if ($(this).find('.selection-group').length > 0) { + hasData = true; + return false; + } + }); + + if (!hasData) { + this.showValidationError(); + return false; + } + + this.clearValidationError(); + return true; + }, + + showValidationError: function() { + this.$wrapper.addClass('has-validation-error'); + var message = this.$wrapper.data('required-message') || 'Please select at least one item'; + this.$wrapper.find('.trait-validation-error').remove(); + var $error = $('
', { + class: 'trait-validation-error', + html: ' ' + message + }); + this.$wrapper.find('.condition-trait-header').after($error); + $('html, body').animate({ scrollTop: this.$wrapper.offset().top - 100 }, 300); + if (!this.$wrapper.find('.condition-trait-body').is(':visible')) { + this.$wrapper.find('.condition-trait-body').slideDown(200); + this.$wrapper.removeClass('collapsed'); + } + }, + + clearValidationError: function() { + this.$wrapper.removeClass('has-validation-error'); + this.$wrapper.find('.trait-validation-error').remove(); + }, + + getBlockMode: function(blockType) { + var blockDef = this.config.blocks[blockType]; + return (blockDef && blockDef.mode) ? blockDef.mode : 'multi'; + }, + + isBlockSingleMode: function(blockType) { + return this.getBlockMode(blockType) === 'single'; + }, + + getCurrentSingleSelection: function() { + if ((this.config.mode || 'multi') !== 'single') return null; + var $chip = this.$wrapper.find('.entity-chips .entity-chip').first(); + if ($chip.length) { + var $block = $chip.closest('.target-block'); + return { + name: $chip.find('.chip-name').text() || $chip.data('id'), + entityType: $block.data('block-type') || 'item' + }; + } + return null; + }, + + /** + * Check if entity type supports tree browsing + */ + supportsTreeBrowsing: function(entityType) { + return entityType === 'categories' || entityType === 'cms_categories'; + } + }; + +})(jQuery); + +/** + * Entity Selector - Events Module + * All event binding and handlers + * @partial _events.js + * + * Contains event handlers for: + * - Tab switching + * - Block/group collapse toggle + * - Dropdown open/close + * - Search input handling + * - Item selection/deselection + * - Group add/remove + * - Exclude row add/remove + * - Method select changes + * - Filter panel toggles + * - Keyboard shortcuts (Ctrl+A, Ctrl+D, Esc, Enter) + * - Load more pagination + * - Sort controls + * - View mode switching + * - Tree view events + * - Preview badge clicks + * - Pattern tag interactions + * - Combination picker events + * - Group modifier events + */ + +(function($) { + 'use strict'; + + window._EntitySelectorMixins = window._EntitySelectorMixins || {}; + + window._EntitySelectorMixins.events = { + + bindEvents: function() { + var self = this; + + // Tab switching + this.$wrapper.on('click', '.target-block-tab', function(e) { + e.preventDefault(); + var blockType = $(this).data('blockType'); + self.switchToBlock(blockType); + }); + + // Tab badge click for preview popover (toggle) + this.$wrapper.on('click', '.target-block-tab .tab-badge', function(e) { + e.stopPropagation(); + e.preventDefault(); + + var $tab = $(this).closest('.target-block-tab'); + var $badge = $(this); + + if ($badge.hasClass('popover-open')) { + self.hidePreviewPopover(); + } else { + self.showPreviewPopover($tab); + } + }); + + // Condition count badge click for preview popover + this.$wrapper.on('click', '.condition-match-count.clickable', function(e) { + e.stopPropagation(); + e.preventDefault(); + + var $badge = $(this); + + if ($badge.hasClass('popover-open')) { + self.hidePreviewPopover(); + } else { + self.showConditionPreviewPopover($badge); + } + }); + + // Group count badge click for preview popover + this.$wrapper.on('click', '.group-count-badge.clickable', function(e) { + e.stopPropagation(); + e.preventDefault(); + + var $badge = $(this); + + if ($badge.hasClass('popover-open')) { + self.hidePreviewPopover(); + } else { + self.showGroupPreviewPopover($badge); + } + }); + + // Total count badge click for summary popover + this.$wrapper.on('click', '.trait-total-count', function(e) { + e.stopPropagation(); + e.preventDefault(); + + var $badge = $(this); + + if ($badge.hasClass('popover-open')) { + self.hidePreviewPopover(); + } else { + self.showTotalPreviewPopover($badge); + } + }); + + // Close popover when clicking outside + $(document).on('click', function(e) { + if (!$(e.target).closest('.target-preview-popover').length && + !$(e.target).closest('.tab-badge').length && + !$(e.target).closest('.condition-match-count').length && + !$(e.target).closest('.group-count-badge').length && + !$(e.target).closest('.group-modifiers').length && + !$(e.target).closest('.group-preview-badge').length && + !$(e.target).closest('.toggle-count.clickable').length && + !$(e.target).closest('.trait-total-count').length) { + self.hidePreviewPopover(); + } + }); + + // Block-level collapse toggle (click on header) + this.$wrapper.on('click', '.condition-trait-header', function(e) { + if ($(e.target).closest('.target-block-tabs').length || + $(e.target).closest('.trait-header-actions').length || + $(e.target).closest('.prestashop-switch').length || + $(e.target).closest('.trait-total-count').length) { + return; + } + var $body = self.$wrapper.find('.condition-trait-body'); + $body.stop(true, true); + if ($body.is(':visible')) { + $body.slideUp(200); + self.$wrapper.addClass('collapsed'); + } else { + $body.slideDown(200); + self.$wrapper.removeClass('collapsed'); + } + }); + + // Toggle blocks content (form-content layout) + this.$wrapper.on('click', '.btn-toggle-blocks', function(e) { + e.preventDefault(); + var $blocksContent = self.$wrapper.find('.entity-selector-blocks-content'); + var $icon = $(this).find('.material-icons'); + $blocksContent.stop(true, true); + if ($blocksContent.is(':visible')) { + $blocksContent.slideUp(200); + self.$wrapper.addClass('blocks-collapsed'); + $icon.text('expand_more'); + } else { + $blocksContent.slideDown(200); + self.$wrapper.removeClass('blocks-collapsed'); + $icon.text('expand_less'); + } + }); + + // Group-level collapse toggle (click on group header or toggle icon) + this.$wrapper.on('click', '.group-header', function(e) { + if ($(e.target).closest('.btn-remove-group, .group-name-input').length) { + return; + } + if (self.$wrapper.data('mode') === 'single') { + return; + } + var $group = $(this).closest('.selection-group'); + $group.toggleClass('collapsed'); + }); + + // Toggle all groups (single button that switches between expand/collapse) + this.$wrapper.on('click', '.trait-header-actions .btn-toggle-groups', function(e) { + e.preventDefault(); + e.stopPropagation(); + var $btn = $(this); + var currentState = $btn.attr('data-state') || 'collapsed'; + var trans = self.config.trans || {}; + + if (currentState === 'collapsed') { + self.$wrapper.find('.selection-group').removeClass('collapsed'); + $btn.attr('data-state', 'expanded'); + $btn.attr('title', trans.collapse_all || 'Collapse all groups'); + $btn.find('i').removeClass('icon-expand').addClass('icon-compress'); + } else { + self.$wrapper.find('.selection-group').addClass('collapsed'); + $btn.attr('data-state', 'collapsed'); + $btn.attr('title', trans.expand_all || 'Expand all groups'); + $btn.find('i').removeClass('icon-compress').addClass('icon-expand'); + } + }); + + // Show all toggle change (legacy checkbox) + this.$wrapper.on('change', '.trait-show-all-toggle .show-all-checkbox', function(e) { + e.stopPropagation(); + var isChecked = $(this).prop('checked'); + if (isChecked) { + self.clearAllConditions(); + } + }); + + // Target switch change (PrestaShop native switch) + this.$wrapper.on('change', '.target-switch-toggle', function(e) { + e.stopPropagation(); + var value = $(this).val(); + if (value === '1') { + self.clearAllConditions(); + self.$wrapper.find('.condition-trait-body').slideUp(200); + self.$wrapper.addClass('collapsed'); + } else { + self.$wrapper.find('.condition-trait-body').slideDown(200); + self.$wrapper.removeClass('collapsed'); + } + }); + + // Add group + this.$wrapper.on('click', '.btn-add-group', function(e) { + e.preventDefault(); + var $block = $(this).closest('.target-block'); + var blockType = $block.data('blockType'); + self.addGroup($block, blockType); + }); + + // Remove group + this.$wrapper.on('click', '.btn-remove-group', function(e) { + e.preventDefault(); + var $group = $(this).closest('.selection-group'); + var $block = $(this).closest('.target-block'); + self.removeGroup($group, $block); + }); + + // Group name input - stop propagation to prevent collapse + this.$wrapper.on('click focus', '.group-name-input', function(e) { + e.stopPropagation(); + }); + + // Group name change + this.$wrapper.on('change blur', '.group-name-input', function() { + var $input = $(this); + var $group = $input.closest('.selection-group'); + var name = $.trim($input.val()); + $group.attr('data-group-name', name); + self.serializeAllBlocks(); + }); + + // Add exceptions (first exclude row) + this.$wrapper.on('click', '.btn-add-exclude', function(e) { + e.preventDefault(); + var $group = $(this).closest('.selection-group'); + var $block = $(this).closest('.target-block'); + self.addFirstExcludeRow($group, $block); + }); + + // Add another exclude row + this.$wrapper.on('click', '.btn-add-another-exclude', function(e) { + e.preventDefault(); + var $group = $(this).closest('.selection-group'); + var $block = $(this).closest('.target-block'); + self.addExcludeRow($group, $block); + }); + + // Remove individual exclude row + this.$wrapper.on('click', '.btn-remove-exclude-row', function(e) { + e.preventDefault(); + var $excludeRow = $(this).closest('.exclude-row'); + var $group = $(this).closest('.selection-group'); + var $block = $(this).closest('.target-block'); + self.removeExcludeRow($excludeRow, $group, $block); + }); + + // Include method change + this.$wrapper.on('change', '.include-method-select', function() { + self.hideDropdown(); + + var $group = $(this).closest('.selection-group'); + var $block = $(this).closest('.target-block'); + var $row = $group.find('.group-include'); + var blockType = $block.data('blockType'); + var blockDef = self.config.blocks[blockType] || {}; + var methods = blockDef.selection_methods || {}; + + var $option = $(this).find('option:selected'); + var valueType = $option.data('valueType') || 'none'; + var searchEntity = $option.data('searchEntity') || ''; + var methodOptions = $option.data('options') || null; + + var $oldPicker = $group.find('.include-picker'); + var newPickerHtml = self.buildValuePickerHtml('include', valueType, searchEntity, methods); + $oldPicker.replaceWith(newPickerHtml); + + if (valueType === 'select' && methodOptions) { + var $newPicker = $group.find('.include-picker'); + var $select = $newPicker.find('.select-value-input'); + $select.empty(); + $.each(methodOptions, function(key, label) { + $select.append(''); + }); + } + + if (valueType === 'multi_select_tiles' && methodOptions) { + var $newPicker = $group.find('.include-picker'); + var isExclusive = $option.data('exclusive') === true; + self.populateTiles($newPicker, methodOptions, isExclusive); + } + + if (valueType === 'multi_numeric_range') { + var $newPicker = $group.find('.include-picker'); + var step = $option.data('step'); + var min = $option.data('min'); + self.applyRangeInputConstraints($newPicker, step, min); + } + + if (valueType === 'combination_attributes') { + var $newPicker = $group.find('.include-picker'); + self.loadCombinationAttributeGroups($newPicker); + } + + var selectedMethod = $(this).val(); + self.updateMethodInfoPlaceholder($group.find('.method-selector-wrapper'), selectedMethod, blockType); + + self.updateBlockStatus($block); + self.serializeAllBlocks($row); + }); + + // Exclude method change (within an exclude row) + this.$wrapper.on('change', '.exclude-method-select', function() { + self.hideDropdown(); + + var $excludeRow = $(this).closest('.exclude-row'); + var $group = $(this).closest('.selection-group'); + var $block = $(this).closest('.target-block'); + var blockType = $block.data('blockType'); + var blockDef = self.config.blocks[blockType] || {}; + var methods = blockDef.selection_methods || {}; + + var $option = $(this).find('option:selected'); + var valueType = $option.data('valueType') || 'entity_search'; + var searchEntity = $option.data('searchEntity') || blockType; + var methodOptions = $option.data('options') || null; + + var $oldPicker = $excludeRow.find('.exclude-picker'); + var newPickerHtml = self.buildValuePickerHtml('exclude', valueType, searchEntity, methods); + $oldPicker.replaceWith(newPickerHtml); + + if (valueType === 'select' && methodOptions) { + var $newPicker = $excludeRow.find('.exclude-picker'); + var $select = $newPicker.find('.select-value-input'); + $select.empty(); + $.each(methodOptions, function(key, label) { + $select.append(''); + }); + } + + if (valueType === 'multi_select_tiles' && methodOptions) { + var $newPicker = $excludeRow.find('.exclude-picker'); + var isExclusive = $option.data('exclusive') === true; + self.populateTiles($newPicker, methodOptions, isExclusive); + } + + if (valueType === 'multi_numeric_range') { + var $newPicker = $excludeRow.find('.exclude-picker'); + var step = $option.data('step'); + var min = $option.data('min'); + self.applyRangeInputConstraints($newPicker, step, min); + } + + if (valueType === 'combination_attributes') { + var $newPicker = $excludeRow.find('.exclude-picker'); + self.loadCombinationAttributeGroups($newPicker); + } + + var selectedMethod = $(this).val(); + self.updateMethodInfoPlaceholder($excludeRow.find('.exclude-header-row'), selectedMethod, blockType); + + self.serializeAllBlocks($excludeRow); + }); + + // Handle pattern input Enter key - adds pattern as tag + this.$wrapper.on('keydown', '.pattern-input', function(e) { + if (e.keyCode === 13) { + e.preventDefault(); + var $btn = $(this).closest('.draft-tag').find('.btn-add-pattern'); + $btn.click(); + } + }); + + // Handle add pattern button click (in draft tag) + this.$wrapper.on('click', '.draft-tag .btn-add-pattern', function(e) { + e.preventDefault(); + e.stopPropagation(); + var $draftTag = $(this).closest('.draft-tag'); + var $picker = $draftTag.closest('.value-picker'); + var $row = $draftTag.closest('.group-include, .exclude-row'); + var $input = $draftTag.find('.pattern-input'); + var pattern = $.trim($input.val()); + + if (pattern) { + var caseSensitive = $draftTag.attr('data-case-sensitive') === '1'; + self.addPatternTag($picker, pattern, caseSensitive); + + $input.val('').focus(); + $draftTag.find('.pattern-match-count').removeClass('count-found count-zero').hide(); + $draftTag.find('.pattern-match-count .count-value').text(''); + + self.serializeAllBlocks($row); + } + }); + + // Handle pattern input live typing - update match count in draft tag + this.$wrapper.on('input', '.pattern-input', function() { + var $input = $(this); + var $draftTag = $input.closest('.draft-tag'); + if (!$draftTag.length) return; + + var pattern = $.trim($input.val()); + + if ($input.data('countTimeout')) { + clearTimeout($input.data('countTimeout')); + } + + var $matchCount = $draftTag.find('.pattern-match-count'); + + if (!pattern) { + $matchCount.removeClass('count-found count-zero').hide(); + $matchCount.find('.count-value').text(''); + var $group = $draftTag.closest('.selection-group'); + if ($group.length) { + self.updateGroupTotalCount($group); + } + return; + } + + var timeout = setTimeout(function() { + var caseSensitive = $draftTag.attr('data-case-sensitive') === '1'; + self.updateDraftTagCount($draftTag, pattern, caseSensitive); + }, 300); + $input.data('countTimeout', timeout); + }); + + // Handle pattern tag remove + this.$wrapper.on('click', '.pattern-tag .btn-remove-pattern', function(e) { + e.preventDefault(); + e.stopPropagation(); + var $row = $(this).closest('.group-include, .exclude-row'); + $(this).closest('.pattern-tag').remove(); + self.serializeAllBlocks($row); + }); + + // Handle pattern tag case-sensitivity toggle + this.$wrapper.on('click', '.pattern-tag .btn-toggle-case', function(e) { + e.preventDefault(); + e.stopPropagation(); + var $tag = $(this).closest('.pattern-tag'); + var $btn = $(this); + var trans = self.config.trans || {}; + var isDraftTag = $tag.hasClass('draft-tag'); + + var isCaseSensitive = $tag.data('caseSensitive') === 1 || $tag.data('caseSensitive') === '1' || $tag.attr('data-case-sensitive') === '1'; + var newCaseSensitive = !isCaseSensitive; + + $tag.data('caseSensitive', newCaseSensitive ? 1 : 0); + $tag.attr('data-case-sensitive', newCaseSensitive ? '1' : '0'); + $tag.toggleClass('case-sensitive', newCaseSensitive); + + $btn.find('.case-icon').text(newCaseSensitive ? 'Aa' : 'aa'); + var caseTitle = newCaseSensitive + ? (trans.case_sensitive || 'Case sensitive - click to toggle') + : (trans.case_insensitive || 'Case insensitive - click to toggle'); + $btn.attr('title', caseTitle); + + if (isDraftTag) { + var pattern = $.trim($tag.find('.pattern-input').val()); + if (pattern) { + self.updateDraftTagCount($tag, pattern, newCaseSensitive); + } + } else { + var $row = $tag.closest('.group-include, .exclude-row'); + self.serializeAllBlocks($row); + } + }); + + // Handle pattern match count click - show preview modal + this.$wrapper.on('click', '.pattern-match-count', function(e) { + e.preventDefault(); + e.stopPropagation(); + + var $matchCount = $(this); + var count = $matchCount.data('count'); + var pattern = $matchCount.data('pattern'); + var entityType = $matchCount.data('entityType'); + var caseSensitive = $matchCount.data('caseSensitive'); + + if (!count || count <= 0 || !pattern) { + return; + } + + self.showPatternPreviewModal(pattern, entityType, caseSensitive, count); + }); + + // Handle pattern tag edit (click on tag text) + this.$wrapper.on('click', '.pattern-tag .pattern-tag-text', function(e) { + e.preventDefault(); + var $tag = $(this).closest('.pattern-tag'); + if ($tag.hasClass('editing')) return; + + var currentPattern = $tag.data('pattern'); + + var $editInput = $('').val(currentPattern); + var $saveBtn = $(''); + var $cancelBtn = $(''); + var $editActions = $('').append($saveBtn, $cancelBtn); + + $tag.addClass('editing').find('.pattern-tag-text').hide(); + $tag.find('.btn-remove-pattern').hide(); + $tag.prepend($editActions).prepend($editInput); + $editInput.focus().select(); + + $editInput.on('keydown', function(ev) { + if (ev.keyCode === 13) { + ev.preventDefault(); + $saveBtn.click(); + } else if (ev.keyCode === 27) { + ev.preventDefault(); + $cancelBtn.click(); + } + }); + }); + + // Pattern edit - Save button + this.$wrapper.on('click', '.pattern-tag .btn-pattern-save', function(e) { + e.preventDefault(); + e.stopPropagation(); + var $tag = $(this).closest('.pattern-tag'); + var $editInput = $tag.find('.pattern-tag-edit'); + var currentPattern = $tag.data('pattern'); + var newPattern = $.trim($editInput.val()); + + if (newPattern && newPattern !== currentPattern) { + $tag.data('pattern', newPattern); + $tag.find('.pattern-tag-text').text(newPattern); + } + $editInput.remove(); + $tag.find('.pattern-edit-actions').remove(); + $tag.removeClass('editing').find('.pattern-tag-text, .btn-remove-pattern').show(); + var $row = $tag.closest('.group-include, .exclude-row'); + self.serializeAllBlocks($row); + }); + + // Pattern edit - Cancel button + this.$wrapper.on('click', '.pattern-tag .btn-pattern-cancel', function(e) { + e.preventDefault(); + e.stopPropagation(); + var $tag = $(this).closest('.pattern-tag'); + $tag.find('.pattern-tag-edit').remove(); + $tag.find('.pattern-edit-actions').remove(); + $tag.removeClass('editing').find('.pattern-tag-text, .btn-remove-pattern').show(); + }); + + // Handle mpr-info-wrapper tooltip with fixed positioning + this.$wrapper.on('mouseenter', '.mpr-info-wrapper[data-details]', function() { + var $wrapper = $(this); + if ($wrapper.data('tooltip-active')) return; + + var content = $wrapper.attr('data-details'); + var tooltipClass = $wrapper.attr('data-tooltip-class') || ''; + var $tooltip = $('
', { class: 'mpr-tooltip mpr-tooltip-fixed ' + tooltipClass, html: content }); + + $('body').append($tooltip); + $wrapper.data('tooltip-active', true); + + var offset = $wrapper.offset(); + var triggerWidth = $wrapper.outerWidth(); + var tooltipWidth = $tooltip.outerWidth(); + var tooltipHeight = $tooltip.outerHeight(); + + var left = offset.left + (triggerWidth / 2) - (tooltipWidth / 2); + var top = offset.top - tooltipHeight - 10; + + if (left < 10) left = 10; + if (left + tooltipWidth > $(window).width() - 10) { + left = $(window).width() - tooltipWidth - 10; + } + + $tooltip.css({ + position: 'fixed', + left: left + 'px', + top: (top - $(window).scrollTop()) + 'px' + }); + + $wrapper.data('tooltip-el', $tooltip); + }); + + this.$wrapper.on('mouseleave', '.mpr-info-wrapper[data-details]', function() { + var $wrapper = $(this); + var $tooltip = $wrapper.data('tooltip-el'); + if ($tooltip) { + $tooltip.remove(); + } + $wrapper.data('tooltip-active', false); + $wrapper.data('tooltip-el', null); + }); + + // Handle numeric range input changes + this.$wrapper.on('change', '.range-min-input, .range-max-input', function() { + var $row = $(this).closest('.group-include, .exclude-row'); + self.serializeAllBlocks($row); + }); + + // Handle date range input changes + this.$wrapper.on('change', '.date-from-input, .date-to-input', function() { + var $row = $(this).closest('.group-include, .exclude-row'); + self.serializeAllBlocks($row); + }); + + // Handle select value changes + this.$wrapper.on('change', '.select-value-input', function() { + var $row = $(this).closest('.group-include, .exclude-row'); + self.serializeAllBlocks($row); + }); + + // Handle multi-range add button click + this.$wrapper.on('click', '.btn-add-range', function(e) { + e.preventDefault(); + var $picker = $(this).closest('.value-picker'); + var $row = $(this).closest('.group-include, .exclude-row'); + var $container = $picker.find('.multi-range-container'); + var $chipsContainer = $container.find('.multi-range-chips'); + var $minInput = $container.find('.range-min-input'); + var $maxInput = $container.find('.range-max-input'); + + var minVal = $minInput.val().trim(); + var maxVal = $maxInput.val().trim(); + + if (minVal === '' && maxVal === '') { + return; + } + + var step = parseFloat($minInput.attr('step')) || 0.01; + var minAllowed = $minInput.attr('min'); + var hasMinConstraint = typeof minAllowed !== 'undefined' && minAllowed !== ''; + minAllowed = hasMinConstraint ? parseFloat(minAllowed) : null; + + var minNum = minVal !== '' ? parseFloat(minVal) : null; + var maxNum = maxVal !== '' ? parseFloat(maxVal) : null; + + if (hasMinConstraint) { + if (minNum !== null && minNum < minAllowed) { + self.showRangeInputError($minInput, self.config.trans.min_value_error || 'Minimum value is ' + minAllowed); + return; + } + if (maxNum !== null && maxNum < minAllowed) { + self.showRangeInputError($maxInput, self.config.trans.min_value_error || 'Minimum value is ' + minAllowed); + return; + } + } + + if (minNum !== null && maxNum !== null && minNum > maxNum) { + self.showRangeInputError($minInput, self.config.trans.min_greater_than_max || 'Min cannot be greater than max'); + return; + } + + var decimals = step < 1 ? String(step).split('.')[1].length : 0; + if (minNum !== null) { + if (step >= 1) { + minNum = Math.round(minNum); + } else { + minNum = parseFloat(minNum.toFixed(decimals)); + } + minVal = String(minNum); + } + if (maxNum !== null) { + if (step >= 1) { + maxNum = Math.round(maxNum); + } else { + maxNum = parseFloat(maxNum.toFixed(decimals)); + } + maxVal = String(maxNum); + } + + var chipText = ''; + if (minVal !== '' && maxVal !== '') { + chipText = minVal + ' - ' + maxVal; + } else if (minVal !== '') { + chipText = '≥ ' + minVal; + } else { + chipText = '≤ ' + maxVal; + } + + var $chip = $('', { + class: 'range-chip', + 'data-min': minVal, + 'data-max': maxVal + }); + $chip.append($('', { class: 'range-chip-text', text: chipText })); + $chip.append($(''; + html += ''; + + // Sort controls - options with data-entities attribute for entity-specific filtering + html += '
'; + html += ''; + html += ''; + + // View mode selector - Tree option always present, shown for categories + html += ''; + html += '
'; // End sort-controls + + // Refine search + html += '
'; + html += ''; + html += ''; + html += ''; + html += '
'; + + // Filter toggle button + html += ''; + + // History button + html += ''; + + html += '
'; // End dropdown-actions + html += '
'; // End dropdown-header + + // Filter panel + html += '
'; + + // Quick filters row (for products) + html += '
'; + html += ''; + html += ''; + + // Price range + html += '
'; + html += '' + (trans.price || 'Price') + ':'; + html += ''; + html += '-'; + html += ''; + html += '
'; + + html += ''; + html += '
'; + + // Attribute/Feature filter toggles for products + html += ''; + html += ''; + + html += ''; + html += ''; + + // Entity-specific filters: Categories + html += ''; + + // Entity-specific filters: Manufacturers + html += ''; + + // Entity-specific filters: Suppliers + html += ''; + + // Entity-specific filters: Attributes + html += ''; + + // Entity-specific filters: Features + html += ''; + + // Entity-specific filters: CMS Pages + html += ''; + + // Entity-specific filters: CMS Categories + html += ''; + + html += '
'; // End filter-panel + + // Results header for list view (product columns) + html += '
'; + html += ''; + html += '' + (trans.product || 'Product') + ''; + html += '' + (trans.price || 'Price') + ''; + html += '' + (trans.sale || 'Sale') + ''; + html += '' + (trans.stock || 'Stock') + ''; + html += '' + (trans.sold || 'Sold') + ''; + html += '
'; + + // Results + html += ''; + + // Footer - unified load more + actions + html += ''; + + html += ''; + + this.$dropdown = $(html); + $('body').append(this.$dropdown); + }, + + hideDropdown: function() { + if (this.$dropdown) { + this.$dropdown.removeClass('show'); + } + this.activeGroup = null; + }, + + positionDropdown: function($input) { + if (!this.$dropdown) return; + + var $picker = $input.closest('.value-picker'); + var $searchBox = $input.closest('.entity-search-box'); + + // Get absolute positions (dropdown is appended to body) + var searchBoxOffset = $searchBox.offset(); + var searchBoxHeight = $searchBox.outerHeight(); + var pickerOffset = $picker.offset(); + var pickerWidth = $picker.outerWidth(); + + // Calculate position relative to document + var dropdownTop = searchBoxOffset.top + searchBoxHeight + 4; + var dropdownLeft = pickerOffset.left; + var dropdownWidth = Math.max(pickerWidth, 400); + + // Ensure dropdown doesn't overflow the viewport horizontally + var viewportWidth = $(window).width(); + if (dropdownLeft + dropdownWidth > viewportWidth - 10) { + dropdownWidth = viewportWidth - dropdownLeft - 10; + } + + // Ensure dropdown doesn't overflow viewport vertically + var viewportHeight = $(window).height(); + var scrollTop = $(window).scrollTop(); + var maxHeight = viewportHeight - (dropdownTop - scrollTop) - 20; + maxHeight = Math.max(maxHeight, 400); + + this.$dropdown.css({ + position: 'absolute', + top: dropdownTop, + left: dropdownLeft, + width: dropdownWidth, + maxHeight: maxHeight, + zIndex: 10000 + }); + + // Show the dropdown + this.$dropdown.addClass('show'); + } + }; + +})(jQuery); + +/** + * Entity Selector - Search Module + * AJAX search, results rendering, category tree, filters, search history + * @partial _search.js + */ + +(function($) { + 'use strict'; + + window._EntitySelectorMixins = window._EntitySelectorMixins || {}; + + window._EntitySelectorMixins.search = { + + // Category tree cache + categoryTreeCache: null, + + /** + * Perform AJAX search for entities + */ + performSearch: function(appendMode) { + var self = this; + + if (!this.activeGroup) return; + + this.isLoading = true; + + var searchEntity = this.activeGroup.searchEntity; + + // Build request data with sort and filter params + var limit = appendMode && this.loadMoreCount ? this.loadMoreCount : 20; + var requestData = { + ajax: 1, + action: 'searchTargetEntities', + trait: 'EntitySelector', + entity_type: searchEntity, + q: this.searchQuery, + limit: limit, + offset: appendMode ? this.searchOffset : 0, + sort_by: this.currentSort ? this.currentSort.field : 'name', + sort_dir: this.currentSort ? this.currentSort.dir : 'ASC' + }; + + // Add refine query if present + if (this.refineQuery) { + requestData.refine = this.refineQuery; + if (this.refineNegate) { + requestData.refine_negate = 1; + } + } + + // Add product-specific filters + if (searchEntity === 'products' && this.filters) { + if (this.filters.inStock) { + requestData.filter_in_stock = 1; + } + if (this.filters.discounted) { + requestData.filter_discounted = 1; + } + if (this.filters.priceMin !== null && this.filters.priceMin !== '') { + requestData.filter_price_min = this.filters.priceMin; + } + if (this.filters.priceMax !== null && this.filters.priceMax !== '') { + requestData.filter_price_max = this.filters.priceMax; + } + if (this.filters.attributes && this.filters.attributes.length > 0) { + requestData.filter_attributes = JSON.stringify(this.filters.attributes); + } + if (this.filters.features && this.filters.features.length > 0) { + requestData.filter_features = JSON.stringify(this.filters.features); + } + } + + // Add entity-specific filters for non-product entities + if (searchEntity !== 'products' && this.filters) { + // Product count range (categories, manufacturers, suppliers, attributes, features) + if (this.filters.productCountMin !== null && this.filters.productCountMin !== '') { + requestData.filter_product_count_min = this.filters.productCountMin; + } + if (this.filters.productCountMax !== null && this.filters.productCountMax !== '') { + requestData.filter_product_count_max = this.filters.productCountMax; + } + + // Category-specific + if (searchEntity === 'categories') { + if (this.filters.depth) { + requestData.filter_depth = this.filters.depth; + } + if (this.filters.hasProducts) { + requestData.filter_has_products = 1; + } + if (this.filters.hasDescription) { + requestData.filter_has_description = 1; + } + if (this.filters.hasImage) { + requestData.filter_has_image = 1; + } + if (this.filters.salesMin !== null && this.filters.salesMin !== '') { + requestData.filter_sales_min = this.filters.salesMin; + } + if (this.filters.salesMax !== null && this.filters.salesMax !== '') { + requestData.filter_sales_max = this.filters.salesMax; + } + if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') { + requestData.filter_turnover_min = this.filters.turnoverMin; + } + if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') { + requestData.filter_turnover_max = this.filters.turnoverMax; + } + if (this.filters.activeOnly) { + requestData.filter_active = 1; + } + } + + // Manufacturer-specific + if (searchEntity === 'manufacturers') { + if (this.filters.salesMin !== null && this.filters.salesMin !== '') { + requestData.filter_sales_min = this.filters.salesMin; + } + if (this.filters.salesMax !== null && this.filters.salesMax !== '') { + requestData.filter_sales_max = this.filters.salesMax; + } + if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') { + requestData.filter_turnover_min = this.filters.turnoverMin; + } + if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') { + requestData.filter_turnover_max = this.filters.turnoverMax; + } + if (this.filters.dateAddFrom) { + requestData.filter_date_add_from = this.filters.dateAddFrom; + } + if (this.filters.dateAddTo) { + requestData.filter_date_add_to = this.filters.dateAddTo; + } + if (this.filters.lastProductFrom) { + requestData.filter_last_product_from = this.filters.lastProductFrom; + } + if (this.filters.lastProductTo) { + requestData.filter_last_product_to = this.filters.lastProductTo; + } + if (this.filters.activeOnly) { + requestData.filter_active = 1; + } + } + + // Supplier-specific + if (searchEntity === 'suppliers') { + if (this.filters.salesMin !== null && this.filters.salesMin !== '') { + requestData.filter_sales_min = this.filters.salesMin; + } + if (this.filters.salesMax !== null && this.filters.salesMax !== '') { + requestData.filter_sales_max = this.filters.salesMax; + } + if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') { + requestData.filter_turnover_min = this.filters.turnoverMin; + } + if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') { + requestData.filter_turnover_max = this.filters.turnoverMax; + } + if (this.filters.dateAddFrom) { + requestData.filter_date_add_from = this.filters.dateAddFrom; + } + if (this.filters.dateAddTo) { + requestData.filter_date_add_to = this.filters.dateAddTo; + } + if (this.filters.lastProductFrom) { + requestData.filter_last_product_from = this.filters.lastProductFrom; + } + if (this.filters.lastProductTo) { + requestData.filter_last_product_to = this.filters.lastProductTo; + } + if (this.filters.activeOnly) { + requestData.filter_active = 1; + } + } + + // Attribute-specific + if (searchEntity === 'attributes') { + if (this.filters.salesMin !== null && this.filters.salesMin !== '') { + requestData.filter_sales_min = this.filters.salesMin; + } + if (this.filters.salesMax !== null && this.filters.salesMax !== '') { + requestData.filter_sales_max = this.filters.salesMax; + } + if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') { + requestData.filter_turnover_min = this.filters.turnoverMin; + } + if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') { + requestData.filter_turnover_max = this.filters.turnoverMax; + } + if (this.filters.attributeGroup) { + requestData.filter_attribute_group = this.filters.attributeGroup; + } + if (this.filters.isColor) { + requestData.filter_is_color = 1; + } + } + + // Feature-specific + if (searchEntity === 'features') { + if (this.filters.salesMin !== null && this.filters.salesMin !== '') { + requestData.filter_sales_min = this.filters.salesMin; + } + if (this.filters.salesMax !== null && this.filters.salesMax !== '') { + requestData.filter_sales_max = this.filters.salesMax; + } + if (this.filters.turnoverMin !== null && this.filters.turnoverMin !== '') { + requestData.filter_turnover_min = this.filters.turnoverMin; + } + if (this.filters.turnoverMax !== null && this.filters.turnoverMax !== '') { + requestData.filter_turnover_max = this.filters.turnoverMax; + } + if (this.filters.featureGroup) { + requestData.filter_feature_group = this.filters.featureGroup; + } + if (this.filters.isCustom) { + requestData.filter_is_custom = 1; + } + } + + // CMS-specific + if (searchEntity === 'cms') { + if (this.filters.activeOnly) { + requestData.filter_active = 1; + } + if (this.filters.indexable) { + requestData.filter_indexable = 1; + } + } + + // CMS Categories-specific + if (searchEntity === 'cms_categories') { + if (this.filters.activeOnly) { + requestData.filter_active = 1; + } + } + } + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: requestData, + success: function(response) { + self.isLoading = false; + + if (!response.success) return; + + // Save to search history if query is not empty and has results + if (self.searchQuery && self.searchQuery.length >= 2 && response.total > 0) { + self.addToSearchHistory(searchEntity, self.searchQuery); + } + + if (appendMode) { + self.searchResults = self.searchResults.concat(response.results || []); + } else { + self.searchResults = response.results || []; + } + self.searchTotal = response.total || 0; + self.searchOffset = appendMode ? self.searchOffset + (response.results || []).length : (response.results || []).length; + + self.renderSearchResults(appendMode); + self.$dropdown.addClass('show'); + }, + error: function() { + self.isLoading = false; + } + }); + }, + + /** + * Render search results in the dropdown + */ + renderSearchResults: function(appendMode) { + var self = this; + var trans = this.config.trans || {}; + var $container = this.$dropdown.find('.dropdown-results'); + + // Get selected IDs from current picker (to mark as selected) + // and hidden IDs from sibling exclude pickers with same entity type (to hide completely) + var selectedIds = []; + var hiddenIds = []; + if (this.activeGroup) { + var $block = this.$wrapper.find('.target-block[data-block-type="' + this.activeGroup.blockType + '"]'); + var $group = $block.find('.selection-group[data-group-index="' + this.activeGroup.groupIndex + '"]'); + var currentSearchEntity = this.activeGroup.searchEntity; + var currentExcludeIndex = this.activeGroup.excludeIndex; + + if (this.activeGroup.section === 'include') { + // For include section, just get current picker's selections + var $picker = $group.find('.include-picker'); + $picker.find('.entity-chip').each(function() { + selectedIds.push(String($(this).data('id'))); + }); + } else { + // For exclude section, get current picker's selections AND + // collect IDs from sibling exclude rows with same entity type to hide + var $currentExcludeRow = $group.find('.exclude-row[data-exclude-index="' + currentExcludeIndex + '"]'); + var $currentPicker = $currentExcludeRow.find('.exclude-picker'); + + // Get selected IDs from current exclude row + $currentPicker.find('.entity-chip').each(function() { + selectedIds.push(String($(this).data('id'))); + }); + + // Get hidden IDs from OTHER exclude rows with the same entity type + $group.find('.exclude-row').each(function() { + var $row = $(this); + var rowIndex = parseInt($row.data('excludeIndex'), 10); + + // Skip current exclude row + if (rowIndex === currentExcludeIndex) return; + + var $picker = $row.find('.exclude-picker'); + var rowEntityType = $picker.attr('data-search-entity') || self.activeGroup.blockType; + + // Only collect if same entity type + if (rowEntityType === currentSearchEntity) { + $picker.find('.entity-chip').each(function() { + hiddenIds.push(String($(this).data('id'))); + }); + } + }); + } + } + + // Check if this is a product search + var isProductSearch = this.activeGroup && this.activeGroup.searchEntity === 'products'; + var isListView = this.viewMode === 'list'; + + // Show/hide results header for products in list view + this.$dropdown.find('.results-header').toggle(isProductSearch && isListView); + + // Build HTML - filter out items that are hidden (selected in sibling exclude rows) + var visibleResults = this.searchResults.filter(function(item) { + return hiddenIds.indexOf(String(item.id)) === -1; + }); + + // Update count (show visible count and total, noting hidden items if any) + var hiddenCount = this.searchResults.length - visibleResults.length; + var countText = visibleResults.length + ' / ' + this.searchTotal + ' results'; + if (hiddenCount > 0) { + countText += ' (' + hiddenCount + ' hidden)'; + } + this.$dropdown.find('.results-count').text(countText); + + var html = ''; + if (visibleResults.length === 0 && !appendMode) { + html = '
' + (trans.no_results || 'No results found') + '
'; + } else { + visibleResults.forEach(function(item) { + var isSelected = selectedIds.indexOf(String(item.id)) !== -1; + var itemClass = 'dropdown-item' + (isSelected ? ' selected' : ''); + if (item.type === 'product') itemClass += ' result-item-product'; + + html += '
'; + } else { + // Entity-specific icons + var iconClass = 'icon-cube'; // default + var searchEntity = self.activeGroup ? self.activeGroup.searchEntity : null; + if (searchEntity === 'categories') iconClass = 'icon-folder'; + else if (searchEntity === 'manufacturers') iconClass = 'icon-building'; + else if (searchEntity === 'suppliers') iconClass = 'icon-truck'; + else if (searchEntity === 'attributes') iconClass = 'icon-paint-brush'; + else if (searchEntity === 'features') iconClass = 'icon-list-ul'; + else if (searchEntity === 'cms') iconClass = 'icon-file-text-o'; + else if (searchEntity === 'cms_categories') iconClass = 'icon-folder-o'; + html += '
'; + } + + html += '
'; + html += '
' + self.escapeHtml(item.name) + '
'; + if (item.subtitle) { + // Split multi-line subtitles into separate divs for styling + var subtitleLines = item.subtitle.split('\n'); + html += '
'; + subtitleLines.forEach(function(line, idx) { + var lineClass = idx === 0 ? 'subtitle-line subtitle-line-primary' : 'subtitle-line subtitle-line-secondary'; + html += '
' + self.escapeHtml(line) + '
'; + }); + html += '
'; + } + html += '
'; + + // Add product-specific columns (price, sale price, stock, sold) + if (item.type === 'product') { + if (isListView) { + // List view: full columns + // Regular price + html += '
'; + html += '' + (item.regular_price_formatted || item.price_formatted || '') + ''; + html += '
'; + + // Sale price (only if discounted) + if (item.has_discount) { + html += '
'; + html += '' + (item.price_formatted || '') + ''; + html += '
'; + } else { + html += '
'; + } + + // Stock column + var stockClass = item.stock_status === 'out_of_stock' ? 'stock-out' : + (item.stock_status === 'low_stock' ? 'stock-low' : 'stock-ok'); + html += '
'; + html += '' + (item.stock_qty !== undefined ? item.stock_qty : '') + ''; + html += '
'; + + // Sales column + html += '
'; + html += '' + (item.sales_qty !== undefined ? item.sales_qty : '0') + ''; + html += '
'; + } else { + // Grid view: compact info line + var gridStockClass = item.stock_status === 'out_of_stock' ? 'stock-out' : + (item.stock_status === 'low_stock' ? 'stock-low' : ''); + html += '
'; + html += '' + (item.price_formatted || '') + ''; + if (item.stock_qty !== undefined) { + html += '' + item.stock_qty + ' qty'; + } + if (item.has_discount) { + html += '-' + (item.discount_percent || '') + '%'; + } + html += '
'; + } + } + + html += ''; + }); + } + + if (appendMode) { + $container.append(html); + } else { + $container.html(html); + } + + // Show/hide load more controls and update remaining count + var hasMore = this.searchResults.length < this.searchTotal; + var $loadMoreControls = this.$dropdown.find('.load-more-controls'); + $loadMoreControls.toggle(hasMore); + + if (hasMore) { + var remaining = this.searchTotal - this.searchResults.length; + $loadMoreControls.find('.remaining-count').text(remaining); + + // Update "All" option in dropdown + var $select = $loadMoreControls.find('.load-more-select'); + var $allOption = $select.find('option[data-all="true"]'); + if ($allOption.length) { + $allOption.val(remaining).text((trans.all || 'All') + ' (' + remaining + ')'); + } else { + $select.find('option:last').after(''); + } + } + + // Ensure dropdown-actions are visible and history button is deactivated + this.$dropdown.find('.dropdown-actions').show(); + this.$dropdown.find('.btn-show-history').removeClass('active'); + + // Disable history button if no search history for current entity type + var entityType = this.activeGroup ? this.activeGroup.searchEntity : null; + var hasHistory = entityType && this.getSearchHistory(entityType).length > 0; + this.$dropdown.find('.btn-show-history').prop('disabled', !hasHistory); + }, + + // NOTE: Tree methods (loadCategoryTree, renderCategoryTree, filterCategoryTree, + // findTreeDescendants, findTreeAncestors, updateSelectChildrenButtons) are + // defined in _tree.js which is merged later and takes precedence. + + // ========================================================================= + // Search History + // ========================================================================= + + loadSearchHistory: function() { + try { + var stored = localStorage.getItem(this.searchHistoryKey); + this.searchHistory = stored ? JSON.parse(stored) : {}; + } catch (e) { + this.searchHistory = {}; + } + }, + + saveSearchHistory: function() { + try { + localStorage.setItem(this.searchHistoryKey, JSON.stringify(this.searchHistory)); + } catch (e) { + // localStorage might be full or unavailable + } + }, + + addToSearchHistory: function(entityType, query) { + if (!query || query.length < 2) return; + + if (!this.searchHistory[entityType]) { + this.searchHistory[entityType] = []; + } + + var history = this.searchHistory[entityType]; + + // Remove if already exists (will re-add at top) + var existingIndex = history.indexOf(query); + if (existingIndex !== -1) { + history.splice(existingIndex, 1); + } + + // Add at beginning + history.unshift(query); + + // Trim to max + if (history.length > this.searchHistoryMax) { + history = history.slice(0, this.searchHistoryMax); + } + + this.searchHistory[entityType] = history; + this.saveSearchHistory(); + }, + + removeFromSearchHistory: function(entityType, query) { + if (!this.searchHistory[entityType]) return; + + var index = this.searchHistory[entityType].indexOf(query); + if (index !== -1) { + this.searchHistory[entityType].splice(index, 1); + this.saveSearchHistory(); + } + }, + + getSearchHistory: function(entityType) { + return this.searchHistory[entityType] || []; + }, + + showSearchHistory: function(entityType) { + var history = this.getSearchHistory(entityType); + var trans = this.config.trans || {}; + var $container = this.$dropdown.find('.dropdown-results'); + + // Update header + this.$dropdown.find('.results-count').text(trans.recent_searches || 'Recent searches'); + + // Hide filters, actions, and results header for history view + this.$dropdown.find('.dropdown-actions').hide(); + this.$dropdown.find('.filter-panel').removeClass('show'); + this.$dropdown.find('.btn-toggle-filters').removeClass('active'); + this.$dropdown.find('.results-header').hide(); + + if (!history.length) { + // No history - just do a regular search + this.performSearch(); + return; + } + + // Build history items + var html = '
'; + for (var i = 0; i < history.length; i++) { + var query = history[i]; + html += '
'; + html += ''; + html += '' + this.escapeHtml(query) + ''; + html += ''; + html += '
'; + } + html += '
'; + + $container.html(html); + this.$dropdown.addClass('show'); + }, + + // ========================================================================= + // Filter Methods + // ========================================================================= + + refreshSearch: function() { + // In tree view mode, re-filter the tree instead of doing a flat AJAX search + if (this.viewMode === 'tree') { + this.filterCategoryTree(this.searchQuery || ''); + return; + } + + this.searchOffset = 0; + this.loadMoreCount = 20; + // Reset load more select to default + if (this.$dropdown) { + this.$dropdown.find('.load-more-select').val('20'); + // Remove the dynamic "All" option + this.$dropdown.find('.load-more-select option[data-all="true"]').remove(); + } + this.performSearch(false); + }, + + clearFilters: function() { + this.refineQuery = ''; + this.refineNegate = false; + this.filters = { + inStock: false, + discounted: false, + priceMin: null, + priceMax: null, + attributes: [], + features: [], + // Entity-specific filters + productCountMin: null, + productCountMax: null, + salesMin: null, + salesMax: null, + turnoverMin: null, + turnoverMax: null, + depth: null, + hasProducts: false, + hasDescription: false, + hasImage: false, + activeOnly: true, + attributeGroup: null, + featureGroup: null, + dateAddFrom: null, + dateAddTo: null, + lastProductFrom: null, + lastProductTo: null + }; + + if (this.$dropdown) { + var trans = this.config.trans || {}; + this.$dropdown.find('.refine-input').val('').attr('placeholder', trans.refine_short || 'Refine...'); + this.$dropdown.find('.btn-clear-refine').hide(); + this.$dropdown.find('.btn-refine-negate').removeClass('active'); + this.$dropdown.find('.filter-in-stock').prop('checked', false); + this.$dropdown.find('.filter-discounted').prop('checked', false); + this.$dropdown.find('.filter-price-min').val(''); + this.$dropdown.find('.filter-price-max').val(''); + this.$dropdown.find('.filter-attr-chip').removeClass('active'); + this.$dropdown.find('.filter-feat-chip').removeClass('active'); + this.$dropdown.find('.filter-group-toggle').removeClass('active has-selection'); + this.$dropdown.find('.filter-row-values').hide(); + + // Clear entity-specific filter inputs + this.$dropdown.find('.filter-product-count-min, .filter-product-count-max').val(''); + this.$dropdown.find('.filter-sales-min, .filter-sales-max').val(''); + this.$dropdown.find('.filter-turnover-min, .filter-turnover-max').val(''); + this.$dropdown.find('.filter-date-add-from, .filter-date-add-to').val(''); + this.$dropdown.find('.filter-last-product-from, .filter-last-product-to').val(''); + this.$dropdown.find('.filter-depth-select').val(''); + this.$dropdown.find('.filter-has-products').prop('checked', false); + this.$dropdown.find('.filter-has-description').prop('checked', false); + this.$dropdown.find('.filter-has-image').prop('checked', false); + this.$dropdown.find('.filter-active-only').prop('checked', true); + this.$dropdown.find('.filter-attribute-group-select, .filter-feature-group-select').val(''); + } + + this.refreshSearch(); + }, + + // Reset filters without triggering a search (used when switching entity types) + resetFiltersWithoutSearch: function() { + this.refineQuery = ''; + this.refineNegate = false; + this.filters = { + inStock: false, + discounted: false, + priceMin: null, + priceMax: null, + attributes: [], + features: [], + productCountMin: null, + productCountMax: null, + salesMin: null, + salesMax: null, + turnoverMin: null, + turnoverMax: null, + depth: null, + hasProducts: false, + hasDescription: false, + hasImage: false, + activeOnly: true, + attributeGroup: null, + featureGroup: null, + dateAddFrom: null, + dateAddTo: null, + lastProductFrom: null, + lastProductTo: null + }; + + if (this.$dropdown) { + var trans = this.config.trans || {}; + this.$dropdown.find('.refine-input').val('').attr('placeholder', trans.refine_short || 'Refine...'); + this.$dropdown.find('.btn-clear-refine').hide(); + this.$dropdown.find('.btn-refine-negate').removeClass('active'); + this.$dropdown.find('.filter-in-stock').prop('checked', false); + this.$dropdown.find('.filter-discounted').prop('checked', false); + this.$dropdown.find('.filter-price-min').val(''); + this.$dropdown.find('.filter-price-max').val(''); + this.$dropdown.find('.filter-attr-chip').removeClass('active'); + this.$dropdown.find('.filter-feat-chip').removeClass('active'); + this.$dropdown.find('.filter-group-toggle').removeClass('active has-selection'); + this.$dropdown.find('.filter-row-values').hide(); + this.$dropdown.find('.filter-product-count-min, .filter-product-count-max').val(''); + this.$dropdown.find('.filter-sales-min, .filter-sales-max').val(''); + this.$dropdown.find('.filter-turnover-min, .filter-turnover-max').val(''); + this.$dropdown.find('.filter-date-add-from, .filter-date-add-to').val(''); + this.$dropdown.find('.filter-last-product-from, .filter-last-product-to').val(''); + this.$dropdown.find('.filter-depth-select').val(''); + this.$dropdown.find('.filter-has-products').prop('checked', false); + this.$dropdown.find('.filter-has-description').prop('checked', false); + this.$dropdown.find('.filter-has-image').prop('checked', false); + this.$dropdown.find('.filter-active-only').prop('checked', true); + this.$dropdown.find('.filter-attribute-group-select, .filter-feature-group-select').val(''); + } + // Note: Does NOT call refreshSearch() - caller handles search/load + }, + + updateFilterPanelForEntity: function(entityType) { + if (!this.$dropdown) { + return; + } + + var $panel = this.$dropdown.find('.filter-panel'); + + // Hide all filter rows first + $panel.find('.filter-row').hide(); + + // Show/hide tree view option based on entity type + var $treeOption = this.$dropdown.find('.view-mode-select option.tree-view-option'); + if (entityType === 'categories' || entityType === 'cms_categories') { + $treeOption.prop('disabled', false).prop('hidden', false); + // Auto-switch to tree view for categories + if (this.viewMode !== 'tree') { + this.viewMode = 'tree'; + this.$dropdown.find('.view-mode-select').val('tree'); + this.$dropdown.removeClass('view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8').addClass('view-tree'); + this.loadCategoryTree(); + } else { + this.loadCategoryTree(); + } + } else { + $treeOption.prop('disabled', true).prop('hidden', true); + // If currently in tree mode, switch back to list + if (this.viewMode === 'tree') { + this.viewMode = 'list'; + this.$dropdown.find('.view-mode-select').val('list'); + this.$dropdown.removeClass('view-tree').addClass('view-list'); + } + } + + // Show entity-specific filter row (prepare visibility, but don't auto-expand panel) + if (entityType === 'products') { + // Prepare the correct rows to be visible when panel is shown + $panel.find('.filter-row-quick').show(); + // Show attribute/feature rows if we have cached data + if (this.filterableData) { + if (this.filterableData.attributes && this.filterableData.attributes.length > 0) { + this.$dropdown.find('.filter-row-attributes').show(); + } + if (this.filterableData.features && this.filterableData.features.length > 0) { + this.$dropdown.find('.filter-row-features').show(); + } + } + } else if (entityType === 'categories') { + $panel.find('.filter-row-entity-categories').show(); + } else if (entityType === 'manufacturers') { + $panel.find('.filter-row-entity-manufacturers').show(); + } else if (entityType === 'suppliers') { + $panel.find('.filter-row-entity-suppliers').show(); + } else if (entityType === 'attributes') { + $panel.find('.filter-row-entity-attributes').show(); + this.loadAttributeGroups(); + } else if (entityType === 'features') { + $panel.find('.filter-row-entity-features').show(); + } else if (entityType === 'cms') { + $panel.find('.filter-row-entity-cms').show(); + } else if (entityType === 'cms_categories') { + $panel.find('.filter-row-entity-cms-categories').show(); + } + }, + + loadAttributeGroups: function() { + var self = this; + var $select = this.$dropdown.find('.filter-attribute-group-select'); + + // Already loaded? + if ($select.find('option').length > 1) return; + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'getAttributeGroups', + trait: 'EntitySelector' + }, + success: function(response) { + if (response.success && response.groups) { + $.each(response.groups, function(i, group) { + $select.append(''); + }); + } + } + }); + }, + + loadFeatureGroups: function() { + var self = this; + var $select = this.$dropdown.find('.filter-feature-group-select'); + + // Already loaded? + if ($select.find('option').length > 1) return; + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'getFeatureGroups', + trait: 'EntitySelector' + }, + success: function(response) { + if (response.success && response.groups) { + $.each(response.groups, function(i, group) { + $select.append(''); + }); + } + } + }); + } + }; + +})(jQuery); + +/** + * Entity Selector - Filters Module + * Filter panel, filter state management + * @partial _filters.js + * + * EXTRACTION SOURCE: assets/js/admin/entity-selector.js + * Lines: 6605-6758 (filter methods) + * + * Contains: + * - clearFilters() - Reset all filters + * - resetFiltersWithoutSearch() - Reset without triggering search + * - updateFilterPanelForEntity() - Show/hide filters based on entity type + * - loadFilterableData() - Load attributes/features for filter panel + * - renderFilterDropdowns() - Render attribute/feature group toggles + * - showFilterGroupValues() - Show values for a filter group + * - hideFilterGroupValues() - Hide filter values row + * - updateFilterToggleStates() - Update toggle states based on selections + */ + +(function($) { + 'use strict'; + + window._EntitySelectorMixins = window._EntitySelectorMixins || {}; + + window._EntitySelectorMixins.filters = { + + clearFilters: function() { + this.refineQuery = ''; + this.refineNegate = false; + this.filters = { + inStock: false, + discounted: false, + priceMin: null, + priceMax: null, + attributes: [], + features: [], + productCountMin: null, + productCountMax: null, + salesMin: null, + salesMax: null, + turnoverMin: null, + turnoverMax: null, + depth: null, + hasProducts: false, + hasDescription: false, + hasImage: false, + activeOnly: true, + attributeGroup: null, + featureGroup: null, + dateAddFrom: null, + dateAddTo: null, + lastProductFrom: null, + lastProductTo: null + }; + + if (this.$dropdown) { + var trans = this.config.trans || {}; + this.$dropdown.find('.refine-input').val(''); + this.$dropdown.find('.btn-refine-negate').removeClass('active'); + this.$dropdown.find('.filter-in-stock').prop('checked', false); + this.$dropdown.find('.filter-discounted').prop('checked', false); + this.$dropdown.find('.filter-price-min, .filter-price-max').val(''); + this.$dropdown.find('.filter-attr-chip, .filter-feat-chip').removeClass('active'); + this.$dropdown.find('.filter-product-count-min, .filter-product-count-max').val(''); + this.$dropdown.find('.filter-sales-min, .filter-sales-max').val(''); + this.$dropdown.find('.filter-depth-select').val(''); + this.$dropdown.find('.filter-has-products').prop('checked', false); + this.$dropdown.find('.filter-active-only').prop('checked', true); + } + + this.refreshSearch(); + }, + + resetFiltersWithoutSearch: function() { + // Same as clearFilters but doesn't trigger search + // Used when switching entity types + this.refineQuery = ''; + this.refineNegate = false; + this.filters = { + inStock: false, + discounted: false, + priceMin: null, + priceMax: null, + attributes: [], + features: [], + productCountMin: null, + productCountMax: null, + salesMin: null, + salesMax: null, + turnoverMin: null, + turnoverMax: null, + depth: null, + hasProducts: false, + hasDescription: false, + hasImage: false, + activeOnly: true, + attributeGroup: null, + featureGroup: null, + dateAddFrom: null, + dateAddTo: null, + lastProductFrom: null, + lastProductTo: null + }; + }, + + updateFilterPanelForEntity: function(entityType) { + if (!this.$dropdown) { + return; + } + + var $panel = this.$dropdown.find('.filter-panel'); + + // Hide all entity-specific filter rows + $panel.find('.filter-row').hide(); + + // Show filters for current entity type + $panel.find('.filter-row[data-entity="' + entityType + '"]').show(); + $panel.find('.filter-row-entity-' + entityType.replace('_', '-')).show(); + + // Show/hide tree view option based on entity type + var isCategory = (entityType === 'categories' || entityType === 'cms_categories'); + this.$dropdown.find('.tree-view-option').toggle(isCategory); + + // Default to tree view for categories (only if currently on list mode) + if (isCategory && this.viewMode === 'list') { + this.viewMode = 'tree'; + this.$dropdown.find('.view-mode-select').val('tree'); + this.$dropdown.removeClass('view-list view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8').addClass('view-tree'); + } else if (!isCategory && this.viewMode === 'tree') { + // If switching away from categories while in tree mode, switch to list + this.viewMode = 'list'; + this.$dropdown.find('.view-mode-select').val('list'); + this.$dropdown.removeClass('view-tree view-cols-2 view-cols-3 view-cols-4 view-cols-5 view-cols-6 view-cols-7 view-cols-8').addClass('view-list'); + } + + // Update sort options for entity type + this.updateSortOptionsForEntity(entityType); + }, + + /** + * Show/hide sort options based on entity type + * Options with data-entities attribute are only shown for matching entities + */ + updateSortOptionsForEntity: function(entityType) { + if (!this.$dropdown) { + return; + } + + var $select = this.$dropdown.find('.sort-field-select'); + var currentValue = $select.val(); + var hasCurrentOption = false; + + $select.find('option').each(function() { + var $option = $(this); + var entities = $option.data('entities'); + + // Options without data-entities are universal (always shown) + if (!entities) { + $option.show(); + if ($option.val() === currentValue) { + hasCurrentOption = true; + } + return; + } + + // Check if this entity type is in the allowed list + var allowedEntities = entities.split(','); + var isAllowed = allowedEntities.indexOf(entityType) !== -1; + + $option.toggle(isAllowed); + + if (isAllowed && $option.val() === currentValue) { + hasCurrentOption = true; + } + }); + + // If current sort field is not available for this entity, reset to 'name' + if (!hasCurrentOption) { + $select.val('name'); + this.currentSort.field = 'name'; + } + }, + + loadFilterableData: function() { + var self = this; + + if (this.filterableData) { + this.renderFilterDropdowns(); + return; + } + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + data: { + ajax: 1, + action: 'getTargetFilterableAttributes', + trait: 'EntitySelector' + }, + dataType: 'json', + success: function(response) { + if (response.success && response.data) { + self.filterableData = response.data; + self.renderFilterDropdowns(); + } + } + }); + }, + + renderFilterDropdowns: function() { + if (!this.$dropdown || !this.filterableData) return; + + var self = this; + + // Render attribute group toggle buttons + var $attrContainer = this.$dropdown.find('.filter-attributes-container'); + $attrContainer.empty(); + + if (this.filterableData.attributes && this.filterableData.attributes.length > 0) { + this.filterableData.attributes.forEach(function(group) { + var html = ''; + $attrContainer.append(html); + }); + this.$dropdown.find('.filter-row-attributes').show(); + } + + // Render feature group toggle buttons + var $featContainer = this.$dropdown.find('.filter-features-container'); + $featContainer.empty(); + + if (this.filterableData.features && this.filterableData.features.length > 0) { + this.filterableData.features.forEach(function(group) { + var html = ''; + $featContainer.append(html); + }); + this.$dropdown.find('.filter-row-features').show(); + } + }, + + showFilterGroupValues: function(groupId, type) { + if (!this.filterableData) return; + + var self = this; + var groups = type === 'attribute' ? this.filterableData.attributes : this.filterableData.features; + var group = groups.find(function(g) { return g.id == groupId; }); + + if (!group) return; + + // Hide all values rows first, then show the correct one + this.$dropdown.find('.filter-row-values').hide(); + + // Target the correct values row based on type + var valuesRowClass = type === 'attribute' ? '.filter-row-attr-values' : '.filter-row-feat-values'; + var $filterRowValues = this.$dropdown.find(valuesRowClass); + var $valuesContainer = $filterRowValues.find('.filter-values-container'); + $valuesContainer.empty(); + + // Add group label + var html = '' + group.name + ':'; + + // Add chips + group.values.forEach(function(val) { + var isActive = type === 'attribute' + ? self.filters.attributes.indexOf(val.id) !== -1 + : self.filters.features.indexOf(val.id) !== -1; + var activeClass = isActive ? ' active' : ''; + var chipClass = type === 'attribute' ? 'filter-attr-chip' : 'filter-feat-chip'; + var colorStyle = val.color ? ' style="--chip-color: ' + val.color + '"' : ''; + var colorClass = val.color ? ' has-color' : ''; + + html += ''; + }); + + $valuesContainer.html(html); + + // Add close button as sibling (outside filter-values-container, inside filter-row-values) + $filterRowValues.find('.btn-close-values').remove(); + $filterRowValues.append(''); + $filterRowValues.show(); + + // Scroll into view if needed + var rowValues = $filterRowValues[0]; + if (rowValues) { + rowValues.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); + } + }, + + hideFilterGroupValues: function() { + this.$dropdown.find('.filter-row-values').hide(); + this.$dropdown.find('.filter-group-toggle').removeClass('active'); + }, + + updateFilterToggleStates: function() { + if (!this.$dropdown || !this.filterableData) return; + + var self = this; + + // Update attribute group toggles + if (this.filterableData.attributes) { + this.filterableData.attributes.forEach(function(group) { + var $toggle = self.$dropdown.find('.filter-group-toggle[data-group-id="' + group.id + '"][data-type="attribute"]'); + var hasActiveInGroup = group.values.some(function(val) { + return self.filters.attributes.indexOf(val.id) !== -1; + }); + $toggle.toggleClass('has-selection', hasActiveInGroup); + }); + } + + // Update feature group toggles + if (this.filterableData.features) { + this.filterableData.features.forEach(function(group) { + var $toggle = self.$dropdown.find('.filter-group-toggle[data-group-id="' + group.id + '"][data-type="feature"]'); + var hasActiveInGroup = group.values.some(function(val) { + return self.filters.features.indexOf(val.id) !== -1; + }); + $toggle.toggleClass('has-selection', hasActiveInGroup); + }); + } + } + }; + +})(jQuery); + +/** + * Entity Selector - Chips Module + * Entity chip rendering, selection management, and pattern tag handling + * @partial _chips.js + * + * EXTRACTION SOURCE: assets/js/admin/entity-selector.js + * + * Contains: + * - addSelection() / addSelectionNoUpdate() - Add entity chip to picker + * - removeSelection() - Remove chip and update state + * - updateChipsVisibility() - Show/hide based on count + * - loadExistingSelections() - Load saved values on init + * - collectPickerEntities() / loadPickerValues() - Entity loading helpers + * - Pattern tag methods: addPatternTag, getPatternTags, updateDraftTagCount + * - Single mode: getCurrentSingleSelection, showReplaceConfirmation + * - Count updates: updateConditionCount, updateGroupCounts, updateGroupTotalCount + */ + +(function($) { + 'use strict'; + + window._EntitySelectorMixins = window._EntitySelectorMixins || {}; + + window._EntitySelectorMixins.chips = { + + // ========================================================================= + // Selection Methods (Entity Chips) + // ========================================================================= + + addSelection: function($picker, id, name, data) { + this.addSelectionNoUpdate($picker, id, name, data); + var $chips = $picker.find('.entity-chips'); + this.updateChipsVisibility($chips); + }, + + addSelectionNoUpdate: function($picker, id, name, data) { + var $chips = $picker.find('.entity-chips'); + var $block = $picker.closest('.target-block'); + + // Check for global single mode (only ONE item across ALL entity types) + var globalMode = this.config.mode || 'multi'; + + if (globalMode === 'single') { + // Clear ALL selections in ALL blocks (across all entity types) + this.$wrapper.find('.entity-chips .entity-chip').remove(); + // Clear all selected states in dropdown + if (this.$dropdown) { + this.$dropdown.find('.dropdown-item.selected, .tree-item.selected').removeClass('selected'); + } + // Clear tab badges (since we're clearing other blocks) + this.$wrapper.find('.target-block-tab .tab-badge').remove(); + this.$wrapper.find('.target-block-tab').removeClass('has-data'); + } else { + // Check if this block is in per-block single mode + var blockMode = $block.data('mode') || 'multi'; + + // In per-block single mode, clear chips in THIS block only + if (blockMode === 'single') { + $chips.find('.entity-chip').remove(); + // Also deselect all items in dropdown + if (this.$dropdown) { + this.$dropdown.find('.dropdown-item.selected, .tree-item.selected').removeClass('selected'); + } + } + } + + if ($chips.find('.entity-chip[data-id="' + id + '"]').length) { + return; + } + + var html = ''; + + if (data && data.image) { + html += ''; + } + + html += '' + this.escapeHtml(name) + ''; + html += ''; + html += ''; + + $chips.append(html); + }, + + removeSelection: function($picker, id) { + var $chips = $picker.find('.entity-chips'); + $picker.find('.entity-chip[data-id="' + id + '"]').remove(); + this.updateChipsVisibility($chips); + }, + + updateChipsVisibility: function($chips) { + var self = this; + var trans = this.config.trans || {}; + var $picker = $chips.closest('.value-picker'); + var $allChips = $chips.find('.entity-chip'); + var totalCount = $allChips.length; + + // If no chips, remove the wrapper entirely + var $existingWrapper = $chips.closest('.chips-wrapper'); + if (totalCount === 0) { + if ($existingWrapper.length) { + // Move chips out of wrapper before removing + $existingWrapper.before($chips); + $existingWrapper.remove(); + } + return; + } + + // Ensure chips wrapper structure exists + this.ensureChipsWrapper($chips); + + var $wrapper = $chips.closest('.chips-wrapper'); + var $toolbar = $wrapper.find('.chips-toolbar'); + var $loadMore = $wrapper.find('.chips-load-more'); + + // Get current search filter + var searchTerm = $toolbar.find('.chips-search-input').val() || ''; + searchTerm = searchTerm.toLowerCase().trim(); + + // Filter and paginate chips + var visibleCount = 0; + var filteredCount = 0; + var isExpanded = $chips.hasClass('chips-expanded'); + var maxVisible = isExpanded ? 999999 : (this.maxVisibleChips || 12); + + $allChips.each(function() { + var $chip = $(this); + var chipName = ($chip.find('.chip-name').text() || '').toLowerCase(); + var matchesFilter = !searchTerm || chipName.indexOf(searchTerm) !== -1; + + $chip.removeClass('chip-filtered-out chip-paginated-out'); + + if (!matchesFilter) { + $chip.addClass('chip-filtered-out'); + } else { + filteredCount++; + if (filteredCount > maxVisible) { + $chip.addClass('chip-paginated-out'); + } else { + visibleCount++; + } + } + }); + + // Update toolbar (always show when we have chips) + $toolbar.addClass('has-chips'); + this.updateChipsToolbar($toolbar, totalCount, filteredCount, searchTerm); + + // Update load more select dropdown + var hiddenByPagination = filteredCount - visibleCount; + if (hiddenByPagination > 0 && !isExpanded) { + var loadText = trans.load || 'Load'; + var remainingText = (trans.remaining || '{count} remaining').replace('{count}', hiddenByPagination); + var loadMoreHtml = '' + loadText + '' + + '' + + '' + remainingText + ''; + $loadMore.html(loadMoreHtml).show(); + } else if (isExpanded && filteredCount > (this.maxVisibleChips || 12)) { + var collapseText = trans.collapse || 'Collapse'; + $loadMore.html( + '' + ).show(); + } else { + $loadMore.hide(); + } + }, + + ensureChipsWrapper: function($chips) { + // Check if already wrapped + if ($chips.closest('.chips-wrapper').length) { + return; + } + + var trans = this.config.trans || {}; + var $picker = $chips.closest('.value-picker'); + + // Create wrapper structure - integrated filter toolbar with sort + var wrapperHtml = '
' + + '
' + + '' + + '' + + '' + + '' + + '
' + + '' + + '
'; + + var $wrapper = $(wrapperHtml); + + // Insert wrapper before chips and move chips inside + $chips.before($wrapper); + $wrapper.find('.chips-toolbar').after($chips); + $wrapper.append($wrapper.find('.chips-load-more')); + + // Bind toolbar events + this.bindChipsToolbarEvents($wrapper); + }, + + bindChipsToolbarEvents: function($wrapper) { + var self = this; + var $chips = $wrapper.find('.entity-chips'); + var searchTimeout; + + // Search input + $wrapper.on('input', '.chips-search-input', function() { + clearTimeout(searchTimeout); + searchTimeout = setTimeout(function() { + // Collapse when searching to show filtered results from start + $chips.removeClass('chips-expanded'); + self.updateChipsVisibility($chips); + }, 150); + }); + + // Sort select + $wrapper.on('change', '.chips-sort-select', function() { + var sortBy = $(this).val(); + self.sortChips($chips, sortBy); + }); + + // Clear all button + $wrapper.on('click', '.btn-chips-clear', function() { + var searchTerm = $wrapper.find('.chips-search-input').val() || ''; + var $chipsToRemove; + + if (searchTerm.trim()) { + // Remove only filtered (visible) chips + $chipsToRemove = $chips.find('.entity-chip:not(.chip-filtered-out)'); + } else { + // Remove all chips + $chipsToRemove = $chips.find('.entity-chip'); + } + + $chipsToRemove.each(function() { + $(this).find('.chip-remove').trigger('click'); + }); + + // Clear search + $wrapper.find('.chips-search-input').val(''); + self.updateChipsVisibility($chips); + }); + + // Load more select dropdown + $wrapper.on('change', '.load-more-select', function() { + var loadCount = $(this).val(); + if (loadCount === 'all') { + $chips.addClass('chips-expanded'); + self.maxVisibleChips = 999999; + } else { + self.maxVisibleChips = (self.maxVisibleChips || 12) + parseInt(loadCount, 10); + } + self.updateChipsVisibility($chips); + }); + + // Collapse button + $wrapper.on('click', '.btn-collapse-chips', function() { + $chips.removeClass('chips-expanded'); + self.maxVisibleChips = 12; + self.updateChipsVisibility($chips); + }); + }, + + /** + * Sort chips by specified criteria + */ + sortChips: function($chips, sortBy) { + var $allChips = $chips.find('.entity-chip'); + if ($allChips.length < 2) return; + + var sorted = $allChips.toArray().sort(function(a, b) { + var $a = $(a); + var $b = $(b); + + switch (sortBy) { + case 'name_asc': + var nameA = ($a.find('.chip-name').text() || '').toLowerCase(); + var nameB = ($b.find('.chip-name').text() || '').toLowerCase(); + return nameA.localeCompare(nameB); + case 'name_desc': + var nameA2 = ($a.find('.chip-name').text() || '').toLowerCase(); + var nameB2 = ($b.find('.chip-name').text() || '').toLowerCase(); + return nameB2.localeCompare(nameA2); + case 'added': + default: + // Keep original DOM order (order added) + return 0; + } + }); + + // Re-append in sorted order + $.each(sorted, function(i, chip) { + $chips.append(chip); + }); + + this.updateChipsVisibility($chips); + }, + + updateChipsToolbar: function($toolbar, totalCount, filteredCount, searchTerm) { + var trans = this.config.trans || {}; + var $count = $toolbar.find('.chips-count'); + var $clearBtn = $toolbar.find('.btn-chips-clear'); + var $clearText = $clearBtn.find('.clear-text'); + + // Update count display + if (searchTerm) { + $count.addClass('has-filter').html( + '' + filteredCount + '' + + '/' + + '' + totalCount + '' + ); + $clearText.text((trans.clear || 'Clear') + ' ' + filteredCount); + } else { + $count.removeClass('has-filter').html(totalCount); + $clearText.text(trans.clear_all || 'Clear all'); + } + + // Show/hide clear button + if (searchTerm && filteredCount === 0) { + $clearBtn.hide(); + } else if (totalCount > 0) { + $clearBtn.show(); + } else { + $clearBtn.hide(); + } + }, + + // ========================================================================= + // Loading/Initialization + // ========================================================================= + + loadExistingSelections: function() { + var self = this; + + // Collect all entity IDs to load, grouped by entity type + var entitiesToLoad = {}; // { entity_type: { ids: [], pickers: [] } } + + this.$wrapper.find('.selection-group').each(function() { + var $group = $(this); + var $block = $group.closest('.target-block'); + var blockType = $block.data('blockType'); + + // Load include values + var $includePicker = $group.find('.include-picker'); + self.collectPickerEntities($includePicker, blockType, entitiesToLoad); + + // Enhance the include method select if not already enhanced + self.enhanceMethodSelect($group.find('.include-method-select')); + + // Load exclude values from each exclude row + $group.find('.exclude-row').each(function() { + var $excludeRow = $(this); + self.collectPickerEntities($excludeRow.find('.exclude-picker'), blockType, entitiesToLoad); + + // Enhance the exclude method select if not already enhanced + self.enhanceMethodSelect($excludeRow.find('.exclude-method-select')); + }); + + // Lock method selector if excludes exist + var hasExcludes = $group.find('.group-excludes.has-excludes').length > 0; + if (hasExcludes) { + self.updateMethodSelectorLock($group, true); + } + }); + + // Build bulk request: { entityType: [uniqueIds], ... } + var bulkRequest = {}; + var hasEntities = false; + + Object.keys(entitiesToLoad).forEach(function(entityType) { + var data = entitiesToLoad[entityType]; + if (data.ids.length === 0) return; + + // Deduplicate IDs + var uniqueIds = data.ids.filter(function(id, index, arr) { + return arr.indexOf(id) === index; + }); + + bulkRequest[entityType] = uniqueIds; + hasEntities = true; + }); + + // Skip AJAX if no entities to load + if (!hasEntities) { + return; + } + + // Single bulk AJAX call for all entity types + $.ajax({ + url: self.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'getTargetEntitiesByIdsBulk', + trait: 'EntitySelector', + entities: JSON.stringify(bulkRequest) + }, + success: function(response) { + if (!response.success || !response.entities) { + return; + } + + // Process each entity type's results + Object.keys(entitiesToLoad).forEach(function(entityType) { + var data = entitiesToLoad[entityType]; + var entities = response.entities[entityType] || []; + + // Build a map of id -> entity for quick lookup + var entityMap = {}; + entities.forEach(function(entity) { + entityMap[entity.id] = entity; + }); + + // Update each picker that requested this entity type + data.pickers.forEach(function(pickerData) { + var $picker = pickerData.$picker; + var $chips = $picker.find('.entity-chips'); + var $dataInput = $picker.find('.include-values-data, .exclude-values-data'); + var validIds = []; + + // Replace loading chips with real data + pickerData.ids.forEach(function(id) { + var $loadingChip = $chips.find('.entity-chip-loading[data-id="' + id + '"]'); + if (entityMap[id]) { + var entity = entityMap[id]; + validIds.push(entity.id); + + // Create real chip + var html = ''; + if (entity.image) { + html += ''; + } + html += '' + self.escapeHtml(entity.name) + ''; + html += ''; + html += ''; + + $loadingChip.replaceWith(html); + } else { + // Entity not found, remove loading chip + $loadingChip.remove(); + } + }); + + // Update chips visibility + self.updateChipsVisibility($chips); + + // If some entities were not found, update the hidden input + if (validIds.length !== pickerData.ids.length) { + $dataInput.val(JSON.stringify(validIds)); + self.serializeAllBlocks(); + } + + self.updateBlockStatus($picker.closest('.target-block')); + }); + }); + } + }); + }, + + /** + * Collect entity IDs from a picker for bulk loading + * Also shows loading placeholders for entity_search types + */ + collectPickerEntities: function($picker, blockType, entitiesToLoad) { + if (!$picker.length) { + return; + } + + var self = this; + var $dataInput = $picker.find('.include-values-data, .exclude-values-data'); + if (!$dataInput.length) { + return; + } + + var valueType = $picker.attr('data-value-type'); + var rawValue = $dataInput.val() || '[]'; + + var values = []; + try { + values = JSON.parse(rawValue); + } catch (e) { + return; + } + + // Handle non-entity types synchronously + if (valueType === 'multi_numeric_range') { + if (!Array.isArray(values) || values.length === 0) return; + + var $chipsContainer = $picker.find('.multi-range-chips'); + values.forEach(function(range) { + if (!range || (range.min === null && range.max === null)) return; + + var chipText = ''; + if (range.min !== null && range.max !== null) { + chipText = range.min + ' - ' + range.max; + } else if (range.min !== null) { + chipText = '≥ ' + range.min; + } else { + chipText = '≤ ' + range.max; + } + + var $chip = $('', { + class: 'range-chip', + 'data-min': range.min !== null ? range.min : '', + 'data-max': range.max !== null ? range.max : '' + }); + $chip.append($('', { class: 'range-chip-text', text: chipText })); + $chip.append($(''; + html += '' + this.escapeHtml(pattern) + ''; + html += ''; + html += ''; + $chipsContainer.append(html); + }, + + /** + * Get all pattern tags from a wrapper + * Returns array of objects: { pattern: string, caseSensitive: boolean } + */ + getPatternTags: function($wrapper) { + var patterns = []; + // Exclude draft-tag which is the input field, not a saved pattern + $wrapper.find('.pattern-tag:not(.draft-tag)').each(function() { + var pattern = $(this).data('pattern'); + var caseSensitive = $(this).data('caseSensitive') === 1 || $(this).data('caseSensitive') === '1'; + if (pattern) { + patterns.push({ + pattern: pattern, + caseSensitive: caseSensitive + }); + } + }); + return patterns; + }, + + /** + * Update the match count displayed in the draft tag while typing + * Shows live preview with current case sensitivity setting + */ + updateDraftTagCount: function($draftTag, pattern, caseSensitive) { + var self = this; + var $matchCount = $draftTag.find('.pattern-match-count'); + var $countValue = $matchCount.find('.count-value'); + + // Get entity type from block + var $block = $draftTag.closest('.target-block'); + var entityType = $block.data('blockType') || 'products'; + + // Show loading - keep eye icon, update count value + $countValue.html(''); + $matchCount.show(); + + // Store pattern for click handler + $matchCount.data('pattern', pattern); + $matchCount.data('caseSensitive', caseSensitive); + $matchCount.data('entityType', entityType); + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countPatternMatches', + trait: 'EntitySelector', + pattern: pattern, + field: 'name', + entity_type: entityType, + case_sensitive: caseSensitive ? 1 : 0 + }, + success: function(response) { + if (response.success) { + var count = parseInt(response.count, 10) || 0; + $countValue.text(count); + $matchCount.show(); + // Add visual feedback based on count + $matchCount.removeClass('count-zero count-found'); + $matchCount.addClass(count === 0 ? 'count-zero' : 'count-found'); + // Store count for preview + $matchCount.data('count', count); + // Update group total count to reflect draft pattern in calculation + var $group = $draftTag.closest('.selection-group'); + if ($group.length) { + self.updateGroupTotalCount($group); + } + } else { + $countValue.text('?'); + $matchCount.show(); + } + }, + error: function() { + $countValue.text('?'); + $matchCount.show(); + } + }); + }, + + /** + * Update condition count with a pending pattern (typed but not yet added as tag) + * This shows a live preview of what the count would be if the user pressed Enter + */ + updateConditionCountWithPendingPattern: function($row, pendingPattern) { + var self = this; + var trans = this.config.trans || {}; + + // Find the count element - in method-selector-wrapper for include, in exclude-header-row for exclude + var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count').first(); + if (!$countEl.length) return; + + var isExclude = $row.hasClass('exclude-row'); + var $methodSelect = isExclude + ? $row.find('.exclude-method-select') + : $row.find('.include-method-select'); + + var method = $methodSelect.val(); + if (!method) { + $countEl.hide(); + return; + } + + var $picker = isExclude + ? $row.find('.exclude-picker') + : $row.find('.include-picker'); + + var valueType = $picker.data('valueType') || 'none'; + + // Only process for pattern value types + if (valueType !== 'pattern') { + return; + } + + // Get existing pattern tags + var values = this.getPatternTags($picker); + + // Add the pending pattern as a temporary tag (case-insensitive by default) + if (pendingPattern) { + values.push({ pattern: pendingPattern, caseSensitive: false }); + } + + if (values.length === 0) { + $countEl.hide(); + return; + } + + var $block = $row.closest('.target-block'); + var blockType = $block.data('blockType') || 'products'; + + // Show loading + $countEl.find('.preview-count').html(''); + $countEl.removeClass('clickable no-matches').show(); + + // Store condition data on badge for popover + $countEl.data('conditionData', { + method: method, + values: values, + blockType: blockType, + isExclude: isExclude + }); + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countConditionMatches', + trait: 'EntitySelector', + method: method, + values: JSON.stringify(values), + block_type: blockType + }, + success: function(response) { + if (response && response.success) { + var count = response.count || 0; + $countEl.removeClass('no-matches clickable'); + if (count === 0) { + $countEl.find('.preview-count').text(count); + $countEl.addClass('no-matches').show(); + } else { + $countEl.find('.preview-count').text(count); + $countEl.addClass('clickable').show(); + } + } else { + $countEl.hide().removeClass('clickable'); + } + }, + error: function() { + $countEl.hide().removeClass('clickable'); + } + }); + }, + + /** + * Fetch pattern match count via AJAX + */ + fetchPatternMatchCount: function($picker, pattern, $countEl) { + // Determine field type from method select + // Check if we're in an exclude row first, then fall back to include + var $excludeRow = $picker.closest('.exclude-row'); + var $methodSelect; + if ($excludeRow.length) { + $methodSelect = $excludeRow.find('.exclude-method-select'); + } else { + var $group = $picker.closest('.selection-group'); + $methodSelect = $group.find('.include-method-select'); + } + var method = $methodSelect.val() || ''; + var field = method.indexOf('reference') !== -1 ? 'reference' : 'name'; + + // Get entity type from block + var $block = $picker.closest('.target-block'); + var entityType = $block.data('blockType') || 'products'; + + // Show loading state + $countEl.find('.preview-count').html(''); + $countEl.removeClass('clickable no-matches').show(); + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countPatternMatches', + trait: 'EntitySelector', + pattern: pattern, + field: field, + entity_type: entityType, + case_sensitive: 0 + }, + success: function(response) { + if (response && response.success) { + var count = response.count || 0; + $countEl.find('.preview-count').text(count); + $countEl.removeClass('no-matches clickable').show(); + if (count === 0) { + $countEl.addClass('no-matches'); + } else { + $countEl.addClass('clickable'); + } + } else { + $countEl.hide(); + } + }, + error: function() { + $countEl.hide(); + } + }); + }, + + // ========================================================================= + // Picker Value Extraction + // ========================================================================= + + /** + * Get values from a picker based on its type + */ + getPickerValues: function($picker, valueType) { + switch (valueType) { + case 'entity_search': + var ids = []; + $picker.find('.entity-chip').each(function() { + var id = $(this).data('id'); + if (id) ids.push(id); + }); + return ids; + + case 'pattern': + var patternValues = this.getPatternTags($picker); + // Also include draft pattern if it has content (not yet added as tag) + var $draftPatternInput = $picker.find('.draft-tag .pattern-input'); + var draftPatternVal = $.trim($draftPatternInput.val()); + if (draftPatternVal) { + var draftCaseSens = $draftPatternInput.closest('.draft-tag').attr('data-case-sensitive') === '1'; + patternValues.push({ + pattern: draftPatternVal, + caseSensitive: draftCaseSens + }); + } + return patternValues; + + case 'numeric_range': + var min = $picker.find('.range-min-input').val(); + var max = $picker.find('.range-max-input').val(); + return { min: min || null, max: max || null }; + + case 'date_range': + var from = $picker.find('.date-from-input').val(); + var to = $picker.find('.date-to-input').val(); + return { from: from || null, to: to || null }; + + case 'select': + return [$picker.find('.select-value-input').val()]; + + case 'boolean': + return [true]; + + default: + return []; + } + }, + + // ========================================================================= + // Count/Status Updates + // ========================================================================= + + /** + * Fetch and update condition match count for a row (include or exclude) + */ + updateConditionCount: function($row) { + var self = this; + var trans = this.config.trans || {}; + + // Find the count element - in method-selector-wrapper for include, in exclude-header-row for exclude + var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row > .condition-match-count').first(); + if (!$countEl.length) return; + + // Determine if this is an include or exclude row + var isExclude = $row.hasClass('exclude-row'); + var $methodSelect = isExclude + ? $row.find('.exclude-method-select') + : $row.find('.include-method-select'); + + var method = $methodSelect.val(); + if (!method) { + $countEl.hide(); + return; + } + + // Get the picker and extract values + var $picker = isExclude + ? $row.find('.exclude-picker') + : $row.find('.include-picker'); + + var valueType = $picker.data('valueType') || 'none'; + var values = this.getPickerValues($picker, valueType); + + // Don't count if no values (except for boolean/all methods) + var hasNoValues = !values || + (Array.isArray(values) && values.length === 0) || + (typeof values === 'object' && !Array.isArray(values) && ( + // For combination_attributes, check if attributes object is empty + (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) || + // For other objects, check if completely empty + (valueType !== 'combination_attributes' && Object.keys(values).length === 0) + )); + if (valueType !== 'none' && valueType !== 'boolean' && hasNoValues) { + $countEl.hide(); + return; + } + + // Get block type + var $block = $row.closest('.target-block'); + var blockType = $block.data('blockType') || 'products'; + + // Show loading + $countEl.find('.preview-count').html(''); + $countEl.removeClass('clickable no-matches').show(); + + // Store condition data on badge for popover + $countEl.data('conditionData', { + method: method, + values: values, + blockType: blockType, + isExclude: isExclude + }); + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countConditionMatches', + trait: 'EntitySelector', + method: method, + values: JSON.stringify(values), + block_type: blockType + }, + success: function(response) { + if (response && response.success) { + var count = response.count || 0; + $countEl.removeClass('no-matches clickable'); + if (count === 0) { + $countEl.find('.preview-count').text(count); + $countEl.addClass('no-matches').show(); + } else { + // Show count, make clickable for preview popover + $countEl.find('.preview-count').text(count); + $countEl.addClass('clickable').show(); + } + } else { + $countEl.hide().removeClass('clickable'); + } + }, + error: function() { + $countEl.hide().removeClass('clickable'); + } + }); + }, + + /** + * Update all condition counts in a group + */ + updateGroupCounts: function($group) { + var self = this; + + // Update include count + var $include = $group.find('.group-include'); + if ($include.length) { + this.updateConditionCount($include); + } + + // Update each exclude row count + $group.find('.exclude-row').each(function() { + self.updateConditionCount($(this)); + }); + + // Update group total count (include - excludes) + this.updateGroupTotalCount($group); + }, + + /** + * Update the group total count badge (include - excludes) + * Also updates the limit input placeholder + */ + updateGroupTotalCount: function($group) { + var self = this; + var $block = $group.closest('.target-block'); + var blockType = $block.data('blockType') || 'products'; + var $badge = $group.find('.group-header .group-count-badge'); + var $limitInput = $group.find('.group-modifier-limit'); + + // Build group data for AJAX + var groupData = this.serializeGroup($group, blockType); + + // Check if include has valid data + if (!groupData.include || !groupData.include.method) { + $badge.hide(); + $limitInput.attr('placeholder', '–'); + return; + } + + // Show loading + $badge.html('').show(); + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countGroupItems', + trait: 'EntitySelector', + group_data: JSON.stringify(groupData), + block_type: blockType + }, + success: function(response) { + if (response && response.success) { + var finalCount = response.final_count || 0; + var excludeCount = response.exclude_count || 0; + + // Update badge with eye icon and count + var badgeHtml = ' ' + finalCount; + if (excludeCount > 0) { + badgeHtml += ' (-' + excludeCount + ')'; + } + $badge.html(badgeHtml); + $badge.addClass('clickable').show(); + + // Store group data on badge for preview popover + $badge.data('groupData', groupData); + $badge.data('blockType', blockType); + $badge.data('finalCount', finalCount); + + // Update limit placeholder with the count + $limitInput.attr('placeholder', finalCount); + + // Also update the group-preview-badge count (apply limit if set) + var $previewBadge = $group.find('.group-preview-badge .preview-count'); + if ($previewBadge.length) { + var limit = parseInt($limitInput.val(), 10); + var displayCount = (limit > 0 && limit < finalCount) ? limit : finalCount; + $previewBadge.text(displayCount); + } + } else { + $badge.hide().removeClass('clickable'); + $limitInput.attr('placeholder', '–'); + } + }, + error: function() { + $badge.hide(); + $limitInput.attr('placeholder', '–'); + } + }); + }, + + /** + * Update all condition counts for all visible groups + */ + updateAllConditionCounts: function() { + var self = this; + this.$wrapper.find('.target-block.active .selection-group').each(function() { + self.updateGroupCounts($(this)); + }); + }, + + /** + * Fetch category names by IDs and add chips to the picker + * Used when adding selections from the tree modal + * @param {jQuery} $picker - Picker element + * @param {Array} ids - Category IDs to add + * @param {string} entityType - 'categories' or 'cms_categories' + * @param {Function} callback - Called when done + */ + fetchCategoryNamesAndAddChips: function($picker, ids, entityType, callback) { + var self = this; + + if (!ids || ids.length === 0) { + if (typeof callback === 'function') { + callback(); + } + return; + } + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'getTargetEntitiesByIds', + trait: 'EntitySelector', + entity_type: entityType, + ids: JSON.stringify(ids) + }, + success: function(response) { + if (response.success && response.entities) { + response.entities.forEach(function(entity) { + self.addSelectionNoUpdate($picker, entity.id, entity.name, entity); + }); + } + if (typeof callback === 'function') { + callback(); + } + }, + error: function() { + if (typeof callback === 'function') { + callback(); + } + } + }); + } + }; + +})(jQuery); + +/** + * Entity Selector - Groups Module + * Selection group management, serialization, block/tab management + * @partial _groups.js + * + * Contains: + * - Group management: addGroup, removeGroup, clearAllConditions + * - Block/Tab: switchToBlock, updateTabBadges, updateBlockStatus + * - Serialization: serializeGroup, serializeAllBlocks, getBlockGroups + * - Counts: fetchProductCount, updateHeaderTotalCount, updateAllConditionCounts + * - Excludes: addFirstExcludeRow, addExcludeRow, removeExcludeRow + * - Validation: validate, showValidationError, clearValidationError + */ + +(function($) { + 'use strict'; + + window._EntitySelectorMixins = window._EntitySelectorMixins || {}; + + window._EntitySelectorMixins.groups = { + + addGroup: function($block, blockType) { + var $container = $block.find('.groups-container'); + var trans = this.config.trans || {}; + var blockDef = this.config.blocks[blockType] || {}; + var methods = blockDef.selection_methods || {}; + + // Remove empty state + $container.find('.groups-empty-state').remove(); + + // Get next group index + var maxIndex = -1; + $container.find('.selection-group').each(function() { + var idx = parseInt($(this).data('groupIndex'), 10); + if (idx > maxIndex) maxIndex = idx; + }); + var groupIndex = maxIndex + 1; + + // Build method options with optgroups + var methodOptions = this.buildMethodOptions(methods, false); + + // Build exclude method options (no "all") with optgroups + var excludeMethodOptions = this.buildMethodOptions(methods, true); + + var defaultGroupName = (trans.group || 'Group') + ' ' + (groupIndex + 1); + var html = '
'; + + // Group header + html += '
'; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += '
'; + + // Group body (collapsible content) + html += '
'; + + // Include section + html += '
'; + html += '
'; + html += '
'; + html += ''; + html += ' 0'; + html += ''; + html += '
'; + var noItemsText = trans.no_items_selected || 'No items selected - use search below'; + html += ''; + html += '
'; + html += '
'; + + // Excludes section (collapsed by default) + html += '
'; + html += ''; + html += '
'; + + // Group-level modifiers (limit & sort) + html += '
'; + html += ''; + html += '' + (trans.limit || 'Limit') + ''; + html += ''; + html += ''; + html += ''; + html += '' + (trans.sort || 'Sort') + ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ' '; + html += ''; + html += '
'; + + html += '
'; // Close group-body + + html += '
'; // Close selection-group + + $container.append(html); + + // Find the new group and set method to "all" by default + var $newGroup = $container.find('.selection-group[data-group-index="' + groupIndex + '"]'); + + // Enhance the method select with styled dropdown + this.enhanceMethodSelect($newGroup.find('.include-method-select')); + + $newGroup.find('.include-method-select').val('all').trigger('change'); + + this.updateBlockStatus($block); + this.serializeAllBlocks(); + }, + + removeGroup: function($group, $block) { + $group.remove(); + + var $container = $block.find('.groups-container'); + var remainingGroups = $container.find('.selection-group').length; + + if (remainingGroups === 0) { + var emptyText = this.getEmptyStateText($block); + var emptyHtml = '
'; + emptyHtml += '' + emptyText + ''; + emptyHtml += '
'; + $container.html(emptyHtml); + } + + this.updateBlockStatus($block); + this.serializeAllBlocks(); + + // Update tab badges and header total count + this.updateTabBadges(); + }, + + clearAllConditions: function() { + var self = this; + + // Remove all groups from all blocks + this.$wrapper.find('.target-block').each(function() { + var $block = $(this); + var $container = $block.find('.groups-container'); + + // Remove all groups + $container.find('.selection-group').remove(); + + // Show empty state + var emptyText = self.getEmptyStateText($block); + var emptyHtml = '
'; + emptyHtml += '' + emptyText + ''; + emptyHtml += '
'; + $container.html(emptyHtml); + + self.updateBlockStatus($block); + }); + + // Update serialized data + this.serializeAllBlocks(); + + // Update tab badges and header count + this.updateTabBadges(); + + // Also update header total count immediately (since all cleared) + this.updateHeaderTotalCount(); + }, + + switchToBlock: function(blockType) { + // Update tabs + this.$wrapper.find('.target-block-tab').removeClass('active'); + this.$wrapper.find('.target-block-tab[data-block-type="' + blockType + '"]').addClass('active'); + + // Update blocks + this.$wrapper.find('.target-block').removeClass('active').hide(); + this.$wrapper.find('.target-block[data-block-type="' + blockType + '"]').addClass('active').show(); + + // Close dropdown if open + this.hideDropdown(); + }, + + updateTabBadges: function() { + var self = this; + + // Collect all block types with data and set loading state + var blockTypesWithData = []; + this.$wrapper.find('.target-block-tab').each(function() { + var $tab = $(this); + var blockType = $tab.data('blockType'); + var $block = self.$wrapper.find('.target-block[data-block-type="' + blockType + '"]'); + var groupCount = $block.find('.selection-group').length; + + // Update or add badge + var $badge = $tab.find('.tab-badge'); + if (groupCount > 0) { + // Show loading state first + if ($badge.length) { + $badge.addClass('loading').html(''); + } else { + $tab.append(''); + } + $tab.addClass('has-data'); + blockTypesWithData.push(blockType); + } else { + $badge.remove(); + $tab.removeClass('has-data'); + } + }); + + // Update target switch state based on whether any data exists + this.updateTargetSwitchState(); + + // Fetch all counts in a single bulk request + if (blockTypesWithData.length > 0) { + this.fetchAllCounts(blockTypesWithData); + } + }, + + updateTargetSwitchState: function() { + var $switch = this.$wrapper.find('.prestashop-switch'); + if (!$switch.length) { + return; + } + + // Check if any block has data + var hasData = false; + this.$wrapper.find('.target-block').each(function() { + if ($(this).find('.selection-group').length > 0) { + hasData = true; + return false; // break + } + }); + + // Update switch: value="1" is "Everyone/All/None", value="0" is "Specific/Selected" + if (hasData) { + $switch.find('input[value="0"]').prop('checked', true); + } else { + $switch.find('input[value="1"]').prop('checked', true); + } + }, + + /** + * Fetch counts for all block types in a single bulk AJAX request + * @param {Array} blockTypes - Array of block type strings to fetch counts for + */ + fetchAllCounts: function(blockTypes) { + var self = this; + + // Read saved data from hidden input + var $hiddenInput = this.$wrapper.find('input[name="' + this.config.name + '"]'); + var savedData = {}; + try { + savedData = JSON.parse($hiddenInput.val() || '{}'); + } catch (e) { + savedData = {}; + } + + // Build conditions object for all requested block types + var conditions = {}; + blockTypes.forEach(function(blockType) { + var groups = (savedData[blockType] && savedData[blockType].groups) ? savedData[blockType].groups : []; + if (groups.length > 0) { + conditions[blockType] = { groups: groups }; + } + }); + + // If no valid conditions, remove loading spinners + if (Object.keys(conditions).length === 0) { + blockTypes.forEach(function(blockType) { + var $tab = self.$wrapper.find('.target-block-tab[data-block-type="' + blockType + '"]'); + $tab.find('.tab-badge').remove(); + $tab.removeClass('has-data'); + }); + return; + } + + // Single bulk AJAX request for all counts + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'previewEntitySelectorBulk', + trait: 'EntitySelector', + conditions: JSON.stringify(conditions) + }, + success: function(response) { + if (response.success && response.counts) { + // Update each tab with its count + Object.keys(response.counts).forEach(function(blockType) { + var count = response.counts[blockType]; + var $tab = self.$wrapper.find('.target-block-tab[data-block-type="' + blockType + '"]'); + var $badge = $tab.find('.tab-badge'); + + if ($badge.length) { + $badge.removeClass('loading').html(' ' + count); + // Store preview data for later popover use + $tab.data('previewData', { count: count, success: true }); + } + }); + + // Handle any block types not in response (set count to 0 or remove badge) + blockTypes.forEach(function(blockType) { + if (!(blockType in response.counts)) { + var $tab = self.$wrapper.find('.target-block-tab[data-block-type="' + blockType + '"]'); + $tab.find('.tab-badge').remove(); + $tab.removeClass('has-data'); + } + }); + + self.updateHeaderTotalCount(); + } else { + console.error('[EntitySelector] Bulk preview failed:', response.error || 'Unknown error'); + // Remove loading spinners on error + blockTypes.forEach(function(blockType) { + var $tab = self.$wrapper.find('.target-block-tab[data-block-type="' + blockType + '"]'); + $tab.find('.tab-badge').remove(); + }); + } + }, + error: function(xhr, status, error) { + console.error('[EntitySelector] Bulk AJAX error:', status, error); + // Remove loading spinners on error + blockTypes.forEach(function(blockType) { + var $tab = self.$wrapper.find('.target-block-tab[data-block-type="' + blockType + '"]'); + $tab.find('.tab-badge').remove(); + }); + } + }); + }, + + /** + * Fetch count for a single block type (legacy, used for single updates) + */ + fetchProductCount: function(blockType, $tab) { + var self = this; + var data = {}; + + // Read from hidden input (contains full saved data or freshly serialized data) + var $hiddenInput = this.$wrapper.find('input[name="' + this.config.name + '"]'); + var savedData = {}; + try { + savedData = JSON.parse($hiddenInput.val() || '{}'); + } catch (e) { + savedData = {}; + } + + // Get groups for the requested block type + var groups = (savedData[blockType] && savedData[blockType].groups) ? savedData[blockType].groups : []; + + if (groups.length === 0) { + $tab.find('.tab-badge').remove(); + $tab.removeClass('has-data'); + $tab.removeData('previewData'); + return; + } + + // Show loading state + var $badge = $tab.find('.tab-badge'); + if (!$badge.length) { + $badge = $(''); + $tab.append($badge); + } else { + $badge.addClass('loading').html(''); + } + $tab.addClass('has-data'); + + data[blockType] = { groups: groups }; + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'previewEntitySelector', + trait: 'EntitySelector', + conditions: JSON.stringify(data), + block_type: blockType, + limit: 10 + }, + success: function(response) { + if (response.success) { + var $badge = $tab.find('.tab-badge'); + $badge.removeClass('loading').html(' ' + response.count); + + // Store preview data for popover + $tab.data('previewData', response); + + // Update header total count + self.updateHeaderTotalCount(); + } else { + console.error('[EntitySelector] Preview failed for', blockType, ':', response.error || 'Unknown error'); + $tab.find('.tab-badge').remove(); + } + }, + error: function(xhr, status, error) { + console.error('[EntitySelector] AJAX error for', blockType, ':', status, error); + $tab.find('.tab-badge').remove(); + self.updateHeaderTotalCount(); + } + }); + }, + + updateHeaderTotalCount: function() { + var self = this; + var total = 0; + + // Sum up all tab badge counts + this.$wrapper.find('.target-block-tab .tab-badge').each(function() { + var $badge = $(this); + if (!$badge.hasClass('loading')) { + var count = parseInt($badge.text(), 10); + if (!isNaN(count)) { + total += count; + } + } + }); + + var $totalBadge = this.$wrapper.find('.trait-total-count'); + if (total > 0) { + $totalBadge.find('.count-value').text(total); + $totalBadge.show(); + } else { + $totalBadge.hide(); + } + + // Update show-all toggle state + this.updateShowAllToggle(); + }, + + updateShowAllToggle: function() { + var $toggle = this.$wrapper.find('.trait-show-all-toggle'); + if (!$toggle.length) return; + + var $checkbox = $toggle.find('.show-all-checkbox'); + var hasData = this.$wrapper.find('.target-block-tab.has-data').length > 0; + + // If there's data, uncheck (not showing to all), otherwise check + $checkbox.prop('checked', !hasData); + }, + + updateBlockStatus: function($block) { + var $status = $block.find('.block-status'); + var blockType = $block.data('blockType'); + var blockDef = this.config.blocks[blockType] || {}; + var trans = this.config.trans || {}; + + var groups = this.getBlockGroups($block); + + if (groups.length === 0) { + var emptyMeansAll = this.config.emptyMeansAll !== false; + if (emptyMeansAll) { + $status.text((trans.all || 'All') + ' ' + (blockDef.entity_label_plural || 'items')); + } else { + $status.text(trans.nothing_selected || 'Nothing selected'); + } + } else { + $status.text(groups.length + ' ' + (groups.length === 1 ? (trans.group || 'group') : (trans.groups || 'groups'))); + } + }, + + getEmptyStateText: function($block) { + var blockType = $block.data('blockType'); + var blockMode = $block.data('mode') || 'multi'; + var blockDef = this.config.blocks[blockType] || {}; + var trans = this.config.trans || {}; + var emptyMeansAll = this.config.emptyMeansAll !== false; + + if (blockMode === 'single') { + return trans.no_item_selected || 'No item selected'; + } + + if (emptyMeansAll) { + return (trans.all || 'All') + ' ' + (blockDef.entity_label_plural || 'items') + ' ' + (trans.included || 'included'); + } + + return trans.nothing_selected || 'Nothing selected'; + }, + + serializeGroup: function($group, blockType) { + var self = this; + + // Include + var includeMethod = $group.find('.include-method-select').val() || 'all'; + var $includePicker = $group.find('.include-picker'); + var includeValues = this.getPickerValues($includePicker); + + // Excludes (multiple rows) + var excludes = []; + var $excludesSection = $group.find('.group-excludes.has-excludes'); + if ($excludesSection.length) { + $group.find('.exclude-row').each(function() { + var $row = $(this); + var excludeMethod = $row.find('.exclude-method-select').val() || null; + var $excludePicker = $row.find('.exclude-picker'); + var excludeValues = self.getPickerValues($excludePicker); + + if (excludeMethod && excludeValues && (Array.isArray(excludeValues) ? excludeValues.length > 0 : true)) { + excludes.push({ + method: excludeMethod, + values: excludeValues + }); + } + }); + } + + var groupData = { + include: { + method: includeMethod, + values: includeValues + } + }; + + if (excludes.length > 0) { + groupData.excludes = excludes; + } + + // Add modifiers if present + var modifiers = this.getGroupModifiers($group); + if (modifiers.limit || modifiers.sort_by) { + groupData.modifiers = modifiers; + } + + return groupData; + }, + + serializeAllBlocks: function($changedRow) { + var self = this; + var data = {}; + + this.$wrapper.find('.target-block').each(function() { + var $block = $(this); + var blockType = $block.data('blockType'); + var groups = self.getBlockGroups($block); + + // Groups now contain their own modifiers, no block-level modifiers + if (groups.length > 0) { + data[blockType] = { groups: groups }; + } + + self.updateBlockStatus($block); + }); + + // Update hidden input first + var $input = this.$wrapper.find('input[name="' + this.config.name + '"]'); + $input.val(JSON.stringify(data)); + + // Then update tab badges (reads from hidden input) + this.updateTabBadges(); + + // Debounced update of condition count - only for changed row if specified + if (this.countUpdateTimeout) { + clearTimeout(this.countUpdateTimeout); + } + this.countUpdateTimeout = setTimeout(function() { + if ($changedRow && $changedRow.length) { + // Update the specific row that changed + self.updateConditionCount($changedRow); + // Also update the group total count (include - excludes) + var $group = $changedRow.closest('.selection-group'); + if ($group.length) { + self.updateGroupTotalCount($group); + } + } else { + // Fallback: update all counts (initial load, structure changes) + self.updateAllConditionCounts(); + } + }, 500); + }, + + getBlockGroups: function($block) { + var self = this; + var groups = []; + + $block.find('.selection-group').each(function() { + var $group = $(this); + + // Include + var includeMethod = $group.find('.include-method-select').val() || 'all'; + var $includePicker = $group.find('.include-picker'); + var includeValues = self.getPickerValues($includePicker); + + // Skip groups with invalid include conditions (e.g., "specific products" with none selected) + if (!self.isConditionValid(includeMethod, includeValues, $includePicker)) { + return true; // continue to next group + } + + // Excludes (multiple rows) - only include valid ones + var excludes = []; + var $excludesSection = $group.find('.group-excludes.has-excludes'); + if ($excludesSection.length) { + $group.find('.exclude-row').each(function() { + var $row = $(this); + var excludeMethod = $row.find('.exclude-method-select').val() || null; + var $excludePicker = $row.find('.exclude-picker'); + var excludeValues = self.getPickerValues($excludePicker); + + // Only include valid exclude conditions + if (excludeMethod && self.isConditionValid(excludeMethod, excludeValues, $excludePicker)) { + excludes.push({ + method: excludeMethod, + values: excludeValues + }); + } + }); + } + + var groupData = { + include: { + method: includeMethod, + values: includeValues + } + }; + + // Group name (optional, for organizational purposes) + var groupName = $.trim($group.attr('data-group-name') || ''); + if (groupName) { + groupData.name = groupName; + } + + if (excludes.length > 0) { + groupData.excludes = excludes; + } + + // Group-level modifiers + var modifiers = self.getGroupModifiers($group); + if (modifiers.limit || modifiers.sort_by) { + groupData.modifiers = modifiers; + } + + groups.push(groupData); + }); + + return groups; + }, + + getGroupModifiers: function($group) { + var limit = $group.find('.group-modifier-limit').val(); + var sortBy = $group.find('.group-modifier-sort').val() || 'sales'; + var $sortDirBtn = $group.find('.group-modifiers .btn-sort-dir'); + var sortDir = $sortDirBtn.data('dir') || 'DESC'; + + return { + limit: limit ? parseInt(limit, 10) : null, + sort_by: sortBy || null, + sort_dir: sortDir || 'DESC' + }; + }, + + getPickerValues: function($picker) { + var valueType = $picker.attr('data-value-type') || 'entity_search'; + var values = []; + + switch (valueType) { + case 'entity_search': + $picker.find('.entity-chip').each(function() { + var id = $(this).data('id'); + values.push(isNaN(id) ? id : Number(id)); + }); + break; + + case 'pattern': + values = this.getPatternTags($picker); + // Also include draft pattern if it has content (not yet added as tag) + var $draftInput = $picker.find('.draft-tag .pattern-input'); + var draftPattern = $.trim($draftInput.val()); + if (draftPattern) { + var draftCaseSensitive = $draftInput.closest('.draft-tag').attr('data-case-sensitive') === '1'; + values.push({ + pattern: draftPattern, + caseSensitive: draftCaseSensitive + }); + } + break; + + case 'numeric_range': + var min = $picker.find('.range-min-input').val(); + var max = $picker.find('.range-max-input').val(); + if (min !== '' || max !== '') { + values = { + min: min !== '' ? parseFloat(min) : null, + max: max !== '' ? parseFloat(max) : null + }; + } + break; + + case 'date_range': + var from = $picker.find('.date-from-input').val(); + var to = $picker.find('.date-to-input').val(); + if (from || to) { + values = { + from: from || null, + to: to || null + }; + } + break; + + case 'select': + var selectVal = $picker.find('.select-value-input').val(); + if (selectVal) { + values = [selectVal]; + } + break; + + case 'boolean': + values = [true]; + break; + + case 'multi_numeric_range': + var ranges = []; + $picker.find('.range-chip').each(function() { + var $chip = $(this); + var minVal = $chip.data('min'); + var maxVal = $chip.data('max'); + ranges.push({ + min: minVal !== '' && minVal !== undefined ? parseFloat(minVal) : null, + max: maxVal !== '' && maxVal !== undefined ? parseFloat(maxVal) : null + }); + }); + if (ranges.length > 0) { + values = ranges; + } + break; + + case 'multi_select_tiles': + $picker.find('.tile-option.selected').each(function() { + values.push($(this).data('value')); + }); + break; + + case 'combination_attributes': + // Returns object: { mode: 'products'|'combinations', attributes: { groupId: [valueId1, valueId2], ... } } + var combAttrs = {}; + $picker.find('.comb-attr-value.selected').each(function() { + var groupId = $(this).data('groupId').toString(); + var valueId = $(this).data('valueId'); + if (!combAttrs[groupId]) { + combAttrs[groupId] = []; + } + combAttrs[groupId].push(valueId); + }); + if (Object.keys(combAttrs).length > 0) { + // Get mode: from radio if toggle exists, otherwise from config + var $combPicker = $picker.find('.combination-attributes-picker'); + var configMode = $combPicker.data('combinationMode') || this.config.combinationMode || 'products'; + var combMode; + if (configMode === 'toggle') { + combMode = $picker.find('.comb-mode-radio:checked').val() || 'products'; + } else { + combMode = configMode; + } + values = { + mode: combMode, + attributes: combAttrs + }; + } + break; + } + + return values; + }, + + isConditionValid: function(method, values, $picker) { + // 'all' method never needs values + if (method === 'all') { + return true; + } + + // Boolean methods are always valid (the value is implicit true) + var valueType = $picker.attr('data-value-type') || 'entity_search'; + if (valueType === 'boolean') { + return true; + } + + // For other methods, check if values are meaningful + if (Array.isArray(values)) { + return values.length > 0; + } + + // For object values (ranges, combination_attributes), check if meaningful + if (typeof values === 'object' && values !== null) { + // Special handling for combination_attributes: { mode, attributes } + if (valueType === 'combination_attributes' && values.attributes !== undefined) { + return Object.keys(values.attributes).length > 0; + } + // For ranges and other objects, check if at least one bound is set + return Object.keys(values).some(function(key) { + return values[key] !== null && values[key] !== ''; + }); + } + + return false; + }, + + /** + * Update all condition counts using a single bulk AJAX request + */ + updateAllConditionCounts: function() { + var self = this; + var conditions = {}; + var conditionElements = {}; + var conditionIndex = 0; + + // Collect all conditions from all active groups + this.$wrapper.find('.target-block.active .selection-group').each(function() { + var $group = $(this); + var $block = $group.closest('.target-block'); + var blockType = $block.data('blockType') || 'products'; + + // Process include row + var $include = $group.find('.group-include'); + if ($include.length) { + var includeData = self.getConditionData($include, blockType); + if (includeData) { + var id = 'c' + conditionIndex++; + conditions[id] = includeData.condition; + conditionElements[id] = includeData.$countEl; + } + } + + // Process exclude rows + $group.find('.exclude-row').each(function() { + var excludeData = self.getConditionData($(this), blockType); + if (excludeData) { + var id = 'c' + conditionIndex++; + conditions[id] = excludeData.condition; + conditionElements[id] = excludeData.$countEl; + } + }); + }); + + // If no conditions, nothing to do + if (Object.keys(conditions).length === 0) { + return; + } + + // Make single bulk AJAX request + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countConditionMatchesBulk', + trait: 'EntitySelector', + conditions: JSON.stringify(conditions) + }, + success: function(response) { + if (response && response.success && response.counts) { + // Update each count element with its result + Object.keys(response.counts).forEach(function(id) { + var count = response.counts[id] || 0; + var $countEl = conditionElements[id]; + if ($countEl && $countEl.length) { + $countEl.removeClass('no-matches clickable'); + if (count === 0) { + $countEl.find('.preview-count').text(count); + $countEl.addClass('no-matches').show(); + } else { + $countEl.find('.preview-count').text(count); + $countEl.addClass('clickable').show(); + } + } + }); + } + // Note: Group totals are updated on-demand when user interacts, not on initial load + }, + error: function() { + // Hide all count elements on error + Object.keys(conditionElements).forEach(function(id) { + var $countEl = conditionElements[id]; + if ($countEl && $countEl.length) { + $countEl.hide().removeClass('clickable'); + } + }); + } + }); + }, + + /** + * Extract condition data from a row for bulk counting + */ + getConditionData: function($row, blockType) { + var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count').first(); + if (!$countEl.length) return null; + + var isExclude = $row.hasClass('exclude-row'); + var $methodSelect = isExclude + ? $row.find('.exclude-method-select') + : $row.find('.include-method-select'); + + var method = $methodSelect.val(); + if (!method) { + $countEl.hide(); + return null; + } + + var $picker = isExclude + ? $row.find('.exclude-picker') + : $row.find('.include-picker'); + + var valueType = $picker.data('valueType') || 'none'; + var values = this.getPickerValues($picker, valueType); + + // Don't count if no values (except for boolean/all methods) + var hasNoValues = !values || + (Array.isArray(values) && values.length === 0) || + (typeof values === 'object' && !Array.isArray(values) && ( + (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) || + (valueType !== 'combination_attributes' && Object.keys(values).length === 0) + )); + if (valueType !== 'none' && valueType !== 'boolean' && hasNoValues) { + $countEl.hide(); + return null; + } + + // Show loading spinner + $countEl.find('.preview-count').html(''); + $countEl.removeClass('clickable no-matches').show(); + + // Store condition data on badge for popover + $countEl.data('conditionData', { + method: method, + values: values, + blockType: blockType, + isExclude: isExclude + }); + + return { + condition: { + method: method, + values: values, + block_type: blockType + }, + $countEl: $countEl + }; + }, + + updateGroupCounts: function($group) { + var self = this; + var $block = $group.closest('.target-block'); + var blockType = $block.data('blockType') || 'products'; + + // Update include count + var $include = $group.find('.group-include'); + if ($include.length) { + this.updateConditionCount($include, blockType); + } + + // Update each exclude row count + $group.find('.exclude-row').each(function() { + self.updateConditionCount($(this), blockType); + }); + + // Update group total count (include - excludes) + this.updateGroupTotalCount($group); + }, + + /** + * Update a single condition count (used for individual updates after user changes) + */ + updateConditionCount: function($row, blockType) { + var self = this; + + var $countEl = $row.find('.method-selector-wrapper > .condition-match-count, > .exclude-header-row .condition-match-count').first(); + if (!$countEl.length) return; + + var isExclude = $row.hasClass('exclude-row'); + var $methodSelect = isExclude + ? $row.find('.exclude-method-select') + : $row.find('.include-method-select'); + + var method = $methodSelect.val(); + if (!method) { + $countEl.hide(); + return; + } + + var $picker = isExclude + ? $row.find('.exclude-picker') + : $row.find('.include-picker'); + + var valueType = $picker.data('valueType') || 'none'; + var values = this.getPickerValues($picker, valueType); + + var hasNoValues = !values || + (Array.isArray(values) && values.length === 0) || + (typeof values === 'object' && !Array.isArray(values) && ( + (valueType === 'combination_attributes' && values.attributes !== undefined && Object.keys(values.attributes).length === 0) || + (valueType !== 'combination_attributes' && Object.keys(values).length === 0) + )); + if (valueType !== 'none' && valueType !== 'boolean' && hasNoValues) { + $countEl.hide(); + return; + } + + if (!blockType) { + var $block = $row.closest('.target-block'); + blockType = $block.data('blockType') || 'products'; + } + + $countEl.find('.preview-count').html(''); + $countEl.removeClass('clickable no-matches').show(); + + $countEl.data('conditionData', { + method: method, + values: values, + blockType: blockType, + isExclude: isExclude + }); + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countConditionMatches', + trait: 'EntitySelector', + method: method, + values: JSON.stringify(values), + block_type: blockType + }, + success: function(response) { + if (response && response.success) { + var count = response.count || 0; + $countEl.removeClass('no-matches clickable'); + if (count === 0) { + $countEl.find('.preview-count').text(count); + $countEl.addClass('no-matches').show(); + } else { + $countEl.find('.preview-count').text(count); + $countEl.addClass('clickable').show(); + } + } else { + $countEl.hide().removeClass('clickable'); + } + }, + error: function() { + $countEl.hide().removeClass('clickable'); + } + }); + }, + + updateGroupTotalCount: function($group) { + var self = this; + var $block = $group.closest('.target-block'); + var blockType = $block.data('blockType') || 'products'; + var $badge = $group.find('.group-header .group-count-badge'); + var $limitInput = $group.find('.group-modifier-limit'); + + // Build group data for AJAX + var groupData = this.serializeGroup($group, blockType); + + // Check if include has valid data + if (!groupData.include || !groupData.include.method) { + $badge.hide(); + $limitInput.attr('placeholder', '–'); + return; + } + + // Show loading + $badge.html('').show(); + + $.ajax({ + url: this.config.ajaxUrl, + type: 'POST', + dataType: 'json', + data: { + ajax: 1, + action: 'countGroupItems', + trait: 'EntitySelector', + group_data: JSON.stringify(groupData), + block_type: blockType + }, + success: function(response) { + if (response && response.success) { + var finalCount = response.final_count || 0; + var excludeCount = response.exclude_count || 0; + + // Update badge with eye icon and count + var badgeHtml = ' ' + finalCount; + if (excludeCount > 0) { + badgeHtml += ' (-' + excludeCount + ')'; + } + $badge.html(badgeHtml); + $badge.addClass('clickable').show(); + + // Store group data on badge for preview popover + $badge.data('groupData', groupData); + $badge.data('blockType', blockType); + $badge.data('finalCount', finalCount); + + // Update limit placeholder with the count + $limitInput.attr('placeholder', finalCount); + + // Also update the group-preview-badge count (apply limit if set) + var $previewBadge = $group.find('.group-preview-badge .preview-count'); + if ($previewBadge.length) { + var limit = parseInt($limitInput.val(), 10); + var displayCount = (limit > 0 && limit < finalCount) ? limit : finalCount; + $previewBadge.text(displayCount); + } + } else { + $badge.hide().removeClass('clickable'); + $limitInput.attr('placeholder', '–'); + } + }, + error: function() { + $badge.hide(); + $limitInput.attr('placeholder', '–'); + } + }); + }, + + // Exclude row management + addFirstExcludeRow: function($group, $block) { + var $excludesDiv = $group.find('.group-excludes'); + var trans = this.config.trans || {}; + + // Build the full excludes structure with first row + var html = '
'; + html += ' ' + (trans.except || 'EXCEPT') + ''; + html += '
'; + + html += '
'; + html += this.buildExcludeRowHtml($block, 0); + html += '
'; + + html += ''; + + $excludesDiv.addClass('has-excludes').html(html); + + // Enhance the first exclude method select with styled dropdown + var $firstRow = $excludesDiv.find('.exclude-row[data-exclude-index="0"]'); + var $firstSelect = $firstRow.find('.exclude-method-select'); + this.enhanceMethodSelect($firstSelect); + + // Update method info placeholder for initial selection + var blockType = $block.data('blockType'); + var initialMethod = $firstSelect.val(); + this.updateMethodInfoPlaceholder($firstRow.find('.method-selector-wrapper'), initialMethod, blockType); + + this.updateMethodSelectorLock($group, true); + this.serializeAllBlocks(); + }, + + addExcludeRow: function($group, $block) { + var $container = $group.find('.exclude-rows-container'); + + // Get next exclude index + var maxIndex = -1; + $container.find('.exclude-row').each(function() { + var idx = parseInt($(this).data('excludeIndex'), 10); + if (idx > maxIndex) maxIndex = idx; + }); + var excludeIndex = maxIndex + 1; + + var html = this.buildExcludeRowHtml($block, excludeIndex); + $container.append(html); + + // Enhance the exclude method select with styled dropdown + var $newRow = $container.find('.exclude-row[data-exclude-index="' + excludeIndex + '"]'); + var $newSelect = $newRow.find('.exclude-method-select'); + this.enhanceMethodSelect($newSelect); + + // Update method info placeholder for initial selection + var blockType = $block.data('blockType'); + var initialMethod = $newSelect.val(); + this.updateMethodInfoPlaceholder($newRow.find('.method-selector-wrapper'), initialMethod, blockType); + + this.serializeAllBlocks(); + }, + + buildExcludeRowHtml: function($block, excludeIndex) { + var blockType = $block.data('blockType'); + var blockDef = this.config.blocks[blockType] || {}; + var methods = blockDef.selection_methods || {}; + var trans = this.config.trans || {}; + + // Build exclude method options with optgroups (no "all") + var excludeMethodOptions = this.buildMethodOptions(methods, true); + + // Find first non-all method for default search entity + var firstSearchEntity = blockType; + var firstValueType = 'entity_search'; + $.each(methods, function(methodKey, methodDef) { + if (methodKey === 'all') return true; + firstSearchEntity = methodDef.search_entity || blockType; + firstValueType = methodDef.value_type || 'entity_search'; + return false; // break + }); + + var html = '
'; + + // Header row with method select wrapped in method-selector-wrapper (same as include) + html += '
'; + html += '
'; + html += ''; + html += ' 0'; + html += ''; + html += '
'; + html += ''; + html += '
'; + + // Value picker based on first method's value type + html += this.buildValuePickerHtml('exclude', firstValueType, firstSearchEntity, methods); + + html += '
'; + + return html; + }, + + removeExcludeRow: function($excludeRow, $group, $block) { + var $container = $group.find('.exclude-rows-container'); + var trans = this.config.trans || {}; + + $excludeRow.remove(); + + // Check if there are remaining exclude rows + var remainingRows = $container.find('.exclude-row').length; + + if (remainingRows === 0) { + // Remove entire excludes section and show "Add exceptions" button + var $excludesDiv = $group.find('.group-excludes'); + $excludesDiv.removeClass('has-excludes').html( + '' + ); + // Unlock the method selector since no excludes exist + this.updateMethodSelectorLock($group, false); + } + + this.serializeAllBlocks(); + }, + + // Method options building + buildMethodOptions: function(methods, excludeAll) { + var self = this; + var trans = this.config.trans || {}; + var html = ''; + + // Group labels + var groupLabels = { + 'select_by': trans.select_by || 'Select by...', + 'filter_by': trans.filter_by || 'Filter by...' + }; + + // Separate methods by group + var grouped = {}; + var ungrouped = {}; + + $.each(methods, function(methodKey, methodDef) { + if (excludeAll && methodKey === 'all') return true; // skip + + var group = methodDef.group || ''; + if (group) { + if (!grouped[group]) { + grouped[group] = {}; + } + grouped[group][methodKey] = methodDef; + } else { + ungrouped[methodKey] = methodDef; + } + }); + + // Render ungrouped options first + $.each(ungrouped, function(methodKey, methodDef) { + html += self.buildMethodOption(methodKey, methodDef); + }); + + // Render grouped options with optgroups + $.each(grouped, function(groupKey, groupMethods) { + var groupLabel = groupLabels[groupKey] || groupKey.replace(/_/g, ' '); + html += ''; + $.each(groupMethods, function(methodKey, methodDef) { + html += self.buildMethodOption(methodKey, methodDef); + }); + html += ''; + }); + + return html; + }, + + buildMethodOption: function(methodKey, methodDef) { + var html = '