@telegraph/combobox 0.0.43 → 0.0.45
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 +20 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.mjs +45 -43
- package/dist/esm/index.mjs.map +1 -1
- package/dist/types/Combobox/Combobox.d.ts.map +1 -1
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @telegraph/combobox
|
|
2
2
|
|
|
3
|
+
## 0.0.45
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`7ef8fe2`](https://github.com/knocklabs/telegraph/commit/7ef8fe2df51b1f632163918095a5496322277cad), [`8f5a797`](https://github.com/knocklabs/telegraph/commit/8f5a797d9d4a02b7477ae8851057d92d09ff0fa3)]:
|
|
8
|
+
- @telegraph/typography@0.1.0
|
|
9
|
+
- @telegraph/button@0.0.54
|
|
10
|
+
- @telegraph/layout@0.1.0
|
|
11
|
+
- @telegraph/input@0.0.26
|
|
12
|
+
- @telegraph/tag@0.0.58
|
|
13
|
+
- @telegraph/tooltip@0.0.27
|
|
14
|
+
- @telegraph/menu@0.0.36
|
|
15
|
+
- @telegraph/icon@0.0.34
|
|
16
|
+
|
|
17
|
+
## 0.0.44
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- [`2ed88f4`](https://github.com/knocklabs/telegraph/commit/2ed88f4870c33b755409c965f189caec29d77c80) Thanks [@kylemcd](https://github.com/kylemcd)! - fix events from bubbling in combobox
|
|
22
|
+
|
|
3
23
|
## 0.0.43
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),H=require("@radix-ui/react-dismissable-layer"),M=require("@radix-ui/react-use-controllable-state"),K=require("@radix-ui/react-visually-hidden"),T=require("@telegraph/button"),D=require("@telegraph/compose-refs"),_=require("@telegraph/helpers"),j=require("@telegraph/icon"),$=require("@telegraph/input"),w=require("@telegraph/layout"),O=require("@telegraph/menu"),L=require("@telegraph/tag"),z=require("@telegraph/tooltip"),Q=require("@telegraph/typography"),x=require("framer-motion"),c=require("react");function G(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const u=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(s,e,u.get?u:{enumerable:!0,get:()=>t[e]})}}return s.default=t,Object.freeze(s)}const Y=G(K),N={0:"5",1:"6",2:"8",3:"10"},v=t=>Array.isArray(t),k=t=>typeof t=="object"&&!Array.isArray(t)||!t,U=["ArrowDown","PageUp","Home"],X=["ArrowUp","PageDown","End"],q=["Enter"," "],C=c.createContext({value:void 0,onValueChange:()=>{},contentId:"",triggerId:"",open:!1,setOpen:()=>{},onOpenToggle:()=>{},clearable:!1,disabled:!1}),J=({modal:t=!0,closeOnSelect:s=!0,clearable:e=!1,disabled:u=!1,open:l,onOpenChange:r,defaultOpen:n,value:o,onValueChange:a,errored:y,placeholder:f,layout:m,...p})=>{const g=c.useId(),d=c.useId(),b=c.useRef(null),h=c.useRef(null),S=c.useRef(null),[R,A]=c.useState(""),[I=!1,E]=M.useControllableState({prop:l,defaultProp:n,onChange:r}),V=c.useCallback(()=>{E(F=>!F)},[E]);return c.useEffect(()=>{I||A("")},[I]),i.jsx(C.Provider,{value:{contentId:g,triggerId:d,value:o,onValueChange:a,placeholder:f,open:I,setOpen:E,onOpenToggle:V,closeOnSelect:s,clearable:e,disabled:u,searchQuery:R,setSearchQuery:A,triggerRef:b,searchRef:h,contentRef:S,errored:y,layout:m},children:i.jsx(O.Menu.Root,{open:I,onOpenChange:E,modal:t,...p})})},W=({label:t,value:s,...e})=>{const u=c.useContext(C);return i.jsxs(L.Tag.Root,{size:"1",as:x.motion.span,initial:{opacity:0,transform:"scale(0.8)"},animate:{opacity:1,transform:"scale(1)"},exit:{opacity:0,transform:"scale(0.5)"},layout:"position",transition:{duration:.2,type:"spring",bounce:0,layout:{duration:.05,type:"spring",bounce:0}},...e,children:[i.jsx(L.Tag.Text,{children:t||s}),i.jsx(L.Tag.Button,{icon:{icon:j.Lucide.X,alt:`Remove ${s}`},onClick:l=>{if(!u.onValueChange)return;const r=u.onValueChange,o=u.value.filter(a=>(a==null?void 0:a.value)!==s);r==null||r(o),l.stopPropagation(),l.preventDefault()}})]})},Z=()=>{var s,e;const t=c.useContext(C);if(t.value&&v(t.value)){const u=t.layout||"truncate",l=t.value.length-2,r=l.toString().split("");return t.value.length===0?i.jsx(T.Button.Text,{color:"gray",children:t.placeholder}):i.jsxs(w.Stack,{gap:"1",w:"full",wrap:u==="wrap"?"wrap":"nowrap",align:"center",style:{position:"relative",flexGrow:1},children:[i.jsx(x.AnimatePresence,{initial:!1,mode:"popLayout",children:t.value.map((n,o)=>{if(n!=null&&n.value&&(u==="truncate"&&o<=1||u==="wrap"))return i.jsx(_.RefToTgphRef,{children:i.jsx(W,{...n})},n.value)})}),i.jsx(x.AnimatePresence,{children:u==="truncate"&&t.value.length>2&&i.jsx(w.Stack,{as:x.motion.div,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2,type:"spring",bounce:0},h:"full",pr:"1",pl:"8",align:"center","aria-label":`${l} more selected`,style:{position:"absolute",right:0,backgroundImage:"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)"},children:i.jsxs(Q.Text,{as:"span",size:"1",style:{whiteSpace:"nowrap"},children:["+",i.jsx(x.AnimatePresence,{mode:"wait",initial:!1,children:r.map(n=>i.jsx(w.Box,{as:x.motion.span,w:"2",display:"inline-block",initial:{opacity:.5},animate:{opacity:1},exit:{opacity:.5},transition:{duration:.1,type:"spring",bounce:0},children:n},n))})," ","more"]})},"truncated text")})]})}return i.jsx(T.Button.Text,{color:t.value?"default":"gray",children:((s=t==null?void 0:t.value)==null?void 0:s.label)||((e=t==null?void 0:t.value)==null?void 0:e.value)||t.placeholder})},ee=({size:t="2",...s})=>{const e=c.useContext(C),u=c.useCallback(()=>{var n,o,a;return e.value?k(e.value)?((n=e.value)==null?void 0:n.label)||((o=e.value)==null?void 0:o.value)||e.placeholder:((a=e.value)==null?void 0:a.map(y=>y==null?void 0:y.label).join(", "))||e.placeholder:e.placeholder},[e.value,e.placeholder]),l=c.useMemo(()=>{var n;if(v(e.value))return e.clearable&&((n=e.value)==null?void 0:n.length)>0;if(k(e.value))return e.clearable&&e.value},[e.clearable,e.value]),r=()=>{var n,o;if(v(e.value)){const a=e.onValueChange;a==null||a([])}if(k(e.value)){const a=e.onValueChange;a==null||a(void 0)}(o=(n=e.triggerRef)==null?void 0:n.current)==null||o.focus()};return i.jsx(O.Menu.Trigger,{...s,asChild:!0,onClick:n=>{var o,a;n.preventDefault(),e.onOpenToggle(),(a=(o=e.triggerRef)==null?void 0:o.current)==null||a.focus()},onKeyDown:n=>{if(n.key==="Tab"){n.stopPropagation();return}if(q.includes(n.key)){n.preventDefault();return}if(n.key==="ArrowDown"){e.onOpenToggle();return}},tgphRef:e.triggerRef,children:i.jsxs(T.Button.Root,{id:e.triggerId,type:"button",bg:"surface-1",variant:"outline",align:"center",minH:N[t],h:"full",w:"full",py:"1",size:t,color:e.errored?"red":"gray",justify:"space-between",role:"combobox","aria-label":u(),"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:[i.jsx(Z,{}),i.jsxs(w.Stack,{align:"center",gap:"1",children:[l&&i.jsx(z.Tooltip,{label:"Clear field",children:i.jsx(T.Button,{type:"button",icon:{icon:j.Lucide.X,alt:"Clear field"},size:"1",variant:"ghost",onClick:n=>{e.value&&(n.stopPropagation(),r())},onKeyDown:n=>{(n.key==="Enter"||n.key===" ")&&(n.stopPropagation(),r())},"data-tgph-combobox-clear":!0,style:{marginTop:"calc(-1 * var(--tgph-spacing-1)",marginBottom:"calc(-1 * var(--tgph-spacing-1)"}})}),i.jsx(T.Button.Icon,{as:x.motion.div,icon:j.Lucide.ChevronDown,animate:{rotate:e.open?"180deg":"0deg"},transition:{duration:.2,type:"spring",bounce:0},"aria-hidden":!0})]})]})})},te=({tgphRef:t,style:s,children:e,...u})=>{const l=c.useContext(C),r=c.useRef(!1),n=D.useComposedRefs(t,l.contentRef),o=c.useRef(null),[a,y]=c.useState(0),[f,m]=c.useState(!1),p=c.useCallback(g=>{const d=g.getBoundingClientRect();d&&y(d.height),f||m(!0)},[f]);return c.useEffect(()=>{const g=new ResizeObserver(d=>{for(const b of d){const h=b.target;p(h)}});return o.current&&f&&g.observe(o.current),()=>g.disconnect()},[f,p]),c.useEffect(()=>{f===!0&&l.open===!1&&m(!1)},[l.open,f]),i.jsx(H.DismissableLayer,{onEscapeKeyDown:g=>{l.open&&(g.preventDefault(),l.setOpen(!1))},children:i.jsx(O.Menu.Content,{as:x.motion.div,mt:"1",initial:{opacity:0,scale:.8,height:"auto"},animate:{opacity:1,scale:1,minHeight:a?`${a}px`:"0"},exit:{opacity:0,scale:0},transition:{duration:.2,type:"spring",bounce:0},onAnimationComplete:()=>{if(!f&&o){const g=o.current;p(g)}},onCloseAutoFocus:g=>{var d,b;r.current||(b=(d=l.triggerRef)==null?void 0:d.current)==null||b.focus(),r.current=!1,g.preventDefault()},onKeyDown:g=>{var b,h,S,R;const d=(h=(b=l.contentRef)==null?void 0:b.current)==null?void 0:h.querySelectorAll("[data-tgph-combobox-option]");document.activeElement===(d==null?void 0:d[0])&&X.includes(g.key)&&((R=(S=l.searchRef)==null?void 0:S.current)==null||R.focus())},bg:"surface-1",style:{width:"var(--tgph-comobobox-trigger-width)",...s,"--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)"},...u,tgphRef:n,"data-tgph-combobox-content":!0,"data-tgph-combobox-content-open":f,role:void 0,"aria-orientation":void 0,children:i.jsx(w.Stack,{direction:"column",gap:"1",tgphRef:o,children:e})})})},oe=({...t})=>{const s=c.useContext(C);return i.jsx(w.Stack,{id:s.contentId,direction:"column",gap:"1",style:{overflowY:"auto",maxHeight:"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))"},role:"listbox",...t})},P=({value:t,label:s,selected:e,onSelect:u,...l})=>{const r=c.useContext(C),[n,o]=c.useState(!1),a=r.value,y=(v(a),!r.searchQuery||t.toLowerCase().includes(r.searchQuery.toLowerCase())),f=v(a)?a.some(p=>(p==null?void 0:p.value)===t):(a==null?void 0:a.value)===t,m=p=>{var d,b;const g=p;if(!(g.key&&!q.includes(g.key))){if(p.stopPropagation(),p.preventDefault(),r.closeOnSelect===!0&&r.setOpen(!1),u)return u(p);if(k(a)){const h=r.onValueChange;h==null||h({value:t,label:s})}else if(v(a)){const h=r.onValueChange,S=f?a.filter(R=>(R==null?void 0:R.value)!==t):[...a,{value:t,label:s}];h==null||h(S)}(b=(d=r.triggerRef)==null?void 0:d.current)==null||b.focus()}};if(y)return i.jsx(O.Menu.Button,{type:"button",onSelect:m,onKeyDown:m,selected:e===null?null:e??f,onFocus:()=>o(!0),onBlur:()=>o(!1),role:"option","aria-selected":f?"true":"false","data-tgph-combobox-option":!0,"data-tgph-combobox-option-focused":n,"data-tgph-combobox-option-value":t,"data-tgph-combobox-option-label":s,...l,children:s||t})},ne=({label:t="Search",placeholder:s="Search",tgphRef:e,value:u,onValueChange:l,...r})=>{var m;const n=c.useId(),o=c.useContext(C),a=D.useComposedRefs(e,o.searchRef),y=u??o.searchQuery,f=l??o.setSearchQuery;return c.useEffect(()=>{var d;const p=b=>{var h,S;U.includes(b.key)&&((S=(h=o.contentRef)==null?void 0:h.current)==null||S.focus({preventScroll:!0})),b.key==="Escape"&&o.setOpen(!1),b.stopPropagation()},g=(d=o.searchRef)==null?void 0:d.current;if(g)return g.addEventListener("keydown",p),()=>{g.removeEventListener("keydown",p)}},[o]),i.jsxs(w.Box,{borderBottom:"px",px:"1",pb:"1",children:[i.jsx(Y.Root,{children:i.jsx(Q.Text,{as:"label",htmlFor:n,children:t})}),i.jsx($.Input,{id:n,variant:"ghost",placeholder:s,value:y,onChange:p=>{f(p.target.value)},LeadingComponent:i.jsx(j.Icon,{icon:j.Lucide.Search,alt:"Search Icon"}),TrailingComponent:o!=null&&o.searchQuery&&((m=o==null?void 0:o.searchQuery)==null?void 0:m.length)>0?i.jsx(T.Button,{as:x.motion.button,initial:{opacity:0},animate:{opacity:1},transition:{duration:.2,type:"spring",bounce:0},variant:"ghost",color:"gray",icon:{icon:j.Lucide.X,alt:"Clear Search Query"},onClick:()=>{var p;return(p=o.setSearchQuery)==null?void 0:p.call(o,"")}}):null,autoFocus:!0,"data-tgph-combobox-search":!0,"aria-controls":o.contentId,...r,tgphRef:a})]})},re=({icon:t={icon:j.Lucide.Search,alt:"Search Icon"},message:s="No results found",children:e,...u})=>{const l=c.useContext(C),[r,n]=c.useState(!1);if(c.useEffect(()=>{var a,y;const o=(y=(a=l.contentRef)==null?void 0:a.current)==null?void 0:y.querySelectorAll("[data-tgph-combobox-option]");(o==null?void 0:o.length)===0?n(!0):n(!1)},[l.searchQuery,l.contentRef,e]),r)return i.jsxs(w.Stack,{as:x.motion.div,initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:.2,type:"spring",bounce:0},gap:"1",align:"center",justify:"center",w:"full",my:"8","data-tgph-combobox-empty":!0,...u,children:[t===null?i.jsx(i.Fragment,{}):i.jsx(j.Icon,{...t}),s===null?i.jsx(i.Fragment,{}):i.jsx(Q.Text,{as:"span",children:s})]})},ae=({leadingText:t="Create",values:s,onCreate:e,selected:u=null,...l})=>{const r=c.useContext(C),n=c.useCallback(o=>!s||(s==null?void 0:s.length)===0?!1:s.some(a=>(a==null?void 0:a.value)===o),[s]);if(r.searchQuery&&!n(r.searchQuery))return i.jsx(P,{leadingIcon:{icon:j.Lucide.Plus,"aria-hidden":!0},mx:"1",value:r.searchQuery,label:`${t} "${r.searchQuery}"`,selected:u,onSelect:()=>{var o;e&&r.value&&r.searchQuery&&(k(r.value)&&e({value:r.searchQuery}),v(r.value)&&e({value:r.searchQuery}),(o=r.setSearchQuery)==null||o.call(r,""))},...l})},B={};Object.assign(B,{Root:J,Trigger:ee,Content:te,Options:oe,Option:P,Search:ne,Empty:re,Create:ae});exports.Combobox=B;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),H=require("@radix-ui/react-dismissable-layer"),M=require("@radix-ui/react-use-controllable-state"),K=require("@radix-ui/react-visually-hidden"),T=require("@telegraph/button"),A=require("@telegraph/compose-refs"),_=require("@telegraph/helpers"),j=require("@telegraph/icon"),$=require("@telegraph/input"),w=require("@telegraph/layout"),O=require("@telegraph/menu"),L=require("@telegraph/tag"),z=require("@telegraph/tooltip"),D=require("@telegraph/typography"),x=require("framer-motion"),c=require("react");function G(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const u=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(s,e,u.get?u:{enumerable:!0,get:()=>t[e]})}}return s.default=t,Object.freeze(s)}const Y=G(K),N={0:"5",1:"6",2:"8",3:"10"},v=t=>Array.isArray(t),k=t=>typeof t=="object"&&!Array.isArray(t)||!t,U=["ArrowDown","PageUp","Home"],X=["ArrowUp","PageDown","End"],P=["Enter"," "],C=c.createContext({value:void 0,onValueChange:()=>{},contentId:"",triggerId:"",open:!1,setOpen:()=>{},onOpenToggle:()=>{},clearable:!1,disabled:!1}),J=({modal:t=!0,closeOnSelect:s=!0,clearable:e=!1,disabled:u=!1,open:l,onOpenChange:r,defaultOpen:n,value:o,onValueChange:a,errored:y,placeholder:f,layout:m,...g})=>{const p=c.useId(),d=c.useId(),b=c.useRef(null),h=c.useRef(null),S=c.useRef(null),[R,Q]=c.useState(""),[I=!1,E]=M.useControllableState({prop:l,defaultProp:n,onChange:r}),V=c.useCallback(()=>{E(F=>!F)},[E]);return c.useEffect(()=>{I||Q("")},[I]),i.jsx(C.Provider,{value:{contentId:p,triggerId:d,value:o,onValueChange:a,placeholder:f,open:I,setOpen:E,onOpenToggle:V,closeOnSelect:s,clearable:e,disabled:u,searchQuery:R,setSearchQuery:Q,triggerRef:b,searchRef:h,contentRef:S,errored:y,layout:m},children:i.jsx(O.Menu.Root,{open:I,onOpenChange:E,modal:t,...g})})},W=({label:t,value:s,...e})=>{const u=c.useContext(C);return i.jsxs(L.Tag.Root,{size:"1",as:x.motion.span,initial:{opacity:0,transform:"scale(0.8)"},animate:{opacity:1,transform:"scale(1)"},exit:{opacity:0,transform:"scale(0.5)"},layout:"position",transition:{duration:.2,type:"spring",bounce:0,layout:{duration:.05,type:"spring",bounce:0}},...e,children:[i.jsx(L.Tag.Text,{children:t||s}),i.jsx(L.Tag.Button,{icon:{icon:j.Lucide.X,alt:`Remove ${s}`},onClick:l=>{if(!u.onValueChange)return;const r=u.onValueChange,o=u.value.filter(a=>(a==null?void 0:a.value)!==s);r==null||r(o),l.stopPropagation(),l.preventDefault()}})]})},Z=()=>{var s,e;const t=c.useContext(C);if(t.value&&v(t.value)){const u=t.layout||"truncate",l=t.value.length-2,r=l.toString().split("");return t.value.length===0?i.jsx(T.Button.Text,{color:"gray",children:t.placeholder}):i.jsxs(w.Stack,{gap:"1",w:"full",wrap:u==="wrap"?"wrap":"nowrap",align:"center",style:{position:"relative",flexGrow:1},children:[i.jsx(x.AnimatePresence,{initial:!1,mode:"popLayout",children:t.value.map((n,o)=>{if(n!=null&&n.value&&(u==="truncate"&&o<=1||u==="wrap"))return i.jsx(_.RefToTgphRef,{children:i.jsx(W,{...n})},n.value)})}),i.jsx(x.AnimatePresence,{children:u==="truncate"&&t.value.length>2&&i.jsx(w.Stack,{as:x.motion.div,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2,type:"spring",bounce:0},h:"full",pr:"1",pl:"8",align:"center","aria-label":`${l} more selected`,style:{position:"absolute",right:0,backgroundImage:"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)"},children:i.jsxs(D.Text,{as:"span",size:"1",style:{whiteSpace:"nowrap"},children:["+",i.jsx(x.AnimatePresence,{mode:"wait",initial:!1,children:r.map(n=>i.jsx(w.Box,{as:x.motion.span,w:"2",display:"inline-block",initial:{opacity:.5},animate:{opacity:1},exit:{opacity:.5},transition:{duration:.1,type:"spring",bounce:0},children:n},n))})," ","more"]})},"truncated text")})]})}return i.jsx(T.Button.Text,{color:t.value?"default":"gray",children:((s=t==null?void 0:t.value)==null?void 0:s.label)||((e=t==null?void 0:t.value)==null?void 0:e.value)||t.placeholder})},ee=({size:t="2",...s})=>{const e=c.useContext(C),u=c.useCallback(()=>{var n,o,a;return e.value?k(e.value)?((n=e.value)==null?void 0:n.label)||((o=e.value)==null?void 0:o.value)||e.placeholder:((a=e.value)==null?void 0:a.map(y=>y==null?void 0:y.label).join(", "))||e.placeholder:e.placeholder},[e.value,e.placeholder]),l=c.useMemo(()=>{var n;if(v(e.value))return e.clearable&&((n=e.value)==null?void 0:n.length)>0;if(k(e.value))return e.clearable&&e.value},[e.clearable,e.value]),r=()=>{var n,o;if(v(e.value)){const a=e.onValueChange;a==null||a([])}if(k(e.value)){const a=e.onValueChange;a==null||a(void 0)}(o=(n=e.triggerRef)==null?void 0:n.current)==null||o.focus()};return i.jsx(O.Menu.Trigger,{...s,asChild:!0,onClick:n=>{var o,a;n.preventDefault(),e.onOpenToggle(),(a=(o=e.triggerRef)==null?void 0:o.current)==null||a.focus()},onKeyDown:n=>{if(n.key==="Tab"){n.stopPropagation();return}if(P.includes(n.key)){n.preventDefault();return}if(n.key==="ArrowDown"){n.stopPropagation(),n.preventDefault(),e.onOpenToggle();return}},tgphRef:e.triggerRef,children:i.jsxs(T.Button.Root,{id:e.triggerId,type:"button",bg:"surface-1",variant:"outline",align:"center",minH:N[t],h:"full",w:"full",py:"1",size:t,color:e.errored?"red":"gray",justify:"space-between",role:"combobox","aria-label":u(),"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:[i.jsx(Z,{}),i.jsxs(w.Stack,{align:"center",gap:"1",children:[l&&i.jsx(z.Tooltip,{label:"Clear field",children:i.jsx(T.Button,{type:"button",icon:{icon:j.Lucide.X,alt:"Clear field"},size:"1",variant:"ghost",onClick:n=>{e.value&&(n.stopPropagation(),r())},onKeyDown:n=>{(n.key==="Enter"||n.key===" ")&&(n.stopPropagation(),r())},"data-tgph-combobox-clear":!0,style:{marginTop:"calc(-1 * var(--tgph-spacing-1)",marginBottom:"calc(-1 * var(--tgph-spacing-1)"}})}),i.jsx(T.Button.Icon,{as:x.motion.div,icon:j.Lucide.ChevronDown,animate:{rotate:e.open?"180deg":"0deg"},transition:{duration:.2,type:"spring",bounce:0},"aria-hidden":!0})]})]})})},te=({tgphRef:t,style:s,children:e,...u})=>{const l=c.useContext(C),r=c.useRef(!1),n=A.useComposedRefs(t,l.contentRef),o=c.useRef(null),[a,y]=c.useState(0),[f,m]=c.useState(!1),g=c.useCallback(p=>{const d=p.getBoundingClientRect();d&&y(d.height),f||m(!0)},[f]);return c.useEffect(()=>{const p=new ResizeObserver(d=>{for(const b of d){const h=b.target;g(h)}});return o.current&&f&&p.observe(o.current),()=>p.disconnect()},[f,g]),c.useEffect(()=>{f===!0&&l.open===!1&&m(!1)},[l.open,f]),i.jsx(H.DismissableLayer,{onEscapeKeyDown:p=>{l.open&&(p.stopPropagation(),p.preventDefault(),l.setOpen(!1))},children:i.jsx(O.Menu.Content,{as:x.motion.div,mt:"1",initial:{opacity:0,scale:.8,height:"auto"},animate:{opacity:1,scale:1,minHeight:a?`${a}px`:"0"},exit:{opacity:0,scale:0},transition:{duration:.2,type:"spring",bounce:0},onAnimationComplete:()=>{if(!f&&o){const p=o.current;g(p)}},onCloseAutoFocus:p=>{var d,b;r.current||(b=(d=l.triggerRef)==null?void 0:d.current)==null||b.focus(),r.current=!1,p.preventDefault()},onKeyDown:p=>{var b,h,S,R;p.stopPropagation();const d=(h=(b=l.contentRef)==null?void 0:b.current)==null?void 0:h.querySelectorAll("[data-tgph-combobox-option]");document.activeElement===(d==null?void 0:d[0])&&X.includes(p.key)&&((R=(S=l.searchRef)==null?void 0:S.current)==null||R.focus())},bg:"surface-1",style:{width:"var(--tgph-comobobox-trigger-width)",...s,"--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)"},...u,tgphRef:n,"data-tgph-combobox-content":!0,"data-tgph-combobox-content-open":f,role:void 0,"aria-orientation":void 0,children:i.jsx(w.Stack,{direction:"column",gap:"1",tgphRef:o,children:e})})})},oe=({...t})=>{const s=c.useContext(C);return i.jsx(w.Stack,{id:s.contentId,direction:"column",gap:"1",style:{overflowY:"auto",maxHeight:"calc(var(--tgph-combobox-content-available-height) - var(--tgph-spacing-12))"},role:"listbox",...t})},q=({value:t,label:s,selected:e,onSelect:u,...l})=>{const r=c.useContext(C),[n,o]=c.useState(!1),a=r.value,y=(v(a),!r.searchQuery||t.toLowerCase().includes(r.searchQuery.toLowerCase())),f=v(a)?a.some(g=>(g==null?void 0:g.value)===t):(a==null?void 0:a.value)===t,m=g=>{var d,b;g.stopPropagation();const p=g;if(!(p.key&&!P.includes(p.key))){if(g.preventDefault(),r.closeOnSelect===!0&&r.setOpen(!1),u)return u(g);if(k(a)){const h=r.onValueChange;h==null||h({value:t,label:s})}else if(v(a)){const h=r.onValueChange,S=f?a.filter(R=>(R==null?void 0:R.value)!==t):[...a,{value:t,label:s}];h==null||h(S)}(b=(d=r.triggerRef)==null?void 0:d.current)==null||b.focus()}};if(y)return i.jsx(O.Menu.Button,{type:"button",onSelect:m,onKeyDown:m,selected:e===null?null:e??f,onFocus:()=>o(!0),onBlur:()=>o(!1),role:"option","aria-selected":f?"true":"false","data-tgph-combobox-option":!0,"data-tgph-combobox-option-focused":n,"data-tgph-combobox-option-value":t,"data-tgph-combobox-option-label":s,...l,children:s||t})},ne=({label:t="Search",placeholder:s="Search",tgphRef:e,value:u,onValueChange:l,...r})=>{var m;const n=c.useId(),o=c.useContext(C),a=A.useComposedRefs(e,o.searchRef),y=u??o.searchQuery,f=l??o.setSearchQuery;return c.useEffect(()=>{var d;const g=b=>{var h,S;U.includes(b.key)&&((S=(h=o.contentRef)==null?void 0:h.current)==null||S.focus({preventScroll:!0})),b.key==="Escape"&&o.setOpen(!1),b.stopPropagation()},p=(d=o.searchRef)==null?void 0:d.current;if(p)return p.addEventListener("keydown",g),()=>{p.removeEventListener("keydown",g)}},[o]),i.jsxs(w.Box,{borderBottom:"px",px:"1",pb:"1",children:[i.jsx(Y.Root,{children:i.jsx(D.Text,{as:"label",htmlFor:n,children:t})}),i.jsx($.Input,{id:n,variant:"ghost",placeholder:s,value:y,onChange:g=>{f(g.target.value)},LeadingComponent:i.jsx(j.Icon,{icon:j.Lucide.Search,alt:"Search Icon"}),TrailingComponent:o!=null&&o.searchQuery&&((m=o==null?void 0:o.searchQuery)==null?void 0:m.length)>0?i.jsx(T.Button,{as:x.motion.button,initial:{opacity:0},animate:{opacity:1},transition:{duration:.2,type:"spring",bounce:0},variant:"ghost",color:"gray",icon:{icon:j.Lucide.X,alt:"Clear Search Query"},onClick:()=>{var g;return(g=o.setSearchQuery)==null?void 0:g.call(o,"")}}):null,autoFocus:!0,"data-tgph-combobox-search":!0,"aria-controls":o.contentId,...r,tgphRef:a})]})},re=({icon:t={icon:j.Lucide.Search,alt:"Search Icon"},message:s="No results found",children:e,...u})=>{const l=c.useContext(C),[r,n]=c.useState(!1);if(c.useEffect(()=>{var a,y;const o=(y=(a=l.contentRef)==null?void 0:a.current)==null?void 0:y.querySelectorAll("[data-tgph-combobox-option]");(o==null?void 0:o.length)===0?n(!0):n(!1)},[l.searchQuery,l.contentRef,e]),r)return i.jsxs(w.Stack,{as:x.motion.div,initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:.2,type:"spring",bounce:0},gap:"1",align:"center",justify:"center",w:"full",my:"8","data-tgph-combobox-empty":!0,...u,children:[t===null?i.jsx(i.Fragment,{}):i.jsx(j.Icon,{...t}),s===null?i.jsx(i.Fragment,{}):i.jsx(D.Text,{as:"span",children:s})]})},ae=({leadingText:t="Create",values:s,onCreate:e,selected:u=null,...l})=>{const r=c.useContext(C),n=c.useCallback(o=>!s||(s==null?void 0:s.length)===0?!1:s.some(a=>(a==null?void 0:a.value)===o),[s]);if(r.searchQuery&&!n(r.searchQuery))return i.jsx(q,{leadingIcon:{icon:j.Lucide.Plus,"aria-hidden":!0},mx:"1",value:r.searchQuery,label:`${t} "${r.searchQuery}"`,selected:u,onSelect:()=>{var o;e&&r.value&&r.searchQuery&&(k(r.value)&&e({value:r.searchQuery}),v(r.value)&&e({value:r.searchQuery}),(o=r.setSearchQuery)==null||o.call(r,""))},...l})},B={};Object.assign(B,{Root:J,Trigger:ee,Content:te,Options:oe,Option:q,Search:ne,Empty:re,Create:ae});exports.Combobox=B;
|
|
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","export type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | undefined;\nexport const isMultiSelect = (\n value: Option | Array<Option>,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option>,\n): value is Option => {\n return (typeof value === \"object\" && !Array.isArray(value)) || !value;\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\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 { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\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) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O extends Option | Array<Option>> = O extends Option\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<O extends Option | Array<Option>> = {\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 children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<RootProps<Option | Array<Option>>, \"children\"> & {\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 }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n});\n\nconst Root = <O extends Option | Array<Option>>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n ...props\n}: RootProps<O>) => {\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 [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 }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n />\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ label, value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Tag.Root\n size=\"1\"\n as={motion.span}\n initial={{ opacity: 0, transform: \"scale(0.8)\" }}\n animate={{ opacity: 1, transform: \"scale(1)\" }}\n exit={{ opacity: 0, transform: \"scale(0.5)\" }}\n layout=\"position\"\n transition={{\n duration: 0.2,\n type: \"spring\",\n bounce: 0,\n layout: {\n duration: 0.05,\n type: \"spring\",\n bounce: 0,\n },\n }}\n {...props}\n >\n <Tag.Text>{label || value}</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 const newValue = contextValue.filter((v) => v?.value !== value);\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 initial={false} mode=\"popLayout\">\n {context.value.map((v, i) => {\n if (\n v?.value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={v.value}>\n <TriggerTag {...v} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence>\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: 0.2, type: \"spring\", bounce: 0 }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n style={{\n position: \"absolute\",\n right: 0,\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n key=\"truncated text\"\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence mode=\"wait\" initial={false}>\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n w=\"2\"\n display=\"inline-block\"\n initial={{\n opacity: 0.5,\n }}\n animate={{\n opacity: 1,\n }}\n exit={{\n opacity: 0.5,\n }}\n transition={{ duration: 0.1, type: \"spring\", bounce: 0 }}\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 return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {context?.value?.label || context?.value?.value || context.placeholder}\n </TelegraphButton.Text>\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 return (\n context.value?.label || context.value?.value || context.placeholder\n );\n } else {\n return (\n context.value?.map((v) => v?.label).join(\", \") || context.placeholder\n );\n }\n }, [context.value, context.placeholder]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\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 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.div}\n icon={Lucide.ChevronDown}\n animate={{ rotate: context.open ? \"180deg\" : \"0deg\" }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 tgphRef,\n style,\n children,\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 return (\n // We add radix's dismissable layer here so that we can swallow any escape key\n // presses to prevent cases like a modal closing when we close the combobox\n <DismissableLayer\n onEscapeKeyDown={(event) => {\n if (context.open) {\n event.preventDefault();\n context.setOpen(false);\n }\n }}\n >\n <TelegraphMenu.Content\n as={motion.div}\n mt=\"1\"\n initial={{\n opacity: 0,\n scale: 0.8,\n height: \"auto\",\n }}\n animate={{\n opacity: 1,\n scale: 1,\n // Set height based on the internalContentRef so that\n // we get smooth animations when the content changes\n minHeight: height ? `${height}px` : \"0\",\n }}\n exit={{ opacity: 0, scale: 0 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\n onAnimationComplete={() => {\n // Set height when the initial animation for\n // displaying the content completes\n if (!initialAnimationComplete && internalContentRef) {\n const element = internalContentRef.current as unknown as Element;\n setHeightFromContent(element);\n }\n }}\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current)\n context.triggerRef?.current?.focus();\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\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 bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\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={initialAnimationComplete}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\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 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 ...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 = isMultiSelect(contextValue)\n ? !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase())\n : !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase());\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some((v) => v?.value === value)\n : contextValue?.value === value;\n\n const handleSelection = (event: Event | React.KeyboardEvent) => {\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.stopPropagation();\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 onValueChange?.({ value, label });\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n\n const newValue = isSelected\n ? contextValue.filter((v) => v?.value !== value)\n : [...contextValue, { value, label }];\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 || 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 as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 as={motion.div}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n leadingText?: string;\n values?: Array<Option>;\n onCreate?: (value: DefinedOption) => void;\n};\n\nconst Create = <T extends TgphElement>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n ...props\n}: CreateProps<T>) => {\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((v) => v?.value === searchQuery);\n },\n [values],\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 if (isSingleSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\n\n if (isMultiSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\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","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","React","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","searchQuery","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","label","context","jsxs","Tag","motion","Lucide","event","newValue","v","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","Box","_b","Trigger","size","getAriaLabelString","_a","_c","shouldShowClearable","handleClear","Tooltip","Content","tgphRef","style","children","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","element","rect","observer","entries","entry","DismissableLayer","options","_d","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","export type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | undefined;\nexport const isMultiSelect = (\n value: Option | Array<Option>,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option>,\n): value is Option => {\n return (typeof value === \"object\" && !Array.isArray(value)) || !value;\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\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 { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\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) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O extends Option | Array<Option>> = O extends Option\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<O extends Option | Array<Option>> = {\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 children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<RootProps<Option | Array<Option>>, \"children\"> & {\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 }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n});\n\nconst Root = <O extends Option | Array<Option>>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n ...props\n}: RootProps<O>) => {\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 [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 }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n />\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ label, value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Tag.Root\n size=\"1\"\n as={motion.span}\n initial={{ opacity: 0, transform: \"scale(0.8)\" }}\n animate={{ opacity: 1, transform: \"scale(1)\" }}\n exit={{ opacity: 0, transform: \"scale(0.5)\" }}\n layout=\"position\"\n transition={{\n duration: 0.2,\n type: \"spring\",\n bounce: 0,\n layout: {\n duration: 0.05,\n type: \"spring\",\n bounce: 0,\n },\n }}\n {...props}\n >\n <Tag.Text>{label || value}</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 const newValue = contextValue.filter((v) => v?.value !== value);\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 initial={false} mode=\"popLayout\">\n {context.value.map((v, i) => {\n if (\n v?.value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={v.value}>\n <TriggerTag {...v} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence>\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: 0.2, type: \"spring\", bounce: 0 }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n style={{\n position: \"absolute\",\n right: 0,\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n key=\"truncated text\"\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence mode=\"wait\" initial={false}>\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n w=\"2\"\n display=\"inline-block\"\n initial={{\n opacity: 0.5,\n }}\n animate={{\n opacity: 1,\n }}\n exit={{\n opacity: 0.5,\n }}\n transition={{ duration: 0.1, type: \"spring\", bounce: 0 }}\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 return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {context?.value?.label || context?.value?.value || context.placeholder}\n </TelegraphButton.Text>\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 return (\n context.value?.label || context.value?.value || context.placeholder\n );\n } else {\n return (\n context.value?.map((v) => v?.label).join(\", \") || context.placeholder\n );\n }\n }, [context.value, context.placeholder]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\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.div}\n icon={Lucide.ChevronDown}\n animate={{ rotate: context.open ? \"180deg\" : \"0deg\" }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 tgphRef,\n style,\n children,\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 return (\n // We add radix's dismissable layer here so that we can swallow any escape key\n // presses to prevent cases like a modal closing when we close the combobox\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 as={motion.div}\n mt=\"1\"\n initial={{\n opacity: 0,\n scale: 0.8,\n height: \"auto\",\n }}\n animate={{\n opacity: 1,\n scale: 1,\n // Set height based on the internalContentRef so that\n // we get smooth animations when the content changes\n minHeight: height ? `${height}px` : \"0\",\n }}\n exit={{ opacity: 0, scale: 0 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\n onAnimationComplete={() => {\n // Set height when the initial animation for\n // displaying the content completes\n if (!initialAnimationComplete && internalContentRef) {\n const element = internalContentRef.current as unknown as Element;\n setHeightFromContent(element);\n }\n }}\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current)\n context.triggerRef?.current?.focus();\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\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 bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\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={initialAnimationComplete}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\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 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 ...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 = isMultiSelect(contextValue)\n ? !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase())\n : !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase());\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some((v) => v?.value === value)\n : contextValue?.value === 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 onValueChange?.({ value, label });\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n\n const newValue = isSelected\n ? contextValue.filter((v) => v?.value !== value)\n : [...contextValue, { value, label }];\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 || 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 as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 as={motion.div}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n leadingText?: string;\n values?: Array<Option>;\n onCreate?: (value: DefinedOption) => void;\n};\n\nconst Create = <T extends TgphElement>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n ...props\n}: CreateProps<T>) => {\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((v) => v?.value === searchQuery);\n },\n [values],\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 if (isSingleSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\n\n if (isMultiSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\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","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","React","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","searchQuery","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","label","context","jsxs","Tag","motion","Lucide","event","newValue","v","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","Box","_b","Trigger","size","getAriaLabelString","_a","_c","shouldShowClearable","handleClear","Tooltip","Content","tgphRef","style","children","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","element","rect","observer","entries","entry","DismissableLayer","options","_d","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":"u4BAAaA,EAAqB,CAChC,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACP,ECHaC,EACXC,GAEO,MAAM,QAAQA,CAAK,EAGfC,EACXD,GAEQ,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,GAAM,CAACA,ECiB5DE,EAAa,CAAC,YAAa,SAAU,MAAM,EAC3CC,EAAY,CAAC,UAAW,WAAY,KAAK,EACzCC,EAAc,CAAC,QAAS,GAAG,EAgC3BC,EAAkBC,EAAM,cAa5B,CACA,MAAO,OACP,cAAe,IAAM,CAAC,EACtB,UAAW,GACX,UAAW,GACX,KAAM,GACN,QAAS,IAAM,CAAC,EAChB,aAAc,IAAM,CAAC,EACrB,UAAW,GACX,SAAU,EACZ,CAAC,EAEKC,EAAO,CAAmC,CAC9C,MAAAC,EAAQ,GACR,cAAAC,EAAgB,GAChB,UAAAC,EAAY,GACZ,SAAAC,EAAW,GACX,KAAMC,EACN,aAAcC,EACd,YAAaC,EACb,MAAAd,EACA,cAAAe,EACA,QAAAC,EACA,YAAAC,EACA,OAAAC,EACA,GAAGC,CACL,IAAoB,CACZ,MAAAC,EAAYd,EAAM,QAClBe,EAAYf,EAAM,QAClBgB,EAAahB,EAAM,OAAO,IAAI,EAC9BiB,EAAYjB,EAAM,OAAO,IAAI,EAC7BkB,EAAalB,EAAM,OAAuB,IAAI,EAE9C,CAACmB,EAAaC,CAAc,EAAIpB,EAAM,SAAiB,EAAE,EACzD,CAACqB,EAAO,GAAOC,CAAO,EAAIC,EAAAA,qBAAqB,CACnD,KAAMjB,EACN,YAAaE,EACb,SAAUD,CAAA,CACX,EAEKiB,EAAexB,EAAM,YAAY,IAAM,CACnCsB,EAACG,GAAa,CAACA,CAAQ,CAAA,EAC9B,CAACH,CAAO,CAAC,EAEZ,OAAAtB,EAAM,UAAU,IAAM,CAGfqB,GACHD,EAAe,EAAE,CACnB,EACC,CAACC,CAAI,CAAC,EAGPK,EAAA,IAAC3B,EAAgB,SAAhB,CACC,MAAO,CACL,UAAAe,EACA,UAAAC,EACA,MAAArB,EAIA,cAAAe,EACA,YAAAE,EACA,KAAAU,EACA,QAAAC,EACA,aAAAE,EACA,cAAArB,EACA,UAAAC,EACA,SAAAC,EACA,YAAAc,EACA,eAAAC,EACA,WAAAJ,EACA,UAAAC,EACA,WAAAC,EACA,QAAAR,EACA,OAAAE,CACF,EAEA,SAAAc,EAAA,IAACC,EAAAA,KAAc,KAAd,CACC,KAAAN,EACA,aAAcC,EACd,MAAApB,EACC,GAAGW,CAAA,CACN,CAAA,CAAA,CAGN,EAOMe,EAAa,CAAC,CAAE,MAAAC,EAAO,MAAAnC,EAAO,GAAGmB,KAA6B,CAC5D,MAAAiB,EAAU9B,EAAM,WAAWD,CAAe,EAG9C,OAAAgC,EAAA,KAACC,EAAAA,IAAI,KAAJ,CACC,KAAK,IACL,GAAIC,EAAO,OAAA,KACX,QAAS,CAAE,QAAS,EAAG,UAAW,YAAa,EAC/C,QAAS,CAAE,QAAS,EAAG,UAAW,UAAW,EAC7C,KAAM,CAAE,QAAS,EAAG,UAAW,YAAa,EAC5C,OAAO,WACP,WAAY,CACV,SAAU,GACV,KAAM,SACN,OAAQ,EACR,OAAQ,CACN,SAAU,IACV,KAAM,SACN,OAAQ,CACV,CACF,EACC,GAAGpB,EAEJ,SAAA,CAAAa,EAAA,IAACM,EAAI,IAAA,KAAJ,CAAU,SAAAH,GAASnC,EAAM,EAC1BgC,EAAA,IAACM,EAAAA,IAAI,OAAJ,CACC,KAAM,CAAE,KAAME,SAAO,EAAG,IAAK,UAAUxC,CAAK,EAAG,EAC/C,QAAUyC,GAA4B,CAChC,GAAA,CAACL,EAAQ,cAAe,OAC5B,MAAMrB,EACJqB,EAAQ,cAEJM,EADeN,EAAQ,MACC,OAAQO,IAAMA,GAAA,YAAAA,EAAG,SAAU3C,CAAK,EAC9De,GAAA,MAAAA,EAAgB2B,GAEhBD,EAAM,gBAAgB,EAEtBA,EAAM,eAAe,CACvB,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,EAEMG,EAAe,IAAM,SACnB,MAAAR,EAAU9B,EAAM,WAAWD,CAAe,EAEhD,GAAI+B,EAAQ,OAASrC,EAAcqC,EAAQ,KAAK,EAAG,CAC3C,MAAAlB,EAASkB,EAAQ,QAAU,WAC3BS,EAAkBT,EAAQ,MAAM,OAAS,EACzCU,EAA6BD,EAAgB,SAAS,EAAE,MAAM,EAAE,EAElE,OAAAT,EAAQ,MAAM,SAAW,QAExBW,SAAgB,KAAhB,CAAqB,MAAM,OACzB,WAAQ,WACX,CAAA,EAIFV,EAAA,KAACW,EAAA,MAAA,CACC,IAAI,IACJ,EAAE,OACF,KAAM9B,IAAW,OAAS,OAAS,SACnC,MAAM,SACN,MAAO,CACL,SAAU,WACV,SAAU,CACZ,EAEA,SAAA,CAACc,EAAAA,IAAAiB,EAAAA,gBAAA,CAAgB,QAAS,GAAO,KAAK,YACnC,WAAQ,MAAM,IAAI,CAACN,EAAGO,IAAM,CAC3B,GACEP,GAAA,MAAAA,EAAG,QACDzB,IAAW,YAAcgC,GAAK,GAAMhC,IAAW,QAG/C,OAAAc,MAACmB,EAAAA,cACC,SAACnB,EAAAA,IAAAE,EAAA,CAAY,GAAGS,CAAG,CAAA,CAAA,EADFA,EAAE,KAErB,CAGL,CAAA,EACH,QACCM,EAAAA,gBACE,CAAA,SAAA/B,IAAW,YAAckB,EAAQ,MAAM,OAAS,GAC/CJ,EAAA,IAACgB,EAAA,MAAA,CACC,GAAIT,EAAO,OAAA,IACX,QAAS,CAAE,QAAS,CAAE,EACtB,QAAS,CAAE,QAAS,CAAE,EACtB,KAAM,CAAE,QAAS,CAAE,EACnB,WAAY,CAAE,SAAU,GAAK,KAAM,SAAU,OAAQ,CAAE,EACvD,EAAE,OACF,GAAG,IACH,GAAG,IACH,MAAM,SACN,aAAY,GAAGM,CAAe,iBAC9B,MAAO,CACL,SAAU,WACV,MAAO,EACP,gBACE,6EACJ,EAGA,SAAAR,EAAAA,KAACe,EAAAA,KAAK,CAAA,GAAG,OAAO,KAAK,IAAI,MAAO,CAAE,WAAY,QAAA,EAAY,SAAA,CAAA,IAExDpB,EAAAA,IAACiB,mBAAgB,KAAK,OAAO,QAAS,GACnC,SAAAH,EAA2B,IAAK,GAC/Bd,EAAA,IAACqB,EAAA,IAAA,CACC,GAAId,EAAO,OAAA,KACX,EAAE,IACF,QAAQ,eACR,QAAS,CACP,QAAS,EACX,EACA,QAAS,CACP,QAAS,CACX,EACA,KAAM,CACJ,QAAS,EACX,EACA,WAAY,CAAE,SAAU,GAAK,KAAM,SAAU,OAAQ,CAAE,EAGtD,SAAA,CAAA,EAFI,CAIR,CAAA,EACH,EAAmB,IAAI,MAAA,EAEzB,CAAA,EA3BI,gBAAA,EA8BV,CAAA,CAAA,CAAA,CAGN,CAEA,aACGQ,EAAgB,OAAA,KAAhB,CAAqB,MAAQX,EAAQ,MAAiB,UAAT,OAC3C,8BAAS,sBAAO,UAASkB,EAAAlB,GAAA,YAAAA,EAAS,QAAT,YAAAkB,EAAgB,QAASlB,EAAQ,WAC7D,CAAA,CAEJ,EAOMmB,GAAU,CAAC,CAAE,KAAAC,EAAO,IAAK,GAAGrC,KAA0B,CACpD,MAAAiB,EAAU9B,EAAM,WAAWD,CAAe,EAE1CoD,EAAqBnD,EAAM,YAAY,IAAM,WACjD,OAAK8B,EAAQ,MACTnC,EAAemC,EAAQ,KAAK,IAE5BsB,EAAAtB,EAAQ,QAAR,YAAAsB,EAAe,UAASJ,EAAAlB,EAAQ,QAAR,YAAAkB,EAAe,QAASlB,EAAQ,cAIxDuB,EAAAvB,EAAQ,QAAR,YAAAuB,EAAe,IAAKhB,GAAMA,GAAA,YAAAA,EAAG,OAAO,KAAK,QAASP,EAAQ,YAPnCA,EAAQ,aAUlC,CAACA,EAAQ,MAAOA,EAAQ,WAAW,CAAC,EAEjCwB,EAAsBtD,EAAM,QAAQ,IAAM,OAC1C,GAAAP,EAAcqC,EAAQ,KAAK,EAC7B,OAAOA,EAAQ,aAAasB,EAAAtB,EAAQ,QAAR,YAAAsB,EAAe,QAAS,EAGlD,GAAAzD,EAAemC,EAAQ,KAAK,EACvB,OAAAA,EAAQ,WAAaA,EAAQ,OAErC,CAACA,EAAQ,UAAWA,EAAQ,KAAK,CAAC,EAE/ByB,EAAc,IAAM,SACpB,GAAA9D,EAAcqC,EAAQ,KAAK,EAAG,CAChC,MAAMrB,EACJqB,EAAQ,cACVrB,GAAA,MAAAA,EAAgB,CAAE,EACpB,CAEI,GAAAd,EAAemC,EAAQ,KAAK,EAAG,CACjC,MAAMrB,EACJqB,EAAQ,cACVrB,GAAA,MAAAA,EAAgB,OAClB,EACQuC,GAAAI,EAAAtB,EAAA,aAAA,YAAAsB,EAAY,UAAZ,MAAAJ,EAAqB,OAAM,EAInC,OAAAtB,EAAA,IAACC,EAAAA,KAAc,QAAd,CACE,GAAGd,EACJ,QAAO,GACP,QAAUsB,GAA4B,SACpCA,EAAM,eAAe,EACrBL,EAAQ,aAAa,GACbkB,GAAAI,EAAAtB,EAAA,aAAA,YAAAsB,EAAY,UAAZ,MAAAJ,EAAqB,OAC/B,EACA,UAAYb,GAA+B,CAErC,GAAAA,EAAM,MAAQ,MAAO,CACvBA,EAAM,gBAAgB,EACtB,MACF,CACA,GAAIrC,EAAY,SAASqC,EAAM,GAAG,EAAG,CACnCA,EAAM,eAAe,EACrB,MACF,CAEI,GAAAA,EAAM,MAAQ,YAAa,CAE7BA,EAAM,gBAAgB,EACtBA,EAAM,eAAe,EACrBL,EAAQ,aAAa,EACrB,MACF,CACF,EACA,QAASA,EAAQ,WAEjB,SAAAC,EAAA,KAACU,EAAAA,OAAgB,KAAhB,CACC,GAAIX,EAAQ,UACZ,KAAK,SACL,GAAG,YACH,QAAQ,UACR,MAAM,SACN,KAAMtC,EAAmB0D,CAAI,EAC7B,EAAE,OACF,EAAE,OACF,GAAG,IACH,KAAAA,EACA,MAAOpB,EAAQ,QAAU,MAAQ,OACjC,QAAQ,gBAER,KAAK,WACL,aAAYqB,EAAmB,EAC/B,gBAAerB,EAAQ,UACvB,gBAAeA,EAAQ,KACvB,gBAAc,UAEd,6BAA0B,GAC1B,iCAAgCA,EAAQ,KACxC,SAAUA,EAAQ,SAElB,SAAA,CAAAJ,EAAA,IAACY,EAAa,EAAA,EACbP,EAAA,KAAAW,EAAA,MAAA,CAAM,MAAM,SAAS,IAAI,IACvB,SAAA,CACCY,GAAA5B,EAAA,IAAC8B,EAAQ,QAAA,CAAA,MAAM,cACb,SAAA9B,EAAA,IAACe,EAAA,OAAA,CACC,KAAK,SACL,KAAM,CAAE,KAAMP,EAAAA,OAAO,EAAG,IAAK,aAAc,EAC3C,KAAK,IACL,QAAQ,QACR,QAAUC,GAA4B,CAC/BL,EAAQ,QACbK,EAAM,gBAAgB,EACVoB,IACd,EACA,UAAYpB,GAA+B,EACrCA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,gBAAgB,EACVoB,IAEhB,EACA,2BAAwB,GACxB,MAAO,CAGL,UAAW,kCACX,aAAc,iCAChB,CAAA,CAAA,EAEJ,EAEF7B,EAAA,IAACe,EAAAA,OAAgB,KAAhB,CACC,GAAIR,EAAO,OAAA,IACX,KAAMC,EAAO,OAAA,YACb,QAAS,CAAE,OAAQJ,EAAQ,KAAO,SAAW,MAAO,EACpD,WAAY,CAAE,SAAU,GAAK,KAAM,SAAU,OAAQ,CAAE,EACvD,cAAW,EAAA,CACb,CAAA,EACF,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,EAMM2B,GAAU,CAAwB,CACtC,QAAAC,EACA,MAAAC,EACA,SAAAC,EACA,GAAG/C,CACL,IAAuB,CACf,MAAAiB,EAAU9B,EAAM,WAAWD,CAAe,EAC1C8D,EAAuB7D,EAAM,OAAO,EAAK,EACzC8D,EAAcC,EAAA,gBAAyBL,EAAS5B,EAAQ,UAAU,EAElEkC,EAAqBhE,EAAM,OAAO,IAAI,EAEtC,CAACiE,EAAQC,CAAS,EAAIlE,EAAM,SAAS,CAAC,EACtC,CAACmE,EAA0BC,CAA2B,EAC1DpE,EAAM,SAAS,EAAK,EAEhBqE,EAAuBrE,EAAM,YAChCsE,GAAqB,CAEd,MAAAC,EAAOD,EAAQ,wBACjBC,GACFL,EAAUK,EAAK,MAAM,EAGlBJ,GACHC,EAA4B,EAAI,CAEpC,EACA,CAACD,CAAwB,CAAA,EAG3B,OAAAnE,EAAM,UAAU,IAAM,CACpB,MAAMwE,EAAW,IAAI,eAAgBC,GAAY,CAC/C,UAAWC,KAASD,EAAS,CAC3B,MAAMH,EAAUI,EAAM,OACtBL,EAAqBC,CAAO,CAC9B,CAAA,CACD,EAGG,OAAAN,EAAmB,SAAWG,GACvBK,EAAA,QAAQR,EAAmB,OAAO,EAGtC,IAAMQ,EAAS,YAAW,EAChC,CAACL,EAA0BE,CAAoB,CAAC,EAGnDrE,EAAM,UAAU,IAAM,CAChBmE,IAA6B,IAAQrC,EAAQ,OAAS,IACxDsC,EAA4B,EAAK,CAElC,EAAA,CAACtC,EAAQ,KAAMqC,CAAwB,CAAC,EAKzCzC,EAAA,IAACiD,EAAA,iBAAA,CACC,gBAAkBxC,GAAU,CACtBL,EAAQ,OAEVK,EAAM,gBAAgB,EACtBA,EAAM,eAAe,EACrBL,EAAQ,QAAQ,EAAK,EAEzB,EAEA,SAAAJ,EAAA,IAACC,EAAAA,KAAc,QAAd,CACC,GAAIM,EAAO,OAAA,IACX,GAAG,IACH,QAAS,CACP,QAAS,EACT,MAAO,GACP,OAAQ,MACV,EACA,QAAS,CACP,QAAS,EACT,MAAO,EAGP,UAAWgC,EAAS,GAAGA,CAAM,KAAO,GACtC,EACA,KAAM,CAAE,QAAS,EAAG,MAAO,CAAE,EAC7B,WAAY,CAAE,SAAU,GAAK,KAAM,SAAU,OAAQ,CAAE,EACvD,oBAAqB,IAAM,CAGrB,GAAA,CAACE,GAA4BH,EAAoB,CACnD,MAAMM,EAAUN,EAAmB,QACnCK,EAAqBC,CAAO,CAC9B,CACF,EACA,iBAAmBnC,GAAiB,SAC7B0B,EAAqB,UAChBb,GAAAI,EAAAtB,EAAA,aAAA,YAAAsB,EAAY,UAAZ,MAAAJ,EAAqB,QAC/Ba,EAAqB,QAAU,GAE/B1B,EAAM,eAAe,CACvB,EACA,UAAYA,GAA+B,aAEzCA,EAAM,gBAAgB,EAIhB,MAAAyC,GAAU5B,GAAAI,EAAAtB,EAAQ,aAAR,YAAAsB,EAAoB,UAApB,YAAAJ,EAA6B,iBAC3C,+BAIA,SAAS,iBAAkB4B,GAAA,YAAAA,EAAU,KACrC/E,EAAU,SAASsC,EAAM,GAAG,KAEpB0C,GAAAxB,EAAAvB,EAAA,YAAA,YAAAuB,EAAW,UAAX,MAAAwB,EAAoB,QAEhC,EACA,GAAG,YACH,MAAO,CACL,MAAO,sCACP,GAAGlB,EAED,4CACE,uCACF,0CACE,sCACF,2CACE,qEACF,iCACE,mCACF,iCACE,mCAEN,EACC,GAAG9C,EACJ,QAASiD,EACT,6BAA0B,GAC1B,kCAAiCK,EAEjC,KAAM,OACN,mBAAkB,OAElB,SAAAzC,EAAA,IAACgB,SAAM,UAAU,SAAS,IAAI,IAAI,QAASsB,EACxC,SAAAJ,CACH,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,EAIMkB,GAAU,CAAwB,CAAE,GAAGjE,KAA6B,CAClE,MAAAiB,EAAU9B,EAAM,WAAWD,CAAe,EAE9C,OAAA2B,EAAA,IAACgB,EAAA,MAAA,CACC,GAAIZ,EAAQ,UACZ,UAAU,SACV,IAAI,IACJ,MAAO,CACL,UAAW,OAEX,UACE,8EACJ,EAEA,KAAK,UACJ,GAAGjB,CAAA,CAAA,CAGV,EAUMkE,EAAS,CAAwB,CACrC,MAAArF,EACA,MAAAmC,EACA,SAAAmD,EACA,SAAAC,EACA,GAAGpE,CACL,IAAsB,CACd,MAAAiB,EAAU9B,EAAM,WAAWD,CAAe,EAC1C,CAACmF,EAAWC,CAAY,EAAInF,EAAM,SAAS,EAAK,EAChDoF,EAAetD,EAAQ,MAEvBuD,GAAY5F,EAAc2F,CAAY,EACxC,CAACtD,EAAQ,aACTpC,EAAM,cAAc,SAASoC,EAAQ,YAAY,aAAa,GAI5DwD,EAAa7F,EAAc2F,CAAY,EACzCA,EAAa,KAAM/C,IAAMA,GAAA,YAAAA,EAAG,SAAU3C,CAAK,GAC3C0F,GAAA,YAAAA,EAAc,SAAU1F,EAEtB6F,EAAmBpD,GAAuC,SAE9DA,EAAM,gBAAgB,EAGtB,MAAMqD,EAAgBrD,EACtB,GAAI,EAAAqD,EAAc,KAAO,CAAC1F,EAAY,SAAS0F,EAAc,GAAG,GAShE,IANArD,EAAM,eAAe,EAEjBL,EAAQ,gBAAkB,IAC5BA,EAAQ,QAAQ,EAAK,EAGnBmD,EAKF,OAAOA,EADe9C,CACO,EAG3B,GAAAxC,EAAeyF,CAAY,EAAG,CAChC,MAAM3E,EACJqB,EAAQ,cACMrB,GAAA,MAAAA,EAAA,CAAE,MAAAf,EAAO,MAAAmC,CAAA,EAAO,SACvBpC,EAAc2F,CAAY,EAAG,CACtC,MAAM3E,EACJqB,EAAQ,cAEJM,EAAWkD,EACbF,EAAa,OAAQ/C,IAAMA,GAAA,YAAAA,EAAG,SAAU3C,CAAK,EAC7C,CAAC,GAAG0F,EAAc,CAAE,MAAA1F,EAAO,MAAAmC,EAAO,EAEtCpB,GAAA,MAAAA,EAAgB2B,EAClB,EAEQY,GAAAI,EAAAtB,EAAA,aAAA,YAAAsB,EAAY,UAAZ,MAAAJ,EAAqB,QAAM,EAGrC,GAAIqC,EAEA,OAAA3D,EAAA,IAACC,EAAAA,KAAc,OAAd,CACC,KAAK,SACL,SAAU4D,EACV,UAAWA,EAGX,SAAUP,IAAa,KAAO,KAAOA,GAAYM,EACjD,QAAS,IAAMH,EAAa,EAAI,EAChC,OAAQ,IAAMA,EAAa,EAAK,EAEhC,KAAK,SACL,gBAAeG,EAAa,OAAS,QAErC,4BAAyB,GACzB,oCAAmCJ,EACnC,kCAAiCxF,EACjC,kCAAiCmC,EAChC,GAAGhB,EAEH,SAASgB,GAAAnC,CAAA,CAAA,CAIlB,EAMM+F,GAAS,CAAC,CACd,MAAA5D,EAAQ,SACR,YAAAlB,EAAc,SACd,QAAA+C,EACA,MAAOgC,EACP,cAAeC,EACf,GAAG9E,CACL,IAAmB,OACX,MAAA+E,EAAK5F,EAAM,QACX8B,EAAU9B,EAAM,WAAWD,CAAe,EAC1C+D,EAAcC,EAAA,gBAAgBL,EAAS5B,EAAQ,SAAS,EAExDpC,EAAQgG,GAAuB5D,EAAQ,YACvCrB,EAAgBkF,GAAqB7D,EAAQ,eAEnD,OAAA9B,EAAM,UAAU,IAAM,OACd,MAAA6F,EAAuB1D,GAAyB,SAChDvC,EAAW,SAASuC,EAAM,GAAG,KAC/Ba,GAAAI,EAAAtB,EAAQ,aAAR,YAAAsB,EAAoB,UAApB,MAAAJ,EAA6B,MAAM,CAAE,cAAe,MAGlDb,EAAM,MAAQ,UAChBL,EAAQ,QAAQ,EAAK,EAGvBK,EAAM,gBAAgB,CAAA,EAGlB2D,GAAc1C,EAAAtB,EAAQ,YAAR,YAAAsB,EAAmB,QAEvC,GAAI0C,EACU,OAAAA,EAAA,iBAAiB,UAAWD,CAAmB,EACpD,IAAM,CACCC,EAAA,oBAAoB,UAAWD,CAAmB,CAAA,CAElE,EACC,CAAC/D,CAAO,CAAC,SAGTiB,MAAI,CAAA,aAAa,KAAK,GAAG,IAAI,GAAG,IAC/B,SAAA,CAACrB,EAAA,IAAAqE,EAAe,KAAf,CACC,SAACrE,EAAAA,IAAAoB,EAAAA,KAAA,CAAK,GAAG,QAAQ,QAAS8C,EACvB,SAAA/D,CAAA,CACH,CACF,CAAA,EACAH,EAAA,IAACsE,EAAA,MAAA,CACC,GAAAJ,EACA,QAAQ,QACR,YAAAjF,EACA,MAAAjB,EACA,SAAWyC,GAA+C,CAC1C1B,EAAA0B,EAAM,OAAO,KAAK,CAClC,EACA,iBAAmBT,EAAAA,IAAAuE,EAAAA,KAAA,CAAK,KAAM/D,EAAAA,OAAO,OAAQ,IAAI,cAAc,EAC/D,kBACEJ,GAAA,MAAAA,EAAS,eAAesB,EAAAtB,GAAA,YAAAA,EAAS,cAAT,YAAAsB,EAAsB,QAAS,EACrD1B,EAAA,IAACe,EAAA,OAAA,CACC,GAAIR,EAAO,OAAA,OACX,QAAS,CAAE,QAAS,CAAE,EACtB,QAAS,CAAE,QAAS,CAAE,EACtB,WAAY,CAAE,SAAU,GAAK,KAAM,SAAU,OAAQ,CAAE,EACvD,QAAQ,QACR,MAAM,OACN,KAAM,CAAE,KAAMC,EAAAA,OAAO,EAAG,IAAK,oBAAqB,EAClD,QAAS,IAAM,OAAA,OAAAkB,EAAAtB,EAAQ,iBAAR,YAAAsB,EAAA,KAAAtB,EAAyB,IAAE,CAAA,EAE1C,KAEN,UAAS,GACT,4BAAyB,GACzB,gBAAeA,EAAQ,UACtB,GAAGjB,EACJ,QAASiD,CAAA,CACX,CACF,CAAA,CAAA,CAEJ,EAOMoC,GAAQ,CAAwB,CAAA,KACpCC,EAAO,CAAE,KAAMjE,EAAAA,OAAO,OAAQ,IAAK,aAAc,EACjD,QAAAkE,EAAU,mBACV,SAAAxC,EACA,GAAG/C,CACL,IAAqB,CACb,MAAAiB,EAAU9B,EAAM,WAAWD,CAAe,EAC1C,CAACsF,EAAWgB,CAAY,EAAIrG,EAAM,SAAS,EAAK,EActD,GAZAA,EAAM,UAAU,IAAM,SACd,MAAA4E,GAAU5B,GAAAI,EAAAtB,EAAQ,aAAR,YAAAsB,EAAoB,UAApB,YAAAJ,EAA6B,iBAC3C,gCAGE4B,GAAA,YAAAA,EAAS,UAAW,EACtByB,EAAa,EAAI,EAEjBA,EAAa,EAAK,CACpB,EACC,CAACvE,EAAQ,YAAaA,EAAQ,WAAY8B,CAAQ,CAAC,EAElDyB,EAEA,OAAAtD,EAAA,KAACW,EAAA,MAAA,CACC,GAAIT,EAAO,OAAA,IACX,QAAS,CAAE,QAAS,EAAG,MAAO,EAAI,EAClC,QAAS,CAAE,QAAS,EAAG,MAAO,CAAE,EAChC,WAAY,CAAE,SAAU,GAAK,KAAM,SAAU,OAAQ,CAAE,EACvD,IAAI,IACJ,MAAM,SACN,QAAQ,SACR,EAAE,OACF,GAAG,IACH,2BAAwB,GACvB,GAAGpB,EAEH,SAAA,CAAAsF,IAAS,KAASzE,EAAA,IAAA4E,WAAA,CAAA,CAAA,EAAO5E,EAAAA,IAAAuE,EAAA,KAAA,CAAM,GAAGE,EAAM,EACxCC,IAAY,KAAS1E,EAAAA,IAAA4E,EAAA,SAAA,CAAA,CAAA,QAAOxD,EAAK,KAAA,CAAA,GAAG,OAAQ,SAAQsD,CAAA,CAAA,CAAA,CAAA,CAAA,CAI7D,EAUMG,GAAS,CAAwB,CACrC,YAAAC,EAAc,SACd,OAAAC,EACA,SAAAC,EACA,SAAA1B,EAAW,KACX,GAAGnE,CACL,IAAsB,CACd,MAAAiB,EAAU9B,EAAM,WAAWD,CAAe,EAE1C4G,EAAwB3G,EAAM,YACjCmB,GACK,CAACsF,IAAUA,GAAA,YAAAA,EAAQ,UAAW,EAAU,GACrCA,EAAO,KAAMpE,IAAMA,GAAA,YAAAA,EAAG,SAAUlB,CAAW,EAEpD,CAACsF,CAAM,CAAA,EAGT,GAAI3E,EAAQ,aAAe,CAAC6E,EAAsB7E,EAAQ,WAAW,EAEjE,OAAAJ,EAAA,IAACqD,EAAA,CACC,YAAa,CAAE,KAAM7C,EAAAA,OAAO,KAAM,cAAe,EAAK,EACtD,GAAG,IACH,MAAOJ,EAAQ,YACf,MAAO,GAAG0E,CAAW,KAAK1E,EAAQ,WAAW,IAC7C,SAAAkD,EACA,SAAU,IAAM,OACV0B,GAAY5E,EAAQ,OAASA,EAAQ,cACnCnC,EAAemC,EAAQ,KAAK,GAC9B4E,EAAS,CAAE,MAAO5E,EAAQ,WAAa,CAAA,EAGrCrC,EAAcqC,EAAQ,KAAK,GAC7B4E,EAAS,CAAE,MAAO5E,EAAQ,WAAa,CAAA,GAGzCsB,EAAAtB,EAAQ,iBAAR,MAAAsB,EAAA,KAAAtB,EAAyB,IAE7B,EACC,GAAGjB,CAAA,CAAA,CAIZ,EAEM+F,EAAW,CAAC,EAWlB,OAAO,OAAOA,EAAU,CACtB,KAAA3G,EACA,QAAAgD,GACA,QAAAQ,GACA,QAAAqB,GACA,OAAAC,EACA,OAAAU,GACA,MAAAS,GACA,OAAAK,EACF,CAAC"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -8,8 +8,8 @@ import { RefToTgphRef as X } from "@telegraph/helpers";
|
|
|
8
8
|
import { Lucide as v, Icon as K } from "@telegraph/icon";
|
|
9
9
|
import { Input as q } from "@telegraph/input";
|
|
10
10
|
import { Stack as T, Box as B } from "@telegraph/layout";
|
|
11
|
-
import { Menu as
|
|
12
|
-
import { Tag as
|
|
11
|
+
import { Menu as D } from "@telegraph/menu";
|
|
12
|
+
import { Tag as O } from "@telegraph/tag";
|
|
13
13
|
import { Tooltip as N } from "@telegraph/tooltip";
|
|
14
14
|
import { Text as P } from "@telegraph/typography";
|
|
15
15
|
import { motion as I, AnimatePresence as L } from "framer-motion";
|
|
@@ -45,9 +45,9 @@ const U = {
|
|
|
45
45
|
errored: b,
|
|
46
46
|
placeholder: d,
|
|
47
47
|
layout: y,
|
|
48
|
-
...
|
|
48
|
+
...g
|
|
49
49
|
}) => {
|
|
50
|
-
const
|
|
50
|
+
const p = c.useId(), f = c.useId(), m = c.useRef(null), h = c.useRef(null), C = c.useRef(null), [w, V] = c.useState(""), [Q = !1, A] = Y({
|
|
51
51
|
prop: s,
|
|
52
52
|
defaultProp: n,
|
|
53
53
|
onChange: r
|
|
@@ -60,7 +60,7 @@ const U = {
|
|
|
60
60
|
x.Provider,
|
|
61
61
|
{
|
|
62
62
|
value: {
|
|
63
|
-
contentId:
|
|
63
|
+
contentId: p,
|
|
64
64
|
triggerId: f,
|
|
65
65
|
value: o,
|
|
66
66
|
// Need to cast this to avoid type errors
|
|
@@ -83,12 +83,12 @@ const U = {
|
|
|
83
83
|
layout: y
|
|
84
84
|
},
|
|
85
85
|
children: /* @__PURE__ */ i(
|
|
86
|
-
|
|
86
|
+
D.Root,
|
|
87
87
|
{
|
|
88
88
|
open: Q,
|
|
89
89
|
onOpenChange: A,
|
|
90
90
|
modal: t,
|
|
91
|
-
...
|
|
91
|
+
...g
|
|
92
92
|
}
|
|
93
93
|
)
|
|
94
94
|
}
|
|
@@ -96,7 +96,7 @@ const U = {
|
|
|
96
96
|
}, ee = ({ label: t, value: l, ...e }) => {
|
|
97
97
|
const u = c.useContext(x);
|
|
98
98
|
return /* @__PURE__ */ S(
|
|
99
|
-
|
|
99
|
+
O.Root,
|
|
100
100
|
{
|
|
101
101
|
size: "1",
|
|
102
102
|
as: I.span,
|
|
@@ -116,9 +116,9 @@ const U = {
|
|
|
116
116
|
},
|
|
117
117
|
...e,
|
|
118
118
|
children: [
|
|
119
|
-
/* @__PURE__ */ i(
|
|
119
|
+
/* @__PURE__ */ i(O.Text, { children: t || l }),
|
|
120
120
|
/* @__PURE__ */ i(
|
|
121
|
-
|
|
121
|
+
O.Button,
|
|
122
122
|
{
|
|
123
123
|
icon: { icon: v.X, alt: `Remove ${l}` },
|
|
124
124
|
onClick: (s) => {
|
|
@@ -226,7 +226,7 @@ const U = {
|
|
|
226
226
|
(o = (n = e.triggerRef) == null ? void 0 : n.current) == null || o.focus();
|
|
227
227
|
};
|
|
228
228
|
return /* @__PURE__ */ i(
|
|
229
|
-
|
|
229
|
+
D.Trigger,
|
|
230
230
|
{
|
|
231
231
|
...l,
|
|
232
232
|
asChild: !0,
|
|
@@ -244,7 +244,7 @@ const U = {
|
|
|
244
244
|
return;
|
|
245
245
|
}
|
|
246
246
|
if (n.key === "ArrowDown") {
|
|
247
|
-
e.onOpenToggle();
|
|
247
|
+
n.stopPropagation(), n.preventDefault(), e.onOpenToggle();
|
|
248
248
|
return;
|
|
249
249
|
}
|
|
250
250
|
},
|
|
@@ -319,33 +319,33 @@ const U = {
|
|
|
319
319
|
children: e,
|
|
320
320
|
...u
|
|
321
321
|
}) => {
|
|
322
|
-
const s = c.useContext(x), r = c.useRef(!1), n = H(t, s.contentRef), o = c.useRef(null), [a, b] = c.useState(0), [d, y] = c.useState(!1),
|
|
323
|
-
(
|
|
324
|
-
const f =
|
|
322
|
+
const s = c.useContext(x), r = c.useRef(!1), n = H(t, s.contentRef), o = c.useRef(null), [a, b] = c.useState(0), [d, y] = c.useState(!1), g = c.useCallback(
|
|
323
|
+
(p) => {
|
|
324
|
+
const f = p.getBoundingClientRect();
|
|
325
325
|
f && b(f.height), d || y(!0);
|
|
326
326
|
},
|
|
327
327
|
[d]
|
|
328
328
|
);
|
|
329
329
|
return c.useEffect(() => {
|
|
330
|
-
const
|
|
330
|
+
const p = new ResizeObserver((f) => {
|
|
331
331
|
for (const m of f) {
|
|
332
332
|
const h = m.target;
|
|
333
|
-
|
|
333
|
+
g(h);
|
|
334
334
|
}
|
|
335
335
|
});
|
|
336
|
-
return o.current && d &&
|
|
337
|
-
}, [d,
|
|
336
|
+
return o.current && d && p.observe(o.current), () => p.disconnect();
|
|
337
|
+
}, [d, g]), c.useEffect(() => {
|
|
338
338
|
d === !0 && s.open === !1 && y(!1);
|
|
339
339
|
}, [s.open, d]), // We add radix's dismissable layer here so that we can swallow any escape key
|
|
340
340
|
// presses to prevent cases like a modal closing when we close the combobox
|
|
341
341
|
/* @__PURE__ */ i(
|
|
342
342
|
M,
|
|
343
343
|
{
|
|
344
|
-
onEscapeKeyDown: (
|
|
345
|
-
s.open && (
|
|
344
|
+
onEscapeKeyDown: (p) => {
|
|
345
|
+
s.open && (p.stopPropagation(), p.preventDefault(), s.setOpen(!1));
|
|
346
346
|
},
|
|
347
347
|
children: /* @__PURE__ */ i(
|
|
348
|
-
|
|
348
|
+
D.Content,
|
|
349
349
|
{
|
|
350
350
|
as: I.div,
|
|
351
351
|
mt: "1",
|
|
@@ -365,20 +365,21 @@ const U = {
|
|
|
365
365
|
transition: { duration: 0.2, type: "spring", bounce: 0 },
|
|
366
366
|
onAnimationComplete: () => {
|
|
367
367
|
if (!d && o) {
|
|
368
|
-
const
|
|
369
|
-
p
|
|
368
|
+
const p = o.current;
|
|
369
|
+
g(p);
|
|
370
370
|
}
|
|
371
371
|
},
|
|
372
|
-
onCloseAutoFocus: (
|
|
372
|
+
onCloseAutoFocus: (p) => {
|
|
373
373
|
var f, m;
|
|
374
|
-
r.current || (m = (f = s.triggerRef) == null ? void 0 : f.current) == null || m.focus(), r.current = !1,
|
|
374
|
+
r.current || (m = (f = s.triggerRef) == null ? void 0 : f.current) == null || m.focus(), r.current = !1, p.preventDefault();
|
|
375
375
|
},
|
|
376
|
-
onKeyDown: (
|
|
376
|
+
onKeyDown: (p) => {
|
|
377
377
|
var m, h, C, w;
|
|
378
|
+
p.stopPropagation();
|
|
378
379
|
const f = (h = (m = s.contentRef) == null ? void 0 : m.current) == null ? void 0 : h.querySelectorAll(
|
|
379
380
|
"[data-tgph-combobox-option]"
|
|
380
381
|
);
|
|
381
|
-
document.activeElement === (f == null ? void 0 : f[0]) && W.includes(
|
|
382
|
+
document.activeElement === (f == null ? void 0 : f[0]) && W.includes(p.key) && ((w = (C = s.searchRef) == null ? void 0 : C.current) == null || w.focus());
|
|
382
383
|
},
|
|
383
384
|
bg: "surface-1",
|
|
384
385
|
style: {
|
|
@@ -425,12 +426,13 @@ const U = {
|
|
|
425
426
|
onSelect: u,
|
|
426
427
|
...s
|
|
427
428
|
}) => {
|
|
428
|
-
const r = c.useContext(x), [n, o] = c.useState(!1), a = r.value, b = (R(a), !r.searchQuery || t.toLowerCase().includes(r.searchQuery.toLowerCase())), d = R(a) ? a.some((
|
|
429
|
+
const r = c.useContext(x), [n, o] = c.useState(!1), a = r.value, b = (R(a), !r.searchQuery || t.toLowerCase().includes(r.searchQuery.toLowerCase())), d = R(a) ? a.some((g) => (g == null ? void 0 : g.value) === t) : (a == null ? void 0 : a.value) === t, y = (g) => {
|
|
429
430
|
var f, m;
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
431
|
+
g.stopPropagation();
|
|
432
|
+
const p = g;
|
|
433
|
+
if (!(p.key && !j.includes(p.key))) {
|
|
434
|
+
if (g.preventDefault(), r.closeOnSelect === !0 && r.setOpen(!1), u)
|
|
435
|
+
return u(g);
|
|
434
436
|
if (k(a)) {
|
|
435
437
|
const h = r.onValueChange;
|
|
436
438
|
h == null || h({ value: t, label: l });
|
|
@@ -443,7 +445,7 @@ const U = {
|
|
|
443
445
|
};
|
|
444
446
|
if (b)
|
|
445
447
|
return /* @__PURE__ */ i(
|
|
446
|
-
|
|
448
|
+
D.Button,
|
|
447
449
|
{
|
|
448
450
|
type: "button",
|
|
449
451
|
onSelect: y,
|
|
@@ -473,13 +475,13 @@ const U = {
|
|
|
473
475
|
const n = c.useId(), o = c.useContext(x), a = H(e, o.searchRef), b = u ?? o.searchQuery, d = s ?? o.setSearchQuery;
|
|
474
476
|
return c.useEffect(() => {
|
|
475
477
|
var f;
|
|
476
|
-
const
|
|
478
|
+
const g = (m) => {
|
|
477
479
|
var h, C;
|
|
478
480
|
J.includes(m.key) && ((C = (h = o.contentRef) == null ? void 0 : h.current) == null || C.focus({ preventScroll: !0 })), m.key === "Escape" && o.setOpen(!1), m.stopPropagation();
|
|
479
|
-
},
|
|
480
|
-
if (
|
|
481
|
-
return
|
|
482
|
-
|
|
481
|
+
}, p = (f = o.searchRef) == null ? void 0 : f.current;
|
|
482
|
+
if (p)
|
|
483
|
+
return p.addEventListener("keydown", g), () => {
|
|
484
|
+
p.removeEventListener("keydown", g);
|
|
483
485
|
};
|
|
484
486
|
}, [o]), /* @__PURE__ */ S(B, { borderBottom: "px", px: "1", pb: "1", children: [
|
|
485
487
|
/* @__PURE__ */ i(z.Root, { children: /* @__PURE__ */ i(P, { as: "label", htmlFor: n, children: t }) }),
|
|
@@ -490,8 +492,8 @@ const U = {
|
|
|
490
492
|
variant: "ghost",
|
|
491
493
|
placeholder: l,
|
|
492
494
|
value: b,
|
|
493
|
-
onChange: (
|
|
494
|
-
d(
|
|
495
|
+
onChange: (g) => {
|
|
496
|
+
d(g.target.value);
|
|
495
497
|
},
|
|
496
498
|
LeadingComponent: /* @__PURE__ */ i(K, { icon: v.Search, alt: "Search Icon" }),
|
|
497
499
|
TrailingComponent: o != null && o.searchQuery && ((y = o == null ? void 0 : o.searchQuery) == null ? void 0 : y.length) > 0 ? /* @__PURE__ */ i(
|
|
@@ -505,8 +507,8 @@ const U = {
|
|
|
505
507
|
color: "gray",
|
|
506
508
|
icon: { icon: v.X, alt: "Clear Search Query" },
|
|
507
509
|
onClick: () => {
|
|
508
|
-
var
|
|
509
|
-
return (
|
|
510
|
+
var g;
|
|
511
|
+
return (g = o.setSearchQuery) == null ? void 0 : g.call(o, "");
|
|
510
512
|
}
|
|
511
513
|
}
|
|
512
514
|
) : null,
|
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","export type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | undefined;\nexport const isMultiSelect = (\n value: Option | Array<Option>,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option>,\n): value is Option => {\n return (typeof value === \"object\" && !Array.isArray(value)) || !value;\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\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 { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\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) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O extends Option | Array<Option>> = O extends Option\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<O extends Option | Array<Option>> = {\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 children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<RootProps<Option | Array<Option>>, \"children\"> & {\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 }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n});\n\nconst Root = <O extends Option | Array<Option>>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n ...props\n}: RootProps<O>) => {\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 [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 }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n />\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ label, value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Tag.Root\n size=\"1\"\n as={motion.span}\n initial={{ opacity: 0, transform: \"scale(0.8)\" }}\n animate={{ opacity: 1, transform: \"scale(1)\" }}\n exit={{ opacity: 0, transform: \"scale(0.5)\" }}\n layout=\"position\"\n transition={{\n duration: 0.2,\n type: \"spring\",\n bounce: 0,\n layout: {\n duration: 0.05,\n type: \"spring\",\n bounce: 0,\n },\n }}\n {...props}\n >\n <Tag.Text>{label || value}</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 const newValue = contextValue.filter((v) => v?.value !== value);\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 initial={false} mode=\"popLayout\">\n {context.value.map((v, i) => {\n if (\n v?.value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={v.value}>\n <TriggerTag {...v} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence>\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: 0.2, type: \"spring\", bounce: 0 }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n style={{\n position: \"absolute\",\n right: 0,\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n key=\"truncated text\"\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence mode=\"wait\" initial={false}>\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n w=\"2\"\n display=\"inline-block\"\n initial={{\n opacity: 0.5,\n }}\n animate={{\n opacity: 1,\n }}\n exit={{\n opacity: 0.5,\n }}\n transition={{ duration: 0.1, type: \"spring\", bounce: 0 }}\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 return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {context?.value?.label || context?.value?.value || context.placeholder}\n </TelegraphButton.Text>\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 return (\n context.value?.label || context.value?.value || context.placeholder\n );\n } else {\n return (\n context.value?.map((v) => v?.label).join(\", \") || context.placeholder\n );\n }\n }, [context.value, context.placeholder]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\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 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.div}\n icon={Lucide.ChevronDown}\n animate={{ rotate: context.open ? \"180deg\" : \"0deg\" }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 tgphRef,\n style,\n children,\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 return (\n // We add radix's dismissable layer here so that we can swallow any escape key\n // presses to prevent cases like a modal closing when we close the combobox\n <DismissableLayer\n onEscapeKeyDown={(event) => {\n if (context.open) {\n event.preventDefault();\n context.setOpen(false);\n }\n }}\n >\n <TelegraphMenu.Content\n as={motion.div}\n mt=\"1\"\n initial={{\n opacity: 0,\n scale: 0.8,\n height: \"auto\",\n }}\n animate={{\n opacity: 1,\n scale: 1,\n // Set height based on the internalContentRef so that\n // we get smooth animations when the content changes\n minHeight: height ? `${height}px` : \"0\",\n }}\n exit={{ opacity: 0, scale: 0 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\n onAnimationComplete={() => {\n // Set height when the initial animation for\n // displaying the content completes\n if (!initialAnimationComplete && internalContentRef) {\n const element = internalContentRef.current as unknown as Element;\n setHeightFromContent(element);\n }\n }}\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current)\n context.triggerRef?.current?.focus();\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\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 bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\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={initialAnimationComplete}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\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 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 ...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 = isMultiSelect(contextValue)\n ? !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase())\n : !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase());\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some((v) => v?.value === value)\n : contextValue?.value === value;\n\n const handleSelection = (event: Event | React.KeyboardEvent) => {\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.stopPropagation();\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 onValueChange?.({ value, label });\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n\n const newValue = isSelected\n ? contextValue.filter((v) => v?.value !== value)\n : [...contextValue, { value, label }];\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 || 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 as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 as={motion.div}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n leadingText?: string;\n values?: Array<Option>;\n onCreate?: (value: DefinedOption) => void;\n};\n\nconst Create = <T extends TgphElement>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n ...props\n}: CreateProps<T>) => {\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((v) => v?.value === searchQuery);\n },\n [values],\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 if (isSingleSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\n\n if (isMultiSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\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","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","React","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","searchQuery","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","label","context","jsxs","Tag","motion","Lucide","event","newValue","v","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","Box","_b","Trigger","size","getAriaLabelString","_a","_c","shouldShowClearable","handleClear","Tooltip","Content","tgphRef","style","children","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","element","rect","observer","entries","entry","DismissableLayer","options","_d","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","export type DefinedOption = { value: string; label?: string | React.ReactNode };\nexport type Option = DefinedOption | undefined;\nexport const isMultiSelect = (\n value: Option | Array<Option>,\n): value is Array<Option> => {\n return Array.isArray(value);\n};\n\nexport const isSingleSelect = (\n value: Option | Array<Option>,\n): value is Option => {\n return (typeof value === \"object\" && !Array.isArray(value)) || !value;\n};\n","import { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\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 { Tag } from \"@telegraph/tag\";\nimport { Tooltip } from \"@telegraph/tooltip\";\nimport { Text } from \"@telegraph/typography\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\n\nimport { TRIGGER_MIN_HEIGHT } from \"./Combobox.constants\";\nimport {\n type DefinedOption,\n type Option,\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) => void;\n};\n\ntype MultiSelect = {\n value?: Array<Option>;\n onValueChange?: (value: Array<Option>) => void;\n};\n\ntype LayoutValue<O extends Option | Array<Option>> = O extends Option\n ? never\n : \"truncate\" | \"wrap\";\n\ntype RootProps<O extends Option | Array<Option>> = {\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 children?: React.ReactNode;\n};\n\nconst ComboboxContext = React.createContext<\n Omit<RootProps<Option | Array<Option>>, \"children\"> & {\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 }\n>({\n value: undefined,\n onValueChange: () => {},\n contentId: \"\",\n triggerId: \"\",\n open: false,\n setOpen: () => {},\n onOpenToggle: () => {},\n clearable: false,\n disabled: false,\n});\n\nconst Root = <O extends Option | Array<Option>>({\n modal = true,\n closeOnSelect = true,\n clearable = false,\n disabled = false,\n open: openProp,\n onOpenChange: onOpenChangeProp,\n defaultOpen: defaultOpenProp,\n value,\n onValueChange,\n errored,\n placeholder,\n layout,\n ...props\n}: RootProps<O>) => {\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 [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 }}\n >\n <TelegraphMenu.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n />\n </ComboboxContext.Provider>\n );\n};\n\ntype TriggerTagProps = {\n value: DefinedOption[\"value\"];\n label?: DefinedOption[\"label\"];\n};\n\nconst TriggerTag = ({ label, value, ...props }: TriggerTagProps) => {\n const context = React.useContext(ComboboxContext);\n\n return (\n <Tag.Root\n size=\"1\"\n as={motion.span}\n initial={{ opacity: 0, transform: \"scale(0.8)\" }}\n animate={{ opacity: 1, transform: \"scale(1)\" }}\n exit={{ opacity: 0, transform: \"scale(0.5)\" }}\n layout=\"position\"\n transition={{\n duration: 0.2,\n type: \"spring\",\n bounce: 0,\n layout: {\n duration: 0.05,\n type: \"spring\",\n bounce: 0,\n },\n }}\n {...props}\n >\n <Tag.Text>{label || value}</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 const newValue = contextValue.filter((v) => v?.value !== value);\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 initial={false} mode=\"popLayout\">\n {context.value.map((v, i) => {\n if (\n v?.value &&\n ((layout === \"truncate\" && i <= 1) || layout === \"wrap\")\n ) {\n return (\n <RefToTgphRef key={v.value}>\n <TriggerTag {...v} />\n </RefToTgphRef>\n );\n }\n })}\n </AnimatePresence>\n <AnimatePresence>\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: 0.2, type: \"spring\", bounce: 0 }}\n h=\"full\"\n pr=\"1\"\n pl=\"8\"\n align=\"center\"\n aria-label={`${truncatedLength} more selected`}\n style={{\n position: \"absolute\",\n right: 0,\n backgroundImage:\n \"linear-gradient(to left, var(--tgph-surface-1) 0 60%, transparent 90% 100%)\",\n }}\n key=\"truncated text\"\n >\n <Text as=\"span\" size=\"1\" style={{ whiteSpace: \"nowrap\" }}>\n +\n <AnimatePresence mode=\"wait\" initial={false}>\n {truncatedLengthStringArray.map((n) => (\n <Box\n as={motion.span}\n w=\"2\"\n display=\"inline-block\"\n initial={{\n opacity: 0.5,\n }}\n animate={{\n opacity: 1,\n }}\n exit={{\n opacity: 0.5,\n }}\n transition={{ duration: 0.1, type: \"spring\", bounce: 0 }}\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 return (\n <TelegraphButton.Text color={!context.value ? \"gray\" : \"default\"}>\n {context?.value?.label || context?.value?.value || context.placeholder}\n </TelegraphButton.Text>\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 return (\n context.value?.label || context.value?.value || context.placeholder\n );\n } else {\n return (\n context.value?.map((v) => v?.label).join(\", \") || context.placeholder\n );\n }\n }, [context.value, context.placeholder]);\n\n const shouldShowClearable = React.useMemo(() => {\n if (isMultiSelect(context.value)) {\n return context.clearable && context.value?.length > 0;\n }\n\n if (isSingleSelect(context.value)) {\n return context.clearable && context.value;\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.div}\n icon={Lucide.ChevronDown}\n animate={{ rotate: context.open ? \"180deg\" : \"0deg\" }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 tgphRef,\n style,\n children,\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 return (\n // We add radix's dismissable layer here so that we can swallow any escape key\n // presses to prevent cases like a modal closing when we close the combobox\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 as={motion.div}\n mt=\"1\"\n initial={{\n opacity: 0,\n scale: 0.8,\n height: \"auto\",\n }}\n animate={{\n opacity: 1,\n scale: 1,\n // Set height based on the internalContentRef so that\n // we get smooth animations when the content changes\n minHeight: height ? `${height}px` : \"0\",\n }}\n exit={{ opacity: 0, scale: 0 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\n onAnimationComplete={() => {\n // Set height when the initial animation for\n // displaying the content completes\n if (!initialAnimationComplete && internalContentRef) {\n const element = internalContentRef.current as unknown as Element;\n setHeightFromContent(element);\n }\n }}\n onCloseAutoFocus={(event: Event) => {\n if (!hasInteractedOutside.current)\n context.triggerRef?.current?.focus();\n hasInteractedOutside.current = false;\n\n event.preventDefault();\n }}\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 bg=\"surface-1\"\n style={{\n width: \"var(--tgph-comobobox-trigger-width)\",\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={initialAnimationComplete}\n // Cancel out accessibility attirbutes related to aria menu\n role={undefined}\n aria-orientation={undefined}\n >\n <Stack direction=\"column\" gap=\"1\" tgphRef={internalContentRef}>\n {children}\n </Stack>\n </TelegraphMenu.Content>\n </DismissableLayer>\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 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 ...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 = isMultiSelect(contextValue)\n ? !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase())\n : !context.searchQuery ||\n value.toLowerCase().includes(context.searchQuery.toLowerCase());\n\n const isSelected = isMultiSelect(contextValue)\n ? contextValue.some((v) => v?.value === value)\n : contextValue?.value === 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 onValueChange?.({ value, label });\n } else if (isMultiSelect(contextValue)) {\n const onValueChange =\n context.onValueChange as MultiSelect[\"onValueChange\"];\n\n const newValue = isSelected\n ? contextValue.filter((v) => v?.value !== value)\n : [...contextValue, { value, label }];\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 || 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 as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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 as={motion.div}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.2, type: \"spring\", bounce: 0 }}\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<T extends TgphElement> = TgphComponentProps<\n typeof TelegraphMenu.Button<T>\n> & {\n leadingText?: string;\n values?: Array<Option>;\n onCreate?: (value: DefinedOption) => void;\n};\n\nconst Create = <T extends TgphElement>({\n leadingText = \"Create\",\n values,\n onCreate,\n selected = null,\n ...props\n}: CreateProps<T>) => {\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((v) => v?.value === searchQuery);\n },\n [values],\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 if (isSingleSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\n\n if (isMultiSelect(context.value)) {\n onCreate({ value: context.searchQuery });\n }\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","FIRST_KEYS","LAST_KEYS","SELECT_KEYS","ComboboxContext","React","Root","modal","closeOnSelect","clearable","disabled","openProp","onOpenChangeProp","defaultOpenProp","onValueChange","errored","placeholder","layout","props","contentId","triggerId","triggerRef","searchRef","contentRef","searchQuery","setSearchQuery","open","setOpen","useControllableState","onOpenToggle","prevOpen","jsx","TelegraphMenu","TriggerTag","label","context","jsxs","Tag","motion","Lucide","event","newValue","v","TriggerValue","truncatedLength","truncatedLengthStringArray","TelegraphButton","Stack","AnimatePresence","i","RefToTgphRef","Text","Box","_b","Trigger","size","getAriaLabelString","_a","_c","shouldShowClearable","handleClear","Tooltip","Content","tgphRef","style","children","hasInteractedOutside","composedRef","useComposedRefs","internalContentRef","height","setHeight","initialAnimationComplete","setInitialAnimationComplete","setHeightFromContent","element","rect","observer","entries","entry","DismissableLayer","options","_d","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../../src/Combobox/Combobox.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAU,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKxD,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,MAAM,EAGZ,MAAM,oBAAoB,CAAC;AAgB5B,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GACjE,KAAK,GACL,UAAU,GAAG,MAAM,CAAC;AAExB,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI;IACjD,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AA2BF,QAAA,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,6LAc3C,SAAS,CAAC,CAAC,CAAC,4CA4Dd,CAAC;AAuJF,KAAK,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;CAChE,CAAC;AAEF,QAAA,MAAM,OAAO,uBAA8B,YAAY,
|
|
1
|
+
{"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../../src/Combobox/Combobox.tsx"],"names":[],"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.45",
|
|
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",
|
|
@@ -35,16 +35,16 @@
|
|
|
35
35
|
"@radix-ui/react-dismissable-layer": "^1.1.1",
|
|
36
36
|
"@radix-ui/react-use-controllable-state": "^1.1.0",
|
|
37
37
|
"@radix-ui/react-visually-hidden": "^1.1.0",
|
|
38
|
-
"@telegraph/button": "^0.0.
|
|
38
|
+
"@telegraph/button": "^0.0.54",
|
|
39
39
|
"@telegraph/compose-refs": "^0.0.2",
|
|
40
40
|
"@telegraph/helpers": "^0.0.7",
|
|
41
|
-
"@telegraph/icon": "^0.0.
|
|
42
|
-
"@telegraph/input": "^0.0.
|
|
43
|
-
"@telegraph/layout": "^0.0
|
|
44
|
-
"@telegraph/menu": "^0.0.
|
|
45
|
-
"@telegraph/tag": "^0.0.
|
|
46
|
-
"@telegraph/tooltip": "^0.0.
|
|
47
|
-
"@telegraph/typography": "^0.0
|
|
41
|
+
"@telegraph/icon": "^0.0.34",
|
|
42
|
+
"@telegraph/input": "^0.0.26",
|
|
43
|
+
"@telegraph/layout": "^0.1.0",
|
|
44
|
+
"@telegraph/menu": "^0.0.36",
|
|
45
|
+
"@telegraph/tag": "^0.0.58",
|
|
46
|
+
"@telegraph/tooltip": "^0.0.27",
|
|
47
|
+
"@telegraph/typography": "^0.1.0",
|
|
48
48
|
"framer-motion": "^11.1.9"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|