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