@telegraph/combobox 0.0.78 → 0.0.80

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,26 @@
1
1
  # @telegraph/combobox
2
2
 
3
+ ## 0.0.80
4
+
5
+ ### Patch Changes
6
+
7
+ - [#446](https://github.com/knocklabs/telegraph/pull/446) [`5c0784e`](https://github.com/knocklabs/telegraph/commit/5c0784e3fc5198ae4a83ef5c09b7b8c57c8d264d) Thanks [@kylemcd](https://github.com/kylemcd)! - add truncate component and integrate into combobox
8
+
9
+ - Updated dependencies [[`5c0784e`](https://github.com/knocklabs/telegraph/commit/5c0784e3fc5198ae4a83ef5c09b7b8c57c8d264d)]:
10
+ - @telegraph/truncate@0.0.1
11
+ - @telegraph/tooltip@0.0.46
12
+ - @telegraph/tag@0.0.84
13
+
14
+ ## 0.0.79
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies [[`14ea9d1`](https://github.com/knocklabs/telegraph/commit/14ea9d164d69c0adeae4f2405565592aa4c9c75c)]:
19
+ - @telegraph/tooltip@0.0.45
20
+ - @telegraph/motion@0.0.8
21
+ - @telegraph/tag@0.0.83
22
+ - @telegraph/menu@0.0.63
23
+
3
24
  ## 0.0.78
4
25
 
5
26
  ### Patch Changes
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),X=require("@radix-ui/react-dismissable-layer"),W=require("@radix-ui/react-portal"),J=require("@radix-ui/react-use-controllable-state"),Z=require("@radix-ui/react-visually-hidden"),B=require("@telegraph/button"),H=require("@telegraph/compose-refs"),ee=require("@telegraph/helpers"),C=require("@telegraph/icon"),te=require("@telegraph/input"),S=require("@telegraph/layout"),A=require("@telegraph/menu"),q=require("@telegraph/typography"),l=require("react"),k=require("@telegraph/motion"),M=require("@telegraph/tag"),ne=require("@telegraph/tooltip");function _(t){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const o=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(n,e,o.get?o:{enumerable:!0,get:()=>t[e]})}}return n.default=t,Object.freeze(n)}const oe=_(W),re=_(Z),ae={0:"5",1:"6",2:"8",3:"10"},R=t=>Array.isArray(t),E=t=>typeof t=="object"&&!Array.isArray(t)||typeof t=="string"||!t,se=t=>{const n=(a,i=[])=>(l.Children.toArray(a).forEach(s=>{l.isValidElement(s)&&(s.props.value?i.push(s):s.props.children&&n(s.props.children,i))}),i);return n(t).map(a=>{var r;const i=a;return{value:i.props.value,label:((r=i.props)==null?void 0:r.label)||i.props.children||i.props.value}})},T=(t,n)=>{if(t)return n===!0?t==null?void 0:t.value:t},Q=(t,n,e)=>{if(!t||!n||n.length===0)return;const o=n.find(a=>a.value===T(t,e));if(o)return o},ie=({children:t,value:n,searchQuery:e})=>{const o=K(t);return(n==null?void 0:n.toLowerCase().includes(e.toLowerCase()))||o.some(a=>a.toLowerCase().includes(e.toLowerCase()))},K=t=>{const n=l.Children.toArray(t),e=[];return n.forEach(o=>{typeof o=="string"&&e.push(o),l.isValidElement(o)&&o.props.children&&e.push(...K(o.props.children))}),e},ce=({icon:t=C.Lucide.ChevronDown,"aria-hidden":n=!0,...e})=>{const o=l.useContext(y);return c.jsx(B.Button.Icon,{as:k.motion.span,animate:{rotate:o.open?180:0},transition:{duration:150,type:"spring"},icon:t,"aria-hidden":n,...e})},le=({tooltipProps:t,...n})=>{const e=l.useContext(y),o=()=>{var i,r;if(R(e.value)){const s=e.onValueChange;s==null||s([])}if(E(e.value)){const s=e.onValueChange;s==null||s(void 0)}(r=(i=e.triggerRef)==null?void 0:i.current)==null||r.focus()};return l.useMemo(()=>{var i;if(E(e.value))return e.clearable&&e.value;if(R(e.value))return e.clearable&&((i=e.value)==null?void 0:i.length)>0},[e.clearable,e.value])?c.jsx(ne.Tooltip,{label:"Clear field",...t,children:c.jsx(B.Button,{type:"button",icon:{icon:C.Lucide.X,alt:"Clear field"},size:"1",variant:"ghost",onClick:i=>{e.value&&(i.stopPropagation(),o())},onKeyDown:i=>{(i.key==="Enter"||i.key===" ")&&(i.stopPropagation(),o())},"data-tgph-combobox-clear":!0,style:{marginTop:"calc(-1 * var(--tgph-spacing-1)",marginBottom:"calc(-1 * var(--tgph-spacing-1)"},...n})}):null},ue=({children:t,...n})=>{const e=l.useContext(y),o=l.useMemo(()=>{var s;if(!E(e.value))return;const a=Q(e.value,e.options,e.legacyBehavior),i=(a==null?void 0:a.label)||(a==null?void 0:a.value)||e.placeholder,r=e.legacyBehavior&&((s=e==null?void 0:e.value)==null?void 0:s.label);return r||i},[e.value,e.options,e.legacyBehavior,e.placeholder]);return c.jsx(B.Button.Text,{color:e.value?"default":"gray",textOverflow:"ellipsis",overflow:"hidden",...n,children:t||o})},pe=({children:t,...n})=>{const e=l.useContext(y);return c.jsx(B.Button.Text,{color:"gray",...n,children:t||e.placeholder})},ge=({children:t})=>{const n=l.useContext(y);if(!R(n.value))return null;const e=n.layout||"truncate",a=(n.value.length-2).toString().split("");return c.jsxs(S.Stack,{gap:"1",w:"full",wrap:e==="wrap"?"wrap":"nowrap",align:"center",style:{position:"relative",flexGrow:1},children:[c.jsx(k.AnimatePresence,{presenceMap:n.value.map(i=>({"tgph-motion-key":T(i,n.legacyBehavior)||"",value:!0})),children:t}),c.jsx(k.AnimatePresence,{presenceMap:[{"tgph-motion-key":"combobox-more",value:!0}],children:e==="truncate"&&n.value.length>2&&c.jsx(S.Stack,{as:k.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":`${n.value.length-2} more selected`,position:"absolute",right:"0",style:{backgroundImage:"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)"},children:c.jsxs(q.Text,{as:"span",size:"1",style:{whiteSpace:"nowrap"},children:["+",c.jsxs(k.AnimatePresence,{presenceMap:a.map(i=>({"tgph-motion-key":i,value:!0})),children:[a.map(i=>c.jsx(S.Box,{as:k.motion.span,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:100,type:"spring"},w:"2",display:"inline-block","tgph-motion-key":i,children:i},i))," "]}),"more"]})})})]})},V=l.createContext({value:""}),de=({value:t,children:n,...e})=>c.jsx(V.Provider,{value:{value:t},children:c.jsx(M.Tag.Root,{as:k.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",...e,children:n})}),fe=({children:t,...n})=>{const e=l.useContext(y),o=l.useContext(V),a=l.useMemo(()=>{const i=e.options.find(p=>p.value===o.value);if(i)return i.label||i.value;if(!e.value)return;const s=e.value.find(p=>T(p,e.legacyBehavior)===o.value);if(s)return s},[e.options,e.value,o.value,e.legacyBehavior]);return c.jsx(M.Tag.Text,{...n,children:t||a})},he=({children:t,...n})=>{const e=l.useContext(y),o=l.useContext(V);return c.jsx(M.Tag.Button,{icon:{icon:C.Lucide.X,alt:`Remove ${o.value}`},onClick:a=>{if(!e.onValueChange)return;const i=e.onValueChange,s=e.value.filter(p=>T(p,e.legacyBehavior)!==o.value);i==null||i(s),a.stopPropagation(),a.preventDefault()},...n,children:t})},xe=({value:t,children:n,...e})=>c.jsxs(P.Root,{value:t,...e,children:[c.jsx(P.Text,{children:n}),c.jsx(P.Button,{})]}),P={Root:de,Text:fe,Button:he,Default:xe},j={TriggerIndicator:ce,TriggerClear:le,TriggerText:ue,TriggerPlaceholder:pe,TriggerTagsContainer:ge,TriggerTag:P},ye=["ArrowDown","PageUp","Home"],me=["ArrowUp","PageDown","End"],N=["Enter"," "],y=l.createContext({value:void 0,onValueChange:()=>{},contentId:"",triggerId:"",open:!1,setOpen:()=>{},onOpenToggle:()=>{},clearable:!1,disabled:!1,options:[],legacyBehavior:!1}),be=({modal:t=!0,closeOnSelect:n=!0,clearable:e=!1,disabled:o=!1,legacyBehavior:a=!1,open:i,onOpenChange:r,defaultOpen:s,value:p,onValueChange:g,errored:m,placeholder:v,layout:h,children:u,...d})=>{const x=l.useId(),b=l.useId(),f=l.useRef(null),w=l.useRef(null),D=l.useRef(null),L=l.useMemo(()=>se(u),[u]),[G,F]=l.useState(""),[O=!1,I]=J.useControllableState({prop:i,defaultProp:s,onChange:r}),Y=l.useCallback(()=>{I(U=>!U)},[I]);return l.useEffect(()=>{O||F("")},[O]),c.jsx(y.Provider,{value:{contentId:x,triggerId:b,value:p,onValueChange:g,placeholder:v,open:O,setOpen:I,onOpenToggle:Y,closeOnSelect:n,clearable:e,disabled:o,searchQuery:G,setSearchQuery:F,triggerRef:f,searchRef:w,contentRef:D,errored:m,layout:h,options:L,legacyBehavior:a},children:c.jsx(A.Menu.Root,{open:O,onOpenChange:I,modal:t,...d,children:u})})},ve=()=>{const t=l.useContext(y);if(t.value&&R(t.value)){const n=t.layout||"truncate";return t.value.length===0?c.jsx(j.TriggerPlaceholder,{}):c.jsx(j.TriggerTagsContainer,{children:t.value.map((e,o)=>{const a=T(e,t.legacyBehavior);if(a&&(n==="truncate"&&o<=1||n==="wrap"))return c.jsx(ee.RefToTgphRef,{children:c.jsx(j.TriggerTag.Default,{value:a})},a)})})}if(t&&E(t.value))return t.value?c.jsx(j.TriggerText,{}):c.jsx(j.TriggerPlaceholder,{})},Ce=({size:t="2",children:n,...e})=>{const o=l.useContext(y),a=l.useMemo(()=>{if(o.value){if(E(o.value))return Q(o.value,o.options,o.legacyBehavior);if(R(o.value))return o.value.map(r=>Q(r,o.options,o.legacyBehavior))}},[o.value,o.options,o.legacyBehavior]),i=l.useCallback(()=>a?E(a)?(a==null?void 0:a.label)||(a==null?void 0:a.value)||o.placeholder:R(a)&&a.map(r=>(r==null?void 0:r.label)||(r==null?void 0:r.value)).join(", ")||o.placeholder:o.placeholder,[a,o.placeholder]);return c.jsx(A.Menu.Trigger,{...e,asChild:!0,onClick:r=>{var s,p;r.preventDefault(),o.onOpenToggle(),(p=(s=o.triggerRef)==null?void 0:s.current)==null||p.focus()},onKeyDown:r=>{if(r.key==="Tab"){r.stopPropagation();return}if(N.includes(r.key)){r.preventDefault();return}if(r.key==="ArrowDown"){r.stopPropagation(),r.preventDefault(),o.onOpenToggle();return}},tgphRef:o.triggerRef,children:c.jsxs(B.Button.Root,{id:o.triggerId,type:"button",bg:"surface-1",variant:"outline",align:"center",minH:ae[t],h:"full",w:"full",py:"1",size:t,color:o.errored?"red":"gray",justify:"space-between",role:"combobox","aria-label":i(),"aria-controls":o.contentId,"aria-expanded":o.open,"aria-haspopup":"listbox","data-tgph-combobox-trigger":!0,"data-tgph-combobox-trigger-open":o.open,disabled:o.disabled,...e,children:[n?typeof n=="function"?n({value:a}):n:c.jsx(ve,{}),c.jsxs(S.Stack,{align:"center",gap:"1",children:[c.jsx(j.TriggerClear,{}),c.jsx(j.TriggerIndicator,{})]})]})})},Te=({style:t,children:n,tgphRef:e,...o})=>{const a=l.useContext(y),i=l.useRef(!1),r=H.useComposedRefs(e,a.contentRef),s=l.useRef(null),[p,g]=l.useState(0),[m,v]=l.useState(!1),h=l.useCallback(u=>{const d=u==null?void 0:u.getBoundingClientRect();d&&g(d.height),m||v(!0)},[m]);return l.useEffect(()=>{const u=new ResizeObserver(d=>{for(const x of d){const b=x.target;h(b)}});return s.current&&m&&u.observe(s.current),()=>u.disconnect()},[m,h]),l.useEffect(()=>{m===!0&&a.open===!1&&v(!1)},[a.open,m]),l.useEffect(()=>{let u;return a.open&&(u=setTimeout(()=>{h(s.current)},10)),()=>u&&clearTimeout(u)},[a.open,h]),c.jsx(oe.Root,{asChild:!0,children:c.jsx(X.DismissableLayer,{onEscapeKeyDown:u=>{a.open&&(u.stopPropagation(),u.preventDefault(),a.setOpen(!1))},children:c.jsx(A.Menu.Content,{className:"tgph",mt:"1",onCloseAutoFocus:u=>{var d,x;i.current||(x=(d=a.triggerRef)==null?void 0:d.current)==null||x.focus(),i.current=!1,u.preventDefault()},bg:"surface-1",style:{width:"var(--tgph-combobox-trigger-width)",transition:"min-height 200ms ease-in-out",minHeight:p?`${p}px`:"0",...t,"--tgph-combobox-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-combobox-trigger-width":"var(--radix-popper-anchor-width)","--tgph-combobox-trigger-height":"var(--radix-popper-anchor-height)"},...o,tgphRef:r,"data-tgph-combobox-content":!0,"data-tgph-combobox-content-open":a.open,role:void 0,"aria-orientation":void 0,onKeyDown:u=>{var x,b,f,w;u.stopPropagation();const d=(b=(x=a.contentRef)==null?void 0:x.current)==null?void 0:b.querySelectorAll("[data-tgph-combobox-option]");document.activeElement===(d==null?void 0:d[0])&&me.includes(u.key)&&((w=(f=a.searchRef)==null?void 0:f.current)==null||w.focus())},children:c.jsx(S.Stack,{direction:"column",gap:"1",tgphRef:s,children:n})})})})},je=({...t})=>{const n=l.useContext(y);return c.jsx(S.Stack,{id:n.contentId,direction:"column",gap:"1",style:{overflowY:"auto","--max-height":t.maxHeight?void 0:"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))"},role:"listbox",...t})},z=({value:t,label:n,selected:e,onSelect:o,children:a,...i})=>{const r=l.useContext(y),[s,p]=l.useState(!1),g=r.value,m=!r.searchQuery||ie({children:n||a,value:t,searchQuery:r.searchQuery}),v=R(g)?g.some(u=>T(u,r.legacyBehavior)===t):T(g,r.legacyBehavior)===t,h=u=>{var x,b;u.stopPropagation();const d=u;if(!(d.key&&!N.includes(d.key))){if(u.preventDefault(),r.closeOnSelect===!0&&r.setOpen(!1),o)return o(u);if(E(g)){const f=r.onValueChange;r.legacyBehavior===!0?f==null||f({value:t,label:n}):f==null||f(t)}else if(R(g)){const f=r.onValueChange,w=r.value,D=v?w.filter(L=>T(L,r.legacyBehavior)!==t):[...w,r.legacyBehavior===!0?{value:t,label:n}:t];f==null||f(D)}(b=(x=r.triggerRef)==null?void 0:x.current)==null||b.focus()}};if(m)return c.jsx(A.Menu.Button,{type:"button",onSelect:h,onKeyDown:h,selected:e===null?null:e??v,onFocus:()=>p(!0),onBlur:()=>p(!1),role:"option","aria-selected":v?"true":"false","data-tgph-combobox-option":!0,"data-tgph-combobox-option-focused":s,"data-tgph-combobox-option-value":t,"data-tgph-combobox-option-label":n,...i,children:n||a||t})},Se=({label:t="Search",placeholder:n="Search",tgphRef:e,value:o,onValueChange:a,...i})=>{var v;const r=l.useId(),s=l.useContext(y),p=H.useComposedRefs(e,s.searchRef),g=o??s.searchQuery,m=a??s.setSearchQuery;return l.useEffect(()=>{var d;const h=x=>{var b,f;ye.includes(x.key)&&((f=(b=s.contentRef)==null?void 0:b.current)==null||f.focus({preventScroll:!0})),x.key==="Escape"&&s.setOpen(!1),x.stopPropagation()},u=(d=s.searchRef)==null?void 0:d.current;if(u)return u.addEventListener("keydown",h),()=>{u.removeEventListener("keydown",h)}},[s]),c.jsxs(S.Box,{borderBottom:"px",px:"1",pb:"1",children:[c.jsx(re.Root,{children:c.jsx(q.Text,{as:"label",htmlFor:r,children:t})}),c.jsx(te.Input,{id:r,variant:"ghost",placeholder:n,value:g,onChange:h=>{m(h.target.value)},LeadingComponent:c.jsx(C.Icon,{icon:C.Lucide.Search,alt:"Search Icon"}),TrailingComponent:s!=null&&s.searchQuery&&((v=s==null?void 0:s.searchQuery)==null?void 0:v.length)>0?c.jsx(B.Button,{variant:"ghost",color:"gray",icon:{icon:C.Lucide.X,alt:"Clear Search Query"},onClick:()=>{var h;return(h=s.setSearchQuery)==null?void 0:h.call(s,"")}}):null,autoFocus:!0,"data-tgph-combobox-search":!0,"aria-controls":s.contentId,...i,tgphRef:p})]})},Re=({icon:t={icon:C.Lucide.Search,alt:"Search Icon"},message:n="No results found",children:e,...o})=>{const a=l.useContext(y),[i,r]=l.useState(!1);if(l.useEffect(()=>{var p,g;const s=(g=(p=a.contentRef)==null?void 0:p.current)==null?void 0:g.querySelectorAll("[data-tgph-combobox-option]");(s==null?void 0:s.length)===0?r(!0):r(!1)},[a.searchQuery,a.contentRef,e]),i)return c.jsxs(S.Stack,{gap:"1",align:"center",justify:"center",w:"full",my:"8","data-tgph-combobox-empty":!0,...o,children:[t===null?c.jsx(c.Fragment,{}):c.jsx(C.Icon,{...t}),n===null?c.jsx(c.Fragment,{}):c.jsx(q.Text,{as:"span",children:n})]})},we=({leadingText:t="Create",values:n,onCreate:e,selected:o=null,legacyBehavior:a=!1,...i})=>{const r=l.useContext(y),s=l.useCallback(p=>!n||(n==null?void 0:n.length)===0?!1:n.some(g=>T(g,a)===p),[n,a]);if(r.searchQuery&&!s(r.searchQuery))return c.jsx(z,{leadingIcon:{icon:C.Lucide.Plus,"aria-hidden":!0},mx:"1",value:r.searchQuery,label:`${t} "${r.searchQuery}"`,selected:o,onSelect:()=>{var p;if(e&&r.value&&r.searchQuery){const g=a===!0?{value:r.searchQuery}:r.searchQuery;e(g),(p=r.setSearchQuery)==null||p.call(r,"")}},...i})},$={};Object.assign($,{Root:be,Trigger:Ce,Content:Te,Options:je,Option:z,Search:Se,Empty:Re,Create:we,Primitives:j});exports.Combobox=$;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),W=require("@radix-ui/react-dismissable-layer"),J=require("@radix-ui/react-portal"),Z=require("@radix-ui/react-use-controllable-state"),ee=require("@radix-ui/react-visually-hidden"),O=require("@telegraph/button"),H=require("@telegraph/compose-refs"),te=require("@telegraph/helpers"),C=require("@telegraph/icon"),ne=require("@telegraph/input"),S=require("@telegraph/layout"),A=require("@telegraph/menu"),Q=require("@telegraph/typography"),l=require("react"),k=require("@telegraph/motion"),M=require("@telegraph/tag"),oe=require("@telegraph/tooltip"),_=require("@telegraph/truncate");function K(t){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const o=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(n,e,o.get?o:{enumerable:!0,get:()=>t[e]})}}return n.default=t,Object.freeze(n)}const re=K(J),ae=K(ee),se={0:"5",1:"6",2:"8",3:"10"},R=t=>Array.isArray(t),E=t=>typeof t=="object"&&!Array.isArray(t)||typeof t=="string"||!t,ie=t=>{const n=(a,c=[])=>(l.Children.toArray(a).forEach(s=>{l.isValidElement(s)&&(s.props.value?c.push(s):s.props.children&&n(s.props.children,c))}),c);return n(t).map(a=>{var r;const c=a;return{value:c.props.value,label:((r=c.props)==null?void 0:r.label)||c.props.children||c.props.value}})},T=(t,n)=>{if(t)return n===!0?t==null?void 0:t.value:t},q=(t,n,e)=>{if(!t||!n||n.length===0)return;const o=n.find(a=>a.value===T(t,e));if(o)return o},ce=({children:t,value:n,searchQuery:e})=>{const o=N(t);return(n==null?void 0:n.toLowerCase().includes(e.toLowerCase()))||o.some(a=>a.toLowerCase().includes(e.toLowerCase()))},N=t=>{const n=l.Children.toArray(t),e=[];return n.forEach(o=>{typeof o=="string"&&e.push(o),l.isValidElement(o)&&o.props.children&&e.push(...N(o.props.children))}),e},le=({icon:t=C.Lucide.ChevronDown,"aria-hidden":n=!0,...e})=>{const o=l.useContext(y);return i.jsx(O.Button.Icon,{as:k.motion.span,animate:{rotate:o.open?180:0},transition:{duration:150,type:"spring"},icon:t,"aria-hidden":n,...e})},ue=({tooltipProps:t,...n})=>{const e=l.useContext(y),o=()=>{var c,r;if(R(e.value)){const s=e.onValueChange;s==null||s([])}if(E(e.value)){const s=e.onValueChange;s==null||s(void 0)}(r=(c=e.triggerRef)==null?void 0:c.current)==null||r.focus()};return l.useMemo(()=>{var c;if(E(e.value))return e.clearable&&e.value;if(R(e.value))return e.clearable&&((c=e.value)==null?void 0:c.length)>0},[e.clearable,e.value])?i.jsx(oe.Tooltip,{label:"Clear field",...t,children:i.jsx(O.Button,{type:"button",icon:{icon:C.Lucide.X,alt:"Clear field"},size:"1",variant:"ghost",onClick:c=>{e.value&&(c.stopPropagation(),o())},onKeyDown:c=>{(c.key==="Enter"||c.key===" ")&&(c.stopPropagation(),o())},"data-tgph-combobox-clear":!0,style:{marginTop:"calc(-1 * var(--tgph-spacing-1)",marginBottom:"calc(-1 * var(--tgph-spacing-1)"},...n})}):null},pe=({children:t,...n})=>{const e=l.useContext(y),o=l.useMemo(()=>{var s;if(!E(e.value))return;const a=q(e.value,e.options,e.legacyBehavior),c=(a==null?void 0:a.label)||(a==null?void 0:a.value)||e.placeholder,r=e.legacyBehavior&&((s=e==null?void 0:e.value)==null?void 0:s.label);return r||c},[e.value,e.options,e.legacyBehavior,e.placeholder]);return i.jsx(_.TooltipIfTruncated,{children:i.jsx(O.Button.Text,{color:e.value?"default":"gray",textOverflow:"ellipsis",overflow:"hidden",...n,children:t||o})})},ge=({children:t,...n})=>{const e=l.useContext(y);return i.jsx(_.TooltipIfTruncated,{children:i.jsx(O.Button.Text,{color:"gray",textOverflow:"ellipsis",overflow:"hidden",...n,children:t||e.placeholder})})},de=({children:t})=>{const n=l.useContext(y);if(!R(n.value))return null;const e=n.layout||"truncate",a=(n.value.length-2).toString().split("");return i.jsxs(S.Stack,{gap:"1",w:"full",wrap:e==="wrap"?"wrap":"nowrap",align:"center",style:{position:"relative",flexGrow:1},children:[i.jsx(k.AnimatePresence,{presenceMap:n.value.map(c=>({"tgph-motion-key":T(c,n.legacyBehavior)||"",value:!0})),children:t}),i.jsx(k.AnimatePresence,{presenceMap:[{"tgph-motion-key":"combobox-more",value:!0}],children:e==="truncate"&&n.value.length>2&&i.jsx(S.Stack,{as:k.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":`${n.value.length-2} more selected`,position:"absolute",right:"0",style:{backgroundImage:"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)"},children:i.jsxs(Q.Text,{as:"span",size:"1",style:{whiteSpace:"nowrap"},children:["+",i.jsxs(k.AnimatePresence,{presenceMap:a.map(c=>({"tgph-motion-key":c,value:!0})),children:[a.map(c=>i.jsx(S.Box,{as:k.motion.span,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:100,type:"spring"},w:"2",display:"inline-block","tgph-motion-key":c,children:c},c))," "]}),"more"]})})})]})},V=l.createContext({value:""}),fe=({value:t,children:n,...e})=>i.jsx(V.Provider,{value:{value:t},children:i.jsx(M.Tag.Root,{as:k.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",...e,children:n})}),he=({children:t,...n})=>{const e=l.useContext(y),o=l.useContext(V),a=l.useMemo(()=>{const c=e.options.find(p=>p.value===o.value);if(c)return c.label||c.value;if(!e.value)return;const s=e.value.find(p=>T(p,e.legacyBehavior)===o.value);if(s)return s},[e.options,e.value,o.value,e.legacyBehavior]);return i.jsx(M.Tag.Text,{...n,children:t||a})},xe=({children:t,...n})=>{const e=l.useContext(y),o=l.useContext(V);return i.jsx(M.Tag.Button,{icon:{icon:C.Lucide.X,alt:`Remove ${o.value}`},onClick:a=>{if(!e.onValueChange)return;const c=e.onValueChange,s=e.value.filter(p=>T(p,e.legacyBehavior)!==o.value);c==null||c(s),a.stopPropagation(),a.preventDefault()},...n,children:t})},ye=({value:t,children:n,...e})=>i.jsxs(P.Root,{value:t,...e,children:[i.jsx(P.Text,{children:n}),i.jsx(P.Button,{})]}),P={Root:fe,Text:he,Button:xe,Default:ye},j={TriggerIndicator:le,TriggerClear:ue,TriggerText:pe,TriggerPlaceholder:ge,TriggerTagsContainer:de,TriggerTag:P},me=["ArrowDown","PageUp","Home"],be=["ArrowUp","PageDown","End"],z=["Enter"," "],y=l.createContext({value:void 0,onValueChange:()=>{},contentId:"",triggerId:"",open:!1,setOpen:()=>{},onOpenToggle:()=>{},clearable:!1,disabled:!1,options:[],legacyBehavior:!1}),ve=({modal:t=!0,closeOnSelect:n=!0,clearable:e=!1,disabled:o=!1,legacyBehavior:a=!1,open:c,onOpenChange:r,defaultOpen:s,value:p,onValueChange:g,errored:m,placeholder:v,layout:h,children:u,...d})=>{const x=l.useId(),b=l.useId(),f=l.useRef(null),w=l.useRef(null),D=l.useRef(null),L=l.useMemo(()=>ie(u),[u]),[Y,F]=l.useState(""),[B=!1,I]=Z.useControllableState({prop:c,defaultProp:s,onChange:r}),U=l.useCallback(()=>{I(X=>!X)},[I]);return l.useEffect(()=>{B||F("")},[B]),i.jsx(y.Provider,{value:{contentId:x,triggerId:b,value:p,onValueChange:g,placeholder:v,open:B,setOpen:I,onOpenToggle:U,closeOnSelect:n,clearable:e,disabled:o,searchQuery:Y,setSearchQuery:F,triggerRef:f,searchRef:w,contentRef:D,errored:m,layout:h,options:L,legacyBehavior:a},children:i.jsx(A.Menu.Root,{open:B,onOpenChange:I,modal:t,...d,children:u})})},Ce=()=>{const t=l.useContext(y);if(t.value&&R(t.value)){const n=t.layout||"truncate";return t.value.length===0?i.jsx(j.TriggerPlaceholder,{}):i.jsx(j.TriggerTagsContainer,{children:t.value.map((e,o)=>{const a=T(e,t.legacyBehavior);if(a&&(n==="truncate"&&o<=1||n==="wrap"))return i.jsx(te.RefToTgphRef,{children:i.jsx(j.TriggerTag.Default,{value:a})},a)})})}if(t&&E(t.value))return t.value?i.jsx(j.TriggerText,{}):i.jsx(j.TriggerPlaceholder,{})},Te=({size:t="2",children:n,...e})=>{const o=l.useContext(y),a=l.useMemo(()=>{if(o.value){if(E(o.value))return q(o.value,o.options,o.legacyBehavior);if(R(o.value))return o.value.map(r=>q(r,o.options,o.legacyBehavior))}},[o.value,o.options,o.legacyBehavior]),c=l.useCallback(()=>a?E(a)?(a==null?void 0:a.label)||(a==null?void 0:a.value)||o.placeholder:R(a)&&a.map(r=>(r==null?void 0:r.label)||(r==null?void 0:r.value)).join(", ")||o.placeholder:o.placeholder,[a,o.placeholder]);return i.jsx(A.Menu.Trigger,{...e,asChild:!0,onClick:r=>{var s,p;r.preventDefault(),o.onOpenToggle(),(p=(s=o.triggerRef)==null?void 0:s.current)==null||p.focus()},onKeyDown:r=>{if(r.key==="Tab"){r.stopPropagation();return}if(z.includes(r.key)){r.preventDefault();return}if(r.key==="ArrowDown"){r.stopPropagation(),r.preventDefault(),o.onOpenToggle();return}},tgphRef:o.triggerRef,children:i.jsxs(O.Button.Root,{id:o.triggerId,type:"button",bg:"surface-1",variant:"outline",align:"center",minH:se[t],h:"full",w:"full",py:"1",size:t,color:o.errored?"red":"gray",justify:"space-between",role:"combobox","aria-label":c(),"aria-controls":o.contentId,"aria-expanded":o.open,"aria-haspopup":"listbox","data-tgph-combobox-trigger":!0,"data-tgph-combobox-trigger-open":o.open,disabled:o.disabled,...e,children:[n?typeof n=="function"?n({value:a}):n:i.jsx(Ce,{}),i.jsxs(S.Stack,{align:"center",gap:"1",children:[i.jsx(j.TriggerClear,{}),i.jsx(j.TriggerIndicator,{})]})]})})},je=({style:t,children:n,tgphRef:e,...o})=>{const a=l.useContext(y),c=l.useRef(!1),r=H.useComposedRefs(e,a.contentRef),s=l.useRef(null),[p,g]=l.useState(0),[m,v]=l.useState(!1),h=l.useCallback(u=>{const d=u==null?void 0:u.getBoundingClientRect();d&&g(d.height),m||v(!0)},[m]);return l.useEffect(()=>{const u=new ResizeObserver(d=>{for(const x of d){const b=x.target;h(b)}});return s.current&&m&&u.observe(s.current),()=>u.disconnect()},[m,h]),l.useEffect(()=>{m===!0&&a.open===!1&&v(!1)},[a.open,m]),l.useEffect(()=>{let u;return a.open&&(u=setTimeout(()=>{h(s.current)},10)),()=>u&&clearTimeout(u)},[a.open,h]),i.jsx(re.Root,{asChild:!0,children:i.jsx(W.DismissableLayer,{onEscapeKeyDown:u=>{a.open&&(u.stopPropagation(),u.preventDefault(),a.setOpen(!1))},children:i.jsx(A.Menu.Content,{className:"tgph",mt:"1",onCloseAutoFocus:u=>{var d,x;c.current||(x=(d=a.triggerRef)==null?void 0:d.current)==null||x.focus(),c.current=!1,u.preventDefault()},bg:"surface-1",style:{width:"var(--tgph-combobox-trigger-width)",transition:"min-height 200ms ease-in-out",minHeight:p?`${p}px`:"0",...t,"--tgph-combobox-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-combobox-trigger-width":"var(--radix-popper-anchor-width)","--tgph-combobox-trigger-height":"var(--radix-popper-anchor-height)"},...o,tgphRef:r,"data-tgph-combobox-content":!0,"data-tgph-combobox-content-open":a.open,role:void 0,"aria-orientation":void 0,onKeyDown:u=>{var x,b,f,w;u.stopPropagation();const d=(b=(x=a.contentRef)==null?void 0:x.current)==null?void 0:b.querySelectorAll("[data-tgph-combobox-option]");document.activeElement===(d==null?void 0:d[0])&&be.includes(u.key)&&((w=(f=a.searchRef)==null?void 0:f.current)==null||w.focus())},children:i.jsx(S.Stack,{direction:"column",gap:"1",tgphRef:s,children:n})})})})},Se=({...t})=>{const n=l.useContext(y);return i.jsx(S.Stack,{id:n.contentId,direction:"column",gap:"1",style:{overflowY:"auto","--max-height":t.maxHeight?void 0:"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))"},role:"listbox",...t})},$=({value:t,label:n,selected:e,onSelect:o,children:a,...c})=>{const r=l.useContext(y),[s,p]=l.useState(!1),g=r.value,m=!r.searchQuery||ce({children:n||a,value:t,searchQuery:r.searchQuery}),v=R(g)?g.some(u=>T(u,r.legacyBehavior)===t):T(g,r.legacyBehavior)===t,h=u=>{var x,b;u.stopPropagation();const d=u;if(!(d.key&&!z.includes(d.key))){if(u.preventDefault(),r.closeOnSelect===!0&&r.setOpen(!1),o)return o(u);if(E(g)){const f=r.onValueChange;r.legacyBehavior===!0?f==null||f({value:t,label:n}):f==null||f(t)}else if(R(g)){const f=r.onValueChange,w=r.value,D=v?w.filter(L=>T(L,r.legacyBehavior)!==t):[...w,r.legacyBehavior===!0?{value:t,label:n}:t];f==null||f(D)}(b=(x=r.triggerRef)==null?void 0:x.current)==null||b.focus()}};if(m)return i.jsx(A.Menu.Button,{type:"button",onSelect:h,onKeyDown:h,selected:e===null?null:e??v,onFocus:()=>p(!0),onBlur:()=>p(!1),role:"option","aria-selected":v?"true":"false","data-tgph-combobox-option":!0,"data-tgph-combobox-option-focused":s,"data-tgph-combobox-option-value":t,"data-tgph-combobox-option-label":n,...c,children:n||a||t})},Re=({label:t="Search",placeholder:n="Search",tgphRef:e,value:o,onValueChange:a,...c})=>{var v;const r=l.useId(),s=l.useContext(y),p=H.useComposedRefs(e,s.searchRef),g=o??s.searchQuery,m=a??s.setSearchQuery;return l.useEffect(()=>{var d;const h=x=>{var b,f;me.includes(x.key)&&((f=(b=s.contentRef)==null?void 0:b.current)==null||f.focus({preventScroll:!0})),x.key==="Escape"&&s.setOpen(!1),x.stopPropagation()},u=(d=s.searchRef)==null?void 0:d.current;if(u)return u.addEventListener("keydown",h),()=>{u.removeEventListener("keydown",h)}},[s]),i.jsxs(S.Box,{borderBottom:"px",px:"1",pb:"1",children:[i.jsx(ae.Root,{children:i.jsx(Q.Text,{as:"label",htmlFor:r,children:t})}),i.jsx(ne.Input,{id:r,variant:"ghost",placeholder:n,value:g,onChange:h=>{m(h.target.value)},LeadingComponent:i.jsx(C.Icon,{icon:C.Lucide.Search,alt:"Search Icon"}),TrailingComponent:s!=null&&s.searchQuery&&((v=s==null?void 0:s.searchQuery)==null?void 0:v.length)>0?i.jsx(O.Button,{variant:"ghost",color:"gray",icon:{icon:C.Lucide.X,alt:"Clear Search Query"},onClick:()=>{var h;return(h=s.setSearchQuery)==null?void 0:h.call(s,"")}}):null,autoFocus:!0,"data-tgph-combobox-search":!0,"aria-controls":s.contentId,...c,tgphRef:p})]})},we=({icon:t={icon:C.Lucide.Search,alt:"Search Icon"},message:n="No results found",children:e,...o})=>{const a=l.useContext(y),[c,r]=l.useState(!1);if(l.useEffect(()=>{var p,g;const s=(g=(p=a.contentRef)==null?void 0:p.current)==null?void 0:g.querySelectorAll("[data-tgph-combobox-option]");(s==null?void 0:s.length)===0?r(!0):r(!1)},[a.searchQuery,a.contentRef,e]),c)return i.jsxs(S.Stack,{gap:"1",align:"center",justify:"center",w:"full",my:"8","data-tgph-combobox-empty":!0,...o,children:[t===null?i.jsx(i.Fragment,{}):i.jsx(C.Icon,{...t}),n===null?i.jsx(i.Fragment,{}):i.jsx(Q.Text,{as:"span",children:n})]})},ke=({leadingText:t="Create",values:n,onCreate:e,selected:o=null,legacyBehavior:a=!1,...c})=>{const r=l.useContext(y),s=l.useCallback(p=>!n||(n==null?void 0:n.length)===0?!1:n.some(g=>T(g,a)===p),[n,a]);if(r.searchQuery&&!s(r.searchQuery))return i.jsx($,{leadingIcon:{icon:C.Lucide.Plus,"aria-hidden":!0},mx:"1",value:r.searchQuery,label:`${t} "${r.searchQuery}"`,selected:o,onSelect:()=>{var p;if(e&&r.value&&r.searchQuery){const g=a===!0?{value:r.searchQuery}:r.searchQuery;e(g),(p=r.setSearchQuery)==null||p.call(r,"")}},...c})},G={};Object.assign(G,{Root:ve,Trigger:Te,Content:je,Options:Se,Option:$,Search:Re,Empty:we,Create:ke,Primitives:j});exports.Combobox=G;
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.primitives.tsx","../../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\nimport type { DefinedOption, Option } from \"./Combobox.types\";\n\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\n const foundOption = options.find(\n (o) => o.value === getValueFromOption(value, legacyBehavior),\n );\n\n if (!foundOption) return undefined;\n\n return foundOption;\n};\n\ntype DoesOptionMatchSearchQueryProps = {\n children?: React.ReactNode;\n value?: string;\n searchQuery: string;\n};\n\nexport const doesOptionMatchSearchQuery = ({\n children,\n value,\n searchQuery,\n}: DoesOptionMatchSearchQueryProps) => {\n const childStrings = findStringNodes(children);\n\n return (\n value?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n childStrings.some((str) =>\n str.toLowerCase().includes(searchQuery.toLowerCase()),\n )\n );\n};\n\n// Exported for testing\nexport const findStringNodes = (children: React.ReactNode): string[] => {\n const childrenArray = React.Children.toArray(children);\n const strNodes: string[] = [];\n\n childrenArray.forEach((child) => {\n if (typeof child === \"string\") {\n strNodes.push(child);\n }\n\n if (React.isValidElement(child) && child.props.children) {\n strNodes.push(...findStringNodes(child.props.children));\n }\n });\n\n return strNodes;\n};\n","import { Button } from \"@telegraph/button\";\nimport { type TgphComponentProps, type TgphElement } from \"@telegraph/helpers\";\nimport { Lucide } from \"@telegraph/icon\";\nimport { Box, Stack } from \"@telegraph/layout\";\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 { ComboboxContext } from \"./Combobox\";\nimport {\n getCurrentOption,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\nimport type {\n DefinedOption,\n MultiSelect,\n Option,\n SingleSelect,\n} from \"./Combobox.types\";\n\ntype TriggerIndicatorProps<T extends TgphElement> = Partial<\n TgphComponentProps<typeof Button.Icon<T>>\n>;\n\nconst TriggerIndicator = <T extends TgphElement>({\n icon = Lucide.ChevronDown,\n \"aria-hidden\": ariaHidden = true,\n ...props\n}: TriggerIndicatorProps<T>) => {\n const context = React.useContext(ComboboxContext);\n return (\n <Button.Icon\n as={motion.span}\n animate={{ rotate: context.open ? 180 : 0 }}\n transition={{ duration: 150, type: \"spring\" }}\n icon={icon}\n aria-hidden={ariaHidden}\n {...props}\n />\n );\n};\n\ntype TriggerClearProps<T extends TgphElement> = TgphComponentProps<\n typeof Button<T>\n> & {\n tooltipProps?: TgphComponentProps<typeof Tooltip>;\n};\n\nconst TriggerClear = <T extends TgphElement>({\n tooltipProps,\n ...props\n}: TriggerClearProps<T>) => {\n const context = React.useContext(ComboboxContext);\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 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 if (!shouldShowClearable) return null;\n\n return (\n <Tooltip label=\"Clear field\" {...tooltipProps}>\n <Button\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 {...props}\n />\n </Tooltip>\n );\n};\n\ntype TriggerTextProps<T extends TgphElement> = TgphComponentProps<\n typeof Button.Text<T>\n>;\n\nconst TriggerText = <T extends TgphElement>({\n children,\n ...props\n}: TriggerTextProps<T>) => {\n const context = React.useContext(ComboboxContext);\n\n const label = React.useMemo(() => {\n if (!isSingleSelect(context.value)) return;\n\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n\n const label =\n currentOption?.label || currentOption?.value || context.placeholder;\n\n // In `legacyBehavior` mode, we can override the label of the combobox via the `label` prop\n // in context value. So, if we're in `legacyBehavior` mode and the context value has a\n // label, we want to use that label instead of the label from the current option\n const legacyLabelOverride =\n context.legacyBehavior && (context?.value as DefinedOption)?.label;\n\n return legacyLabelOverride ? legacyLabelOverride : label;\n }, [\n context.value,\n context.options,\n context.legacyBehavior,\n context.placeholder,\n ]);\n\n return (\n <Button.Text\n color={!context.value ? \"gray\" : \"default\"}\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n {...props}\n >\n {children || label}\n </Button.Text>\n );\n};\n\ntype TriggerPlaceholderProps<T extends TgphElement> = TgphComponentProps<\n typeof Button.Text<T>\n>;\n\nconst TriggerPlaceholder = <T extends TgphElement>({\n children,\n ...props\n}: TriggerPlaceholderProps<T>) => {\n const context = React.useContext(ComboboxContext);\n return (\n <Button.Text color=\"gray\" {...props}>\n {children || context.placeholder}\n </Button.Text>\n );\n};\n\ntype TriggerTagsContainerProps = TgphComponentProps<typeof Stack>;\n\nconst TriggerTagsContainer = ({ children }: TriggerTagsContainerProps) => {\n const context = React.useContext(ComboboxContext);\n\n if (!isMultiSelect(context.value)) return null;\n\n const layout = context.layout || \"truncate\";\n const truncatedLength = context.value.length - 2;\n const truncatedLengthStringArray = truncatedLength.toString().split(\"\");\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 {children}\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={`${context.value.length - 2} 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\nconst TriggerTagContext = React.createContext<{\n value: string;\n}>({\n value: \"\",\n});\n\ntype TriggerTagRootProps<T extends TgphElement> = {\n value: string;\n} & TgphComponentProps<typeof Tag.Root<T>>;\n\nconst TriggerTagRoot = <T extends TgphElement>({\n value,\n children,\n ...props\n}: TriggerTagRootProps<T>) => {\n return (\n <TriggerTagContext.Provider value={{ value }}>\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 {children}\n </Tag.Root>\n </TriggerTagContext.Provider>\n );\n};\n\ntype TriggerTagTextProps<T extends TgphElement> = TgphComponentProps<\n typeof Tag.Text<T>\n>;\n\nconst TriggerTagText = <T extends TgphElement>({\n children,\n ...props\n}: TriggerTagTextProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const triggerTagContext = React.useContext(TriggerTagContext);\n\n const option = React.useMemo(() => {\n // Find option amongst other options\n const foundOption = context.options.find(\n (o) => o.value === triggerTagContext.value,\n );\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 const foundValue = contextValue.find(\n (v) =>\n getValueFromOption(v, context.legacyBehavior) ===\n triggerTagContext.value,\n );\n\n if (!foundValue) return undefined;\n\n return foundValue;\n }, [\n context.options,\n context.value,\n triggerTagContext.value,\n context.legacyBehavior,\n ]);\n\n return <Tag.Text {...props}>{children || option}</Tag.Text>;\n};\n\ntype TriggerTagButtonProps<T extends TgphElement> = TgphComponentProps<\n typeof Tag.Button<T>\n>;\n\nconst TriggerTagButton = <T extends TgphElement>({\n children,\n ...props\n}: TriggerTagButtonProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const triggerTagContext = React.useContext(TriggerTagContext);\n\n return (\n <Tag.Button\n icon={{ icon: Lucide.X, alt: `Remove ${triggerTagContext.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 !== triggerTagContext.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 {...props}\n >\n {children}\n </Tag.Button>\n );\n};\n\ntype TriggerTagDefaultProps<T extends TgphElement> = TgphComponentProps<\n typeof TriggerTagRoot<T>\n>;\n\nconst TriggerTagDefault = <T extends TgphElement>({\n value,\n children,\n ...props\n}: TriggerTagDefaultProps<T>) => {\n return (\n <TriggerTag.Root value={value} {...props}>\n <TriggerTag.Text>{children}</TriggerTag.Text>\n <TriggerTag.Button />\n </TriggerTag.Root>\n );\n};\n\nconst TriggerTag = {\n Root: TriggerTagRoot,\n Text: TriggerTagText,\n Button: TriggerTagButton,\n Default: TriggerTagDefault,\n};\n\nconst Primitives = {\n TriggerIndicator,\n TriggerClear,\n TriggerText,\n TriggerPlaceholder,\n TriggerTagsContainer,\n TriggerTag,\n};\n\nexport { Primitives };\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 RemappedOmit,\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 { Text } from \"@telegraph/typography\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n doesOptionMatchSearchQuery,\n getCurrentOption,\n getOptions,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\nimport { Primitives } from \"./Combobox.primitives\";\nimport type {\n DefinedOption,\n MultiSelect,\n Option,\n SingleSelect,\n} from \"./Combobox.types\";\n\nconst FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nconst LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nconst SELECT_KEYS = [\"Enter\", \" \"];\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\nexport const 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\nconst TriggerValue = () => {\n const context = React.useContext(ComboboxContext);\n\n if (context.value && isMultiSelect(context.value)) {\n const layout = context.layout || \"truncate\";\n\n if (context.value.length === 0) {\n return <Primitives.TriggerPlaceholder />;\n }\n\n return (\n <Primitives.TriggerTagsContainer>\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 <Primitives.TriggerTag.Default value={value} />\n </RefToTgphRef>\n );\n }\n })}\n </Primitives.TriggerTagsContainer>\n );\n }\n\n if (context && isSingleSelect(context.value)) {\n if (!context.value) {\n return <Primitives.TriggerPlaceholder />;\n }\n return <Primitives.TriggerText />;\n }\n};\n\ntype ChildrenValue = string | Array<string> | never;\n\n// When utilizing the `children` prop as a function, we need to infer the type of the value\n// to ensure that the value is always defined. We do this via the generic `V` passed through\n// to the `Trigger` component. This is expected to be `typeof value`.\ntype ChildrenFnValue<V extends ChildrenValue> = V extends never\n ? never\n : V extends string\n ? DefinedOption | undefined\n : Array<DefinedOption>;\n\ntype TriggerBaseProps = RemappedOmit<\n TgphComponentProps<typeof TelegraphButton.Root> &\n TgphComponentProps<typeof TelegraphMenu.Trigger>,\n \"children\"\n>;\n\ntype TriggerProps<V extends ChildrenValue> = TriggerBaseProps & {\n placeholder?: string;\n children?:\n | React.ReactNode\n | ((props: { value: ChildrenFnValue<V> }) => React.ReactNode);\n};\n\nconst Trigger = <V extends ChildrenValue>({\n size = \"2\",\n children,\n ...props\n}: TriggerProps<V>) => {\n const context = React.useContext(ComboboxContext);\n\n const currentValue = React.useMemo<\n DefinedOption | Array<DefinedOption | undefined> | undefined\n >(() => {\n if (!context.value) return undefined;\n if (isSingleSelect(context.value)) {\n return getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n }\n if (isMultiSelect(context.value)) {\n return context.value.map((v) =>\n getCurrentOption(v, context.options, context.legacyBehavior),\n );\n }\n return undefined;\n }, [context.value, context.options, context.legacyBehavior]);\n\n const getAriaLabelString = React.useCallback(() => {\n if (!currentValue) return context.placeholder;\n if (isSingleSelect(currentValue)) {\n return currentValue?.label || currentValue?.value || context.placeholder;\n }\n if (isMultiSelect(currentValue)) {\n return (\n currentValue.map((v) => v?.label || v?.value).join(\", \") ||\n context.placeholder\n );\n }\n\n return context.placeholder;\n }, [currentValue, context.placeholder]);\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-combobox-trigger-open={context.open}\n disabled={context.disabled}\n {...props}\n >\n {children ? (\n typeof children === \"function\" ? (\n children({ value: currentValue as ChildrenFnValue<V> })\n ) : (\n children\n )\n ) : (\n <TriggerValue />\n )}\n <Stack align=\"center\" gap=\"1\">\n <Primitives.TriggerClear />\n <Primitives.TriggerIndicator />\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-combobox-trigger-width)\",\n transition: \"min-height 200ms ease-in-out\",\n minHeight: height ? `${height}px` : \"0\",\n ...style,\n ...{\n \"--tgph-combobox-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-combobox-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 // maxHeight defaults to available height - padding from edge of screen\n \"--max-height\": !props.maxHeight\n ? \"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))\"\n : undefined,\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 children: label || children,\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 Primitives: typeof Primitives;\n};\n\nObject.assign(Combobox, {\n Root,\n Trigger,\n Content,\n Options,\n Option,\n Search,\n Empty,\n Create,\n Primitives,\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","foundOption","o","doesOptionMatchSearchQuery","searchQuery","childStrings","findStringNodes","str","childrenArray","strNodes","TriggerIndicator","icon","Lucide","ariaHidden","props","context","ComboboxContext","jsx","Button","motion","TriggerClear","tooltipProps","handleClear","onValueChange","_b","Tooltip","event","TriggerText","label","currentOption","legacyLabelOverride","TriggerPlaceholder","TriggerTagsContainer","layout","truncatedLengthStringArray","jsxs","Stack","AnimatePresence","v","Text","n","Box","TriggerTagContext","TriggerTagRoot","Tag","TriggerTagText","triggerTagContext","foundValue","TriggerTagButton","newValue","TriggerTagDefault","TriggerTag","Primitives","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","errored","placeholder","contentId","triggerId","triggerRef","searchRef","contentRef","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","TelegraphMenu","TriggerValue","i","RefToTgphRef","Trigger","size","currentValue","getAriaLabelString","TelegraphButton","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","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.primitives.tsx","../../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\nimport type { DefinedOption, Option } from \"./Combobox.types\";\n\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\n const foundOption = options.find(\n (o) => o.value === getValueFromOption(value, legacyBehavior),\n );\n\n if (!foundOption) return undefined;\n\n return foundOption;\n};\n\ntype DoesOptionMatchSearchQueryProps = {\n children?: React.ReactNode;\n value?: string;\n searchQuery: string;\n};\n\nexport const doesOptionMatchSearchQuery = ({\n children,\n value,\n searchQuery,\n}: DoesOptionMatchSearchQueryProps) => {\n const childStrings = findStringNodes(children);\n\n return (\n value?.toLowerCase().includes(searchQuery.toLowerCase()) ||\n childStrings.some((str) =>\n str.toLowerCase().includes(searchQuery.toLowerCase()),\n )\n );\n};\n\n// Exported for testing\nexport const findStringNodes = (children: React.ReactNode): string[] => {\n const childrenArray = React.Children.toArray(children);\n const strNodes: string[] = [];\n\n childrenArray.forEach((child) => {\n if (typeof child === \"string\") {\n strNodes.push(child);\n }\n\n if (React.isValidElement(child) && child.props.children) {\n strNodes.push(...findStringNodes(child.props.children));\n }\n });\n\n return strNodes;\n};\n","import { Button } from \"@telegraph/button\";\nimport { type TgphComponentProps, type TgphElement } from \"@telegraph/helpers\";\nimport { Lucide } from \"@telegraph/icon\";\nimport { Box, Stack } from \"@telegraph/layout\";\nimport { AnimatePresence, motion } from \"@telegraph/motion\";\nimport { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { TooltipIfTruncated } from \"@telegraph/truncate\";\nimport { Text } from \"@telegraph/typography\";\nimport React from \"react\";\n\nimport { ComboboxContext } from \"./Combobox\";\nimport {\n getCurrentOption,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\nimport type {\n DefinedOption,\n MultiSelect,\n Option,\n SingleSelect,\n} from \"./Combobox.types\";\n\ntype TriggerIndicatorProps<T extends TgphElement> = Partial<\n TgphComponentProps<typeof Button.Icon<T>>\n>;\n\nconst TriggerIndicator = <T extends TgphElement>({\n icon = Lucide.ChevronDown,\n \"aria-hidden\": ariaHidden = true,\n ...props\n}: TriggerIndicatorProps<T>) => {\n const context = React.useContext(ComboboxContext);\n return (\n <Button.Icon\n as={motion.span}\n animate={{ rotate: context.open ? 180 : 0 }}\n transition={{ duration: 150, type: \"spring\" }}\n icon={icon}\n aria-hidden={ariaHidden}\n {...props}\n />\n );\n};\n\ntype TriggerClearProps<T extends TgphElement> = TgphComponentProps<\n typeof Button<T>\n> & {\n tooltipProps?: TgphComponentProps<typeof Tooltip>;\n};\n\nconst TriggerClear = <T extends TgphElement>({\n tooltipProps,\n ...props\n}: TriggerClearProps<T>) => {\n const context = React.useContext(ComboboxContext);\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 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 if (!shouldShowClearable) return null;\n\n return (\n <Tooltip label=\"Clear field\" {...tooltipProps}>\n <Button\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 {...props}\n />\n </Tooltip>\n );\n};\n\ntype TriggerTextProps<T extends TgphElement> = TgphComponentProps<\n typeof Button.Text<T>\n>;\n\nconst TriggerText = <T extends TgphElement>({\n children,\n ...props\n}: TriggerTextProps<T>) => {\n const context = React.useContext(ComboboxContext);\n\n const label = React.useMemo(() => {\n if (!isSingleSelect(context.value)) return;\n\n const currentOption = getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n\n const label =\n currentOption?.label || currentOption?.value || context.placeholder;\n\n // In `legacyBehavior` mode, we can override the label of the combobox via the `label` prop\n // in context value. So, if we're in `legacyBehavior` mode and the context value has a\n // label, we want to use that label instead of the label from the current option\n const legacyLabelOverride =\n context.legacyBehavior && (context?.value as DefinedOption)?.label;\n\n return legacyLabelOverride ? legacyLabelOverride : label;\n }, [\n context.value,\n context.options,\n context.legacyBehavior,\n context.placeholder,\n ]);\n\n return (\n <TooltipIfTruncated>\n <Button.Text\n color={!context.value ? \"gray\" : \"default\"}\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n {...props}\n >\n {children || label}\n </Button.Text>\n </TooltipIfTruncated>\n );\n};\n\ntype TriggerPlaceholderProps<T extends TgphElement> = TgphComponentProps<\n typeof Button.Text<T>\n>;\n\nconst TriggerPlaceholder = <T extends TgphElement>({\n children,\n ...props\n}: TriggerPlaceholderProps<T>) => {\n const context = React.useContext(ComboboxContext);\n return (\n <TooltipIfTruncated>\n <Button.Text\n color=\"gray\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n {...props}\n >\n {children || context.placeholder}\n </Button.Text>\n </TooltipIfTruncated>\n );\n};\n\ntype TriggerTagsContainerProps = TgphComponentProps<typeof Stack>;\n\nconst TriggerTagsContainer = ({ children }: TriggerTagsContainerProps) => {\n const context = React.useContext(ComboboxContext);\n\n if (!isMultiSelect(context.value)) return null;\n\n const layout = context.layout || \"truncate\";\n const truncatedLength = context.value.length - 2;\n const truncatedLengthStringArray = truncatedLength.toString().split(\"\");\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 {children}\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={`${context.value.length - 2} 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\nconst TriggerTagContext = React.createContext<{\n value: string;\n}>({\n value: \"\",\n});\n\ntype TriggerTagRootProps<T extends TgphElement> = {\n value: string;\n} & TgphComponentProps<typeof Tag.Root<T>>;\n\nconst TriggerTagRoot = <T extends TgphElement>({\n value,\n children,\n ...props\n}: TriggerTagRootProps<T>) => {\n return (\n <TriggerTagContext.Provider value={{ value }}>\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 {children}\n </Tag.Root>\n </TriggerTagContext.Provider>\n );\n};\n\ntype TriggerTagTextProps<T extends TgphElement> = TgphComponentProps<\n typeof Tag.Text<T>\n>;\n\nconst TriggerTagText = <T extends TgphElement>({\n children,\n ...props\n}: TriggerTagTextProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const triggerTagContext = React.useContext(TriggerTagContext);\n\n const option = React.useMemo(() => {\n // Find option amongst other options\n const foundOption = context.options.find(\n (o) => o.value === triggerTagContext.value,\n );\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 const foundValue = contextValue.find(\n (v) =>\n getValueFromOption(v, context.legacyBehavior) ===\n triggerTagContext.value,\n );\n\n if (!foundValue) return undefined;\n\n return foundValue;\n }, [\n context.options,\n context.value,\n triggerTagContext.value,\n context.legacyBehavior,\n ]);\n\n return <Tag.Text {...props}>{children || option}</Tag.Text>;\n};\n\ntype TriggerTagButtonProps<T extends TgphElement> = TgphComponentProps<\n typeof Tag.Button<T>\n>;\n\nconst TriggerTagButton = <T extends TgphElement>({\n children,\n ...props\n}: TriggerTagButtonProps<T>) => {\n const context = React.useContext(ComboboxContext);\n const triggerTagContext = React.useContext(TriggerTagContext);\n\n return (\n <Tag.Button\n icon={{ icon: Lucide.X, alt: `Remove ${triggerTagContext.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 !== triggerTagContext.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 {...props}\n >\n {children}\n </Tag.Button>\n );\n};\n\ntype TriggerTagDefaultProps<T extends TgphElement> = TgphComponentProps<\n typeof TriggerTagRoot<T>\n>;\n\nconst TriggerTagDefault = <T extends TgphElement>({\n value,\n children,\n ...props\n}: TriggerTagDefaultProps<T>) => {\n return (\n <TriggerTag.Root value={value} {...props}>\n <TriggerTag.Text>{children}</TriggerTag.Text>\n <TriggerTag.Button />\n </TriggerTag.Root>\n );\n};\n\nconst TriggerTag = {\n Root: TriggerTagRoot,\n Text: TriggerTagText,\n Button: TriggerTagButton,\n Default: TriggerTagDefault,\n};\n\nconst Primitives = {\n TriggerIndicator,\n TriggerClear,\n TriggerText,\n TriggerPlaceholder,\n TriggerTagsContainer,\n TriggerTag,\n};\n\nexport { Primitives };\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 RemappedOmit,\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 { Text } from \"@telegraph/typography\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n doesOptionMatchSearchQuery,\n getCurrentOption,\n getOptions,\n getValueFromOption,\n isMultiSelect,\n isSingleSelect,\n} from \"./Combobox.helpers\";\nimport { Primitives } from \"./Combobox.primitives\";\nimport type {\n DefinedOption,\n MultiSelect,\n Option,\n SingleSelect,\n} from \"./Combobox.types\";\n\nconst FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nconst LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nconst SELECT_KEYS = [\"Enter\", \" \"];\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\nexport const 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\nconst TriggerValue = () => {\n const context = React.useContext(ComboboxContext);\n\n if (context.value && isMultiSelect(context.value)) {\n const layout = context.layout || \"truncate\";\n\n if (context.value.length === 0) {\n return <Primitives.TriggerPlaceholder />;\n }\n\n return (\n <Primitives.TriggerTagsContainer>\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 <Primitives.TriggerTag.Default value={value} />\n </RefToTgphRef>\n );\n }\n })}\n </Primitives.TriggerTagsContainer>\n );\n }\n\n if (context && isSingleSelect(context.value)) {\n if (!context.value) {\n return <Primitives.TriggerPlaceholder />;\n }\n return <Primitives.TriggerText />;\n }\n};\n\ntype ChildrenValue = string | Array<string> | never;\n\n// When utilizing the `children` prop as a function, we need to infer the type of the value\n// to ensure that the value is always defined. We do this via the generic `V` passed through\n// to the `Trigger` component. This is expected to be `typeof value`.\ntype ChildrenFnValue<V extends ChildrenValue> = V extends never\n ? never\n : V extends string\n ? DefinedOption | undefined\n : Array<DefinedOption>;\n\ntype TriggerBaseProps = RemappedOmit<\n TgphComponentProps<typeof TelegraphButton.Root> &\n TgphComponentProps<typeof TelegraphMenu.Trigger>,\n \"children\"\n>;\n\ntype TriggerProps<V extends ChildrenValue> = TriggerBaseProps & {\n placeholder?: string;\n children?:\n | React.ReactNode\n | ((props: { value: ChildrenFnValue<V> }) => React.ReactNode);\n};\n\nconst Trigger = <V extends ChildrenValue>({\n size = \"2\",\n children,\n ...props\n}: TriggerProps<V>) => {\n const context = React.useContext(ComboboxContext);\n\n const currentValue = React.useMemo<\n DefinedOption | Array<DefinedOption | undefined> | undefined\n >(() => {\n if (!context.value) return undefined;\n if (isSingleSelect(context.value)) {\n return getCurrentOption(\n context.value,\n context.options,\n context.legacyBehavior,\n );\n }\n if (isMultiSelect(context.value)) {\n return context.value.map((v) =>\n getCurrentOption(v, context.options, context.legacyBehavior),\n );\n }\n return undefined;\n }, [context.value, context.options, context.legacyBehavior]);\n\n const getAriaLabelString = React.useCallback(() => {\n if (!currentValue) return context.placeholder;\n if (isSingleSelect(currentValue)) {\n return currentValue?.label || currentValue?.value || context.placeholder;\n }\n if (isMultiSelect(currentValue)) {\n return (\n currentValue.map((v) => v?.label || v?.value).join(\", \") ||\n context.placeholder\n );\n }\n\n return context.placeholder;\n }, [currentValue, context.placeholder]);\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-combobox-trigger-open={context.open}\n disabled={context.disabled}\n {...props}\n >\n {children ? (\n typeof children === \"function\" ? (\n children({ value: currentValue as ChildrenFnValue<V> })\n ) : (\n children\n )\n ) : (\n <TriggerValue />\n )}\n <Stack align=\"center\" gap=\"1\">\n <Primitives.TriggerClear />\n <Primitives.TriggerIndicator />\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-combobox-trigger-width)\",\n transition: \"min-height 200ms ease-in-out\",\n minHeight: height ? `${height}px` : \"0\",\n ...style,\n ...{\n \"--tgph-combobox-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-combobox-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 // maxHeight defaults to available height - padding from edge of screen\n \"--max-height\": !props.maxHeight\n ? \"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))\"\n : undefined,\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 children: label || children,\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 Primitives: typeof Primitives;\n};\n\nObject.assign(Combobox, {\n Root,\n Trigger,\n Content,\n Options,\n Option,\n Search,\n Empty,\n Create,\n Primitives,\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","foundOption","o","doesOptionMatchSearchQuery","searchQuery","childStrings","findStringNodes","str","childrenArray","strNodes","TriggerIndicator","icon","Lucide","ariaHidden","props","context","ComboboxContext","jsx","Button","motion","TriggerClear","tooltipProps","handleClear","onValueChange","_b","Tooltip","event","TriggerText","label","currentOption","legacyLabelOverride","TooltipIfTruncated","TriggerPlaceholder","TriggerTagsContainer","layout","truncatedLengthStringArray","jsxs","Stack","AnimatePresence","v","Text","n","Box","TriggerTagContext","TriggerTagRoot","Tag","TriggerTagText","triggerTagContext","foundValue","TriggerTagButton","newValue","TriggerTagDefault","TriggerTag","Primitives","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","errored","placeholder","contentId","triggerId","triggerRef","searchRef","contentRef","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","TelegraphMenu","TriggerValue","i","RefToTgphRef","Trigger","size","currentValue","getAriaLabelString","TelegraphButton","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","message","setIsVisible","Fragment","Create","leadingText","values","onCreate","variableAlreadyExists","Combobox"],"mappings":"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"}