@lax-wp/design-system 0.13.45 → 0.13.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/floating-bar/FloatingBar.cjs.js +1 -1
- package/dist/components/floating-bar/FloatingBar.cjs.js.map +1 -1
- package/dist/components/floating-bar/FloatingBar.es.js +12 -12
- package/dist/components/floating-bar/FloatingBar.es.js.map +1 -1
- package/dist/components/forms/icon-picker/IconPicker.cjs.js +1 -1
- package/dist/components/forms/icon-picker/IconPicker.cjs.js.map +1 -1
- package/dist/components/forms/icon-picker/IconPicker.es.js +1 -1
- package/dist/components/forms/icon-picker/IconPicker.es.js.map +1 -1
- package/dist/components/navigation/tabs/TabOptions.cjs.js +1 -1
- package/dist/components/navigation/tabs/TabOptions.cjs.js.map +1 -1
- package/dist/components/navigation/tabs/TabOptions.es.js +36 -36
- package/dist/components/navigation/tabs/TabOptions.es.js.map +1 -1
- package/dist/components/navigation/tabs/Tabs.cjs.js +1 -1
- package/dist/components/navigation/tabs/Tabs.cjs.js.map +1 -1
- package/dist/components/navigation/tabs/Tabs.es.js +66 -66
- package/dist/components/navigation/tabs/Tabs.es.js.map +1 -1
- package/dist/components/user-avatar/UserAvatar.cjs.js +1 -1
- package/dist/components/user-avatar/UserAvatar.cjs.js.map +1 -1
- package/dist/components/user-avatar/UserAvatar.es.js +1 -1
- package/dist/components/user-avatar/UserAvatar.es.js.map +1 -1
- package/dist/components/user-avatar/constants.cjs.js +1 -1
- package/dist/components/user-avatar/constants.cjs.js.map +1 -1
- package/dist/components/user-avatar/constants.es.js +8 -8
- package/dist/components/user-avatar/constants.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),v=require("@dnd-kit/core"),ne=require("@dnd-kit/sortable"),we=require("antd"),c=require("../../../_virtual/index.cjs.js"),a=require("react"),Dt=require("react-i18next"),Je=require("@mui/icons-material/MoreHorizOutlined"),Vt=require("./types.cjs.js"),Mt=require("../../../utils/formatters.cjs.js"),Lt=require("../../../providers/design-system-provider/hooks.cjs.js"),qt=require("../../../hooks/useTextWidth.cjs.js"),Rt=require("../../button/IconButton.cjs.js"),S=require("../../buttons/option-button/OptionButton.cjs.js"),Bt=require("../../forms/search-bar/SearchBar.cjs.js"),ke=require("../../tooltip/Tooltip.cjs.js"),Ht=require("../../icons/EditIcon.cjs.js"),Ut=require("react-toastify"),ye=require("./TabSwitch.cjs.js"),k=require("../../icon/icons.generated.cjs.js"),Qe=require("./SortableTab.cjs.js"),zt=require("./DropableWrapper.cjs.js"),Wt=require("./MoreButton.cjs.js"),Pt=require("./TabOptions.cjs.js"),Ft=require("./TabDragOverlay.cjs.js"),$t=()=>Math.random().toString(16).slice(2,13),se=["[&_.ant-dropdown-menu-item]:!outline-none","[&_.ant-dropdown-menu-submenu-title]:!outline-none","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-2","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-primary-500","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:bg-gray-50","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:dark:bg-black-600","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-2","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-primary-500","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:bg-gray-50","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:dark:bg-black-600"].join(" ");let Se=null;const Te=T=>{T?(Se=document.activeElement,setTimeout(()=>{document.querySelector(".row-option-cell .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .row-option-cell .ant-dropdown-menu-submenu-title")?.focus()},50)):setTimeout(()=>{Se?.focus(),Se=null},0)},d={SELECT:"Select",MOVE_LEFT:"MoveLeft",MOVE_RIGHT:"MoveRight",HIDE:"Hide",UNHIDE:"Unhide",COPY_LINK:"CopyLink",DELETE:"Delete",PIN:"Pin",UNPIN:"Unpin",EDIT:"Edit"},At=({variant:T="default",tabs:O=[],activeTab:i,onTabClick:Xe,suffixRecord:P,isLoading:Ze,size:_="md",className:Ce,draggable:E=!1,showAllItems:F=!1,copyLink:Ke=!1,isDisabled:et=!1,color:ae="light",iconsOnly:tt=!1,tabIcons:oe={},height:nt="h-6",fullWidth:re=!1,fitContentWidth:st=!1,disableAnimation:at=!1,onEdit:je,onDelete:Ie,onCopyLink:Ne,allowPin:C=!1,isFullWidth:$=!1,rightSection:L,initialTabs:ot,tabConfig:rt,onTabConfigChange:ve,onTabsChange:Oe,parentContainer:it=document.body,tabKey:j,linkConfig:x,showTabOptions:lt=!0})=>{const g=Lt.useTabConfig(),_e=j?g?.getTabSettings(j):void 0,ie=ot??_e?.tab_items,A=rt??_e?.tab_options,[le,ct]=a.useState(""),[N,G]=a.useState(!1),[q,dt]=a.useState(0),[u,ce]=a.useState([]),[Y,ut]=a.useState([]),[pt,J]=a.useState(null),[D,Q]=a.useState(null),[xt,Ee]=a.useState(!1),[De,Ve]=a.useState(A??Vt.INITIAL_TAB_OPTION_CONFIG),[de,bt]=a.useState(""),[Me,mt]=a.useState("contains"),{showCounts:y,lockOrder:R,sortOrder:ue}=De,{t:p}=Dt.useTranslation(),X=a.useRef(null),ft=a.useRef(null),Le=a.useRef(q),{measureText:B}=qt.useTextWidth(),H=a.useMemo(()=>$t(),[]),ht=v.useSensors(v.useSensor(v.MouseSensor,{activationConstraint:{distance:5}}),v.useSensor(v.TouchSensor,{activationConstraint:{delay:300,tolerance:5}})),b=a.useMemo(()=>P&&Object.fromEntries(Object.entries(P).map(([e,t])=>[e,Mt.formatCount(t)])),[P]),qe=a.useMemo(()=>Y.filter(({is_hidden:e})=>!e),[Y]),V=a.useMemo(()=>Y.filter(({is_hidden:e})=>e),[Y]),Re=a.useMemo(()=>qe.filter(({name:e})=>{if(!de)return!0;const t=(e??"").toLowerCase(),s=de.toLowerCase();return Me==="contains"?t.includes(s):!t.includes(s)}),[qe,de,Me]),r=a.useMemo(()=>[...Re].sort((e,t)=>e.is_pinned&&!t.is_pinned?-1:!e.is_pinned&&t.is_pinned?1:0),[Re]),gt=q<r.length,Z=F?r.length:gt?q:r.length,Be=r.findIndex(e=>e.name===i)>=Z,He=u.length-Z-(Be?1:0);Le.current=q;const U=a.useCallback(e=>{ce(e),Oe?.(e),j&&g?.persistTabSettings&&g.persistTabSettings({tab_type:j,tab_items:e})},[Oe,j,g]),wt=a.useCallback(e=>{Ve(e),ve?.(e),j&&g?.persistTabSettings&&g.persistTabSettings({tab_type:j,tab_options:e})},[ve,j,g]),Ue=e=>e.is_pinned?32:0,pe=a.useCallback(e=>{if(!e)return;const t=E?30:0,s=y?190:84,l=_==="sm"?4:8,o=32;let m=0,ee=0,w=0;const f=e-(L?.width||0)-t,Fe=Le.current,$e=Fe<r.length,Ae=V.length>0;for(let h=0;h<r.length;h++){const I=r[h],te=b?.[I.name]?String(b?.[I.name]):"",fe=y&&te?B(te,{fontSize:"16px",fontWeight:"500",fontFamily:"Inter, system-ui, -apple-system, sans-serif"})+18+2:0,he=B(I?.name||"",{fontSize:"16px",fontWeight:"600",fontFamily:"Inter, system-ui, -apple-system, sans-serif"}),ge=C?Ue(I):0,Ye=he+fe+o+l+ge;if(I.name===i&&(ee=Ye),m+=Ye,f>m+($e||Ae?s:0)+h*25)w=h+1;else break}const Ge=r.length-w;if(Ge+V.length===1&&V.length===0&&Ge===1&&w<r.length){const h=r[w];if(h){const I=b?.[h.name]?String(b?.[h.name]):"",te=y&&I?B(I,{fontSize:"16px",fontWeight:"500",fontFamily:"Inter, system-ui, -apple-system, sans-serif"})+18+2:0,fe=B(h?.name||"",{fontSize:"16px",fontWeight:"600",fontFamily:"Inter, system-ui, -apple-system, sans-serif"}),he=C?Ue(h):0,ge=fe+te+o+l+he;f>=m+ge&&(w+=1)}}const Et=F?r.length:w;r.findIndex(h=>h.name===i)>=Et&&(m+=ee,f<m+($e||Ae?s:0)&&(w=Math.max(w-1,0))),w!==Fe&&dt(w)},[r,y,F,C,b,L?.width,i,_,E,V.length,B]),xe=a.useCallback(()=>{if(typeof window<"u")return new URLSearchParams(window.location.search);if(x&&g?.getSearchParam){const e=new URLSearchParams,t=g.getSearchParam(x.key);return t&&e.set(x.key,t),e}return new URLSearchParams},[x,g]),be=a.useCallback((e,t)=>(x&&(t===x.defaultLink?e.delete(x.key):e.set(x.key,t),x.onResolve?.(e)),e),[x]),z=a.useCallback(e=>x?`?${be(xe(),e).toString()}`:void 0,[be,xe,x]),kt=Ke||!!x,yt=a.useCallback(async e=>{const t=z(e),s=typeof window<"u"?window.location.origin:"",l=typeof window<"u"?window.location.pathname:"",o=t?`${s}${l}${t}`:`${s}${l}`;await navigator.clipboard.writeText(o),Ut.toast.success(p("Link copied to clipboard"),{toastId:"Link copied to clipboard"}),Ne?.(e,o)},[z,p,Ne]),W=e=>{if(G(!1),Xe?.(e),x&&g?.navigate){const t=be(xe(),e);g.navigate(`?${t.toString()}`)}},ze=e=>{if(r.length<=1)return;const t=u.map(o=>o.name===e?{...o,is_hidden:!0}:o),s=r.findIndex(o=>o.name===e),l=s===0?1:s-1;W(r[l].name),U(t)},St=e=>{const t=u.map(s=>s.name===e?{...s,is_hidden:!1}:s);G(!1),U(t)},K=e=>{if(!C)return;const t=u.map(s=>s.name===e?{...s,is_pinned:!s.is_pinned}:s);U(t)},We=(e,t)=>{const s=u.findIndex(({name:o})=>o===e),l=t==="left"?s-(u[s-1]?.name===i?2:1):s+1;U(ne.arrayMove(u,s,l))},Pe=()=>G(!N),Tt=e=>Q(e.active.id),Ct=e=>{const{active:t,over:s}=e;if(s?.id==="more-tabs"){ze(t.id),Q(null),J(null);return}const l=u.findIndex(({name:m})=>m===t.id),o=u.findIndex(({name:m})=>m===s?.id);U(ne.arrayMove(u,l,o)),Q(null),J(null)},jt=()=>{Q(null),J(null)},It=e=>{J(e.over?.id==="more-tabs"?"more-tabs":null)},Nt=()=>{},vt=(e,t)=>{bt(e),mt(t)},me=(e,t=!1,s=!1)=>{const o=u.find(f=>f.name===e)?.is_pinned,m=[{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ArrowOutwardIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Select Tab"),className:"text-black-900 dark:text-white"}),key:d.SELECT,onClick:()=>W(e)},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ArrowUpwardIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Move Up"),isDisabled:R,className:"text-black-900 dark:text-white"}),key:d.MOVE_LEFT,disabled:R,onClick:()=>We(e,"left")},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ArrowDownwardIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Move Down"),isDisabled:R,className:"text-black-900 dark:text-white"}),key:d.MOVE_RIGHT,disabled:R,onClick:()=>We(e,"right")},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ContentCopyIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Copy Link"),className:"text-black-900 dark:text-white"}),key:d.COPY_LINK,onClick:()=>yt(e)},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.VisibilityOffIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Hide"),className:"text-black-900 dark:text-white"}),key:d.HIDE,onClick:()=>ze(e)},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.VisibilityIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Unhide"),className:"text-black-900 dark:text-white"}),key:d.UNHIDE,onClick:()=>St(e)},{label:n.jsx(S.OptionButton,{icon:o?n.jsx(k.UnpinFilledIcon,{size:20,className:"rotate-12 text-inherit dark:text-inherit"}):n.jsx(k.PinIcon,{size:20,className:"rotate-45 text-inherit dark:text-inherit"}),text:p(o?"Unpin":"Pin"),className:"text-black-900 dark:text-white",notVisible:!C}),key:o?d.UNPIN:d.PIN,onClick:()=>K(e)},{label:n.jsx(S.OptionButton,{className:"text-black-900 dark:text-white",icon:n.jsx(Ht.EditIcon,{}),text:p("Edit"),notVisible:!je}),key:d.EDIT,onClick:()=>je?.(e)},{label:n.jsx(S.OptionButton,{className:"text-error-600 dark:text-error-600",icon:n.jsx(k.DeleteIcon,{size:18,className:"text-error-600 dark:text-error-600"}),text:p("Delete"),notVisible:!Ie}),key:d.DELETE,onClick:()=>Ie?.(e)}],ee=[d.HIDE,d.UNHIDE],w=[d.SELECT,d.MOVE_LEFT,d.MOVE_RIGHT,d.UNHIDE];return m.filter(f=>t?f.key===d.UNHIDE:s?!ee.includes(f.key):!w.includes(f.key)).filter(f=>kt?!0:f.key!==d.COPY_LINK).filter(f=>r.length===1?f.key!==d.HIDE:!0)},M=(e,t)=>({classValue:{default:c("relative inline-flex pt-2 pb-3 px-2 pl-3 sm:px-2 rounded-t-sm group"),secondary:c("flex w-full sm:w-auto relative rounded-lg font-sans font-semibold text-center cursor-pointer uppercase",_==="sm"?"py-1 px-3 text-sm":"py-2 px-4 text-base")},selectedClassValue:{default:c("absolute left-0 bottom-0 w-full h-[3px] bg-primary-600"),secondary:c("absolute inset-0 bg-primary-50 dark:bg-primary-975 rounded-lg")},textClassValue:{default:c("relative uppercase font-sans font-semibold text-sm whitespace-nowrap",t?"text-primary-600 dark:text-primary-500":"text-neutral-400 hover:text-neutral-500 dark:text-neutral-100 dark:hover:text-white"),secondary:c("relative whitespace-nowrap text-sm",t?"text-primary-600 dark:text-primary-500":"text-neutral-400 dark:text-neutral-400")}})[e][T];a.useEffect(()=>{if(!X.current||T==="switch")return;const e=new ResizeObserver(t=>{const s=t[0].contentRect.width;pe(s)});return e.observe(X.current),pe(X.current.clientWidth),()=>e.disconnect()},[pe,T]);const Ot=JSON.stringify(O),_t=JSON.stringify(ie?.map(({name:e})=>e));return a.useEffect(()=>{if(ie?.length){let e=[...ie];O.forEach(t=>{e.find(s=>s.name===t)||e.push({name:t,is_default:!1,is_hidden:!1,is_pinned:!1})}),e=e.filter((t,s,l)=>O.includes(t.name)&&s===l.findIndex(o=>o.name===t.name)),ce(e)}else ce(O.map(e=>({name:e,is_default:!1,is_hidden:!1,is_pinned:!1})).filter((e,t,s)=>t===s.findIndex(l=>l.name===e.name)))},[Ot,_t]),a.useEffect(()=>{A&&Ve(A)},[A]),a.useEffect(()=>{if(!u.length)return;const e=[...u];ue==="asc"?e.sort((t,s)=>t.name.localeCompare(s.name)):ue==="desc"&&e.sort((t,s)=>s.name.localeCompare(t.name)),ut(e)},[u,ue]),a.useEffect(()=>{Te(N)},[N]),T==="switch"?n.jsx("div",{className:c("inline",Ce),children:n.jsx("ul",{role:"tablist","aria-orientation":"horizontal",className:c("inline-flex grow-0 p-1 rounded-lg",ae==="dark"?"border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800":"bg-neutral-100 dark:bg-black-700",re?"w-full":"w-auto"),children:O.map(e=>{const t=i===e,s=oe?.[e],l=u.find(m=>m.name===e),o=C&&l?.is_pinned;return n.jsx("li",{role:"presentation",className:c("inline-flex",re?"w-full":"w-auto"),children:n.jsx(ye.TabSwitch,{title:e,showCounts:y,role:"tab",ariaSelected:t,tabIndex:0,icon:o?n.jsx(ke,{title:"Unpin",children:n.jsx("span",{onClick:()=>K(e),children:n.jsx(k.PinIcon,{size:20,className:"rotate-45 text-inherit dark:text-inherit"})})}):s,iconsOnly:tt,classValue:c("relative py-0.5 border-gray-200",nt,re?"w-full flex items-center justify-center":"px-2"),selectedClassValue:c("absolute inset-0 rounded-md z-0",ae==="dark"?"bg-neutral-900":"bg-white dark:bg-black-800"),textClassValue:c("relative text-xs font-semibold font-sans whitespace-nowrap",t?"text-neutral-900 dark:text-neutral-100":"text-neutral-700 dark:text-neutral-100"),isSelected:t,href:z(e),onClick:et?void 0:()=>W(e),suffixRecord:b,selectedId:H,color:ae,disableAnimation:at})},e)})})}):n.jsx("div",{ref:X,className:c(st?"w-fit":"w-full"),onMouseEnter:()=>Ee(!0),onMouseLeave:()=>Ee(!1),children:n.jsxs(v.DndContext,{sensors:ht,onDragEnd:Ct,onDragStart:Tt,onDragCancel:jt,collisionDetection:v.closestCenter,onDragOver:It,children:[n.jsxs("ul",{role:"tablist","aria-orientation":"horizontal",className:c("flex items-center w-full",Ce,$?"gap-0":_==="sm"?"gap-1":"gap-2"),ref:ft,children:[Ze?n.jsx("div",{className:"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded"}):n.jsxs(ne.SortableContext,{items:r.map(({name:e})=>e),strategy:ne.horizontalListSortingStrategy,id:"sortable",disabled:!E||R,children:[r.slice(0,Z).map(({name:e,is_pinned:t})=>{const s=i===e&&!N,l=C&&t;return n.jsx(Qe.SortableTab,{title:e,isDragging:D===e,className:$?"flex-1 flex justify-center":"",children:n.jsx("li",{role:"presentation",className:c($?"w-full flex":"sm:mr-2"),children:n.jsx(ye.TabSwitch,{showCounts:y,title:e,role:"tab",ariaSelected:s,tabIndex:0,classValue:c(M("classValue",s),$?"w-full justify-center":""),selectedClassValue:M("selectedClassValue",s),textClassValue:M("textClassValue",s),isSelected:s,tabOptions:s&&E?n.jsx(we.Dropdown,{menu:{items:me(e),className:se},trigger:["click"],onOpenChange:Te,overlayClassName:"row-option-cell",rootClassName:"",openClassName:"max-h-[350px] overflow-y-auto",placement:"bottom",children:n.jsx(Rt,{tooltip:p("More"),variant:"ghost",className:"!text-primary-500 hover:!bg-primary-100 dark:hover:!bg-primary-900",children:n.jsx(Je,{sx:{fontSize:20}})})}):null,draggingTab:D===e,href:z(e),onClick:()=>W(e),suffixRecord:b,selectedId:H,icon:l?n.jsx(ke,{title:p("Unpin"),children:n.jsx("span",{onClick:()=>K(e),children:n.jsx(k.PinIcon,{size:20,className:"rotate-45 text-inherit dark:text-inherit"})})}):oe?.[e]??null})},e)},e)}),i&&Be?n.jsx(Qe.SortableTab,{title:i,isDragging:D===i,children:n.jsx("li",{role:"presentation",className:c("sm:mr-2"),children:n.jsx(ye.TabSwitch,{showCounts:y,title:i,role:"tab",ariaSelected:!0,tabIndex:0,classValue:M("classValue",!0),selectedClassValue:M("selectedClassValue",!0),textClassValue:M("textClassValue",!0),isSelected:!0,tabOptions:E?n.jsx(we.Dropdown,{menu:{items:me(i),className:se},trigger:["click"],onOpenChange:Te,overlayClassName:"row-option-cell",rootClassName:"",openClassName:"max-h-[350px] overflow-y-auto",placement:"bottom",children:n.jsx(Je,{sx:{fontSize:20},className:"text-primary-600"})}):null,draggingTab:D===i,href:z(i),suffixRecord:b,selectedId:H,icon:C&&u.find(e=>e.name===i)?.is_pinned?n.jsx(ke,{title:p("Pinned"),children:n.jsx("span",{onClick:()=>K(i),children:n.jsx(k.PinIcon,{size:20,className:"rotate-45 text-inherit dark:text-inherit"})})}):oe?.[i]??null})},i)},i):null,(q<r.length&&!F||V.length>0)&&He>0?n.jsx(zt.DropableWrapper,{id:"more-tabs",children:n.jsx(we.Dropdown,{overlayStyle:{maxHeight:"calc(100vh - 350px)",overflow:"auto",marginTop:"8px",scrollbarWidth:"none",borderRadius:8,boxShadow:"0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)"},onOpenChange:()=>Pe(),open:N,menu:{items:[{key:"Search",disabled:!0,style:{minWidth:"190px",marginBottom:"8px"},label:n.jsx("div",{className:"px-2 bg-white dark:bg-black-800",children:n.jsx(Bt.SearchBar,{id:"search-bar-more-tabs",value:le,classValues:"!rounded-lg",onChange:e=>ct(e)})})},...r.slice(Z).filter(e=>e.name!==i).concat(V).filter(({name:e})=>typeof e=="string"&&(e??"").toLowerCase().includes(le.toLowerCase())).map(({name:e,is_hidden:t})=>({key:e,label:n.jsx(S.OptionButton,{className:c("uppercase",t?"text-neutral-400 dark:text-neutral-500":"text-black-900 dark:text-black-200"),text:e,suffixRecord:y?b:{},highlight:le,truncateText:!0,isDisabled:t,onClick:t?void 0:()=>{W(e),G(!1)}}),popupClassName:se,children:N?me(e,t,!0):null}))],className:se},openClassName:"max-h-[350px] overflow-y-auto",trigger:["click"],overlayClassName:"row-option-cell",placement:"bottomRight",getPopupContainer:e=>e.parentElement,children:n.jsx(Wt.MoreButton,{title:`${y?He:""} MORE...`,variant:T,size:_,draggingOver:pt,suffixRecord:b,handleShowMoreDropdown:Pe,selectedId:H,showMoreDropdown:N})})}):null]}),L?n.jsx("div",{className:c(L?.className),children:n.jsx("li",{children:L.component})}):null,E&<&&n.jsx("li",{className:c(xt?"opacity-100":"opacity-0","transition-opacity duration-300"),children:n.jsx(Pt.TabOptions,{hasSuffixRecord:!!(b&&Object.keys(b).length>0),savedConfig:De,onApplyFilter:e=>wt(e),setUnsavedChanges:()=>{},handleTabSort:Nt,onSearchChange:vt})})]}),D?n.jsx(Ft.TabDragOverlay,{draggingTab:D,suffixRecord:b,size:_,variant:T,selectedId:H,parentContainer:it}):null]})})};exports.Tabs=At;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),v=require("@dnd-kit/core"),ne=require("@dnd-kit/sortable"),we=require("antd"),c=require("../../../_virtual/index.cjs.js"),a=require("react"),Dt=require("react-i18next"),Je=require("@mui/icons-material/MoreHorizOutlined"),Vt=require("./types.cjs.js"),Mt=require("../../../utils/formatters.cjs.js"),Lt=require("../../../providers/design-system-provider/hooks.cjs.js"),qt=require("../../../hooks/useTextWidth.cjs.js"),Rt=require("../../button/IconButton.cjs.js"),S=require("../../buttons/option-button/OptionButton.cjs.js"),Bt=require("../../forms/search-bar/SearchBar.cjs.js"),ke=require("../../tooltip/Tooltip.cjs.js"),Ht=require("../../icons/EditIcon.cjs.js"),Ut=require("react-toastify"),ye=require("./TabSwitch.cjs.js"),k=require("../../icon/icons.generated.cjs.js"),Qe=require("./SortableTab.cjs.js"),Wt=require("./DropableWrapper.cjs.js"),zt=require("./MoreButton.cjs.js"),Pt=require("./TabOptions.cjs.js"),Ft=require("./TabDragOverlay.cjs.js"),$t=()=>Math.random().toString(16).slice(2,13),se=["[&_.ant-dropdown-menu-item]:!outline-none","[&_.ant-dropdown-menu-submenu-title]:!outline-none","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-2","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-primary-500","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:bg-gray-50","[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:dark:bg-black-600","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-2","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-primary-500","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:bg-gray-50","[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:dark:bg-black-600"].join(" ");let Se=null;const Te=T=>{T?(Se=document.activeElement,setTimeout(()=>{document.querySelector(".row-option-cell .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .row-option-cell .ant-dropdown-menu-submenu-title")?.focus()},50)):setTimeout(()=>{Se?.focus(),Se=null},0)},d={SELECT:"Select",MOVE_LEFT:"MoveLeft",MOVE_RIGHT:"MoveRight",HIDE:"Hide",UNHIDE:"Unhide",COPY_LINK:"CopyLink",DELETE:"Delete",PIN:"Pin",UNPIN:"Unpin",EDIT:"Edit"},At=({variant:T="default",tabs:O=[],activeTab:i,onTabClick:Xe,suffixRecord:P,isLoading:Ze,size:_="md",className:Ce,draggable:E=!1,showAllItems:F=!1,copyLink:Ke=!1,isDisabled:et=!1,color:ae="light",iconsOnly:tt=!1,tabIcons:oe={},height:nt="h-6",fullWidth:re=!1,fitContentWidth:st=!1,disableAnimation:at=!1,onEdit:je,onDelete:Ie,onCopyLink:Ne,allowPin:C=!1,isFullWidth:$=!1,rightSection:L,initialTabs:ot,tabConfig:rt,onTabConfigChange:ve,onTabsChange:Oe,parentContainer:it=document.body,tabKey:j,linkConfig:x,showTabOptions:lt=!0})=>{const g=Lt.useTabConfig(),_e=j?g?.getTabSettings(j):void 0,ie=ot??_e?.tab_items,A=rt??_e?.tab_options,[le,ct]=a.useState(""),[N,G]=a.useState(!1),[q,dt]=a.useState(0),[u,ce]=a.useState([]),[Y,ut]=a.useState([]),[pt,J]=a.useState(null),[D,Q]=a.useState(null),[xt,Ee]=a.useState(!1),[De,Ve]=a.useState(A??Vt.INITIAL_TAB_OPTION_CONFIG),[de,bt]=a.useState(""),[Me,mt]=a.useState("contains"),{showCounts:y,lockOrder:R,sortOrder:ue}=De,{t:p}=Dt.useTranslation(),X=a.useRef(null),ft=a.useRef(null),Le=a.useRef(q),{measureText:B}=qt.useTextWidth(),H=a.useMemo(()=>$t(),[]),ht=v.useSensors(v.useSensor(v.MouseSensor,{activationConstraint:{distance:5}}),v.useSensor(v.TouchSensor,{activationConstraint:{delay:300,tolerance:5}})),b=a.useMemo(()=>P&&Object.fromEntries(Object.entries(P).map(([e,t])=>[e,Mt.formatCount(t)])),[P]),qe=a.useMemo(()=>Y.filter(({is_hidden:e})=>!e),[Y]),V=a.useMemo(()=>Y.filter(({is_hidden:e})=>e),[Y]),Re=a.useMemo(()=>qe.filter(({name:e})=>{if(!de)return!0;const t=(e??"").toLowerCase(),s=de.toLowerCase();return Me==="contains"?t.includes(s):!t.includes(s)}),[qe,de,Me]),r=a.useMemo(()=>[...Re].sort((e,t)=>e.is_pinned&&!t.is_pinned?-1:!e.is_pinned&&t.is_pinned?1:0),[Re]),gt=q<r.length,Z=F?r.length:gt?q:r.length,Be=r.findIndex(e=>e.name===i)>=Z,He=u.length-Z-(Be?1:0);Le.current=q;const U=a.useCallback(e=>{ce(e),Oe?.(e),j&&g?.persistTabSettings&&g.persistTabSettings({tab_type:j,tab_items:e})},[Oe,j,g]),wt=a.useCallback(e=>{Ve(e),ve?.(e),j&&g?.persistTabSettings&&g.persistTabSettings({tab_type:j,tab_options:e})},[ve,j,g]),Ue=e=>e.is_pinned?32:0,pe=a.useCallback(e=>{if(!e)return;const t=E?30:0,s=y?190:84,l=_==="sm"?4:8,o=32;let m=0,ee=0,w=0;const f=e-(L?.width||0)-t,Fe=Le.current,$e=Fe<r.length,Ae=V.length>0;for(let h=0;h<r.length;h++){const I=r[h],te=b?.[I.name]?String(b?.[I.name]):"",fe=y&&te?B(te,{fontSize:"16px",fontWeight:"500",fontFamily:"Inter, system-ui, -apple-system, sans-serif"})+18+2:0,he=B(I?.name||"",{fontSize:"16px",fontWeight:"600",fontFamily:"Inter, system-ui, -apple-system, sans-serif"}),ge=C?Ue(I):0,Ye=he+fe+o+l+ge;if(I.name===i&&(ee=Ye),m+=Ye,f>m+($e||Ae?s:0)+h*25)w=h+1;else break}const Ge=r.length-w;if(Ge+V.length===1&&V.length===0&&Ge===1&&w<r.length){const h=r[w];if(h){const I=b?.[h.name]?String(b?.[h.name]):"",te=y&&I?B(I,{fontSize:"16px",fontWeight:"500",fontFamily:"Inter, system-ui, -apple-system, sans-serif"})+18+2:0,fe=B(h?.name||"",{fontSize:"16px",fontWeight:"600",fontFamily:"Inter, system-ui, -apple-system, sans-serif"}),he=C?Ue(h):0,ge=fe+te+o+l+he;f>=m+ge&&(w+=1)}}const Et=F?r.length:w;r.findIndex(h=>h.name===i)>=Et&&(m+=ee,f<m+($e||Ae?s:0)&&(w=Math.max(w-1,0))),w!==Fe&&dt(w)},[r,y,F,C,b,L?.width,i,_,E,V.length,B]),xe=a.useCallback(()=>{if(typeof window<"u")return new URLSearchParams(window.location.search);if(x&&g?.getSearchParam){const e=new URLSearchParams,t=g.getSearchParam(x.key);return t&&e.set(x.key,t),e}return new URLSearchParams},[x,g]),be=a.useCallback((e,t)=>(x&&(t===x.defaultLink?e.delete(x.key):e.set(x.key,t),x.onResolve?.(e)),e),[x]),W=a.useCallback(e=>x?`?${be(xe(),e).toString()}`:void 0,[be,xe,x]),kt=Ke||!!x,yt=a.useCallback(async e=>{const t=W(e),s=typeof window<"u"?window.location.origin:"",l=typeof window<"u"?window.location.pathname:"",o=t?`${s}${l}${t}`:`${s}${l}`;await navigator.clipboard.writeText(o),Ut.toast.success(p("Link copied to clipboard"),{toastId:"Link copied to clipboard"}),Ne?.(e,o)},[W,p,Ne]),z=e=>{if(G(!1),Xe?.(e),x&&g?.navigate){const t=be(xe(),e);g.navigate(`?${t.toString()}`)}},We=e=>{if(r.length<=1)return;const t=u.map(o=>o.name===e?{...o,is_hidden:!0}:o),s=r.findIndex(o=>o.name===e),l=s===0?1:s-1;z(r[l].name),U(t)},St=e=>{const t=u.map(s=>s.name===e?{...s,is_hidden:!1}:s);G(!1),U(t)},K=e=>{if(!C)return;const t=u.map(s=>s.name===e?{...s,is_pinned:!s.is_pinned}:s);U(t)},ze=(e,t)=>{const s=u.findIndex(({name:o})=>o===e),l=t==="left"?s-(u[s-1]?.name===i?2:1):s+1;U(ne.arrayMove(u,s,l))},Pe=()=>G(!N),Tt=e=>Q(e.active.id),Ct=e=>{const{active:t,over:s}=e;if(s?.id==="more-tabs"){We(t.id),Q(null),J(null);return}const l=u.findIndex(({name:m})=>m===t.id),o=u.findIndex(({name:m})=>m===s?.id);U(ne.arrayMove(u,l,o)),Q(null),J(null)},jt=()=>{Q(null),J(null)},It=e=>{J(e.over?.id==="more-tabs"?"more-tabs":null)},Nt=()=>{},vt=(e,t)=>{bt(e),mt(t)},me=(e,t=!1,s=!1)=>{const o=u.find(f=>f.name===e)?.is_pinned,m=[{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ArrowOutwardIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Select Tab"),className:"text-black-900 dark:text-white"}),key:d.SELECT,onClick:()=>z(e)},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ArrowUpwardIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Move Up"),isDisabled:R,className:"text-black-900 dark:text-white"}),key:d.MOVE_LEFT,disabled:R,onClick:()=>ze(e,"left")},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ArrowDownwardIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Move Down"),isDisabled:R,className:"text-black-900 dark:text-white"}),key:d.MOVE_RIGHT,disabled:R,onClick:()=>ze(e,"right")},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.ContentCopyIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Copy Link"),className:"text-black-900 dark:text-white"}),key:d.COPY_LINK,onClick:()=>yt(e)},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.VisibilityOffIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Hide"),className:"text-black-900 dark:text-white"}),key:d.HIDE,onClick:()=>We(e)},{label:n.jsx(S.OptionButton,{icon:n.jsx(k.VisibilityIcon,{size:18,className:"text-inherit dark:text-inherit"}),text:p("Unhide"),className:"text-black-900 dark:text-white"}),key:d.UNHIDE,onClick:()=>St(e)},{label:n.jsx(S.OptionButton,{icon:o?n.jsx(k.UnpinFilledIcon,{size:20,className:"rotate-12 text-inherit dark:text-inherit"}):n.jsx(k.PinIcon,{size:20,className:"rotate-45 text-inherit dark:text-inherit"}),text:p(o?"Unpin":"Pin"),className:"text-black-900 dark:text-white",notVisible:!C}),key:o?d.UNPIN:d.PIN,onClick:()=>K(e)},{label:n.jsx(S.OptionButton,{className:"text-black-900 dark:text-white",icon:n.jsx(Ht.EditIcon,{}),text:p("Edit"),notVisible:!je}),key:d.EDIT,onClick:()=>je?.(e)},{label:n.jsx(S.OptionButton,{className:"text-error-600 dark:text-error-600",icon:n.jsx(k.DeleteIcon,{size:18,className:"text-error-600 dark:text-error-600"}),text:p("Delete"),notVisible:!Ie}),key:d.DELETE,onClick:()=>Ie?.(e)}],ee=[d.HIDE,d.UNHIDE],w=[d.SELECT,d.MOVE_LEFT,d.MOVE_RIGHT,d.UNHIDE];return m.filter(f=>t?f.key===d.UNHIDE:s?!ee.includes(f.key):!w.includes(f.key)).filter(f=>kt?!0:f.key!==d.COPY_LINK).filter(f=>r.length===1?f.key!==d.HIDE:!0)},M=(e,t)=>({classValue:{default:c("relative inline-flex pt-2 pb-3 px-2 pl-3 sm:px-2 rounded-t-sm group"),secondary:c("flex w-full sm:w-auto relative rounded-lg font-sans font-semibold text-center cursor-pointer uppercase",_==="sm"?"py-1 px-3 text-sm":"py-2 px-4 text-base")},selectedClassValue:{default:c("absolute left-0 bottom-0 w-full h-[3px] bg-primary-600"),secondary:c("absolute inset-0 bg-primary-50 dark:bg-primary-975 rounded-lg")},textClassValue:{default:c("relative uppercase font-sans font-semibold text-sm whitespace-nowrap",t?"text-primary-600 dark:text-primary-500":"text-neutral-400 hover:text-neutral-500 dark:text-neutral-100 dark:hover:text-white"),secondary:c("relative whitespace-nowrap text-sm",t?"text-primary-600 dark:text-primary-500":"text-neutral-400 dark:text-neutral-400")}})[e][T];a.useEffect(()=>{if(!X.current||T==="switch")return;const e=new ResizeObserver(t=>{const s=t[0].contentRect.width;pe(s)});return e.observe(X.current),pe(X.current.clientWidth),()=>e.disconnect()},[pe,T]);const Ot=JSON.stringify(O),_t=JSON.stringify(ie?.map(({name:e})=>e));return a.useEffect(()=>{if(ie?.length){let e=[...ie];O.forEach(t=>{e.find(s=>s.name===t)||e.push({name:t,is_default:!1,is_hidden:!1,is_pinned:!1})}),e=e.filter((t,s,l)=>O.includes(t.name)&&s===l.findIndex(o=>o.name===t.name)),ce(e)}else ce(O.map(e=>({name:e,is_default:!1,is_hidden:!1,is_pinned:!1})).filter((e,t,s)=>t===s.findIndex(l=>l.name===e.name)))},[Ot,_t]),a.useEffect(()=>{A&&Ve(A)},[A]),a.useEffect(()=>{if(!u.length)return;const e=[...u];ue==="asc"?e.sort((t,s)=>t.name.localeCompare(s.name)):ue==="desc"&&e.sort((t,s)=>s.name.localeCompare(t.name)),ut(e)},[u,ue]),a.useEffect(()=>{Te(N)},[N]),T==="switch"?n.jsx("div",{className:c("inline",Ce),children:n.jsx("ul",{role:"tablist","aria-orientation":"horizontal",className:c("inline-flex grow-0 p-1 rounded-lg",ae==="dark"?"border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800":"bg-neutral-100 dark:bg-black-700",re?"w-full":"w-auto"),children:O.map(e=>{const t=i===e,s=oe?.[e],l=u.find(m=>m.name===e),o=C&&l?.is_pinned;return n.jsx("li",{role:"presentation",className:c("inline-flex",re?"w-full":"w-auto"),children:n.jsx(ye.TabSwitch,{title:e,showCounts:y,role:"tab",ariaSelected:t,tabIndex:0,icon:o?n.jsx(ke,{title:"Unpin",children:n.jsx("span",{onClick:()=>K(e),children:n.jsx(k.PinIcon,{className:"rotate-45 w-icon h-icon text-inherit dark:text-inherit"})})}):s,iconsOnly:tt,classValue:c("relative py-0.5 border-gray-200",nt,re?"w-full flex items-center justify-center":"px-2"),selectedClassValue:c("absolute inset-0 rounded-md z-0",ae==="dark"?"bg-neutral-900":"bg-white dark:bg-black-800"),textClassValue:c("relative text-xs font-semibold font-sans whitespace-nowrap",t?"text-neutral-900 dark:text-neutral-100":"text-neutral-700 dark:text-neutral-100"),isSelected:t,href:W(e),onClick:et?void 0:()=>z(e),suffixRecord:b,selectedId:H,color:ae,disableAnimation:at})},e)})})}):n.jsx("div",{ref:X,className:c(st?"w-fit":"w-full"),onMouseEnter:()=>Ee(!0),onMouseLeave:()=>Ee(!1),children:n.jsxs(v.DndContext,{sensors:ht,onDragEnd:Ct,onDragStart:Tt,onDragCancel:jt,collisionDetection:v.closestCenter,onDragOver:It,children:[n.jsxs("ul",{role:"tablist","aria-orientation":"horizontal",className:c("flex items-center w-full",Ce,$?"gap-0":_==="sm"?"gap-1":"gap-2"),ref:ft,children:[Ze?n.jsx("div",{className:"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded"}):n.jsxs(ne.SortableContext,{items:r.map(({name:e})=>e),strategy:ne.horizontalListSortingStrategy,id:"sortable",disabled:!E||R,children:[r.slice(0,Z).map(({name:e,is_pinned:t})=>{const s=i===e&&!N,l=C&&t;return n.jsx(Qe.SortableTab,{title:e,isDragging:D===e,className:$?"flex-1 flex justify-center":"",children:n.jsx("li",{role:"presentation",className:c($?"w-full flex":"sm:mr-2"),children:n.jsx(ye.TabSwitch,{showCounts:y,title:e,role:"tab",ariaSelected:s,tabIndex:0,classValue:c(M("classValue",s),$?"w-full justify-center":""),selectedClassValue:M("selectedClassValue",s),textClassValue:M("textClassValue",s),isSelected:s,tabOptions:s&&E?n.jsx(we.Dropdown,{menu:{items:me(e),className:se},trigger:["click"],onOpenChange:Te,overlayClassName:"row-option-cell",rootClassName:"",openClassName:"max-h-[350px] overflow-y-auto",placement:"bottom",children:n.jsx(Rt,{tooltip:p("More"),variant:"ghost",className:"!text-primary-500 hover:!bg-primary-100 dark:hover:!bg-primary-900",children:n.jsx(Je,{sx:{fontSize:20}})})}):null,draggingTab:D===e,href:W(e),onClick:()=>z(e),suffixRecord:b,selectedId:H,icon:l?n.jsx(ke,{title:p("Unpin"),children:n.jsx("span",{onClick:()=>K(e),children:n.jsx(k.PinIcon,{size:20,className:"rotate-45 text-inherit dark:text-inherit"})})}):oe?.[e]??null})},e)},e)}),i&&Be?n.jsx(Qe.SortableTab,{title:i,isDragging:D===i,children:n.jsx("li",{role:"presentation",className:c("sm:mr-2"),children:n.jsx(ye.TabSwitch,{showCounts:y,title:i,role:"tab",ariaSelected:!0,tabIndex:0,classValue:M("classValue",!0),selectedClassValue:M("selectedClassValue",!0),textClassValue:M("textClassValue",!0),isSelected:!0,tabOptions:E?n.jsx(we.Dropdown,{menu:{items:me(i),className:se},trigger:["click"],onOpenChange:Te,overlayClassName:"row-option-cell",rootClassName:"",openClassName:"max-h-[350px] overflow-y-auto",placement:"bottom",children:n.jsx(Je,{sx:{fontSize:20},className:"text-primary-600"})}):null,draggingTab:D===i,href:W(i),suffixRecord:b,selectedId:H,icon:C&&u.find(e=>e.name===i)?.is_pinned?n.jsx(ke,{title:p("Pinned"),children:n.jsx("span",{onClick:()=>K(i),children:n.jsx(k.PinIcon,{size:20,className:"rotate-45 text-inherit dark:text-inherit"})})}):oe?.[i]??null})},i)},i):null,(q<r.length&&!F||V.length>0)&&He>0?n.jsx(Wt.DropableWrapper,{id:"more-tabs",children:n.jsx(we.Dropdown,{overlayStyle:{maxHeight:"calc(100vh - 350px)",overflow:"auto",marginTop:"8px",scrollbarWidth:"none",borderRadius:8,boxShadow:"0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)"},onOpenChange:()=>Pe(),open:N,menu:{items:[{key:"Search",disabled:!0,style:{minWidth:"190px",marginBottom:"8px"},label:n.jsx("div",{className:"px-2 bg-white dark:bg-black-800",children:n.jsx(Bt.SearchBar,{id:"search-bar-more-tabs",value:le,classValues:"!rounded-lg",onChange:e=>ct(e)})})},...r.slice(Z).filter(e=>e.name!==i).concat(V).filter(({name:e})=>typeof e=="string"&&(e??"").toLowerCase().includes(le.toLowerCase())).map(({name:e,is_hidden:t})=>({key:e,label:n.jsx(S.OptionButton,{className:c("uppercase",t?"text-neutral-400 dark:text-neutral-500":"text-black-900 dark:text-black-200"),text:e,suffixRecord:y?b:{},highlight:le,truncateText:!0,isDisabled:t,onClick:t?void 0:()=>{z(e),G(!1)}}),popupClassName:se,children:N?me(e,t,!0):null}))],className:se},openClassName:"max-h-[350px] overflow-y-auto",trigger:["click"],overlayClassName:"row-option-cell",placement:"bottomRight",getPopupContainer:e=>e.parentElement,children:n.jsx(zt.MoreButton,{title:`${y?He:""} MORE...`,variant:T,size:_,draggingOver:pt,suffixRecord:b,handleShowMoreDropdown:Pe,selectedId:H,showMoreDropdown:N})})}):null]}),L?n.jsx("div",{className:c(L?.className),children:n.jsx("li",{children:L.component})}):null,E&<&&n.jsx("li",{className:c(xt?"opacity-100":"opacity-0","transition-opacity duration-300"),children:n.jsx(Pt.TabOptions,{hasSuffixRecord:!!(b&&Object.keys(b).length>0),savedConfig:De,onApplyFilter:e=>wt(e),setUnsavedChanges:()=>{},handleTabSort:Nt,onSearchChange:vt})})]}),D?n.jsx(Ft.TabDragOverlay,{draggingTab:D,suffixRecord:b,size:_,variant:T,selectedId:H,parentContainer:it}):null]})})};exports.Tabs=At;
|
|
2
2
|
//# sourceMappingURL=Tabs.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.cjs.js","sources":["../../../../src/components/navigation/tabs/Tabs.tsx"],"sourcesContent":["import {\n DndContext,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport type { DragEndEvent, DragOverEvent, DragStartEvent } from '@dnd-kit/core';\nimport { SortableContext, horizontalListSortingStrategy, arrayMove } from '@dnd-kit/sortable';\nimport { Dropdown } from 'antd';\nimport classNames from 'classnames';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';\n\nimport { DropableWrapper, MoreButton, SortableTab, TabDragOverlay, TabOptions, TabSwitch } from '.';\nimport type { SuffixRecord, Tab, TabOptionConfig, TabsProps } from './types';\nimport { INITIAL_TAB_OPTION_CONFIG } from './types';\n\nimport { formatCount } from '../../../utils/formatters';\n\nimport { useTabConfig } from '../../../providers/design-system-provider/hooks';\nimport { useTextWidth } from '../../../hooks/useTextWidth';\nimport IconButton from '../../button/IconButton';\nimport { OptionButton } from '../../buttons/option-button/OptionButton';\nimport { SearchBar } from '../../forms/search-bar/SearchBar';\nimport Tooltip from '../../tooltip/Tooltip';\nimport { EditIcon } from '../../icons/EditIcon';\nimport { toast } from 'react-toastify';\nimport { ArrowDownwardIcon, ArrowOutwardIcon, ArrowUpwardIcon, ContentCopyIcon, DeleteIcon, PinIcon, UnpinFilledIcon, VisibilityIcon, VisibilityOffIcon } from '../../icon';\n\nconst randomHex = () => Math.random().toString(16).slice(2, 13);\n\nconst TAB_MENU_CLASS = [\n '[&_.ant-dropdown-menu-item]:!outline-none',\n '[&_.ant-dropdown-menu-submenu-title]:!outline-none',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:dark:bg-black-600',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:dark:bg-black-600',\n].join(' ');\n\nlet dropdownTrigger: HTMLElement | null = null;\n\nconst handleDropdownOpen = (open: boolean) => {\n if (open) {\n dropdownTrigger = document.activeElement as HTMLElement;\n setTimeout(() => {\n const item = document.querySelector<HTMLElement>(\n '.row-option-cell .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .row-option-cell .ant-dropdown-menu-submenu-title',\n );\n item?.focus();\n }, 50);\n } else {\n setTimeout(() => {\n dropdownTrigger?.focus();\n dropdownTrigger = null;\n }, 0);\n }\n};\n\nconst ACTIONS = {\n SELECT: 'Select',\n MOVE_LEFT: 'MoveLeft',\n MOVE_RIGHT: 'MoveRight',\n HIDE: 'Hide',\n UNHIDE: 'Unhide',\n COPY_LINK: 'CopyLink',\n DELETE: 'Delete',\n PIN: 'Pin',\n UNPIN: 'Unpin',\n EDIT: 'Edit',\n} as const;\n\nexport const Tabs = <T extends string>({\n variant = 'default',\n tabs = [],\n activeTab,\n onTabClick,\n suffixRecord: suffixRecordProp,\n isLoading,\n size = 'md',\n className,\n draggable = false,\n showAllItems = false,\n copyLink = false,\n isDisabled = false,\n color = 'light',\n iconsOnly = false,\n tabIcons = {},\n height = 'h-6',\n fullWidth = false,\n fitContentWidth = false,\n disableAnimation = false,\n onEdit,\n onDelete,\n onCopyLink,\n allowPin = false,\n isFullWidth = false,\n rightSection,\n initialTabs: initialTabsProp,\n tabConfig: tabConfigProp,\n onTabConfigChange,\n onTabsChange,\n parentContainer = document.body,\n tabKey,\n linkConfig,\n showTabOptions = true,\n}: TabsProps<T>) => {\n // ── Provider integration ──\n const providerTabConfig = useTabConfig();\n const providerSettings = tabKey ? providerTabConfig?.getTabSettings(tabKey) : undefined;\n\n // Provider-sourced values are used only when the direct props are not passed\n const initialTabs = initialTabsProp ?? (providerSettings?.tab_items as Tab<T>[] | undefined);\n const tabConfig = tabConfigProp ?? providerSettings?.tab_options;\n // ── State ──\n const [search, setSearch] = useState('');\n const [showMoreDropdown, setShowMoreDropdown] = useState(false);\n const [visibleTabCounts, setVisibleTabCounts] = useState(0);\n const [allTabs, setAllTabs] = useState<Tab<T>[]>([]);\n const [sortedTabs, setSortedTabs] = useState<Tab<T>[]>([]);\n const [draggingOver, setDraggingOver] = useState<string | null>(null);\n const [draggingTab, setDraggingTab] = useState<string | null>(null);\n const [isHoveringTabOptions, setIsHoveringTabOptions] = useState(false);\n const [savedTabOptionConfig, setSavedTabOptionConfig] = useState<TabOptionConfig>(\n tabConfig ?? INITIAL_TAB_OPTION_CONFIG,\n );\n const [tabSearchFilter, setTabSearchFilter] = useState('');\n const [tabSearchFilterType, setTabSearchFilterType] = useState<'contains' | 'does-not-contain'>('contains');\n\n const { showCounts, lockOrder, sortOrder } = savedTabOptionConfig;\n\n // ── Refs & Hooks ──\n const { t } = useTranslation();\n const tabsRef = useRef<HTMLDivElement | null>(null);\n const ulRef = useRef<HTMLUListElement | null>(null);\n const visibleTabCountsRef = useRef(visibleTabCounts);\n const { measureText } = useTextWidth();\n const selectedId = useMemo(() => randomHex(), []);\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 5 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 5 } }),\n );\n\n // ── Derived values ──\n // Counts are formatted once here (1000 -> \"1,000\") so the rendered badges and\n // the overflow width measurement always agree.\n const suffixRecord = useMemo(() => {\n if (!suffixRecordProp) return suffixRecordProp;\n return Object.fromEntries(\n Object.entries(suffixRecordProp).map(([name, value]) => [\n name,\n formatCount(value as string | number),\n ]),\n ) as SuffixRecord<T>;\n }, [suffixRecordProp]);\n\n const visibleTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => !is_hidden), [sortedTabs]);\n const hiddenTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => is_hidden), [sortedTabs]);\n\n const filteredVisibleTabs = useMemo(\n () =>\n visibleTabs.filter(({ name }) => {\n if (!tabSearchFilter) return true;\n const tabName = (name ?? '').toLowerCase();\n const searchValue = tabSearchFilter.toLowerCase();\n return tabSearchFilterType === 'contains'\n ? tabName.includes(searchValue)\n : !tabName.includes(searchValue);\n }),\n [visibleTabs, tabSearchFilter, tabSearchFilterType],\n );\n\n const sortedVisibleTabs = useMemo(\n () =>\n [...filteredVisibleTabs].sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1;\n if (!a.is_pinned && b.is_pinned) return 1;\n return 0;\n }),\n [filteredVisibleTabs],\n );\n\n const isTabOverflow = visibleTabCounts < sortedVisibleTabs.length;\n const visibleTabSlice = showAllItems\n ? sortedVisibleTabs.length\n : isTabOverflow\n ? visibleTabCounts\n : sortedVisibleTabs.length;\n const isActiveTabInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= visibleTabSlice;\n const moreButtonTabCounts =\n allTabs.length - visibleTabSlice - (isActiveTabInsideMore ? 1 : 0);\n\n visibleTabCountsRef.current = visibleTabCounts;\n\n // ── Helpers ──\n const updateTabs = useCallback(\n (newTabs: Tab<T>[]) => {\n setAllTabs(newTabs);\n onTabsChange?.(newTabs);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_items: newTabs });\n }\n },\n [onTabsChange, tabKey, providerTabConfig],\n );\n\n const updateTabConfig = useCallback(\n (config: TabOptionConfig) => {\n setSavedTabOptionConfig(config);\n onTabConfigChange?.(config);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_options: config });\n }\n },\n [onTabConfigChange, tabKey, providerTabConfig],\n );\n\n const calculateIconWidth = (item: Tab<T>): number => (item.is_pinned ? 32 : 0);\n\n const calculateVisibleTabs = useCallback(\n (clientWidth: number) => {\n if (!clientWidth) return;\n const tabOptionsWidth = draggable ? 30 : 0;\n const moreWidth = showCounts ? 190 : 84;\n const tabGap = size === 'sm' ? 4 : 8;\n const basePadding = 32;\n let tabWidth = 0;\n let activeTabWidth = 0;\n let newVisibleTabCounts = 0;\n const availableWidth = clientWidth - (rightSection?.width || 0) - tabOptionsWidth;\n const currentCount = visibleTabCountsRef.current;\n const hasOverflow = currentCount < sortedVisibleTabs.length;\n const hasHidden = hiddenTabs.length > 0;\n\n for (let index = 0; index < sortedVisibleTabs.length; index++) {\n const item = sortedVisibleTabs[index];\n\n const suffixText = suffixRecord?.[item.name] ? String(suffixRecord?.[item.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n\n const tabTitleWidth = measureText(item?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n\n const iconWidth = allowPin ? calculateIconWidth(item) : 0;\n const currentTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n\n if (item.name === activeTab) {\n activeTabWidth = currentTabWidth;\n }\n\n tabWidth += currentTabWidth;\n\n if (\n availableWidth >\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0) + index * 25\n ) {\n newVisibleTabCounts = index + 1;\n } else {\n break;\n }\n }\n\n const remainingVisibleTabs = sortedVisibleTabs.length - newVisibleTabCounts;\n const totalRemainingTabs = remainingVisibleTabs + hiddenTabs.length;\n\n if (\n totalRemainingTabs === 1 &&\n hiddenTabs.length === 0 &&\n remainingVisibleTabs === 1 &&\n newVisibleTabCounts < sortedVisibleTabs.length\n ) {\n const lastTab = sortedVisibleTabs[newVisibleTabCounts];\n if (lastTab) {\n const suffixText = suffixRecord?.[lastTab.name] ? String(suffixRecord?.[lastTab.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n const tabTitleWidth = measureText(lastTab?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n const iconWidth = allowPin ? calculateIconWidth(lastTab) : 0;\n const lastTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n if (availableWidth >= tabWidth + lastTabWidth) {\n newVisibleTabCounts += 1;\n }\n }\n }\n\n const newVisibleSlice = showAllItems ? sortedVisibleTabs.length : newVisibleTabCounts;\n const activeInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= newVisibleSlice;\n\n if (activeInsideMore) {\n tabWidth += activeTabWidth;\n if (\n availableWidth <\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0)\n ) {\n newVisibleTabCounts = Math.max(newVisibleTabCounts - 1, 0);\n }\n }\n\n if (newVisibleTabCounts !== currentCount) {\n setVisibleTabCounts(newVisibleTabCounts);\n }\n },\n [\n sortedVisibleTabs,\n showCounts,\n showAllItems,\n allowPin,\n suffixRecord,\n rightSection?.width,\n activeTab,\n size,\n draggable,\n hiddenTabs.length,\n measureText,\n ],\n );\n\n // ── Search params helper (uses provider abstraction when available) ──\n const getCurrentSearchParams = useCallback(\n () => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n if (linkConfig && providerTabConfig?.getSearchParam) {\n const params = new URLSearchParams();\n const currentValue = providerTabConfig.getSearchParam(linkConfig.key);\n if (currentValue) params.set(linkConfig.key, currentValue);\n return params;\n }\n return new URLSearchParams();\n },\n [linkConfig, providerTabConfig],\n );\n\n const applyTabToSearchParams = useCallback(\n (params: URLSearchParams, tabName: string) => {\n if (!linkConfig) return params;\n if (tabName === linkConfig.defaultLink) {\n params.delete(linkConfig.key);\n } else {\n params.set(linkConfig.key, tabName);\n }\n linkConfig.onResolve?.(params);\n return params;\n },\n [linkConfig],\n );\n\n // ── Link href resolution ──\n const resolveTabHref = useCallback(\n (tabName: string): string | undefined => {\n if (!linkConfig) return undefined;\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n return `?${params.toString()}`;\n },\n [applyTabToSearchParams, getCurrentSearchParams, linkConfig],\n );\n\n // ── Copy link ──\n const showCopyLink = copyLink || Boolean(linkConfig);\n\n const handleCopyLink = useCallback(\n async (tabName: T) => {\n const search = resolveTabHref(tabName);\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n const pathname = typeof window !== 'undefined' ? window.location.pathname : '';\n const href = search\n ? `${origin}${pathname}${search}`\n : `${origin}${pathname}`;\n await navigator.clipboard.writeText(href);\n toast.success(t(\"Link copied to clipboard\"), {\n toastId: 'Link copied to clipboard',\n });\n onCopyLink?.(tabName, href);\n },\n [resolveTabHref, t, onCopyLink],\n );\n\n // ── Tab actions ──\n const handleSelectTab = (tabName: T) => {\n setShowMoreDropdown(false);\n onTabClick?.(tabName);\n if (linkConfig && providerTabConfig?.navigate) {\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n providerTabConfig.navigate(`?${params.toString()}`);\n }\n };\n\n const hideTab = (tabName: T) => {\n if (sortedVisibleTabs.length <= 1) return;\n\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: true } : item,\n );\n\n const visibleIndex = sortedVisibleTabs.findIndex((item) => item.name === tabName);\n const nextIndex = visibleIndex === 0 ? 1 : visibleIndex - 1;\n handleSelectTab(sortedVisibleTabs[nextIndex].name);\n\n updateTabs(_tabs);\n };\n\n const unhideTab = (tabName: T) => {\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: false } : item,\n );\n\n setShowMoreDropdown(false);\n updateTabs(_tabs);\n };\n\n const togglePinTab = (tabName: T) => {\n if (!allowPin) return;\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_pinned: !item.is_pinned } : item,\n );\n updateTabs(_tabs);\n };\n\n const moveTab = (tabName: T, direction: 'left' | 'right') => {\n const oldIndex = allTabs.findIndex(({ name }) => name === tabName);\n const newIndex =\n direction === 'left'\n ? oldIndex - (allTabs[oldIndex - 1]?.name === activeTab ? 2 : 1)\n : oldIndex + 1;\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n };\n\n const handleShowMoreDropdown = () => setShowMoreDropdown(!showMoreDropdown);\n\n // ── Drag handlers ──\n const handleDragStart = (event: DragStartEvent) => setDraggingTab(event.active.id as string);\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (over?.id === 'more-tabs') {\n hideTab(active.id as T);\n setDraggingTab(null);\n setDraggingOver(null);\n return;\n }\n const oldIndex = allTabs.findIndex(({ name }) => name === active.id);\n const newIndex = allTabs.findIndex(({ name }) => name === over?.id);\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragCancel = () => {\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragOver = (event: DragOverEvent) => {\n setDraggingOver(event.over?.id === 'more-tabs' ? 'more-tabs' : null);\n };\n\n const handleTabSort = () => {\n // Sorting is handled via sortedTabs effect — no direct allTabs mutation\n };\n\n const handleSearchFilterChange = (\n searchValue: string,\n filterType: 'contains' | 'does-not-contain',\n ) => {\n setTabSearchFilter(searchValue);\n setTabSearchFilterType(filterType);\n };\n\n // ── Tab context menu options ──\n const getTabOptions = (title: T, isHidden = false, isSoftHidden = false) => {\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = tab?.is_pinned;\n\n const options = [\n {\n label: (\n <OptionButton\n icon={<ArrowOutwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Select Tab\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.SELECT,\n onClick: () => handleSelectTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowUpwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Up\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_LEFT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'left'),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowDownwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Down\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_RIGHT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'right'),\n },\n {\n label: (\n <OptionButton\n icon={<ContentCopyIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Copy Link\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.COPY_LINK,\n onClick: () => handleCopyLink(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityOffIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Hide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.HIDE,\n onClick: () => hideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Unhide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.UNHIDE,\n onClick: () => unhideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={isPinned ? <UnpinFilledIcon size={20} className='rotate-12 text-inherit dark:text-inherit'/> : <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />}\n text={isPinned ? t(\"Unpin\") : t(\"Pin\")}\n className=\"text-black-900 dark:text-white\"\n notVisible={!allowPin}\n />\n ),\n key: isPinned ? ACTIONS.UNPIN : ACTIONS.PIN,\n onClick: () => togglePinTab(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-black-900 dark:text-white\"\n icon={<EditIcon />}\n text={t('Edit')}\n notVisible={!onEdit}\n />\n ),\n key: ACTIONS.EDIT,\n onClick: () => onEdit?.(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-error-600 dark:text-error-600\"\n icon={<DeleteIcon size={18} className='text-error-600 dark:text-error-600' />}\n text={t(\"Delete\")}\n notVisible={!onDelete}\n />\n ),\n key: ACTIONS.DELETE,\n onClick: () => onDelete?.(title),\n },\n ];\n\n const hiddenFilter: string[] = [ACTIONS.HIDE, ACTIONS.UNHIDE];\n const defaultFilter: string[] = [ACTIONS.SELECT, ACTIONS.MOVE_LEFT, ACTIONS.MOVE_RIGHT, ACTIONS.UNHIDE];\n\n return options\n .filter((item) =>\n isHidden\n ? item.key === ACTIONS.UNHIDE\n : isSoftHidden\n ? !hiddenFilter.includes(item.key)\n : !defaultFilter.includes(item.key),\n )\n .filter((item) => (showCopyLink ? true : item.key !== ACTIONS.COPY_LINK))\n .filter((item) => (sortedVisibleTabs.length === 1 ? item.key !== ACTIONS.HIDE : true));\n };\n\n // ── Class maps ──\n const getClasses = (\n classType: 'classValue' | 'selectedClassValue' | 'textClassValue',\n isSelected: boolean,\n ) => {\n const classes = {\n classValue: {\n default: classNames('relative inline-flex pt-2 pb-3 px-2 pl-3 sm:px-2 rounded-t-sm group'),\n secondary: classNames(\n 'flex w-full sm:w-auto relative rounded-lg font-sans font-semibold text-center cursor-pointer uppercase',\n size === 'sm' ? 'py-1 px-3 text-sm' : 'py-2 px-4 text-base',\n ),\n },\n selectedClassValue: {\n default: classNames('absolute left-0 bottom-0 w-full h-[3px] bg-primary-600'),\n secondary: classNames('absolute inset-0 bg-primary-50 dark:bg-primary-975 rounded-lg'),\n },\n textClassValue: {\n default: classNames(\n 'relative uppercase font-sans font-semibold text-sm whitespace-nowrap',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 hover:text-neutral-500 dark:text-neutral-100 dark:hover:text-white',\n ),\n secondary: classNames(\n 'relative whitespace-nowrap text-sm',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 dark:text-neutral-400',\n ),\n },\n };\n return classes[classType][variant as 'default' | 'secondary'];\n };\n\n // ── Effects ──\n // ResizeObserver for responsive overflow\n useEffect(() => {\n if (!tabsRef.current || variant === 'switch') return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const containerWidth = entries[0].contentRect.width;\n calculateVisibleTabs(containerWidth);\n });\n\n resizeObserver.observe(tabsRef.current);\n calculateVisibleTabs(tabsRef.current.clientWidth);\n\n return () => resizeObserver.disconnect();\n }, [calculateVisibleTabs, variant]);\n\n // Stable stringified keys to avoid re-init when prop references change but values don't\n const tabsKey = JSON.stringify(tabs);\n const initialTabsKey = JSON.stringify(initialTabs?.map(({ name }) => name));\n\n // Initialize allTabs from props or initialTabs\n useEffect(() => {\n if (initialTabs?.length) {\n let _tabs = [...initialTabs];\n tabs.forEach((tab) => {\n if (!_tabs.find((item) => item.name === tab)) {\n _tabs.push({ name: tab, is_default: false, is_hidden: false, is_pinned: false });\n }\n });\n _tabs = _tabs.filter(\n (item, index, self) =>\n tabs.includes(item.name) && index === self.findIndex((_t) => _t.name === item.name),\n );\n setAllTabs(_tabs);\n } else {\n setAllTabs(\n tabs\n .map((item) => ({ name: item, is_default: false, is_hidden: false, is_pinned: false }))\n .filter((item, index, self) => index === self.findIndex((_t) => _t.name === item.name)),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tabsKey, initialTabsKey]);\n\n // Sync tabConfig prop\n useEffect(() => {\n if (tabConfig) {\n setSavedTabOptionConfig(tabConfig);\n }\n }, [tabConfig]);\n\n // Sort tabs\n useEffect(() => {\n if (!allTabs.length) return;\n const _sortedTabs = [...allTabs];\n if (sortOrder === 'asc') {\n _sortedTabs.sort((a, b) => a.name.localeCompare(b.name));\n } else if (sortOrder === 'desc') {\n _sortedTabs.sort((a, b) => b.name.localeCompare(a.name));\n }\n setSortedTabs(_sortedTabs);\n }, [allTabs, sortOrder]);\n\n // Focus first menu item when More dropdown opens\n useEffect(() => {\n handleDropdownOpen(showMoreDropdown);\n }, [showMoreDropdown]);\n\n // ── Variant: switch ──\n if (variant === 'switch') {\n return (\n <div className={classNames('inline', className)}>\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'inline-flex grow-0 p-1 rounded-lg',\n color === 'dark'\n ? 'border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800'\n : 'bg-neutral-100 dark:bg-black-700',\n fullWidth ? 'w-full' : 'w-auto',\n )}\n >\n {tabs.map((title: T) => {\n const isSelected = activeTab === title;\n const icon = tabIcons?.[title];\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = allowPin && tab?.is_pinned;\n\n return (\n <li key={title} role=\"presentation\" className={classNames('inline-flex', fullWidth ? 'w-full' : 'w-auto')}>\n <TabSwitch\n title={title}\n showCounts={showCounts}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n icon={\n isPinned ? (\n <Tooltip title=\"Unpin\">\n <span onClick={() => togglePinTab(title)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n icon\n )\n }\n iconsOnly={iconsOnly}\n classValue={classNames(\n 'relative py-0.5 border-gray-200',\n height,\n fullWidth ? 'w-full flex items-center justify-center' : 'px-2',\n )}\n selectedClassValue={classNames(\n 'absolute inset-0 rounded-md z-0',\n color === 'dark' ? 'bg-neutral-900' : 'bg-white dark:bg-black-800',\n )}\n textClassValue={classNames(\n 'relative text-xs font-semibold font-sans whitespace-nowrap',\n isSelected\n ? 'text-neutral-900 dark:text-neutral-100'\n : 'text-neutral-700 dark:text-neutral-100',\n )}\n isSelected={isSelected}\n href={resolveTabHref(title)}\n onClick={!isDisabled ? () => handleSelectTab(title) : undefined}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n color={color}\n disableAnimation={disableAnimation}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n }\n\n // ── Variant: default / secondary ──\n return (\n <div\n ref={tabsRef}\n className={classNames(fitContentWidth ? 'w-fit' : 'w-full')}\n onMouseEnter={() => setIsHoveringTabOptions(true)}\n onMouseLeave={() => setIsHoveringTabOptions(false)}\n >\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n collisionDetection={closestCenter}\n onDragOver={handleDragOver}\n >\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'flex items-center w-full',\n className,\n isFullWidth ? 'gap-0' : size === 'sm' ? 'gap-1' : 'gap-2',\n )}\n ref={ulRef}\n >\n {isLoading ? (\n <div className=\"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded\" />\n ) : (\n <SortableContext\n items={sortedVisibleTabs.map(({ name }) => name)}\n strategy={horizontalListSortingStrategy}\n id=\"sortable\"\n disabled={!draggable || lockOrder}\n >\n {sortedVisibleTabs.slice(0, visibleTabSlice).map(({ name, is_pinned }) => {\n const isSelected = activeTab === name && !showMoreDropdown;\n const isPinned = allowPin && is_pinned;\n\n return (\n <SortableTab\n key={name}\n title={name}\n isDragging={draggingTab === name}\n className={isFullWidth ? 'flex-1 flex justify-center' : ''}\n >\n <li key={name} role=\"presentation\" className={classNames(isFullWidth ? 'w-full flex' : 'sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={name}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n classValue={classNames(\n getClasses('classValue', isSelected),\n isFullWidth ? 'w-full justify-center' : '',\n )}\n selectedClassValue={getClasses('selectedClassValue', isSelected)}\n textClassValue={getClasses('textClassValue', isSelected)}\n isSelected={isSelected}\n tabOptions={\n isSelected && draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(name as T),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <IconButton\n tooltip={t(\"More\")}\n variant=\"ghost\"\n className=\"!text-primary-500 hover:!bg-primary-100 dark:hover:!bg-primary-900\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} />\n </IconButton>\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === name}\n href={resolveTabHref(name)}\n onClick={() => handleSelectTab(name as T)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n isPinned ? (\n <Tooltip title={t(\"Unpin\")}>\n <span onClick={() => togglePinTab(name as T)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[name] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n );\n })}\n\n {/* Active tab pulled from overflow */}\n {activeTab && isActiveTabInsideMore ? (\n <SortableTab key={activeTab} title={activeTab} isDragging={draggingTab === activeTab}>\n <li key={activeTab} role=\"presentation\" className={classNames('sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={activeTab}\n role=\"tab\"\n ariaSelected={true}\n tabIndex={0}\n classValue={getClasses('classValue', true)}\n selectedClassValue={getClasses('selectedClassValue', true)}\n textClassValue={getClasses('textClassValue', true)}\n isSelected={true}\n tabOptions={\n draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(activeTab),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} className=\"text-primary-600\" />\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === activeTab}\n href={resolveTabHref(activeTab)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n allowPin && allTabs.find((tab) => tab.name === activeTab)?.is_pinned ? (\n <Tooltip title={t(\"Pinned\")}>\n <span onClick={() => togglePinTab(activeTab)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[activeTab] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n ) : null}\n\n {/* More dropdown */}\n {((visibleTabCounts < sortedVisibleTabs.length && !showAllItems) ||\n hiddenTabs.length > 0) &&\n moreButtonTabCounts > 0 ? (\n <DropableWrapper id=\"more-tabs\">\n <Dropdown\n overlayStyle={{\n maxHeight: 'calc(100vh - 350px)',\n overflow: 'auto',\n marginTop: '8px',\n scrollbarWidth: 'none',\n borderRadius: 8,\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)',\n }}\n onOpenChange={() => handleShowMoreDropdown()}\n open={showMoreDropdown}\n menu={{\n items: [\n {\n key: 'Search',\n disabled: true,\n style: { minWidth: '190px', marginBottom: '8px' },\n label: (\n <div className=\"px-2 bg-white dark:bg-black-800\">\n <SearchBar\n id=\"search-bar-more-tabs\"\n value={search}\n classValues=\"!rounded-lg\"\n onChange={(e) => setSearch(e)}\n />\n </div>\n ),\n },\n ...sortedVisibleTabs\n .slice(visibleTabSlice)\n .filter((item) => item.name !== activeTab)\n .concat(hiddenTabs)\n .filter(\n ({ name }) =>\n typeof name === 'string' &&\n (name ?? '').toLowerCase().includes(search.toLowerCase()),\n )\n .map(({ name, is_hidden }) => ({\n key: name,\n label: (\n <OptionButton\n className={classNames(\n 'uppercase',\n is_hidden\n ? 'text-neutral-400 dark:text-neutral-500'\n : 'text-black-900 dark:text-black-200',\n )}\n text={name}\n suffixRecord={showCounts ? suffixRecord : {}}\n highlight={search}\n truncateText={true}\n isDisabled={is_hidden}\n onClick={is_hidden ? undefined : () => {\n handleSelectTab(name as T);\n setShowMoreDropdown(false);\n }}\n />\n ),\n popupClassName: TAB_MENU_CLASS,\n children: showMoreDropdown ? getTabOptions(name as T, is_hidden, true) : null,\n })),\n ],\n className: TAB_MENU_CLASS,\n }}\n openClassName=\"max-h-[350px] overflow-y-auto\"\n trigger={['click']}\n overlayClassName=\"row-option-cell\"\n placement=\"bottomRight\"\n getPopupContainer={(trigger) => trigger.parentElement as HTMLElement}\n >\n <MoreButton\n title={`${showCounts ? moreButtonTabCounts : ''} ${showCounts ? '' : ''}MORE...`}\n variant={variant}\n size={size}\n draggingOver={draggingOver}\n suffixRecord={suffixRecord}\n handleShowMoreDropdown={handleShowMoreDropdown}\n selectedId={selectedId}\n showMoreDropdown={showMoreDropdown}\n />\n </Dropdown>\n </DropableWrapper>\n ) : null}\n </SortableContext>\n )}\n {rightSection ? (\n <div className={classNames(rightSection?.className)}>\n <li>{rightSection.component}</li>\n </div>\n ) : null}\n {draggable && showTabOptions && (\n <li\n className={classNames(\n isHoveringTabOptions ? 'opacity-100' : 'opacity-0',\n 'transition-opacity duration-300',\n )}\n >\n <TabOptions\n hasSuffixRecord={Boolean(\n suffixRecord && Object.keys(suffixRecord).length > 0,\n )}\n savedConfig={savedTabOptionConfig}\n onApplyFilter={(config) => updateTabConfig(config)}\n setUnsavedChanges={() => {\n /* handled by onTabsChange / onTabConfigChange */\n }}\n handleTabSort={handleTabSort}\n onSearchChange={handleSearchFilterChange}\n />\n </li>\n )}\n </ul>\n {draggingTab ? (\n <TabDragOverlay\n draggingTab={draggingTab}\n suffixRecord={suffixRecord}\n size={size}\n variant={variant}\n selectedId={selectedId}\n parentContainer={parentContainer}\n />\n ) : null}\n </DndContext>\n </div>\n );\n};\n"],"names":["randomHex","TAB_MENU_CLASS","dropdownTrigger","handleDropdownOpen","open","ACTIONS","Tabs","variant","tabs","activeTab","onTabClick","suffixRecordProp","isLoading","size","className","draggable","showAllItems","copyLink","isDisabled","color","iconsOnly","tabIcons","height","fullWidth","fitContentWidth","disableAnimation","onEdit","onDelete","onCopyLink","allowPin","isFullWidth","rightSection","initialTabsProp","tabConfigProp","onTabConfigChange","onTabsChange","parentContainer","tabKey","linkConfig","showTabOptions","providerTabConfig","useTabConfig","providerSettings","initialTabs","tabConfig","search","setSearch","useState","showMoreDropdown","setShowMoreDropdown","visibleTabCounts","setVisibleTabCounts","allTabs","setAllTabs","sortedTabs","setSortedTabs","draggingOver","setDraggingOver","draggingTab","setDraggingTab","isHoveringTabOptions","setIsHoveringTabOptions","savedTabOptionConfig","setSavedTabOptionConfig","INITIAL_TAB_OPTION_CONFIG","tabSearchFilter","setTabSearchFilter","tabSearchFilterType","setTabSearchFilterType","showCounts","lockOrder","sortOrder","t","useTranslation","tabsRef","useRef","ulRef","visibleTabCountsRef","measureText","useTextWidth","selectedId","useMemo","sensors","useSensors","useSensor","MouseSensor","TouchSensor","suffixRecord","name","value","formatCount","visibleTabs","is_hidden","hiddenTabs","filteredVisibleTabs","tabName","searchValue","sortedVisibleTabs","a","b","isTabOverflow","visibleTabSlice","isActiveTabInsideMore","item","moreButtonTabCounts","updateTabs","useCallback","newTabs","updateTabConfig","config","calculateIconWidth","calculateVisibleTabs","clientWidth","tabOptionsWidth","moreWidth","tabGap","basePadding","tabWidth","activeTabWidth","newVisibleTabCounts","availableWidth","currentCount","hasOverflow","hasHidden","index","suffixText","suffixWidth","tabTitleWidth","iconWidth","currentTabWidth","remainingVisibleTabs","lastTab","lastTabWidth","newVisibleSlice","getCurrentSearchParams","params","currentValue","applyTabToSearchParams","resolveTabHref","showCopyLink","handleCopyLink","origin","pathname","href","toast","handleSelectTab","hideTab","_tabs","visibleIndex","nextIndex","unhideTab","togglePinTab","moveTab","direction","oldIndex","newIndex","arrayMove","handleShowMoreDropdown","handleDragStart","event","handleDragEnd","active","over","handleDragCancel","handleDragOver","handleTabSort","handleSearchFilterChange","filterType","getTabOptions","title","isHidden","isSoftHidden","isPinned","_t","options","jsx","OptionButton","ArrowOutwardIcon","ArrowUpwardIcon","ArrowDownwardIcon","ContentCopyIcon","VisibilityOffIcon","VisibilityIcon","UnpinFilledIcon","PinIcon","EditIcon","DeleteIcon","hiddenFilter","defaultFilter","getClasses","classType","isSelected","classNames","useEffect","resizeObserver","entries","containerWidth","tabsKey","initialTabsKey","tab","self","_sortedTabs","icon","TabSwitch","Tooltip","jsxs","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","is_pinned","SortableTab","Dropdown","IconButton","MoreHorizOutlinedIcon","DropableWrapper","SearchBar","trigger","MoreButton","TabOptions","TabDragOverlay"],"mappings":"0iCAgCMA,GAAY,IAAM,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,EAExDC,GAAiB,CACrB,4CACA,qDACA,wEACA,kFACA,4EACA,mFACA,iFACA,2FACA,qFACA,2FACF,EAAE,KAAK,GAAG,EAEV,IAAIC,GAAsC,KAE1C,MAAMC,GAAsBC,GAAkB,CACxCA,GACFF,GAAkB,SAAS,cAC3B,WAAW,IAAM,CACF,SAAS,cACpB,mIAAA,GAEI,MAAA,CACR,EAAG,EAAE,GAEL,WAAW,IAAM,CACfA,IAAiB,MAAA,EACjBA,GAAkB,IACpB,EAAG,CAAC,CAER,EAEMG,EAAU,CACd,OAAQ,SACR,UAAW,WACX,WAAY,YACZ,KAAM,OACN,OAAQ,SACR,UAAW,WACX,OAAQ,SACR,IAAK,MACL,MAAO,QACP,KAAM,MACR,EAEaC,GAAO,CAAmB,CACrC,QAAAC,EAAU,UACV,KAAAC,EAAO,CAAA,EACP,UAAAC,EACA,WAAAC,GACA,aAAcC,EACd,UAAAC,GACA,KAAAC,EAAO,KACP,UAAAC,GACA,UAAAC,EAAY,GACZ,aAAAC,EAAe,GACf,SAAAC,GAAW,GACX,WAAAC,GAAa,GACb,MAAAC,GAAQ,QACR,UAAAC,GAAY,GACZ,SAAAC,GAAW,CAAA,EACX,OAAAC,GAAS,MACT,UAAAC,GAAY,GACZ,gBAAAC,GAAkB,GAClB,iBAAAC,GAAmB,GACnB,OAAAC,GACA,SAAAC,GACA,WAAAC,GACA,SAAAC,EAAW,GACX,YAAAC,EAAc,GACd,aAAAC,EACA,YAAaC,GACb,UAAWC,GACX,kBAAAC,GACA,aAAAC,GACA,gBAAAC,GAAkB,SAAS,KAC3B,OAAAC,EACA,WAAAC,EACA,eAAAC,GAAiB,EACnB,IAAoB,CAElB,MAAMC,EAAoBC,GAAAA,aAAA,EACpBC,GAAmBL,EAASG,GAAmB,eAAeH,CAAM,EAAI,OAGxEM,GAAcX,IAAoBU,IAAkB,UACpDE,EAAYX,IAAiBS,IAAkB,YAE/C,CAACG,GAAQC,EAAS,EAAIC,EAAAA,SAAS,EAAE,EACjC,CAACC,EAAkBC,CAAmB,EAAIF,EAAAA,SAAS,EAAK,EACxD,CAACG,EAAkBC,EAAmB,EAAIJ,EAAAA,SAAS,CAAC,EACpD,CAACK,EAASC,EAAU,EAAIN,EAAAA,SAAmB,CAAA,CAAE,EAC7C,CAACO,EAAYC,EAAa,EAAIR,EAAAA,SAAmB,CAAA,CAAE,EACnD,CAACS,GAAcC,CAAe,EAAIV,EAAAA,SAAwB,IAAI,EAC9D,CAACW,EAAaC,CAAc,EAAIZ,EAAAA,SAAwB,IAAI,EAC5D,CAACa,GAAsBC,EAAuB,EAAId,EAAAA,SAAS,EAAK,EAChE,CAACe,GAAsBC,EAAuB,EAAIhB,EAAAA,SACtDH,GAAaoB,GAAAA,yBAAA,EAET,CAACC,GAAiBC,EAAkB,EAAInB,EAAAA,SAAS,EAAE,EACnD,CAACoB,GAAqBC,EAAsB,EAAIrB,EAAAA,SAA0C,UAAU,EAEpG,CAAE,WAAAsB,EAAY,UAAAC,EAAW,UAAAC,EAAA,EAAcT,GAGvC,CAAE,EAAAU,CAAA,EAAMC,kBAAA,EACRC,EAAUC,EAAAA,OAA8B,IAAI,EAC5CC,GAAQD,EAAAA,OAAgC,IAAI,EAC5CE,GAAsBF,EAAAA,OAAOzB,CAAgB,EAC7C,CAAE,YAAA4B,CAAA,EAAgBC,gBAAA,EAClBC,EAAaC,EAAAA,QAAQ,IAAMjF,GAAA,EAAa,CAAA,CAAE,EAE1CkF,GAAUC,EAAAA,WACdC,EAAAA,UAAUC,EAAAA,YAAa,CAAE,qBAAsB,CAAE,SAAU,CAAA,EAAK,EAChED,YAAUE,EAAAA,YAAa,CAAE,qBAAsB,CAAE,MAAO,IAAK,UAAW,EAAE,CAAG,CAAA,EAMzEC,EAAeN,EAAAA,QAAQ,IACtBtE,GACE,OAAO,YACZ,OAAO,QAAQA,CAAgB,EAAE,IAAI,CAAC,CAAC6E,EAAMC,CAAK,IAAM,CACtDD,EACAE,GAAAA,YAAYD,CAAwB,CAAA,CACrC,CAAA,EAEF,CAAC9E,CAAgB,CAAC,EAEfgF,GAAcV,EAAAA,QAAQ,IAAM3B,EAAW,OAAO,CAAC,CAAE,UAAAsC,CAAA,IAAgB,CAACA,CAAS,EAAG,CAACtC,CAAU,CAAC,EAC1FuC,EAAaZ,EAAAA,QAAQ,IAAM3B,EAAW,OAAO,CAAC,CAAE,UAAAsC,KAAgBA,CAAS,EAAG,CAACtC,CAAU,CAAC,EAExFwC,GAAsBb,EAAAA,QAC1B,IACEU,GAAY,OAAO,CAAC,CAAE,KAAAH,KAAW,CAC/B,GAAI,CAACvB,GAAiB,MAAO,GAC7B,MAAM8B,GAAWP,GAAQ,IAAI,YAAA,EACvBQ,EAAc/B,GAAgB,YAAA,EACpC,OAAOE,KAAwB,WAC3B4B,EAAQ,SAASC,CAAW,EAC5B,CAACD,EAAQ,SAASC,CAAW,CACnC,CAAC,EACH,CAACL,GAAa1B,GAAiBE,EAAmB,CAAA,EAG9C8B,EAAoBhB,EAAAA,QACxB,IACE,CAAC,GAAGa,EAAmB,EAAE,KAAK,CAACI,EAAGC,IAC5BD,EAAE,WAAa,CAACC,EAAE,UAAkB,GACpC,CAACD,EAAE,WAAaC,EAAE,UAAkB,EACjC,CACR,EACH,CAACL,EAAmB,CAAA,EAGhBM,GAAgBlD,EAAmB+C,EAAkB,OACrDI,EAAkBrF,EACpBiF,EAAkB,OAClBG,GACElD,EACA+C,EAAkB,OAClBK,GACJL,EAAkB,UAAWM,GAASA,EAAK,OAAS9F,CAAS,GAAK4F,EAC9DG,GACJpD,EAAQ,OAASiD,GAAmBC,GAAwB,EAAI,GAElEzB,GAAoB,QAAU3B,EAG9B,MAAMuD,EAAaC,EAAAA,YAChBC,GAAsB,CACrBtD,GAAWsD,CAAO,EAClBxE,KAAewE,CAAO,EAClBtE,GAAUG,GAAmB,oBAC/BA,EAAkB,mBAAmB,CAAE,SAAUH,EAAQ,UAAWsE,EAAS,CAEjF,EACA,CAACxE,GAAcE,EAAQG,CAAiB,CAAA,EAGpCoE,GAAkBF,EAAAA,YACrBG,GAA4B,CAC3B9C,GAAwB8C,CAAM,EAC9B3E,KAAoB2E,CAAM,EACtBxE,GAAUG,GAAmB,oBAC/BA,EAAkB,mBAAmB,CAAE,SAAUH,EAAQ,YAAawE,EAAQ,CAElF,EACA,CAAC3E,GAAmBG,EAAQG,CAAiB,CAAA,EAGzCsE,GAAsBP,GAA0BA,EAAK,UAAY,GAAK,EAEtEQ,GAAuBL,EAAAA,YAC1BM,GAAwB,CACvB,GAAI,CAACA,EAAa,OAClB,MAAMC,EAAkBlG,EAAY,GAAK,EACnCmG,EAAY7C,EAAa,IAAM,GAC/B8C,EAAStG,IAAS,KAAO,EAAI,EAC7BuG,EAAc,GACpB,IAAIC,EAAW,EACXC,GAAiB,EACjBC,EAAsB,EAC1B,MAAMC,EAAiBR,GAAejF,GAAc,OAAS,GAAKkF,EAC5DQ,GAAe5C,GAAoB,QACnC6C,GAAcD,GAAexB,EAAkB,OAC/C0B,GAAY9B,EAAW,OAAS,EAEtC,QAAS+B,EAAQ,EAAGA,EAAQ3B,EAAkB,OAAQ2B,IAAS,CAC7D,MAAMrB,EAAON,EAAkB2B,CAAK,EAE9BC,GAAatC,IAAegB,EAAK,IAAI,EAAI,OAAOhB,IAAegB,EAAK,IAAI,CAAC,EAAI,GAC7EuB,GACJzD,GAAcwD,GACV/C,EAAY+C,GAAY,CACxB,SAAU,OACV,WAAY,MACZ,WAAY,6CAAA,CACb,EACD,GACA,EACE,EAEAE,GAAgBjD,EAAYyB,GAAM,MAAQ,GAAI,CAClD,SAAU,OACV,WAAY,MACZ,WAAY,6CAAA,CACb,EAEKyB,GAAYnG,EAAWiF,GAAmBP,CAAI,EAAI,EAClD0B,GAAkBF,GAAgBD,GAAcV,EAAcD,EAASa,GAQ7E,GANIzB,EAAK,OAAS9F,IAChB6G,GAAiBW,IAGnBZ,GAAYY,GAGVT,EACAH,GAAYK,IAAeC,GAAYT,EAAY,GAAKU,EAAQ,GAEhEL,EAAsBK,EAAQ,MAE9B,MAEJ,CAEA,MAAMM,GAAuBjC,EAAkB,OAASsB,EAGxD,GAF2BW,GAAuBrC,EAAW,SAGpC,GACvBA,EAAW,SAAW,GACtBqC,KAAyB,GACzBX,EAAsBtB,EAAkB,OACxC,CACA,MAAMkC,EAAUlC,EAAkBsB,CAAmB,EACrD,GAAIY,EAAS,CACX,MAAMN,EAAatC,IAAe4C,EAAQ,IAAI,EAAI,OAAO5C,IAAe4C,EAAQ,IAAI,CAAC,EAAI,GACnFL,GACJzD,GAAcwD,EACV/C,EAAY+C,EAAY,CACxB,SAAU,OACV,WAAY,MACZ,WAAY,6CAAA,CACb,EACD,GACA,EACE,EACAE,GAAgBjD,EAAYqD,GAAS,MAAQ,GAAI,CACrD,SAAU,OACV,WAAY,MACZ,WAAY,6CAAA,CACb,EACKH,GAAYnG,EAAWiF,GAAmBqB,CAAO,EAAI,EACrDC,GAAeL,GAAgBD,GAAcV,EAAcD,EAASa,GACtER,GAAkBH,EAAWe,KAC/Bb,GAAuB,EAE3B,CACF,CAEA,MAAMc,GAAkBrH,EAAeiF,EAAkB,OAASsB,EAEhEtB,EAAkB,UAAWM,GAASA,EAAK,OAAS9F,CAAS,GAAK4H,KAGlEhB,GAAYC,GAEVE,EACAH,GAAYK,IAAeC,GAAYT,EAAY,KAEnDK,EAAsB,KAAK,IAAIA,EAAsB,EAAG,CAAC,IAIzDA,IAAwBE,IAC1BtE,GAAoBoE,CAAmB,CAE3C,EACA,CACEtB,EACA5B,EACArD,EACAa,EACA0D,EACAxD,GAAc,MACdtB,EACAI,EACAE,EACA8E,EAAW,OACXf,CAAA,CACF,EAIIwD,GAAyB5B,EAAAA,YAC7B,IAAM,CACJ,GAAI,OAAO,OAAW,IACpB,OAAO,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAEnD,GAAIpE,GAAcE,GAAmB,eAAgB,CACnD,MAAM+F,EAAS,IAAI,gBACbC,EAAehG,EAAkB,eAAeF,EAAW,GAAG,EACpE,OAAIkG,GAAcD,EAAO,IAAIjG,EAAW,IAAKkG,CAAY,EAClDD,CACT,CACA,OAAO,IAAI,eACb,EACA,CAACjG,EAAYE,CAAiB,CAAA,EAG1BiG,GAAyB/B,EAAAA,YAC7B,CAAC6B,EAAyBxC,KACnBzD,IACDyD,IAAYzD,EAAW,YACzBiG,EAAO,OAAOjG,EAAW,GAAG,EAE5BiG,EAAO,IAAIjG,EAAW,IAAKyD,CAAO,EAEpCzD,EAAW,YAAYiG,CAAM,GACtBA,GAET,CAACjG,CAAU,CAAA,EAIPoG,EAAiBhC,EAAAA,YACpBX,GACMzD,EAEE,IADQmG,GAAuBH,GAAA,EAA0BvC,CAAO,EACrD,SAAA,CAAU,GAFX,OAInB,CAAC0C,GAAwBH,GAAwBhG,CAAU,CAAA,EAIvDqG,GAAe1H,IAAY,EAAQqB,EAEnCsG,GAAiBlC,EAAAA,YACrB,MAAOX,GAAe,CACpB,MAAMlD,EAAS6F,EAAe3C,CAAO,EAC/B8C,EAAS,OAAO,OAAW,IAAc,OAAO,SAAS,OAAS,GAClEC,EAAW,OAAO,OAAW,IAAc,OAAO,SAAS,SAAW,GACtEC,EAAOlG,EACT,GAAGgG,CAAM,GAAGC,CAAQ,GAAGjG,CAAM,GAC7B,GAAGgG,CAAM,GAAGC,CAAQ,GACxB,MAAM,UAAU,UAAU,UAAUC,CAAI,EACxCC,GAAAA,MAAM,QAAQxE,EAAE,0BAA0B,EAAG,CAC3C,QAAS,0BAAA,CACV,EACD5C,KAAamE,EAASgD,CAAI,CAC5B,EACA,CAACL,EAAgBlE,EAAG5C,EAAU,CAAA,EAI1BqH,EAAmBlD,GAAe,CAGtC,GAFA9C,EAAoB,EAAK,EACzBvC,KAAaqF,CAAO,EAChBzD,GAAcE,GAAmB,SAAU,CAC7C,MAAM+F,EAASE,GAAuBH,GAAA,EAA0BvC,CAAO,EACvEvD,EAAkB,SAAS,IAAI+F,EAAO,SAAA,CAAU,EAAE,CACpD,CACF,EAEMW,GAAWnD,GAAe,CAC9B,GAAIE,EAAkB,QAAU,EAAG,OAEnC,MAAMkD,EAAQ/F,EAAQ,IAAKmD,GACzBA,EAAK,OAASR,EAAU,CAAE,GAAGQ,EAAM,UAAW,IAASA,CAAA,EAGnD6C,EAAenD,EAAkB,UAAWM,GAASA,EAAK,OAASR,CAAO,EAC1EsD,EAAYD,IAAiB,EAAI,EAAIA,EAAe,EAC1DH,EAAgBhD,EAAkBoD,CAAS,EAAE,IAAI,EAEjD5C,EAAW0C,CAAK,CAClB,EAEMG,GAAavD,GAAe,CAChC,MAAMoD,EAAQ/F,EAAQ,IAAKmD,GACzBA,EAAK,OAASR,EAAU,CAAE,GAAGQ,EAAM,UAAW,IAAUA,CAAA,EAG1DtD,EAAoB,EAAK,EACzBwD,EAAW0C,CAAK,CAClB,EAEMI,EAAgBxD,GAAe,CACnC,GAAI,CAAClE,EAAU,OACf,MAAMsH,EAAQ/F,EAAQ,IAAKmD,GACzBA,EAAK,OAASR,EAAU,CAAE,GAAGQ,EAAM,UAAW,CAACA,EAAK,WAAcA,CAAA,EAEpEE,EAAW0C,CAAK,CAClB,EAEMK,GAAU,CAACzD,EAAY0D,IAAgC,CAC3D,MAAMC,EAAWtG,EAAQ,UAAU,CAAC,CAAE,KAAAoC,CAAA,IAAWA,IAASO,CAAO,EAC3D4D,EACJF,IAAc,OACVC,GAAYtG,EAAQsG,EAAW,CAAC,GAAG,OAASjJ,EAAY,EAAI,GAC5DiJ,EAAW,EACjBjD,EAAWmD,GAAAA,UAAUxG,EAASsG,EAAUC,CAAQ,CAAC,CACnD,EAEME,GAAyB,IAAM5G,EAAoB,CAACD,CAAgB,EAGpE8G,GAAmBC,GAA0BpG,EAAeoG,EAAM,OAAO,EAAY,EAErFC,GAAiBD,GAAwB,CAC7C,KAAM,CAAE,OAAAE,EAAQ,KAAAC,CAAA,EAASH,EACzB,GAAIG,GAAM,KAAO,YAAa,CAC5BhB,GAAQe,EAAO,EAAO,EACtBtG,EAAe,IAAI,EACnBF,EAAgB,IAAI,EACpB,MACF,CACA,MAAMiG,EAAWtG,EAAQ,UAAU,CAAC,CAAE,KAAAoC,KAAWA,IAASyE,EAAO,EAAE,EAC7DN,EAAWvG,EAAQ,UAAU,CAAC,CAAE,KAAAoC,KAAWA,IAAS0E,GAAM,EAAE,EAClEzD,EAAWmD,GAAAA,UAAUxG,EAASsG,EAAUC,CAAQ,CAAC,EACjDhG,EAAe,IAAI,EACnBF,EAAgB,IAAI,CACtB,EAEM0G,GAAmB,IAAM,CAC7BxG,EAAe,IAAI,EACnBF,EAAgB,IAAI,CACtB,EAEM2G,GAAkBL,GAAyB,CAC/CtG,EAAgBsG,EAAM,MAAM,KAAO,YAAc,YAAc,IAAI,CACrE,EAEMM,GAAgB,IAAM,CAE5B,EAEMC,GAA2B,CAC/BtE,EACAuE,IACG,CACHrG,GAAmB8B,CAAW,EAC9B5B,GAAuBmG,CAAU,CACnC,EAGMC,GAAgB,CAACC,EAAUC,EAAW,GAAOC,EAAe,KAAU,CAE1E,MAAMC,EADMxH,EAAQ,KAAMyH,GAAOA,EAAG,OAASJ,CAAK,GAC5B,UAEhBK,EAAU,CACd,CACE,MACEC,EAAAA,IAACC,EAAAA,aAAA,CACC,KAAMD,EAAAA,IAACE,mBAAA,CAAiB,KAAM,GAAI,UAAU,iCAAiC,EAC7E,KAAMzG,EAAE,YAAY,EACpB,UAAU,gCAAA,CAAA,EAGd,IAAKnE,EAAQ,OACb,QAAS,IAAM4I,EAAgBwB,CAAK,CAAA,EAEtC,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,KAAMD,EAAAA,IAACG,kBAAA,CAAgB,KAAM,GAAI,UAAU,iCAAiC,EAC5E,KAAM1G,EAAE,SAAS,EACjB,WAAYF,EACZ,UAAU,gCAAA,CAAA,EAGd,IAAKjE,EAAQ,UACb,SAAUiE,EACV,QAAS,IAAMkF,GAAQiB,EAAO,MAAM,CAAA,EAEtC,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,KAAMD,EAAAA,IAACI,oBAAA,CAAkB,KAAM,GAAI,UAAU,iCAAiC,EAC9E,KAAM3G,EAAE,WAAW,EACnB,WAAYF,EACZ,UAAU,gCAAA,CAAA,EAGd,IAAKjE,EAAQ,WACb,SAAUiE,EACV,QAAS,IAAMkF,GAAQiB,EAAO,OAAO,CAAA,EAEvC,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,KAAMD,EAAAA,IAACK,kBAAA,CAAgB,KAAM,GAAI,UAAU,iCAAiC,EAC5E,KAAM5G,EAAE,WAAW,EACnB,UAAU,gCAAA,CAAA,EAGd,IAAKnE,EAAQ,UACb,QAAS,IAAMuI,GAAe6B,CAAK,CAAA,EAErC,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,KAAMD,EAAAA,IAACM,oBAAA,CAAkB,KAAM,GAAI,UAAU,iCAAiC,EAC9E,KAAM7G,EAAE,MAAM,EACd,UAAU,gCAAA,CAAA,EAGd,IAAKnE,EAAQ,KACb,QAAS,IAAM6I,GAAQuB,CAAK,CAAA,EAE9B,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,KAAMD,EAAAA,IAACO,iBAAA,CAAe,KAAM,GAAI,UAAU,iCAAiC,EAC3E,KAAM9G,EAAE,QAAQ,EAChB,UAAU,gCAAA,CAAA,EAGd,IAAKnE,EAAQ,OACb,QAAS,IAAMiJ,GAAUmB,CAAK,CAAA,EAEhC,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,KAAMJ,EAAWG,MAACQ,EAAAA,gBAAA,CAAgB,KAAM,GAAI,UAAU,0CAAA,CAA0C,EAAKR,EAAAA,IAACS,EAAAA,QAAA,CAAQ,KAAM,GAAI,UAAU,2CAA2C,EAC7K,KAAiBhH,EAAXoG,EAAa,QAAa,KAAN,EAC1B,UAAU,iCACV,WAAY,CAAC/I,CAAA,CAAA,EAGjB,IAAK+I,EAAWvK,EAAQ,MAAQA,EAAQ,IACxC,QAAS,IAAMkJ,EAAakB,CAAK,CAAA,EAEnC,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,UAAU,iCACV,WAAOS,GAAAA,SAAA,EAAS,EAChB,KAAMjH,EAAE,MAAM,EACd,WAAY,CAAC9C,EAAA,CAAA,EAGjB,IAAKrB,EAAQ,KACb,QAAS,IAAMqB,KAAS+I,CAAK,CAAA,EAE/B,CACE,MACEM,EAAAA,IAACC,EAAAA,aAAA,CACC,UAAU,qCACV,KAAMD,EAAAA,IAACW,aAAA,CAAW,KAAM,GAAI,UAAU,qCAAqC,EAC3E,KAAMlH,EAAE,QAAQ,EAChB,WAAY,CAAC7C,EAAA,CAAA,EAGjB,IAAKtB,EAAQ,OACb,QAAS,IAAMsB,KAAW8I,CAAK,CAAA,CACjC,EAGIkB,GAAyB,CAACtL,EAAQ,KAAMA,EAAQ,MAAM,EACtDuL,EAA0B,CAACvL,EAAQ,OAAQA,EAAQ,UAAWA,EAAQ,WAAYA,EAAQ,MAAM,EAEtG,OAAOyK,EACJ,OAAQvE,GACPmE,EACInE,EAAK,MAAQlG,EAAQ,OACrBsK,EACE,CAACgB,GAAa,SAASpF,EAAK,GAAG,EAC/B,CAACqF,EAAc,SAASrF,EAAK,GAAG,CAAA,EAEvC,OAAQA,GAAUoC,GAAe,GAAOpC,EAAK,MAAQlG,EAAQ,SAAU,EACvE,OAAQkG,GAAUN,EAAkB,SAAW,EAAIM,EAAK,MAAQlG,EAAQ,KAAO,EAAK,CACzF,EAGMwL,EAAa,CACjBC,EACAC,KAEgB,CACd,WAAY,CACV,QAASC,EAAW,qEAAqE,EACzF,UAAWA,EACT,yGACAnL,IAAS,KAAO,oBAAsB,qBAAA,CACxC,EAEF,mBAAoB,CAClB,QAASmL,EAAW,wDAAwD,EAC5E,UAAWA,EAAW,+DAA+D,CAAA,EAEvF,eAAgB,CACd,QAASA,EACP,uEACAD,EACI,yCACA,qFAAA,EAEN,UAAWC,EACT,qCACAD,EACI,yCACA,wCAAA,CACN,CACF,GAEaD,CAAS,EAAEvL,CAAkC,EAK9D0L,EAAAA,UAAU,IAAM,CACd,GAAI,CAACvH,EAAQ,SAAWnE,IAAY,SAAU,OAE9C,MAAM2L,EAAiB,IAAI,eAAgBC,GAAY,CACrD,MAAMC,EAAiBD,EAAQ,CAAC,EAAE,YAAY,MAC9CpF,GAAqBqF,CAAc,CACrC,CAAC,EAED,OAAAF,EAAe,QAAQxH,EAAQ,OAAO,EACtCqC,GAAqBrC,EAAQ,QAAQ,WAAW,EAEzC,IAAMwH,EAAe,WAAA,CAC9B,EAAG,CAACnF,GAAsBxG,CAAO,CAAC,EAGlC,MAAM8L,GAAU,KAAK,UAAU7L,CAAI,EAC7B8L,GAAiB,KAAK,UAAU3J,IAAa,IAAI,CAAC,CAAE,KAAA6C,KAAWA,CAAI,CAAC,EAmD1E,OAhDAyG,EAAAA,UAAU,IAAM,CACd,GAAItJ,IAAa,OAAQ,CACvB,IAAIwG,EAAQ,CAAC,GAAGxG,EAAW,EAC3BnC,EAAK,QAAS+L,GAAQ,CACfpD,EAAM,KAAM5C,GAASA,EAAK,OAASgG,CAAG,GACzCpD,EAAM,KAAK,CAAE,KAAMoD,EAAK,WAAY,GAAO,UAAW,GAAO,UAAW,EAAA,CAAO,CAEnF,CAAC,EACDpD,EAAQA,EAAM,OACZ,CAAC5C,EAAMqB,EAAO4E,IACZhM,EAAK,SAAS+F,EAAK,IAAI,GAAKqB,IAAU4E,EAAK,UAAW3B,GAAOA,EAAG,OAAStE,EAAK,IAAI,CAAA,EAEtFlD,GAAW8F,CAAK,CAClB,MACE9F,GACE7C,EACG,IAAK+F,IAAU,CAAE,KAAMA,EAAM,WAAY,GAAO,UAAW,GAAO,UAAW,EAAA,EAAQ,EACrF,OAAO,CAACA,EAAMqB,EAAO4E,IAAS5E,IAAU4E,EAAK,UAAW3B,GAAOA,EAAG,OAAStE,EAAK,IAAI,CAAC,CAAA,CAI9F,EAAG,CAAC8F,GAASC,EAAc,CAAC,EAG5BL,EAAAA,UAAU,IAAM,CACVrJ,GACFmB,GAAwBnB,CAAS,CAErC,EAAG,CAACA,CAAS,CAAC,EAGdqJ,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC7I,EAAQ,OAAQ,OACrB,MAAMqJ,EAAc,CAAC,GAAGrJ,CAAO,EAC3BmB,KAAc,MAChBkI,EAAY,KAAK,CAACvG,EAAGC,IAAMD,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,EAC9C5B,KAAc,QACvBkI,EAAY,KAAK,CAACvG,EAAGC,IAAMA,EAAE,KAAK,cAAcD,EAAE,IAAI,CAAC,EAEzD3C,GAAckJ,CAAW,CAC3B,EAAG,CAACrJ,EAASmB,EAAS,CAAC,EAGvB0H,EAAAA,UAAU,IAAM,CACd9L,GAAmB6C,CAAgB,CACrC,EAAG,CAACA,CAAgB,CAAC,EAGjBzC,IAAY,eAEX,MAAA,CAAI,UAAWyL,EAAW,SAAUlL,EAAS,EAC5C,SAAAiK,EAAAA,IAAC,KAAA,CACC,KAAK,UACL,mBAAiB,aACjB,UAAWiB,EACT,oCACA7K,KAAU,OACN,yEACA,mCACJI,GAAY,SAAW,QAAA,EAGxB,SAAAf,EAAK,IAAKiK,GAAa,CACtB,MAAMsB,EAAatL,IAAcgK,EAC3BiC,EAAOrL,KAAWoJ,CAAK,EACvB8B,EAAMnJ,EAAQ,KAAMyH,GAAOA,EAAG,OAASJ,CAAK,EAC5CG,EAAW/I,GAAY0K,GAAK,UAElC,OACExB,EAAAA,IAAC,KAAA,CAAe,KAAK,eAAe,UAAWiB,EAAW,cAAezK,GAAY,SAAW,QAAQ,EACtG,SAAAwJ,EAAAA,IAAC4B,GAAAA,UAAA,CACC,MAAAlC,EACA,WAAApG,EACA,KAAK,MACL,aAAc0H,EACd,SAAU,EACV,KACEnB,EACEG,MAAC6B,GAAA,CAAQ,MAAM,QACb,SAAA7B,EAAAA,IAAC,QAAK,QAAS,IAAMxB,EAAakB,CAAK,EACrC,eAACe,EAAAA,QAAA,CAAQ,KAAM,GAAI,UAAU,0CAAA,CAA2C,EAC1E,CAAA,CACF,EAEAkB,EAGJ,UAAAtL,GACA,WAAY4K,EACV,kCACA1K,GACAC,GAAY,0CAA4C,MAAA,EAE1D,mBAAoByK,EAClB,kCACA7K,KAAU,OAAS,iBAAmB,4BAAA,EAExC,eAAgB6K,EACd,6DACAD,EACI,yCACA,wCAAA,EAEN,WAAAA,EACA,KAAMrD,EAAe+B,CAAK,EAC1B,QAAUvJ,GAA4C,OAA/B,IAAM+H,EAAgBwB,CAAK,EAClD,aAAAlF,EACA,WAAAP,EACA,MAAA7D,GACA,iBAAAM,EAAA,CAAA,GAxCKgJ,CA0CT,CAEJ,CAAC,CAAA,CAAA,EAEL,EAMFM,EAAAA,IAAC,MAAA,CACC,IAAKrG,EACL,UAAWsH,EAAWxK,GAAkB,QAAU,QAAQ,EAC1D,aAAc,IAAMqC,GAAwB,EAAI,EAChD,aAAc,IAAMA,GAAwB,EAAK,EAEjD,SAAAgJ,EAAAA,KAACC,EAAAA,WAAA,CACC,QAAA5H,GACA,UAAW8E,GACX,YAAaF,GACb,aAAcK,GACd,mBAAoB4C,EAAAA,cACpB,WAAY3C,GAEZ,SAAA,CAAAyC,EAAAA,KAAC,KAAA,CACC,KAAK,UACL,mBAAiB,aACjB,UAAWb,EACT,2BACAlL,GACAgB,EAAc,QAAUjB,IAAS,KAAO,QAAU,OAAA,EAEpD,IAAK+D,GAEJ,SAAA,CAAAhE,GACCmK,EAAAA,IAAC,MAAA,CAAI,UAAU,2FAAA,CAA4F,EAE3G8B,EAAAA,KAACG,GAAAA,gBAAA,CACC,MAAO/G,EAAkB,IAAI,CAAC,CAAE,KAAAT,CAAA,IAAWA,CAAI,EAC/C,SAAUyH,GAAAA,8BACV,GAAG,WACH,SAAU,CAAClM,GAAauD,EAEvB,SAAA,CAAA2B,EAAkB,MAAM,EAAGI,CAAe,EAAE,IAAI,CAAC,CAAE,KAAAb,EAAM,UAAA0H,KAAgB,CACxE,MAAMnB,EAAatL,IAAc+E,GAAQ,CAACxC,EACpC4H,EAAW/I,GAAYqL,EAE7B,OACEnC,EAAAA,IAACoC,GAAAA,YAAA,CAEC,MAAO3H,EACP,WAAY9B,IAAgB8B,EAC5B,UAAW1D,EAAc,6BAA+B,GAExD,SAAAiJ,EAAAA,IAAC,MAAc,KAAK,eAAe,UAAWiB,EAAWlK,EAAc,cAAgB,SAAS,EAC9F,SAAAiJ,EAAAA,IAAC4B,GAAAA,UAAA,CACC,WAAAtI,EACA,MAAOmB,EACP,KAAK,MACL,aAAcuG,EACd,SAAU,EACV,WAAYC,EACVH,EAAW,aAAcE,CAAU,EACnCjK,EAAc,wBAA0B,EAAA,EAE1C,mBAAoB+J,EAAW,qBAAsBE,CAAU,EAC/D,eAAgBF,EAAW,iBAAkBE,CAAU,EACvD,WAAAA,EACA,WACEA,GAAchL,EACZgK,EAAAA,IAACqC,GAAAA,SAAA,CACC,KAAM,CACJ,MAAO5C,GAAchF,CAAS,EAC9B,UAAWvF,EAAA,EAEb,QAAS,CAAC,OAAO,EACjB,aAAcE,GACd,iBAAiB,kBACjB,cAAc,GACd,cAAc,gCACd,UAAU,SAEV,SAAA4K,EAAAA,IAACsC,GAAA,CACC,QAAS7I,EAAE,MAAM,EACjB,QAAQ,QACR,UAAU,qEAEV,eAAC8I,GAAA,CAAsB,GAAI,CAAE,SAAU,GAAG,CAAG,CAAA,CAAA,CAC/C,CAAA,EAEA,KAEN,YAAa5J,IAAgB8B,EAC7B,KAAMkD,EAAelD,CAAI,EACzB,QAAS,IAAMyD,EAAgBzD,CAAS,EACxC,aAAAD,EACA,WAAAP,EACA,KACE4F,EACEG,EAAAA,IAAC6B,GAAA,CAAQ,MAAOpI,EAAE,OAAO,EACvB,SAAAuG,EAAAA,IAAC,OAAA,CAAK,QAAS,IAAMxB,EAAa/D,CAAS,EACzC,SAAAuF,EAAAA,IAACS,EAAAA,QAAA,CAAQ,KAAM,GAAI,UAAU,0CAAA,CAA2C,CAAA,CAC1E,CAAA,CACF,EAEAnK,KAAWmE,CAAI,GAAK,IAAA,CAAA,GAnDnBA,CAuDT,CAAA,EA5DKA,CAAA,CA+DX,CAAC,EAGA/E,GAAa6F,GACZyE,EAAAA,IAACoC,GAAAA,YAAA,CAA4B,MAAO1M,EAAW,WAAYiD,IAAgBjD,EACzE,SAAAsK,MAAC,MAAmB,KAAK,eAAe,UAAWiB,EAAW,SAAS,EACrE,SAAAjB,EAAAA,IAAC4B,GAAAA,UAAA,CACC,WAAAtI,EACA,MAAO5D,EACP,KAAK,MACL,aAAc,GACd,SAAU,EACV,WAAYoL,EAAW,aAAc,EAAI,EACzC,mBAAoBA,EAAW,qBAAsB,EAAI,EACzD,eAAgBA,EAAW,iBAAkB,EAAI,EACjD,WAAY,GACZ,WACE9K,EACEgK,EAAAA,IAACqC,GAAAA,SAAA,CACC,KAAM,CACJ,MAAO5C,GAAc/J,CAAS,EAC9B,UAAWR,EAAA,EAEb,QAAS,CAAC,OAAO,EACjB,aAAcE,GACd,iBAAiB,kBACjB,cAAc,GACd,cAAc,gCACd,UAAU,SAEV,SAAA4K,EAAAA,IAACuC,IAAsB,GAAI,CAAE,SAAU,EAAA,EAAM,UAAU,kBAAA,CAAmB,CAAA,CAAA,EAE1E,KAEN,YAAa5J,IAAgBjD,EAC7B,KAAMiI,EAAejI,CAAS,EAC9B,aAAA8E,EACA,WAAAP,EACA,KACEnD,GAAYuB,EAAQ,KAAMmJ,GAAQA,EAAI,OAAS9L,CAAS,GAAG,UACzDsK,EAAAA,IAAC6B,GAAA,CAAQ,MAAOpI,EAAE,QAAQ,EACxB,SAAAuG,EAAAA,IAAC,OAAA,CAAK,QAAS,IAAMxB,EAAa9I,CAAS,EACzC,eAAC+K,EAAAA,QAAA,CAAQ,KAAM,GAAI,UAAU,2CAA2C,CAAA,CAC1E,CAAA,CACF,EAEAnK,KAAWZ,CAAS,GAAK,IAAA,CAAA,CAG/B,EA5COA,CA6CT,GA9CgBA,CA+ClB,EACE,MAGDyC,EAAmB+C,EAAkB,QAAU,CAACjF,GACjD6E,EAAW,OAAS,IACpBW,GAAsB,EACtBuE,EAAAA,IAACwC,GAAAA,gBAAA,CAAgB,GAAG,YAClB,SAAAxC,EAAAA,IAACqC,GAAAA,SAAA,CACC,aAAc,CACZ,UAAW,sBACX,SAAU,OACV,UAAW,MACX,eAAgB,OAChB,aAAc,EACd,UACE,0GAAA,EAEJ,aAAc,IAAMvD,GAAA,EACpB,KAAM7G,EACN,KAAM,CACJ,MAAO,CACL,CACE,IAAK,SACL,SAAU,GACV,MAAO,CAAE,SAAU,QAAS,aAAc,KAAA,EAC1C,MACE+H,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACb,SAAAA,EAAAA,IAACyC,GAAAA,UAAA,CACC,GAAG,uBACH,MAAO3K,GACP,YAAY,cACZ,SAAW,GAAMC,GAAU,CAAC,CAAA,CAAA,CAC9B,CACF,CAAA,EAGJ,GAAGmD,EACA,MAAMI,CAAe,EACrB,OAAQE,GAASA,EAAK,OAAS9F,CAAS,EACxC,OAAOoF,CAAU,EACjB,OACC,CAAC,CAAE,KAAAL,CAAA,IACD,OAAOA,GAAS,WACfA,GAAQ,IAAI,YAAA,EAAc,SAAS3C,GAAO,aAAa,CAAA,EAE3D,IAAI,CAAC,CAAE,KAAA2C,EAAM,UAAAI,MAAiB,CAC7B,IAAKJ,EACL,MACEuF,EAAAA,IAACC,EAAAA,aAAA,CACC,UAAWgB,EACT,YACApG,EACI,yCACA,oCAAA,EAEN,KAAMJ,EACN,aAAcnB,EAAakB,EAAe,CAAA,EAC1C,UAAW1C,GACX,aAAc,GACd,WAAY+C,EACZ,QAASA,EAAY,OAAY,IAAM,CACrCqD,EAAgBzD,CAAS,EACzBvC,EAAoB,EAAK,CAC3B,CAAA,CAAA,EAGJ,eAAgBhD,GAChB,SAAU+C,EAAmBwH,GAAchF,EAAWI,EAAW,EAAI,EAAI,IAAA,EACzE,CAAA,EAEN,UAAW3F,EAAA,EAEb,cAAc,gCACd,QAAS,CAAC,OAAO,EACjB,iBAAiB,kBACjB,UAAU,cACV,kBAAoBwN,GAAYA,EAAQ,cAExC,SAAA1C,EAAAA,IAAC2C,GAAAA,WAAA,CACC,MAAO,GAAGrJ,EAAamC,GAAsB,EAAE,WAC/C,QAAAjG,EACA,KAAAM,EACA,aAAA2C,GACA,aAAA+B,EACA,uBAAAsE,GACA,WAAA7E,EACA,iBAAAhC,CAAA,CAAA,CACF,CAAA,EAEJ,EACE,IAAA,CAAA,CAAA,EAGPjB,EACCgJ,EAAAA,IAAC,MAAA,CAAI,UAAWiB,EAAWjK,GAAc,SAAS,EAChD,SAAAgJ,EAAAA,IAAC,KAAA,CAAI,SAAAhJ,EAAa,SAAA,CAAU,EAC9B,EACE,KACHhB,GAAawB,IACZwI,EAAAA,IAAC,KAAA,CACC,UAAWiB,EACTpI,GAAuB,cAAgB,YACvC,iCAAA,EAGF,SAAAmH,EAAAA,IAAC4C,GAAAA,WAAA,CACC,gBAAiB,GACfpI,GAAgB,OAAO,KAAKA,CAAY,EAAE,OAAS,GAErD,YAAazB,GACb,cAAgB+C,GAAWD,GAAgBC,CAAM,EACjD,kBAAmB,IAAM,CAEzB,EACA,cAAAwD,GACA,eAAgBC,EAAA,CAAA,CAClB,CAAA,CACF,CAAA,CAAA,EAGH5G,EACCqH,EAAAA,IAAC6C,GAAAA,eAAA,CACC,YAAAlK,EACA,aAAA6B,EACA,KAAA1E,EACA,QAAAN,EACA,WAAAyE,EACA,gBAAA5C,EAAA,CAAA,EAEA,IAAA,CAAA,CAAA,CACN,CAAA,CAGN"}
|
|
1
|
+
{"version":3,"file":"Tabs.cjs.js","sources":["../../../../src/components/navigation/tabs/Tabs.tsx"],"sourcesContent":["import {\n DndContext,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport type { DragEndEvent, DragOverEvent, DragStartEvent } from '@dnd-kit/core';\nimport { SortableContext, horizontalListSortingStrategy, arrayMove } from '@dnd-kit/sortable';\nimport { Dropdown } from 'antd';\nimport classNames from 'classnames';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';\n\nimport { DropableWrapper, MoreButton, SortableTab, TabDragOverlay, TabOptions, TabSwitch } from '.';\nimport type { SuffixRecord, Tab, TabOptionConfig, TabsProps } from './types';\nimport { INITIAL_TAB_OPTION_CONFIG } from './types';\n\nimport { formatCount } from '../../../utils/formatters';\n\nimport { useTabConfig } from '../../../providers/design-system-provider/hooks';\nimport { useTextWidth } from '../../../hooks/useTextWidth';\nimport IconButton from '../../button/IconButton';\nimport { OptionButton } from '../../buttons/option-button/OptionButton';\nimport { SearchBar } from '../../forms/search-bar/SearchBar';\nimport Tooltip from '../../tooltip/Tooltip';\nimport { EditIcon } from '../../icons/EditIcon';\nimport { toast } from 'react-toastify';\nimport { ArrowDownwardIcon, ArrowOutwardIcon, ArrowUpwardIcon, ContentCopyIcon, DeleteIcon, PinIcon, UnpinFilledIcon, VisibilityIcon, VisibilityOffIcon } from '../../icon';\n\nconst randomHex = () => Math.random().toString(16).slice(2, 13);\n\nconst TAB_MENU_CLASS = [\n '[&_.ant-dropdown-menu-item]:!outline-none',\n '[&_.ant-dropdown-menu-submenu-title]:!outline-none',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:dark:bg-black-600',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:dark:bg-black-600',\n].join(' ');\n\nlet dropdownTrigger: HTMLElement | null = null;\n\nconst handleDropdownOpen = (open: boolean) => {\n if (open) {\n dropdownTrigger = document.activeElement as HTMLElement;\n setTimeout(() => {\n const item = document.querySelector<HTMLElement>(\n '.row-option-cell .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .row-option-cell .ant-dropdown-menu-submenu-title',\n );\n item?.focus();\n }, 50);\n } else {\n setTimeout(() => {\n dropdownTrigger?.focus();\n dropdownTrigger = null;\n }, 0);\n }\n};\n\nconst ACTIONS = {\n SELECT: 'Select',\n MOVE_LEFT: 'MoveLeft',\n MOVE_RIGHT: 'MoveRight',\n HIDE: 'Hide',\n UNHIDE: 'Unhide',\n COPY_LINK: 'CopyLink',\n DELETE: 'Delete',\n PIN: 'Pin',\n UNPIN: 'Unpin',\n EDIT: 'Edit',\n} as const;\n\nexport const Tabs = <T extends string>({\n variant = 'default',\n tabs = [],\n activeTab,\n onTabClick,\n suffixRecord: suffixRecordProp,\n isLoading,\n size = 'md',\n className,\n draggable = false,\n showAllItems = false,\n copyLink = false,\n isDisabled = false,\n color = 'light',\n iconsOnly = false,\n tabIcons = {},\n height = 'h-6',\n fullWidth = false,\n fitContentWidth = false,\n disableAnimation = false,\n onEdit,\n onDelete,\n onCopyLink,\n allowPin = false,\n isFullWidth = false,\n rightSection,\n initialTabs: initialTabsProp,\n tabConfig: tabConfigProp,\n onTabConfigChange,\n onTabsChange,\n parentContainer = document.body,\n tabKey,\n linkConfig,\n showTabOptions = true,\n}: TabsProps<T>) => {\n // ── Provider integration ──\n const providerTabConfig = useTabConfig();\n const providerSettings = tabKey ? providerTabConfig?.getTabSettings(tabKey) : undefined;\n\n // Provider-sourced values are used only when the direct props are not passed\n const initialTabs = initialTabsProp ?? (providerSettings?.tab_items as Tab<T>[] | undefined);\n const tabConfig = tabConfigProp ?? providerSettings?.tab_options;\n // ── State ──\n const [search, setSearch] = useState('');\n const [showMoreDropdown, setShowMoreDropdown] = useState(false);\n const [visibleTabCounts, setVisibleTabCounts] = useState(0);\n const [allTabs, setAllTabs] = useState<Tab<T>[]>([]);\n const [sortedTabs, setSortedTabs] = useState<Tab<T>[]>([]);\n const [draggingOver, setDraggingOver] = useState<string | null>(null);\n const [draggingTab, setDraggingTab] = useState<string | null>(null);\n const [isHoveringTabOptions, setIsHoveringTabOptions] = useState(false);\n const [savedTabOptionConfig, setSavedTabOptionConfig] = useState<TabOptionConfig>(\n tabConfig ?? INITIAL_TAB_OPTION_CONFIG,\n );\n const [tabSearchFilter, setTabSearchFilter] = useState('');\n const [tabSearchFilterType, setTabSearchFilterType] = useState<'contains' | 'does-not-contain'>('contains');\n\n const { showCounts, lockOrder, sortOrder } = savedTabOptionConfig;\n\n // ── Refs & Hooks ──\n const { t } = useTranslation();\n const tabsRef = useRef<HTMLDivElement | null>(null);\n const ulRef = useRef<HTMLUListElement | null>(null);\n const visibleTabCountsRef = useRef(visibleTabCounts);\n const { measureText } = useTextWidth();\n const selectedId = useMemo(() => randomHex(), []);\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 5 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 5 } }),\n );\n\n // ── Derived values ──\n // Counts are formatted once here (1000 -> \"1,000\") so the rendered badges and\n // the overflow width measurement always agree.\n const suffixRecord = useMemo(() => {\n if (!suffixRecordProp) return suffixRecordProp;\n return Object.fromEntries(\n Object.entries(suffixRecordProp).map(([name, value]) => [\n name,\n formatCount(value as string | number),\n ]),\n ) as SuffixRecord<T>;\n }, [suffixRecordProp]);\n\n const visibleTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => !is_hidden), [sortedTabs]);\n const hiddenTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => is_hidden), [sortedTabs]);\n\n const filteredVisibleTabs = useMemo(\n () =>\n visibleTabs.filter(({ name }) => {\n if (!tabSearchFilter) return true;\n const tabName = (name ?? '').toLowerCase();\n const searchValue = tabSearchFilter.toLowerCase();\n return tabSearchFilterType === 'contains'\n ? tabName.includes(searchValue)\n : !tabName.includes(searchValue);\n }),\n [visibleTabs, tabSearchFilter, tabSearchFilterType],\n );\n\n const sortedVisibleTabs = useMemo(\n () =>\n [...filteredVisibleTabs].sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1;\n if (!a.is_pinned && b.is_pinned) return 1;\n return 0;\n }),\n [filteredVisibleTabs],\n );\n\n const isTabOverflow = visibleTabCounts < sortedVisibleTabs.length;\n const visibleTabSlice = showAllItems\n ? sortedVisibleTabs.length\n : isTabOverflow\n ? visibleTabCounts\n : sortedVisibleTabs.length;\n const isActiveTabInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= visibleTabSlice;\n const moreButtonTabCounts =\n allTabs.length - visibleTabSlice - (isActiveTabInsideMore ? 1 : 0);\n\n visibleTabCountsRef.current = visibleTabCounts;\n\n // ── Helpers ──\n const updateTabs = useCallback(\n (newTabs: Tab<T>[]) => {\n setAllTabs(newTabs);\n onTabsChange?.(newTabs);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_items: newTabs });\n }\n },\n [onTabsChange, tabKey, providerTabConfig],\n );\n\n const updateTabConfig = useCallback(\n (config: TabOptionConfig) => {\n setSavedTabOptionConfig(config);\n onTabConfigChange?.(config);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_options: config });\n }\n },\n [onTabConfigChange, tabKey, providerTabConfig],\n );\n\n const calculateIconWidth = (item: Tab<T>): number => (item.is_pinned ? 32 : 0);\n\n const calculateVisibleTabs = useCallback(\n (clientWidth: number) => {\n if (!clientWidth) return;\n const tabOptionsWidth = draggable ? 30 : 0;\n const moreWidth = showCounts ? 190 : 84;\n const tabGap = size === 'sm' ? 4 : 8;\n const basePadding = 32;\n let tabWidth = 0;\n let activeTabWidth = 0;\n let newVisibleTabCounts = 0;\n const availableWidth = clientWidth - (rightSection?.width || 0) - tabOptionsWidth;\n const currentCount = visibleTabCountsRef.current;\n const hasOverflow = currentCount < sortedVisibleTabs.length;\n const hasHidden = hiddenTabs.length > 0;\n\n for (let index = 0; index < sortedVisibleTabs.length; index++) {\n const item = sortedVisibleTabs[index];\n\n const suffixText = suffixRecord?.[item.name] ? String(suffixRecord?.[item.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n\n const tabTitleWidth = measureText(item?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n\n const iconWidth = allowPin ? calculateIconWidth(item) : 0;\n const currentTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n\n if (item.name === activeTab) {\n activeTabWidth = currentTabWidth;\n }\n\n tabWidth += currentTabWidth;\n\n if (\n availableWidth >\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0) + index * 25\n ) {\n newVisibleTabCounts = index + 1;\n } else {\n break;\n }\n }\n\n const remainingVisibleTabs = sortedVisibleTabs.length - newVisibleTabCounts;\n const totalRemainingTabs = remainingVisibleTabs + hiddenTabs.length;\n\n if (\n totalRemainingTabs === 1 &&\n hiddenTabs.length === 0 &&\n remainingVisibleTabs === 1 &&\n newVisibleTabCounts < sortedVisibleTabs.length\n ) {\n const lastTab = sortedVisibleTabs[newVisibleTabCounts];\n if (lastTab) {\n const suffixText = suffixRecord?.[lastTab.name] ? String(suffixRecord?.[lastTab.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n const tabTitleWidth = measureText(lastTab?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n const iconWidth = allowPin ? calculateIconWidth(lastTab) : 0;\n const lastTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n if (availableWidth >= tabWidth + lastTabWidth) {\n newVisibleTabCounts += 1;\n }\n }\n }\n\n const newVisibleSlice = showAllItems ? sortedVisibleTabs.length : newVisibleTabCounts;\n const activeInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= newVisibleSlice;\n\n if (activeInsideMore) {\n tabWidth += activeTabWidth;\n if (\n availableWidth <\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0)\n ) {\n newVisibleTabCounts = Math.max(newVisibleTabCounts - 1, 0);\n }\n }\n\n if (newVisibleTabCounts !== currentCount) {\n setVisibleTabCounts(newVisibleTabCounts);\n }\n },\n [\n sortedVisibleTabs,\n showCounts,\n showAllItems,\n allowPin,\n suffixRecord,\n rightSection?.width,\n activeTab,\n size,\n draggable,\n hiddenTabs.length,\n measureText,\n ],\n );\n\n // ── Search params helper (uses provider abstraction when available) ──\n const getCurrentSearchParams = useCallback(\n () => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n if (linkConfig && providerTabConfig?.getSearchParam) {\n const params = new URLSearchParams();\n const currentValue = providerTabConfig.getSearchParam(linkConfig.key);\n if (currentValue) params.set(linkConfig.key, currentValue);\n return params;\n }\n return new URLSearchParams();\n },\n [linkConfig, providerTabConfig],\n );\n\n const applyTabToSearchParams = useCallback(\n (params: URLSearchParams, tabName: string) => {\n if (!linkConfig) return params;\n if (tabName === linkConfig.defaultLink) {\n params.delete(linkConfig.key);\n } else {\n params.set(linkConfig.key, tabName);\n }\n linkConfig.onResolve?.(params);\n return params;\n },\n [linkConfig],\n );\n\n // ── Link href resolution ──\n const resolveTabHref = useCallback(\n (tabName: string): string | undefined => {\n if (!linkConfig) return undefined;\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n return `?${params.toString()}`;\n },\n [applyTabToSearchParams, getCurrentSearchParams, linkConfig],\n );\n\n // ── Copy link ──\n const showCopyLink = copyLink || Boolean(linkConfig);\n\n const handleCopyLink = useCallback(\n async (tabName: T) => {\n const search = resolveTabHref(tabName);\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n const pathname = typeof window !== 'undefined' ? window.location.pathname : '';\n const href = search\n ? `${origin}${pathname}${search}`\n : `${origin}${pathname}`;\n await navigator.clipboard.writeText(href);\n toast.success(t(\"Link copied to clipboard\"), {\n toastId: 'Link copied to clipboard',\n });\n onCopyLink?.(tabName, href);\n },\n [resolveTabHref, t, onCopyLink],\n );\n\n // ── Tab actions ──\n const handleSelectTab = (tabName: T) => {\n setShowMoreDropdown(false);\n onTabClick?.(tabName);\n if (linkConfig && providerTabConfig?.navigate) {\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n providerTabConfig.navigate(`?${params.toString()}`);\n }\n };\n\n const hideTab = (tabName: T) => {\n if (sortedVisibleTabs.length <= 1) return;\n\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: true } : item,\n );\n\n const visibleIndex = sortedVisibleTabs.findIndex((item) => item.name === tabName);\n const nextIndex = visibleIndex === 0 ? 1 : visibleIndex - 1;\n handleSelectTab(sortedVisibleTabs[nextIndex].name);\n\n updateTabs(_tabs);\n };\n\n const unhideTab = (tabName: T) => {\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: false } : item,\n );\n\n setShowMoreDropdown(false);\n updateTabs(_tabs);\n };\n\n const togglePinTab = (tabName: T) => {\n if (!allowPin) return;\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_pinned: !item.is_pinned } : item,\n );\n updateTabs(_tabs);\n };\n\n const moveTab = (tabName: T, direction: 'left' | 'right') => {\n const oldIndex = allTabs.findIndex(({ name }) => name === tabName);\n const newIndex =\n direction === 'left'\n ? oldIndex - (allTabs[oldIndex - 1]?.name === activeTab ? 2 : 1)\n : oldIndex + 1;\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n };\n\n const handleShowMoreDropdown = () => setShowMoreDropdown(!showMoreDropdown);\n\n // ── Drag handlers ──\n const handleDragStart = (event: DragStartEvent) => setDraggingTab(event.active.id as string);\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (over?.id === 'more-tabs') {\n hideTab(active.id as T);\n setDraggingTab(null);\n setDraggingOver(null);\n return;\n }\n const oldIndex = allTabs.findIndex(({ name }) => name === active.id);\n const newIndex = allTabs.findIndex(({ name }) => name === over?.id);\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragCancel = () => {\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragOver = (event: DragOverEvent) => {\n setDraggingOver(event.over?.id === 'more-tabs' ? 'more-tabs' : null);\n };\n\n const handleTabSort = () => {\n // Sorting is handled via sortedTabs effect — no direct allTabs mutation\n };\n\n const handleSearchFilterChange = (\n searchValue: string,\n filterType: 'contains' | 'does-not-contain',\n ) => {\n setTabSearchFilter(searchValue);\n setTabSearchFilterType(filterType);\n };\n\n // ── Tab context menu options ──\n const getTabOptions = (title: T, isHidden = false, isSoftHidden = false) => {\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = tab?.is_pinned;\n\n const options = [\n {\n label: (\n <OptionButton\n icon={<ArrowOutwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Select Tab\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.SELECT,\n onClick: () => handleSelectTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowUpwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Up\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_LEFT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'left'),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowDownwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Down\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_RIGHT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'right'),\n },\n {\n label: (\n <OptionButton\n icon={<ContentCopyIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Copy Link\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.COPY_LINK,\n onClick: () => handleCopyLink(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityOffIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Hide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.HIDE,\n onClick: () => hideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Unhide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.UNHIDE,\n onClick: () => unhideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={isPinned ? <UnpinFilledIcon size={20} className='rotate-12 text-inherit dark:text-inherit'/> : <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />}\n text={isPinned ? t(\"Unpin\") : t(\"Pin\")}\n className=\"text-black-900 dark:text-white\"\n notVisible={!allowPin}\n />\n ),\n key: isPinned ? ACTIONS.UNPIN : ACTIONS.PIN,\n onClick: () => togglePinTab(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-black-900 dark:text-white\"\n icon={<EditIcon />}\n text={t('Edit')}\n notVisible={!onEdit}\n />\n ),\n key: ACTIONS.EDIT,\n onClick: () => onEdit?.(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-error-600 dark:text-error-600\"\n icon={<DeleteIcon size={18} className='text-error-600 dark:text-error-600' />}\n text={t(\"Delete\")}\n notVisible={!onDelete}\n />\n ),\n key: ACTIONS.DELETE,\n onClick: () => onDelete?.(title),\n },\n ];\n\n const hiddenFilter: string[] = [ACTIONS.HIDE, ACTIONS.UNHIDE];\n const defaultFilter: string[] = [ACTIONS.SELECT, ACTIONS.MOVE_LEFT, ACTIONS.MOVE_RIGHT, ACTIONS.UNHIDE];\n\n return options\n .filter((item) =>\n isHidden\n ? item.key === ACTIONS.UNHIDE\n : isSoftHidden\n ? !hiddenFilter.includes(item.key)\n : !defaultFilter.includes(item.key),\n )\n .filter((item) => (showCopyLink ? true : item.key !== ACTIONS.COPY_LINK))\n .filter((item) => (sortedVisibleTabs.length === 1 ? item.key !== ACTIONS.HIDE : true));\n };\n\n // ── Class maps ──\n const getClasses = (\n classType: 'classValue' | 'selectedClassValue' | 'textClassValue',\n isSelected: boolean,\n ) => {\n const classes = {\n classValue: {\n default: classNames('relative inline-flex pt-2 pb-3 px-2 pl-3 sm:px-2 rounded-t-sm group'),\n secondary: classNames(\n 'flex w-full sm:w-auto relative rounded-lg font-sans font-semibold text-center cursor-pointer uppercase',\n size === 'sm' ? 'py-1 px-3 text-sm' : 'py-2 px-4 text-base',\n ),\n },\n selectedClassValue: {\n default: classNames('absolute left-0 bottom-0 w-full h-[3px] bg-primary-600'),\n secondary: classNames('absolute inset-0 bg-primary-50 dark:bg-primary-975 rounded-lg'),\n },\n textClassValue: {\n default: classNames(\n 'relative uppercase font-sans font-semibold text-sm whitespace-nowrap',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 hover:text-neutral-500 dark:text-neutral-100 dark:hover:text-white',\n ),\n secondary: classNames(\n 'relative whitespace-nowrap text-sm',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 dark:text-neutral-400',\n ),\n },\n };\n return classes[classType][variant as 'default' | 'secondary'];\n };\n\n // ── Effects ──\n // ResizeObserver for responsive overflow\n useEffect(() => {\n if (!tabsRef.current || variant === 'switch') return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const containerWidth = entries[0].contentRect.width;\n calculateVisibleTabs(containerWidth);\n });\n\n resizeObserver.observe(tabsRef.current);\n calculateVisibleTabs(tabsRef.current.clientWidth);\n\n return () => resizeObserver.disconnect();\n }, [calculateVisibleTabs, variant]);\n\n // Stable stringified keys to avoid re-init when prop references change but values don't\n const tabsKey = JSON.stringify(tabs);\n const initialTabsKey = JSON.stringify(initialTabs?.map(({ name }) => name));\n\n // Initialize allTabs from props or initialTabs\n useEffect(() => {\n if (initialTabs?.length) {\n let _tabs = [...initialTabs];\n tabs.forEach((tab) => {\n if (!_tabs.find((item) => item.name === tab)) {\n _tabs.push({ name: tab, is_default: false, is_hidden: false, is_pinned: false });\n }\n });\n _tabs = _tabs.filter(\n (item, index, self) =>\n tabs.includes(item.name) && index === self.findIndex((_t) => _t.name === item.name),\n );\n setAllTabs(_tabs);\n } else {\n setAllTabs(\n tabs\n .map((item) => ({ name: item, is_default: false, is_hidden: false, is_pinned: false }))\n .filter((item, index, self) => index === self.findIndex((_t) => _t.name === item.name)),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tabsKey, initialTabsKey]);\n\n // Sync tabConfig prop\n useEffect(() => {\n if (tabConfig) {\n setSavedTabOptionConfig(tabConfig);\n }\n }, [tabConfig]);\n\n // Sort tabs\n useEffect(() => {\n if (!allTabs.length) return;\n const _sortedTabs = [...allTabs];\n if (sortOrder === 'asc') {\n _sortedTabs.sort((a, b) => a.name.localeCompare(b.name));\n } else if (sortOrder === 'desc') {\n _sortedTabs.sort((a, b) => b.name.localeCompare(a.name));\n }\n setSortedTabs(_sortedTabs);\n }, [allTabs, sortOrder]);\n\n // Focus first menu item when More dropdown opens\n useEffect(() => {\n handleDropdownOpen(showMoreDropdown);\n }, [showMoreDropdown]);\n\n // ── Variant: switch ──\n if (variant === 'switch') {\n return (\n <div className={classNames('inline', className)}>\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'inline-flex grow-0 p-1 rounded-lg',\n color === 'dark'\n ? 'border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800'\n : 'bg-neutral-100 dark:bg-black-700',\n fullWidth ? 'w-full' : 'w-auto',\n )}\n >\n {tabs.map((title: T) => {\n const isSelected = activeTab === title;\n const icon = tabIcons?.[title];\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = allowPin && tab?.is_pinned;\n\n return (\n <li key={title} role=\"presentation\" className={classNames('inline-flex', fullWidth ? 'w-full' : 'w-auto')}>\n <TabSwitch\n title={title}\n showCounts={showCounts}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n icon={\n isPinned ? (\n <Tooltip title=\"Unpin\">\n <span onClick={() => togglePinTab(title)}>\n <PinIcon className='rotate-45 w-icon h-icon text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n icon\n )\n }\n iconsOnly={iconsOnly}\n classValue={classNames(\n 'relative py-0.5 border-gray-200',\n height,\n fullWidth ? 'w-full flex items-center justify-center' : 'px-2',\n )}\n selectedClassValue={classNames(\n 'absolute inset-0 rounded-md z-0',\n color === 'dark' ? 'bg-neutral-900' : 'bg-white dark:bg-black-800',\n )}\n textClassValue={classNames(\n 'relative text-xs font-semibold font-sans whitespace-nowrap',\n isSelected\n ? 'text-neutral-900 dark:text-neutral-100'\n : 'text-neutral-700 dark:text-neutral-100',\n )}\n isSelected={isSelected}\n href={resolveTabHref(title)}\n onClick={!isDisabled ? () => handleSelectTab(title) : undefined}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n color={color}\n disableAnimation={disableAnimation}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n }\n\n // ── Variant: default / secondary ──\n return (\n <div\n ref={tabsRef}\n className={classNames(fitContentWidth ? 'w-fit' : 'w-full')}\n onMouseEnter={() => setIsHoveringTabOptions(true)}\n onMouseLeave={() => setIsHoveringTabOptions(false)}\n >\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n collisionDetection={closestCenter}\n onDragOver={handleDragOver}\n >\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'flex items-center w-full',\n className,\n isFullWidth ? 'gap-0' : size === 'sm' ? 'gap-1' : 'gap-2',\n )}\n ref={ulRef}\n >\n {isLoading ? (\n <div className=\"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded\" />\n ) : (\n <SortableContext\n items={sortedVisibleTabs.map(({ name }) => name)}\n strategy={horizontalListSortingStrategy}\n id=\"sortable\"\n disabled={!draggable || lockOrder}\n >\n {sortedVisibleTabs.slice(0, visibleTabSlice).map(({ name, is_pinned }) => {\n const isSelected = activeTab === name && !showMoreDropdown;\n const isPinned = allowPin && is_pinned;\n\n return (\n <SortableTab\n key={name}\n title={name}\n isDragging={draggingTab === name}\n className={isFullWidth ? 'flex-1 flex justify-center' : ''}\n >\n <li key={name} role=\"presentation\" className={classNames(isFullWidth ? 'w-full flex' : 'sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={name}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n classValue={classNames(\n getClasses('classValue', isSelected),\n isFullWidth ? 'w-full justify-center' : '',\n )}\n selectedClassValue={getClasses('selectedClassValue', isSelected)}\n textClassValue={getClasses('textClassValue', isSelected)}\n isSelected={isSelected}\n tabOptions={\n isSelected && draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(name as T),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <IconButton\n tooltip={t(\"More\")}\n variant=\"ghost\"\n className=\"!text-primary-500 hover:!bg-primary-100 dark:hover:!bg-primary-900\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} />\n </IconButton>\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === name}\n href={resolveTabHref(name)}\n onClick={() => handleSelectTab(name as T)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n isPinned ? (\n <Tooltip title={t(\"Unpin\")}>\n <span onClick={() => togglePinTab(name as T)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[name] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n );\n })}\n\n {/* Active tab pulled from overflow */}\n {activeTab && isActiveTabInsideMore ? (\n <SortableTab key={activeTab} title={activeTab} isDragging={draggingTab === activeTab}>\n <li key={activeTab} role=\"presentation\" className={classNames('sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={activeTab}\n role=\"tab\"\n ariaSelected={true}\n tabIndex={0}\n classValue={getClasses('classValue', true)}\n selectedClassValue={getClasses('selectedClassValue', true)}\n textClassValue={getClasses('textClassValue', true)}\n isSelected={true}\n tabOptions={\n draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(activeTab),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} className=\"text-primary-600\" />\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === activeTab}\n href={resolveTabHref(activeTab)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n allowPin && allTabs.find((tab) => tab.name === activeTab)?.is_pinned ? (\n <Tooltip title={t(\"Pinned\")}>\n <span onClick={() => togglePinTab(activeTab)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[activeTab] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n ) : null}\n\n {/* More dropdown */}\n {((visibleTabCounts < sortedVisibleTabs.length && !showAllItems) ||\n hiddenTabs.length > 0) &&\n moreButtonTabCounts > 0 ? (\n <DropableWrapper id=\"more-tabs\">\n <Dropdown\n overlayStyle={{\n maxHeight: 'calc(100vh - 350px)',\n overflow: 'auto',\n marginTop: '8px',\n scrollbarWidth: 'none',\n borderRadius: 8,\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)',\n }}\n onOpenChange={() => handleShowMoreDropdown()}\n open={showMoreDropdown}\n menu={{\n items: [\n {\n key: 'Search',\n disabled: true,\n style: { minWidth: '190px', marginBottom: '8px' },\n label: (\n <div className=\"px-2 bg-white dark:bg-black-800\">\n <SearchBar\n id=\"search-bar-more-tabs\"\n value={search}\n classValues=\"!rounded-lg\"\n onChange={(e) => setSearch(e)}\n />\n </div>\n ),\n },\n ...sortedVisibleTabs\n .slice(visibleTabSlice)\n .filter((item) => item.name !== activeTab)\n .concat(hiddenTabs)\n .filter(\n ({ name }) =>\n typeof name === 'string' &&\n (name ?? '').toLowerCase().includes(search.toLowerCase()),\n )\n .map(({ name, is_hidden }) => ({\n key: name,\n label: (\n <OptionButton\n className={classNames(\n 'uppercase',\n is_hidden\n ? 'text-neutral-400 dark:text-neutral-500'\n : 'text-black-900 dark:text-black-200',\n )}\n text={name}\n suffixRecord={showCounts ? suffixRecord : {}}\n highlight={search}\n truncateText={true}\n isDisabled={is_hidden}\n onClick={is_hidden ? undefined : () => {\n handleSelectTab(name as T);\n setShowMoreDropdown(false);\n }}\n />\n ),\n popupClassName: TAB_MENU_CLASS,\n children: showMoreDropdown ? getTabOptions(name as T, is_hidden, true) : null,\n })),\n ],\n className: TAB_MENU_CLASS,\n }}\n openClassName=\"max-h-[350px] overflow-y-auto\"\n trigger={['click']}\n overlayClassName=\"row-option-cell\"\n placement=\"bottomRight\"\n getPopupContainer={(trigger) => trigger.parentElement as HTMLElement}\n >\n <MoreButton\n title={`${showCounts ? moreButtonTabCounts : ''} ${showCounts ? '' : ''}MORE...`}\n variant={variant}\n size={size}\n draggingOver={draggingOver}\n suffixRecord={suffixRecord}\n handleShowMoreDropdown={handleShowMoreDropdown}\n selectedId={selectedId}\n showMoreDropdown={showMoreDropdown}\n />\n </Dropdown>\n </DropableWrapper>\n ) : null}\n </SortableContext>\n )}\n {rightSection ? (\n <div className={classNames(rightSection?.className)}>\n <li>{rightSection.component}</li>\n </div>\n ) : null}\n {draggable && showTabOptions && (\n <li\n className={classNames(\n isHoveringTabOptions ? 'opacity-100' : 'opacity-0',\n 'transition-opacity duration-300',\n )}\n >\n <TabOptions\n hasSuffixRecord={Boolean(\n suffixRecord && Object.keys(suffixRecord).length > 0,\n )}\n savedConfig={savedTabOptionConfig}\n onApplyFilter={(config) => updateTabConfig(config)}\n setUnsavedChanges={() => {\n /* handled by onTabsChange / onTabConfigChange */\n }}\n handleTabSort={handleTabSort}\n onSearchChange={handleSearchFilterChange}\n />\n </li>\n )}\n </ul>\n {draggingTab ? (\n <TabDragOverlay\n draggingTab={draggingTab}\n suffixRecord={suffixRecord}\n size={size}\n variant={variant}\n selectedId={selectedId}\n parentContainer={parentContainer}\n />\n ) : null}\n </DndContext>\n </div>\n );\n};\n"],"names":["randomHex","TAB_MENU_CLASS","dropdownTrigger","handleDropdownOpen","open","ACTIONS","Tabs","variant","tabs","activeTab","onTabClick","suffixRecordProp","isLoading","size","className","draggable","showAllItems","copyLink","isDisabled","color","iconsOnly","tabIcons","height","fullWidth","fitContentWidth","disableAnimation","onEdit","onDelete","onCopyLink","allowPin","isFullWidth","rightSection","initialTabsProp","tabConfigProp","onTabConfigChange","onTabsChange","parentContainer","tabKey","linkConfig","showTabOptions","providerTabConfig","useTabConfig","providerSettings","initialTabs","tabConfig","search","setSearch","useState","showMoreDropdown","setShowMoreDropdown","visibleTabCounts","setVisibleTabCounts","allTabs","setAllTabs","sortedTabs","setSortedTabs","draggingOver","setDraggingOver","draggingTab","setDraggingTab","isHoveringTabOptions","setIsHoveringTabOptions","savedTabOptionConfig","setSavedTabOptionConfig","INITIAL_TAB_OPTION_CONFIG","tabSearchFilter","setTabSearchFilter","tabSearchFilterType","setTabSearchFilterType","showCounts","lockOrder","sortOrder","t","useTranslation","tabsRef","useRef","ulRef","visibleTabCountsRef","measureText","useTextWidth","selectedId","useMemo","sensors","useSensors","useSensor","MouseSensor","TouchSensor","suffixRecord","name","value","formatCount","visibleTabs","is_hidden","hiddenTabs","filteredVisibleTabs","tabName","searchValue","sortedVisibleTabs","a","b","isTabOverflow","visibleTabSlice","isActiveTabInsideMore","item","moreButtonTabCounts","updateTabs","useCallback","newTabs","updateTabConfig","config","calculateIconWidth","calculateVisibleTabs","clientWidth","tabOptionsWidth","moreWidth","tabGap","basePadding","tabWidth","activeTabWidth","newVisibleTabCounts","availableWidth","currentCount","hasOverflow","hasHidden","index","suffixText","suffixWidth","tabTitleWidth","iconWidth","currentTabWidth","remainingVisibleTabs","lastTab","lastTabWidth","newVisibleSlice","getCurrentSearchParams","params","currentValue","applyTabToSearchParams","resolveTabHref","showCopyLink","handleCopyLink","origin","pathname","href","toast","handleSelectTab","hideTab","_tabs","visibleIndex","nextIndex","unhideTab","togglePinTab","moveTab","direction","oldIndex","newIndex","arrayMove","handleShowMoreDropdown","handleDragStart","event","handleDragEnd","active","over","handleDragCancel","handleDragOver","handleTabSort","handleSearchFilterChange","filterType","getTabOptions","title","isHidden","isSoftHidden","isPinned","_t","options","jsx","OptionButton","ArrowOutwardIcon","ArrowUpwardIcon","ArrowDownwardIcon","ContentCopyIcon","VisibilityOffIcon","VisibilityIcon","UnpinFilledIcon","PinIcon","EditIcon","DeleteIcon","hiddenFilter","defaultFilter","getClasses","classType","isSelected","classNames","useEffect","resizeObserver","entries","containerWidth","tabsKey","initialTabsKey","tab","self","_sortedTabs","icon","TabSwitch","Tooltip","jsxs","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","is_pinned","SortableTab","Dropdown","IconButton","MoreHorizOutlinedIcon","DropableWrapper","SearchBar","trigger","MoreButton","TabOptions","TabDragOverlay"],"mappings":"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"}
|