@telegraph/combobox 0.0.51 → 0.0.52

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @telegraph/combobox
2
2
 
3
+ ## 0.0.52
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies []:
8
+ - @telegraph/button@0.0.58
9
+ - @telegraph/layout@0.1.4
10
+ - @telegraph/typography@0.1.4
11
+ - @telegraph/menu@0.0.42
12
+ - @telegraph/tag@0.0.63
13
+ - @telegraph/input@0.0.30
14
+ - @telegraph/tooltip@0.0.32
15
+ - @telegraph/icon@0.0.38
16
+
3
17
  ## 0.0.51
4
18
 
5
19
  ### Patch Changes
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),G=require("@radix-ui/react-dismissable-layer"),N=require("@radix-ui/react-portal"),Y=require("@radix-ui/react-use-controllable-state"),U=require("@radix-ui/react-visually-hidden"),k=require("@telegraph/button"),V=require("@telegraph/compose-refs"),X=require("@telegraph/helpers"),C=require("@telegraph/icon"),W=require("@telegraph/input"),j=require("@telegraph/layout"),B=require("@telegraph/menu"),w=require("@telegraph/motion"),D=require("@telegraph/tag"),J=require("@telegraph/tooltip"),Q=require("@telegraph/typography"),i=require("react");function M(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const p=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(r,e,p.get?p:{enumerable:!0,get:()=>t[e]})}}return r.default=t,Object.freeze(r)}const Z=M(N),ee=M(U),te={0:"5",1:"6",2:"8",3:"10"},T=t=>Array.isArray(t),E=t=>typeof t=="object"&&!Array.isArray(t)||typeof t=="string"||!t,oe=t=>{const r=(a,u=[])=>(i.Children.toArray(a).forEach(n=>{i.isValidElement(n)&&(n.props.value?u.push(n):n.props.children&&r(n.props.children,u))}),u);return r(t).map(a=>{var o;const u=a;return{value:u.props.value,label:((o=u.props)==null?void 0:o.label)||u.props.children||u.props.value}})},S=(t,r)=>{if(t)return r===!0?t==null?void 0:t.value:t},L=(t,r,e)=>{if(t&&!(!r||r.length===0))return r.find(p=>p.value===S(t,e))},ne=({label:t,value:r,searchQuery:e})=>(r==null?void 0:r.toLowerCase().includes(e.toLowerCase()))||(t==null?void 0:t.toLowerCase().includes(e.toLowerCase())),re=["ArrowDown","PageUp","Home"],ae=["ArrowUp","PageDown","End"],F=["Enter"," "],v=i.createContext({value:void 0,onValueChange:()=>{},contentId:"",triggerId:"",open:!1,setOpen:()=>{},onOpenToggle:()=>{},clearable:!1,disabled:!1,options:[],legacyBehavior:!1}),se=({modal:t=!0,closeOnSelect:r=!0,clearable:e=!1,disabled:p=!1,legacyBehavior:a=!1,open:u,onOpenChange:o,defaultOpen:n,value:c,onValueChange:g,errored:m,placeholder:b,layout:d,children:l,...h})=>{const y=i.useId(),x=i.useId(),f=i.useRef(null),R=i.useRef(null),A=i.useRef(null),P=i.useMemo(()=>oe(l),[l]),[K,q]=i.useState(""),[O=!1,I]=Y.useControllableState({prop:u,defaultProp:n,onChange:o}),z=i.useCallback(()=>{I($=>!$)},[I]);return i.useEffect(()=>{O||q("")},[O]),s.jsx(v.Provider,{value:{contentId:y,triggerId:x,value:c,onValueChange:g,placeholder:b,open:O,setOpen:I,onOpenToggle:z,closeOnSelect:r,clearable:e,disabled:p,searchQuery:K,setSearchQuery:q,triggerRef:f,searchRef:R,contentRef:A,errored:m,layout:d,options:P,legacyBehavior:a},children:s.jsx(B.Menu.Root,{open:O,onOpenChange:I,modal:t,...h,children:l})})},ie=({value:t,...r})=>{const e=i.useContext(v),p=i.useMemo(()=>{const a=e.options.find(n=>n.value===t);if(a)return a.label||a.value;if(!e.value)return;const o=e.value.find(n=>S(n,e.legacyBehavior)===t);if(o)return o},[e.options,e.value,t,e.legacyBehavior]);return s.jsxs(D.Tag.Root,{as:w.motion.span,initializeWithAnimation:!1,initial:{opacity:0,scale:.5},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.5},transition:{duration:100,type:"spring"},"tgph-motion-key":t,size:"1",layout:"position",...r,children:[s.jsx(D.Tag.Text,{children:p}),s.jsx(D.Tag.Button,{icon:{icon:C.Lucide.X,alt:`Remove ${t}`},onClick:a=>{if(!e.onValueChange)return;const u=e.onValueChange,n=e.value.filter(c=>S(c,e.legacyBehavior)!==t);u==null||u(n),a.stopPropagation(),a.preventDefault()}})]})},ce=()=>{const t=i.useContext(v);if(t.value&&T(t.value)){const r=t.layout||"truncate",e=t.value.length-2,p=e.toString().split("");return t.value.length===0?s.jsx(k.Button.Text,{color:"gray",children:t.placeholder}):s.jsxs(j.Stack,{gap:"1",w:"full",wrap:r==="wrap"?"wrap":"nowrap",align:"center",style:{position:"relative",flexGrow:1},children:[s.jsx(w.AnimatePresence,{presenceMap:t.value.map(a=>({"tgph-motion-key":S(a,t.legacyBehavior)||"",value:!0})),children:t.value.map((a,u)=>{const o=S(a,t.legacyBehavior);if(o&&(r==="truncate"&&u<=1||r==="wrap"))return s.jsx(X.RefToTgphRef,{children:s.jsx(ie,{value:o})},o)})}),s.jsx(w.AnimatePresence,{presenceMap:[{"tgph-motion-key":"combobox-more",value:!0}],children:r==="truncate"&&t.value.length>2&&s.jsx(j.Stack,{as:w.motion.div,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:100,type:"spring"},h:"full",pr:"1",pl:"8",align:"center","aria-label":`${e} more selected`,position:"absolute",right:"0",style:{backgroundImage:"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)"},children:s.jsxs(Q.Text,{as:"span",size:"1",style:{whiteSpace:"nowrap"},children:["+",s.jsxs(w.AnimatePresence,{presenceMap:p.map(a=>({"tgph-motion-key":a,value:!0})),children:[p.map(a=>s.jsx(j.Box,{as:w.motion.span,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:100,type:"spring"},w:"2",display:"inline-block","tgph-motion-key":a,children:a},a))," "]}),"more"]})})})]})}if(t&&E(t.value)){const r=L(t.value,t.options,t.legacyBehavior);return s.jsx(k.Button.Text,{color:t.value?"default":"gray",children:(r==null?void 0:r.label)||t.placeholder})}},le=({size:t="2",...r})=>{const e=i.useContext(v),p=i.useCallback(()=>{var o;if(!e.value)return e.placeholder;if(E(e.value)){const n=L(e.value,e.options,e.legacyBehavior);return(n==null?void 0:n.label)||e.placeholder}if(T(e.value))return((o=e.value)==null?void 0:o.map(n=>{const c=L(n,e.options,e.legacyBehavior);return c==null?void 0:c.label}).join(", "))||e.placeholder},[e.value,e.placeholder,e.options,e.legacyBehavior]),a=i.useMemo(()=>{var o;if(E(e.value))return e.clearable&&e.value;if(T(e.value))return e.clearable&&((o=e.value)==null?void 0:o.length)>0},[e.clearable,e.value]),u=()=>{var o,n;if(T(e.value)){const c=e.onValueChange;c==null||c([])}if(E(e.value)){const c=e.onValueChange;c==null||c(void 0)}(n=(o=e.triggerRef)==null?void 0:o.current)==null||n.focus()};return s.jsx(B.Menu.Trigger,{...r,asChild:!0,onClick:o=>{var n,c;o.preventDefault(),e.onOpenToggle(),(c=(n=e.triggerRef)==null?void 0:n.current)==null||c.focus()},onKeyDown:o=>{if(o.key==="Tab"){o.stopPropagation();return}if(F.includes(o.key)){o.preventDefault();return}if(o.key==="ArrowDown"){o.stopPropagation(),o.preventDefault(),e.onOpenToggle();return}},tgphRef:e.triggerRef,children:s.jsxs(k.Button.Root,{id:e.triggerId,type:"button",bg:"surface-1",variant:"outline",align:"center",minH:te[t],h:"full",w:"full",py:"1",size:t,color:e.errored?"red":"gray",justify:"space-between",role:"combobox","aria-label":p(),"aria-controls":e.contentId,"aria-expanded":e.open,"aria-haspopup":"listbox","data-tgph-combobox-trigger":!0,"data-tgph-comobox-trigger-open":e.open,disabled:e.disabled,children:[s.jsx(ce,{}),s.jsxs(j.Stack,{align:"center",gap:"1",children:[a&&s.jsx(J.Tooltip,{label:"Clear field",children:s.jsx(k.Button,{type:"button",icon:{icon:C.Lucide.X,alt:"Clear field"},size:"1",variant:"ghost",onClick:o=>{e.value&&(o.stopPropagation(),u())},onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.stopPropagation(),u())},"data-tgph-combobox-clear":!0,style:{marginTop:"calc(-1 * var(--tgph-spacing-1)",marginBottom:"calc(-1 * var(--tgph-spacing-1)"}})}),s.jsx(k.Button.Icon,{as:w.motion.span,animate:{rotate:e.open?180:0},transition:{duration:150,type:"spring"},icon:C.Lucide.ChevronDown,"aria-hidden":!0})]})]})})},ue=({style:t,children:r,tgphRef:e,...p})=>{const a=i.useContext(v),u=i.useRef(!1),o=V.useComposedRefs(e,a.contentRef),n=i.useRef(null),[c,g]=i.useState(0),[m,b]=i.useState(!1),d=i.useCallback(l=>{const h=l==null?void 0:l.getBoundingClientRect();h&&g(h.height),m||b(!0)},[m]);return i.useEffect(()=>{const l=new ResizeObserver(h=>{for(const y of h){const x=y.target;d(x)}});return n.current&&m&&l.observe(n.current),()=>l.disconnect()},[m,d]),i.useEffect(()=>{m===!0&&a.open===!1&&b(!1)},[a.open,m]),i.useEffect(()=>{let l;return a.open&&(l=setTimeout(()=>{d(n.current)},10)),()=>l&&clearTimeout(l)},[a.open,d]),s.jsx(Z.Root,{asChild:!0,children:s.jsx(G.DismissableLayer,{onEscapeKeyDown:l=>{a.open&&(l.stopPropagation(),l.preventDefault(),a.setOpen(!1))},children:s.jsx(B.Menu.Content,{className:"tgph",mt:"1",onCloseAutoFocus:l=>{var h,y;u.current||(y=(h=a.triggerRef)==null?void 0:h.current)==null||y.focus(),u.current=!1,l.preventDefault()},bg:"surface-1",style:{width:"var(--tgph-comobobox-trigger-width)",transition:"min-height 200ms ease-in-out",minHeight:c?`${c}px`:"0",...t,"--tgph-comobobox-content-transform-origin":"var(--radix-popper-transform-origin)","--tgph-combobox-content-available-width":"var(--radix-popper-available-width)","--tgph-combobox-content-available-height":"calc(var(--radix-popper-available-height) - var(--tgph-spacing-8))","--tgph-comobobox-trigger-width":"var(--radix-popper-anchor-width)","--tgph-combobox-trigger-height":"var(--radix-popper-anchor-height)"},...p,tgphRef:o,"data-tgph-combobox-content":!0,"data-tgph-combobox-content-open":a.open,role:void 0,"aria-orientation":void 0,onKeyDown:l=>{var y,x,f,R;l.stopPropagation();const h=(x=(y=a.contentRef)==null?void 0:y.current)==null?void 0:x.querySelectorAll("[data-tgph-combobox-option]");document.activeElement===(h==null?void 0:h[0])&&ae.includes(l.key)&&((R=(f=a.searchRef)==null?void 0:f.current)==null||R.focus())},children:s.jsx(j.Stack,{direction:"column",gap:"1",tgphRef:n,children:r})})})})},pe=({...t})=>{const r=i.useContext(v);return s.jsx(j.Stack,{id:r.contentId,direction:"column",gap:"1",style:{overflowY:"auto",maxHeight:"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))"},role:"listbox",...t})},H=({value:t,label:r,selected:e,onSelect:p,children:a,...u})=>{const o=i.useContext(v),[n,c]=i.useState(!1),g=o.value,m=!o.searchQuery||ne({label:(r==null?void 0:r.toString())||(a==null?void 0:a.toString()),value:t,searchQuery:o.searchQuery}),b=T(g)?g.some(l=>S(l,o.legacyBehavior)===t):S(g,o.legacyBehavior)===t,d=l=>{var y,x;l.stopPropagation();const h=l;if(!(h.key&&!F.includes(h.key))){if(l.preventDefault(),o.closeOnSelect===!0&&o.setOpen(!1),p)return p(l);if(E(g)){const f=o.onValueChange;o.legacyBehavior===!0?f==null||f({value:t,label:r}):f==null||f(t)}else if(T(g)){const f=o.onValueChange,R=o.value,A=b?R.filter(P=>S(P,o.legacyBehavior)!==t):[...R,o.legacyBehavior===!0?{value:t,label:r}:t];f==null||f(A)}(x=(y=o.triggerRef)==null?void 0:y.current)==null||x.focus()}};if(m)return s.jsx(B.Menu.Button,{type:"button",onSelect:d,onKeyDown:d,selected:e===null?null:e??b,onFocus:()=>c(!0),onBlur:()=>c(!1),role:"option","aria-selected":b?"true":"false","data-tgph-combobox-option":!0,"data-tgph-combobox-option-focused":n,"data-tgph-combobox-option-value":t,"data-tgph-combobox-option-label":r,...u,children:r||a||t})},ge=({label:t="Search",placeholder:r="Search",tgphRef:e,value:p,onValueChange:a,...u})=>{var b;const o=i.useId(),n=i.useContext(v),c=V.useComposedRefs(e,n.searchRef),g=p??n.searchQuery,m=a??n.setSearchQuery;return i.useEffect(()=>{var h;const d=y=>{var x,f;re.includes(y.key)&&((f=(x=n.contentRef)==null?void 0:x.current)==null||f.focus({preventScroll:!0})),y.key==="Escape"&&n.setOpen(!1),y.stopPropagation()},l=(h=n.searchRef)==null?void 0:h.current;if(l)return l.addEventListener("keydown",d),()=>{l.removeEventListener("keydown",d)}},[n]),s.jsxs(j.Box,{borderBottom:"px",px:"1",pb:"1",children:[s.jsx(ee.Root,{children:s.jsx(Q.Text,{as:"label",htmlFor:o,children:t})}),s.jsx(W.Input,{id:o,variant:"ghost",placeholder:r,value:g,onChange:d=>{m(d.target.value)},LeadingComponent:s.jsx(C.Icon,{icon:C.Lucide.Search,alt:"Search Icon"}),TrailingComponent:n!=null&&n.searchQuery&&((b=n==null?void 0:n.searchQuery)==null?void 0:b.length)>0?s.jsx(k.Button,{variant:"ghost",color:"gray",icon:{icon:C.Lucide.X,alt:"Clear Search Query"},onClick:()=>{var d;return(d=n.setSearchQuery)==null?void 0:d.call(n,"")}}):null,autoFocus:!0,"data-tgph-combobox-search":!0,"aria-controls":n.contentId,...u,tgphRef:c})]})},he=({icon:t={icon:C.Lucide.Search,alt:"Search Icon"},message:r="No results found",children:e,...p})=>{const a=i.useContext(v),[u,o]=i.useState(!1);if(i.useEffect(()=>{var c,g;const n=(g=(c=a.contentRef)==null?void 0:c.current)==null?void 0:g.querySelectorAll("[data-tgph-combobox-option]");(n==null?void 0:n.length)===0?o(!0):o(!1)},[a.searchQuery,a.contentRef,e]),u)return s.jsxs(j.Stack,{gap:"1",align:"center",justify:"center",w:"full",my:"8","data-tgph-combobox-empty":!0,...p,children:[t===null?s.jsx(s.Fragment,{}):s.jsx(C.Icon,{...t}),r===null?s.jsx(s.Fragment,{}):s.jsx(Q.Text,{as:"span",children:r})]})},fe=({leadingText:t="Create",values:r,onCreate:e,selected:p=null,legacyBehavior:a=!1,...u})=>{const o=i.useContext(v),n=i.useCallback(c=>!r||(r==null?void 0:r.length)===0?!1:r.some(g=>S(g,a)===c),[r,a]);if(o.searchQuery&&!n(o.searchQuery))return s.jsx(H,{leadingIcon:{icon:C.Lucide.Plus,"aria-hidden":!0},mx:"1",value:o.searchQuery,label:`${t} "${o.searchQuery}"`,selected:p,onSelect:()=>{var c;if(e&&o.value&&o.searchQuery){const g=a===!0?{value:o.searchQuery}:o.searchQuery;e(g),(c=o.setSearchQuery)==null||c.call(o,"")}},...u})},_={};Object.assign(_,{Root:se,Trigger:le,Content:ue,Options:pe,Option:H,Search:ge,Empty:he,Create:fe});exports.Combobox=_;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),G=require("@radix-ui/react-dismissable-layer"),N=require("@radix-ui/react-portal"),Y=require("@radix-ui/react-use-controllable-state"),U=require("@radix-ui/react-visually-hidden"),k=require("@telegraph/button"),V=require("@telegraph/compose-refs"),X=require("@telegraph/helpers"),C=require("@telegraph/icon"),W=require("@telegraph/input"),j=require("@telegraph/layout"),B=require("@telegraph/menu"),w=require("@telegraph/motion"),D=require("@telegraph/tag"),J=require("@telegraph/tooltip"),Q=require("@telegraph/typography"),i=require("react");function M(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const p=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(r,e,p.get?p:{enumerable:!0,get:()=>t[e]})}}return r.default=t,Object.freeze(r)}const Z=M(N),ee=M(U),te={0:"5",1:"6",2:"8",3:"10"},T=t=>Array.isArray(t),E=t=>typeof t=="object"&&!Array.isArray(t)||typeof t=="string"||!t,oe=t=>{const r=(a,u=[])=>(i.Children.toArray(a).forEach(n=>{i.isValidElement(n)&&(n.props.value?u.push(n):n.props.children&&r(n.props.children,u))}),u);return r(t).map(a=>{var o;const u=a;return{value:u.props.value,label:((o=u.props)==null?void 0:o.label)||u.props.children||u.props.value}})},S=(t,r)=>{if(t)return r===!0?t==null?void 0:t.value:t},L=(t,r,e)=>{if(t&&!(!r||r.length===0))return r.find(p=>p.value===S(t,e))},ne=({label:t,value:r,searchQuery:e})=>(r==null?void 0:r.toLowerCase().includes(e.toLowerCase()))||(t==null?void 0:t.toLowerCase().includes(e.toLowerCase())),re=["ArrowDown","PageUp","Home"],ae=["ArrowUp","PageDown","End"],F=["Enter"," "],v=i.createContext({value:void 0,onValueChange:()=>{},contentId:"",triggerId:"",open:!1,setOpen:()=>{},onOpenToggle:()=>{},clearable:!1,disabled:!1,options:[],legacyBehavior:!1}),se=({modal:t=!0,closeOnSelect:r=!0,clearable:e=!1,disabled:p=!1,legacyBehavior:a=!1,open:u,onOpenChange:o,defaultOpen:n,value:c,onValueChange:g,errored:m,placeholder:b,layout:d,children:l,...f})=>{const y=i.useId(),x=i.useId(),h=i.useRef(null),R=i.useRef(null),A=i.useRef(null),P=i.useMemo(()=>oe(l),[l]),[K,q]=i.useState(""),[O=!1,I]=Y.useControllableState({prop:u,defaultProp:n,onChange:o}),z=i.useCallback(()=>{I($=>!$)},[I]);return i.useEffect(()=>{O||q("")},[O]),s.jsx(v.Provider,{value:{contentId:y,triggerId:x,value:c,onValueChange:g,placeholder:b,open:O,setOpen:I,onOpenToggle:z,closeOnSelect:r,clearable:e,disabled:p,searchQuery:K,setSearchQuery:q,triggerRef:h,searchRef:R,contentRef:A,errored:m,layout:d,options:P,legacyBehavior:a},children:s.jsx(B.Menu.Root,{open:O,onOpenChange:I,modal:t,...f,children:l})})},ie=({value:t,...r})=>{const e=i.useContext(v),p=i.useMemo(()=>{const a=e.options.find(n=>n.value===t);if(a)return a.label||a.value;if(!e.value)return;const o=e.value.find(n=>S(n,e.legacyBehavior)===t);if(o)return o},[e.options,e.value,t,e.legacyBehavior]);return s.jsxs(D.Tag.Root,{as:w.motion.span,initializeWithAnimation:!1,initial:{opacity:0,scale:.5},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.5},transition:{duration:100,type:"spring"},"tgph-motion-key":t,size:"1",layout:"position",...r,children:[s.jsx(D.Tag.Text,{children:p}),s.jsx(D.Tag.Button,{icon:{icon:C.Lucide.X,alt:`Remove ${t}`},onClick:a=>{if(!e.onValueChange)return;const u=e.onValueChange,n=e.value.filter(c=>S(c,e.legacyBehavior)!==t);u==null||u(n),a.stopPropagation(),a.preventDefault()}})]})},ce=()=>{const t=i.useContext(v);if(t.value&&T(t.value)){const r=t.layout||"truncate",e=t.value.length-2,p=e.toString().split("");return t.value.length===0?s.jsx(k.Button.Text,{color:"gray",children:t.placeholder}):s.jsxs(j.Stack,{gap:"1",w:"full",wrap:r==="wrap"?"wrap":"nowrap",align:"center",style:{position:"relative",flexGrow:1},children:[s.jsx(w.AnimatePresence,{presenceMap:t.value.map(a=>({"tgph-motion-key":S(a,t.legacyBehavior)||"",value:!0})),children:t.value.map((a,u)=>{const o=S(a,t.legacyBehavior);if(o&&(r==="truncate"&&u<=1||r==="wrap"))return s.jsx(X.RefToTgphRef,{children:s.jsx(ie,{value:o})},o)})}),s.jsx(w.AnimatePresence,{presenceMap:[{"tgph-motion-key":"combobox-more",value:!0}],children:r==="truncate"&&t.value.length>2&&s.jsx(j.Stack,{as:w.motion.div,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:100,type:"spring"},h:"full",pr:"1",pl:"8",align:"center","aria-label":`${e} more selected`,position:"absolute",right:"0",style:{backgroundImage:"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)"},children:s.jsxs(Q.Text,{as:"span",size:"1",style:{whiteSpace:"nowrap"},children:["+",s.jsxs(w.AnimatePresence,{presenceMap:p.map(a=>({"tgph-motion-key":a,value:!0})),children:[p.map(a=>s.jsx(j.Box,{as:w.motion.span,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:100,type:"spring"},w:"2",display:"inline-block","tgph-motion-key":a,children:a},a))," "]}),"more"]})})})]})}if(t&&E(t.value)){const r=L(t.value,t.options,t.legacyBehavior);return s.jsx(k.Button.Text,{color:t.value?"default":"gray",children:(r==null?void 0:r.label)||t.placeholder})}},le=({size:t="2",...r})=>{const e=i.useContext(v),p=i.useCallback(()=>{var o;if(!e.value)return e.placeholder;if(E(e.value)){const n=L(e.value,e.options,e.legacyBehavior);return(n==null?void 0:n.label)||e.placeholder}if(T(e.value))return((o=e.value)==null?void 0:o.map(n=>{const c=L(n,e.options,e.legacyBehavior);return c==null?void 0:c.label}).join(", "))||e.placeholder},[e.value,e.placeholder,e.options,e.legacyBehavior]),a=i.useMemo(()=>{var o;if(E(e.value))return e.clearable&&e.value;if(T(e.value))return e.clearable&&((o=e.value)==null?void 0:o.length)>0},[e.clearable,e.value]),u=()=>{var o,n;if(T(e.value)){const c=e.onValueChange;c==null||c([])}if(E(e.value)){const c=e.onValueChange;c==null||c(void 0)}(n=(o=e.triggerRef)==null?void 0:o.current)==null||n.focus()};return s.jsx(B.Menu.Trigger,{...r,asChild:!0,onClick:o=>{var n,c;o.preventDefault(),e.onOpenToggle(),(c=(n=e.triggerRef)==null?void 0:n.current)==null||c.focus()},onKeyDown:o=>{if(o.key==="Tab"){o.stopPropagation();return}if(F.includes(o.key)){o.preventDefault();return}if(o.key==="ArrowDown"){o.stopPropagation(),o.preventDefault(),e.onOpenToggle();return}},tgphRef:e.triggerRef,children:s.jsxs(k.Button.Root,{id:e.triggerId,type:"button",bg:"surface-1",variant:"outline",align:"center",minH:te[t],h:"full",w:"full",py:"1",size:t,color:e.errored?"red":"gray",justify:"space-between",role:"combobox","aria-label":p(),"aria-controls":e.contentId,"aria-expanded":e.open,"aria-haspopup":"listbox","data-tgph-combobox-trigger":!0,"data-tgph-comobox-trigger-open":e.open,disabled:e.disabled,children:[s.jsx(ce,{}),s.jsxs(j.Stack,{align:"center",gap:"1",children:[a&&s.jsx(J.Tooltip,{label:"Clear field",children:s.jsx(k.Button,{type:"button",icon:{icon:C.Lucide.X,alt:"Clear field"},size:"1",variant:"ghost",onClick:o=>{e.value&&(o.stopPropagation(),u())},onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.stopPropagation(),u())},"data-tgph-combobox-clear":!0,style:{marginTop:"calc(-1 * var(--tgph-spacing-1)",marginBottom:"calc(-1 * var(--tgph-spacing-1)"}})}),s.jsx(k.Button.Icon,{as:w.motion.span,animate:{rotate:e.open?180:0},transition:{duration:150,type:"spring"},icon:C.Lucide.ChevronDown,"aria-hidden":!0})]})]})})},ue=({style:t,children:r,tgphRef:e,...p})=>{const a=i.useContext(v),u=i.useRef(!1),o=V.useComposedRefs(e,a.contentRef),n=i.useRef(null),[c,g]=i.useState(0),[m,b]=i.useState(!1),d=i.useCallback(l=>{const f=l==null?void 0:l.getBoundingClientRect();f&&g(f.height),m||b(!0)},[m]);return i.useEffect(()=>{const l=new ResizeObserver(f=>{for(const y of f){const x=y.target;d(x)}});return n.current&&m&&l.observe(n.current),()=>l.disconnect()},[m,d]),i.useEffect(()=>{m===!0&&a.open===!1&&b(!1)},[a.open,m]),i.useEffect(()=>{let l;return a.open&&(l=setTimeout(()=>{d(n.current)},10)),()=>l&&clearTimeout(l)},[a.open,d]),s.jsx(Z.Root,{asChild:!0,children:s.jsx(G.DismissableLayer,{onEscapeKeyDown:l=>{a.open&&(l.stopPropagation(),l.preventDefault(),a.setOpen(!1))},children:s.jsx(B.Menu.Content,{className:"tgph",mt:"1",onCloseAutoFocus:l=>{var f,y;u.current||(y=(f=a.triggerRef)==null?void 0:f.current)==null||y.focus(),u.current=!1,l.preventDefault()},bg:"surface-1",style:{width:"var(--tgph-comobobox-trigger-width)",transition:"min-height 200ms ease-in-out",minHeight:c?`${c}px`:"0",...t,"--tgph-comobobox-content-transform-origin":"var(--radix-popper-transform-origin)","--tgph-combobox-content-available-width":"var(--radix-popper-available-width)","--tgph-combobox-content-available-height":"calc(var(--radix-popper-available-height) - var(--tgph-spacing-8))","--tgph-comobobox-trigger-width":"var(--radix-popper-anchor-width)","--tgph-combobox-trigger-height":"var(--radix-popper-anchor-height)"},...p,tgphRef:o,"data-tgph-combobox-content":!0,"data-tgph-combobox-content-open":a.open,role:void 0,"aria-orientation":void 0,onKeyDown:l=>{var y,x,h,R;l.stopPropagation();const f=(x=(y=a.contentRef)==null?void 0:y.current)==null?void 0:x.querySelectorAll("[data-tgph-combobox-option]");document.activeElement===(f==null?void 0:f[0])&&ae.includes(l.key)&&((R=(h=a.searchRef)==null?void 0:h.current)==null||R.focus())},children:s.jsx(j.Stack,{direction:"column",gap:"1",tgphRef:n,children:r})})})})},pe=({...t})=>{const r=i.useContext(v);return s.jsx(j.Stack,{id:r.contentId,direction:"column",gap:"1",style:{overflowY:"auto",maxHeight:"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))"},role:"listbox",...t})},H=({value:t,label:r,selected:e,onSelect:p,children:a,...u})=>{const o=i.useContext(v),[n,c]=i.useState(!1),g=o.value,m=!o.searchQuery||ne({label:(r==null?void 0:r.toString())||(a==null?void 0:a.toString()),value:t,searchQuery:o.searchQuery}),b=T(g)?g.some(l=>S(l,o.legacyBehavior)===t):S(g,o.legacyBehavior)===t,d=l=>{var y,x;l.stopPropagation();const f=l;if(!(f.key&&!F.includes(f.key))){if(l.preventDefault(),o.closeOnSelect===!0&&o.setOpen(!1),p)return p(l);if(E(g)){const h=o.onValueChange;o.legacyBehavior===!0?h==null||h({value:t,label:r}):h==null||h(t)}else if(T(g)){const h=o.onValueChange,R=o.value,A=b?R.filter(P=>S(P,o.legacyBehavior)!==t):[...R,o.legacyBehavior===!0?{value:t,label:r}:t];h==null||h(A)}(x=(y=o.triggerRef)==null?void 0:y.current)==null||x.focus()}};if(m)return s.jsx(B.Menu.Button,{type:"button",onSelect:d,onKeyDown:d,selected:e===null?null:e??b,onFocus:()=>c(!0),onBlur:()=>c(!1),role:"option","aria-selected":b?"true":"false","data-tgph-combobox-option":!0,"data-tgph-combobox-option-focused":n,"data-tgph-combobox-option-value":t,"data-tgph-combobox-option-label":r,...u,children:r||a||t})},ge=({label:t="Search",placeholder:r="Search",tgphRef:e,value:p,onValueChange:a,...u})=>{var b;const o=i.useId(),n=i.useContext(v),c=V.useComposedRefs(e,n.searchRef),g=p??n.searchQuery,m=a??n.setSearchQuery;return i.useEffect(()=>{var f;const d=y=>{var x,h;re.includes(y.key)&&((h=(x=n.contentRef)==null?void 0:x.current)==null||h.focus({preventScroll:!0})),y.key==="Escape"&&n.setOpen(!1),y.stopPropagation()},l=(f=n.searchRef)==null?void 0:f.current;if(l)return l.addEventListener("keydown",d),()=>{l.removeEventListener("keydown",d)}},[n]),s.jsxs(j.Box,{borderBottom:"px",px:"1",pb:"1",children:[s.jsx(ee.Root,{children:s.jsx(Q.Text,{as:"label",htmlFor:o,children:t})}),s.jsx(W.Input,{id:o,variant:"ghost",placeholder:r,value:g,onChange:d=>{m(d.target.value)},LeadingComponent:s.jsx(C.Icon,{icon:C.Lucide.Search,alt:"Search Icon"}),TrailingComponent:n!=null&&n.searchQuery&&((b=n==null?void 0:n.searchQuery)==null?void 0:b.length)>0?s.jsx(k.Button,{variant:"ghost",color:"gray",icon:{icon:C.Lucide.X,alt:"Clear Search Query"},onClick:()=>{var d;return(d=n.setSearchQuery)==null?void 0:d.call(n,"")}}):null,autoFocus:!0,"data-tgph-combobox-search":!0,"aria-controls":n.contentId,...u,tgphRef:c})]})},fe=({icon:t={icon:C.Lucide.Search,alt:"Search Icon"},message:r="No results found",children:e,...p})=>{const a=i.useContext(v),[u,o]=i.useState(!1);if(i.useEffect(()=>{var c,g;const n=(g=(c=a.contentRef)==null?void 0:c.current)==null?void 0:g.querySelectorAll("[data-tgph-combobox-option]");(n==null?void 0:n.length)===0?o(!0):o(!1)},[a.searchQuery,a.contentRef,e]),u)return s.jsxs(j.Stack,{gap:"1",align:"center",justify:"center",w:"full",my:"8","data-tgph-combobox-empty":!0,...p,children:[t===null?s.jsx(s.Fragment,{}):s.jsx(C.Icon,{...t}),r===null?s.jsx(s.Fragment,{}):s.jsx(Q.Text,{as:"span",children:r})]})},he=({leadingText:t="Create",values:r,onCreate:e,selected:p=null,legacyBehavior:a=!1,...u})=>{const o=i.useContext(v),n=i.useCallback(c=>!r||(r==null?void 0:r.length)===0?!1:r.some(g=>S(g,a)===c),[r,a]);if(o.searchQuery&&!n(o.searchQuery))return s.jsx(H,{leadingIcon:{icon:C.Lucide.Plus,"aria-hidden":!0},mx:"1",value:o.searchQuery,label:`${t} "${o.searchQuery}"`,selected:p,onSelect:()=>{var c;if(e&&o.value&&o.searchQuery){const g=a===!0?{value:o.searchQuery}:o.searchQuery;e(g),(c=o.setSearchQuery)==null||c.call(o,"")}},...u})},_={};Object.assign(_,{Root:se,Trigger:le,Content:ue,Options:pe,Option:H,Search:ge,Empty:fe,Create:he});exports.Combobox=_;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/Combobox/Combobox.constants.ts","../../src/Combobox/Combobox.helpers.ts","../../src/Combobox/Combobox.tsx"],"sourcesContent":["export const TRIGGER_MIN_HEIGHT = {\n \"0\": \"5\",\n \"1\": \"6\",\n \"2\": \"8\",\n \"3\": \"10\",\n};\n","import React from \"react\";\n\nexport type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | string | React.ReactNode;\nexport const isMultiSelect = (\n value: Option | Array<Option> | undefined,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option> | undefined,\n): value is Option => {\n return (\n (typeof value === \"object\" && !Array.isArray(value)) ||\n typeof value === \"string\" ||\n !value\n );\n};\n\nexport const getOptions = (children: React.ReactNode): Array<DefinedOption> => {\n const recursivelyFindOptionElements = (\n children: React.ReactNode,\n options: Array<React.ReactNode> = [],\n ) => {\n const childrenArray = React.Children.toArray(children);\n\n childrenArray.forEach((child) => {\n if (React.isValidElement(child)) {\n if (child.props.value) {\n // If it has a value prop, it's an option\n options.push(child);\n } else if (child.props.children) {\n // If it has children, recursively search them\n recursivelyFindOptionElements(child.props.children, options);\n }\n }\n });\n\n return options;\n };\n\n const optionElements = recursivelyFindOptionElements(children);\n\n const options = optionElements.map((_element) => {\n const element = _element as React.ReactElement<{\n value: string;\n label?: string | React.ReactNode;\n children?: React.ReactNode;\n }>;\n return {\n value: element.props.value,\n label:\n element.props?.label || element.props.children || element.props.value,\n };\n });\n\n return options;\n};\n\nexport const getValueFromOption = (\n option: Option | undefined,\n legacyBehavior: boolean,\n): string | undefined => {\n if (!option) return undefined;\n\n if (legacyBehavior === true) {\n return (option as DefinedOption)?.value;\n }\n\n return option as string;\n};\n\nexport const getCurrentOption = (\n value: Option | undefined,\n options: Array<DefinedOption>,\n legacyBehavior: boolean,\n): DefinedOption | undefined => {\n if (!value) return undefined;\n if (!options || options.length === 0) return undefined;\n return options.find(\n (o) => o.value === getValueFromOption(value, legacyBehavior),\n );\n};\n\ntype DoesOptionMatchSearchQueryProps = {\n label?: string;\n value?: string;\n searchQuery: string;\n};\n\nexport const doesOptionMatchSearchQuery = ({\n label,\n value,\n searchQuery,\n}: DoesOptionMatchSearchQueryProps) => {\n return (\n value?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n label?.toLowerCase().includes(searchQuery.toLowerCase())\n );\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport * as Portal from \"@radix-ui/react-portal\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { Button as TelegraphButton } from \"@telegraph/button\";\nimport { useComposedRefs } from \"@telegraph/compose-refs\";\nimport {\n RefToTgphRef,\n type TgphComponentProps,\n type TgphElement,\n} from \"@telegraph/helpers\";\nimport { Icon, Lucide } from \"@telegraph/icon\";\nimport { Input as TelegraphInput } from \"@telegraph/input\";\nimport { Box, Stack } from \"@telegraph/layout\";\nimport { Menu as TelegraphMenu } from \"@telegraph/menu\";\nimport { AnimatePresence, motion } from \"@telegraph/motion\";\nimport { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\n doesOptionMatchSearchQuery,\n getCurrentOption,\n getOptions,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\n\nconst FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nconst LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nconst SELECT_KEYS = [\"Enter\", \" \"];\n\ntype SingleSelect = {\n value?: Option;\n onValueChange?: (value: Option | undefined) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O> = O extends DefinedOption | string | undefined\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n> = {\n value?: O;\n onValueChange?: (value: O) => void;\n layout?: LayoutValue<O>;\n open?: boolean;\n defaultOpen?: boolean;\n errored?: boolean;\n placeholder?: string;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n closeOnSelect?: boolean;\n clearable?: boolean;\n disabled?: boolean;\n legacyBehavior?: LB;\n children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<\n RootProps<(Option | Array<Option>) | (string | Array<string>), boolean>,\n \"children\"\n > & {\n contentId: string;\n triggerId: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n onOpenToggle: () => void;\n searchQuery?: string;\n setSearchQuery?: (query: string) => void;\n triggerRef?: React.RefObject<HTMLDivElement>;\n searchRef?: React.RefObject<HTMLInputElement>;\n contentRef?: React.RefObject<HTMLDivElement>;\n options: Array<DefinedOption>;\n legacyBehavior: boolean;\n }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n options: [],\n legacyBehavior: false,\n});\n\nconst Root = <\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n legacyBehavior = false as LB,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n children,\n ...props\n}: RootProps<O, LB>) => {\n const contentId = React.useId();\n const triggerId = React.useId();\n const triggerRef = React.useRef(null);\n const searchRef = React.useRef(null);\n const contentRef = React.useRef<HTMLDivElement>(null);\n\n const options = React.useMemo(() => {\n return getOptions(children);\n }, [children]);\n\n const [searchQuery, setSearchQuery] = React.useState<string>(\"\");\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpenProp,\n onChange: onOpenChangeProp,\n });\n\n const onOpenToggle = React.useCallback(() => {\n setOpen((prevOpen) => !prevOpen);\n }, [setOpen]);\n\n React.useEffect(() => {\n // If the combobox is closed clear\n // the search query\n if (!open) {\n setSearchQuery(\"\");\n }\n }, [open]);\n\n return (\n <ComboboxContext.Provider\n value={{\n contentId,\n triggerId,\n value,\n // Need to cast this to avoid type errors\n // because the type of onValueChange is not\n // consistent with the value type\n onValueChange: onValueChange as (value: Option | Array<Option>) => void,\n placeholder,\n open,\n setOpen,\n onOpenToggle,\n closeOnSelect,\n clearable,\n disabled,\n searchQuery,\n setSearchQuery,\n triggerRef,\n searchRef,\n contentRef,\n errored,\n layout,\n options,\n legacyBehavior,\n }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n >\n {children}\n </TelegraphMenu.Root>\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n const option = React.useMemo(() => {\n // Find option amongst other options\n const foundOption = context.options.find((o) => o.value === value);\n if (foundOption) return foundOption.label || foundOption.value;\n\n // Find option amongst the current values in the case of creation\n if (!context.value) return undefined;\n const contextValue = context.value as Array<Option>;\n\n const foundValue = contextValue.find(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n );\n\n if (foundValue) return foundValue;\n }, [context.options, context.value, value, context.legacyBehavior]);\n\n return (\n <Tag.Root\n as={motion.span}\n initializeWithAnimation={false}\n initial={{ opacity: 0, scale: 0.5 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.5 }}\n transition={{ duration: 100, type: \"spring\" }}\n tgph-motion-key={value}\n size=\"1\"\n layout=\"position\"\n {...props}\n >\n <Tag.Text>{option}</Tag.Text>\n <Tag.Button\n icon={{ icon: Lucide.X, alt: `Remove ${value}` }}\n onClick={(event: React.MouseEvent) => {\n if (!context.onValueChange) return;\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = contextValue.filter((v) => {\n const valueOption = getValueFromOption(v, context.legacyBehavior);\n return valueOption !== value;\n });\n\n onValueChange?.(newValue);\n // Stop click event from bubbling up\n event.stopPropagation();\n // Stop the button \"submit\" action from triggering\n event.preventDefault();\n }}\n />\n </Tag.Root>\n );\n};\n\nconst TriggerValue = () => {\n const context = React.useContext(ComboboxContext);\n\n if (context.value && isMultiSelect(context.value)) {\n const layout = context.layout || \"truncate\";\n const truncatedLength = context.value.length - 2;\n const truncatedLengthStringArray = truncatedLength.toString().split(\"\");\n\n if (context.value.length === 0) {\n return (\n <TelegraphButton.Text color=\"gray\">\n {context.placeholder}\n </TelegraphButton.Text>\n );\n }\n return (\n <Stack\n gap=\"1\"\n w=\"full\"\n wrap={layout === \"wrap\" ? \"wrap\" : \"nowrap\"}\n align=\"center\"\n style={{\n position: \"relative\",\n flexGrow: 1,\n }}\n >\n <AnimatePresence\n presenceMap={context.value.map((v) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n return {\n \"tgph-motion-key\": value || \"\",\n value: true,\n };\n })}\n >\n {context.value.map((v, i) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n if (\n value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={value}>\n <TriggerTag value={value} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence\n presenceMap={[\n {\n \"tgph-motion-key\": \"combobox-more\",\n value: true,\n },\n ]}\n >\n {layout === \"truncate\" && context.value.length > 2 && (\n <Stack\n as={motion.div}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n position=\"absolute\"\n right=\"0\"\n style={{\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence\n presenceMap={truncatedLengthStringArray.map((n) => ({\n \"tgph-motion-key\": n,\n value: true,\n }))}\n >\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n w=\"2\"\n display=\"inline-block\"\n tgph-motion-key={n}\n key={n}\n >\n {n}\n </Box>\n ))}{\" \"}\n </AnimatePresence>\n more\n </Text>\n </Stack>\n )}\n </AnimatePresence>\n </Stack>\n );\n }\n\n if (context && isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {currentOption?.label || context.placeholder}\n </TelegraphButton.Text>\n );\n }\n};\n\ntype TriggerProps = React.ComponentProps<typeof TelegraphMenu.Trigger> & {\n placeholder?: string;\n size?: TgphComponentProps<typeof TelegraphButton.Root>[\"size\"];\n};\n\nconst Trigger = ({ size = \"2\", ...props }: TriggerProps) => {\n const context = React.useContext(ComboboxContext);\n\n const getAriaLabelString = React.useCallback(() => {\n if (!context.value) return context.placeholder;\n if (isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return currentOption?.label || context.placeholder;\n }\n if (isMultiSelect(context.value)) {\n return (\n context.value\n ?.map((v) => {\n const currentOption = getCurrentOption(\n v,\n context.options,\n context.legacyBehavior,\n );\n\n return currentOption?.label;\n })\n .join(\", \") || context.placeholder\n );\n }\n }, [\n context.value,\n context.placeholder,\n context.options,\n context.legacyBehavior,\n ]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\n }\n\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n }, [context.clearable, context.value]);\n\n const handleClear = () => {\n if (isMultiSelect(context.value)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n onValueChange?.([]);\n }\n\n if (isSingleSelect(context.value)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n onValueChange?.(undefined);\n }\n context.triggerRef?.current?.focus();\n };\n\n return (\n <TelegraphMenu.Trigger\n {...props}\n asChild\n onClick={(event: React.MouseEvent) => {\n event.preventDefault();\n context.onOpenToggle();\n context.triggerRef?.current?.focus();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Lets the user tab in and out of the combobox as usual\n if (event.key === \"Tab\") {\n event.stopPropagation();\n return;\n }\n if (SELECT_KEYS.includes(event.key)) {\n event.preventDefault();\n return;\n }\n\n if (event.key === \"ArrowDown\") {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.onOpenToggle();\n return;\n }\n }}\n tgphRef={context.triggerRef}\n >\n <TelegraphButton.Root\n id={context.triggerId}\n type=\"button\"\n bg=\"surface-1\"\n variant=\"outline\"\n align=\"center\"\n minH={TRIGGER_MIN_HEIGHT[size]}\n h=\"full\"\n w=\"full\"\n py=\"1\"\n size={size}\n color={context.errored ? \"red\" : \"gray\"}\n justify=\"space-between\"\n // Accessibility attributes\n role=\"combobox\"\n aria-label={getAriaLabelString()}\n aria-controls={context.contentId}\n aria-expanded={context.open}\n aria-haspopup=\"listbox\"\n // Custom attributes\n data-tgph-combobox-trigger\n data-tgph-comobox-trigger-open={context.open}\n disabled={context.disabled}\n >\n <TriggerValue />\n <Stack align=\"center\" gap=\"1\">\n {shouldShowClearable && (\n <Tooltip label=\"Clear field\">\n <TelegraphButton\n type=\"button\"\n icon={{ icon: Lucide.X, alt: \"Clear field\" }}\n size=\"1\"\n variant=\"ghost\"\n onClick={(event: React.MouseEvent) => {\n if (!context.value) return;\n event.stopPropagation();\n handleClear();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.stopPropagation();\n handleClear();\n }\n }}\n data-tgph-combobox-clear\n style={{\n // Remove margin to make the clear button flush\n // with the trigger button\n marginTop: \"calc(-1 * var(--tgph-spacing-1)\",\n marginBottom: \"calc(-1 * var(--tgph-spacing-1)\",\n }}\n />\n </Tooltip>\n )}\n <TelegraphButton.Icon\n as={motion.span}\n animate={{ rotate: context.open ? 180 : 0 }}\n transition={{ duration: 150, type: \"spring\" }}\n icon={Lucide.ChevronDown}\n aria-hidden\n />\n </Stack>\n </TelegraphButton.Root>\n </TelegraphMenu.Trigger>\n );\n};\n\ntype ContentProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Content<T>\n>;\n\nconst Content = <T extends TgphElement>({\n style,\n children,\n tgphRef,\n ...props\n}: ContentProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const hasInteractedOutside = React.useRef(false);\n const composedRef = useComposedRefs<unknown>(tgphRef, context.contentRef);\n\n const internalContentRef = React.useRef(null);\n\n const [height, setHeight] = React.useState(0);\n const [initialAnimationComplete, setInitialAnimationComplete] =\n React.useState(false);\n\n const setHeightFromContent = React.useCallback(\n (element: Element) => {\n // Set the initial height of the content after the animation completes\n const rect = element?.getBoundingClientRect();\n if (rect) {\n setHeight(rect.height);\n }\n\n if (!initialAnimationComplete) {\n setInitialAnimationComplete(true);\n }\n },\n [initialAnimationComplete],\n );\n\n React.useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const element = entry.target;\n setHeightFromContent(element);\n }\n });\n // Attatch the observer once the initial animation completes\n // and the content ref is available\n if (internalContentRef.current && initialAnimationComplete) {\n observer.observe(internalContentRef.current);\n }\n\n return () => observer.disconnect();\n }, [initialAnimationComplete, setHeightFromContent]);\n\n // Reset the animation complete state when the combobox is closed\n React.useEffect(() => {\n if (initialAnimationComplete === true && context.open === false) {\n setInitialAnimationComplete(false);\n }\n }, [context.open, initialAnimationComplete]);\n\n // On open, set the height of the content after the animation completes\n // we add a timeout here to ensure that the DOM element has responded to\n // the state changes first\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n if (context.open) {\n timeout = setTimeout(() => {\n setHeightFromContent(internalContentRef.current as unknown as Element);\n }, 10);\n }\n\n return () => timeout && clearTimeout(timeout);\n }, [context.open, setHeightFromContent]);\n\n return (\n <Portal.Root asChild>\n {/* \n We add radix's dismissable layer here so that we can swallow any escape\n key presses to prevent cases like a modal closing when we close the\n combobox \n */}\n <DismissableLayer\n onEscapeKeyDown={(event) => {\n if (context.open) {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.setOpen(false);\n }\n }}\n >\n <TelegraphMenu.Content\n className=\"tgph\"\n mt=\"1\"\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current) {\n context.triggerRef?.current?.focus();\n }\n\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\n bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\n transition: \"min-height 200ms ease-in-out\",\n minHeight: height ? `${height}px` : \"0\",\n ...style,\n ...{\n \"--tgph-comobobox-content-transform-origin\":\n \"var(--radix-popper-transform-origin)\",\n \"--tgph-combobox-content-available-width\":\n \"var(--radix-popper-available-width)\",\n \"--tgph-combobox-content-available-height\":\n \"calc(var(--radix-popper-available-height) - var(--tgph-spacing-8))\",\n \"--tgph-comobobox-trigger-width\":\n \"var(--radix-popper-anchor-width)\",\n \"--tgph-combobox-trigger-height\":\n \"var(--radix-popper-anchor-height)\",\n },\n }}\n {...props}\n tgphRef={composedRef}\n data-tgph-combobox-content\n data-tgph-combobox-content-open={context.open}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // If the first option is focused and the user presses the up\n // arrow key, focus the search input\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (\n document.activeElement === options?.[0] &&\n LAST_KEYS.includes(event.key)\n ) {\n context.searchRef?.current?.focus();\n }\n }}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\n </Portal.Root>\n );\n};\n\ntype OptionsProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>>;\n\nconst Options = <T extends TgphElement>({ ...props }: OptionsProps<T>) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Stack\n id={context.contentId}\n direction=\"column\"\n gap=\"1\"\n style={{\n overflowY: \"auto\",\n // Available Height - Padding from edge of screen\n maxHeight:\n \"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))\",\n }}\n // Accessibility attributes\n role=\"listbox\"\n {...props}\n />\n );\n};\n\ntype OptionProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n selected?: boolean | null;\n};\n\nconst Option = <T extends TgphElement>({\n value,\n label,\n selected,\n onSelect,\n children,\n ...props\n}: OptionProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isFocused, setIsFocused] = React.useState(false);\n const contextValue = context.value;\n\n const isVisible =\n !context.searchQuery ||\n doesOptionMatchSearchQuery({\n label: label?.toString() || children?.toString(),\n value,\n searchQuery: context.searchQuery,\n });\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n )\n : getValueFromOption(contextValue, context.legacyBehavior) === value;\n\n const handleSelection = (event: Event | React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // Don't do anything if the key isn't a selection key\n const keyboardEvent = event as React.KeyboardEvent;\n if (keyboardEvent.key && !SELECT_KEYS.includes(keyboardEvent.key)) return;\n\n // Don't bubble up the event\n event.preventDefault();\n\n if (context.closeOnSelect === true) {\n context.setOpen(false);\n }\n\n if (onSelect) {\n // Need to convert to non keyboard type event\n // since onSelect is expecting a mouse event\n // and we've handled the keyboard event already\n const onSelectEvent = event as unknown as Event;\n return onSelect(onSelectEvent);\n }\n\n if (isSingleSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n\n // TODO: Remove this once { value, label } option is deprecated\n if (context.legacyBehavior === true) {\n onValueChange?.({ value, label });\n } else {\n onValueChange?.(value);\n }\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = isSelected\n ? contextValue.filter(\n (v) => getValueFromOption(v, context.legacyBehavior) !== value,\n )\n : [\n ...contextValue,\n // TODO: Remove this once { value, label } option is deprecated\n context.legacyBehavior === true ? { value, label } : value,\n ];\n\n onValueChange?.(newValue);\n }\n\n context.triggerRef?.current?.focus();\n };\n\n if (isVisible) {\n return (\n <TelegraphMenu.Button\n type=\"button\"\n onSelect={handleSelection}\n onKeyDown={handleSelection}\n // Force null if selected equals null so we\n // can override the icon of the button\n selected={selected === null ? null : selected ?? isSelected}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n // Accessibility attributes\n role=\"option\"\n aria-selected={isSelected ? \"true\" : \"false\"}\n // Custom attributes\n data-tgph-combobox-option\n data-tgph-combobox-option-focused={isFocused}\n data-tgph-combobox-option-value={value}\n data-tgph-combobox-option-label={label}\n {...props}\n >\n {label || children || value}\n </TelegraphMenu.Button>\n );\n }\n};\n\ntype SearchProps = TgphComponentProps<typeof TelegraphInput> & {\n label?: string;\n};\n\nconst Search = ({\n label = \"Search\",\n placeholder = \"Search\",\n tgphRef,\n value: controlledValueProp,\n onValueChange: onValueChangeProp,\n ...props\n}: SearchProps) => {\n const id = React.useId();\n const context = React.useContext(ComboboxContext);\n const composedRef = useComposedRefs(tgphRef, context.searchRef);\n\n const value = controlledValueProp ?? context.searchQuery;\n const onValueChange = onValueChangeProp ?? context.setSearchQuery;\n\n React.useEffect(() => {\n const handleSearchKeyDown = (event: KeyboardEvent) => {\n if (FIRST_KEYS.includes(event.key)) {\n context.contentRef?.current?.focus({ preventScroll: true });\n }\n\n if (event.key === \"Escape\") {\n context.setOpen(false);\n }\n\n event.stopPropagation();\n };\n\n const searchInput = context.searchRef?.current;\n\n if (searchInput) {\n searchInput.addEventListener(\"keydown\", handleSearchKeyDown);\n return () => {\n searchInput.removeEventListener(\"keydown\", handleSearchKeyDown);\n };\n }\n }, [context]);\n\n return (\n <Box borderBottom=\"px\" px=\"1\" pb=\"1\">\n <VisuallyHidden.Root>\n <Text as=\"label\" htmlFor={id}>\n {label}\n </Text>\n </VisuallyHidden.Root>\n <TelegraphInput\n id={id}\n variant=\"ghost\"\n placeholder={placeholder}\n value={value}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n onValueChange(event.target.value);\n }}\n LeadingComponent={<Icon icon={Lucide.Search} alt=\"Search Icon\" />}\n TrailingComponent={\n context?.searchQuery && context?.searchQuery?.length > 0 ? (\n <TelegraphButton\n variant=\"ghost\"\n color=\"gray\"\n icon={{ icon: Lucide.X, alt: \"Clear Search Query\" }}\n onClick={() => context.setSearchQuery?.(\"\")}\n />\n ) : null\n }\n autoFocus\n data-tgph-combobox-search\n aria-controls={context.contentId}\n {...props}\n tgphRef={composedRef}\n />\n </Box>\n );\n};\n\ntype EmptyProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>> & {\n icon?: TgphComponentProps<typeof Icon> | null;\n message?: string | null;\n};\n\nconst Empty = <T extends TgphElement>({\n icon = { icon: Lucide.Search, alt: \"Search Icon\" },\n message = \"No results found\",\n children,\n ...props\n}: EmptyProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isVisible, setIsVisible] = React.useState(false);\n\n React.useEffect(() => {\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (options?.length === 0) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }, [context.searchQuery, context.contentRef, children]);\n\n if (isVisible) {\n return (\n <Stack\n gap=\"1\"\n align=\"center\"\n justify=\"center\"\n w=\"full\"\n my=\"8\"\n data-tgph-combobox-empty\n {...props}\n >\n {icon === null ? <></> : <Icon {...icon} />}\n {message === null ? <></> : <Text as=\"span\">{message}</Text>}\n </Stack>\n );\n }\n};\n\ntype CreateProps<\n T extends TgphElement,\n LB extends boolean,\n> = TgphComponentProps<typeof TelegraphMenu.Button<T>> & {\n leadingText?: string;\n} & (LB extends true\n ? {\n values: Array<DefinedOption>;\n onCreate: (value: { value: string; label?: string }) => void;\n legacyBehavior: true;\n }\n : {\n values?: Array<string>;\n onCreate?: (value: string) => void;\n legacyBehavior?: false;\n });\n\nconst Create = <T extends TgphElement, LB extends boolean>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n legacyBehavior = false as LB,\n ...props\n}: CreateProps<T, LB>) => {\n const context = React.useContext(ComboboxContext);\n\n const variableAlreadyExists = React.useCallback(\n (searchQuery: string | undefined) => {\n if (!values || values?.length === 0) return false;\n return values.some(\n (v) => getValueFromOption(v, legacyBehavior) === searchQuery,\n );\n },\n [values, legacyBehavior],\n );\n\n if (context.searchQuery && !variableAlreadyExists(context.searchQuery)) {\n return (\n <Option\n leadingIcon={{ icon: Lucide.Plus, \"aria-hidden\": true }}\n mx=\"1\"\n value={context.searchQuery}\n label={`${leadingText} \"${context.searchQuery}\"`}\n selected={selected}\n onSelect={() => {\n if (onCreate && context.value && context.searchQuery) {\n const value =\n legacyBehavior === true\n ? { value: context.searchQuery }\n : context.searchQuery;\n\n const create = onCreate as CreateProps<T, LB>[\"onCreate\"];\n\n create(value);\n\n context.setSearchQuery?.(\"\");\n }\n }}\n {...props}\n />\n );\n }\n};\n\nconst Combobox = {} as {\n Root: typeof Root;\n Trigger: typeof Trigger;\n Content: typeof Content;\n Options: typeof Options;\n Option: typeof Option;\n Search: typeof Search;\n Empty: typeof Empty;\n Create: typeof Create;\n};\n\nObject.assign(Combobox, {\n Root,\n Trigger,\n Content,\n Options,\n Option,\n Search,\n Empty,\n Create,\n});\n\nexport { Combobox };\n"],"names":["TRIGGER_MIN_HEIGHT","isMultiSelect","value","isSingleSelect","getOptions","children","recursivelyFindOptionElements","options","React","child","_element","element","_a","getValueFromOption","option","legacyBehavior","getCurrentOption","o","doesOptionMatchSearchQuery","label","searchQuery","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","context","foundOption","foundValue","v","jsxs","Tag","motion","Lucide","event","newValue","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","n","Box","currentOption","Trigger","size","getAriaLabelString","shouldShowClearable","handleClear","_b","Tooltip","Content","style","tgphRef","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","rect","observer","entries","entry","timeout","Portal","DismissableLayer","_d","_c","Options","Option","selected","onSelect","isFocused","setIsFocused","contextValue","isVisible","isSelected","handleSelection","keyboardEvent","Search","controlledValueProp","onValueChangeProp","id","handleSearchKeyDown","searchInput","VisuallyHidden","TelegraphInput","Icon","Empty","icon","message","setIsVisible","Fragment","Create","leadingText","values","onCreate","variableAlreadyExists","Combobox"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/Combobox/Combobox.constants.ts","../../src/Combobox/Combobox.helpers.ts","../../src/Combobox/Combobox.tsx"],"sourcesContent":["export const TRIGGER_MIN_HEIGHT = {\n \"0\": \"5\",\n \"1\": \"6\",\n \"2\": \"8\",\n \"3\": \"10\",\n};\n","import React from \"react\";\n\nexport type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | string | React.ReactNode;\nexport const isMultiSelect = (\n value: Option | Array<Option> | undefined,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option> | undefined,\n): value is Option => {\n return (\n (typeof value === \"object\" && !Array.isArray(value)) ||\n typeof value === \"string\" ||\n !value\n );\n};\n\nexport const getOptions = (children: React.ReactNode): Array<DefinedOption> => {\n const recursivelyFindOptionElements = (\n children: React.ReactNode,\n options: Array<React.ReactNode> = [],\n ) => {\n const childrenArray = React.Children.toArray(children);\n\n childrenArray.forEach((child) => {\n if (React.isValidElement(child)) {\n if (child.props.value) {\n // If it has a value prop, it's an option\n options.push(child);\n } else if (child.props.children) {\n // If it has children, recursively search them\n recursivelyFindOptionElements(child.props.children, options);\n }\n }\n });\n\n return options;\n };\n\n const optionElements = recursivelyFindOptionElements(children);\n\n const options = optionElements.map((_element) => {\n const element = _element as React.ReactElement<{\n value: string;\n label?: string | React.ReactNode;\n children?: React.ReactNode;\n }>;\n return {\n value: element.props.value,\n label:\n element.props?.label || element.props.children || element.props.value,\n };\n });\n\n return options;\n};\n\nexport const getValueFromOption = (\n option: Option | undefined,\n legacyBehavior: boolean,\n): string | undefined => {\n if (!option) return undefined;\n\n if (legacyBehavior === true) {\n return (option as DefinedOption)?.value;\n }\n\n return option as string;\n};\n\nexport const getCurrentOption = (\n value: Option | undefined,\n options: Array<DefinedOption>,\n legacyBehavior: boolean,\n): DefinedOption | undefined => {\n if (!value) return undefined;\n if (!options || options.length === 0) return undefined;\n return options.find(\n (o) => o.value === getValueFromOption(value, legacyBehavior),\n );\n};\n\ntype DoesOptionMatchSearchQueryProps = {\n label?: string;\n value?: string;\n searchQuery: string;\n};\n\nexport const doesOptionMatchSearchQuery = ({\n label,\n value,\n searchQuery,\n}: DoesOptionMatchSearchQueryProps) => {\n return (\n value?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n label?.toLowerCase().includes(searchQuery.toLowerCase())\n );\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport * as Portal from \"@radix-ui/react-portal\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { Button as TelegraphButton } from \"@telegraph/button\";\nimport { useComposedRefs } from \"@telegraph/compose-refs\";\nimport {\n RefToTgphRef,\n type TgphComponentProps,\n type TgphElement,\n} from \"@telegraph/helpers\";\nimport { Icon, Lucide } from \"@telegraph/icon\";\nimport { Input as TelegraphInput } from \"@telegraph/input\";\nimport { Box, Stack } from \"@telegraph/layout\";\nimport { Menu as TelegraphMenu } from \"@telegraph/menu\";\nimport { AnimatePresence, motion } from \"@telegraph/motion\";\nimport { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\n doesOptionMatchSearchQuery,\n getCurrentOption,\n getOptions,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\n\nconst FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nconst LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nconst SELECT_KEYS = [\"Enter\", \" \"];\n\ntype SingleSelect = {\n value?: Option;\n onValueChange?: (value: Option | undefined) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O> = O extends DefinedOption | string | undefined\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n> = {\n value?: O;\n onValueChange?: (value: O) => void;\n layout?: LayoutValue<O>;\n open?: boolean;\n defaultOpen?: boolean;\n errored?: boolean;\n placeholder?: string;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n closeOnSelect?: boolean;\n clearable?: boolean;\n disabled?: boolean;\n legacyBehavior?: LB;\n children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<\n RootProps<(Option | Array<Option>) | (string | Array<string>), boolean>,\n \"children\"\n > & {\n contentId: string;\n triggerId: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n onOpenToggle: () => void;\n searchQuery?: string;\n setSearchQuery?: (query: string) => void;\n triggerRef?: React.RefObject<HTMLDivElement>;\n searchRef?: React.RefObject<HTMLInputElement>;\n contentRef?: React.RefObject<HTMLDivElement>;\n options: Array<DefinedOption>;\n legacyBehavior: boolean;\n }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n options: [],\n legacyBehavior: false,\n});\n\nconst Root = <\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n legacyBehavior = false as LB,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n children,\n ...props\n}: RootProps<O, LB>) => {\n const contentId = React.useId();\n const triggerId = React.useId();\n const triggerRef = React.useRef(null);\n const searchRef = React.useRef(null);\n const contentRef = React.useRef<HTMLDivElement>(null);\n\n const options = React.useMemo(() => {\n return getOptions(children);\n }, [children]);\n\n const [searchQuery, setSearchQuery] = React.useState<string>(\"\");\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpenProp,\n onChange: onOpenChangeProp,\n });\n\n const onOpenToggle = React.useCallback(() => {\n setOpen((prevOpen) => !prevOpen);\n }, [setOpen]);\n\n React.useEffect(() => {\n // If the combobox is closed clear\n // the search query\n if (!open) {\n setSearchQuery(\"\");\n }\n }, [open]);\n\n return (\n <ComboboxContext.Provider\n value={{\n contentId,\n triggerId,\n value,\n // Need to cast this to avoid type errors\n // because the type of onValueChange is not\n // consistent with the value type\n onValueChange: onValueChange as (value: Option | Array<Option>) => void,\n placeholder,\n open,\n setOpen,\n onOpenToggle,\n closeOnSelect,\n clearable,\n disabled,\n searchQuery,\n setSearchQuery,\n triggerRef,\n searchRef,\n contentRef,\n errored,\n layout,\n options,\n legacyBehavior,\n }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n >\n {children}\n </TelegraphMenu.Root>\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n const option = React.useMemo(() => {\n // Find option amongst other options\n const foundOption = context.options.find((o) => o.value === value);\n if (foundOption) return foundOption.label || foundOption.value;\n\n // Find option amongst the current values in the case of creation\n if (!context.value) return undefined;\n const contextValue = context.value as Array<Option>;\n\n const foundValue = contextValue.find(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n );\n\n if (foundValue) return foundValue;\n }, [context.options, context.value, value, context.legacyBehavior]);\n\n return (\n <Tag.Root\n as={motion.span}\n initializeWithAnimation={false}\n initial={{ opacity: 0, scale: 0.5 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.5 }}\n transition={{ duration: 100, type: \"spring\" }}\n tgph-motion-key={value}\n size=\"1\"\n layout=\"position\"\n {...props}\n >\n <Tag.Text>{option}</Tag.Text>\n <Tag.Button\n icon={{ icon: Lucide.X, alt: `Remove ${value}` }}\n onClick={(event: React.MouseEvent) => {\n if (!context.onValueChange) return;\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = contextValue.filter((v) => {\n const valueOption = getValueFromOption(v, context.legacyBehavior);\n return valueOption !== value;\n });\n\n onValueChange?.(newValue);\n // Stop click event from bubbling up\n event.stopPropagation();\n // Stop the button \"submit\" action from triggering\n event.preventDefault();\n }}\n />\n </Tag.Root>\n );\n};\n\nconst TriggerValue = () => {\n const context = React.useContext(ComboboxContext);\n\n if (context.value && isMultiSelect(context.value)) {\n const layout = context.layout || \"truncate\";\n const truncatedLength = context.value.length - 2;\n const truncatedLengthStringArray = truncatedLength.toString().split(\"\");\n\n if (context.value.length === 0) {\n return (\n <TelegraphButton.Text color=\"gray\">\n {context.placeholder}\n </TelegraphButton.Text>\n );\n }\n return (\n <Stack\n gap=\"1\"\n w=\"full\"\n wrap={layout === \"wrap\" ? \"wrap\" : \"nowrap\"}\n align=\"center\"\n style={{\n position: \"relative\",\n flexGrow: 1,\n }}\n >\n <AnimatePresence\n presenceMap={context.value.map((v) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n return {\n \"tgph-motion-key\": value || \"\",\n value: true,\n };\n })}\n >\n {context.value.map((v, i) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n if (\n value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={value}>\n <TriggerTag value={value} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence\n presenceMap={[\n {\n \"tgph-motion-key\": \"combobox-more\",\n value: true,\n },\n ]}\n >\n {layout === \"truncate\" && context.value.length > 2 && (\n <Stack\n as={motion.div}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n position=\"absolute\"\n right=\"0\"\n style={{\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence\n presenceMap={truncatedLengthStringArray.map((n) => ({\n \"tgph-motion-key\": n,\n value: true,\n }))}\n >\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n w=\"2\"\n display=\"inline-block\"\n tgph-motion-key={n}\n key={n}\n >\n {n}\n </Box>\n ))}{\" \"}\n </AnimatePresence>\n more\n </Text>\n </Stack>\n )}\n </AnimatePresence>\n </Stack>\n );\n }\n\n if (context && isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {currentOption?.label || context.placeholder}\n </TelegraphButton.Text>\n );\n }\n};\n\ntype TriggerProps = React.ComponentProps<typeof TelegraphMenu.Trigger> & {\n placeholder?: string;\n size?: TgphComponentProps<typeof TelegraphButton.Root>[\"size\"];\n};\n\nconst Trigger = ({ size = \"2\", ...props }: TriggerProps) => {\n const context = React.useContext(ComboboxContext);\n\n const getAriaLabelString = React.useCallback(() => {\n if (!context.value) return context.placeholder;\n if (isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return currentOption?.label || context.placeholder;\n }\n if (isMultiSelect(context.value)) {\n return (\n context.value\n ?.map((v) => {\n const currentOption = getCurrentOption(\n v,\n context.options,\n context.legacyBehavior,\n );\n\n return currentOption?.label;\n })\n .join(\", \") || context.placeholder\n );\n }\n }, [\n context.value,\n context.placeholder,\n context.options,\n context.legacyBehavior,\n ]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\n }\n\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n }, [context.clearable, context.value]);\n\n const handleClear = () => {\n if (isMultiSelect(context.value)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n onValueChange?.([]);\n }\n\n if (isSingleSelect(context.value)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n onValueChange?.(undefined);\n }\n context.triggerRef?.current?.focus();\n };\n\n return (\n <TelegraphMenu.Trigger\n {...props}\n asChild\n onClick={(event: React.MouseEvent) => {\n event.preventDefault();\n context.onOpenToggle();\n context.triggerRef?.current?.focus();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Lets the user tab in and out of the combobox as usual\n if (event.key === \"Tab\") {\n event.stopPropagation();\n return;\n }\n if (SELECT_KEYS.includes(event.key)) {\n event.preventDefault();\n return;\n }\n\n if (event.key === \"ArrowDown\") {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.onOpenToggle();\n return;\n }\n }}\n tgphRef={context.triggerRef}\n >\n <TelegraphButton.Root\n id={context.triggerId}\n type=\"button\"\n bg=\"surface-1\"\n variant=\"outline\"\n align=\"center\"\n minH={TRIGGER_MIN_HEIGHT[size]}\n h=\"full\"\n w=\"full\"\n py=\"1\"\n size={size}\n color={context.errored ? \"red\" : \"gray\"}\n justify=\"space-between\"\n // Accessibility attributes\n role=\"combobox\"\n aria-label={getAriaLabelString()}\n aria-controls={context.contentId}\n aria-expanded={context.open}\n aria-haspopup=\"listbox\"\n // Custom attributes\n data-tgph-combobox-trigger\n data-tgph-comobox-trigger-open={context.open}\n disabled={context.disabled}\n >\n <TriggerValue />\n <Stack align=\"center\" gap=\"1\">\n {shouldShowClearable && (\n <Tooltip label=\"Clear field\">\n <TelegraphButton\n type=\"button\"\n icon={{ icon: Lucide.X, alt: \"Clear field\" }}\n size=\"1\"\n variant=\"ghost\"\n onClick={(event: React.MouseEvent) => {\n if (!context.value) return;\n event.stopPropagation();\n handleClear();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.stopPropagation();\n handleClear();\n }\n }}\n data-tgph-combobox-clear\n style={{\n // Remove margin to make the clear button flush\n // with the trigger button\n marginTop: \"calc(-1 * var(--tgph-spacing-1)\",\n marginBottom: \"calc(-1 * var(--tgph-spacing-1)\",\n }}\n />\n </Tooltip>\n )}\n <TelegraphButton.Icon\n as={motion.span}\n animate={{ rotate: context.open ? 180 : 0 }}\n transition={{ duration: 150, type: \"spring\" }}\n icon={Lucide.ChevronDown}\n aria-hidden\n />\n </Stack>\n </TelegraphButton.Root>\n </TelegraphMenu.Trigger>\n );\n};\n\ntype ContentProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Content<T>\n>;\n\nconst Content = <T extends TgphElement>({\n style,\n children,\n tgphRef,\n ...props\n}: ContentProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const hasInteractedOutside = React.useRef(false);\n const composedRef = useComposedRefs<unknown>(tgphRef, context.contentRef);\n\n const internalContentRef = React.useRef(null);\n\n const [height, setHeight] = React.useState(0);\n const [initialAnimationComplete, setInitialAnimationComplete] =\n React.useState(false);\n\n const setHeightFromContent = React.useCallback(\n (element: Element) => {\n // Set the initial height of the content after the animation completes\n const rect = element?.getBoundingClientRect();\n if (rect) {\n setHeight(rect.height);\n }\n\n if (!initialAnimationComplete) {\n setInitialAnimationComplete(true);\n }\n },\n [initialAnimationComplete],\n );\n\n React.useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const element = entry.target;\n setHeightFromContent(element);\n }\n });\n // Attatch the observer once the initial animation completes\n // and the content ref is available\n if (internalContentRef.current && initialAnimationComplete) {\n observer.observe(internalContentRef.current);\n }\n\n return () => observer.disconnect();\n }, [initialAnimationComplete, setHeightFromContent]);\n\n // Reset the animation complete state when the combobox is closed\n React.useEffect(() => {\n if (initialAnimationComplete === true && context.open === false) {\n setInitialAnimationComplete(false);\n }\n }, [context.open, initialAnimationComplete]);\n\n // On open, set the height of the content after the animation completes\n // we add a timeout here to ensure that the DOM element has responded to\n // the state changes first\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n if (context.open) {\n timeout = setTimeout(() => {\n setHeightFromContent(internalContentRef.current as unknown as Element);\n }, 10);\n }\n\n return () => timeout && clearTimeout(timeout);\n }, [context.open, setHeightFromContent]);\n\n return (\n <Portal.Root asChild>\n {/* \n We add radix's dismissable layer here so that we can swallow any escape\n key presses to prevent cases like a modal closing when we close the\n combobox \n */}\n <DismissableLayer\n onEscapeKeyDown={(event) => {\n if (context.open) {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.setOpen(false);\n }\n }}\n >\n <TelegraphMenu.Content\n className=\"tgph\"\n mt=\"1\"\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current) {\n context.triggerRef?.current?.focus();\n }\n\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\n bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\n transition: \"min-height 200ms ease-in-out\",\n minHeight: height ? `${height}px` : \"0\",\n ...style,\n ...{\n \"--tgph-comobobox-content-transform-origin\":\n \"var(--radix-popper-transform-origin)\",\n \"--tgph-combobox-content-available-width\":\n \"var(--radix-popper-available-width)\",\n \"--tgph-combobox-content-available-height\":\n \"calc(var(--radix-popper-available-height) - var(--tgph-spacing-8))\",\n \"--tgph-comobobox-trigger-width\":\n \"var(--radix-popper-anchor-width)\",\n \"--tgph-combobox-trigger-height\":\n \"var(--radix-popper-anchor-height)\",\n },\n }}\n {...props}\n tgphRef={composedRef}\n data-tgph-combobox-content\n data-tgph-combobox-content-open={context.open}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // If the first option is focused and the user presses the up\n // arrow key, focus the search input\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (\n document.activeElement === options?.[0] &&\n LAST_KEYS.includes(event.key)\n ) {\n context.searchRef?.current?.focus();\n }\n }}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\n </Portal.Root>\n );\n};\n\ntype OptionsProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>>;\n\nconst Options = <T extends TgphElement>({ ...props }: OptionsProps<T>) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Stack\n id={context.contentId}\n direction=\"column\"\n gap=\"1\"\n style={{\n overflowY: \"auto\",\n // Available Height - Padding from edge of screen\n maxHeight:\n \"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))\",\n }}\n // Accessibility attributes\n role=\"listbox\"\n {...props}\n />\n );\n};\n\ntype OptionProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n selected?: boolean | null;\n};\n\nconst Option = <T extends TgphElement>({\n value,\n label,\n selected,\n onSelect,\n children,\n ...props\n}: OptionProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isFocused, setIsFocused] = React.useState(false);\n const contextValue = context.value;\n\n const isVisible =\n !context.searchQuery ||\n doesOptionMatchSearchQuery({\n label: label?.toString() || children?.toString(),\n value,\n searchQuery: context.searchQuery,\n });\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n )\n : getValueFromOption(contextValue, context.legacyBehavior) === value;\n\n const handleSelection = (event: Event | React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // Don't do anything if the key isn't a selection key\n const keyboardEvent = event as React.KeyboardEvent;\n if (keyboardEvent.key && !SELECT_KEYS.includes(keyboardEvent.key)) return;\n\n // Don't bubble up the event\n event.preventDefault();\n\n if (context.closeOnSelect === true) {\n context.setOpen(false);\n }\n\n if (onSelect) {\n // Need to convert to non keyboard type event\n // since onSelect is expecting a mouse event\n // and we've handled the keyboard event already\n const onSelectEvent = event as unknown as Event;\n return onSelect(onSelectEvent);\n }\n\n if (isSingleSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n\n // TODO: Remove this once { value, label } option is deprecated\n if (context.legacyBehavior === true) {\n onValueChange?.({ value, label });\n } else {\n onValueChange?.(value);\n }\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = isSelected\n ? contextValue.filter(\n (v) => getValueFromOption(v, context.legacyBehavior) !== value,\n )\n : [\n ...contextValue,\n // TODO: Remove this once { value, label } option is deprecated\n context.legacyBehavior === true ? { value, label } : value,\n ];\n\n onValueChange?.(newValue);\n }\n\n context.triggerRef?.current?.focus();\n };\n\n if (isVisible) {\n return (\n <TelegraphMenu.Button\n type=\"button\"\n onSelect={handleSelection}\n onKeyDown={handleSelection}\n // Force null if selected equals null so we\n // can override the icon of the button\n selected={selected === null ? null : selected ?? isSelected}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n // Accessibility attributes\n role=\"option\"\n aria-selected={isSelected ? \"true\" : \"false\"}\n // Custom attributes\n data-tgph-combobox-option\n data-tgph-combobox-option-focused={isFocused}\n data-tgph-combobox-option-value={value}\n data-tgph-combobox-option-label={label}\n {...props}\n >\n {label || children || value}\n </TelegraphMenu.Button>\n );\n }\n};\n\ntype SearchProps = TgphComponentProps<typeof TelegraphInput> & {\n label?: string;\n};\n\nconst Search = ({\n label = \"Search\",\n placeholder = \"Search\",\n tgphRef,\n value: controlledValueProp,\n onValueChange: onValueChangeProp,\n ...props\n}: SearchProps) => {\n const id = React.useId();\n const context = React.useContext(ComboboxContext);\n const composedRef = useComposedRefs(tgphRef, context.searchRef);\n\n const value = controlledValueProp ?? context.searchQuery;\n const onValueChange = onValueChangeProp ?? context.setSearchQuery;\n\n React.useEffect(() => {\n const handleSearchKeyDown = (event: KeyboardEvent) => {\n if (FIRST_KEYS.includes(event.key)) {\n context.contentRef?.current?.focus({ preventScroll: true });\n }\n\n if (event.key === \"Escape\") {\n context.setOpen(false);\n }\n\n event.stopPropagation();\n };\n\n const searchInput = context.searchRef?.current;\n\n if (searchInput) {\n searchInput.addEventListener(\"keydown\", handleSearchKeyDown);\n return () => {\n searchInput.removeEventListener(\"keydown\", handleSearchKeyDown);\n };\n }\n }, [context]);\n\n return (\n <Box borderBottom=\"px\" px=\"1\" pb=\"1\">\n <VisuallyHidden.Root>\n <Text as=\"label\" htmlFor={id}>\n {label}\n </Text>\n </VisuallyHidden.Root>\n <TelegraphInput\n id={id}\n variant=\"ghost\"\n placeholder={placeholder}\n value={value}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n onValueChange(event.target.value);\n }}\n LeadingComponent={<Icon icon={Lucide.Search} alt=\"Search Icon\" />}\n TrailingComponent={\n context?.searchQuery && context?.searchQuery?.length > 0 ? (\n <TelegraphButton\n variant=\"ghost\"\n color=\"gray\"\n icon={{ icon: Lucide.X, alt: \"Clear Search Query\" }}\n onClick={() => context.setSearchQuery?.(\"\")}\n />\n ) : null\n }\n autoFocus\n data-tgph-combobox-search\n aria-controls={context.contentId}\n {...props}\n tgphRef={composedRef}\n />\n </Box>\n );\n};\n\ntype EmptyProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>> & {\n icon?: TgphComponentProps<typeof Icon> | null;\n message?: string | null;\n};\n\nconst Empty = <T extends TgphElement>({\n icon = { icon: Lucide.Search, alt: \"Search Icon\" },\n message = \"No results found\",\n children,\n ...props\n}: EmptyProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isVisible, setIsVisible] = React.useState(false);\n\n React.useEffect(() => {\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (options?.length === 0) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }, [context.searchQuery, context.contentRef, children]);\n\n if (isVisible) {\n return (\n <Stack\n gap=\"1\"\n align=\"center\"\n justify=\"center\"\n w=\"full\"\n my=\"8\"\n data-tgph-combobox-empty\n {...props}\n >\n {icon === null ? <></> : <Icon {...icon} />}\n {message === null ? <></> : <Text as=\"span\">{message}</Text>}\n </Stack>\n );\n }\n};\n\ntype CreateProps<\n T extends TgphElement,\n LB extends boolean,\n> = TgphComponentProps<typeof TelegraphMenu.Button<T>> & {\n leadingText?: string;\n} & (LB extends true\n ? {\n values: Array<DefinedOption>;\n onCreate: (value: { value: string; label?: string }) => void;\n legacyBehavior: true;\n }\n : {\n values?: Array<string>;\n onCreate?: (value: string) => void;\n legacyBehavior?: false;\n });\n\nconst Create = <T extends TgphElement, LB extends boolean>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n legacyBehavior = false as LB,\n ...props\n}: CreateProps<T, LB>) => {\n const context = React.useContext(ComboboxContext);\n\n const variableAlreadyExists = React.useCallback(\n (searchQuery: string | undefined) => {\n if (!values || values?.length === 0) return false;\n return values.some(\n (v) => getValueFromOption(v, legacyBehavior) === searchQuery,\n );\n },\n [values, legacyBehavior],\n );\n\n if (context.searchQuery && !variableAlreadyExists(context.searchQuery)) {\n return (\n <Option\n leadingIcon={{ icon: Lucide.Plus, \"aria-hidden\": true }}\n mx=\"1\"\n value={context.searchQuery}\n label={`${leadingText} \"${context.searchQuery}\"`}\n selected={selected}\n onSelect={() => {\n if (onCreate && context.value && context.searchQuery) {\n const value =\n legacyBehavior === true\n ? { value: context.searchQuery }\n : context.searchQuery;\n\n const create = onCreate as CreateProps<T, LB>[\"onCreate\"];\n\n create(value);\n\n context.setSearchQuery?.(\"\");\n }\n }}\n {...props}\n />\n );\n }\n};\n\nconst Combobox = {} as {\n Root: typeof Root;\n Trigger: typeof Trigger;\n Content: typeof Content;\n Options: typeof Options;\n Option: typeof Option;\n Search: typeof Search;\n Empty: typeof Empty;\n Create: typeof Create;\n};\n\nObject.assign(Combobox, {\n Root,\n Trigger,\n Content,\n Options,\n Option,\n Search,\n Empty,\n Create,\n});\n\nexport { Combobox };\n"],"names":["TRIGGER_MIN_HEIGHT","isMultiSelect","value","isSingleSelect","getOptions","children","recursivelyFindOptionElements","options","React","child","_element","element","_a","getValueFromOption","option","legacyBehavior","getCurrentOption","o","doesOptionMatchSearchQuery","label","searchQuery","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","context","foundOption","foundValue","v","jsxs","Tag","motion","Lucide","event","newValue","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","n","Box","currentOption","Trigger","size","getAriaLabelString","shouldShowClearable","handleClear","_b","Tooltip","Content","style","tgphRef","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","rect","observer","entries","entry","timeout","Portal","DismissableLayer","_d","_c","Options","Option","selected","onSelect","isFocused","setIsFocused","contextValue","isVisible","isSelected","handleSelection","keyboardEvent","Search","controlledValueProp","onValueChangeProp","id","handleSearchKeyDown","searchInput","VisuallyHidden","TelegraphInput","Icon","Empty","icon","message","setIsVisible","Fragment","Create","leadingText","values","onCreate","variableAlreadyExists","Combobox"],"mappings":"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"}
@@ -20,11 +20,11 @@ const oe = {
20
20
  1: "6",
21
21
  2: "8",
22
22
  3: "10"
23
- }, k = (t) => Array.isArray(t), T = (t) => typeof t == "object" && !Array.isArray(t) || typeof t == "string" || !t, re = (t) => {
24
- const n = (a, u = []) => (i.Children.toArray(a).forEach((r) => {
25
- i.isValidElement(r) && (r.props.value ? u.push(r) : r.props.children && n(r.props.children, u));
23
+ }, k = (t) => Array.isArray(t), T = (t) => typeof t == "object" && !Array.isArray(t) || typeof t == "string" || !t, ne = (t) => {
24
+ const r = (a, u = []) => (i.Children.toArray(a).forEach((n) => {
25
+ i.isValidElement(n) && (n.props.value ? u.push(n) : n.props.children && r(n.props.children, u));
26
26
  }), u);
27
- return n(t).map((a) => {
27
+ return r(t).map((a) => {
28
28
  var o;
29
29
  const u = a;
30
30
  return {
@@ -32,19 +32,19 @@ const oe = {
32
32
  label: ((o = u.props) == null ? void 0 : o.label) || u.props.children || u.props.value
33
33
  };
34
34
  });
35
- }, C = (t, n) => {
35
+ }, C = (t, r) => {
36
36
  if (t)
37
- return n === !0 ? t == null ? void 0 : t.value : t;
38
- }, F = (t, n, e) => {
39
- if (t && !(!n || n.length === 0))
40
- return n.find(
37
+ return r === !0 ? t == null ? void 0 : t.value : t;
38
+ }, F = (t, r, e) => {
39
+ if (t && !(!r || r.length === 0))
40
+ return r.find(
41
41
  (p) => p.value === C(t, e)
42
42
  );
43
- }, ne = ({
43
+ }, re = ({
44
44
  label: t,
45
- value: n,
45
+ value: r,
46
46
  searchQuery: e
47
- }) => (n == null ? void 0 : n.toLowerCase().includes(e.toLowerCase())) || (t == null ? void 0 : t.toLowerCase().includes(e.toLowerCase())), ae = ["ArrowDown", "PageUp", "Home"], ie = ["ArrowUp", "PageDown", "End"], z = ["Enter", " "], x = i.createContext({
47
+ }) => (r == null ? void 0 : r.toLowerCase().includes(e.toLowerCase())) || (t == null ? void 0 : t.toLowerCase().includes(e.toLowerCase())), ae = ["ArrowDown", "PageUp", "Home"], ie = ["ArrowUp", "PageDown", "End"], z = ["Enter", " "], x = i.createContext({
48
48
  value: void 0,
49
49
  onValueChange: () => {
50
50
  },
@@ -61,24 +61,24 @@ const oe = {
61
61
  legacyBehavior: !1
62
62
  }), ce = ({
63
63
  modal: t = !0,
64
- closeOnSelect: n = !0,
64
+ closeOnSelect: r = !0,
65
65
  clearable: e = !1,
66
66
  disabled: p = !1,
67
67
  legacyBehavior: a = !1,
68
68
  open: u,
69
69
  onOpenChange: o,
70
- defaultOpen: r,
70
+ defaultOpen: n,
71
71
  value: c,
72
- onValueChange: g,
72
+ onValueChange: f,
73
73
  errored: y,
74
74
  placeholder: v,
75
75
  layout: d,
76
76
  children: s,
77
- ...f
77
+ ...g
78
78
  }) => {
79
- const m = i.useId(), b = i.useId(), h = i.useRef(null), R = i.useRef(null), D = i.useRef(null), V = i.useMemo(() => re(s), [s]), [Y, H] = i.useState(""), [O = !1, A] = W({
79
+ const m = i.useId(), b = i.useId(), h = i.useRef(null), R = i.useRef(null), D = i.useRef(null), V = i.useMemo(() => ne(s), [s]), [Y, H] = i.useState(""), [O = !1, A] = W({
80
80
  prop: u,
81
- defaultProp: r,
81
+ defaultProp: n,
82
82
  onChange: o
83
83
  }), N = i.useCallback(() => {
84
84
  A((X) => !X);
@@ -95,12 +95,12 @@ const oe = {
95
95
  // Need to cast this to avoid type errors
96
96
  // because the type of onValueChange is not
97
97
  // consistent with the value type
98
- onValueChange: g,
98
+ onValueChange: f,
99
99
  placeholder: v,
100
100
  open: O,
101
101
  setOpen: A,
102
102
  onOpenToggle: N,
103
- closeOnSelect: n,
103
+ closeOnSelect: r,
104
104
  clearable: e,
105
105
  disabled: p,
106
106
  searchQuery: Y,
@@ -119,19 +119,19 @@ const oe = {
119
119
  open: O,
120
120
  onOpenChange: A,
121
121
  modal: t,
122
- ...f,
122
+ ...g,
123
123
  children: s
124
124
  }
125
125
  )
126
126
  }
127
127
  );
128
- }, se = ({ value: t, ...n }) => {
128
+ }, se = ({ value: t, ...r }) => {
129
129
  const e = i.useContext(x), p = i.useMemo(() => {
130
- const a = e.options.find((r) => r.value === t);
130
+ const a = e.options.find((n) => n.value === t);
131
131
  if (a) return a.label || a.value;
132
132
  if (!e.value) return;
133
133
  const o = e.value.find(
134
- (r) => C(r, e.legacyBehavior) === t
134
+ (n) => C(n, e.legacyBehavior) === t
135
135
  );
136
136
  if (o) return o;
137
137
  }, [e.options, e.value, t, e.legacyBehavior]);
@@ -147,7 +147,7 @@ const oe = {
147
147
  "tgph-motion-key": t,
148
148
  size: "1",
149
149
  layout: "position",
150
- ...n,
150
+ ...r,
151
151
  children: [
152
152
  /* @__PURE__ */ l(L.Text, { children: p }),
153
153
  /* @__PURE__ */ l(
@@ -156,8 +156,8 @@ const oe = {
156
156
  icon: { icon: w.X, alt: `Remove ${t}` },
157
157
  onClick: (a) => {
158
158
  if (!e.onValueChange) return;
159
- const u = e.onValueChange, r = e.value.filter((c) => C(c, e.legacyBehavior) !== t);
160
- u == null || u(r), a.stopPropagation(), a.preventDefault();
159
+ const u = e.onValueChange, n = e.value.filter((c) => C(c, e.legacyBehavior) !== t);
160
+ u == null || u(n), a.stopPropagation(), a.preventDefault();
161
161
  }
162
162
  }
163
163
  )
@@ -167,13 +167,13 @@ const oe = {
167
167
  }, le = () => {
168
168
  const t = i.useContext(x);
169
169
  if (t.value && k(t.value)) {
170
- const n = t.layout || "truncate", e = t.value.length - 2, p = e.toString().split("");
170
+ const r = t.layout || "truncate", e = t.value.length - 2, p = e.toString().split("");
171
171
  return t.value.length === 0 ? /* @__PURE__ */ l(E.Text, { color: "gray", children: t.placeholder }) : /* @__PURE__ */ S(
172
172
  I,
173
173
  {
174
174
  gap: "1",
175
175
  w: "full",
176
- wrap: n === "wrap" ? "wrap" : "nowrap",
176
+ wrap: r === "wrap" ? "wrap" : "nowrap",
177
177
  align: "center",
178
178
  style: {
179
179
  position: "relative",
@@ -189,7 +189,7 @@ const oe = {
189
189
  })),
190
190
  children: t.value.map((a, u) => {
191
191
  const o = C(a, t.legacyBehavior);
192
- if (o && (n === "truncate" && u <= 1 || n === "wrap"))
192
+ if (o && (r === "truncate" && u <= 1 || r === "wrap"))
193
193
  return /* @__PURE__ */ l(Z, { children: /* @__PURE__ */ l(se, { value: o }) }, o);
194
194
  })
195
195
  }
@@ -203,7 +203,7 @@ const oe = {
203
203
  value: !0
204
204
  }
205
205
  ],
206
- children: n === "truncate" && t.value.length > 2 && /* @__PURE__ */ l(
206
+ children: r === "truncate" && t.value.length > 2 && /* @__PURE__ */ l(
207
207
  I,
208
208
  {
209
209
  as: B.div,
@@ -261,29 +261,29 @@ const oe = {
261
261
  );
262
262
  }
263
263
  if (t && T(t.value)) {
264
- const n = F(
264
+ const r = F(
265
265
  t.value,
266
266
  t.options,
267
267
  t.legacyBehavior
268
268
  );
269
- return /* @__PURE__ */ l(E.Text, { color: t.value ? "default" : "gray", children: (n == null ? void 0 : n.label) || t.placeholder });
269
+ return /* @__PURE__ */ l(E.Text, { color: t.value ? "default" : "gray", children: (r == null ? void 0 : r.label) || t.placeholder });
270
270
  }
271
- }, ue = ({ size: t = "2", ...n }) => {
271
+ }, ue = ({ size: t = "2", ...r }) => {
272
272
  const e = i.useContext(x), p = i.useCallback(() => {
273
273
  var o;
274
274
  if (!e.value) return e.placeholder;
275
275
  if (T(e.value)) {
276
- const r = F(
276
+ const n = F(
277
277
  e.value,
278
278
  e.options,
279
279
  e.legacyBehavior
280
280
  );
281
- return (r == null ? void 0 : r.label) || e.placeholder;
281
+ return (n == null ? void 0 : n.label) || e.placeholder;
282
282
  }
283
283
  if (k(e.value))
284
- return ((o = e.value) == null ? void 0 : o.map((r) => {
284
+ return ((o = e.value) == null ? void 0 : o.map((n) => {
285
285
  const c = F(
286
- r,
286
+ n,
287
287
  e.options,
288
288
  e.legacyBehavior
289
289
  );
@@ -301,7 +301,7 @@ const oe = {
301
301
  if (k(e.value))
302
302
  return e.clearable && ((o = e.value) == null ? void 0 : o.length) > 0;
303
303
  }, [e.clearable, e.value]), u = () => {
304
- var o, r;
304
+ var o, n;
305
305
  if (k(e.value)) {
306
306
  const c = e.onValueChange;
307
307
  c == null || c([]);
@@ -310,16 +310,16 @@ const oe = {
310
310
  const c = e.onValueChange;
311
311
  c == null || c(void 0);
312
312
  }
313
- (r = (o = e.triggerRef) == null ? void 0 : o.current) == null || r.focus();
313
+ (n = (o = e.triggerRef) == null ? void 0 : o.current) == null || n.focus();
314
314
  };
315
315
  return /* @__PURE__ */ l(
316
316
  Q.Trigger,
317
317
  {
318
- ...n,
318
+ ...r,
319
319
  asChild: !0,
320
320
  onClick: (o) => {
321
- var r, c;
322
- o.preventDefault(), e.onOpenToggle(), (c = (r = e.triggerRef) == null ? void 0 : r.current) == null || c.focus();
321
+ var n, c;
322
+ o.preventDefault(), e.onOpenToggle(), (c = (n = e.triggerRef) == null ? void 0 : n.current) == null || c.focus();
323
323
  },
324
324
  onKeyDown: (o) => {
325
325
  if (o.key === "Tab") {
@@ -402,31 +402,31 @@ const oe = {
402
402
  );
403
403
  }, pe = ({
404
404
  style: t,
405
- children: n,
405
+ children: r,
406
406
  tgphRef: e,
407
407
  ...p
408
408
  }) => {
409
- const a = i.useContext(x), u = i.useRef(!1), o = j(e, a.contentRef), r = i.useRef(null), [c, g] = i.useState(0), [y, v] = i.useState(!1), d = i.useCallback(
409
+ const a = i.useContext(x), u = i.useRef(!1), o = j(e, a.contentRef), n = i.useRef(null), [c, f] = i.useState(0), [y, v] = i.useState(!1), d = i.useCallback(
410
410
  (s) => {
411
- const f = s == null ? void 0 : s.getBoundingClientRect();
412
- f && g(f.height), y || v(!0);
411
+ const g = s == null ? void 0 : s.getBoundingClientRect();
412
+ g && f(g.height), y || v(!0);
413
413
  },
414
414
  [y]
415
415
  );
416
416
  return i.useEffect(() => {
417
- const s = new ResizeObserver((f) => {
418
- for (const m of f) {
417
+ const s = new ResizeObserver((g) => {
418
+ for (const m of g) {
419
419
  const b = m.target;
420
420
  d(b);
421
421
  }
422
422
  });
423
- return r.current && y && s.observe(r.current), () => s.disconnect();
423
+ return n.current && y && s.observe(n.current), () => s.disconnect();
424
424
  }, [y, d]), i.useEffect(() => {
425
425
  y === !0 && a.open === !1 && v(!1);
426
426
  }, [a.open, y]), i.useEffect(() => {
427
427
  let s;
428
428
  return a.open && (s = setTimeout(() => {
429
- d(r.current);
429
+ d(n.current);
430
430
  }, 10)), () => s && clearTimeout(s);
431
431
  }, [a.open, d]), /* @__PURE__ */ l(U.Root, { asChild: !0, children: /* @__PURE__ */ l(
432
432
  q,
@@ -440,8 +440,8 @@ const oe = {
440
440
  className: "tgph",
441
441
  mt: "1",
442
442
  onCloseAutoFocus: (s) => {
443
- var f, m;
444
- u.current || (m = (f = a.triggerRef) == null ? void 0 : f.current) == null || m.focus(), u.current = !1, s.preventDefault();
443
+ var g, m;
444
+ u.current || (m = (g = a.triggerRef) == null ? void 0 : g.current) == null || m.focus(), u.current = !1, s.preventDefault();
445
445
  },
446
446
  bg: "surface-1",
447
447
  style: {
@@ -464,22 +464,22 @@ const oe = {
464
464
  onKeyDown: (s) => {
465
465
  var m, b, h, R;
466
466
  s.stopPropagation();
467
- const f = (b = (m = a.contentRef) == null ? void 0 : m.current) == null ? void 0 : b.querySelectorAll(
467
+ const g = (b = (m = a.contentRef) == null ? void 0 : m.current) == null ? void 0 : b.querySelectorAll(
468
468
  "[data-tgph-combobox-option]"
469
469
  );
470
- document.activeElement === (f == null ? void 0 : f[0]) && ie.includes(s.key) && ((R = (h = a.searchRef) == null ? void 0 : h.current) == null || R.focus());
470
+ document.activeElement === (g == null ? void 0 : g[0]) && ie.includes(s.key) && ((R = (h = a.searchRef) == null ? void 0 : h.current) == null || R.focus());
471
471
  },
472
- children: /* @__PURE__ */ l(I, { direction: "column", gap: "1", tgphRef: r, children: n })
472
+ children: /* @__PURE__ */ l(I, { direction: "column", gap: "1", tgphRef: n, children: r })
473
473
  }
474
474
  )
475
475
  }
476
476
  ) });
477
- }, ge = ({ ...t }) => {
478
- const n = i.useContext(x);
477
+ }, fe = ({ ...t }) => {
478
+ const r = i.useContext(x);
479
479
  return /* @__PURE__ */ l(
480
480
  I,
481
481
  {
482
- id: n.contentId,
482
+ id: r.contentId,
483
483
  direction: "column",
484
484
  gap: "1",
485
485
  style: {
@@ -493,35 +493,35 @@ const oe = {
493
493
  );
494
494
  }, G = ({
495
495
  value: t,
496
- label: n,
496
+ label: r,
497
497
  selected: e,
498
498
  onSelect: p,
499
499
  children: a,
500
500
  ...u
501
501
  }) => {
502
- const o = i.useContext(x), [r, c] = i.useState(!1), g = o.value, y = !o.searchQuery || ne({
503
- label: (n == null ? void 0 : n.toString()) || (a == null ? void 0 : a.toString()),
502
+ const o = i.useContext(x), [n, c] = i.useState(!1), f = o.value, y = !o.searchQuery || re({
503
+ label: (r == null ? void 0 : r.toString()) || (a == null ? void 0 : a.toString()),
504
504
  value: t,
505
505
  searchQuery: o.searchQuery
506
- }), v = k(g) ? g.some(
506
+ }), v = k(f) ? f.some(
507
507
  (s) => C(s, o.legacyBehavior) === t
508
- ) : C(g, o.legacyBehavior) === t, d = (s) => {
508
+ ) : C(f, o.legacyBehavior) === t, d = (s) => {
509
509
  var m, b;
510
510
  s.stopPropagation();
511
- const f = s;
512
- if (!(f.key && !z.includes(f.key))) {
511
+ const g = s;
512
+ if (!(g.key && !z.includes(g.key))) {
513
513
  if (s.preventDefault(), o.closeOnSelect === !0 && o.setOpen(!1), p)
514
514
  return p(s);
515
- if (T(g)) {
515
+ if (T(f)) {
516
516
  const h = o.onValueChange;
517
- o.legacyBehavior === !0 ? h == null || h({ value: t, label: n }) : h == null || h(t);
518
- } else if (k(g)) {
517
+ o.legacyBehavior === !0 ? h == null || h({ value: t, label: r }) : h == null || h(t);
518
+ } else if (k(f)) {
519
519
  const h = o.onValueChange, R = o.value, D = v ? R.filter(
520
520
  (V) => C(V, o.legacyBehavior) !== t
521
521
  ) : [
522
522
  ...R,
523
523
  // TODO: Remove this once { value, label } option is deprecated
524
- o.legacyBehavior === !0 ? { value: t, label: n } : t
524
+ o.legacyBehavior === !0 ? { value: t, label: r } : t
525
525
  ];
526
526
  h == null || h(D);
527
527
  }
@@ -541,47 +541,47 @@ const oe = {
541
541
  role: "option",
542
542
  "aria-selected": v ? "true" : "false",
543
543
  "data-tgph-combobox-option": !0,
544
- "data-tgph-combobox-option-focused": r,
544
+ "data-tgph-combobox-option-focused": n,
545
545
  "data-tgph-combobox-option-value": t,
546
- "data-tgph-combobox-option-label": n,
546
+ "data-tgph-combobox-option-label": r,
547
547
  ...u,
548
- children: n || a || t
548
+ children: r || a || t
549
549
  }
550
550
  );
551
- }, fe = ({
551
+ }, ge = ({
552
552
  label: t = "Search",
553
- placeholder: n = "Search",
553
+ placeholder: r = "Search",
554
554
  tgphRef: e,
555
555
  value: p,
556
556
  onValueChange: a,
557
557
  ...u
558
558
  }) => {
559
559
  var v;
560
- const o = i.useId(), r = i.useContext(x), c = j(e, r.searchRef), g = p ?? r.searchQuery, y = a ?? r.setSearchQuery;
560
+ const o = i.useId(), n = i.useContext(x), c = j(e, n.searchRef), f = p ?? n.searchQuery, y = a ?? n.setSearchQuery;
561
561
  return i.useEffect(() => {
562
- var f;
562
+ var g;
563
563
  const d = (m) => {
564
564
  var b, h;
565
- ae.includes(m.key) && ((h = (b = r.contentRef) == null ? void 0 : b.current) == null || h.focus({ preventScroll: !0 })), m.key === "Escape" && r.setOpen(!1), m.stopPropagation();
566
- }, s = (f = r.searchRef) == null ? void 0 : f.current;
565
+ ae.includes(m.key) && ((h = (b = n.contentRef) == null ? void 0 : b.current) == null || h.focus({ preventScroll: !0 })), m.key === "Escape" && n.setOpen(!1), m.stopPropagation();
566
+ }, s = (g = n.searchRef) == null ? void 0 : g.current;
567
567
  if (s)
568
568
  return s.addEventListener("keydown", d), () => {
569
569
  s.removeEventListener("keydown", d);
570
570
  };
571
- }, [r]), /* @__PURE__ */ S($, { borderBottom: "px", px: "1", pb: "1", children: [
571
+ }, [n]), /* @__PURE__ */ S($, { borderBottom: "px", px: "1", pb: "1", children: [
572
572
  /* @__PURE__ */ l(J.Root, { children: /* @__PURE__ */ l(M, { as: "label", htmlFor: o, children: t }) }),
573
573
  /* @__PURE__ */ l(
574
574
  ee,
575
575
  {
576
576
  id: o,
577
577
  variant: "ghost",
578
- placeholder: n,
579
- value: g,
578
+ placeholder: r,
579
+ value: f,
580
580
  onChange: (d) => {
581
581
  y(d.target.value);
582
582
  },
583
583
  LeadingComponent: /* @__PURE__ */ l(_, { icon: w.Search, alt: "Search Icon" }),
584
- TrailingComponent: r != null && r.searchQuery && ((v = r == null ? void 0 : r.searchQuery) == null ? void 0 : v.length) > 0 ? /* @__PURE__ */ l(
584
+ TrailingComponent: n != null && n.searchQuery && ((v = n == null ? void 0 : n.searchQuery) == null ? void 0 : v.length) > 0 ? /* @__PURE__ */ l(
585
585
  E,
586
586
  {
587
587
  variant: "ghost",
@@ -589,13 +589,13 @@ const oe = {
589
589
  icon: { icon: w.X, alt: "Clear Search Query" },
590
590
  onClick: () => {
591
591
  var d;
592
- return (d = r.setSearchQuery) == null ? void 0 : d.call(r, "");
592
+ return (d = n.setSearchQuery) == null ? void 0 : d.call(n, "");
593
593
  }
594
594
  }
595
595
  ) : null,
596
596
  autoFocus: !0,
597
597
  "data-tgph-combobox-search": !0,
598
- "aria-controls": r.contentId,
598
+ "aria-controls": n.contentId,
599
599
  ...u,
600
600
  tgphRef: c
601
601
  }
@@ -603,17 +603,17 @@ const oe = {
603
603
  ] });
604
604
  }, he = ({
605
605
  icon: t = { icon: w.Search, alt: "Search Icon" },
606
- message: n = "No results found",
606
+ message: r = "No results found",
607
607
  children: e,
608
608
  ...p
609
609
  }) => {
610
610
  const a = i.useContext(x), [u, o] = i.useState(!1);
611
611
  if (i.useEffect(() => {
612
- var c, g;
613
- const r = (g = (c = a.contentRef) == null ? void 0 : c.current) == null ? void 0 : g.querySelectorAll(
612
+ var c, f;
613
+ const n = (f = (c = a.contentRef) == null ? void 0 : c.current) == null ? void 0 : f.querySelectorAll(
614
614
  "[data-tgph-combobox-option]"
615
615
  );
616
- (r == null ? void 0 : r.length) === 0 ? o(!0) : o(!1);
616
+ (n == null ? void 0 : n.length) === 0 ? o(!0) : o(!1);
617
617
  }, [a.searchQuery, a.contentRef, e]), u)
618
618
  return /* @__PURE__ */ S(
619
619
  I,
@@ -627,25 +627,25 @@ const oe = {
627
627
  ...p,
628
628
  children: [
629
629
  t === null ? /* @__PURE__ */ l(K, {}) : /* @__PURE__ */ l(_, { ...t }),
630
- n === null ? /* @__PURE__ */ l(K, {}) : /* @__PURE__ */ l(M, { as: "span", children: n })
630
+ r === null ? /* @__PURE__ */ l(K, {}) : /* @__PURE__ */ l(M, { as: "span", children: r })
631
631
  ]
632
632
  }
633
633
  );
634
634
  }, de = ({
635
635
  leadingText: t = "Create",
636
- values: n,
636
+ values: r,
637
637
  onCreate: e,
638
638
  selected: p = null,
639
639
  legacyBehavior: a = !1,
640
640
  ...u
641
641
  }) => {
642
- const o = i.useContext(x), r = i.useCallback(
643
- (c) => !n || (n == null ? void 0 : n.length) === 0 ? !1 : n.some(
644
- (g) => C(g, a) === c
642
+ const o = i.useContext(x), n = i.useCallback(
643
+ (c) => !r || (r == null ? void 0 : r.length) === 0 ? !1 : r.some(
644
+ (f) => C(f, a) === c
645
645
  ),
646
- [n, a]
646
+ [r, a]
647
647
  );
648
- if (o.searchQuery && !r(o.searchQuery))
648
+ if (o.searchQuery && !n(o.searchQuery))
649
649
  return /* @__PURE__ */ l(
650
650
  G,
651
651
  {
@@ -657,8 +657,8 @@ const oe = {
657
657
  onSelect: () => {
658
658
  var c;
659
659
  if (e && o.value && o.searchQuery) {
660
- const g = a === !0 ? { value: o.searchQuery } : o.searchQuery;
661
- e(g), (c = o.setSearchQuery) == null || c.call(o, "");
660
+ const f = a === !0 ? { value: o.searchQuery } : o.searchQuery;
661
+ e(f), (c = o.setSearchQuery) == null || c.call(o, "");
662
662
  }
663
663
  },
664
664
  ...u
@@ -669,9 +669,9 @@ Object.assign(me, {
669
669
  Root: ce,
670
670
  Trigger: ue,
671
671
  Content: pe,
672
- Options: ge,
672
+ Options: fe,
673
673
  Option: G,
674
- Search: fe,
674
+ Search: ge,
675
675
  Empty: he,
676
676
  Create: de
677
677
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/Combobox/Combobox.constants.ts","../../src/Combobox/Combobox.helpers.ts","../../src/Combobox/Combobox.tsx"],"sourcesContent":["export const TRIGGER_MIN_HEIGHT = {\n \"0\": \"5\",\n \"1\": \"6\",\n \"2\": \"8\",\n \"3\": \"10\",\n};\n","import React from \"react\";\n\nexport type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | string | React.ReactNode;\nexport const isMultiSelect = (\n value: Option | Array<Option> | undefined,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option> | undefined,\n): value is Option => {\n return (\n (typeof value === \"object\" && !Array.isArray(value)) ||\n typeof value === \"string\" ||\n !value\n );\n};\n\nexport const getOptions = (children: React.ReactNode): Array<DefinedOption> => {\n const recursivelyFindOptionElements = (\n children: React.ReactNode,\n options: Array<React.ReactNode> = [],\n ) => {\n const childrenArray = React.Children.toArray(children);\n\n childrenArray.forEach((child) => {\n if (React.isValidElement(child)) {\n if (child.props.value) {\n // If it has a value prop, it's an option\n options.push(child);\n } else if (child.props.children) {\n // If it has children, recursively search them\n recursivelyFindOptionElements(child.props.children, options);\n }\n }\n });\n\n return options;\n };\n\n const optionElements = recursivelyFindOptionElements(children);\n\n const options = optionElements.map((_element) => {\n const element = _element as React.ReactElement<{\n value: string;\n label?: string | React.ReactNode;\n children?: React.ReactNode;\n }>;\n return {\n value: element.props.value,\n label:\n element.props?.label || element.props.children || element.props.value,\n };\n });\n\n return options;\n};\n\nexport const getValueFromOption = (\n option: Option | undefined,\n legacyBehavior: boolean,\n): string | undefined => {\n if (!option) return undefined;\n\n if (legacyBehavior === true) {\n return (option as DefinedOption)?.value;\n }\n\n return option as string;\n};\n\nexport const getCurrentOption = (\n value: Option | undefined,\n options: Array<DefinedOption>,\n legacyBehavior: boolean,\n): DefinedOption | undefined => {\n if (!value) return undefined;\n if (!options || options.length === 0) return undefined;\n return options.find(\n (o) => o.value === getValueFromOption(value, legacyBehavior),\n );\n};\n\ntype DoesOptionMatchSearchQueryProps = {\n label?: string;\n value?: string;\n searchQuery: string;\n};\n\nexport const doesOptionMatchSearchQuery = ({\n label,\n value,\n searchQuery,\n}: DoesOptionMatchSearchQueryProps) => {\n return (\n value?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n label?.toLowerCase().includes(searchQuery.toLowerCase())\n );\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport * as Portal from \"@radix-ui/react-portal\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { Button as TelegraphButton } from \"@telegraph/button\";\nimport { useComposedRefs } from \"@telegraph/compose-refs\";\nimport {\n RefToTgphRef,\n type TgphComponentProps,\n type TgphElement,\n} from \"@telegraph/helpers\";\nimport { Icon, Lucide } from \"@telegraph/icon\";\nimport { Input as TelegraphInput } from \"@telegraph/input\";\nimport { Box, Stack } from \"@telegraph/layout\";\nimport { Menu as TelegraphMenu } from \"@telegraph/menu\";\nimport { AnimatePresence, motion } from \"@telegraph/motion\";\nimport { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\n doesOptionMatchSearchQuery,\n getCurrentOption,\n getOptions,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\n\nconst FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nconst LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nconst SELECT_KEYS = [\"Enter\", \" \"];\n\ntype SingleSelect = {\n value?: Option;\n onValueChange?: (value: Option | undefined) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O> = O extends DefinedOption | string | undefined\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n> = {\n value?: O;\n onValueChange?: (value: O) => void;\n layout?: LayoutValue<O>;\n open?: boolean;\n defaultOpen?: boolean;\n errored?: boolean;\n placeholder?: string;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n closeOnSelect?: boolean;\n clearable?: boolean;\n disabled?: boolean;\n legacyBehavior?: LB;\n children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<\n RootProps<(Option | Array<Option>) | (string | Array<string>), boolean>,\n \"children\"\n > & {\n contentId: string;\n triggerId: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n onOpenToggle: () => void;\n searchQuery?: string;\n setSearchQuery?: (query: string) => void;\n triggerRef?: React.RefObject<HTMLDivElement>;\n searchRef?: React.RefObject<HTMLInputElement>;\n contentRef?: React.RefObject<HTMLDivElement>;\n options: Array<DefinedOption>;\n legacyBehavior: boolean;\n }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n options: [],\n legacyBehavior: false,\n});\n\nconst Root = <\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n legacyBehavior = false as LB,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n children,\n ...props\n}: RootProps<O, LB>) => {\n const contentId = React.useId();\n const triggerId = React.useId();\n const triggerRef = React.useRef(null);\n const searchRef = React.useRef(null);\n const contentRef = React.useRef<HTMLDivElement>(null);\n\n const options = React.useMemo(() => {\n return getOptions(children);\n }, [children]);\n\n const [searchQuery, setSearchQuery] = React.useState<string>(\"\");\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpenProp,\n onChange: onOpenChangeProp,\n });\n\n const onOpenToggle = React.useCallback(() => {\n setOpen((prevOpen) => !prevOpen);\n }, [setOpen]);\n\n React.useEffect(() => {\n // If the combobox is closed clear\n // the search query\n if (!open) {\n setSearchQuery(\"\");\n }\n }, [open]);\n\n return (\n <ComboboxContext.Provider\n value={{\n contentId,\n triggerId,\n value,\n // Need to cast this to avoid type errors\n // because the type of onValueChange is not\n // consistent with the value type\n onValueChange: onValueChange as (value: Option | Array<Option>) => void,\n placeholder,\n open,\n setOpen,\n onOpenToggle,\n closeOnSelect,\n clearable,\n disabled,\n searchQuery,\n setSearchQuery,\n triggerRef,\n searchRef,\n contentRef,\n errored,\n layout,\n options,\n legacyBehavior,\n }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n >\n {children}\n </TelegraphMenu.Root>\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n const option = React.useMemo(() => {\n // Find option amongst other options\n const foundOption = context.options.find((o) => o.value === value);\n if (foundOption) return foundOption.label || foundOption.value;\n\n // Find option amongst the current values in the case of creation\n if (!context.value) return undefined;\n const contextValue = context.value as Array<Option>;\n\n const foundValue = contextValue.find(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n );\n\n if (foundValue) return foundValue;\n }, [context.options, context.value, value, context.legacyBehavior]);\n\n return (\n <Tag.Root\n as={motion.span}\n initializeWithAnimation={false}\n initial={{ opacity: 0, scale: 0.5 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.5 }}\n transition={{ duration: 100, type: \"spring\" }}\n tgph-motion-key={value}\n size=\"1\"\n layout=\"position\"\n {...props}\n >\n <Tag.Text>{option}</Tag.Text>\n <Tag.Button\n icon={{ icon: Lucide.X, alt: `Remove ${value}` }}\n onClick={(event: React.MouseEvent) => {\n if (!context.onValueChange) return;\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = contextValue.filter((v) => {\n const valueOption = getValueFromOption(v, context.legacyBehavior);\n return valueOption !== value;\n });\n\n onValueChange?.(newValue);\n // Stop click event from bubbling up\n event.stopPropagation();\n // Stop the button \"submit\" action from triggering\n event.preventDefault();\n }}\n />\n </Tag.Root>\n );\n};\n\nconst TriggerValue = () => {\n const context = React.useContext(ComboboxContext);\n\n if (context.value && isMultiSelect(context.value)) {\n const layout = context.layout || \"truncate\";\n const truncatedLength = context.value.length - 2;\n const truncatedLengthStringArray = truncatedLength.toString().split(\"\");\n\n if (context.value.length === 0) {\n return (\n <TelegraphButton.Text color=\"gray\">\n {context.placeholder}\n </TelegraphButton.Text>\n );\n }\n return (\n <Stack\n gap=\"1\"\n w=\"full\"\n wrap={layout === \"wrap\" ? \"wrap\" : \"nowrap\"}\n align=\"center\"\n style={{\n position: \"relative\",\n flexGrow: 1,\n }}\n >\n <AnimatePresence\n presenceMap={context.value.map((v) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n return {\n \"tgph-motion-key\": value || \"\",\n value: true,\n };\n })}\n >\n {context.value.map((v, i) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n if (\n value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={value}>\n <TriggerTag value={value} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence\n presenceMap={[\n {\n \"tgph-motion-key\": \"combobox-more\",\n value: true,\n },\n ]}\n >\n {layout === \"truncate\" && context.value.length > 2 && (\n <Stack\n as={motion.div}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n position=\"absolute\"\n right=\"0\"\n style={{\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence\n presenceMap={truncatedLengthStringArray.map((n) => ({\n \"tgph-motion-key\": n,\n value: true,\n }))}\n >\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n w=\"2\"\n display=\"inline-block\"\n tgph-motion-key={n}\n key={n}\n >\n {n}\n </Box>\n ))}{\" \"}\n </AnimatePresence>\n more\n </Text>\n </Stack>\n )}\n </AnimatePresence>\n </Stack>\n );\n }\n\n if (context && isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {currentOption?.label || context.placeholder}\n </TelegraphButton.Text>\n );\n }\n};\n\ntype TriggerProps = React.ComponentProps<typeof TelegraphMenu.Trigger> & {\n placeholder?: string;\n size?: TgphComponentProps<typeof TelegraphButton.Root>[\"size\"];\n};\n\nconst Trigger = ({ size = \"2\", ...props }: TriggerProps) => {\n const context = React.useContext(ComboboxContext);\n\n const getAriaLabelString = React.useCallback(() => {\n if (!context.value) return context.placeholder;\n if (isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return currentOption?.label || context.placeholder;\n }\n if (isMultiSelect(context.value)) {\n return (\n context.value\n ?.map((v) => {\n const currentOption = getCurrentOption(\n v,\n context.options,\n context.legacyBehavior,\n );\n\n return currentOption?.label;\n })\n .join(\", \") || context.placeholder\n );\n }\n }, [\n context.value,\n context.placeholder,\n context.options,\n context.legacyBehavior,\n ]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\n }\n\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n }, [context.clearable, context.value]);\n\n const handleClear = () => {\n if (isMultiSelect(context.value)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n onValueChange?.([]);\n }\n\n if (isSingleSelect(context.value)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n onValueChange?.(undefined);\n }\n context.triggerRef?.current?.focus();\n };\n\n return (\n <TelegraphMenu.Trigger\n {...props}\n asChild\n onClick={(event: React.MouseEvent) => {\n event.preventDefault();\n context.onOpenToggle();\n context.triggerRef?.current?.focus();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Lets the user tab in and out of the combobox as usual\n if (event.key === \"Tab\") {\n event.stopPropagation();\n return;\n }\n if (SELECT_KEYS.includes(event.key)) {\n event.preventDefault();\n return;\n }\n\n if (event.key === \"ArrowDown\") {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.onOpenToggle();\n return;\n }\n }}\n tgphRef={context.triggerRef}\n >\n <TelegraphButton.Root\n id={context.triggerId}\n type=\"button\"\n bg=\"surface-1\"\n variant=\"outline\"\n align=\"center\"\n minH={TRIGGER_MIN_HEIGHT[size]}\n h=\"full\"\n w=\"full\"\n py=\"1\"\n size={size}\n color={context.errored ? \"red\" : \"gray\"}\n justify=\"space-between\"\n // Accessibility attributes\n role=\"combobox\"\n aria-label={getAriaLabelString()}\n aria-controls={context.contentId}\n aria-expanded={context.open}\n aria-haspopup=\"listbox\"\n // Custom attributes\n data-tgph-combobox-trigger\n data-tgph-comobox-trigger-open={context.open}\n disabled={context.disabled}\n >\n <TriggerValue />\n <Stack align=\"center\" gap=\"1\">\n {shouldShowClearable && (\n <Tooltip label=\"Clear field\">\n <TelegraphButton\n type=\"button\"\n icon={{ icon: Lucide.X, alt: \"Clear field\" }}\n size=\"1\"\n variant=\"ghost\"\n onClick={(event: React.MouseEvent) => {\n if (!context.value) return;\n event.stopPropagation();\n handleClear();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.stopPropagation();\n handleClear();\n }\n }}\n data-tgph-combobox-clear\n style={{\n // Remove margin to make the clear button flush\n // with the trigger button\n marginTop: \"calc(-1 * var(--tgph-spacing-1)\",\n marginBottom: \"calc(-1 * var(--tgph-spacing-1)\",\n }}\n />\n </Tooltip>\n )}\n <TelegraphButton.Icon\n as={motion.span}\n animate={{ rotate: context.open ? 180 : 0 }}\n transition={{ duration: 150, type: \"spring\" }}\n icon={Lucide.ChevronDown}\n aria-hidden\n />\n </Stack>\n </TelegraphButton.Root>\n </TelegraphMenu.Trigger>\n );\n};\n\ntype ContentProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Content<T>\n>;\n\nconst Content = <T extends TgphElement>({\n style,\n children,\n tgphRef,\n ...props\n}: ContentProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const hasInteractedOutside = React.useRef(false);\n const composedRef = useComposedRefs<unknown>(tgphRef, context.contentRef);\n\n const internalContentRef = React.useRef(null);\n\n const [height, setHeight] = React.useState(0);\n const [initialAnimationComplete, setInitialAnimationComplete] =\n React.useState(false);\n\n const setHeightFromContent = React.useCallback(\n (element: Element) => {\n // Set the initial height of the content after the animation completes\n const rect = element?.getBoundingClientRect();\n if (rect) {\n setHeight(rect.height);\n }\n\n if (!initialAnimationComplete) {\n setInitialAnimationComplete(true);\n }\n },\n [initialAnimationComplete],\n );\n\n React.useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const element = entry.target;\n setHeightFromContent(element);\n }\n });\n // Attatch the observer once the initial animation completes\n // and the content ref is available\n if (internalContentRef.current && initialAnimationComplete) {\n observer.observe(internalContentRef.current);\n }\n\n return () => observer.disconnect();\n }, [initialAnimationComplete, setHeightFromContent]);\n\n // Reset the animation complete state when the combobox is closed\n React.useEffect(() => {\n if (initialAnimationComplete === true && context.open === false) {\n setInitialAnimationComplete(false);\n }\n }, [context.open, initialAnimationComplete]);\n\n // On open, set the height of the content after the animation completes\n // we add a timeout here to ensure that the DOM element has responded to\n // the state changes first\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n if (context.open) {\n timeout = setTimeout(() => {\n setHeightFromContent(internalContentRef.current as unknown as Element);\n }, 10);\n }\n\n return () => timeout && clearTimeout(timeout);\n }, [context.open, setHeightFromContent]);\n\n return (\n <Portal.Root asChild>\n {/* \n We add radix's dismissable layer here so that we can swallow any escape\n key presses to prevent cases like a modal closing when we close the\n combobox \n */}\n <DismissableLayer\n onEscapeKeyDown={(event) => {\n if (context.open) {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.setOpen(false);\n }\n }}\n >\n <TelegraphMenu.Content\n className=\"tgph\"\n mt=\"1\"\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current) {\n context.triggerRef?.current?.focus();\n }\n\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\n bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\n transition: \"min-height 200ms ease-in-out\",\n minHeight: height ? `${height}px` : \"0\",\n ...style,\n ...{\n \"--tgph-comobobox-content-transform-origin\":\n \"var(--radix-popper-transform-origin)\",\n \"--tgph-combobox-content-available-width\":\n \"var(--radix-popper-available-width)\",\n \"--tgph-combobox-content-available-height\":\n \"calc(var(--radix-popper-available-height) - var(--tgph-spacing-8))\",\n \"--tgph-comobobox-trigger-width\":\n \"var(--radix-popper-anchor-width)\",\n \"--tgph-combobox-trigger-height\":\n \"var(--radix-popper-anchor-height)\",\n },\n }}\n {...props}\n tgphRef={composedRef}\n data-tgph-combobox-content\n data-tgph-combobox-content-open={context.open}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // If the first option is focused and the user presses the up\n // arrow key, focus the search input\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (\n document.activeElement === options?.[0] &&\n LAST_KEYS.includes(event.key)\n ) {\n context.searchRef?.current?.focus();\n }\n }}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\n </Portal.Root>\n );\n};\n\ntype OptionsProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>>;\n\nconst Options = <T extends TgphElement>({ ...props }: OptionsProps<T>) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Stack\n id={context.contentId}\n direction=\"column\"\n gap=\"1\"\n style={{\n overflowY: \"auto\",\n // Available Height - Padding from edge of screen\n maxHeight:\n \"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))\",\n }}\n // Accessibility attributes\n role=\"listbox\"\n {...props}\n />\n );\n};\n\ntype OptionProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n selected?: boolean | null;\n};\n\nconst Option = <T extends TgphElement>({\n value,\n label,\n selected,\n onSelect,\n children,\n ...props\n}: OptionProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isFocused, setIsFocused] = React.useState(false);\n const contextValue = context.value;\n\n const isVisible =\n !context.searchQuery ||\n doesOptionMatchSearchQuery({\n label: label?.toString() || children?.toString(),\n value,\n searchQuery: context.searchQuery,\n });\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n )\n : getValueFromOption(contextValue, context.legacyBehavior) === value;\n\n const handleSelection = (event: Event | React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // Don't do anything if the key isn't a selection key\n const keyboardEvent = event as React.KeyboardEvent;\n if (keyboardEvent.key && !SELECT_KEYS.includes(keyboardEvent.key)) return;\n\n // Don't bubble up the event\n event.preventDefault();\n\n if (context.closeOnSelect === true) {\n context.setOpen(false);\n }\n\n if (onSelect) {\n // Need to convert to non keyboard type event\n // since onSelect is expecting a mouse event\n // and we've handled the keyboard event already\n const onSelectEvent = event as unknown as Event;\n return onSelect(onSelectEvent);\n }\n\n if (isSingleSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n\n // TODO: Remove this once { value, label } option is deprecated\n if (context.legacyBehavior === true) {\n onValueChange?.({ value, label });\n } else {\n onValueChange?.(value);\n }\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = isSelected\n ? contextValue.filter(\n (v) => getValueFromOption(v, context.legacyBehavior) !== value,\n )\n : [\n ...contextValue,\n // TODO: Remove this once { value, label } option is deprecated\n context.legacyBehavior === true ? { value, label } : value,\n ];\n\n onValueChange?.(newValue);\n }\n\n context.triggerRef?.current?.focus();\n };\n\n if (isVisible) {\n return (\n <TelegraphMenu.Button\n type=\"button\"\n onSelect={handleSelection}\n onKeyDown={handleSelection}\n // Force null if selected equals null so we\n // can override the icon of the button\n selected={selected === null ? null : selected ?? isSelected}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n // Accessibility attributes\n role=\"option\"\n aria-selected={isSelected ? \"true\" : \"false\"}\n // Custom attributes\n data-tgph-combobox-option\n data-tgph-combobox-option-focused={isFocused}\n data-tgph-combobox-option-value={value}\n data-tgph-combobox-option-label={label}\n {...props}\n >\n {label || children || value}\n </TelegraphMenu.Button>\n );\n }\n};\n\ntype SearchProps = TgphComponentProps<typeof TelegraphInput> & {\n label?: string;\n};\n\nconst Search = ({\n label = \"Search\",\n placeholder = \"Search\",\n tgphRef,\n value: controlledValueProp,\n onValueChange: onValueChangeProp,\n ...props\n}: SearchProps) => {\n const id = React.useId();\n const context = React.useContext(ComboboxContext);\n const composedRef = useComposedRefs(tgphRef, context.searchRef);\n\n const value = controlledValueProp ?? context.searchQuery;\n const onValueChange = onValueChangeProp ?? context.setSearchQuery;\n\n React.useEffect(() => {\n const handleSearchKeyDown = (event: KeyboardEvent) => {\n if (FIRST_KEYS.includes(event.key)) {\n context.contentRef?.current?.focus({ preventScroll: true });\n }\n\n if (event.key === \"Escape\") {\n context.setOpen(false);\n }\n\n event.stopPropagation();\n };\n\n const searchInput = context.searchRef?.current;\n\n if (searchInput) {\n searchInput.addEventListener(\"keydown\", handleSearchKeyDown);\n return () => {\n searchInput.removeEventListener(\"keydown\", handleSearchKeyDown);\n };\n }\n }, [context]);\n\n return (\n <Box borderBottom=\"px\" px=\"1\" pb=\"1\">\n <VisuallyHidden.Root>\n <Text as=\"label\" htmlFor={id}>\n {label}\n </Text>\n </VisuallyHidden.Root>\n <TelegraphInput\n id={id}\n variant=\"ghost\"\n placeholder={placeholder}\n value={value}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n onValueChange(event.target.value);\n }}\n LeadingComponent={<Icon icon={Lucide.Search} alt=\"Search Icon\" />}\n TrailingComponent={\n context?.searchQuery && context?.searchQuery?.length > 0 ? (\n <TelegraphButton\n variant=\"ghost\"\n color=\"gray\"\n icon={{ icon: Lucide.X, alt: \"Clear Search Query\" }}\n onClick={() => context.setSearchQuery?.(\"\")}\n />\n ) : null\n }\n autoFocus\n data-tgph-combobox-search\n aria-controls={context.contentId}\n {...props}\n tgphRef={composedRef}\n />\n </Box>\n );\n};\n\ntype EmptyProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>> & {\n icon?: TgphComponentProps<typeof Icon> | null;\n message?: string | null;\n};\n\nconst Empty = <T extends TgphElement>({\n icon = { icon: Lucide.Search, alt: \"Search Icon\" },\n message = \"No results found\",\n children,\n ...props\n}: EmptyProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isVisible, setIsVisible] = React.useState(false);\n\n React.useEffect(() => {\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (options?.length === 0) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }, [context.searchQuery, context.contentRef, children]);\n\n if (isVisible) {\n return (\n <Stack\n gap=\"1\"\n align=\"center\"\n justify=\"center\"\n w=\"full\"\n my=\"8\"\n data-tgph-combobox-empty\n {...props}\n >\n {icon === null ? <></> : <Icon {...icon} />}\n {message === null ? <></> : <Text as=\"span\">{message}</Text>}\n </Stack>\n );\n }\n};\n\ntype CreateProps<\n T extends TgphElement,\n LB extends boolean,\n> = TgphComponentProps<typeof TelegraphMenu.Button<T>> & {\n leadingText?: string;\n} & (LB extends true\n ? {\n values: Array<DefinedOption>;\n onCreate: (value: { value: string; label?: string }) => void;\n legacyBehavior: true;\n }\n : {\n values?: Array<string>;\n onCreate?: (value: string) => void;\n legacyBehavior?: false;\n });\n\nconst Create = <T extends TgphElement, LB extends boolean>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n legacyBehavior = false as LB,\n ...props\n}: CreateProps<T, LB>) => {\n const context = React.useContext(ComboboxContext);\n\n const variableAlreadyExists = React.useCallback(\n (searchQuery: string | undefined) => {\n if (!values || values?.length === 0) return false;\n return values.some(\n (v) => getValueFromOption(v, legacyBehavior) === searchQuery,\n );\n },\n [values, legacyBehavior],\n );\n\n if (context.searchQuery && !variableAlreadyExists(context.searchQuery)) {\n return (\n <Option\n leadingIcon={{ icon: Lucide.Plus, \"aria-hidden\": true }}\n mx=\"1\"\n value={context.searchQuery}\n label={`${leadingText} \"${context.searchQuery}\"`}\n selected={selected}\n onSelect={() => {\n if (onCreate && context.value && context.searchQuery) {\n const value =\n legacyBehavior === true\n ? { value: context.searchQuery }\n : context.searchQuery;\n\n const create = onCreate as CreateProps<T, LB>[\"onCreate\"];\n\n create(value);\n\n context.setSearchQuery?.(\"\");\n }\n }}\n {...props}\n />\n );\n }\n};\n\nconst Combobox = {} as {\n Root: typeof Root;\n Trigger: typeof Trigger;\n Content: typeof Content;\n Options: typeof Options;\n Option: typeof Option;\n Search: typeof Search;\n Empty: typeof Empty;\n Create: typeof Create;\n};\n\nObject.assign(Combobox, {\n Root,\n Trigger,\n Content,\n Options,\n Option,\n Search,\n Empty,\n Create,\n});\n\nexport { Combobox };\n"],"names":["TRIGGER_MIN_HEIGHT","isMultiSelect","value","isSingleSelect","getOptions","children","recursivelyFindOptionElements","options","React","child","_element","element","_a","getValueFromOption","option","legacyBehavior","getCurrentOption","o","doesOptionMatchSearchQuery","label","searchQuery","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","context","foundOption","foundValue","v","jsxs","Tag","motion","Lucide","event","newValue","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","n","Box","currentOption","Trigger","size","getAriaLabelString","shouldShowClearable","handleClear","_b","Tooltip","Content","style","tgphRef","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","rect","observer","entries","entry","timeout","Portal","DismissableLayer","_d","_c","Options","Option","selected","onSelect","isFocused","setIsFocused","contextValue","isVisible","isSelected","handleSelection","keyboardEvent","Search","controlledValueProp","onValueChangeProp","id","handleSearchKeyDown","searchInput","VisuallyHidden","TelegraphInput","Icon","Empty","icon","message","setIsVisible","Fragment","Create","leadingText","values","onCreate","variableAlreadyExists","Combobox"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/Combobox/Combobox.constants.ts","../../src/Combobox/Combobox.helpers.ts","../../src/Combobox/Combobox.tsx"],"sourcesContent":["export const TRIGGER_MIN_HEIGHT = {\n \"0\": \"5\",\n \"1\": \"6\",\n \"2\": \"8\",\n \"3\": \"10\",\n};\n","import React from \"react\";\n\nexport type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | string | React.ReactNode;\nexport const isMultiSelect = (\n value: Option | Array<Option> | undefined,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option> | undefined,\n): value is Option => {\n return (\n (typeof value === \"object\" && !Array.isArray(value)) ||\n typeof value === \"string\" ||\n !value\n );\n};\n\nexport const getOptions = (children: React.ReactNode): Array<DefinedOption> => {\n const recursivelyFindOptionElements = (\n children: React.ReactNode,\n options: Array<React.ReactNode> = [],\n ) => {\n const childrenArray = React.Children.toArray(children);\n\n childrenArray.forEach((child) => {\n if (React.isValidElement(child)) {\n if (child.props.value) {\n // If it has a value prop, it's an option\n options.push(child);\n } else if (child.props.children) {\n // If it has children, recursively search them\n recursivelyFindOptionElements(child.props.children, options);\n }\n }\n });\n\n return options;\n };\n\n const optionElements = recursivelyFindOptionElements(children);\n\n const options = optionElements.map((_element) => {\n const element = _element as React.ReactElement<{\n value: string;\n label?: string | React.ReactNode;\n children?: React.ReactNode;\n }>;\n return {\n value: element.props.value,\n label:\n element.props?.label || element.props.children || element.props.value,\n };\n });\n\n return options;\n};\n\nexport const getValueFromOption = (\n option: Option | undefined,\n legacyBehavior: boolean,\n): string | undefined => {\n if (!option) return undefined;\n\n if (legacyBehavior === true) {\n return (option as DefinedOption)?.value;\n }\n\n return option as string;\n};\n\nexport const getCurrentOption = (\n value: Option | undefined,\n options: Array<DefinedOption>,\n legacyBehavior: boolean,\n): DefinedOption | undefined => {\n if (!value) return undefined;\n if (!options || options.length === 0) return undefined;\n return options.find(\n (o) => o.value === getValueFromOption(value, legacyBehavior),\n );\n};\n\ntype DoesOptionMatchSearchQueryProps = {\n label?: string;\n value?: string;\n searchQuery: string;\n};\n\nexport const doesOptionMatchSearchQuery = ({\n label,\n value,\n searchQuery,\n}: DoesOptionMatchSearchQueryProps) => {\n return (\n value?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n label?.toLowerCase().includes(searchQuery.toLowerCase())\n );\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport * as Portal from \"@radix-ui/react-portal\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { Button as TelegraphButton } from \"@telegraph/button\";\nimport { useComposedRefs } from \"@telegraph/compose-refs\";\nimport {\n RefToTgphRef,\n type TgphComponentProps,\n type TgphElement,\n} from \"@telegraph/helpers\";\nimport { Icon, Lucide } from \"@telegraph/icon\";\nimport { Input as TelegraphInput } from \"@telegraph/input\";\nimport { Box, Stack } from \"@telegraph/layout\";\nimport { Menu as TelegraphMenu } from \"@telegraph/menu\";\nimport { AnimatePresence, motion } from \"@telegraph/motion\";\nimport { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\n doesOptionMatchSearchQuery,\n getCurrentOption,\n getOptions,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\n\nconst FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nconst LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nconst SELECT_KEYS = [\"Enter\", \" \"];\n\ntype SingleSelect = {\n value?: Option;\n onValueChange?: (value: Option | undefined) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O> = O extends DefinedOption | string | undefined\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n> = {\n value?: O;\n onValueChange?: (value: O) => void;\n layout?: LayoutValue<O>;\n open?: boolean;\n defaultOpen?: boolean;\n errored?: boolean;\n placeholder?: string;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n closeOnSelect?: boolean;\n clearable?: boolean;\n disabled?: boolean;\n legacyBehavior?: LB;\n children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<\n RootProps<(Option | Array<Option>) | (string | Array<string>), boolean>,\n \"children\"\n > & {\n contentId: string;\n triggerId: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n onOpenToggle: () => void;\n searchQuery?: string;\n setSearchQuery?: (query: string) => void;\n triggerRef?: React.RefObject<HTMLDivElement>;\n searchRef?: React.RefObject<HTMLInputElement>;\n contentRef?: React.RefObject<HTMLDivElement>;\n options: Array<DefinedOption>;\n legacyBehavior: boolean;\n }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n options: [],\n legacyBehavior: false,\n});\n\nconst Root = <\n O extends (Option | Array<Option>) | (string | Array<string>),\n LB extends boolean,\n>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n legacyBehavior = false as LB,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n children,\n ...props\n}: RootProps<O, LB>) => {\n const contentId = React.useId();\n const triggerId = React.useId();\n const triggerRef = React.useRef(null);\n const searchRef = React.useRef(null);\n const contentRef = React.useRef<HTMLDivElement>(null);\n\n const options = React.useMemo(() => {\n return getOptions(children);\n }, [children]);\n\n const [searchQuery, setSearchQuery] = React.useState<string>(\"\");\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpenProp,\n onChange: onOpenChangeProp,\n });\n\n const onOpenToggle = React.useCallback(() => {\n setOpen((prevOpen) => !prevOpen);\n }, [setOpen]);\n\n React.useEffect(() => {\n // If the combobox is closed clear\n // the search query\n if (!open) {\n setSearchQuery(\"\");\n }\n }, [open]);\n\n return (\n <ComboboxContext.Provider\n value={{\n contentId,\n triggerId,\n value,\n // Need to cast this to avoid type errors\n // because the type of onValueChange is not\n // consistent with the value type\n onValueChange: onValueChange as (value: Option | Array<Option>) => void,\n placeholder,\n open,\n setOpen,\n onOpenToggle,\n closeOnSelect,\n clearable,\n disabled,\n searchQuery,\n setSearchQuery,\n triggerRef,\n searchRef,\n contentRef,\n errored,\n layout,\n options,\n legacyBehavior,\n }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n >\n {children}\n </TelegraphMenu.Root>\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n const option = React.useMemo(() => {\n // Find option amongst other options\n const foundOption = context.options.find((o) => o.value === value);\n if (foundOption) return foundOption.label || foundOption.value;\n\n // Find option amongst the current values in the case of creation\n if (!context.value) return undefined;\n const contextValue = context.value as Array<Option>;\n\n const foundValue = contextValue.find(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n );\n\n if (foundValue) return foundValue;\n }, [context.options, context.value, value, context.legacyBehavior]);\n\n return (\n <Tag.Root\n as={motion.span}\n initializeWithAnimation={false}\n initial={{ opacity: 0, scale: 0.5 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.5 }}\n transition={{ duration: 100, type: \"spring\" }}\n tgph-motion-key={value}\n size=\"1\"\n layout=\"position\"\n {...props}\n >\n <Tag.Text>{option}</Tag.Text>\n <Tag.Button\n icon={{ icon: Lucide.X, alt: `Remove ${value}` }}\n onClick={(event: React.MouseEvent) => {\n if (!context.onValueChange) return;\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = contextValue.filter((v) => {\n const valueOption = getValueFromOption(v, context.legacyBehavior);\n return valueOption !== value;\n });\n\n onValueChange?.(newValue);\n // Stop click event from bubbling up\n event.stopPropagation();\n // Stop the button \"submit\" action from triggering\n event.preventDefault();\n }}\n />\n </Tag.Root>\n );\n};\n\nconst TriggerValue = () => {\n const context = React.useContext(ComboboxContext);\n\n if (context.value && isMultiSelect(context.value)) {\n const layout = context.layout || \"truncate\";\n const truncatedLength = context.value.length - 2;\n const truncatedLengthStringArray = truncatedLength.toString().split(\"\");\n\n if (context.value.length === 0) {\n return (\n <TelegraphButton.Text color=\"gray\">\n {context.placeholder}\n </TelegraphButton.Text>\n );\n }\n return (\n <Stack\n gap=\"1\"\n w=\"full\"\n wrap={layout === \"wrap\" ? \"wrap\" : \"nowrap\"}\n align=\"center\"\n style={{\n position: \"relative\",\n flexGrow: 1,\n }}\n >\n <AnimatePresence\n presenceMap={context.value.map((v) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n return {\n \"tgph-motion-key\": value || \"\",\n value: true,\n };\n })}\n >\n {context.value.map((v, i) => {\n const value = getValueFromOption(v, context.legacyBehavior);\n if (\n value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={value}>\n <TriggerTag value={value} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence\n presenceMap={[\n {\n \"tgph-motion-key\": \"combobox-more\",\n value: true,\n },\n ]}\n >\n {layout === \"truncate\" && context.value.length > 2 && (\n <Stack\n as={motion.div}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n position=\"absolute\"\n right=\"0\"\n style={{\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence\n presenceMap={truncatedLengthStringArray.map((n) => ({\n \"tgph-motion-key\": n,\n value: true,\n }))}\n >\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 100, type: \"spring\" }}\n w=\"2\"\n display=\"inline-block\"\n tgph-motion-key={n}\n key={n}\n >\n {n}\n </Box>\n ))}{\" \"}\n </AnimatePresence>\n more\n </Text>\n </Stack>\n )}\n </AnimatePresence>\n </Stack>\n );\n }\n\n if (context && isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {currentOption?.label || context.placeholder}\n </TelegraphButton.Text>\n );\n }\n};\n\ntype TriggerProps = React.ComponentProps<typeof TelegraphMenu.Trigger> & {\n placeholder?: string;\n size?: TgphComponentProps<typeof TelegraphButton.Root>[\"size\"];\n};\n\nconst Trigger = ({ size = \"2\", ...props }: TriggerProps) => {\n const context = React.useContext(ComboboxContext);\n\n const getAriaLabelString = React.useCallback(() => {\n if (!context.value) return context.placeholder;\n if (isSingleSelect(context.value)) {\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n return currentOption?.label || context.placeholder;\n }\n if (isMultiSelect(context.value)) {\n return (\n context.value\n ?.map((v) => {\n const currentOption = getCurrentOption(\n v,\n context.options,\n context.legacyBehavior,\n );\n\n return currentOption?.label;\n })\n .join(\", \") || context.placeholder\n );\n }\n }, [\n context.value,\n context.placeholder,\n context.options,\n context.legacyBehavior,\n ]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\n }\n\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n }, [context.clearable, context.value]);\n\n const handleClear = () => {\n if (isMultiSelect(context.value)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n onValueChange?.([]);\n }\n\n if (isSingleSelect(context.value)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n onValueChange?.(undefined);\n }\n context.triggerRef?.current?.focus();\n };\n\n return (\n <TelegraphMenu.Trigger\n {...props}\n asChild\n onClick={(event: React.MouseEvent) => {\n event.preventDefault();\n context.onOpenToggle();\n context.triggerRef?.current?.focus();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Lets the user tab in and out of the combobox as usual\n if (event.key === \"Tab\") {\n event.stopPropagation();\n return;\n }\n if (SELECT_KEYS.includes(event.key)) {\n event.preventDefault();\n return;\n }\n\n if (event.key === \"ArrowDown\") {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.onOpenToggle();\n return;\n }\n }}\n tgphRef={context.triggerRef}\n >\n <TelegraphButton.Root\n id={context.triggerId}\n type=\"button\"\n bg=\"surface-1\"\n variant=\"outline\"\n align=\"center\"\n minH={TRIGGER_MIN_HEIGHT[size]}\n h=\"full\"\n w=\"full\"\n py=\"1\"\n size={size}\n color={context.errored ? \"red\" : \"gray\"}\n justify=\"space-between\"\n // Accessibility attributes\n role=\"combobox\"\n aria-label={getAriaLabelString()}\n aria-controls={context.contentId}\n aria-expanded={context.open}\n aria-haspopup=\"listbox\"\n // Custom attributes\n data-tgph-combobox-trigger\n data-tgph-comobox-trigger-open={context.open}\n disabled={context.disabled}\n >\n <TriggerValue />\n <Stack align=\"center\" gap=\"1\">\n {shouldShowClearable && (\n <Tooltip label=\"Clear field\">\n <TelegraphButton\n type=\"button\"\n icon={{ icon: Lucide.X, alt: \"Clear field\" }}\n size=\"1\"\n variant=\"ghost\"\n onClick={(event: React.MouseEvent) => {\n if (!context.value) return;\n event.stopPropagation();\n handleClear();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.stopPropagation();\n handleClear();\n }\n }}\n data-tgph-combobox-clear\n style={{\n // Remove margin to make the clear button flush\n // with the trigger button\n marginTop: \"calc(-1 * var(--tgph-spacing-1)\",\n marginBottom: \"calc(-1 * var(--tgph-spacing-1)\",\n }}\n />\n </Tooltip>\n )}\n <TelegraphButton.Icon\n as={motion.span}\n animate={{ rotate: context.open ? 180 : 0 }}\n transition={{ duration: 150, type: \"spring\" }}\n icon={Lucide.ChevronDown}\n aria-hidden\n />\n </Stack>\n </TelegraphButton.Root>\n </TelegraphMenu.Trigger>\n );\n};\n\ntype ContentProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Content<T>\n>;\n\nconst Content = <T extends TgphElement>({\n style,\n children,\n tgphRef,\n ...props\n}: ContentProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const hasInteractedOutside = React.useRef(false);\n const composedRef = useComposedRefs<unknown>(tgphRef, context.contentRef);\n\n const internalContentRef = React.useRef(null);\n\n const [height, setHeight] = React.useState(0);\n const [initialAnimationComplete, setInitialAnimationComplete] =\n React.useState(false);\n\n const setHeightFromContent = React.useCallback(\n (element: Element) => {\n // Set the initial height of the content after the animation completes\n const rect = element?.getBoundingClientRect();\n if (rect) {\n setHeight(rect.height);\n }\n\n if (!initialAnimationComplete) {\n setInitialAnimationComplete(true);\n }\n },\n [initialAnimationComplete],\n );\n\n React.useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const element = entry.target;\n setHeightFromContent(element);\n }\n });\n // Attatch the observer once the initial animation completes\n // and the content ref is available\n if (internalContentRef.current && initialAnimationComplete) {\n observer.observe(internalContentRef.current);\n }\n\n return () => observer.disconnect();\n }, [initialAnimationComplete, setHeightFromContent]);\n\n // Reset the animation complete state when the combobox is closed\n React.useEffect(() => {\n if (initialAnimationComplete === true && context.open === false) {\n setInitialAnimationComplete(false);\n }\n }, [context.open, initialAnimationComplete]);\n\n // On open, set the height of the content after the animation completes\n // we add a timeout here to ensure that the DOM element has responded to\n // the state changes first\n React.useEffect(() => {\n let timeout: NodeJS.Timeout;\n if (context.open) {\n timeout = setTimeout(() => {\n setHeightFromContent(internalContentRef.current as unknown as Element);\n }, 10);\n }\n\n return () => timeout && clearTimeout(timeout);\n }, [context.open, setHeightFromContent]);\n\n return (\n <Portal.Root asChild>\n {/* \n We add radix's dismissable layer here so that we can swallow any escape\n key presses to prevent cases like a modal closing when we close the\n combobox \n */}\n <DismissableLayer\n onEscapeKeyDown={(event) => {\n if (context.open) {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n event.preventDefault();\n context.setOpen(false);\n }\n }}\n >\n <TelegraphMenu.Content\n className=\"tgph\"\n mt=\"1\"\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current) {\n context.triggerRef?.current?.focus();\n }\n\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\n bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\n transition: \"min-height 200ms ease-in-out\",\n minHeight: height ? `${height}px` : \"0\",\n ...style,\n ...{\n \"--tgph-comobobox-content-transform-origin\":\n \"var(--radix-popper-transform-origin)\",\n \"--tgph-combobox-content-available-width\":\n \"var(--radix-popper-available-width)\",\n \"--tgph-combobox-content-available-height\":\n \"calc(var(--radix-popper-available-height) - var(--tgph-spacing-8))\",\n \"--tgph-comobobox-trigger-width\":\n \"var(--radix-popper-anchor-width)\",\n \"--tgph-combobox-trigger-height\":\n \"var(--radix-popper-anchor-height)\",\n },\n }}\n {...props}\n tgphRef={composedRef}\n data-tgph-combobox-content\n data-tgph-combobox-content-open={context.open}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n onKeyDown={(event: React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // If the first option is focused and the user presses the up\n // arrow key, focus the search input\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (\n document.activeElement === options?.[0] &&\n LAST_KEYS.includes(event.key)\n ) {\n context.searchRef?.current?.focus();\n }\n }}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\n </Portal.Root>\n );\n};\n\ntype OptionsProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>>;\n\nconst Options = <T extends TgphElement>({ ...props }: OptionsProps<T>) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Stack\n id={context.contentId}\n direction=\"column\"\n gap=\"1\"\n style={{\n overflowY: \"auto\",\n // Available Height - Padding from edge of screen\n maxHeight:\n \"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))\",\n }}\n // Accessibility attributes\n role=\"listbox\"\n {...props}\n />\n );\n};\n\ntype OptionProps<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n selected?: boolean | null;\n};\n\nconst Option = <T extends TgphElement>({\n value,\n label,\n selected,\n onSelect,\n children,\n ...props\n}: OptionProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isFocused, setIsFocused] = React.useState(false);\n const contextValue = context.value;\n\n const isVisible =\n !context.searchQuery ||\n doesOptionMatchSearchQuery({\n label: label?.toString() || children?.toString(),\n value,\n searchQuery: context.searchQuery,\n });\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some(\n (v) => getValueFromOption(v, context.legacyBehavior) === value,\n )\n : getValueFromOption(contextValue, context.legacyBehavior) === value;\n\n const handleSelection = (event: Event | React.KeyboardEvent) => {\n // Don't allow the event to bubble up outside of the menu\n event.stopPropagation();\n\n // Don't do anything if the key isn't a selection key\n const keyboardEvent = event as React.KeyboardEvent;\n if (keyboardEvent.key && !SELECT_KEYS.includes(keyboardEvent.key)) return;\n\n // Don't bubble up the event\n event.preventDefault();\n\n if (context.closeOnSelect === true) {\n context.setOpen(false);\n }\n\n if (onSelect) {\n // Need to convert to non keyboard type event\n // since onSelect is expecting a mouse event\n // and we've handled the keyboard event already\n const onSelectEvent = event as unknown as Event;\n return onSelect(onSelectEvent);\n }\n\n if (isSingleSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as SingleSelect[\"onValueChange\"];\n\n // TODO: Remove this once { value, label } option is deprecated\n if (context.legacyBehavior === true) {\n onValueChange?.({ value, label });\n } else {\n onValueChange?.(value);\n }\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n const contextValue = context.value as Array<Option>;\n\n const newValue = isSelected\n ? contextValue.filter(\n (v) => getValueFromOption(v, context.legacyBehavior) !== value,\n )\n : [\n ...contextValue,\n // TODO: Remove this once { value, label } option is deprecated\n context.legacyBehavior === true ? { value, label } : value,\n ];\n\n onValueChange?.(newValue);\n }\n\n context.triggerRef?.current?.focus();\n };\n\n if (isVisible) {\n return (\n <TelegraphMenu.Button\n type=\"button\"\n onSelect={handleSelection}\n onKeyDown={handleSelection}\n // Force null if selected equals null so we\n // can override the icon of the button\n selected={selected === null ? null : selected ?? isSelected}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n // Accessibility attributes\n role=\"option\"\n aria-selected={isSelected ? \"true\" : \"false\"}\n // Custom attributes\n data-tgph-combobox-option\n data-tgph-combobox-option-focused={isFocused}\n data-tgph-combobox-option-value={value}\n data-tgph-combobox-option-label={label}\n {...props}\n >\n {label || children || value}\n </TelegraphMenu.Button>\n );\n }\n};\n\ntype SearchProps = TgphComponentProps<typeof TelegraphInput> & {\n label?: string;\n};\n\nconst Search = ({\n label = \"Search\",\n placeholder = \"Search\",\n tgphRef,\n value: controlledValueProp,\n onValueChange: onValueChangeProp,\n ...props\n}: SearchProps) => {\n const id = React.useId();\n const context = React.useContext(ComboboxContext);\n const composedRef = useComposedRefs(tgphRef, context.searchRef);\n\n const value = controlledValueProp ?? context.searchQuery;\n const onValueChange = onValueChangeProp ?? context.setSearchQuery;\n\n React.useEffect(() => {\n const handleSearchKeyDown = (event: KeyboardEvent) => {\n if (FIRST_KEYS.includes(event.key)) {\n context.contentRef?.current?.focus({ preventScroll: true });\n }\n\n if (event.key === \"Escape\") {\n context.setOpen(false);\n }\n\n event.stopPropagation();\n };\n\n const searchInput = context.searchRef?.current;\n\n if (searchInput) {\n searchInput.addEventListener(\"keydown\", handleSearchKeyDown);\n return () => {\n searchInput.removeEventListener(\"keydown\", handleSearchKeyDown);\n };\n }\n }, [context]);\n\n return (\n <Box borderBottom=\"px\" px=\"1\" pb=\"1\">\n <VisuallyHidden.Root>\n <Text as=\"label\" htmlFor={id}>\n {label}\n </Text>\n </VisuallyHidden.Root>\n <TelegraphInput\n id={id}\n variant=\"ghost\"\n placeholder={placeholder}\n value={value}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n onValueChange(event.target.value);\n }}\n LeadingComponent={<Icon icon={Lucide.Search} alt=\"Search Icon\" />}\n TrailingComponent={\n context?.searchQuery && context?.searchQuery?.length > 0 ? (\n <TelegraphButton\n variant=\"ghost\"\n color=\"gray\"\n icon={{ icon: Lucide.X, alt: \"Clear Search Query\" }}\n onClick={() => context.setSearchQuery?.(\"\")}\n />\n ) : null\n }\n autoFocus\n data-tgph-combobox-search\n aria-controls={context.contentId}\n {...props}\n tgphRef={composedRef}\n />\n </Box>\n );\n};\n\ntype EmptyProps<T extends TgphElement> = TgphComponentProps<typeof Stack<T>> & {\n icon?: TgphComponentProps<typeof Icon> | null;\n message?: string | null;\n};\n\nconst Empty = <T extends TgphElement>({\n icon = { icon: Lucide.Search, alt: \"Search Icon\" },\n message = \"No results found\",\n children,\n ...props\n}: EmptyProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const [isVisible, setIsVisible] = React.useState(false);\n\n React.useEffect(() => {\n const options = context.contentRef?.current?.querySelectorAll(\n \"[data-tgph-combobox-option]\",\n );\n\n if (options?.length === 0) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }, [context.searchQuery, context.contentRef, children]);\n\n if (isVisible) {\n return (\n <Stack\n gap=\"1\"\n align=\"center\"\n justify=\"center\"\n w=\"full\"\n my=\"8\"\n data-tgph-combobox-empty\n {...props}\n >\n {icon === null ? <></> : <Icon {...icon} />}\n {message === null ? <></> : <Text as=\"span\">{message}</Text>}\n </Stack>\n );\n }\n};\n\ntype CreateProps<\n T extends TgphElement,\n LB extends boolean,\n> = TgphComponentProps<typeof TelegraphMenu.Button<T>> & {\n leadingText?: string;\n} & (LB extends true\n ? {\n values: Array<DefinedOption>;\n onCreate: (value: { value: string; label?: string }) => void;\n legacyBehavior: true;\n }\n : {\n values?: Array<string>;\n onCreate?: (value: string) => void;\n legacyBehavior?: false;\n });\n\nconst Create = <T extends TgphElement, LB extends boolean>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n legacyBehavior = false as LB,\n ...props\n}: CreateProps<T, LB>) => {\n const context = React.useContext(ComboboxContext);\n\n const variableAlreadyExists = React.useCallback(\n (searchQuery: string | undefined) => {\n if (!values || values?.length === 0) return false;\n return values.some(\n (v) => getValueFromOption(v, legacyBehavior) === searchQuery,\n );\n },\n [values, legacyBehavior],\n );\n\n if (context.searchQuery && !variableAlreadyExists(context.searchQuery)) {\n return (\n <Option\n leadingIcon={{ icon: Lucide.Plus, \"aria-hidden\": true }}\n mx=\"1\"\n value={context.searchQuery}\n label={`${leadingText} \"${context.searchQuery}\"`}\n selected={selected}\n onSelect={() => {\n if (onCreate && context.value && context.searchQuery) {\n const value =\n legacyBehavior === true\n ? { value: context.searchQuery }\n : context.searchQuery;\n\n const create = onCreate as CreateProps<T, LB>[\"onCreate\"];\n\n create(value);\n\n context.setSearchQuery?.(\"\");\n }\n }}\n {...props}\n />\n );\n }\n};\n\nconst Combobox = {} as {\n Root: typeof Root;\n Trigger: typeof Trigger;\n Content: typeof Content;\n Options: typeof Options;\n Option: typeof Option;\n Search: typeof Search;\n Empty: typeof Empty;\n Create: typeof Create;\n};\n\nObject.assign(Combobox, {\n Root,\n Trigger,\n Content,\n Options,\n Option,\n Search,\n Empty,\n Create,\n});\n\nexport { Combobox };\n"],"names":["TRIGGER_MIN_HEIGHT","isMultiSelect","value","isSingleSelect","getOptions","children","recursivelyFindOptionElements","options","React","child","_element","element","_a","getValueFromOption","option","legacyBehavior","getCurrentOption","o","doesOptionMatchSearchQuery","label","searchQuery","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","context","foundOption","foundValue","v","jsxs","Tag","motion","Lucide","event","newValue","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","n","Box","currentOption","Trigger","size","getAriaLabelString","shouldShowClearable","handleClear","_b","Tooltip","Content","style","tgphRef","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","rect","observer","entries","entry","timeout","Portal","DismissableLayer","_d","_c","Options","Option","selected","onSelect","isFocused","setIsFocused","contextValue","isVisible","isSelected","handleSelection","keyboardEvent","Search","controlledValueProp","onValueChangeProp","id","handleSearchKeyDown","searchInput","VisuallyHidden","TelegraphInput","Icon","Empty","icon","message","setIsVisible","Fragment","Create","leadingText","values","onCreate","variableAlreadyExists","Combobox"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telegraph/combobox",
3
- "version": "0.0.51",
3
+ "version": "0.0.52",
4
4
  "description": "A styled menu, triggered by a Select, that combines an Input and Single- or Multi-select.",
5
5
  "repository": "https://github.com/knocklabs/telegraph/tree/main/packages/combobox",
6
6
  "author": "@knocklabs",
@@ -36,17 +36,17 @@
36
36
  "@radix-ui/react-portal": "^1.1.3",
37
37
  "@radix-ui/react-use-controllable-state": "^1.1.0",
38
38
  "@radix-ui/react-visually-hidden": "^1.1.0",
39
- "@telegraph/button": "^0.0.57",
39
+ "@telegraph/button": "^0.0.58",
40
40
  "@telegraph/compose-refs": "^0.0.2",
41
41
  "@telegraph/helpers": "^0.0.7",
42
- "@telegraph/icon": "^0.0.37",
43
- "@telegraph/input": "^0.0.29",
44
- "@telegraph/layout": "^0.1.3",
45
- "@telegraph/menu": "^0.0.41",
42
+ "@telegraph/icon": "^0.0.38",
43
+ "@telegraph/input": "^0.0.30",
44
+ "@telegraph/layout": "^0.1.4",
45
+ "@telegraph/menu": "^0.0.42",
46
46
  "@telegraph/motion": "^0.0.3",
47
- "@telegraph/tag": "^0.0.62",
48
- "@telegraph/tooltip": "^0.0.31",
49
- "@telegraph/typography": "^0.1.3"
47
+ "@telegraph/tag": "^0.0.63",
48
+ "@telegraph/tooltip": "^0.0.32",
49
+ "@telegraph/typography": "^0.1.4"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@knocklabs/eslint-config": "^0.0.3",
@@ -59,7 +59,7 @@
59
59
  "react": "^18.2.0",
60
60
  "react-dom": "^18.3.1",
61
61
  "typescript": "^5.5.4",
62
- "vite": "^5.4.7"
62
+ "vite": "^6.0.11"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "react": "^18.2.0",