diff --git a/docs/Changelog.rst b/docs/Changelog.rst index 39fcbf9..9297444 100644 --- a/docs/Changelog.rst +++ b/docs/Changelog.rst @@ -1,6 +1,7 @@ 2.7.0 (unreleased) ------------------ +- #XXX Support label chips, click-to-filter, and label-aware saved filters - #176 Redesign TableColumnConfig as a searchable popover - #177 Refactor TextField to a modern ReactJS Component - #174 Add saved filter presets and listing filter refinements diff --git a/src/senaite/app/listing/browser/static/bundles/senaite.app.listing.399f3ada5c6723f34fc7.js b/src/senaite/app/listing/browser/static/bundles/senaite.app.listing.399f3ada5c6723f34fc7.js new file mode 100644 index 0000000..98820fc --- /dev/null +++ b/src/senaite/app/listing/browser/static/bundles/senaite.app.listing.399f3ada5c6723f34fc7.js @@ -0,0 +1,3 @@ +/*! For license information please see senaite.app.listing.399f3ada5c6723f34fc7.js.LICENSE.txt */ +(()=>{"use strict";var e={398(e,t,n){n.d(t,{A:()=>s});var r=n(942),o=n.n(r),i=n(278),a=n.n(i)()(o());a.push([e.id,":root{--contexify-zIndex:666;--contexify-menu-minWidth:220px;--contexify-menu-padding:6px;--contexify-menu-radius:6px;--contexify-menu-bgColor:#fff;--contexify-menu-shadow:1px 2px 2px rgba(0,0,0,.1),2px 4px 4px rgba(0,0,0,.1),3px 6px 6px rgba(0,0,0,.1);--contexify-menu-negatePadding:var(--contexify-menu-padding);--contexify-separator-color:rgba(0,0,0,.2);--contexify-separator-margin:5px;--contexify-itemContent-padding:6px;--contexify-activeItem-radius:4px;--contexify-item-color:#333;--contexify-activeItem-color:#fff;--contexify-activeItem-bgColor:#3498db;--contexify-rightSlot-color:#6f6e77;--contexify-activeRightSlot-color:#fff;--contexify-arrow-color:#6f6e77;--contexify-activeArrow-color:#fff}@keyframes contexify_feedback{0%{opacity:.4}to{opacity:1}}.contexify{position:fixed;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:var(--contexify-menu-bgColor);box-sizing:border-box;box-shadow:var(--contexify-menu-shadow);border-radius:var(--contexify-menu-radius);padding:var(--contexify-menu-padding);min-width:var(--contexify-menu-minWidth);z-index:var(--contexify-zIndex)}.contexify_submenu-isOpen,.contexify_submenu-isOpen>.contexify_itemContent{color:var(--contexify-activeItem-color);background-color:var(--contexify-activeItem-bgColor);border-radius:var(--contexify-activeItem-radius)}.contexify_submenu-isOpen>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-activeArrow-color)}.contexify_submenu-isOpen>.contexify_submenu{pointer-events:auto;opacity:1}.contexify .contexify_submenu{position:absolute;pointer-events:none;transition:opacity .265s;top:calc(-1 * var(--contexify-menu-negatePadding));left:100%}.contexify .contexify_submenu-bottom{bottom:calc(-1 * var(--contexify-menu-negatePadding));top:unset}.contexify .contexify_submenu-right{right:100%;left:unset}.contexify_rightSlot{margin-left:auto;display:-ms-flexbox;display:flex;color:var(--contexify-rightSlot-color)}.contexify_separator{height:1px;cursor:default;margin:var(--contexify-separator-margin);background-color:var(--contexify-separator-color)}.contexify_willLeave-disabled{pointer-events:none}.contexify_item{cursor:pointer;position:relative}.contexify_item:focus{outline:0}.contexify_item:focus .contexify_rightSlot,.contexify_item:not(.contexify_item-disabled):hover>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-activeRightSlot-color)}.contexify_item:not(.contexify_item-disabled)[aria-haspopup]>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-arrow-color)}.contexify_item:not(.contexify_item-disabled)[aria-haspopup].contexify_submenu-isOpen>.contexify_itemContent .contexify_rightSlot,.contexify_item:not(.contexify_item-disabled)[aria-haspopup]:hover>.contexify_itemContent .contexify_rightSlot,.contexify_item[aria-haspopup]:focus>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-activeArrow-color)}.contexify_item:not(.contexify_item-disabled):focus>.contexify_itemContent,.contexify_item:not(.contexify_item-disabled):hover>.contexify_itemContent{color:var(--contexify-activeItem-color);background-color:var(--contexify-activeItem-bgColor);border-radius:var(--contexify-activeItem-radius)}.contexify_item:not(.contexify_item-disabled):hover>.contexify_submenu{pointer-events:auto;opacity:1}.contexify_item-disabled{cursor:default;opacity:.5}.contexify_itemContent{padding:var(--contexify-itemContent-padding);display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;white-space:nowrap;color:var(--contexify-item-color);position:relative}.contexify_item-feedback{animation:contexify_feedback .12s both}.contexify_theme-dark{--contexify-menu-bgColor:rgba(40,40,40,.98);--contexify-separator-color:#4c4c4c;--contexify-item-color:#fff}.contexify_theme-light{--contexify-separator-color:#eee;--contexify-item-color:#666;--contexify-activeItem-color:#3498db;--contexify-activeItem-bgColor:#e0eefd;--contexify-activeRightSlot-color:#3498db;--contexify-active-arrow-color:#3498db}@keyframes contexify_scaleIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:1}}@keyframes contexify_scaleOut{0%{opacity:1}to{opacity:0;transform:scale3d(.3,.3,.3)}}.contexify_willEnter-scale{transform-origin:top left;animation:contexify_scaleIn .3s}.contexify_willLeave-scale{transform-origin:top left;animation:contexify_scaleOut .3s}@keyframes contexify_fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes contexify_fadeOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(10px)}}.contexify_willEnter-fade{animation:contexify_fadeIn .3s ease}.contexify_willLeave-fade{animation:contexify_fadeOut .3s ease}@keyframes contexify_flipInX{0%{transform:perspective(800px) rotateX(45deg)}to{transform:perspective(800px)}}@keyframes contexify_flipOutX{0%{transform:perspective(800px)}to{transform:perspective(800px) rotateX(45deg);opacity:0}}.contexify_willEnter-flip{animation:contexify_flipInX .3s}.contexify_willEnter-flip,.contexify_willLeave-flip{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;transform-origin:top center}.contexify_willLeave-flip{animation:contexify_flipOutX .3s}@keyframes contexify_slideIn{0%{opacity:0;transform:scaleY(.3)}to{opacity:1}}@keyframes contexify_slideOut{0%{opacity:1}to{opacity:0;transform:scaleY(.3)}}.contexify_willEnter-slide{transform-origin:top center;animation:contexify_slideIn .3s}.contexify_willLeave-slide{transform-origin:top center;animation:contexify_slideOut .3s}","",{version:3,sources:["webpack://./../node_modules/react-contexify/dist/ReactContexify.min.css"],names:[],mappings:"AAAA,MAAM,sBAAsB,CAAC,+BAA+B,CAAC,4BAA4B,CAAC,2BAA2B,CAAC,6BAA6B,CAAC,wGAAwG,CAAC,4DAA4D,CAAC,0CAA0C,CAAC,gCAAgC,CAAC,mCAAmC,CAAC,iCAAiC,CAAC,2BAA2B,CAAC,iCAAiC,CAAC,sCAAsC,CAAC,mCAAmC,CAAC,sCAAsC,CAAC,+BAA+B,CAAC,kCAAkC,CAAC,8BAA8B,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,CAAC,WAAW,cAAc,CAAC,SAAS,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,8CAA8C,CAAC,qBAAqB,CAAC,uCAAuC,CAAC,0CAA0C,CAAC,qCAAqC,CAAC,wCAAwC,CAAC,+BAA+B,CAAC,2EAA2E,uCAAuC,CAAC,oDAAoD,CAAC,gDAAgD,CAAC,sEAAsE,wCAAwC,CAAC,6CAA6C,mBAAmB,CAAC,SAAS,CAAC,8BAA8B,iBAAiB,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,kDAAkD,CAAC,SAAS,CAAC,qCAAqC,qDAAqD,CAAC,SAAS,CAAC,oCAAoC,UAAU,CAAC,UAAU,CAAC,qBAAqB,gBAAgB,CAAC,mBAAmB,CAAC,YAAY,CAAC,sCAAsC,CAAC,qBAAqB,UAAU,CAAC,cAAc,CAAC,wCAAwC,CAAC,iDAAiD,CAAC,8BAA8B,mBAAmB,CAAC,gBAAgB,cAAc,CAAC,iBAAiB,CAAC,sBAAsB,SAAS,CAAC,2IAA2I,4CAA4C,CAAC,yGAAyG,kCAAkC,CAAC,kUAAkU,wCAAwC,CAAC,sJAAsJ,uCAAuC,CAAC,oDAAoD,CAAC,gDAAgD,CAAC,uEAAuE,mBAAmB,CAAC,SAAS,CAAC,yBAAyB,cAAc,CAAC,UAAU,CAAC,uBAAuB,4CAA4C,CAAC,mBAAmB,CAAC,YAAY,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,iCAAiC,CAAC,iBAAiB,CAAC,yBAAyB,sCAAsC,CAAC,sBAAsB,2CAA2C,CAAC,mCAAmC,CAAC,2BAA2B,CAAC,uBAAuB,gCAAgC,CAAC,2BAA2B,CAAC,oCAAoC,CAAC,sCAAsC,CAAC,yCAAyC,CAAC,sCAAsC,CAAC,6BAA6B,GAAG,SAAS,CAAC,2BAA2B,CAAC,GAAG,SAAS,CAAC,CAAC,8BAA8B,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,2BAA2B,CAAC,CAAC,2BAA2B,yBAAyB,CAAC,+BAA+B,CAAC,2BAA2B,yBAAyB,CAAC,gCAAgC,CAAC,4BAA4B,GAAG,SAAS,CAAC,0BAA0B,CAAC,GAAG,SAAS,CAAC,uBAAuB,CAAC,CAAC,6BAA6B,GAAG,SAAS,CAAC,uBAAuB,CAAC,GAAG,SAAS,CAAC,0BAA0B,CAAC,CAAC,0BAA0B,mCAAmC,CAAC,0BAA0B,oCAAoC,CAAC,6BAA6B,GAAG,2CAA2C,CAAC,GAAG,4BAA4B,CAAC,CAAC,8BAA8B,GAAG,4BAA4B,CAAC,GAAG,2CAA2C,CAAC,SAAS,CAAC,CAAC,0BAA0B,+BAA+B,CAAC,oDAAoD,6CAA6C,CAAC,qCAAqC,CAAC,2BAA2B,CAAC,0BAA0B,gCAAgC,CAAC,6BAA6B,GAAG,SAAS,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC,CAAC,8BAA8B,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,oBAAoB,CAAC,CAAC,2BAA2B,2BAA2B,CAAC,+BAA+B,CAAC,2BAA2B,2BAA2B,CAAC,gCAAgC",sourcesContent:[":root{--contexify-zIndex:666;--contexify-menu-minWidth:220px;--contexify-menu-padding:6px;--contexify-menu-radius:6px;--contexify-menu-bgColor:#fff;--contexify-menu-shadow:1px 2px 2px rgba(0,0,0,.1),2px 4px 4px rgba(0,0,0,.1),3px 6px 6px rgba(0,0,0,.1);--contexify-menu-negatePadding:var(--contexify-menu-padding);--contexify-separator-color:rgba(0,0,0,.2);--contexify-separator-margin:5px;--contexify-itemContent-padding:6px;--contexify-activeItem-radius:4px;--contexify-item-color:#333;--contexify-activeItem-color:#fff;--contexify-activeItem-bgColor:#3498db;--contexify-rightSlot-color:#6f6e77;--contexify-activeRightSlot-color:#fff;--contexify-arrow-color:#6f6e77;--contexify-activeArrow-color:#fff}@keyframes contexify_feedback{0%{opacity:.4}to{opacity:1}}.contexify{position:fixed;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:var(--contexify-menu-bgColor);box-sizing:border-box;box-shadow:var(--contexify-menu-shadow);border-radius:var(--contexify-menu-radius);padding:var(--contexify-menu-padding);min-width:var(--contexify-menu-minWidth);z-index:var(--contexify-zIndex)}.contexify_submenu-isOpen,.contexify_submenu-isOpen>.contexify_itemContent{color:var(--contexify-activeItem-color);background-color:var(--contexify-activeItem-bgColor);border-radius:var(--contexify-activeItem-radius)}.contexify_submenu-isOpen>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-activeArrow-color)}.contexify_submenu-isOpen>.contexify_submenu{pointer-events:auto;opacity:1}.contexify .contexify_submenu{position:absolute;pointer-events:none;transition:opacity .265s;top:calc(-1 * var(--contexify-menu-negatePadding));left:100%}.contexify .contexify_submenu-bottom{bottom:calc(-1 * var(--contexify-menu-negatePadding));top:unset}.contexify .contexify_submenu-right{right:100%;left:unset}.contexify_rightSlot{margin-left:auto;display:-ms-flexbox;display:flex;color:var(--contexify-rightSlot-color)}.contexify_separator{height:1px;cursor:default;margin:var(--contexify-separator-margin);background-color:var(--contexify-separator-color)}.contexify_willLeave-disabled{pointer-events:none}.contexify_item{cursor:pointer;position:relative}.contexify_item:focus{outline:0}.contexify_item:focus .contexify_rightSlot,.contexify_item:not(.contexify_item-disabled):hover>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-activeRightSlot-color)}.contexify_item:not(.contexify_item-disabled)[aria-haspopup]>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-arrow-color)}.contexify_item:not(.contexify_item-disabled)[aria-haspopup].contexify_submenu-isOpen>.contexify_itemContent .contexify_rightSlot,.contexify_item:not(.contexify_item-disabled)[aria-haspopup]:hover>.contexify_itemContent .contexify_rightSlot,.contexify_item[aria-haspopup]:focus>.contexify_itemContent .contexify_rightSlot{color:var(--contexify-activeArrow-color)}.contexify_item:not(.contexify_item-disabled):focus>.contexify_itemContent,.contexify_item:not(.contexify_item-disabled):hover>.contexify_itemContent{color:var(--contexify-activeItem-color);background-color:var(--contexify-activeItem-bgColor);border-radius:var(--contexify-activeItem-radius)}.contexify_item:not(.contexify_item-disabled):hover>.contexify_submenu{pointer-events:auto;opacity:1}.contexify_item-disabled{cursor:default;opacity:.5}.contexify_itemContent{padding:var(--contexify-itemContent-padding);display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;white-space:nowrap;color:var(--contexify-item-color);position:relative}.contexify_item-feedback{animation:contexify_feedback .12s both}.contexify_theme-dark{--contexify-menu-bgColor:rgba(40,40,40,.98);--contexify-separator-color:#4c4c4c;--contexify-item-color:#fff}.contexify_theme-light{--contexify-separator-color:#eee;--contexify-item-color:#666;--contexify-activeItem-color:#3498db;--contexify-activeItem-bgColor:#e0eefd;--contexify-activeRightSlot-color:#3498db;--contexify-active-arrow-color:#3498db}@keyframes contexify_scaleIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:1}}@keyframes contexify_scaleOut{0%{opacity:1}to{opacity:0;transform:scale3d(.3,.3,.3)}}.contexify_willEnter-scale{transform-origin:top left;animation:contexify_scaleIn .3s}.contexify_willLeave-scale{transform-origin:top left;animation:contexify_scaleOut .3s}@keyframes contexify_fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes contexify_fadeOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(10px)}}.contexify_willEnter-fade{animation:contexify_fadeIn .3s ease}.contexify_willLeave-fade{animation:contexify_fadeOut .3s ease}@keyframes contexify_flipInX{0%{transform:perspective(800px) rotateX(45deg)}to{transform:perspective(800px)}}@keyframes contexify_flipOutX{0%{transform:perspective(800px)}to{transform:perspective(800px) rotateX(45deg);opacity:0}}.contexify_willEnter-flip{animation:contexify_flipInX .3s}.contexify_willEnter-flip,.contexify_willLeave-flip{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;transform-origin:top center}.contexify_willLeave-flip{animation:contexify_flipOutX .3s}@keyframes contexify_slideIn{0%{opacity:0;transform:scaleY(.3)}to{opacity:1}}@keyframes contexify_slideOut{0%{opacity:1}to{opacity:0;transform:scaleY(.3)}}.contexify_willEnter-slide{transform-origin:top center;animation:contexify_slideIn .3s}.contexify_willLeave-slide{transform-origin:top center;animation:contexify_slideOut .3s}"],sourceRoot:""}]);const s=a},30(e,t,n){n.d(t,{A:()=>s});var r=n(942),o=n.n(r),i=n(278),a=n.n(i)()(o());a.push([e.id,".loader {\n position: relative;\n width: 44px;\n height: 8px;\n margin: 12px auto;\n}\n\n.dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 4px;\n background: #ccc;\n position: absolute;\n}\n\n.dot_1 {\n animation: animateDot1 1.5s linear infinite;\n left: 12px;\n background: #e579b8;\n}\n\n.dot_2 {\n animation: animateDot2 1.5s linear infinite;\n animation-delay: 0.5s;\n left: 24px;\n}\n\n.dot_3 {\n animation: animateDot3 1.5s linear infinite;\n left: 12px;\n}\n\n.dot_4 {\n animation: animateDot4 1.5s linear infinite;\n animation-delay: 0.5s;\n left: 24px;\n}\n\n@keyframes animateDot1 {\n 0% {\n transform: rotate(0deg) translateX(-12px);\n }\n 25% {\n transform: rotate(180deg) translateX(-12px);\n }\n 75% {\n transform: rotate(180deg) translateX(-12px);\n }\n 100% {\n transform: rotate(360deg) translateX(-12px);\n }\n}\n@keyframes animateDot2 {\n 0% {\n transform: rotate(0deg) translateX(-12px);\n }\n 25% {\n transform: rotate(-180deg) translateX(-12px);\n }\n 75% {\n transform: rotate(-180deg) translateX(-12px);\n }\n 100% {\n transform: rotate(-360deg) translateX(-12px);\n }\n}\n@keyframes animateDot3 {\n 0% {\n transform: rotate(0deg) translateX(12px);\n }\n 25% {\n transform: rotate(180deg) translateX(12px);\n }\n 75% {\n transform: rotate(180deg) translateX(12px);\n }\n 100% {\n transform: rotate(360deg) translateX(12px);\n }\n}\n@keyframes animateDot4 {\n 0% {\n transform: rotate(0deg) translateX(12px);\n }\n 25% {\n transform: rotate(-180deg) translateX(12px);\n }\n 75% {\n transform: rotate(-180deg) translateX(12px);\n }\n 100% {\n transform: rotate(-360deg) translateX(12px);\n }\n}\n","",{version:3,sources:["webpack://./components/Loader.css"],names:[],mappings:"AAAA;EACE,kBAAkB;EAClB,WAAW;EACX,WAAW;EACX,iBAAiB;AACnB;;AAEA;EACE,qBAAqB;EACrB,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,2CAA2C;EAC3C,UAAU;EACV,mBAAmB;AACrB;;AAEA;EACE,2CAA2C;EAC3C,qBAAqB;EACrB,UAAU;AACZ;;AAEA;EACE,2CAA2C;EAC3C,UAAU;AACZ;;AAEA;EACE,2CAA2C;EAC3C,qBAAqB;EACrB,UAAU;AACZ;;AAEA;EACE;IACE,yCAAyC;EAC3C;EACA;IACE,2CAA2C;EAC7C;EACA;IACE,2CAA2C;EAC7C;EACA;IACE,2CAA2C;EAC7C;AACF;AACA;EACE;IACE,yCAAyC;EAC3C;EACA;IACE,4CAA4C;EAC9C;EACA;IACE,4CAA4C;EAC9C;EACA;IACE,4CAA4C;EAC9C;AACF;AACA;EACE;IACE,wCAAwC;EAC1C;EACA;IACE,0CAA0C;EAC5C;EACA;IACE,0CAA0C;EAC5C;EACA;IACE,0CAA0C;EAC5C;AACF;AACA;EACE;IACE,wCAAwC;EAC1C;EACA;IACE,2CAA2C;EAC7C;EACA;IACE,2CAA2C;EAC7C;EACA;IACE,2CAA2C;EAC7C;AACF",sourcesContent:[".loader {\n position: relative;\n width: 44px;\n height: 8px;\n margin: 12px auto;\n}\n\n.dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 4px;\n background: #ccc;\n position: absolute;\n}\n\n.dot_1 {\n animation: animateDot1 1.5s linear infinite;\n left: 12px;\n background: #e579b8;\n}\n\n.dot_2 {\n animation: animateDot2 1.5s linear infinite;\n animation-delay: 0.5s;\n left: 24px;\n}\n\n.dot_3 {\n animation: animateDot3 1.5s linear infinite;\n left: 12px;\n}\n\n.dot_4 {\n animation: animateDot4 1.5s linear infinite;\n animation-delay: 0.5s;\n left: 24px;\n}\n\n@keyframes animateDot1 {\n 0% {\n transform: rotate(0deg) translateX(-12px);\n }\n 25% {\n transform: rotate(180deg) translateX(-12px);\n }\n 75% {\n transform: rotate(180deg) translateX(-12px);\n }\n 100% {\n transform: rotate(360deg) translateX(-12px);\n }\n}\n@keyframes animateDot2 {\n 0% {\n transform: rotate(0deg) translateX(-12px);\n }\n 25% {\n transform: rotate(-180deg) translateX(-12px);\n }\n 75% {\n transform: rotate(-180deg) translateX(-12px);\n }\n 100% {\n transform: rotate(-360deg) translateX(-12px);\n }\n}\n@keyframes animateDot3 {\n 0% {\n transform: rotate(0deg) translateX(12px);\n }\n 25% {\n transform: rotate(180deg) translateX(12px);\n }\n 75% {\n transform: rotate(180deg) translateX(12px);\n }\n 100% {\n transform: rotate(360deg) translateX(12px);\n }\n}\n@keyframes animateDot4 {\n 0% {\n transform: rotate(0deg) translateX(12px);\n }\n 25% {\n transform: rotate(-180deg) translateX(12px);\n }\n 75% {\n transform: rotate(-180deg) translateX(12px);\n }\n 100% {\n transform: rotate(-360deg) translateX(12px);\n }\n}\n"],sourceRoot:""}]);const s=a},588(e,t,n){n.d(t,{A:()=>s});var r=n(942),o=n.n(r),i=n(278),a=n.n(i)()(o());a.push([e.id,'/* Listing Styles */\n\n/* ================================================================== */\n/* Palette tokens */\n/* */\n/* All colors used below are declared here so a single edit re-skins */\n/* the listing. --listing-* covers the original SENAITE workflow */\n/* state palette; --sf-* covers the Saved Filters + Column Header */\n/* chrome added later. */\n/* ================================================================== */\n\n:root {\n /* surfaces + neutrals */\n --sf-bg: #fff;\n --sf-bg-subtle: #fafbfc; /* column filter strip */\n --sf-bg-hover: #f1f3f5; /* neutral hover */\n --sf-bg-row-hover: #f7f9fc; /* preset row hover */\n --sf-bg-edit-row: #f4f7fb; /* inline editor row tint */\n --sf-hairline: #eef0f3; /* internal dividers */\n --sf-divider: #f3f4f6; /* between rows */\n --sf-border: #ced4da; /* default control border */\n --sf-border-soft: #d8dde3; /* softer input border */\n --sf-border-card: #e3e6ea; /* menu card border */\n --sf-fg: #212529; /* body text */\n --sf-fg-muted: #495057; /* secondary text */\n --sf-fg-mutest: #6c757d; /* tertiary text */\n --sf-fg-faint: #adb5bd; /* icon idle */\n --sf-fg-faintest: #ced4da; /* inactive sort arrow on active col */\n --sf-fg-empty: #868e96; /* empty-state copy */\n\n /* accent — SENAITE blue */\n --sf-accent: #0b5ed7;\n --sf-accent-border: #9ec5ff;\n --sf-accent-soft: #eaf3ff;\n --sf-accent-focus: #6ea8fe;\n --sf-accent-input-border: #c5d6ee;\n --sf-accent-overlay-08: rgba(11, 94, 215, .08);\n --sf-accent-overlay-15: rgba(11, 94, 215, .15);\n --sf-accent-overlay-20: rgba(0, 123, 255, .20);\n\n /* success — preset applied */\n --sf-success: #198754;\n --sf-success-border: #a3d9b1;\n --sf-success-soft: #e9f7ef;\n --sf-success-row: #f0f8f3;\n --sf-success-row-hover: #e3f1e9;\n\n /* warning — default-preset gold (star) + dirty amber */\n --sf-warning-star: #e0a800;\n --sf-warning-star-hover: #c69400;\n --sf-warning-tag-bg: #fff4c2; /* "auto" tag */\n --sf-warning-tag-fg: #8a6d00;\n --sf-warning-row: #fbfaf3; /* default-preset row tint */\n --sf-warning-row-hover: #f7f3e3;\n --sf-warning-row-both: #f6f7e9; /* applied + default */\n --sf-dirty-row: #fff7e9;\n --sf-dirty-row-hover: #fdeed2;\n --sf-dirty-tag-bg: #ffe9c2; /* "modified" tag */\n --sf-dirty-tag-fg: #8a4a00;\n\n /* danger — destructive */\n --sf-danger: #c92a2a;\n --sf-danger-border: #e6b4b4;\n --sf-danger-soft: #fdf3f3;\n --sf-danger-hairline: #f3dada;\n --sf-danger-fg: #842029;\n --sf-danger-fg-strong: #4d0a0a;\n --sf-danger-overlay-08: rgba(201, 42, 42, .08);\n\n /* shadows + animation */\n --sf-shadow-card:\n 0 1px 2px rgba(16, 24, 40, .04),\n 0 8px 24px rgba(16, 24, 40, .08);\n --sf-shadow-overlay: rgba(0, 0, 0, .05);\n --sf-radius-card: 8px;\n --sf-radius-pill: 999px;\n --sf-trans-fast: .12s ease;\n\n /* ---------------------------------------------------------------- */\n /* SENAITE workflow / table palette */\n /* Original swatches sourced from mdbootstrap.com/css/colors/. */\n /* ---------------------------------------------------------------- */\n\n /* table chrome */\n --listing-border-table: #ddd;\n --listing-border-divider: #e3e3e3;\n --listing-border-strong: #000;\n --listing-bg-muted: #f5f5f5;\n --listing-bg-row-alt: #f9f9f9;\n --listing-bg-th-hover: #ccc;\n --listing-fg-toggle: #555;\n --listing-fg-category: #3E4551;\n --listing-category-bg: rgba(96, 125, 139, .1);\n --listing-overlay-loader: rgba(255, 255, 255, .6);\n\n /* progress bar */\n --listing-progress-fg: #f5f5f5;\n --listing-progress-bg: #33b5e5;\n --listing-progress-bg-disabled:#c9c9c9;\n\n /* workflow states — border + row-hover overlay per state */\n --listing-state-sample-due: #ffff8d;\n --listing-state-sample-due-hover: rgba(255, 235, 59, .1);\n\n --listing-state-sample-received: #a1887f;\n --listing-state-sample-received-hover: rgba(121, 85, 72, .1);\n\n --listing-state-retracted: #ff6f00;\n --listing-state-retracted-hover: rgba(255, 152, 0, .1);\n --listing-state-retracted-bg: #eceff1;\n --listing-state-retracted-fg: #78909c;\n\n --listing-state-to-be-verified: #18ffff;\n --listing-state-to-be-verified-hover: rgba(0, 188, 212, .1);\n\n --listing-state-verified: #0091ea;\n --listing-state-verified-hover: rgba(3, 169, 244, .2);\n\n --listing-state-published: #00c853;\n --listing-state-published-hover: rgba(76, 175, 80, .2);\n\n --listing-state-invalid: #e65100;\n --listing-state-invalid-hover: rgba(244, 67, 54, .2);\n\n --listing-state-rejected: #abc;\n --listing-state-rejected-hover: #abc;\n\n --listing-state-cancelled: #000;\n --listing-state-cancelled-hover: rgba(0, 0, 0, .1);\n\n --listing-state-inactive-border: #616161;\n\n /* Bootstrap-matching tokens for the searchable-select dropdown and\n the column-filter-row strip (pre-existing styles). */\n --listing-bs-primary: #007bff;\n --listing-bs-primary-dark: #0056b3;\n --listing-bs-secondary: #6c757d;\n --listing-bs-border: #ced4da;\n --listing-bs-border-soft: #dee2e6;\n --listing-bs-bg-light: #f8f9fa;\n --listing-bs-bg-hover: #e9ecef;\n --listing-shadow-dropdown: 0 4px 6px rgba(0, 0, 0, .1);\n}\n\n\n/* Colors taken from https://mdbootstrap.com/css/colors/ */\n.ajax-contents-table tbody tr { border-left:2px solid var(--listing-border-table); }\n.ajax-contents-table tbody tr:last-child { border-bottom:1px solid var(--listing-border-table); }\n\n/* state sample_due */\n.ajax-contents-table tr.state-sample_due { border-left:2px solid var(--listing-state-sample-due) !important; }\n.ajax-contents-table td.result.state-sample_due { border-left:2px solid var(--listing-state-sample-due) !important; }\n.ajax-contents-table tr.state-sample_due:hover { background-color: var(--listing-state-sample-due-hover); }\n\n/* state sample_received */\n.ajax-contents-table tr.state-sample_received { border-left:2px solid var(--listing-state-sample-received) !important; }\n.ajax-contents-table td.result.state-sample_received { border-left:2px solid var(--listing-state-sample-received) !important; }\n.ajax-contents-table tr.state-sample_received:hover { background-color: var(--listing-state-sample-received-hover); }\n\n/* state retracted */\n.ajax-contents-table tr.state-retracted { border-left:2px solid var(--listing-state-retracted) !important; }\n.ajax-contents-table tr.state-retracted>td:not([rowspan]) { background-color: var(--listing-state-retracted-bg) !important; color: var(--listing-state-retracted-fg); font-style: italic; }\n.ajax-contents-table td.result.state-retracted { border-left:2px solid var(--listing-state-retracted) !important; }\n.ajax-contents-table tr.state-retracted:hover { background-color: var(--listing-state-retracted-hover); }\n\n/* state to_be_verified */\n.ajax-contents-table tr.state-to_be_verified { border-left:2px solid var(--listing-state-to-be-verified) !important; }\n.ajax-contents-table td.result.state-to_be_verified { border-left:2px solid var(--listing-state-to-be-verified) !important; }\n.ajax-contents-table tr.state-to_be_verified:hover { background-color: var(--listing-state-to-be-verified-hover); }\n\n/* state verified */\n.ajax-contents-table tr.state-verified { border-left:2px solid var(--listing-state-verified) !important; }\n.ajax-contents-table td.result.state-verified { border-left:2px solid var(--listing-state-verified) !important; }\n.ajax-contents-table tr.state-verified:hover { background-color: var(--listing-state-verified-hover); }\n\n/* state published */\n.ajax-contents-table tr.state-published { border-left:2px solid var(--listing-state-published) !important; }\n.ajax-contents-table td.result.state-published { border-left:2px solid var(--listing-state-published) !important; }\n.ajax-contents-table tr.state-published:hover { background-color: var(--listing-state-published-hover); }\n\n/* state invalid */\n.ajax-contents-table tr.state-invalid { border-left:2px solid var(--listing-state-invalid) !important; }\n.ajax-contents-table td.result.state-invalid { border-left:2px solid var(--listing-state-invalid) !important; }\n.ajax-contents-table tr.state-invalid:hover { background-color: var(--listing-state-invalid-hover); }\n\n/* state rejected */\n.ajax-contents-table tr.state-rejected { border-left:2px solid var(--listing-state-rejected) !important; }\n.ajax-contents-table td.result.state-rejected { border-left:2px solid var(--listing-state-rejected) !important; }\n.ajax-contents-table tr.state-rejected:hover { background-color: var(--listing-state-rejected); }\n\n/* state assigned */\n.ajax-contents-table tr.state-assigned { border-left:2px solid var(--listing-border-table); }\n.ajax-contents-table td.result.state-assigned { border-left:2px solid transparent; }\n\n/* state unassigned */\n.ajax-contents-table tr.state-unassigned { border-left:2px solid var(--listing-border-table); }\n.ajax-contents-table td.result.state-unassigned { border-left:2px solid transparent; }\n\n/* state cancelled */\n.ajax-contents-table tr.state-cancelled { border-left:2px solid var(--listing-state-cancelled) !important; }\n.ajax-contents-table tr.state-cancelled:hover { background-color: var(--listing-state-cancelled-hover); }\n\n/* worksheet states */\n.ajax-contents-table tr.state-open { border-left:2px solid var(--listing-border-table) !important; }\n.ajax-contents-table tr.state-empty-worksheet { border-left:2px solid var(--listing-border-table) !important; }\n\n/* transposed worksheet layout*/\n.ajax-contents-table td.transposed.result.empty { cursor: not-allowed; }\n.ajax-contents-table td.transposed.result:hover { background-color: var(--listing-border-divider)!important; }\n.ajax-contents-table td.transposed.result.empty:hover { background-color: var(--listing-border-divider); }\n\n/* active/inactive states*/\n.ajax-contents-table tr.state-active { border-left:2px solid transparent; }\n.ajax-contents-table tr.state-inactive { border-left:2px solid var(--listing-state-inactive-border); }\n\n.ajax-contents-table th.sortable { cursor: pointer; }\n.ajax-contents-table th.sortable:hover { background-color: var(--listing-bg-th-hover); }\n.ajax-contents-table th:not(.sortable) { cursor: not-allowed; }\n\n/* split-arrow sort indicators are rendered as buttons by\n TableHeaderCell; the old ::after triangle is no longer needed */\n\n/* category */\n.ajax-contents-table tr.categoryrow { background-color: var(--listing-category-bg)!important; cursor: pointer; font-weight: bold; font-size: 115%; color: var(--listing-fg-category); }\n\n/* table load mask */\n#table-overlay {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1000;\n height: 100%;\n width: 100%;\n background: var(--listing-overlay-loader);\n opacity: 0.6;\n}\n\n/* progress bar */\n.ajax-contents-table tr td div.progress { width: 55px; margin-bottom: 0; height: 17px; }\n.ajax-contents-table tr td div.progress div.progress-bar { color: var(--listing-bg-muted); background-color: var(--listing-progress-bg); line-height: 17px; font-size: 9px; font-weight:bold; }\n.ajax-contents-table tr.state-invalid td div.progress div.progress-bar,\n.ajax-contents-table tr.state-cancelled td div.progress div.progress-bar { background-color: var(--listing-progress-bg-disabled); }\n\n/* collapsible rows */\n.ajax-contents-table tr.togglerow { cursor: pointer; }\n.ajax-contents-table tr.childrow td:first-child { padding-left: 1em; }\n.ajax-contents-table tr.childrow td:first-child:before { content: "➥ "; }\n\n/* before item */\n.ajax-contents-table tr span.before-item { display: table-cell; line-height: 0; vertical-align: middle; padding-right: 5px; }\n\n/* after item */\n.ajax-contents-table tr span.after-item { display: table-cell; line-height: 0; vertical-align: middle; padding-left: 5px; }\n\n/* Render table form-controls smaller */\n.ajax-contents-table tr td div.form-group { display: inline-table; }\n\n/* Top toolbar */\n.ajax-contents-table .top-toolbar { padding-bottom: .5em; }\n\n/* Expandable Rows */\n.ajax-contents-table tr.contentrow.child td {\n border-top:none;\n}\n.ajax-contents-table tr.contentrow.collapsed td:first-child:before,\n.ajax-contents-table tr.contentrow.expanded td:first-child:before,\n.ajax-contents-table tr.contentrow.child td:first-child:before {\n line-height: normal;\n padding-right: 0.5rem;\n vertical-align: bottom;\n color: var(--listing-fg-toggle);\n cursor: pointer;\n float: left;\n width: 20px; /* aligns the toggle symbols */\n}\n/* node levels (0.75rem is the default td padding) */\n.ajax-contents-table th.select-column { width: 10px; }\n.ajax-contents-table td.level-0 { padding-left: 0.75rem; }\n.ajax-contents-table td.level-1 { padding-left: 1.75rem; }\n.ajax-contents-table td.level-2 { padding-left: 2.75rem; }\n.ajax-contents-table td.level-3 { padding-left: 3.75rem; }\n.ajax-contents-table td.level-4 { padding-left: 4.75rem; }\n.ajax-contents-table td.level-5 { padding-left: 5.75rem; }\n.ajax-contents-table td.level-6 { padding-left: 6.75rem; }\n\n.ajax-contents-table tr.contentrow.collapsed td:first-child::before {\n content: "▶";\n}\n.ajax-contents-table tr.contentrow.expanded td:first-child::before {\n content: "▼";\n}\n.ajax-contents-table tr.contentrow.child td:first-child::before {\n content: "⋯";\n}\n.ajax-contents-table tr.contentrow.child.collapsed td:first-child::before {\n content: "▶";\n}\n.ajax-contents-table tr.contentrow.child.expanded td:first-child::before {\n content: "▼";\n}\n\n/* Remark Rows */\n.ajax-contents-table tr.remarksrow td {\n padding: 0;\n border: none;\n}\n.ajax-contents-table tr.remarksrow td div.remarks {\n min-height: 20px;\n padding: 5px;\n margin: 5px;\n background-color: var(--listing-bg-muted);\n border: 1px solid var(--listing-border-divider);\n border-radius: 3px;\n}\n\n/* Multi choice */\n.ajax-contents-table tr td div.multichoice {\n max-height: 120px;\n width: 200px;\n overflow: auto;\n border: 1px solid var(--listing-bg-th-hover);\n border-radius: 3px;\n}\n.ajax-contents-table tr td div.multichoice ul {\n padding: 0;\n margin: 0;\n}\n.ajax-contents-table tr td div.multichoice li {\n padding: 6px;\n}\n.ajax-contents-table tr td div.multichoice li:hover {\n background-color: var(--listing-bg-row-alt);\n}\n\n/* Result multi choice */\n.ajax-contents-table tr td.Result div.multichoice {\n border: none;\n}\n.ajax-contents-table tr td.Result div.multichoice li {\n padding: 4px 6px;\n}\n\n/* Multi select */\n.ajax-contents-table tr td div.multiselect ul {\n padding: 0;\n margin: 0;\n}\n.ajax-contents-table tr td div.multiselect li {\n padding: 2px 6px;\n}\n\n/* Multi value\nSame styling as multi-select, cause we do want multi value elements to be fully\naligned when they are rendered close to multiselect counterpart. Since values\nare always stored in same order, this styling allows multi values to "refer" to\nselected elements from multiselect\n*/\n.ajax-contents-table tr td div.multivalue ul {\n padding: 0;\n margin: 0;\n}\n.ajax-contents-table tr td div.multivalue li {\n padding: 2px 6px;\n}\n\n/* Rowspan support */\n.ajax-contents-table tr td[rowspan] {\n border: 1px solid var(--listing-border-table);\n background-color: white!important;\n}\n.ajax-contents-table tr td[rowspan]:hover {\n background-color: white!important;\n}\n\n/* borderless table */\n.ajax-contents-table table.table-borderless td { border: none!important; }\n.ajax-contents-table table.table-borderless tr { border: none!important; }\n\n/* Worksheet\'s slots table */\n.ajax-contents-table table.slot-header-table { margin-bottom: 0px; }\n\n/* Results Unit */\n.ajax-contents-table span.unit { padding: 0 0.25em; color: black; }\n\n\n/* Transposed Cell */\n.ajax-contents-table td.transposed span.before-item { width: 60px }\n.ajax-contents-table td.transposed span.before-item > * { display: block; float: left; padding-right: 5px; }\n.ajax-contents-table td.transposed span.before-item input[type=checkbox] { margin: 0; }\n.ajax-contents-table td.transposed input { margin-right: 10px; }\n.ajax-contents-table td.transposed .before_field { font-size: 85%; display: table-cell; }\n.ajax-contents-table td.transposed .after_field { font-size: 85%; display: table-cell; }\n.ajax-contents-table td.transposed span.readonly { padding-right: 0.5em; }\n\n/* Regular Cell */\n.ajax-contents-table td a.remarks { display: block; }\n\n/* Drag&Drop behavior */\n.ajax-contents-table tr.dragging { opacity: 0; }\n.ajax-contents-table td.dnd { cursor: move; }\n\n/* Column Filter Styles */\n.ajax-contents-table th .column-filter-toggle {\n padding: 0 0.25rem;\n margin-left: 0.25rem;\n opacity: 0.4;\n border: none;\n background: transparent;\n color: inherit;\n font-size: 0.75em;\n vertical-align: middle;\n}\n.ajax-contents-table th .column-filter-toggle:hover {\n opacity: 0.8;\n}\n.ajax-contents-table th .column-filter-toggle.active {\n opacity: 1;\n color: var(--listing-bs-primary);\n}\n.ajax-contents-table tr.column-filter-row td {\n padding: 0.25rem 0.5rem;\n background-color: var(--listing-bs-bg-light);\n border-bottom: 1px solid var(--listing-bs-border-soft);\n}\n.ajax-contents-table tr.column-filter-row td.empty {\n background-color: transparent;\n border-bottom: none;\n}\n.ajax-contents-table tr.column-filter-row .input-group {\n flex-wrap: nowrap;\n}\n.ajax-contents-table tr.column-filter-row input.form-control,\n.ajax-contents-table tr.column-filter-row select.form-control {\n min-width: 80px;\n}\n.ajax-contents-table tr.column-filter-row input[type="date"].form-control {\n min-width: 130px;\n}\n.ajax-contents-table tr.column-filter-row input:disabled,\n.ajax-contents-table tr.column-filter-row select:disabled {\n background-color: var(--listing-bs-bg-hover);\n cursor: not-allowed;\n}\n.ajax-contents-table tr.column-filter-row select.form-control {\n padding-right: 1.5rem;\n appearance: auto;\n}\n.ajax-contents-table tr.column-filter-row .input-group-append .btn {\n border-color: var(--listing-bs-border);\n}\n/* Ensure searchable-select input has correct border radius in input-group */\n.ajax-contents-table tr.column-filter-row .input-group > .searchable-select > .form-control {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n/* Searchable Select Styles */\n.searchable-select {\n position: relative;\n flex: 1;\n}\n.searchable-select input.form-control {\n width: 100%;\n}\n.searchable-select-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n max-height: 250px;\n overflow-y: auto;\n background: white;\n border: 1px solid var(--listing-bs-border);\n border-top: none;\n border-radius: 0 0 0.25rem 0.25rem;\n z-index: 1050;\n box-shadow: var(--listing-shadow-dropdown);\n}\n.searchable-select-option {\n padding: 0.375rem 0.75rem;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.searchable-select-option:hover,\n.searchable-select-option.highlighted {\n background-color: var(--listing-bs-bg-hover);\n}\n.searchable-select-option.selected {\n background-color: var(--listing-bs-primary);\n color: white;\n}\n.searchable-select-option.selected.highlighted {\n background-color: var(--listing-bs-primary-dark);\n}\n.searchable-select-hint {\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n color: var(--listing-bs-secondary);\n background: var(--listing-bs-bg-light);\n border: 1px solid var(--listing-bs-border);\n border-top: 1px dashed var(--listing-bs-border-soft);\n text-align: center;\n}\n\n/* ================================================================== */\n/* Saved Filters + Column Filter Controls */\n/* */\n/* Aesthetic: calm-clinical. One accent (SENAITE blue), hairline */\n/* dividers, hover-revealed actions, monospaced preset names. */\n/* */\n/* The palette lives in --sf-* custom properties so a single edit */\n/* re-skins everything. Token roles: */\n/* bg / fg surface + text */\n/* border / hairline default control + soft divider */\n/* accent SENAITE blue (active / focus) */\n/* success preset applied */\n/* warning default-preset gold + dirty amber */\n/* danger destructive */\n/* Each role exposes a -soft (subtle bg), -border, and -fg variant. */\n/* ================================================================== */\n\n\n\n/* ------------------------------------------------------------------ */\n/* 1. Saved filters — toggle pill */\n/* ------------------------------------------------------------------ */\n.saved-filters {\n position: relative;\n display: inline-flex;\n margin-left: 0.5rem;\n}\n.saved-filters-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n height: calc(1.5em + 0.5rem + 2px); /* matches Bootstrap btn-sm */\n padding: 0 0.6rem;\n background: var(--sf-bg);\n color: var(--sf-fg-muted);\n border: 1px solid var(--sf-border);\n border-radius: var(--sf-radius-pill);\n font-size: 0.8125rem;\n line-height: 1;\n cursor: pointer;\n transition: background-color var(--sf-trans-fast), border-color var(--sf-trans-fast),\n color var(--sf-trans-fast), box-shadow var(--sf-trans-fast);\n}\n.saved-filters-toggle:hover,\n.saved-filters-toggle.is-open {\n background: var(--sf-bg-hover);\n border-color: var(--sf-fg-faint);\n color: var(--sf-fg);\n}\n.saved-filters-toggle:focus {\n outline: none;\n box-shadow: 0 0 0 .15rem var(--sf-accent-overlay-20);\n}\n/* Applied (success) — wins over hover/open */\n.saved-filters-toggle.has-applied {\n background: var(--sf-success-soft);\n border-color: var(--sf-success-border);\n color: var(--sf-success);\n}\n.saved-filters-toggle .saved-filters-count {\n display: inline-block;\n min-width: 1.25rem;\n padding: 0 .3rem;\n background: var(--sf-fg-mutest);\n color: var(--sf-bg);\n font-size: .6875rem;\n font-weight: 600;\n line-height: 1.05rem;\n border-radius: var(--sf-radius-pill);\n text-align: center;\n}\n.saved-filters-toggle.has-applied .saved-filters-count {\n background: var(--sf-success);\n}\n\n/* When the toggle sits inside a Bootstrap input-group prepend slot\n (SearchBox), match the input-group radii and height. */\n.searchbox-prepend {\n display: flex;\n align-items: stretch;\n}\n.searchbox-prepend .saved-filters {\n margin-left: 0;\n display: flex;\n align-items: stretch;\n}\n.searchbox-prepend .saved-filters-toggle {\n height: 100%;\n padding: 0 0.65rem;\n border-right: 0;\n border-radius: 0.2rem 0 0 0.2rem;\n}\n.searchbox-prepend .saved-filters-toggle .saved-filters-count {\n margin-left: 0.15rem;\n}\n.searchbox-prepend .saved-filters-menu {\n left: 0;\n right: auto;\n text-align: left;\n}\n\n\n/* ------------------------------------------------------------------ */\n/* 2. Saved filters — dropdown menu */\n/* ------------------------------------------------------------------ */\n.saved-filters-menu {\n position: absolute;\n top: calc(100% + 0.35rem);\n left: 0;\n z-index: 1050;\n min-width: 280px;\n background: var(--sf-bg);\n border: 1px solid var(--sf-border-card);\n border-radius: var(--sf-radius-card);\n box-shadow: var(--sf-shadow-card);\n animation: savedFiltersIn var(--sf-trans-fast)-out;\n}\n@keyframes savedFiltersIn {\n from { opacity: 0; transform: translateY(-2px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.saved-filters-header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n padding: .65rem .85rem .5rem;\n border-bottom: 1px solid var(--sf-hairline);\n}\n.saved-filters-title {\n font-size: .75rem;\n font-weight: 600;\n letter-spacing: .04em;\n text-transform: uppercase;\n color: var(--sf-fg-mutest);\n}\n.saved-filters-hint {\n font-size: .6875rem;\n color: var(--sf-fg-faint);\n font-style: italic;\n}\n.saved-filter-empty {\n padding: 1.1rem .85rem;\n font-size: .8125rem;\n text-align: center;\n color: var(--sf-fg-empty);\n}\n\n\n/* ------------------------------------------------------------------ */\n/* 3. Saved filters — list rows */\n/* ------------------------------------------------------------------ */\n.saved-filter-list {\n list-style: none;\n margin: 0;\n padding: .25rem 0;\n max-height: 320px;\n overflow-y: auto;\n}\n.saved-filter-item {\n display: flex;\n align-items: stretch;\n justify-content: space-between;\n position: relative;\n}\n.saved-filter-item + .saved-filter-item {\n border-top: 1px solid var(--sf-divider);\n}\n.saved-filter-item:hover { background: var(--sf-bg-row-hover); }\n.saved-filter-item.is-default { background: var(--sf-warning-row); }\n.saved-filter-item.is-default:hover { background: var(--sf-warning-row-hover); }\n.saved-filter-item.is-applied { background: var(--sf-success-row); }\n.saved-filter-item.is-applied:hover { background: var(--sf-success-row-hover); }\n.saved-filter-item.is-applied.is-default { background: var(--sf-warning-row-both); }\n/* dirty = applied + user edits diverge from stored payload */\n.saved-filter-item.is-applied.is-dirty { background: var(--sf-dirty-row); }\n.saved-filter-item.is-applied.is-dirty:hover { background: var(--sf-dirty-row-hover); }\n\n/* Row body: marker + name + tags (button so the whole row is clickable) */\n.saved-filter-apply {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n gap: .5rem;\n min-width: 0;\n padding: .5rem .85rem;\n background: transparent;\n border: 0;\n text-align: left;\n cursor: pointer;\n color: var(--sf-fg);\n}\n.saved-filter-apply:focus {\n outline: none;\n background: var(--sf-accent-soft);\n}\n.saved-filter-marker {\n flex: 0 0 auto;\n width: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--sf-border);\n font-size: .75rem;\n}\n.saved-filter-item.is-applied .saved-filter-marker { color: var(--sf-success); }\n.saved-filter-item.is-applied.is-dirty .saved-filter-marker{ color: var(--sf-warning-star-hover); }\n\n.saved-filter-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo,\n Consolas, "Liberation Mono", monospace;\n font-size: .8125rem;\n}\n/* Micro tags (auto / modified) — same shape, different colour */\n.saved-filter-default-tag,\n.saved-filter-dirty-tag {\n flex: 0 0 auto;\n font-size: .625rem;\n letter-spacing: .06em;\n text-transform: uppercase;\n padding: .05rem .35rem;\n border-radius: 3px;\n}\n.saved-filter-default-tag { color: var(--sf-warning-tag-fg); background: var(--sf-warning-tag-bg); }\n.saved-filter-dirty-tag { color: var(--sf-dirty-tag-fg); background: var(--sf-dirty-tag-bg); }\n\n\n/* ------------------------------------------------------------------ */\n/* 4. Saved filters — row actions (rename, star, delete, update, */\n/* revert). Hover-revealed except on default and dirty rows. */\n/* ------------------------------------------------------------------ */\n.saved-filter-actions {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 2px;\n padding-right: .35rem;\n opacity: 0;\n transition: opacity var(--sf-trans-fast);\n}\n.saved-filter-item:hover .saved-filter-actions,\n.saved-filter-item:focus-within .saved-filter-actions,\n.saved-filter-item.is-default .saved-filter-actions,\n.saved-filter-item.is-dirty .saved-filter-actions {\n opacity: 1;\n}\n.saved-filter-action {\n appearance: none;\n background: transparent;\n border: 0;\n width: 1.4rem;\n height: 1.4rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n color: var(--sf-fg-faint);\n cursor: pointer;\n transition: color var(--sf-trans-fast), background-color var(--sf-trans-fast);\n}\n/* Pin every action glyph to the same optical box — FontAwesome\'s\n per-icon metrics make star/check/×/pen otherwise vary noticeably. */\n.saved-filter-action i {\n font-size: .75rem;\n line-height: 1;\n width: .8rem;\n height: .8rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n.saved-filter-action:hover {\n background: var(--sf-shadow-overlay);\n color: var(--sf-fg);\n}\n.saved-filter-action-star.is-on { color: var(--sf-warning-star); }\n.saved-filter-action-star.is-on:hover { color: var(--sf-warning-star-hover); }\n.saved-filter-action-delete:hover {\n color: var(--sf-danger);\n background: var(--sf-danger-overlay-08);\n}\n.saved-filter-action-update { color: var(--sf-accent); }\n.saved-filter-action-update:hover { background: var(--sf-accent-overlay-08); color: var(--sf-accent); }\n.saved-filter-action-revert:hover { background: var(--sf-shadow-overlay); color: var(--sf-fg-muted); }\n\n\n/* ------------------------------------------------------------------ */\n/* 5. Saved filters — footer (Save current view button) */\n/* ------------------------------------------------------------------ */\n.saved-filters-footer {\n padding: .5rem .65rem .65rem;\n border-top: 1px solid var(--sf-hairline);\n}\n.saved-filters-save {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: .4rem;\n width: 100%;\n padding: .4rem .65rem;\n background: var(--sf-bg);\n color: var(--sf-accent);\n border: 1px dashed var(--sf-accent-border);\n border-radius: 6px;\n font-size: .8125rem;\n cursor: pointer;\n transition: background-color var(--sf-trans-fast), border-color var(--sf-trans-fast);\n}\n.saved-filters-save:hover {\n background: var(--sf-accent-soft);\n border-color: var(--sf-accent);\n border-style: solid;\n}\n.saved-filters-save i { font-size: .7rem; }\n\n\n/* ------------------------------------------------------------------ */\n/* 6. Saved filters — inline editors (save / rename) */\n/* ------------------------------------------------------------------ */\n.saved-filter-edit,\n.saved-filters-save-row {\n display: flex;\n align-items: center;\n gap: 4px;\n width: 100%;\n background: var(--sf-bg-edit-row);\n}\n.saved-filter-edit { padding: .35rem .5rem; }\n.saved-filters-save-row { padding: .5rem .65rem; border-top: 1px solid var(--sf-hairline); }\n\n.saved-filter-edit-input {\n flex: 1 1 auto;\n min-width: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: .8125rem;\n padding: .25rem .5rem;\n background: var(--sf-bg);\n border: 1px solid var(--sf-accent-input-border);\n border-radius: 4px;\n color: var(--sf-fg);\n outline: none;\n transition: border-color var(--sf-trans-fast), box-shadow var(--sf-trans-fast);\n}\n.saved-filter-edit-input:focus {\n border-color: var(--sf-accent-focus);\n box-shadow: 0 0 0 .15rem var(--sf-accent-overlay-15);\n}\n.saved-filter-edit-confirm,\n.saved-filter-edit-cancel {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.7rem;\n height: 1.7rem;\n background: var(--sf-bg);\n border: 1px solid var(--sf-border-soft);\n border-radius: 4px;\n font-size: .75rem;\n color: var(--sf-fg-muted);\n cursor: pointer;\n transition: background-color var(--sf-trans-fast), border-color var(--sf-trans-fast),\n color var(--sf-trans-fast);\n}\n.saved-filter-edit-confirm { color: var(--sf-accent); border-color: var(--sf-accent-border); }\n.saved-filter-edit-confirm:hover { background: var(--sf-accent); border-color: var(--sf-accent); color: var(--sf-bg); }\n.saved-filter-edit-cancel:hover { background: var(--sf-bg-hover); border-color: var(--sf-fg-faint); color: var(--sf-fg); }\n\n\n/* ------------------------------------------------------------------ */\n/* 7. Saved filters — inline delete confirm */\n/* ------------------------------------------------------------------ */\n.saved-filter-confirm {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: .5rem;\n padding: .45rem .65rem;\n background: var(--sf-danger-soft);\n border-top: 1px solid var(--sf-danger-hairline);\n border-bottom: 1px solid var(--sf-danger-hairline);\n font-size: .8125rem;\n color: var(--sf-danger-fg);\n}\n.saved-filter-confirm-text {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.saved-filter-confirm-text strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-weight: 600;\n color: var(--sf-danger-fg-strong);\n}\n.saved-filter-confirm-actions {\n flex: 0 0 auto;\n display: flex;\n gap: 4px;\n}\n.saved-filter-confirm-cancel,\n.saved-filter-confirm-confirm {\n flex: 0 0 auto;\n width: 1.4rem;\n height: 1.4rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border-radius: 4px;\n border: 1px solid;\n cursor: pointer;\n background: var(--sf-bg);\n transition: background-color var(--sf-trans-fast), border-color var(--sf-trans-fast),\n color var(--sf-trans-fast);\n}\n.saved-filter-confirm-cancel { border-color: var(--sf-border-soft); color: var(--sf-fg-muted); }\n.saved-filter-confirm-cancel:hover { background: var(--sf-bg-hover); border-color: var(--sf-fg-faint); color: var(--sf-fg); }\n.saved-filter-confirm-confirm { border-color: var(--sf-danger-border); color: var(--sf-danger-fg); }\n.saved-filter-confirm-confirm:hover{ background: var(--sf-danger); border-color: var(--sf-danger); color: var(--sf-bg); }\n.saved-filter-confirm-cancel i,\n.saved-filter-confirm-confirm i { font-size: .75rem; line-height: 1; }\n\n\n/* ================================================================== */\n/* Column header — title (ellipsis) + sort arrows + filter funnel */\n/* ================================================================== */\n\n/* Every header cell shares the same height so cells without controls\n don\'t collapse to a shorter line and the row bobs up and down. */\n.ajax-contents-table thead th {\n vertical-align: middle !important;\n height: 2.5rem;\n line-height: 1.25;\n}\n\n/* Inner flex container: title flexes (shrinks with ellipsis), the\n controls cluster stays fully visible on the right edge. */\n.ajax-contents-table thead th .column-header-inner {\n display: flex;\n align-items: center;\n gap: .35rem;\n width: 100%;\n min-width: 0;\n}\n.ajax-contents-table thead th .column-title {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: middle;\n}\n.ajax-contents-table thead th .column-header-controls {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n white-space: nowrap; /* arrows + funnel never split */\n}\n\n/* --- Column-config trigger group: trigger button + small reset --- */\n/* The wrapper is right-aligned via Bootstrap\'s `.float-right`; the\n `inline-flex` here is only for the children\'s layout (gap between\n trigger + reset icon). */\n.tcc-trigger-group {\n display: inline-flex;\n align-items: center;\n gap: .15rem;\n}\n.tcc-reset {\n /* Icon-only, muted; promotes to accent on hover so it reads as\n "secondary action" next to the main trigger. */\n padding: .15rem .35rem;\n line-height: 1;\n font-size: .85rem;\n color: var(--sf-muted, #8a94a6);\n text-decoration: none;\n}\n.tcc-reset:hover, .tcc-reset:focus {\n color: var(--sf-accent, #1976d2);\n text-decoration: none;\n}\n\n/* --- Header DnD: grip handle, grab cursor, ghost, drop indicator ---- */\n/* Sits at the trailing edge of the controls cluster (right of the\n funnel). Hidden by default; only the hovered or actively-dragged\n