@xploreu/components 0.4.65 → 0.4.67

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.
Files changed (118) hide show
  1. package/dist/{chunk-A5644ETE.js → chunk-7JOBHAXZ.js} +2 -2
  2. package/dist/{chunk-A5644ETE.js.map → chunk-7JOBHAXZ.js.map} +1 -1
  3. package/dist/{chunk-FFZID5F7.js → chunk-7PQPPJO2.js} +2 -2
  4. package/dist/{chunk-FFZID5F7.js.map → chunk-7PQPPJO2.js.map} +1 -1
  5. package/dist/{chunk-DTWCRGRP.js → chunk-BNMOOOFY.js} +2 -2
  6. package/dist/{chunk-DTWCRGRP.js.map → chunk-BNMOOOFY.js.map} +1 -1
  7. package/dist/chunk-CT7JPFL4.js +3 -0
  8. package/dist/chunk-CT7JPFL4.js.map +1 -0
  9. package/dist/{chunk-TDAEQLUM.js → chunk-F7VAJTWI.js} +2 -2
  10. package/dist/{chunk-TDAEQLUM.js.map → chunk-F7VAJTWI.js.map} +1 -1
  11. package/dist/chunk-FTET6SSC.js +2 -0
  12. package/dist/chunk-FTET6SSC.js.map +1 -0
  13. package/dist/{chunk-R4XVXVLJ.js → chunk-ILE3MBTR.js} +2 -2
  14. package/dist/{chunk-R4XVXVLJ.js.map → chunk-ILE3MBTR.js.map} +1 -1
  15. package/dist/{chunk-AKKXXJRJ.js → chunk-MM4FBTNO.js} +2 -2
  16. package/dist/{chunk-AKKXXJRJ.js.map → chunk-MM4FBTNO.js.map} +1 -1
  17. package/dist/{chunk-SJJ74B6D.js → chunk-NJVFQXVS.js} +2 -2
  18. package/dist/{chunk-SJJ74B6D.js.map → chunk-NJVFQXVS.js.map} +1 -1
  19. package/dist/chunk-OF7UIE56.js +2 -0
  20. package/dist/chunk-OF7UIE56.js.map +1 -0
  21. package/dist/{chunk-QVE2R4LU.js → chunk-OJD5A5W4.js} +2 -2
  22. package/dist/{chunk-QVE2R4LU.js.map → chunk-OJD5A5W4.js.map} +1 -1
  23. package/dist/chunk-OLQXHFH4.js +2 -0
  24. package/dist/chunk-OLQXHFH4.js.map +1 -0
  25. package/dist/chunk-Q6KYNUGD.js +2 -0
  26. package/dist/{chunk-PMIXI5H3.js.map → chunk-Q6KYNUGD.js.map} +1 -1
  27. package/dist/chunk-QQHSCREG.js +2 -0
  28. package/dist/chunk-QQHSCREG.js.map +1 -0
  29. package/dist/chunk-REBKHJ4V.js +2 -0
  30. package/dist/chunk-REBKHJ4V.js.map +1 -0
  31. package/dist/{chunk-2JX7KPG7.js → chunk-SPVZZROC.js} +2 -2
  32. package/dist/{chunk-2JX7KPG7.js.map → chunk-SPVZZROC.js.map} +1 -1
  33. package/dist/chunk-SR4WMOQH.js +3 -0
  34. package/dist/chunk-SR4WMOQH.js.map +1 -0
  35. package/dist/chunk-TFJ6LNOE.js +2 -0
  36. package/dist/chunk-TFJ6LNOE.js.map +1 -0
  37. package/dist/{chunk-W4KMXVJ3.js → chunk-U7E7HHJZ.js} +2 -2
  38. package/dist/{chunk-W4KMXVJ3.js.map → chunk-U7E7HHJZ.js.map} +1 -1
  39. package/dist/chunk-W4DBU7UU.js +2 -0
  40. package/dist/chunk-W4DBU7UU.js.map +1 -0
  41. package/dist/chunk-XEYTRNPN.js +2 -0
  42. package/dist/chunk-XEYTRNPN.js.map +1 -0
  43. package/dist/{chunk-MILLLLR2.js → chunk-YZEE43WX.js} +2 -2
  44. package/dist/{chunk-MILLLLR2.js.map → chunk-YZEE43WX.js.map} +1 -1
  45. package/dist/chunk-ZAFFMMBP.js +3 -0
  46. package/dist/chunk-ZAFFMMBP.js.map +1 -0
  47. package/dist/composites/combobox-chip-outside.js +1 -1
  48. package/dist/composites/combobox-chip.js +1 -1
  49. package/dist/composites/combobox-simple.js +1 -1
  50. package/dist/composites/filter-combobox.js +1 -1
  51. package/dist/composites/index.js +1 -1
  52. package/dist/composites/index.js.map +1 -1
  53. package/dist/composites/phone-input.js +1 -1
  54. package/dist/composites/profile-avatar.js +1 -1
  55. package/dist/form/form-input.js +1 -1
  56. package/dist/form/form-rich-textarea.d.ts +18 -0
  57. package/dist/form/form-rich-textarea.js +2 -0
  58. package/dist/form/form-rich-textarea.js.map +1 -0
  59. package/dist/form/form-textarea.js +1 -1
  60. package/dist/form/form.d.ts +1 -1
  61. package/dist/form/index.d.ts +3 -0
  62. package/dist/form/index.js +1 -1
  63. package/dist/icons/index.d.ts +2 -0
  64. package/dist/icons/index.js +1 -1
  65. package/dist/icons/users-plus-filled-icon.d.ts +6 -0
  66. package/dist/icons/users-plus-filled-icon.js +2 -0
  67. package/dist/icons/users-plus-filled-icon.js.map +1 -0
  68. package/dist/icons/users-plus-icon.d.ts +6 -0
  69. package/dist/icons/users-plus-icon.js +2 -0
  70. package/dist/icons/users-plus-icon.js.map +1 -0
  71. package/dist/primitives/index.d.ts +4 -0
  72. package/dist/primitives/index.js +1 -1
  73. package/dist/primitives/toggle-group.d.ts +24 -0
  74. package/dist/primitives/toggle-group.js +2 -0
  75. package/dist/primitives/toggle-group.js.map +1 -0
  76. package/dist/primitives/toggle.d.ts +18 -0
  77. package/dist/primitives/toggle.js +2 -0
  78. package/dist/primitives/toggle.js.map +1 -0
  79. package/dist/ui/badge-blue.d.ts +2 -2
  80. package/dist/ui/badge-blue.js +1 -1
  81. package/dist/ui/badge.d.ts +6 -2
  82. package/dist/ui/badge.js +1 -1
  83. package/dist/ui/button.d.ts +2 -2
  84. package/dist/ui/combobox.js +1 -1
  85. package/dist/ui/date-multiple-picker.js +1 -1
  86. package/dist/ui/date-picker.d.ts +2 -2
  87. package/dist/ui/date-picker.js +1 -1
  88. package/dist/ui/date-range-picker.js +1 -1
  89. package/dist/ui/dialog.js +1 -1
  90. package/dist/ui/index.d.ts +9 -0
  91. package/dist/ui/index.js +1 -1
  92. package/dist/ui/input-group.d.ts +2 -2
  93. package/dist/ui/input-new.d.ts +1 -1
  94. package/dist/ui/input.d.ts +1 -1
  95. package/dist/ui/input.js +1 -1
  96. package/dist/ui/label.d.ts +2 -2
  97. package/dist/ui/pagination.js +1 -1
  98. package/dist/ui/rich-textarea.d.ts +34 -0
  99. package/dist/ui/rich-textarea.js +2 -0
  100. package/dist/ui/rich-textarea.js.map +1 -0
  101. package/dist/ui/switch.d.ts +2 -2
  102. package/dist/ui/table.js +1 -1
  103. package/dist/ui/textarea.d.ts +1 -1
  104. package/dist/ui/toast.js +1 -1
  105. package/dist/ui/toggle-group.d.ts +17 -0
  106. package/dist/ui/toggle-group.js +2 -0
  107. package/dist/ui/toggle-group.js.map +1 -0
  108. package/dist/ui/toggle.d.ts +15 -0
  109. package/dist/ui/toggle.js +2 -0
  110. package/dist/ui/toggle.js.map +1 -0
  111. package/package.json +116 -108
  112. package/dist/chunk-ALEOQB4P.js +0 -2
  113. package/dist/chunk-ALEOQB4P.js.map +0 -1
  114. package/dist/chunk-JLZNZFOO.js +0 -2
  115. package/dist/chunk-JLZNZFOO.js.map +0 -1
  116. package/dist/chunk-KPNQNOZ5.js +0 -2
  117. package/dist/chunk-KPNQNOZ5.js.map +0 -1
  118. package/dist/chunk-PMIXI5H3.js +0 -2
@@ -1,2 +1,2 @@
1
- import {b as b$1}from'./chunk-DL6MI55G.js';import {b,d,e,f,g,h}from'./chunk-OHLNKXSV.js';import'react';import {jsx,jsxs}from'react/jsx-runtime';function C({name:p,label:t,control:F,rules:d$1,description:T,size:r,className:c,classNameTextarea:u,...x}){return jsx(b,{control:F,name:p,rules:d$1,render:({field:P})=>jsxs(d,{className:c,children:[t&&jsx(e,{size:r,children:t}),jsx(f,{children:jsx(b$1,{className:u,size:r,...x,...P})}),jsx(g,{size:r,children:T}),jsx(h,{size:r})]})})}export{C as a};//# sourceMappingURL=chunk-A5644ETE.js.map
2
- //# sourceMappingURL=chunk-A5644ETE.js.map
1
+ import {b,d,e,f,g,h}from'./chunk-OHLNKXSV.js';import {b as b$1}from'./chunk-DL6MI55G.js';import'react';import {jsx,jsxs}from'react/jsx-runtime';function C({name:p,label:t,control:F,rules:d$1,description:T,size:r,className:c,classNameTextarea:u,...x}){return jsx(b,{control:F,name:p,rules:d$1,render:({field:P})=>jsxs(d,{className:c,children:[t&&jsx(e,{size:r,children:t}),jsx(f,{children:jsx(b$1,{className:u,size:r,...x,...P})}),jsx(g,{size:r,children:T}),jsx(h,{size:r})]})})}export{C as a};//# sourceMappingURL=chunk-7JOBHAXZ.js.map
2
+ //# sourceMappingURL=chunk-7JOBHAXZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/form/form-textarea.tsx"],"names":["FormTextarea","name","label","control","rules","description","size","className","classNameTextarea","props","jsx","FormField","field","jsxs","FormItem","FormLabel","FormControl","Textarea","FormDescription","FormMessage"],"mappings":"gJAmCA,SAASA,CAAAA,CAAsF,CAC7F,KAAAC,CAAAA,CACA,KAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CACA,MAAAC,GAAAA,CACA,WAAA,CAAAC,EACA,IAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,iBAAA,CAAAC,EACA,GAAGC,CACL,EAA2C,CACzC,OACEC,IAACC,CAAAA,CAAA,CACC,QAASR,CAAAA,CACT,IAAA,CAAMF,EACN,KAAA,CAAOG,GAAAA,CACP,OAAQ,CAAC,CAAE,MAAAQ,CAAM,CAAA,GAEbC,KAACC,CAAAA,CAAA,CAAS,UAAWP,CAAAA,CAClB,QAAA,CAAA,CAAAL,GACCQ,GAAAA,CAACK,CAAAA,CAAA,CAAU,IAAA,CAAMT,CAAAA,CACd,SAAAJ,CAAAA,CACH,CAAA,CAEFQ,IAACM,CAAAA,CAAA,CACC,SAAAN,GAAAA,CAACO,GAAAA,CAAA,CACC,SAAA,CAAWT,CAAAA,CACX,KAAMF,CAAAA,CACL,GAAGG,EACH,GAAGG,CAAAA,CACN,EACF,CAAA,CACAF,GAAAA,CAACQ,EAAA,CAAgB,IAAA,CAAMZ,EACpB,QAAA,CAAAD,CAAAA,CACH,EACAK,GAAAA,CAACS,CAAAA,CAAA,CAAY,IAAA,CAAMb,CAAAA,CAAM,CAAA,CAAA,CAC3B,CAAA,CAGN,CAEJ","file":"chunk-A5644ETE.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport type {\r\n ControllerRenderProps,\r\n FieldPath,\r\n FieldValues,\r\n UseControllerProps\r\n} from \"react-hook-form\"\r\n\r\nimport {\r\n FormControl,\r\n FormDescription,\r\n FormField,\r\n FormItem,\r\n FormLabel,\r\n FormMessage,\r\n} from \"./form\"\r\nimport { Textarea, type textareaVariants } from \"../ui/textarea\"\r\nimport type { VariantProps } from \"class-variance-authority\"\r\n\r\ntype FormTextareaProps<\r\n TFieldValues extends FieldValues,\r\n TName extends FieldPath<TFieldValues>\r\n> = {\r\n label?: string;\r\n description?: string;\r\n placeholder?: string;\r\n type?: React.HTMLInputTypeAttribute;\r\n className?: string;\r\n classNameTextarea?: string;\r\n size?: VariantProps<typeof textareaVariants>[\"size\"];\r\n} & Pick<UseControllerProps<TFieldValues, TName>, \"name\" | \"control\" | \"rules\">\r\n & Omit<React.ComponentProps<typeof Textarea>, keyof ControllerRenderProps | \"size\">\r\n\r\nfunction FormTextarea<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>>({\r\n name,\r\n label,\r\n control,\r\n rules,\r\n description,\r\n size,\r\n className,\r\n classNameTextarea,\r\n ...props\r\n}: FormTextareaProps<TFieldValues, TName>) {\r\n return (\r\n <FormField\r\n control={control}\r\n name={name}\r\n rules={rules}\r\n render={({ field }) => {\r\n return (\r\n <FormItem className={className}>\r\n {label && (\r\n <FormLabel size={size}>\r\n {label}\r\n </FormLabel>\r\n )}\r\n <FormControl>\r\n <Textarea\r\n className={classNameTextarea}\r\n size={size}\r\n {...props}\r\n {...field}\r\n />\r\n </FormControl>\r\n <FormDescription size={size}>\r\n {description}\r\n </FormDescription>\r\n <FormMessage size={size} />\r\n </FormItem>\r\n )\r\n }}\r\n />\r\n )\r\n}\r\n\r\nexport { FormTextarea }\r\nexport type { FormTextareaProps }\r\n"]}
1
+ {"version":3,"sources":["../src/form/form-textarea.tsx"],"names":["FormTextarea","name","label","control","rules","description","size","className","classNameTextarea","props","jsx","FormField","field","jsxs","FormItem","FormLabel","FormControl","Textarea","FormDescription","FormMessage"],"mappings":"gJAmCA,SAASA,CAAAA,CAAsF,CAC7F,KAAAC,CAAAA,CACA,KAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CACA,MAAAC,GAAAA,CACA,WAAA,CAAAC,EACA,IAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,iBAAA,CAAAC,EACA,GAAGC,CACL,EAA2C,CACzC,OACEC,IAACC,CAAAA,CAAA,CACC,QAASR,CAAAA,CACT,IAAA,CAAMF,EACN,KAAA,CAAOG,GAAAA,CACP,OAAQ,CAAC,CAAE,MAAAQ,CAAM,CAAA,GAEbC,KAACC,CAAAA,CAAA,CAAS,UAAWP,CAAAA,CAClB,QAAA,CAAA,CAAAL,GACCQ,GAAAA,CAACK,CAAAA,CAAA,CAAU,IAAA,CAAMT,CAAAA,CACd,SAAAJ,CAAAA,CACH,CAAA,CAEFQ,IAACM,CAAAA,CAAA,CACC,SAAAN,GAAAA,CAACO,GAAAA,CAAA,CACC,SAAA,CAAWT,CAAAA,CACX,KAAMF,CAAAA,CACL,GAAGG,EACH,GAAGG,CAAAA,CACN,EACF,CAAA,CACAF,GAAAA,CAACQ,EAAA,CAAgB,IAAA,CAAMZ,EACpB,QAAA,CAAAD,CAAAA,CACH,EACAK,GAAAA,CAACS,CAAAA,CAAA,CAAY,IAAA,CAAMb,CAAAA,CAAM,CAAA,CAAA,CAC3B,CAAA,CAGN,CAEJ","file":"chunk-7JOBHAXZ.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport type {\r\n ControllerRenderProps,\r\n FieldPath,\r\n FieldValues,\r\n UseControllerProps\r\n} from \"react-hook-form\"\r\n\r\nimport {\r\n FormControl,\r\n FormDescription,\r\n FormField,\r\n FormItem,\r\n FormLabel,\r\n FormMessage,\r\n} from \"./form\"\r\nimport { Textarea, type textareaVariants } from \"../ui/textarea\"\r\nimport type { VariantProps } from \"class-variance-authority\"\r\n\r\ntype FormTextareaProps<\r\n TFieldValues extends FieldValues,\r\n TName extends FieldPath<TFieldValues>\r\n> = {\r\n label?: string;\r\n description?: string;\r\n placeholder?: string;\r\n type?: React.HTMLInputTypeAttribute;\r\n className?: string;\r\n classNameTextarea?: string;\r\n size?: VariantProps<typeof textareaVariants>[\"size\"];\r\n} & Pick<UseControllerProps<TFieldValues, TName>, \"name\" | \"control\" | \"rules\">\r\n & Omit<React.ComponentProps<typeof Textarea>, keyof ControllerRenderProps | \"size\">\r\n\r\nfunction FormTextarea<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>>({\r\n name,\r\n label,\r\n control,\r\n rules,\r\n description,\r\n size,\r\n className,\r\n classNameTextarea,\r\n ...props\r\n}: FormTextareaProps<TFieldValues, TName>) {\r\n return (\r\n <FormField\r\n control={control}\r\n name={name}\r\n rules={rules}\r\n render={({ field }) => {\r\n return (\r\n <FormItem className={className}>\r\n {label && (\r\n <FormLabel size={size}>\r\n {label}\r\n </FormLabel>\r\n )}\r\n <FormControl>\r\n <Textarea\r\n className={classNameTextarea}\r\n size={size}\r\n {...props}\r\n {...field}\r\n />\r\n </FormControl>\r\n <FormDescription size={size}>\r\n {description}\r\n </FormDescription>\r\n <FormMessage size={size} />\r\n </FormItem>\r\n )\r\n }}\r\n />\r\n )\r\n}\r\n\r\nexport { FormTextarea }\r\nexport type { FormTextareaProps }\r\n"]}
@@ -1,2 +1,2 @@
1
- import {a,b as b$1,j,i,k,l,m,q,s,w,x,H}from'./chunk-R4XVXVLJ.js';import {g}from'./chunk-HHG7BSWN.js';import {b}from'./chunk-Y6TKCAAJ.js';import*as r from'react';import {cn}from'@xploreu/lib/cn';import {SearchIcon,XIcon}from'lucide-react';import {useControlledState}from'@xploreu/hooks/use-controlled-state';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function ae({multiple:B=true,inputPlaceholder:q$1="Search...",container:A,items:u,infiniteScroll:H$1,isPending:U,taggable:b$2=false,maxVisible:m$1,className:X,triggerClassName:D,contentClassName:F,...i$1}){let[x$1,h]=useControlledState({value:i$1?.inputValue?.toString(),defaultValue:i$1?.defaultInputValue?.toString(),onChange:i$1?.onInputValueChange}),[c,v]=useControlledState({value:i$1?.value??[],defaultValue:i$1?.defaultValue??[],onChange:i$1?.onValueChange}),[I,V]=r.useState([]),d=r.useRef(new Set);r.useEffect(()=>{let e=new Set(c.map(t=>t.value));V(t=>{let l=t.filter(a=>e.has(a.value));return l.length===t.length?t:(d.current=new Set(l.map(a=>a.value)),l)});},[c]);let n=x$1?.toString().trim()??"",G=r.useMemo(()=>n?c.some(e=>e.value.toLowerCase()===n.toLowerCase()):false,[n,c]),C=r.useMemo(()=>!b$2||!n?false:!u?.some(e=>e.label.toLowerCase()===n.toLowerCase()),[b$2,n,u]),J=r.useMemo(()=>{let e=[...u??[],...I];if(C){let t={label:n,value:n,tag:true};return [...e,t]}return e},[u,I,C,n]);return jsxs(a,{...i$1,behavior:"chip-outside",multiple:true,items:b$2?J:u,isItemEqualToValue:(e,t)=>e.value===t.value,onValueChange:(e,t)=>{if(b$2){let l=e.filter(a=>a?.tag===true&&!d.current.has(a.value));if(l.length>0){for(let a of l)d.current.add(a.value);V(a=>[...a,...l]);}}v(B?e:[e[e.length-1]],t);},onInputValueChange:h,children:[jsxs("div",{className:cn("flex flex-col gap-2",X),children:[jsx(g,{render:jsx(b,{className:cn("h-9 text-body-regular-3 pl-9 pr-7",D),endContent:jsx(b$1,{nativeButton:false,render:jsx(XIcon,{className:"!size-5 !right-1.5 data-[hidden=true]:opacity-0 opacity-100 transition-opacity duration-300 cursor-pointer","data-hidden":!x$1,"data-slot":"combobox-clear-input",onClick:e=>{h("",{reason:"none",event:e.nativeEvent,cancel:()=>{},allowPropagation:()=>{},isCanceled:false,isPropagationAllowed:true,trigger:void 0});}})}),placeholder:q$1,startContent:jsx(SearchIcon,{className:"!size-4 !text-fg-tertiary-hover"}),wrapperClassName:"w-full"})}),jsx(j,{className:cn(m$1!==void 0&&"flex-nowrap overflow-hidden"),onMouseDown:e=>e.preventBaseUIHandler(),children:jsx(i,{children:e=>{let t=m$1!==void 0?e.slice(0,m$1):e,l$1=m$1!==void 0?e.length-m$1:0;return jsxs(Fragment,{children:[t?.map(a=>jsxs(k,{className:cn("max-w-full min-w-0",m$1!==void 0&&"shrink"),children:[jsx("span",{className:"truncate",title:a?.label||"",children:a?.label||""}),jsx(l,{})]},a?.value||"")),l$1>0&&jsxs(k,{className:"shrink-0",children:["+",l$1]})]})}})})]}),jsxs(m,{container:A,className:F,children:[jsx(q,{status:U||u===void 0?"pending":u?.length===0&&!C?"empty":null}),jsxs(s,{children:[u?.map(e=>jsx(w,{value:{label:e.label,value:e.value},children:jsx(x,{children:e.label})},e.value)),C&&jsx(w,{value:{label:n,value:n,tag:true},children:jsxs("div",{className:"flex items-center gap-1.5 w-full min-w-0",children:[!G&&jsx("span",{className:"text-text-secondary",children:"Create:"}),jsx("span",{className:"font-medium text-text-primary truncate",children:n})]})}),jsx(H,{...H$1})]})]})]})}export{ae as a};//# sourceMappingURL=chunk-FFZID5F7.js.map
2
- //# sourceMappingURL=chunk-FFZID5F7.js.map
1
+ import {a,b as b$1,j,i,k,l,m,q,s,w,x,H}from'./chunk-ILE3MBTR.js';import {g}from'./chunk-HHG7BSWN.js';import {b}from'./chunk-Y6TKCAAJ.js';import*as r from'react';import {cn}from'@xploreu/lib/cn';import {SearchIcon,XIcon}from'lucide-react';import {useControlledState}from'@xploreu/hooks/use-controlled-state';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function ae({multiple:B=true,inputPlaceholder:q$1="Search...",container:A,items:u,infiniteScroll:H$1,isPending:U,taggable:b$2=false,maxVisible:m$1,className:X,triggerClassName:D,contentClassName:F,...i$1}){let[x$1,h]=useControlledState({value:i$1?.inputValue?.toString(),defaultValue:i$1?.defaultInputValue?.toString(),onChange:i$1?.onInputValueChange}),[c,v]=useControlledState({value:i$1?.value??[],defaultValue:i$1?.defaultValue??[],onChange:i$1?.onValueChange}),[I,V]=r.useState([]),d=r.useRef(new Set);r.useEffect(()=>{let e=new Set(c.map(t=>t.value));V(t=>{let l=t.filter(a=>e.has(a.value));return l.length===t.length?t:(d.current=new Set(l.map(a=>a.value)),l)});},[c]);let n=x$1?.toString().trim()??"",G=r.useMemo(()=>n?c.some(e=>e.value.toLowerCase()===n.toLowerCase()):false,[n,c]),C=r.useMemo(()=>!b$2||!n?false:!u?.some(e=>e.label.toLowerCase()===n.toLowerCase()),[b$2,n,u]),J=r.useMemo(()=>{let e=[...u??[],...I];if(C){let t={label:n,value:n,tag:true};return [...e,t]}return e},[u,I,C,n]);return jsxs(a,{...i$1,behavior:"chip-outside",multiple:true,items:b$2?J:u,isItemEqualToValue:(e,t)=>e.value===t.value,onValueChange:(e,t)=>{if(b$2){let l=e.filter(a=>a?.tag===true&&!d.current.has(a.value));if(l.length>0){for(let a of l)d.current.add(a.value);V(a=>[...a,...l]);}}v(B?e:[e[e.length-1]],t);},onInputValueChange:h,children:[jsxs("div",{className:cn("flex flex-col gap-2",X),children:[jsx(g,{render:jsx(b,{className:cn("h-9 text-body-regular-3 pl-9 pr-7",D),endContent:jsx(b$1,{nativeButton:false,render:jsx(XIcon,{className:"!size-5 !right-1.5 data-[hidden=true]:opacity-0 opacity-100 transition-opacity duration-300 cursor-pointer","data-hidden":!x$1,"data-slot":"combobox-clear-input",onClick:e=>{h("",{reason:"none",event:e.nativeEvent,cancel:()=>{},allowPropagation:()=>{},isCanceled:false,isPropagationAllowed:true,trigger:void 0});}})}),placeholder:q$1,startContent:jsx(SearchIcon,{className:"!size-4 !text-fg-tertiary-hover"}),wrapperClassName:"w-full"})}),jsx(j,{className:cn(m$1!==void 0&&"flex-nowrap overflow-hidden"),onMouseDown:e=>e.preventBaseUIHandler(),children:jsx(i,{children:e=>{let t=m$1!==void 0?e.slice(0,m$1):e,l$1=m$1!==void 0?e.length-m$1:0;return jsxs(Fragment,{children:[t?.map(a=>jsxs(k,{className:cn("max-w-full min-w-0",m$1!==void 0&&"shrink"),children:[jsx("span",{className:"truncate",title:a?.label||"",children:a?.label||""}),jsx(l,{})]},a?.value||"")),l$1>0&&jsxs(k,{className:"shrink-0",children:["+",l$1]})]})}})})]}),jsxs(m,{container:A,className:F,children:[jsx(q,{status:U||u===void 0?"pending":u?.length===0&&!C?"empty":null}),jsxs(s,{children:[u?.map(e=>jsx(w,{value:{label:e.label,value:e.value},children:jsx(x,{children:e.label})},e.value)),C&&jsx(w,{value:{label:n,value:n,tag:true},children:jsxs("div",{className:"flex items-center gap-1.5 w-full min-w-0",children:[!G&&jsx("span",{className:"text-text-secondary",children:"Create:"}),jsx("span",{className:"font-medium text-text-primary truncate",children:n})]})}),jsx(H,{...H$1})]})]})]})}export{ae as a};//# sourceMappingURL=chunk-7PQPPJO2.js.map
2
+ //# sourceMappingURL=chunk-7PQPPJO2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/composites/combobox-chip-outside.tsx"],"names":["ComboboxChipOutside","multiple","inputPlaceholder","container","items","infiniteScroll","isPending","taggable","maxVisible","className","triggerClassName","contentClassName","props","inputValue","setInputValue","useControlledState","value","setValue","createdItems","setCreatedItems","createdValuesRef","currentValues","v","prev","next","item","trimmedInput","isInputSelected","isCreatingItem","combinedItems","base","createItem","jsxs","Combobox","a","b","eventDetails","newTags","tag","cn","jsx","ComboboxInput","Input","ComboboxTrigger","XIcon","event","SearchIcon","ComboboxChips","ComboboxValue","visible","overflow","Fragment","ComboboxChip","ComboboxChipRemove","ComboboxPopup","ComboboxStatus","ComboboxList","ComboboxItem","ComboboxItemTitle","ComboboxInfiniteScroll"],"mappings":"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","file":"chunk-FFZID5F7.js","sourcesContent":["import * as React from \"react\"\r\n\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { ComboboxInput as ComboboxInputPrimitive } from \"../primitives/combobox\"\r\nimport { Input } from \"../ui\"\r\nimport {\r\n Combobox,\r\n ComboboxChip,\r\n ComboboxChipRemove,\r\n ComboboxChips,\r\n ComboboxInfiniteScroll,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxPortal,\r\n ComboboxPopup,\r\n ComboboxStatus,\r\n ComboboxTrigger,\r\n ComboboxValue,\r\n type ComboboxProps,\r\n ComboboxItemTitle\r\n} from \"../ui/combobox\"\r\nimport { SearchIcon, XIcon } from \"lucide-react\"\r\nimport { useControlledState } from \"@xploreu/hooks/use-controlled-state\"\r\n\r\ntype ComboboxChipOutsideProps<Value> = Omit<ComboboxProps<Value, true>, \"multiple\"> & {\r\n multiple?: boolean\r\n inputPlaceholder?: string\r\n container?: React.ComponentProps<typeof ComboboxPortal>[\"container\"]\r\n items: ({ label: string; value: string }[]) | undefined\r\n infiniteScroll?: React.ComponentProps<typeof ComboboxInfiniteScroll>\r\n isPending?: boolean\r\n /**\r\n * When true, enables creatable / taggable mode.\r\n * If the typed value has no exact match in the current item list,\r\n * a \"Create \\\"…\\\"\" option is shown at the top of the dropdown.\r\n * Created items are appended to the value with `{ label, value, tag: true }`.\r\n */\r\n taggable?: boolean\r\n /**\r\n * Maximum number of chips to show before collapsing the rest into a \"+N\" chip.\r\n * When undefined, all chips are shown.\r\n */\r\n maxVisible?: number\r\n className?: string\r\n triggerClassName?: string\r\n contentClassName?: string\r\n}\r\n\r\nfunction ComboboxChipOutside<Value extends { label: string; value: string; tag?: true }>({\r\n multiple = true,\r\n inputPlaceholder = \"Search...\",\r\n container,\r\n items,\r\n infiniteScroll,\r\n isPending,\r\n taggable = false,\r\n maxVisible,\r\n className,\r\n triggerClassName,\r\n contentClassName,\r\n ...props\r\n}: ComboboxChipOutsideProps<Value>) {\r\n const [inputValue, setInputValue] = useControlledState({\r\n value: props?.inputValue?.toString(),\r\n defaultValue: props?.defaultInputValue?.toString(),\r\n onChange: props?.onInputValueChange,\r\n })\r\n\r\n const [value, setValue] = useControlledState({\r\n value: props?.value ?? [],\r\n defaultValue: props?.defaultValue ?? [],\r\n onChange: props?.onValueChange,\r\n })\r\n\r\n // Track items created via taggable mode\r\n // Sync with value to avoid stale tags when controlled value is reset from outside\r\n const [createdItems, setCreatedItems] = React.useState<Value[]>([])\r\n const createdValuesRef = React.useRef<Set<string>>(new Set())\r\n\r\n React.useEffect(() => {\r\n const currentValues = new Set(value.map((v) => v.value))\r\n setCreatedItems((prev) => {\r\n const next = prev.filter((item) => currentValues.has(item.value))\r\n if (next.length === prev.length) return prev\r\n createdValuesRef.current = new Set(next.map((v) => v.value))\r\n return next\r\n })\r\n }, [value])\r\n\r\n // Determine if the current input has no exact match in existing items\r\n const trimmedInput = inputValue?.toString().trim() ?? \"\"\r\n const isInputSelected = React.useMemo(() => {\r\n if (!trimmedInput) return false\r\n return value.some(\r\n (item) => item.value.toLowerCase() === trimmedInput.toLowerCase()\r\n )\r\n }, [trimmedInput, value])\r\n // true = show the taggable item in dropdown (either as \"Create:\" or as checked item)\r\n const isCreatingItem = React.useMemo(() => {\r\n if (!taggable || !trimmedInput) return false\r\n return !items?.some(\r\n (item) => item.label.toLowerCase() === trimmedInput.toLowerCase()\r\n )\r\n }, [taggable, trimmedInput, items])\r\n\r\n // Merge server items with locally created tags + the \"Create\" placeholder\r\n const combinedItems = React.useMemo(() => {\r\n const base: Value[] = [\r\n ...items ?? [],\r\n ...createdItems,\r\n ]\r\n\r\n if (isCreatingItem) {\r\n const createItem = {\r\n label: trimmedInput,\r\n value: trimmedInput,\r\n tag: true,\r\n }\r\n return [...base, createItem]\r\n }\r\n\r\n return base\r\n }, [items, createdItems, isCreatingItem, trimmedInput])\r\n\r\n const handleValueChange: ComboboxProps<Value, true>[\"onValueChange\"] = (value, eventDetails) => {\r\n // Capture newly created taggable items internally\r\n if (taggable) {\r\n const newTags = value.filter(\r\n (v) => v?.tag === true\r\n && !createdValuesRef.current.has(v.value)\r\n )\r\n if (newTags.length > 0) {\r\n for (const tag of newTags) {\r\n createdValuesRef.current.add(tag.value)\r\n }\r\n setCreatedItems((prev) => [...prev, ...newTags])\r\n }\r\n }\r\n\r\n // if multiple is false, we need to replace the value with the new value instead of adding to it\r\n if (!multiple) {\r\n setValue([value[value.length - 1]], eventDetails)\r\n } else {\r\n setValue(value, eventDetails)\r\n }\r\n }\r\n\r\n return (\r\n <Combobox\r\n {...props}\r\n behavior=\"chip-outside\"\r\n multiple\r\n items={taggable ? combinedItems : items}\r\n isItemEqualToValue={(a, b) => a.value === b.value}\r\n onValueChange={handleValueChange}\r\n onInputValueChange={setInputValue}\r\n >\r\n <div className={cn(\"flex flex-col gap-2\", className)}>\r\n <ComboboxInputPrimitive\r\n render={\r\n <Input\r\n className={cn(\"h-9 text-body-regular-3 pl-9 pr-7\", triggerClassName)}\r\n endContent={\r\n <ComboboxTrigger\r\n nativeButton={false}\r\n render={(\r\n <XIcon\r\n className=\"!size-5 !right-1.5 data-[hidden=true]:opacity-0 opacity-100 transition-opacity duration-300 cursor-pointer\"\r\n data-hidden={!inputValue}\r\n data-slot=\"combobox-clear-input\"\r\n onClick={(event) => {\r\n setInputValue(\"\", {\r\n reason: \"none\",\r\n event: event.nativeEvent,\r\n cancel: () => { },\r\n allowPropagation: () => { },\r\n isCanceled: false,\r\n isPropagationAllowed: true,\r\n trigger: undefined,\r\n })\r\n }}\r\n />\r\n )}\r\n />\r\n }\r\n placeholder={inputPlaceholder}\r\n startContent={<SearchIcon className=\"!size-4 !text-fg-tertiary-hover\" />}\r\n wrapperClassName=\"w-full\"\r\n />\r\n }\r\n />\r\n <ComboboxChips\r\n className={cn(maxVisible !== undefined && \"flex-nowrap overflow-hidden\")}\r\n onMouseDown={(e) => e.preventBaseUIHandler()}\r\n >\r\n <ComboboxValue>\r\n {(value: Value[]) => {\r\n const visible = maxVisible !== undefined ? value.slice(0, maxVisible) : value\r\n const overflow = maxVisible !== undefined ? value.length - maxVisible : 0\r\n return (\r\n <>\r\n {visible?.map((item) => (\r\n <ComboboxChip\r\n key={item?.value || \"\"}\r\n className={cn(\r\n \"max-w-full min-w-0\",\r\n maxVisible !== undefined && \"shrink\"\r\n )}\r\n >\r\n <span className=\"truncate\" title={item?.label || \"\"}>\r\n {item?.label || \"\"}\r\n </span>\r\n <ComboboxChipRemove />\r\n </ComboboxChip>\r\n ))}\r\n {overflow > 0 && (\r\n <ComboboxChip className=\"shrink-0\">\r\n +{overflow}\r\n </ComboboxChip>\r\n )}\r\n </>\r\n )\r\n }}\r\n </ComboboxValue>\r\n </ComboboxChips>\r\n </div>\r\n <ComboboxPopup container={container} className={contentClassName}>\r\n <ComboboxStatus\r\n status={\r\n isPending || items === undefined\r\n ? \"pending\"\r\n : items?.length === 0 && !isCreatingItem\r\n ? \"empty\"\r\n : null\r\n }\r\n />\r\n <ComboboxList>\r\n {items?.map((item) => (\r\n <ComboboxItem\r\n key={item.value}\r\n value={{ label: item.label, value: item.value }}\r\n >\r\n <ComboboxItemTitle>\r\n {item.label}\r\n </ComboboxItemTitle>\r\n </ComboboxItem>\r\n ))}\r\n {isCreatingItem && (\r\n <ComboboxItem\r\n value={{ label: trimmedInput, value: trimmedInput, tag: true }}\r\n >\r\n <div className=\"flex items-center gap-1.5 w-full min-w-0\">\r\n {!isInputSelected && (\r\n <span className=\"text-text-secondary\">Create:</span>\r\n )}\r\n <span className=\"font-medium text-text-primary truncate\">\r\n {trimmedInput}\r\n </span>\r\n </div>\r\n </ComboboxItem>\r\n )}\r\n <ComboboxInfiniteScroll {...infiniteScroll} />\r\n </ComboboxList>\r\n </ComboboxPopup>\r\n </Combobox>\r\n )\r\n}\r\n\r\nexport { ComboboxChipOutside }"]}
1
+ {"version":3,"sources":["../src/composites/combobox-chip-outside.tsx"],"names":["ComboboxChipOutside","multiple","inputPlaceholder","container","items","infiniteScroll","isPending","taggable","maxVisible","className","triggerClassName","contentClassName","props","inputValue","setInputValue","useControlledState","value","setValue","createdItems","setCreatedItems","createdValuesRef","currentValues","v","prev","next","item","trimmedInput","isInputSelected","isCreatingItem","combinedItems","base","createItem","jsxs","Combobox","a","b","eventDetails","newTags","tag","cn","jsx","ComboboxInput","Input","ComboboxTrigger","XIcon","event","SearchIcon","ComboboxChips","ComboboxValue","visible","overflow","Fragment","ComboboxChip","ComboboxChipRemove","ComboboxPopup","ComboboxStatus","ComboboxList","ComboboxItem","ComboboxItemTitle","ComboboxInfiniteScroll"],"mappings":"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","file":"chunk-7PQPPJO2.js","sourcesContent":["import * as React from \"react\"\r\n\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { ComboboxInput as ComboboxInputPrimitive } from \"../primitives/combobox\"\r\nimport { Input } from \"../ui\"\r\nimport {\r\n Combobox,\r\n ComboboxChip,\r\n ComboboxChipRemove,\r\n ComboboxChips,\r\n ComboboxInfiniteScroll,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxPortal,\r\n ComboboxPopup,\r\n ComboboxStatus,\r\n ComboboxTrigger,\r\n ComboboxValue,\r\n type ComboboxProps,\r\n ComboboxItemTitle\r\n} from \"../ui/combobox\"\r\nimport { SearchIcon, XIcon } from \"lucide-react\"\r\nimport { useControlledState } from \"@xploreu/hooks/use-controlled-state\"\r\n\r\ntype ComboboxChipOutsideProps<Value> = Omit<ComboboxProps<Value, true>, \"multiple\"> & {\r\n multiple?: boolean\r\n inputPlaceholder?: string\r\n container?: React.ComponentProps<typeof ComboboxPortal>[\"container\"]\r\n items: ({ label: string; value: string }[]) | undefined\r\n infiniteScroll?: React.ComponentProps<typeof ComboboxInfiniteScroll>\r\n isPending?: boolean\r\n /**\r\n * When true, enables creatable / taggable mode.\r\n * If the typed value has no exact match in the current item list,\r\n * a \"Create \\\"…\\\"\" option is shown at the top of the dropdown.\r\n * Created items are appended to the value with `{ label, value, tag: true }`.\r\n */\r\n taggable?: boolean\r\n /**\r\n * Maximum number of chips to show before collapsing the rest into a \"+N\" chip.\r\n * When undefined, all chips are shown.\r\n */\r\n maxVisible?: number\r\n className?: string\r\n triggerClassName?: string\r\n contentClassName?: string\r\n}\r\n\r\nfunction ComboboxChipOutside<Value extends { label: string; value: string; tag?: true }>({\r\n multiple = true,\r\n inputPlaceholder = \"Search...\",\r\n container,\r\n items,\r\n infiniteScroll,\r\n isPending,\r\n taggable = false,\r\n maxVisible,\r\n className,\r\n triggerClassName,\r\n contentClassName,\r\n ...props\r\n}: ComboboxChipOutsideProps<Value>) {\r\n const [inputValue, setInputValue] = useControlledState({\r\n value: props?.inputValue?.toString(),\r\n defaultValue: props?.defaultInputValue?.toString(),\r\n onChange: props?.onInputValueChange,\r\n })\r\n\r\n const [value, setValue] = useControlledState({\r\n value: props?.value ?? [],\r\n defaultValue: props?.defaultValue ?? [],\r\n onChange: props?.onValueChange,\r\n })\r\n\r\n // Track items created via taggable mode\r\n // Sync with value to avoid stale tags when controlled value is reset from outside\r\n const [createdItems, setCreatedItems] = React.useState<Value[]>([])\r\n const createdValuesRef = React.useRef<Set<string>>(new Set())\r\n\r\n React.useEffect(() => {\r\n const currentValues = new Set(value.map((v) => v.value))\r\n setCreatedItems((prev) => {\r\n const next = prev.filter((item) => currentValues.has(item.value))\r\n if (next.length === prev.length) return prev\r\n createdValuesRef.current = new Set(next.map((v) => v.value))\r\n return next\r\n })\r\n }, [value])\r\n\r\n // Determine if the current input has no exact match in existing items\r\n const trimmedInput = inputValue?.toString().trim() ?? \"\"\r\n const isInputSelected = React.useMemo(() => {\r\n if (!trimmedInput) return false\r\n return value.some(\r\n (item) => item.value.toLowerCase() === trimmedInput.toLowerCase()\r\n )\r\n }, [trimmedInput, value])\r\n // true = show the taggable item in dropdown (either as \"Create:\" or as checked item)\r\n const isCreatingItem = React.useMemo(() => {\r\n if (!taggable || !trimmedInput) return false\r\n return !items?.some(\r\n (item) => item.label.toLowerCase() === trimmedInput.toLowerCase()\r\n )\r\n }, [taggable, trimmedInput, items])\r\n\r\n // Merge server items with locally created tags + the \"Create\" placeholder\r\n const combinedItems = React.useMemo(() => {\r\n const base: Value[] = [\r\n ...items ?? [],\r\n ...createdItems,\r\n ]\r\n\r\n if (isCreatingItem) {\r\n const createItem = {\r\n label: trimmedInput,\r\n value: trimmedInput,\r\n tag: true,\r\n }\r\n return [...base, createItem]\r\n }\r\n\r\n return base\r\n }, [items, createdItems, isCreatingItem, trimmedInput])\r\n\r\n const handleValueChange: ComboboxProps<Value, true>[\"onValueChange\"] = (value, eventDetails) => {\r\n // Capture newly created taggable items internally\r\n if (taggable) {\r\n const newTags = value.filter(\r\n (v) => v?.tag === true\r\n && !createdValuesRef.current.has(v.value)\r\n )\r\n if (newTags.length > 0) {\r\n for (const tag of newTags) {\r\n createdValuesRef.current.add(tag.value)\r\n }\r\n setCreatedItems((prev) => [...prev, ...newTags])\r\n }\r\n }\r\n\r\n // if multiple is false, we need to replace the value with the new value instead of adding to it\r\n if (!multiple) {\r\n setValue([value[value.length - 1]], eventDetails)\r\n } else {\r\n setValue(value, eventDetails)\r\n }\r\n }\r\n\r\n return (\r\n <Combobox\r\n {...props}\r\n behavior=\"chip-outside\"\r\n multiple\r\n items={taggable ? combinedItems : items}\r\n isItemEqualToValue={(a, b) => a.value === b.value}\r\n onValueChange={handleValueChange}\r\n onInputValueChange={setInputValue}\r\n >\r\n <div className={cn(\"flex flex-col gap-2\", className)}>\r\n <ComboboxInputPrimitive\r\n render={\r\n <Input\r\n className={cn(\"h-9 text-body-regular-3 pl-9 pr-7\", triggerClassName)}\r\n endContent={\r\n <ComboboxTrigger\r\n nativeButton={false}\r\n render={(\r\n <XIcon\r\n className=\"!size-5 !right-1.5 data-[hidden=true]:opacity-0 opacity-100 transition-opacity duration-300 cursor-pointer\"\r\n data-hidden={!inputValue}\r\n data-slot=\"combobox-clear-input\"\r\n onClick={(event) => {\r\n setInputValue(\"\", {\r\n reason: \"none\",\r\n event: event.nativeEvent,\r\n cancel: () => { },\r\n allowPropagation: () => { },\r\n isCanceled: false,\r\n isPropagationAllowed: true,\r\n trigger: undefined,\r\n })\r\n }}\r\n />\r\n )}\r\n />\r\n }\r\n placeholder={inputPlaceholder}\r\n startContent={<SearchIcon className=\"!size-4 !text-fg-tertiary-hover\" />}\r\n wrapperClassName=\"w-full\"\r\n />\r\n }\r\n />\r\n <ComboboxChips\r\n className={cn(maxVisible !== undefined && \"flex-nowrap overflow-hidden\")}\r\n onMouseDown={(e) => e.preventBaseUIHandler()}\r\n >\r\n <ComboboxValue>\r\n {(value: Value[]) => {\r\n const visible = maxVisible !== undefined ? value.slice(0, maxVisible) : value\r\n const overflow = maxVisible !== undefined ? value.length - maxVisible : 0\r\n return (\r\n <>\r\n {visible?.map((item) => (\r\n <ComboboxChip\r\n key={item?.value || \"\"}\r\n className={cn(\r\n \"max-w-full min-w-0\",\r\n maxVisible !== undefined && \"shrink\"\r\n )}\r\n >\r\n <span className=\"truncate\" title={item?.label || \"\"}>\r\n {item?.label || \"\"}\r\n </span>\r\n <ComboboxChipRemove />\r\n </ComboboxChip>\r\n ))}\r\n {overflow > 0 && (\r\n <ComboboxChip className=\"shrink-0\">\r\n +{overflow}\r\n </ComboboxChip>\r\n )}\r\n </>\r\n )\r\n }}\r\n </ComboboxValue>\r\n </ComboboxChips>\r\n </div>\r\n <ComboboxPopup container={container} className={contentClassName}>\r\n <ComboboxStatus\r\n status={\r\n isPending || items === undefined\r\n ? \"pending\"\r\n : items?.length === 0 && !isCreatingItem\r\n ? \"empty\"\r\n : null\r\n }\r\n />\r\n <ComboboxList>\r\n {items?.map((item) => (\r\n <ComboboxItem\r\n key={item.value}\r\n value={{ label: item.label, value: item.value }}\r\n >\r\n <ComboboxItemTitle>\r\n {item.label}\r\n </ComboboxItemTitle>\r\n </ComboboxItem>\r\n ))}\r\n {isCreatingItem && (\r\n <ComboboxItem\r\n value={{ label: trimmedInput, value: trimmedInput, tag: true }}\r\n >\r\n <div className=\"flex items-center gap-1.5 w-full min-w-0\">\r\n {!isInputSelected && (\r\n <span className=\"text-text-secondary\">Create:</span>\r\n )}\r\n <span className=\"font-medium text-text-primary truncate\">\r\n {trimmedInput}\r\n </span>\r\n </div>\r\n </ComboboxItem>\r\n )}\r\n <ComboboxInfiniteScroll {...infiniteScroll} />\r\n </ComboboxList>\r\n </ComboboxPopup>\r\n </Combobox>\r\n )\r\n}\r\n\r\nexport { ComboboxChipOutside }"]}
@@ -1,2 +1,2 @@
1
- import {a as a$1,b as b$1,m,e,q,s,w}from'./chunk-R4XVXVLJ.js';import {a}from'./chunk-Y6TKCAAJ.js';import*as t from'react';import*as g from'react-phone-number-input';import D from'react-phone-number-input/flags';import {cn}from'@xploreu/lib/cn';import'@base-ui/react/combobox';import {ChevronsUpDownIcon}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var P=t.createContext({size:"md"}),A={"3xs":"h-3 w-4.5","2xs":"h-3.5 w-5",xs:"h-3.5 w-5",sm:"h-4 w-6",md:"h-4 w-6",lg:"h-4 w-6",xl:"h-4.5 w-6.5"},W={"3xs":"size-3","2xs":"size-3",xs:"size-3.5",sm:"size-3.5",md:"size-3.5",lg:"size-4",xl:"size-4"},j={"3xs":"text-label-medium-4","2xs":"text-label-medium-4",xs:"text-body-medium-3",sm:"text-body-medium-3",md:"text-body-medium-3",lg:"text-body-medium-2",xl:"text-body-medium-2"},R=({country:s,countryName:o,className:r})=>{let l=s?D[s]:void 0;return jsx("span",{className:cn("flex h-4 w-6 shrink-0 overflow-hidden rounded-sm bg-fg-quaternary/20 [&_svg:not([class*='size-'])]:size-full",r),children:l&&jsx(l,{title:o})})},b=44,H=288,L=6;function J({disabled:s$1,value:o,options:r,onChange:l}){let{size:u="md"}=t.useContext(P),[C,c]=t.useState(false),[m$1,i]=t.useState(""),[N,z]=t.useState(0),v=t.useRef(null),h=t.useMemo(()=>r.filter(e=>!!e.value),[r]),p=t.useMemo(()=>{let e=m$1.trim().toLowerCase();return e?h.filter(a=>{let x=g.getCountryCallingCode(a.value);return a.label.toLowerCase().includes(e)||a.value.toLowerCase().includes(e)||x.includes(e.replace(/^\+/,""))}):h},[m$1,h]),_=t.useMemo(()=>h.find(e=>e.value===o)??null,[h,o]);t.useEffect(()=>{z(0),v.current&&(v.current.scrollTop=0);},[m$1]);let U=Math.min(p.length*b,H),I=t.useMemo(()=>{let e=Math.floor(N/b),a=Math.max(0,e-L),x=Math.ceil(H/b),w=Math.min(p.length,e+x+L);return {startIndex:a,endIndex:w,items:p.slice(a,w)}},[p,N]),q$1=I.startIndex*b,Y=Math.max(0,(p.length-I.endIndex)*b),B=t.useCallback(e=>{e?.value&&(l(e.value),i(""),c(false));},[l]);return jsxs(a$1,{behavior:"default",disabled:s$1,inputValue:m$1,items:p,open:C,value:_,virtualized:true,filter:null,isItemEqualToValue:(e,a)=>e.value===a.value,openOnInputClick:false,onValueChange:B,onInputValueChange:i,onOpenChange:e=>{c(e),e||i("");},children:[jsx(b$1,{render:jsxs("button",{type:"button",className:cn(a({size:u}),"w-auto shrink-0 justify-between gap-1.5 rounded-r-none border-r-0","hover:bg-bg-primary-hover focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand","disabled:pointer-events-none disabled:opacity-50"),disabled:s$1,children:[jsxs("span",{className:"flex items-center gap-1.5 overflow-hidden",children:[jsx(R,{country:o,countryName:o,className:A[u??"md"]}),o&&jsx("span",{className:cn("text-text-primary",j[u??"md"]??"text-body-medium-3"),children:o})]}),jsx(ChevronsUpDownIcon,{className:cn("shrink-0 text-fg-quaternary",W[u??"md"]??"size-3.5")})]})}),jsxs(m,{className:"w-72",children:[jsx(e,{placeholder:"Search country...","aria-label":"Search country"}),jsx(q,{status:p.length===0?"empty":null}),jsx(s,{ref:v,className:"relative gap-0",style:{height:U},onScroll:e=>z(e.currentTarget.scrollTop),children:jsx("div",{className:"flex w-full shrink-0 flex-col",style:{paddingTop:q$1,paddingBottom:Y},children:I.items.map((e,a)=>{let x=I.startIndex+a;return jsx(w,{index:x,value:e,children:jsxs("div",{className:"flex items-center gap-2 w-full min-w-0",children:[jsx(R,{country:e.value,countryName:e.label}),jsx("span",{className:"flex-1 text-sm truncate",children:e.label}),jsxs("span",{className:"text-sm text-text-tertiary shrink-0",children:["+",g.getCountryCallingCode(e.value)]})]})},e.value)})})})]})]})}var F=t.forwardRef(({className:s,onChange:o,size:r,...l},u)=>{let C=t.useContext(P),c=r??C.size??"md",m=t.useCallback(i=>{i.currentTarget.value==="+"&&(i.currentTarget.value=""),o?.(i);},[o]);return jsx("input",{className:cn(a({size:c}),"flex-1 rounded-l-none focus-visible:z-10",s),ref:u,type:"tel",onChange:m,...l})});F.displayName="InputComponent";var K=t.forwardRef(({className:s,onChange:o,value:r,size:l="md",...u},C)=>jsx(P.Provider,{value:{size:l},children:jsx(g.default,{ref:C,className:cn("flex w-full min-w-0 items-center",s),flagComponent:R,countrySelectComponent:J,inputComponent:F,smartCaret:false,value:r||void 0,onChange:c=>o?.(c||""),...u})}));K.displayName="PhoneInput";export{K as a};//# sourceMappingURL=chunk-DTWCRGRP.js.map
2
- //# sourceMappingURL=chunk-DTWCRGRP.js.map
1
+ import {a as a$1,b as b$1,m,e,q,s,w}from'./chunk-ILE3MBTR.js';import {a}from'./chunk-Y6TKCAAJ.js';import*as t from'react';import*as g from'react-phone-number-input';import D from'react-phone-number-input/flags';import {cn}from'@xploreu/lib/cn';import'@base-ui/react/combobox';import {ChevronsUpDownIcon}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var P=t.createContext({size:"md"}),A={"3xs":"h-3 w-4.5","2xs":"h-3.5 w-5",xs:"h-3.5 w-5",sm:"h-4 w-6",md:"h-4 w-6",lg:"h-4 w-6",xl:"h-4.5 w-6.5"},W={"3xs":"size-3","2xs":"size-3",xs:"size-3.5",sm:"size-3.5",md:"size-3.5",lg:"size-4",xl:"size-4"},j={"3xs":"text-label-medium-4","2xs":"text-label-medium-4",xs:"text-body-medium-3",sm:"text-body-medium-3",md:"text-body-medium-3",lg:"text-body-medium-2",xl:"text-body-medium-2"},R=({country:s,countryName:o,className:r})=>{let l=s?D[s]:void 0;return jsx("span",{className:cn("flex h-4 w-6 shrink-0 overflow-hidden rounded-sm bg-fg-quaternary/20 [&_svg:not([class*='size-'])]:size-full",r),children:l&&jsx(l,{title:o})})},b=44,H=288,L=6;function J({disabled:s$1,value:o,options:r,onChange:l}){let{size:u="md"}=t.useContext(P),[C,c]=t.useState(false),[m$1,i]=t.useState(""),[N,z]=t.useState(0),v=t.useRef(null),h=t.useMemo(()=>r.filter(e=>!!e.value),[r]),p=t.useMemo(()=>{let e=m$1.trim().toLowerCase();return e?h.filter(a=>{let x=g.getCountryCallingCode(a.value);return a.label.toLowerCase().includes(e)||a.value.toLowerCase().includes(e)||x.includes(e.replace(/^\+/,""))}):h},[m$1,h]),_=t.useMemo(()=>h.find(e=>e.value===o)??null,[h,o]);t.useEffect(()=>{z(0),v.current&&(v.current.scrollTop=0);},[m$1]);let U=Math.min(p.length*b,H),I=t.useMemo(()=>{let e=Math.floor(N/b),a=Math.max(0,e-L),x=Math.ceil(H/b),w=Math.min(p.length,e+x+L);return {startIndex:a,endIndex:w,items:p.slice(a,w)}},[p,N]),q$1=I.startIndex*b,Y=Math.max(0,(p.length-I.endIndex)*b),B=t.useCallback(e=>{e?.value&&(l(e.value),i(""),c(false));},[l]);return jsxs(a$1,{behavior:"default",disabled:s$1,inputValue:m$1,items:p,open:C,value:_,virtualized:true,filter:null,isItemEqualToValue:(e,a)=>e.value===a.value,openOnInputClick:false,onValueChange:B,onInputValueChange:i,onOpenChange:e=>{c(e),e||i("");},children:[jsx(b$1,{render:jsxs("button",{type:"button",className:cn(a({size:u}),"w-auto shrink-0 justify-between gap-1.5 rounded-r-none border-r-0","hover:bg-bg-primary-hover focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand","disabled:pointer-events-none disabled:opacity-50"),disabled:s$1,children:[jsxs("span",{className:"flex items-center gap-1.5 overflow-hidden",children:[jsx(R,{country:o,countryName:o,className:A[u??"md"]}),o&&jsx("span",{className:cn("text-text-primary",j[u??"md"]??"text-body-medium-3"),children:o})]}),jsx(ChevronsUpDownIcon,{className:cn("shrink-0 text-fg-quaternary",W[u??"md"]??"size-3.5")})]})}),jsxs(m,{className:"w-72",children:[jsx(e,{placeholder:"Search country...","aria-label":"Search country"}),jsx(q,{status:p.length===0?"empty":null}),jsx(s,{ref:v,className:"relative gap-0",style:{height:U},onScroll:e=>z(e.currentTarget.scrollTop),children:jsx("div",{className:"flex w-full shrink-0 flex-col",style:{paddingTop:q$1,paddingBottom:Y},children:I.items.map((e,a)=>{let x=I.startIndex+a;return jsx(w,{index:x,value:e,children:jsxs("div",{className:"flex items-center gap-2 w-full min-w-0",children:[jsx(R,{country:e.value,countryName:e.label}),jsx("span",{className:"flex-1 text-sm truncate",children:e.label}),jsxs("span",{className:"text-sm text-text-tertiary shrink-0",children:["+",g.getCountryCallingCode(e.value)]})]})},e.value)})})})]})]})}var F=t.forwardRef(({className:s,onChange:o,size:r,...l},u)=>{let C=t.useContext(P),c=r??C.size??"md",m=t.useCallback(i=>{i.currentTarget.value==="+"&&(i.currentTarget.value=""),o?.(i);},[o]);return jsx("input",{className:cn(a({size:c}),"flex-1 rounded-l-none focus-visible:z-10",s),ref:u,type:"tel",onChange:m,...l})});F.displayName="InputComponent";var K=t.forwardRef(({className:s,onChange:o,value:r,size:l="md",...u},C)=>jsx(P.Provider,{value:{size:l},children:jsx(g.default,{ref:C,className:cn("flex w-full min-w-0 items-center",s),flagComponent:R,countrySelectComponent:J,inputComponent:F,smartCaret:false,value:r||void 0,onChange:c=>o?.(c||""),...u})}));K.displayName="PhoneInput";export{K as a};//# sourceMappingURL=chunk-BNMOOOFY.js.map
2
+ //# sourceMappingURL=chunk-BNMOOOFY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/composites/phone-input.tsx"],"names":["PhoneInputContext","phoneInputFlagSizes","phoneInputChevronSizes","phoneInputCountryCodeSizes","FlagComponent","country","countryName","className","Flag","flags","jsx","cn","COUNTRY_ROW_HEIGHT","COUNTRY_LIST_HEIGHT","COUNTRY_OVERSCAN","CountrySelect","disabled","selectedCountry","countryList","onChange","size","open","setOpen","inputValue","setInputValue","scrollTop","setScrollTop","listRef","items","item","filteredItems","search","callingCode","value","listHeight","virtualRange","visibleStartIndex","startIndex","visibleCount","endIndex","paddingTop","paddingBottom","handleValueChange","jsxs","Combobox","a","b","ComboboxTrigger","inputVariants","ChevronsUpDownIcon","ComboboxPopup","ComboboxInput","ComboboxStatus","ComboboxList","event","virtualIndex","index","ComboboxItem","InputComponent","sizeProp","props","ref","context","handleChange","PhoneInput"],"mappings":"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","file":"chunk-DTWCRGRP.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as RPNInput from \"react-phone-number-input\"\r\nimport flags from \"react-phone-number-input/flags\"\r\n\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react/combobox\"\r\nimport {\r\n Combobox,\r\n ComboboxInput,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxPopup,\r\n ComboboxStatus,\r\n ComboboxTrigger,\r\n} from \"../ui/combobox\"\r\nimport { inputVariants } from \"../ui/input\"\r\nimport { ChevronsUpDownIcon } from \"lucide-react\"\r\nimport type { VariantProps } from \"class-variance-authority\"\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types & Context\r\n// ---------------------------------------------------------------------------\r\n\r\ntype PhoneInputSize = VariantProps<typeof inputVariants>[\"size\"]\r\n\r\nconst PhoneInputContext = React.createContext<{ size?: PhoneInputSize }>({\r\n size: \"md\",\r\n})\r\n\r\ntype PhoneInputProps = Omit<\r\n React.ComponentProps<\"input\">,\r\n \"onChange\" | \"value\" | \"ref\" | \"size\"\r\n> &\r\n Omit<RPNInput.Props<typeof RPNInput.default>, \"onChange\" | \"size\"> & {\r\n onChange?: (value: RPNInput.Value) => void\r\n size?: PhoneInputSize\r\n }\r\n\r\nconst phoneInputFlagSizes: Record<string, string> = {\r\n \"3xs\": \"h-3 w-4.5\",\r\n \"2xs\": \"h-3.5 w-5\",\r\n xs: \"h-3.5 w-5\",\r\n sm: \"h-4 w-6\",\r\n md: \"h-4 w-6\",\r\n lg: \"h-4 w-6\",\r\n xl: \"h-4.5 w-6.5\",\r\n}\r\n\r\nconst phoneInputChevronSizes: Record<string, string> = {\r\n \"3xs\": \"size-3\",\r\n \"2xs\": \"size-3\",\r\n xs: \"size-3.5\",\r\n sm: \"size-3.5\",\r\n md: \"size-3.5\",\r\n lg: \"size-4\",\r\n xl: \"size-4\",\r\n}\r\n\r\nconst phoneInputCountryCodeSizes: Record<string, string> = {\r\n \"3xs\": \"text-label-medium-4\",\r\n \"2xs\": \"text-label-medium-4\",\r\n xs: \"text-body-medium-3\",\r\n sm: \"text-body-medium-3\",\r\n md: \"text-body-medium-3\",\r\n lg: \"text-body-medium-2\",\r\n xl: \"text-body-medium-2\",\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Flag\r\n// ---------------------------------------------------------------------------\r\n\r\ntype FlagComponentProps = RPNInput.FlagProps & {\r\n className?: string\r\n}\r\n\r\nconst FlagComponent = ({ country, countryName, className }: FlagComponentProps) => {\r\n const Flag = country ? flags[country] : undefined\r\n\r\n return (\r\n <span\r\n className={cn(\r\n \"flex h-4 w-6 shrink-0 overflow-hidden rounded-sm bg-fg-quaternary/20 [&_svg:not([class*='size-'])]:size-full\",\r\n className\r\n )}\r\n >\r\n {Flag && <Flag title={countryName} />}\r\n </span>\r\n )\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Country Select — uses base-ui Combobox\r\n// ---------------------------------------------------------------------------\r\n\r\ntype CountryEntry = { label: string; value: RPNInput.Country | undefined }\r\ntype CountryItem = { label: string; value: RPNInput.Country }\r\n\r\nconst COUNTRY_ROW_HEIGHT = 44\r\nconst COUNTRY_LIST_HEIGHT = 288\r\nconst COUNTRY_OVERSCAN = 6\r\n\r\ntype CountrySelectProps = {\r\n disabled?: boolean\r\n value: RPNInput.Country\r\n options: CountryEntry[]\r\n onChange: (country: RPNInput.Country) => void\r\n}\r\n\r\nfunction CountrySelect({\r\n disabled,\r\n value: selectedCountry,\r\n options: countryList,\r\n onChange,\r\n}: CountrySelectProps) {\r\n const { size = \"md\" } = React.useContext(PhoneInputContext)\r\n const [open, setOpen] = React.useState(false)\r\n const [inputValue, setInputValue] = React.useState(\"\")\r\n const [scrollTop, setScrollTop] = React.useState(0)\r\n const listRef = React.useRef<HTMLDivElement>(null)\r\n\r\n const items = React.useMemo(\r\n () => countryList.filter((item): item is CountryItem => Boolean(item.value)),\r\n [countryList]\r\n )\r\n\r\n const filteredItems = React.useMemo(() => {\r\n const search = inputValue.trim().toLowerCase()\r\n\r\n if (!search) return items\r\n\r\n return items.filter((item) => {\r\n const callingCode = RPNInput.getCountryCallingCode(item.value)\r\n\r\n return item.label.toLowerCase().includes(search)\r\n || item.value.toLowerCase().includes(search)\r\n || callingCode.includes(search.replace(/^\\+/, \"\"))\r\n })\r\n }, [inputValue, items])\r\n\r\n const value = React.useMemo(\r\n () => items.find((item) => item.value === selectedCountry) ?? null,\r\n [items, selectedCountry]\r\n )\r\n\r\n React.useEffect(() => {\r\n setScrollTop(0)\r\n if (listRef.current) listRef.current.scrollTop = 0\r\n }, [inputValue])\r\n\r\n const listHeight = Math.min(\r\n filteredItems.length * COUNTRY_ROW_HEIGHT,\r\n COUNTRY_LIST_HEIGHT\r\n )\r\n\r\n const virtualRange = React.useMemo(() => {\r\n const visibleStartIndex = Math.floor(scrollTop / COUNTRY_ROW_HEIGHT)\r\n const startIndex = Math.max(\r\n 0,\r\n visibleStartIndex - COUNTRY_OVERSCAN\r\n )\r\n const visibleCount = Math.ceil(COUNTRY_LIST_HEIGHT / COUNTRY_ROW_HEIGHT)\r\n const endIndex = Math.min(\r\n filteredItems.length,\r\n visibleStartIndex + visibleCount + COUNTRY_OVERSCAN\r\n )\r\n\r\n return {\r\n startIndex,\r\n endIndex,\r\n items: filteredItems.slice(startIndex, endIndex),\r\n }\r\n }, [filteredItems, scrollTop])\r\n\r\n const paddingTop = virtualRange.startIndex * COUNTRY_ROW_HEIGHT\r\n const paddingBottom = Math.max(\r\n 0,\r\n (filteredItems.length - virtualRange.endIndex) * COUNTRY_ROW_HEIGHT\r\n )\r\n\r\n const handleValueChange = React.useCallback(\r\n (item: CountryItem | null) => {\r\n if (!item?.value) return\r\n\r\n onChange(item.value)\r\n setInputValue(\"\")\r\n setOpen(false)\r\n },\r\n [onChange]\r\n )\r\n\r\n return (\r\n <Combobox\r\n behavior=\"default\"\r\n disabled={disabled}\r\n inputValue={inputValue}\r\n items={filteredItems}\r\n open={open}\r\n value={value}\r\n virtualized\r\n filter={null}\r\n isItemEqualToValue={(a, b) => a.value === b.value}\r\n openOnInputClick={false}\r\n onValueChange={handleValueChange}\r\n onInputValueChange={setInputValue}\r\n onOpenChange={(open) => {\r\n setOpen(open)\r\n if (!open) setInputValue(\"\")\r\n }}\r\n >\r\n {/* Visible trigger button styled as part of the input */}\r\n <ComboboxTrigger\r\n render={\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n inputVariants({ size }),\r\n \"w-auto shrink-0 justify-between gap-1.5 rounded-r-none border-r-0\",\r\n \"hover:bg-bg-primary-hover focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\r\n \"disabled:pointer-events-none disabled:opacity-50\"\r\n )}\r\n disabled={disabled}\r\n >\r\n <span className=\"flex items-center gap-1.5 overflow-hidden\">\r\n <FlagComponent\r\n country={selectedCountry}\r\n countryName={selectedCountry}\r\n className={phoneInputFlagSizes[size ?? \"md\"]}\r\n />\r\n {selectedCountry && (\r\n <span\r\n className={cn(\r\n \"text-text-primary\",\r\n phoneInputCountryCodeSizes[size ?? \"md\"] ?? \"text-body-medium-3\"\r\n )}\r\n >\r\n {selectedCountry}\r\n </span>\r\n )}\r\n </span>\r\n <ChevronsUpDownIcon\r\n className={cn(\r\n \"shrink-0 text-fg-quaternary\",\r\n phoneInputChevronSizes[size ?? \"md\"] ?? \"size-3.5\"\r\n )}\r\n />\r\n </button>\r\n }\r\n />\r\n\r\n {/* Dropdown content */}\r\n <ComboboxPopup className=\"w-72\">\r\n <ComboboxInput\r\n placeholder=\"Search country...\"\r\n aria-label=\"Search country\"\r\n />\r\n <ComboboxStatus status={filteredItems.length === 0 ? \"empty\" : null} />\r\n <ComboboxList\r\n ref={listRef}\r\n className=\"relative gap-0\"\r\n style={{ height: listHeight }}\r\n onScroll={(event) => setScrollTop(event.currentTarget.scrollTop)}\r\n >\r\n <div\r\n className=\"flex w-full shrink-0 flex-col\"\r\n style={{ paddingTop, paddingBottom }}\r\n >\r\n {virtualRange.items.map((item, virtualIndex) => {\r\n const index = virtualRange.startIndex + virtualIndex\r\n\r\n return (\r\n <ComboboxItem\r\n key={item.value}\r\n index={index}\r\n value={item}\r\n >\r\n <div className=\"flex items-center gap-2 w-full min-w-0\">\r\n <FlagComponent country={item.value} countryName={item.label} />\r\n <span className=\"flex-1 text-sm truncate\">{item.label}</span>\r\n <span className=\"text-sm text-text-tertiary shrink-0\">\r\n +{RPNInput.getCountryCallingCode(item.value)}\r\n </span>\r\n </div>\r\n </ComboboxItem>\r\n )\r\n })}\r\n </div>\r\n </ComboboxList>\r\n </ComboboxPopup>\r\n </Combobox >\r\n )\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Input Component\r\n// ---------------------------------------------------------------------------\r\n\r\nconst InputComponent = React.forwardRef<\r\n HTMLInputElement,\r\n React.ComponentProps<\"input\"> & { size?: PhoneInputSize }\r\n>(({ className, onChange, size: sizeProp, ...props }, ref) => {\r\n const context = React.useContext(PhoneInputContext)\r\n const size = sizeProp ?? context.size ?? \"md\"\r\n\r\n const handleChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.currentTarget.value === \"+\") {\r\n event.currentTarget.value = \"\"\r\n }\r\n\r\n onChange?.(event)\r\n },\r\n [onChange]\r\n )\r\n\r\n return (\r\n <input\r\n className={cn(\r\n inputVariants({ size }),\r\n \"flex-1 rounded-l-none focus-visible:z-10\",\r\n className\r\n )}\r\n ref={ref}\r\n type=\"tel\"\r\n onChange={handleChange}\r\n {...props}\r\n />\r\n )\r\n})\r\nInputComponent.displayName = \"InputComponent\"\r\n\r\n// ---------------------------------------------------------------------------\r\n// Phone Input\r\n// ---------------------------------------------------------------------------\r\n\r\nconst PhoneInput: React.ForwardRefExoticComponent<PhoneInputProps> =\r\n React.forwardRef<\r\n React.ElementRef<typeof RPNInput.default>,\r\n PhoneInputProps\r\n >(({\r\n className,\r\n onChange,\r\n value,\r\n size = \"md\",\r\n ...props\r\n }, ref) => {\r\n return (\r\n <PhoneInputContext.Provider value={{ size }}>\r\n <RPNInput.default\r\n ref={ref}\r\n className={cn(\r\n \"flex w-full min-w-0 items-center\",\r\n className\r\n )}\r\n flagComponent={FlagComponent}\r\n countrySelectComponent={CountrySelect}\r\n inputComponent={InputComponent}\r\n smartCaret={false}\r\n value={value || undefined}\r\n onChange={(value) => onChange?.(value || (\"\" as RPNInput.Value))}\r\n {...props}\r\n />\r\n </PhoneInputContext.Provider>\r\n )\r\n })\r\nPhoneInput.displayName = \"PhoneInput\"\r\n\r\nexport { PhoneInput, type PhoneInputProps }\r\n"]}
1
+ {"version":3,"sources":["../src/composites/phone-input.tsx"],"names":["PhoneInputContext","phoneInputFlagSizes","phoneInputChevronSizes","phoneInputCountryCodeSizes","FlagComponent","country","countryName","className","Flag","flags","jsx","cn","COUNTRY_ROW_HEIGHT","COUNTRY_LIST_HEIGHT","COUNTRY_OVERSCAN","CountrySelect","disabled","selectedCountry","countryList","onChange","size","open","setOpen","inputValue","setInputValue","scrollTop","setScrollTop","listRef","items","item","filteredItems","search","callingCode","value","listHeight","virtualRange","visibleStartIndex","startIndex","visibleCount","endIndex","paddingTop","paddingBottom","handleValueChange","jsxs","Combobox","a","b","ComboboxTrigger","inputVariants","ChevronsUpDownIcon","ComboboxPopup","ComboboxInput","ComboboxStatus","ComboboxList","event","virtualIndex","index","ComboboxItem","InputComponent","sizeProp","props","ref","context","handleChange","PhoneInput"],"mappings":"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","file":"chunk-BNMOOOFY.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as RPNInput from \"react-phone-number-input\"\r\nimport flags from \"react-phone-number-input/flags\"\r\n\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react/combobox\"\r\nimport {\r\n Combobox,\r\n ComboboxInput,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxPopup,\r\n ComboboxStatus,\r\n ComboboxTrigger,\r\n} from \"../ui/combobox\"\r\nimport { inputVariants } from \"../ui/input\"\r\nimport { ChevronsUpDownIcon } from \"lucide-react\"\r\nimport type { VariantProps } from \"class-variance-authority\"\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types & Context\r\n// ---------------------------------------------------------------------------\r\n\r\ntype PhoneInputSize = VariantProps<typeof inputVariants>[\"size\"]\r\n\r\nconst PhoneInputContext = React.createContext<{ size?: PhoneInputSize }>({\r\n size: \"md\",\r\n})\r\n\r\ntype PhoneInputProps = Omit<\r\n React.ComponentProps<\"input\">,\r\n \"onChange\" | \"value\" | \"ref\" | \"size\"\r\n> &\r\n Omit<RPNInput.Props<typeof RPNInput.default>, \"onChange\" | \"size\"> & {\r\n onChange?: (value: RPNInput.Value) => void\r\n size?: PhoneInputSize\r\n }\r\n\r\nconst phoneInputFlagSizes: Record<string, string> = {\r\n \"3xs\": \"h-3 w-4.5\",\r\n \"2xs\": \"h-3.5 w-5\",\r\n xs: \"h-3.5 w-5\",\r\n sm: \"h-4 w-6\",\r\n md: \"h-4 w-6\",\r\n lg: \"h-4 w-6\",\r\n xl: \"h-4.5 w-6.5\",\r\n}\r\n\r\nconst phoneInputChevronSizes: Record<string, string> = {\r\n \"3xs\": \"size-3\",\r\n \"2xs\": \"size-3\",\r\n xs: \"size-3.5\",\r\n sm: \"size-3.5\",\r\n md: \"size-3.5\",\r\n lg: \"size-4\",\r\n xl: \"size-4\",\r\n}\r\n\r\nconst phoneInputCountryCodeSizes: Record<string, string> = {\r\n \"3xs\": \"text-label-medium-4\",\r\n \"2xs\": \"text-label-medium-4\",\r\n xs: \"text-body-medium-3\",\r\n sm: \"text-body-medium-3\",\r\n md: \"text-body-medium-3\",\r\n lg: \"text-body-medium-2\",\r\n xl: \"text-body-medium-2\",\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Flag\r\n// ---------------------------------------------------------------------------\r\n\r\ntype FlagComponentProps = RPNInput.FlagProps & {\r\n className?: string\r\n}\r\n\r\nconst FlagComponent = ({ country, countryName, className }: FlagComponentProps) => {\r\n const Flag = country ? flags[country] : undefined\r\n\r\n return (\r\n <span\r\n className={cn(\r\n \"flex h-4 w-6 shrink-0 overflow-hidden rounded-sm bg-fg-quaternary/20 [&_svg:not([class*='size-'])]:size-full\",\r\n className\r\n )}\r\n >\r\n {Flag && <Flag title={countryName} />}\r\n </span>\r\n )\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Country Select — uses base-ui Combobox\r\n// ---------------------------------------------------------------------------\r\n\r\ntype CountryEntry = { label: string; value: RPNInput.Country | undefined }\r\ntype CountryItem = { label: string; value: RPNInput.Country }\r\n\r\nconst COUNTRY_ROW_HEIGHT = 44\r\nconst COUNTRY_LIST_HEIGHT = 288\r\nconst COUNTRY_OVERSCAN = 6\r\n\r\ntype CountrySelectProps = {\r\n disabled?: boolean\r\n value: RPNInput.Country\r\n options: CountryEntry[]\r\n onChange: (country: RPNInput.Country) => void\r\n}\r\n\r\nfunction CountrySelect({\r\n disabled,\r\n value: selectedCountry,\r\n options: countryList,\r\n onChange,\r\n}: CountrySelectProps) {\r\n const { size = \"md\" } = React.useContext(PhoneInputContext)\r\n const [open, setOpen] = React.useState(false)\r\n const [inputValue, setInputValue] = React.useState(\"\")\r\n const [scrollTop, setScrollTop] = React.useState(0)\r\n const listRef = React.useRef<HTMLDivElement>(null)\r\n\r\n const items = React.useMemo(\r\n () => countryList.filter((item): item is CountryItem => Boolean(item.value)),\r\n [countryList]\r\n )\r\n\r\n const filteredItems = React.useMemo(() => {\r\n const search = inputValue.trim().toLowerCase()\r\n\r\n if (!search) return items\r\n\r\n return items.filter((item) => {\r\n const callingCode = RPNInput.getCountryCallingCode(item.value)\r\n\r\n return item.label.toLowerCase().includes(search)\r\n || item.value.toLowerCase().includes(search)\r\n || callingCode.includes(search.replace(/^\\+/, \"\"))\r\n })\r\n }, [inputValue, items])\r\n\r\n const value = React.useMemo(\r\n () => items.find((item) => item.value === selectedCountry) ?? null,\r\n [items, selectedCountry]\r\n )\r\n\r\n React.useEffect(() => {\r\n setScrollTop(0)\r\n if (listRef.current) listRef.current.scrollTop = 0\r\n }, [inputValue])\r\n\r\n const listHeight = Math.min(\r\n filteredItems.length * COUNTRY_ROW_HEIGHT,\r\n COUNTRY_LIST_HEIGHT\r\n )\r\n\r\n const virtualRange = React.useMemo(() => {\r\n const visibleStartIndex = Math.floor(scrollTop / COUNTRY_ROW_HEIGHT)\r\n const startIndex = Math.max(\r\n 0,\r\n visibleStartIndex - COUNTRY_OVERSCAN\r\n )\r\n const visibleCount = Math.ceil(COUNTRY_LIST_HEIGHT / COUNTRY_ROW_HEIGHT)\r\n const endIndex = Math.min(\r\n filteredItems.length,\r\n visibleStartIndex + visibleCount + COUNTRY_OVERSCAN\r\n )\r\n\r\n return {\r\n startIndex,\r\n endIndex,\r\n items: filteredItems.slice(startIndex, endIndex),\r\n }\r\n }, [filteredItems, scrollTop])\r\n\r\n const paddingTop = virtualRange.startIndex * COUNTRY_ROW_HEIGHT\r\n const paddingBottom = Math.max(\r\n 0,\r\n (filteredItems.length - virtualRange.endIndex) * COUNTRY_ROW_HEIGHT\r\n )\r\n\r\n const handleValueChange = React.useCallback(\r\n (item: CountryItem | null) => {\r\n if (!item?.value) return\r\n\r\n onChange(item.value)\r\n setInputValue(\"\")\r\n setOpen(false)\r\n },\r\n [onChange]\r\n )\r\n\r\n return (\r\n <Combobox\r\n behavior=\"default\"\r\n disabled={disabled}\r\n inputValue={inputValue}\r\n items={filteredItems}\r\n open={open}\r\n value={value}\r\n virtualized\r\n filter={null}\r\n isItemEqualToValue={(a, b) => a.value === b.value}\r\n openOnInputClick={false}\r\n onValueChange={handleValueChange}\r\n onInputValueChange={setInputValue}\r\n onOpenChange={(open) => {\r\n setOpen(open)\r\n if (!open) setInputValue(\"\")\r\n }}\r\n >\r\n {/* Visible trigger button styled as part of the input */}\r\n <ComboboxTrigger\r\n render={\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n inputVariants({ size }),\r\n \"w-auto shrink-0 justify-between gap-1.5 rounded-r-none border-r-0\",\r\n \"hover:bg-bg-primary-hover focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\r\n \"disabled:pointer-events-none disabled:opacity-50\"\r\n )}\r\n disabled={disabled}\r\n >\r\n <span className=\"flex items-center gap-1.5 overflow-hidden\">\r\n <FlagComponent\r\n country={selectedCountry}\r\n countryName={selectedCountry}\r\n className={phoneInputFlagSizes[size ?? \"md\"]}\r\n />\r\n {selectedCountry && (\r\n <span\r\n className={cn(\r\n \"text-text-primary\",\r\n phoneInputCountryCodeSizes[size ?? \"md\"] ?? \"text-body-medium-3\"\r\n )}\r\n >\r\n {selectedCountry}\r\n </span>\r\n )}\r\n </span>\r\n <ChevronsUpDownIcon\r\n className={cn(\r\n \"shrink-0 text-fg-quaternary\",\r\n phoneInputChevronSizes[size ?? \"md\"] ?? \"size-3.5\"\r\n )}\r\n />\r\n </button>\r\n }\r\n />\r\n\r\n {/* Dropdown content */}\r\n <ComboboxPopup className=\"w-72\">\r\n <ComboboxInput\r\n placeholder=\"Search country...\"\r\n aria-label=\"Search country\"\r\n />\r\n <ComboboxStatus status={filteredItems.length === 0 ? \"empty\" : null} />\r\n <ComboboxList\r\n ref={listRef}\r\n className=\"relative gap-0\"\r\n style={{ height: listHeight }}\r\n onScroll={(event) => setScrollTop(event.currentTarget.scrollTop)}\r\n >\r\n <div\r\n className=\"flex w-full shrink-0 flex-col\"\r\n style={{ paddingTop, paddingBottom }}\r\n >\r\n {virtualRange.items.map((item, virtualIndex) => {\r\n const index = virtualRange.startIndex + virtualIndex\r\n\r\n return (\r\n <ComboboxItem\r\n key={item.value}\r\n index={index}\r\n value={item}\r\n >\r\n <div className=\"flex items-center gap-2 w-full min-w-0\">\r\n <FlagComponent country={item.value} countryName={item.label} />\r\n <span className=\"flex-1 text-sm truncate\">{item.label}</span>\r\n <span className=\"text-sm text-text-tertiary shrink-0\">\r\n +{RPNInput.getCountryCallingCode(item.value)}\r\n </span>\r\n </div>\r\n </ComboboxItem>\r\n )\r\n })}\r\n </div>\r\n </ComboboxList>\r\n </ComboboxPopup>\r\n </Combobox >\r\n )\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Input Component\r\n// ---------------------------------------------------------------------------\r\n\r\nconst InputComponent = React.forwardRef<\r\n HTMLInputElement,\r\n React.ComponentProps<\"input\"> & { size?: PhoneInputSize }\r\n>(({ className, onChange, size: sizeProp, ...props }, ref) => {\r\n const context = React.useContext(PhoneInputContext)\r\n const size = sizeProp ?? context.size ?? \"md\"\r\n\r\n const handleChange = React.useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (event.currentTarget.value === \"+\") {\r\n event.currentTarget.value = \"\"\r\n }\r\n\r\n onChange?.(event)\r\n },\r\n [onChange]\r\n )\r\n\r\n return (\r\n <input\r\n className={cn(\r\n inputVariants({ size }),\r\n \"flex-1 rounded-l-none focus-visible:z-10\",\r\n className\r\n )}\r\n ref={ref}\r\n type=\"tel\"\r\n onChange={handleChange}\r\n {...props}\r\n />\r\n )\r\n})\r\nInputComponent.displayName = \"InputComponent\"\r\n\r\n// ---------------------------------------------------------------------------\r\n// Phone Input\r\n// ---------------------------------------------------------------------------\r\n\r\nconst PhoneInput: React.ForwardRefExoticComponent<PhoneInputProps> =\r\n React.forwardRef<\r\n React.ElementRef<typeof RPNInput.default>,\r\n PhoneInputProps\r\n >(({\r\n className,\r\n onChange,\r\n value,\r\n size = \"md\",\r\n ...props\r\n }, ref) => {\r\n return (\r\n <PhoneInputContext.Provider value={{ size }}>\r\n <RPNInput.default\r\n ref={ref}\r\n className={cn(\r\n \"flex w-full min-w-0 items-center\",\r\n className\r\n )}\r\n flagComponent={FlagComponent}\r\n countrySelectComponent={CountrySelect}\r\n inputComponent={InputComponent}\r\n smartCaret={false}\r\n value={value || undefined}\r\n onChange={(value) => onChange?.(value || (\"\" as RPNInput.Value))}\r\n {...props}\r\n />\r\n </PhoneInputContext.Provider>\r\n )\r\n })\r\nPhoneInput.displayName = \"PhoneInput\"\r\n\r\nexport { PhoneInput, type PhoneInputProps }\r\n"]}
@@ -0,0 +1,3 @@
1
+ import {a,b as b$1}from'./chunk-FTET6SSC.js';import {b as b$2}from'./chunk-OLQXHFH4.js';import*as i from'react';import {cva}from'class-variance-authority';import {useEditor,EditorContent}from'@tiptap/react';import H from'@tiptap/starter-kit';import F from'@tiptap/extension-underline';import $ from'@tiptap/extension-link';import j from'@tiptap/extension-text-align';import K from'@tiptap/extension-placeholder';import q from'@tiptap/extension-character-count';import {BoldIcon,ItalicIcon,UnderlineIcon,StrikethroughIcon,ListIcon,ListOrderedIcon,AlignLeftIcon,AlignCenterIcon,AlignRightIcon,LinkIcon,Undo2Icon,Redo2Icon}from'lucide-react';import {cn}from'@xploreu/lib/cn';import {jsxs,jsx}from'react/jsx-runtime';var le=cva("border-border-primary focus-within:border-border-brand focus-within:ring-2 focus-within:ring-border-brand/20 aria-invalid:border-content-on-error-subtle-action relative flex w-full flex-col rounded-xp-card-base border bg-bg-primary transition-[color,box-shadow,border] outline-none overflow-hidden data-[disabled=true]:cursor-not-allowed data-[disabled=true]:bg-bg-disabled data-[disabled=true]:text-text-disabled data-[disabled=true]:opacity-60",{variants:{size:{"3xs":"text-label-regular-4","2xs":"text-label-regular-4",xs:"text-body-regular-3",sm:"text-body-regular-3",md:"text-body-regular-2",lg:"text-body-regular-2",xl:"text-body-regular-2"}},defaultVariants:{size:"md"}}),ae=cva("w-full flex-1 outline-none text-text-primary focus:outline-none max-w-none [&_p]:my-0 [&_ul]:list-disc [&_ul]:pl-5 [&_ul]:my-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_ol]:my-1 [&_li]:my-0.5 [&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-5 [&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-5 [&_a]:text-text-brand-primary [&_a]:underline [&_p.is-editor-empty:first-child]:before:content-[attr(data-placeholder)] [&_p.is-editor-empty:first-child]:before:text-text-placeholder [&_p.is-editor-empty:first-child]:before:float-left [&_p.is-editor-empty:first-child]:before:pointer-events-none [&_p.is-editor-empty:first-child]:before:h-0",{variants:{size:{"3xs":"min-h-10 p-1.5 text-label-regular-4","2xs":"min-h-12 p-2 text-label-regular-4",xs:"min-h-14 p-2 text-body-regular-3",sm:"min-h-16 p-2.5 text-body-regular-3",md:"min-h-20 p-3 text-body-regular-2",lg:"min-h-24 p-3.5 text-body-regular-2",xl:"min-h-28 p-4 text-body-regular-2"}},defaultVariants:{size:"md"}});function b(){return jsx("div",{className:"mx-1 h-3.5 w-px bg-border-secondary"})}function k({className:m,...p}){return jsx("button",{type:"button",className:cn("inline-flex size-7 items-center justify-center rounded-md text-label-regular-4 text-text-secondary hover:text-text-primary hover:bg-bg-secondary-hover/60 active:bg-bg-secondary-hover/80 disabled:pointer-events-none disabled:opacity-40 transition-colors duration-150 cursor-pointer select-none outline-none focus-visible:ring-2 focus-visible:ring-border-brand [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-3.5",m),...p})}function ye({className:m,editorClassName:p,toolbarClassName:I,size:x="md",value:o,defaultValue:_="",onChange:R,placeholder:v="",disabled:y=false,readOnly:z=false,isInvalid:N=false,showToolbar:E=true,showCharCount:w=false,showCharacterCount:L,maxLength:a$1,extensions:B,onBlur:G,onFocus:P,onEditorReady:U,...h}){let d=i.useRef(null),c=!y&&!z,[T,u]=i.useState(0),M=i.useMemo(()=>[H.configure({heading:{levels:[2,3]}}),F,j.configure({types:["heading","paragraph"]}),K.configure({placeholder:v,emptyEditorClass:"is-editor-empty"}),$.configure({openOnClick:false,autolink:true,HTMLAttributes:{rel:"noopener noreferrer nofollow",target:"_blank"}}),q.configure(a$1?{limit:a$1}:void 0)],[v,a$1]),e=useEditor({immediatelyRender:false,shouldRerenderOnTransaction:true,editable:c,extensions:B??M,content:o??_,onUpdate:({editor:r})=>{let l=r.getHTML();d.current=l,R?.(l),u(r.storage.characterCount?.characters?.()??r.getText().length);},onCreate:({editor:r})=>{u(r.storage.characterCount?.characters?.()??r.getText().length),U?.(r);},onFocus:()=>{P?.();},onBlur:()=>{G?.();},editorProps:{attributes:{class:cn(ae({size:x}),p)}}});i.useEffect(()=>{!e||e.isDestroyed||e.setEditable(c);},[e,c]),i.useEffect(()=>{if(!e||e.isDestroyed||o===void 0)return;let r=e.getHTML(),l=e.getText().trim(),S=(o||"").replace(/<[^>]*>/g,"").trim();if(l===""&&S!==""){e.commands.setContent(o,{emitUpdate:false}),d.current=o,u(e.storage.characterCount?.characters?.()??e.getText().length);return}o!==r&&o!==d.current&&!e.isFocused&&(e.commands.setContent(o||"",{emitUpdate:false}),d.current=o,u(e.storage.characterCount?.characters?.()??e.getText().length));},[o,e]);let V=i.useCallback(()=>{if(!e)return;if(e.isActive("link")){e.chain().focus().unsetLink().run();return}let r=e.getAttributes("link").href,l=window.prompt("Enter URL",r||"https://");if(l!==null){if(l===""){e.chain().focus().extendMarkRange("link").unsetLink().run();return}e.chain().focus().extendMarkRange("link").setLink({href:l}).run();}},[e]);return jsxs("div",{className:cn(le({size:x}),m),"data-disabled":y?"true":void 0,"data-slot":"rich-textarea","aria-invalid":h["aria-invalid"]??(N?"true":void 0),onClick:r=>{h.onClick?.(r),!(!e||!c)&&r.target===r.currentTarget&&e.chain().focus("end").run();},...h,children:[E&&e&&c&&jsxs("div",{className:cn("flex flex-wrap items-center gap-1 border-b border-border-secondary bg-bg-secondary/40 px-2 py-1 select-none",I),"data-slot":"rich-textarea-toolbar",onMouseDown:r=>{r.preventDefault();},children:[jsxs(a,{multiple:true,size:"icon-sm",value:[e.isActive("bold")?"bold":null,e.isActive("italic")?"italic":null,e.isActive("underline")?"underline":null,e.isActive("strike")?"strike":null].filter(r=>!!r),children:[jsx(b$1,{value:"bold",title:"Bold","aria-label":"Bold",disabled:!e.can().toggleBold(),onClick:()=>e.chain().focus().toggleBold().run(),children:jsx(BoldIcon,{className:"size-3.5"})}),jsx(b$1,{value:"italic",title:"Italic","aria-label":"Italic",disabled:!e.can().toggleItalic(),onClick:()=>e.chain().focus().toggleItalic().run(),children:jsx(ItalicIcon,{className:"size-3.5"})}),jsx(b$1,{value:"underline",title:"Underline","aria-label":"Underline",disabled:!e.can().toggleUnderline(),onClick:()=>e.chain().focus().toggleUnderline().run(),children:jsx(UnderlineIcon,{className:"size-3.5"})}),jsx(b$1,{value:"strike",title:"Strikethrough","aria-label":"Strikethrough",disabled:!e.can().toggleStrike(),onClick:()=>e.chain().focus().toggleStrike().run(),children:jsx(StrikethroughIcon,{className:"size-3.5"})})]}),jsx(b,{}),jsxs(a,{multiple:true,size:"icon-sm",value:[e.isActive("bulletList")?"bullet":e.isActive("orderedList")?"ordered":null].filter(r=>!!r),children:[jsx(b$1,{value:"bullet",title:"Bullet list","aria-label":"Bullet list",disabled:!e.can().toggleBulletList(),onClick:()=>e.chain().focus().toggleBulletList().run(),children:jsx(ListIcon,{className:"size-3.5"})}),jsx(b$1,{value:"ordered",title:"Numbered list","aria-label":"Numbered list",disabled:!e.can().toggleOrderedList(),onClick:()=>e.chain().focus().toggleOrderedList().run(),children:jsx(ListOrderedIcon,{className:"size-3.5"})})]}),jsx(b,{}),jsxs(a,{size:"icon-sm",value:[e.isActive({textAlign:"right"})?"right":e.isActive({textAlign:"center"})?"center":"left"],children:[jsx(b$1,{value:"left",title:"Align left","aria-label":"Align left",onClick:()=>e.chain().focus().setTextAlign("left").run(),children:jsx(AlignLeftIcon,{className:"size-3.5"})}),jsx(b$1,{value:"center",title:"Align center","aria-label":"Align center",onClick:()=>e.chain().focus().setTextAlign("center").run(),children:jsx(AlignCenterIcon,{className:"size-3.5"})}),jsx(b$1,{value:"right",title:"Align right","aria-label":"Align right",onClick:()=>e.chain().focus().setTextAlign("right").run(),children:jsx(AlignRightIcon,{className:"size-3.5"})})]}),jsx(b,{}),jsx(b$2,{size:"icon-sm",pressed:e.isActive("link"),onPressedChange:V,title:"Link","aria-label":"Link",children:jsx(LinkIcon,{className:"size-3.5"})}),jsx(b,{}),jsxs("div",{className:"flex items-center gap-0.5",children:[jsx(k,{disabled:!e.can().undo(),onClick:()=>e.chain().focus().undo().run(),title:"Undo","aria-label":"Undo",children:jsx(Undo2Icon,{className:"size-3.5"})}),jsx(k,{disabled:!e.can().redo(),onClick:()=>e.chain().focus().redo().run(),title:"Redo","aria-label":"Redo",children:jsx(Redo2Icon,{className:"size-3.5"})})]})]}),jsx(EditorContent,{editor:e,className:"w-full flex-1","data-slot":"rich-textarea-content"}),((L??w)||a$1)&&jsx("div",{className:"flex justify-end px-3 py-1 text-label-regular-4 text-text-tertiary select-none border-t border-border-secondary/40","data-slot":"rich-textarea-charcount",children:a$1?`${T} / ${a$1}`:T})]})}
2
+ export{le as a,ae as b,ye as c};//# sourceMappingURL=chunk-CT7JPFL4.js.map
3
+ //# sourceMappingURL=chunk-CT7JPFL4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/rich-textarea.tsx"],"names":["richTextareaVariants","cva","richTextareaContentVariants","ToolbarSeparator","jsx","ToolbarButton","className","props","cn","RichTextarea","editorClassName","toolbarClassName","size","value","defaultValue","onChange","placeholder","disabled","readOnly","isInvalid","showToolbar","showCharCount","showCharacterCount","maxLength","extensions","onBlur","onFocus","onEditorReady","lastEmittedValueRef","isEditable","charCount","setCharCount","defaultExtensions","StarterKit","Underline","TextAlign","Placeholder","Link","CharacterCount","editor","useEditor","ed","html","currentHtml","cleanCurrentText","cleanTargetText","handleLink","previousUrl","url","jsxs","e","ToggleGroup","v","ToggleGroupItem","BoldIcon","ItalicIcon","UnderlineIcon","StrikethroughIcon","ListIcon","ListOrderedIcon","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","Toggle","LinkIcon","Undo2Icon","Redo2Icon","EditorContent"],"mappings":"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","file":"chunk-CT7JPFL4.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { EditorContent, useEditor, type AnyExtension, type Editor, type EditorEvents } from \"@tiptap/react\"\r\nimport StarterKit from \"@tiptap/starter-kit\"\r\nimport Underline from \"@tiptap/extension-underline\"\r\nimport Link from \"@tiptap/extension-link\"\r\nimport TextAlign from \"@tiptap/extension-text-align\"\r\nimport Placeholder from \"@tiptap/extension-placeholder\"\r\nimport CharacterCount from \"@tiptap/extension-character-count\"\r\nimport {\r\n AlignCenterIcon,\r\n AlignLeftIcon,\r\n AlignRightIcon,\r\n BoldIcon,\r\n ItalicIcon,\r\n LinkIcon,\r\n ListIcon,\r\n ListOrderedIcon,\r\n Redo2Icon,\r\n StrikethroughIcon,\r\n UnderlineIcon,\r\n Undo2Icon,\r\n} from \"lucide-react\"\r\n\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { Toggle } from \"./toggle\"\r\nimport { ToggleGroup, ToggleGroupItem } from \"./toggle-group\"\r\n\r\n// ponytail: minimal tiptap-based rich textarea with starter-kit + formatting toolbar. Upgrade path: add custom toolbar slot / floating bubble menu when consumer needs it.\r\n\r\nconst richTextareaVariants = cva(\r\n \"border-border-primary focus-within:border-border-brand focus-within:ring-2 focus-within:ring-border-brand/20 aria-invalid:border-content-on-error-subtle-action relative flex w-full flex-col rounded-xp-card-base border bg-bg-primary transition-[color,box-shadow,border] outline-none overflow-hidden data-[disabled=true]:cursor-not-allowed data-[disabled=true]:bg-bg-disabled data-[disabled=true]:text-text-disabled data-[disabled=true]:opacity-60\",\r\n {\r\n variants: {\r\n size: {\r\n \"3xs\": \"text-label-regular-4\",\r\n \"2xs\": \"text-label-regular-4\",\r\n xs: \"text-body-regular-3\",\r\n sm: \"text-body-regular-3\",\r\n md: \"text-body-regular-2\",\r\n lg: \"text-body-regular-2\",\r\n xl: \"text-body-regular-2\",\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n },\r\n }\r\n)\r\n\r\nconst richTextareaContentVariants = cva(\r\n \"w-full flex-1 outline-none text-text-primary focus:outline-none max-w-none [&_p]:my-0 [&_ul]:list-disc [&_ul]:pl-5 [&_ul]:my-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_ol]:my-1 [&_li]:my-0.5 [&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-5 [&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-5 [&_a]:text-text-brand-primary [&_a]:underline [&_p.is-editor-empty:first-child]:before:content-[attr(data-placeholder)] [&_p.is-editor-empty:first-child]:before:text-text-placeholder [&_p.is-editor-empty:first-child]:before:float-left [&_p.is-editor-empty:first-child]:before:pointer-events-none [&_p.is-editor-empty:first-child]:before:h-0\",\r\n {\r\n variants: {\r\n size: {\r\n \"3xs\": \"min-h-10 p-1.5 text-label-regular-4\",\r\n \"2xs\": \"min-h-12 p-2 text-label-regular-4\",\r\n xs: \"min-h-14 p-2 text-body-regular-3\",\r\n sm: \"min-h-16 p-2.5 text-body-regular-3\",\r\n md: \"min-h-20 p-3 text-body-regular-2\",\r\n lg: \"min-h-24 p-3.5 text-body-regular-2\",\r\n xl: \"min-h-28 p-4 text-body-regular-2\",\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n },\r\n }\r\n)\r\n\r\nfunction ToolbarSeparator() {\r\n return <div className=\"mx-1 h-3.5 w-px bg-border-secondary\" />\r\n}\r\n\r\nfunction ToolbarButton({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"button\">) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n \"inline-flex size-7 items-center justify-center rounded-md text-label-regular-4 text-text-secondary hover:text-text-primary hover:bg-bg-secondary-hover/60 active:bg-bg-secondary-hover/80 disabled:pointer-events-none disabled:opacity-40 transition-colors duration-150 cursor-pointer select-none outline-none focus-visible:ring-2 focus-visible:ring-border-brand [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-3.5\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\ntype RichTextareaProps = Omit<\r\n React.ComponentProps<\"div\">,\r\n \"onChange\" | \"defaultValue\"\r\n> & {\r\n value?: string\r\n defaultValue?: string\r\n onChange?: (value: string) => void\r\n placeholder?: string\r\n disabled?: boolean\r\n readOnly?: boolean\r\n isInvalid?: boolean\r\n showToolbar?: boolean\r\n showCharCount?: boolean\r\n showCharacterCount?: boolean\r\n maxLength?: number\r\n editorClassName?: string\r\n toolbarClassName?: string\r\n extensions?: AnyExtension[]\r\n size?: VariantProps<typeof richTextareaVariants>[\"size\"]\r\n onBlur?: () => void\r\n onFocus?: () => void\r\n onEditorReady?: (editor: Editor) => void\r\n}\r\n\r\nfunction RichTextarea({\r\n className,\r\n editorClassName,\r\n toolbarClassName,\r\n size = \"md\",\r\n value,\r\n defaultValue = \"\",\r\n onChange,\r\n placeholder = \"\",\r\n disabled = false,\r\n readOnly = false,\r\n isInvalid = false,\r\n showToolbar = true,\r\n showCharCount = false,\r\n showCharacterCount,\r\n maxLength,\r\n extensions,\r\n onBlur,\r\n onFocus,\r\n onEditorReady,\r\n ...props\r\n}: RichTextareaProps) {\r\n const lastEmittedValueRef = React.useRef<string | null>(null)\r\n const isEditable = !disabled && !readOnly\r\n const [charCount, setCharCount] = React.useState(0)\r\n\r\n const defaultExtensions = React.useMemo<AnyExtension[]>(() => {\r\n return [\r\n StarterKit.configure({\r\n heading: {\r\n levels: [2, 3],\r\n },\r\n }),\r\n Underline,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Placeholder.configure({\r\n placeholder,\r\n emptyEditorClass: \"is-editor-empty\",\r\n }),\r\n Link.configure({\r\n openOnClick: false,\r\n autolink: true,\r\n HTMLAttributes: {\r\n rel: \"noopener noreferrer nofollow\",\r\n target: \"_blank\",\r\n },\r\n }),\r\n CharacterCount.configure(\r\n maxLength ? { limit: maxLength } : undefined\r\n ),\r\n ]\r\n }, [placeholder, maxLength])\r\n\r\n const editor = useEditor({\r\n immediatelyRender: false,\r\n shouldRerenderOnTransaction: true,\r\n editable: isEditable,\r\n extensions: extensions ?? defaultExtensions,\r\n content: value ?? defaultValue,\r\n onUpdate: ({ editor: ed }: EditorEvents[\"update\"]) => {\r\n const html = ed.getHTML()\r\n lastEmittedValueRef.current = html\r\n onChange?.(html)\r\n setCharCount(ed.storage.characterCount?.characters?.() ?? ed.getText().length)\r\n },\r\n onCreate: ({ editor: ed }: EditorEvents[\"create\"]) => {\r\n setCharCount(ed.storage.characterCount?.characters?.() ?? ed.getText().length)\r\n onEditorReady?.(ed)\r\n },\r\n onFocus: () => {\r\n onFocus?.()\r\n },\r\n onBlur: () => {\r\n onBlur?.()\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: cn(richTextareaContentVariants({ size }), editorClassName),\r\n },\r\n },\r\n })\r\n\r\n // Sync disabled/readOnly\r\n React.useEffect(() => {\r\n if (!editor || editor.isDestroyed) return\r\n editor.setEditable(isEditable)\r\n }, [editor, isEditable])\r\n\r\n // Sync external controlled value\r\n React.useEffect(() => {\r\n if (!editor || editor.isDestroyed) return\r\n if (value === undefined) return\r\n\r\n const currentHtml = editor.getHTML()\r\n const cleanCurrentText = editor.getText().trim()\r\n const cleanTargetText = (value || \"\").replace(/<[^>]*>/g, \"\").trim()\r\n\r\n // 1. Initial or reset populate if editor is blank\r\n if (cleanCurrentText === \"\" && cleanTargetText !== \"\") {\r\n editor.commands.setContent(value, { emitUpdate: false })\r\n lastEmittedValueRef.current = value\r\n setCharCount(editor.storage.characterCount?.characters?.() ?? editor.getText().length)\r\n return\r\n }\r\n\r\n // 2. Controlled value update while not focused\r\n if (value !== currentHtml && value !== lastEmittedValueRef.current && !editor.isFocused) {\r\n editor.commands.setContent(value || \"\", { emitUpdate: false })\r\n lastEmittedValueRef.current = value\r\n setCharCount(editor.storage.characterCount?.characters?.() ?? editor.getText().length)\r\n }\r\n }, [value, editor])\r\n\r\n const handleLink = React.useCallback(() => {\r\n if (!editor) return\r\n if (editor.isActive(\"link\")) {\r\n editor.chain().focus().unsetLink().run()\r\n return\r\n }\r\n const previousUrl = editor.getAttributes(\"link\").href as string | undefined\r\n const url = window.prompt(\"Enter URL\", previousUrl || \"https://\")\r\n if (url === null) return\r\n if (url === \"\") {\r\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\r\n return\r\n }\r\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run()\r\n }, [editor])\r\n\r\n return (\r\n <div\r\n className={cn(richTextareaVariants({ size }), className)}\r\n data-disabled={disabled ? \"true\" : undefined}\r\n data-slot=\"rich-textarea\"\r\n aria-invalid={props[\"aria-invalid\"] ?? (isInvalid ? \"true\" : undefined)}\r\n onClick={(e) => {\r\n props.onClick?.(e)\r\n if (!editor || !isEditable) return\r\n if (e.target === e.currentTarget) {\r\n editor.chain().focus(\"end\").run()\r\n }\r\n }}\r\n {...props}\r\n >\r\n {showToolbar && editor && isEditable && (\r\n <div\r\n className={cn(\r\n \"flex flex-wrap items-center gap-1 border-b border-border-secondary bg-bg-secondary/40 px-2 py-1 select-none\",\r\n toolbarClassName\r\n )}\r\n data-slot=\"rich-textarea-toolbar\"\r\n onMouseDown={(e) => {\r\n // Prevent toolbar clicks from stealing focus or collapsing selection in the editor\r\n e.preventDefault()\r\n }}\r\n >\r\n <ToggleGroup\r\n multiple\r\n size=\"icon-sm\"\r\n value={[\r\n editor.isActive(\"bold\") ? \"bold\" : null,\r\n editor.isActive(\"italic\") ? \"italic\" : null,\r\n editor.isActive(\"underline\") ? \"underline\" : null,\r\n editor.isActive(\"strike\") ? \"strike\" : null,\r\n ].filter((v): v is string => Boolean(v))}\r\n >\r\n <ToggleGroupItem\r\n value=\"bold\"\r\n title=\"Bold\"\r\n aria-label=\"Bold\"\r\n disabled={!editor.can().toggleBold()}\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n >\r\n <BoldIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"italic\"\r\n title=\"Italic\"\r\n aria-label=\"Italic\"\r\n disabled={!editor.can().toggleItalic()}\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n >\r\n <ItalicIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"underline\"\r\n title=\"Underline\"\r\n aria-label=\"Underline\"\r\n disabled={!editor.can().toggleUnderline()}\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n >\r\n <UnderlineIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"strike\"\r\n title=\"Strikethrough\"\r\n aria-label=\"Strikethrough\"\r\n disabled={!editor.can().toggleStrike()}\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n >\r\n <StrikethroughIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n </ToggleGroup>\r\n\r\n <ToolbarSeparator />\r\n\r\n <ToggleGroup\r\n multiple\r\n size=\"icon-sm\"\r\n value={[\r\n editor.isActive(\"bulletList\")\r\n ? \"bullet\"\r\n : editor.isActive(\"orderedList\")\r\n ? \"ordered\"\r\n : null,\r\n ].filter((v): v is string => Boolean(v))}\r\n >\r\n <ToggleGroupItem\r\n value=\"bullet\"\r\n title=\"Bullet list\"\r\n aria-label=\"Bullet list\"\r\n disabled={!editor.can().toggleBulletList()}\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n >\r\n <ListIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"ordered\"\r\n title=\"Numbered list\"\r\n aria-label=\"Numbered list\"\r\n disabled={!editor.can().toggleOrderedList()}\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n >\r\n <ListOrderedIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n </ToggleGroup>\r\n\r\n <ToolbarSeparator />\r\n\r\n <ToggleGroup\r\n size=\"icon-sm\"\r\n value={[\r\n editor.isActive({ textAlign: \"right\" })\r\n ? \"right\"\r\n : editor.isActive({ textAlign: \"center\" })\r\n ? \"center\"\r\n : \"left\",\r\n ]}\r\n >\r\n <ToggleGroupItem\r\n value=\"left\"\r\n title=\"Align left\"\r\n aria-label=\"Align left\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\r\n >\r\n <AlignLeftIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"center\"\r\n title=\"Align center\"\r\n aria-label=\"Align center\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\r\n >\r\n <AlignCenterIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n <ToggleGroupItem\r\n value=\"right\"\r\n title=\"Align right\"\r\n aria-label=\"Align right\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\r\n >\r\n <AlignRightIcon className=\"size-3.5\" />\r\n </ToggleGroupItem>\r\n </ToggleGroup>\r\n\r\n <ToolbarSeparator />\r\n\r\n <Toggle\r\n size=\"icon-sm\"\r\n pressed={editor.isActive(\"link\")}\r\n onPressedChange={handleLink}\r\n title=\"Link\"\r\n aria-label=\"Link\"\r\n >\r\n <LinkIcon className=\"size-3.5\" />\r\n </Toggle>\r\n\r\n <ToolbarSeparator />\r\n\r\n <div className=\"flex items-center gap-0.5\">\r\n <ToolbarButton\r\n disabled={!editor.can().undo()}\r\n onClick={() => editor.chain().focus().undo().run()}\r\n title=\"Undo\"\r\n aria-label=\"Undo\"\r\n >\r\n <Undo2Icon className=\"size-3.5\" />\r\n </ToolbarButton>\r\n <ToolbarButton\r\n disabled={!editor.can().redo()}\r\n onClick={() => editor.chain().focus().redo().run()}\r\n title=\"Redo\"\r\n aria-label=\"Redo\"\r\n >\r\n <Redo2Icon className=\"size-3.5\" />\r\n </ToolbarButton>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <EditorContent\r\n editor={editor}\r\n className=\"w-full flex-1\"\r\n data-slot=\"rich-textarea-content\"\r\n />\r\n\r\n {((showCharacterCount ?? showCharCount) || maxLength) && (\r\n <div\r\n className=\"flex justify-end px-3 py-1 text-label-regular-4 text-text-tertiary select-none border-t border-border-secondary/40\"\r\n data-slot=\"rich-textarea-charcount\"\r\n >\r\n {maxLength ? `${charCount} / ${maxLength}` : charCount}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport { RichTextarea, richTextareaVariants, richTextareaContentVariants }\r\nexport type { RichTextareaProps }\r\n"]}
@@ -1,2 +1,2 @@
1
- import {a,b,m,e,q,s,w,A,x,H}from'./chunk-R4XVXVLJ.js';import'react';import {ChevronDownIcon}from'lucide-react';import {cn}from'@xploreu/lib/cn';import {useControlledState}from'@xploreu/hooks/use-controlled-state';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function Y({multiple:d,items:s$1,placeholder:a$1="Select",icon:m$1,container:S,isPending:M,className:A$1,triggerClassName:R,contentClassName:k,disabled:L,infiniteScroll:x$1,filter:c,...t}){let r=d===true,$=t.showTitle??r,g=t.showSearch??r,[b$1,C]=useControlledState({value:t?.value,defaultValue:t?.defaultValue,onChange:t.onValueChange}),[q$1,B]=useControlledState({value:t?.inputValue?.toString(),defaultValue:t?.defaultInputValue?.toString(),onChange:t?.onInputValueChange}),u=Array.isArray(b$1)?b$1:b$1?[b$1]:[],l=u.length>0,z=u.length,j=l?r?`${a$1} (${z})`:u[0]?.label??a$1:r?`All ${a$1}`:a$1,D=()=>{C(r?[]:null);};return jsxs(a,{items:s$1,multiple:d,value:b$1,onValueChange:C,inputValue:q$1,onInputValueChange:B,filter:c===null||!g?null:c,isItemEqualToValue:(e,p)=>e.value===p.value,disabled:L,...t,children:[jsxs(b,{className:cn("group flex h-8 w-fit max-w-[220px] items-center gap-2 rounded-xp-card-base border bg-bg-primary px-3 text-body-medium-3 transition-colors","border-border-primary text-text-secondary hover:bg-bg-primary-hover",l&&"border-border-brand bg-bg-brand-primary text-text-brand-secondary hover:bg-bg-brand-primary-hover-alt","disabled:pointer-events-none disabled:opacity-50","data-[popup-open]:border-border-brand data-[popup-open]:bg-bg-brand-primary data-[popup-open]:text-text-brand-secondary",R,A$1),children:[m$1&&jsx("span",{className:cn("size-4 shrink-0 group-data-[popup-open]:text-fg-brand-primary",l?"text-fg-brand-primary":"text-fg-quaternary"),children:m$1}),jsx("span",{className:"truncate",children:j}),jsx(ChevronDownIcon,{className:cn("size-4 shrink-0 transition-transform group-data-[popup-open]:rotate-180 group-data-[popup-open]:text-fg-brand-primary",l?"text-fg-brand-primary":"text-fg-quaternary")})]}),jsx(m,{container:S,className:cn("w-72",k),align:"start",sideOffset:8,children:jsxs("div",{className:"flex flex-col",children:[$&&jsxs("div",{className:"flex items-center justify-between p-3 border-b border-border-primary",children:[jsx("span",{className:"text-label-semibold-3 text-text-primary",children:a$1}),jsx("button",{type:"button",disabled:!l,onClick:D,className:cn("text-label-semibold-3 transition-colors",l?"cursor-pointer text-text-error-primary hover:text-text-error-primary-hover":"cursor-not-allowed text-text-disabled"),children:"Clear All"})]}),g&&jsx(e,{placeholder:`Search ${a$1.toLowerCase()}...`}),jsx(q,{status:M||s$1===void 0?"pending":s$1?.length===0?"empty":null}),jsx(s,{children:(e,p,E)=>jsxs(Fragment,{children:[jsxs(w,{indicator:r?"checkbox":void 0,value:e,children:[e.avatar&&(typeof e.avatar=="string"?jsx(A,{src:e.avatar,fallbackText:[e.label?.[0],e.label?.split(" ")?.[1]?.[0]].filter(Boolean).join(""),imageAlt:e.label}):e.avatar),jsx(x,{children:e.label})]},e.value),p===E-1&&!!x$1&&jsx(H,{...x$1})]})})]})})]})}export{Y as a};//# sourceMappingURL=chunk-TDAEQLUM.js.map
2
- //# sourceMappingURL=chunk-TDAEQLUM.js.map
1
+ import {a,b,m,e,q,s,w,A,x,H}from'./chunk-ILE3MBTR.js';import'react';import {ChevronDownIcon}from'lucide-react';import {cn}from'@xploreu/lib/cn';import {useControlledState}from'@xploreu/hooks/use-controlled-state';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function Y({multiple:d,items:s$1,placeholder:a$1="Select",icon:m$1,container:S,isPending:M,className:A$1,triggerClassName:R,contentClassName:k,disabled:L,infiniteScroll:x$1,filter:c,...t}){let r=d===true,$=t.showTitle??r,g=t.showSearch??r,[b$1,C]=useControlledState({value:t?.value,defaultValue:t?.defaultValue,onChange:t.onValueChange}),[q$1,B]=useControlledState({value:t?.inputValue?.toString(),defaultValue:t?.defaultInputValue?.toString(),onChange:t?.onInputValueChange}),u=Array.isArray(b$1)?b$1:b$1?[b$1]:[],l=u.length>0,z=u.length,j=l?r?`${a$1} (${z})`:u[0]?.label??a$1:r?`All ${a$1}`:a$1,D=()=>{C(r?[]:null);};return jsxs(a,{items:s$1,multiple:d,value:b$1,onValueChange:C,inputValue:q$1,onInputValueChange:B,filter:c===null||!g?null:c,isItemEqualToValue:(e,p)=>e.value===p.value,disabled:L,...t,children:[jsxs(b,{className:cn("group flex h-8 w-fit max-w-[220px] items-center gap-2 rounded-xp-card-base border bg-bg-primary px-3 text-body-medium-3 transition-colors","border-border-primary text-text-secondary hover:bg-bg-primary-hover",l&&"border-border-brand bg-bg-brand-primary text-text-brand-secondary hover:bg-bg-brand-primary-hover-alt","disabled:pointer-events-none disabled:opacity-50","data-[popup-open]:border-border-brand data-[popup-open]:bg-bg-brand-primary data-[popup-open]:text-text-brand-secondary",R,A$1),children:[m$1&&jsx("span",{className:cn("size-4 shrink-0 group-data-[popup-open]:text-fg-brand-primary",l?"text-fg-brand-primary":"text-fg-quaternary"),children:m$1}),jsx("span",{className:"truncate",children:j}),jsx(ChevronDownIcon,{className:cn("size-4 shrink-0 transition-transform group-data-[popup-open]:rotate-180 group-data-[popup-open]:text-fg-brand-primary",l?"text-fg-brand-primary":"text-fg-quaternary")})]}),jsx(m,{container:S,className:cn("w-72",k),align:"start",sideOffset:8,children:jsxs("div",{className:"flex flex-col",children:[$&&jsxs("div",{className:"flex items-center justify-between p-3 border-b border-border-primary",children:[jsx("span",{className:"text-label-semibold-3 text-text-primary",children:a$1}),jsx("button",{type:"button",disabled:!l,onClick:D,className:cn("text-label-semibold-3 transition-colors",l?"cursor-pointer text-text-error-primary hover:text-text-error-primary-hover":"cursor-not-allowed text-text-disabled"),children:"Clear All"})]}),g&&jsx(e,{placeholder:`Search ${a$1.toLowerCase()}...`}),jsx(q,{status:M||s$1===void 0?"pending":s$1?.length===0?"empty":null}),jsx(s,{children:(e,p,E)=>jsxs(Fragment,{children:[jsxs(w,{indicator:r?"checkbox":void 0,value:e,children:[e.avatar&&(typeof e.avatar=="string"?jsx(A,{src:e.avatar,fallbackText:[e.label?.[0],e.label?.split(" ")?.[1]?.[0]].filter(Boolean).join(""),imageAlt:e.label}):e.avatar),jsx(x,{children:e.label})]},e.value),p===E-1&&!!x$1&&jsx(H,{...x$1})]})})]})})]})}export{Y as a};//# sourceMappingURL=chunk-F7VAJTWI.js.map
2
+ //# sourceMappingURL=chunk-F7VAJTWI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/composites/filter-combobox.tsx"],"names":["FilterCombobox","multiple","items","placeholder","icon","container","isPending","className","triggerClassName","contentClassName","disabled","infiniteScroll","filter","props","isMultiple","showTitle","showSearch","value","setValue","useControlledState","inputValue","setInputValue","valueArray","hasValue","count","triggerLabel","handleClear","jsxs","Combobox","a","b","ComboboxTrigger","cn","jsx","ChevronDownIcon","ComboboxPopup","ComboboxInput","ComboboxStatus","ComboboxList","item","index","length","Fragment","ComboboxItem","ComboboxItemAvatar","ComboboxItemTitle","ComboboxInfiniteScroll"],"mappings":"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","file":"chunk-TDAEQLUM.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { ChevronDownIcon } from \"lucide-react\"\r\n\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { useControlledState } from \"@xploreu/hooks/use-controlled-state\"\r\nimport { ComboboxItem, ComboboxItemAvatar, ComboboxItemTitle, type ComboboxProps } from \"../ui/combobox\"\r\nimport {\r\n Combobox,\r\n ComboboxInfiniteScroll,\r\n ComboboxInput,\r\n ComboboxList,\r\n ComboboxPopup,\r\n ComboboxPortal,\r\n ComboboxStatus,\r\n ComboboxTrigger\r\n} from \"../ui/combobox\"\r\n\r\n// ─── Types ───\r\n\r\nexport type FilterComboboxItem = {\r\n label: string\r\n value: string\r\n avatar?: string | React.ReactNode\r\n}\r\n\r\ntype FilterComboboxValueType<Value extends FilterComboboxItem, Multiple extends boolean | undefined> = Multiple extends true ? Value[] : Value;\r\n\r\ntype BaseProps = {\r\n items: FilterComboboxItem[] | undefined\r\n placeholder?: string\r\n icon?: React.ReactNode\r\n container?: React.ComponentProps<typeof ComboboxPortal>[\"container\"]\r\n isPending?: boolean\r\n className?: string\r\n triggerClassName?: string\r\n contentClassName?: string\r\n disabled?: boolean\r\n infiniteScroll?: React.ComponentProps<typeof ComboboxInfiniteScroll>\r\n showTitle?: boolean\r\n showSearch?: boolean\r\n}\r\n\r\nexport type FilterComboboxProps<Value, Multiple extends boolean | undefined = false> = ComboboxProps<Value, Multiple> & BaseProps\r\n\r\n// ─── Component ───\r\n\r\nfunction FilterCombobox<Value extends FilterComboboxItem, Multiple extends boolean | undefined = false>({\r\n multiple,\r\n items,\r\n placeholder = \"Select\",\r\n icon,\r\n container,\r\n isPending,\r\n className,\r\n triggerClassName,\r\n contentClassName,\r\n disabled,\r\n infiniteScroll,\r\n filter,\r\n ...props\r\n}: FilterComboboxProps<Value, Multiple>) {\r\n const isMultiple = multiple === true\r\n const showTitle = props.showTitle ?? isMultiple\r\n const showSearch = props.showSearch ?? isMultiple\r\n\r\n const [value, setValue] = useControlledState<FilterComboboxValueType<Value, Multiple> | null>({\r\n value: props?.value,\r\n defaultValue: props?.defaultValue,\r\n onChange: props.onValueChange as (\r\n value: FilterComboboxValueType<Value, Multiple> | null\r\n ) => void\r\n })\r\n\r\n const [inputValue, setInputValue] = useControlledState({\r\n value: props?.inputValue?.toString(),\r\n defaultValue: props?.defaultInputValue?.toString(),\r\n onChange: props?.onInputValueChange,\r\n })\r\n\r\n // Normalize value to array for label & clear logic\r\n const valueArray = Array.isArray(value) ? value : value ? [value] : []\r\n const hasValue = valueArray.length > 0\r\n const count = valueArray.length\r\n\r\n const triggerLabel = !hasValue\r\n ? isMultiple\r\n ? `All ${placeholder}`\r\n : placeholder\r\n : isMultiple\r\n ? `${placeholder} (${count})`\r\n : valueArray[0]?.label ?? placeholder\r\n\r\n const handleClear = () => {\r\n setValue((isMultiple ? [] : null) as FilterComboboxValueType<Value, Multiple> | null)\r\n }\r\n\r\n return (\r\n <Combobox\r\n items={items}\r\n multiple={multiple}\r\n value={value}\r\n onValueChange={setValue}\r\n inputValue={inputValue}\r\n onInputValueChange={setInputValue}\r\n filter={filter === null || !showSearch ? null : filter}\r\n isItemEqualToValue={(a, b) => a.value === b.value}\r\n disabled={disabled}\r\n {...props}\r\n >\r\n <ComboboxTrigger\r\n className={cn(\r\n \"group flex h-8 w-fit max-w-[220px] items-center gap-2 rounded-xp-card-base border bg-bg-primary px-3 text-body-medium-3 transition-colors\",\r\n \"border-border-primary text-text-secondary hover:bg-bg-primary-hover\",\r\n hasValue && \"border-border-brand bg-bg-brand-primary text-text-brand-secondary hover:bg-bg-brand-primary-hover-alt\",\r\n \"disabled:pointer-events-none disabled:opacity-50\",\r\n \"data-[popup-open]:border-border-brand data-[popup-open]:bg-bg-brand-primary data-[popup-open]:text-text-brand-secondary\",\r\n triggerClassName,\r\n className\r\n )}\r\n >\r\n {icon && (\r\n <span\r\n className={cn(\r\n \"size-4 shrink-0 group-data-[popup-open]:text-fg-brand-primary\",\r\n hasValue ? \"text-fg-brand-primary\" : \"text-fg-quaternary\"\r\n )}\r\n >\r\n {icon}\r\n </span>\r\n )}\r\n <span className=\"truncate\">{triggerLabel}</span>\r\n <ChevronDownIcon\r\n className={cn(\r\n \"size-4 shrink-0 transition-transform group-data-[popup-open]:rotate-180 group-data-[popup-open]:text-fg-brand-primary\",\r\n hasValue ? \"text-fg-brand-primary\" : \"text-fg-quaternary\"\r\n )}\r\n />\r\n </ComboboxTrigger>\r\n\r\n <ComboboxPopup\r\n container={container}\r\n className={cn(\"w-72\", contentClassName)}\r\n align=\"start\"\r\n sideOffset={8}\r\n >\r\n <div className=\"flex flex-col\">\r\n {showTitle && (\r\n <div className=\"flex items-center justify-between p-3 border-b border-border-primary\">\r\n <span className=\"text-label-semibold-3 text-text-primary\">{placeholder}</span>\r\n <button\r\n type=\"button\"\r\n disabled={!hasValue}\r\n onClick={handleClear}\r\n className={cn(\r\n \"text-label-semibold-3 transition-colors\",\r\n hasValue\r\n ? \"cursor-pointer text-text-error-primary hover:text-text-error-primary-hover\"\r\n : \"cursor-not-allowed text-text-disabled\"\r\n )}\r\n >\r\n Clear All\r\n </button>\r\n </div>\r\n )}\r\n\r\n {showSearch && (\r\n <ComboboxInput placeholder={`Search ${placeholder.toLowerCase()}...`} />\r\n )}\r\n\r\n <ComboboxStatus\r\n status={\r\n isPending || items === undefined\r\n ? \"pending\"\r\n : (items)?.length === 0\r\n ? \"empty\"\r\n : null\r\n }\r\n />\r\n <ComboboxList>\r\n {(item, index, length) => (\r\n <>\r\n <ComboboxItem\r\n indicator={isMultiple ? \"checkbox\" : undefined}\r\n key={item.value}\r\n value={item}\r\n >\r\n {/* ponytail: avatar accepts image URL string or custom ReactNode; upgrade path: add trigger-level avatar if requested */}\r\n {item.avatar && (\r\n typeof item.avatar === \"string\" ? (\r\n <ComboboxItemAvatar\r\n src={item.avatar}\r\n fallbackText={[item.label?.[0], item.label?.split(\" \")?.[1]?.[0]].filter(Boolean).join(\"\")}\r\n imageAlt={item.label}\r\n />\r\n ) : (\r\n item.avatar\r\n )\r\n )}\r\n <ComboboxItemTitle>{item.label}</ComboboxItemTitle>\r\n </ComboboxItem>\r\n {index === length - 1 && !!infiniteScroll && (\r\n <ComboboxInfiniteScroll {...infiniteScroll} />\r\n )}\r\n </>\r\n )}\r\n </ComboboxList>\r\n </div>\r\n </ComboboxPopup>\r\n </Combobox>\r\n )\r\n}\r\n\r\nexport { FilterCombobox }\r\n"]}
1
+ {"version":3,"sources":["../src/composites/filter-combobox.tsx"],"names":["FilterCombobox","multiple","items","placeholder","icon","container","isPending","className","triggerClassName","contentClassName","disabled","infiniteScroll","filter","props","isMultiple","showTitle","showSearch","value","setValue","useControlledState","inputValue","setInputValue","valueArray","hasValue","count","triggerLabel","handleClear","jsxs","Combobox","a","b","ComboboxTrigger","cn","jsx","ChevronDownIcon","ComboboxPopup","ComboboxInput","ComboboxStatus","ComboboxList","item","index","length","Fragment","ComboboxItem","ComboboxItemAvatar","ComboboxItemTitle","ComboboxInfiniteScroll"],"mappings":"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","file":"chunk-F7VAJTWI.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { ChevronDownIcon } from \"lucide-react\"\r\n\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { useControlledState } from \"@xploreu/hooks/use-controlled-state\"\r\nimport { ComboboxItem, ComboboxItemAvatar, ComboboxItemTitle, type ComboboxProps } from \"../ui/combobox\"\r\nimport {\r\n Combobox,\r\n ComboboxInfiniteScroll,\r\n ComboboxInput,\r\n ComboboxList,\r\n ComboboxPopup,\r\n ComboboxPortal,\r\n ComboboxStatus,\r\n ComboboxTrigger\r\n} from \"../ui/combobox\"\r\n\r\n// ─── Types ───\r\n\r\nexport type FilterComboboxItem = {\r\n label: string\r\n value: string\r\n avatar?: string | React.ReactNode\r\n}\r\n\r\ntype FilterComboboxValueType<Value extends FilterComboboxItem, Multiple extends boolean | undefined> = Multiple extends true ? Value[] : Value;\r\n\r\ntype BaseProps = {\r\n items: FilterComboboxItem[] | undefined\r\n placeholder?: string\r\n icon?: React.ReactNode\r\n container?: React.ComponentProps<typeof ComboboxPortal>[\"container\"]\r\n isPending?: boolean\r\n className?: string\r\n triggerClassName?: string\r\n contentClassName?: string\r\n disabled?: boolean\r\n infiniteScroll?: React.ComponentProps<typeof ComboboxInfiniteScroll>\r\n showTitle?: boolean\r\n showSearch?: boolean\r\n}\r\n\r\nexport type FilterComboboxProps<Value, Multiple extends boolean | undefined = false> = ComboboxProps<Value, Multiple> & BaseProps\r\n\r\n// ─── Component ───\r\n\r\nfunction FilterCombobox<Value extends FilterComboboxItem, Multiple extends boolean | undefined = false>({\r\n multiple,\r\n items,\r\n placeholder = \"Select\",\r\n icon,\r\n container,\r\n isPending,\r\n className,\r\n triggerClassName,\r\n contentClassName,\r\n disabled,\r\n infiniteScroll,\r\n filter,\r\n ...props\r\n}: FilterComboboxProps<Value, Multiple>) {\r\n const isMultiple = multiple === true\r\n const showTitle = props.showTitle ?? isMultiple\r\n const showSearch = props.showSearch ?? isMultiple\r\n\r\n const [value, setValue] = useControlledState<FilterComboboxValueType<Value, Multiple> | null>({\r\n value: props?.value,\r\n defaultValue: props?.defaultValue,\r\n onChange: props.onValueChange as (\r\n value: FilterComboboxValueType<Value, Multiple> | null\r\n ) => void\r\n })\r\n\r\n const [inputValue, setInputValue] = useControlledState({\r\n value: props?.inputValue?.toString(),\r\n defaultValue: props?.defaultInputValue?.toString(),\r\n onChange: props?.onInputValueChange,\r\n })\r\n\r\n // Normalize value to array for label & clear logic\r\n const valueArray = Array.isArray(value) ? value : value ? [value] : []\r\n const hasValue = valueArray.length > 0\r\n const count = valueArray.length\r\n\r\n const triggerLabel = !hasValue\r\n ? isMultiple\r\n ? `All ${placeholder}`\r\n : placeholder\r\n : isMultiple\r\n ? `${placeholder} (${count})`\r\n : valueArray[0]?.label ?? placeholder\r\n\r\n const handleClear = () => {\r\n setValue((isMultiple ? [] : null) as FilterComboboxValueType<Value, Multiple> | null)\r\n }\r\n\r\n return (\r\n <Combobox\r\n items={items}\r\n multiple={multiple}\r\n value={value}\r\n onValueChange={setValue}\r\n inputValue={inputValue}\r\n onInputValueChange={setInputValue}\r\n filter={filter === null || !showSearch ? null : filter}\r\n isItemEqualToValue={(a, b) => a.value === b.value}\r\n disabled={disabled}\r\n {...props}\r\n >\r\n <ComboboxTrigger\r\n className={cn(\r\n \"group flex h-8 w-fit max-w-[220px] items-center gap-2 rounded-xp-card-base border bg-bg-primary px-3 text-body-medium-3 transition-colors\",\r\n \"border-border-primary text-text-secondary hover:bg-bg-primary-hover\",\r\n hasValue && \"border-border-brand bg-bg-brand-primary text-text-brand-secondary hover:bg-bg-brand-primary-hover-alt\",\r\n \"disabled:pointer-events-none disabled:opacity-50\",\r\n \"data-[popup-open]:border-border-brand data-[popup-open]:bg-bg-brand-primary data-[popup-open]:text-text-brand-secondary\",\r\n triggerClassName,\r\n className\r\n )}\r\n >\r\n {icon && (\r\n <span\r\n className={cn(\r\n \"size-4 shrink-0 group-data-[popup-open]:text-fg-brand-primary\",\r\n hasValue ? \"text-fg-brand-primary\" : \"text-fg-quaternary\"\r\n )}\r\n >\r\n {icon}\r\n </span>\r\n )}\r\n <span className=\"truncate\">{triggerLabel}</span>\r\n <ChevronDownIcon\r\n className={cn(\r\n \"size-4 shrink-0 transition-transform group-data-[popup-open]:rotate-180 group-data-[popup-open]:text-fg-brand-primary\",\r\n hasValue ? \"text-fg-brand-primary\" : \"text-fg-quaternary\"\r\n )}\r\n />\r\n </ComboboxTrigger>\r\n\r\n <ComboboxPopup\r\n container={container}\r\n className={cn(\"w-72\", contentClassName)}\r\n align=\"start\"\r\n sideOffset={8}\r\n >\r\n <div className=\"flex flex-col\">\r\n {showTitle && (\r\n <div className=\"flex items-center justify-between p-3 border-b border-border-primary\">\r\n <span className=\"text-label-semibold-3 text-text-primary\">{placeholder}</span>\r\n <button\r\n type=\"button\"\r\n disabled={!hasValue}\r\n onClick={handleClear}\r\n className={cn(\r\n \"text-label-semibold-3 transition-colors\",\r\n hasValue\r\n ? \"cursor-pointer text-text-error-primary hover:text-text-error-primary-hover\"\r\n : \"cursor-not-allowed text-text-disabled\"\r\n )}\r\n >\r\n Clear All\r\n </button>\r\n </div>\r\n )}\r\n\r\n {showSearch && (\r\n <ComboboxInput placeholder={`Search ${placeholder.toLowerCase()}...`} />\r\n )}\r\n\r\n <ComboboxStatus\r\n status={\r\n isPending || items === undefined\r\n ? \"pending\"\r\n : (items)?.length === 0\r\n ? \"empty\"\r\n : null\r\n }\r\n />\r\n <ComboboxList>\r\n {(item, index, length) => (\r\n <>\r\n <ComboboxItem\r\n indicator={isMultiple ? \"checkbox\" : undefined}\r\n key={item.value}\r\n value={item}\r\n >\r\n {/* ponytail: avatar accepts image URL string or custom ReactNode; upgrade path: add trigger-level avatar if requested */}\r\n {item.avatar && (\r\n typeof item.avatar === \"string\" ? (\r\n <ComboboxItemAvatar\r\n src={item.avatar}\r\n fallbackText={[item.label?.[0], item.label?.split(\" \")?.[1]?.[0]].filter(Boolean).join(\"\")}\r\n imageAlt={item.label}\r\n />\r\n ) : (\r\n item.avatar\r\n )\r\n )}\r\n <ComboboxItemTitle>{item.label}</ComboboxItemTitle>\r\n </ComboboxItem>\r\n {index === length - 1 && !!infiniteScroll && (\r\n <ComboboxInfiniteScroll {...infiniteScroll} />\r\n )}\r\n </>\r\n )}\r\n </ComboboxList>\r\n </div>\r\n </ComboboxPopup>\r\n </Combobox>\r\n )\r\n}\r\n\r\nexport { FilterCombobox }\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {b,d,a,e,c as c$1}from'./chunk-W4DBU7UU.js';import {a as a$1}from'./chunk-OLQXHFH4.js';import'react';import'class-variance-authority';import {cn}from'@xploreu/lib/cn';import {getStrictContext}from'@xploreu/lib/get-strict-context';import {jsx}from'react/jsx-runtime';var[v,c]=getStrictContext("ToggleGroupContext");function H({className:a,variant:t,size:o,children:e,multiple:r,...i}){return jsx(b,{"data-variant":t,"data-size":o,className:cn("group/toggle-group flex gap-0.5 w-fit items-center rounded-lg data-[variant=outline]:border data-[variant=outline]:border-border-secondary data-[variant=outline]:p-0.5",a),multiple:r,...i,children:jsx(v,{value:{variant:t,size:o},children:r?e:jsx(d,{className:"bg-bg-brand-primary rounded-md",children:e})})})}function z({className:a$2,children:t,variant:o,size:e$1,...r}){let{variant:i,size:l}=c(),{multiple:d}=a();return jsx(e,{value:r.value?.toString(),className:cn(d&&"bg-bg-brand-primary rounded-md"),children:jsx(c$1,{"data-variant":i||o,"data-size":l||e$1,className:cn(a$1({variant:i||o,size:l||e$1}),"min-w-0 border-0 flex-1 shrink-0 shadow-none rounded-md focus:z-10 focus-visible:z-10",a$2),...r,children:t})})}export{H as a,z as b};//# sourceMappingURL=chunk-FTET6SSC.js.map
2
+ //# sourceMappingURL=chunk-FTET6SSC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/toggle-group.tsx"],"names":["ToggleGroupProvider","useToggleGroup","getStrictContext","ToggleGroup","className","variant","size","children","multiple","props","jsx","cn","ToggleGroupHighlight","ToggleGroupItem","contextVariant","contextSize","ToggleHighlight","Toggle","toggleVariants"],"mappings":"iRAiBA,GAAM,CAACA,CAAAA,CAAqBC,CAAc,CAAA,CACxCC,iBAAsD,oBAAoB,CAAA,CAK5E,SAASC,CAAAA,CAAY,CACnB,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,EACA,GAAGC,CACL,CAAA,CAAqB,CACnB,OACEC,GAAAA,CAACP,CAAAA,CAAA,CACC,cAAA,CAAcE,EACd,WAAA,CAAWC,CAAAA,CACX,SAAA,CAAWK,EAAAA,CACT,0KACAP,CACF,CAAA,CACA,QAAA,CAAUI,CAAAA,CACT,GAAGC,CAAAA,CAEJ,QAAA,CAAAC,GAAAA,CAACV,CAAAA,CAAA,CAAoB,KAAA,CAAO,CAAE,OAAA,CAAAK,CAAAA,CAAS,KAAAC,CAAK,CAAA,CACzC,QAAA,CAACE,CAAAA,CAKAD,EAJAG,GAAAA,CAACE,CAAAA,CAAA,CAA8B,SAAA,CAAU,iCACtC,QAAA,CAAAL,CAAAA,CACH,CAAA,CAIJ,CAAA,CACF,CAEJ,CAKA,SAASM,CAAAA,CAAgB,CACvB,UAAAT,GAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,OAAA,CAAAF,EACA,IAAA,CAAAC,GAAAA,CACA,GAAGG,CACL,EAAyB,CACvB,GAAM,CAAE,OAAA,CAASK,EAAgB,IAAA,CAAMC,CAAY,CAAA,CAAId,CAAAA,GACjD,CAAE,QAAA,CAAAO,CAAS,CAAA,CAAIP,GAAwB,CAE7C,OACES,GAAAA,CAACM,CAAAA,CAAA,CACC,KAAA,CAAOP,CAAAA,CAAM,KAAA,EAAO,QAAA,GACpB,SAAA,CAAWE,EAAAA,CAAGH,CAAAA,EAAY,gCAAgC,EAE1D,QAAA,CAAAE,GAAAA,CAACO,GAAAA,CAAA,CACC,eAAcH,CAAAA,EAAkBT,CAAAA,CAChC,WAAA,CAAWU,CAAAA,EAAeT,IAC1B,SAAA,CAAWK,EAAAA,CACTO,GAAAA,CAAe,CACb,QAASJ,CAAAA,EAAkBT,CAAAA,CAC3B,IAAA,CAAMU,CAAAA,EAAeT,GACvB,CAAC,CAAA,CACD,uFAAA,CACAF,GACF,EACC,GAAGK,CAAAA,CAEH,QAAA,CAAAF,CAAAA,CACH,EACF,CAEJ","file":"chunk-FTET6SSC.js","sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { type VariantProps } from \"class-variance-authority\"\r\nimport {\r\n ToggleGroup as ToggleGroupPrimitive,\r\n Toggle as ToggleGroupPrimitiveToggle,\r\n ToggleGroupHighlight as ToggleGroupHighlightPrimitive,\r\n ToggleHighlight as ToggleHighlightPrimitive,\r\n useToggleGroup as useToggleGroupPrimitive,\r\n type ToggleGroupProps as ToggleGroupPrimitiveProps,\r\n type ToggleProps as TogglePrimitiveProps,\r\n} from \"../primitives/toggle-group\"\r\nimport { toggleVariants } from \"./toggle\"\r\nimport { cn } from \"@xploreu/lib/cn\"\r\nimport { getStrictContext } from \"@xploreu/lib/get-strict-context\"\r\n\r\nconst [ToggleGroupProvider, useToggleGroup] =\r\n getStrictContext<VariantProps<typeof toggleVariants>>(\"ToggleGroupContext\")\r\n\r\ntype ToggleGroupProps = ToggleGroupPrimitiveProps &\r\n VariantProps<typeof toggleVariants>\r\n\r\nfunction ToggleGroup({\r\n className,\r\n variant,\r\n size,\r\n children,\r\n multiple,\r\n ...props\r\n}: ToggleGroupProps) {\r\n return (\r\n <ToggleGroupPrimitive\r\n data-variant={variant}\r\n data-size={size}\r\n className={cn(\r\n \"group/toggle-group flex gap-0.5 w-fit items-center rounded-lg data-[variant=outline]:border data-[variant=outline]:border-border-secondary data-[variant=outline]:p-0.5\",\r\n className\r\n )}\r\n multiple={multiple}\r\n {...props}\r\n >\r\n <ToggleGroupProvider value={{ variant, size }}>\r\n {!multiple ? (\r\n <ToggleGroupHighlightPrimitive className=\"bg-bg-brand-primary rounded-md\">\r\n {children}\r\n </ToggleGroupHighlightPrimitive>\r\n ) : (\r\n children\r\n )}\r\n </ToggleGroupProvider>\r\n </ToggleGroupPrimitive>\r\n )\r\n}\r\n\r\ntype ToggleGroupItemProps = TogglePrimitiveProps &\r\n VariantProps<typeof toggleVariants>\r\n\r\nfunction ToggleGroupItem({\r\n className,\r\n children,\r\n variant,\r\n size,\r\n ...props\r\n}: ToggleGroupItemProps) {\r\n const { variant: contextVariant, size: contextSize } = useToggleGroup()\r\n const { multiple } = useToggleGroupPrimitive()\r\n\r\n return (\r\n <ToggleHighlightPrimitive\r\n value={props.value?.toString()}\r\n className={cn(multiple && \"bg-bg-brand-primary rounded-md\")}\r\n >\r\n <ToggleGroupPrimitiveToggle\r\n data-variant={contextVariant || variant}\r\n data-size={contextSize || size}\r\n className={cn(\r\n toggleVariants({\r\n variant: contextVariant || variant,\r\n size: contextSize || size,\r\n }),\r\n \"min-w-0 border-0 flex-1 shrink-0 shadow-none rounded-md focus:z-10 focus-visible:z-10\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </ToggleGroupPrimitiveToggle>\r\n </ToggleHighlightPrimitive>\r\n )\r\n}\r\n\r\nexport {\r\n ToggleGroup,\r\n ToggleGroupItem,\r\n ToggleGroupItem as Toggle,\r\n type ToggleGroupProps,\r\n type ToggleGroupItemProps,\r\n}\r\n"]}
@@ -1,2 +1,2 @@
1
- import {c,d,e,f,g,a,h,i,j,k,l,m,n,o,p,q,r,s,E,t,u,v,w,x,y,z,A,B,C,D}from'./chunk-HHG7BSWN.js';import {a as a$3}from'./chunk-TED2PUK6.js';import {b}from'./chunk-Y6TKCAAJ.js';import {a as a$1}from'./chunk-7P4PFMCM.js';import {a as a$2}from'./chunk-XG3W7QMP.js';import {b as b$2,c as c$1,d as d$1}from'./chunk-WQABSLMR.js';import {b as b$1,e as e$1}from'./chunk-JLZNZFOO.js';import'react';import {SearchIcon,XIcon,Loader2Icon,CheckCircle2Icon}from'lucide-react';import {cn}from'@xploreu/lib/cn';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function wo(o){return jsx(c,{...o})}function io(o){let{className:t,...r}=o;return jsx(d,{className:cn("group/combobox-trigger flex items-center gap-2",t),...r})}function ko(o){let{className:t,...r}=o;return jsx(e,{className:cn("text-label-semibold-2 text-text-secondary",t),...r})}function Lo(o){let{className:t,...r}=o;return jsx(f,{className:cn("flex w-full items-center gap-2",t),...r})}function Ro({className:o,wrapperClassName:t,size:r="xs",...i}){return jsx("div",{className:cn("p-3 border-b border-border-primary",t),children:jsx(g,{className:o,render:jsx(b,{size:r,startContent:jsx(SearchIcon,{})}),...i})})}function So({className:o,displayValueKey:t={label:"label",value:"value"},placeholder:r="Search and Select Company",inputProps:i,size:m,...s}){let{inputValue:p,setInputValue:n}=a(),{className:x,startContent:to,...ro}=i||{};return jsx("div",{className:cn("flex flex-col gap-2",o),children:jsxs(so,{onMouseDown:C=>C.preventBaseUIHandler(),className:"flex-col",children:[jsx(g,{render:jsx(b,{className:cn("h-9 text-body-regular-3 pl-9 pr-7",x),endContent:jsx(io,{nativeButton:false,render:jsx(XIcon,{className:"!size-5 !right-1.5 data-[hidden=true]:opacity-0 opacity-100 transition-opacity duration-300 cursor-pointer","data-hidden":!p,"data-slot":"combobox-clear-input",onClick:C=>{n("",{reason:"none",event:C.nativeEvent,cancel:()=>{},allowPropagation:()=>{},isCanceled:false,isPropagationAllowed:true,trigger:void 0});}})}),placeholder:r,startContent:to??jsx(SearchIcon,{className:"!size-4 !text-fg-tertiary-hover"}),...ro}),...s}),jsx(mo,{children:C=>C?.map(y=>jsxs(po,{children:[y?.[t.label]||"",jsx(ao,{})]},y?.[t.value]||""))})]})})}function Go(o){let{className:t,...r}=o;return jsx(h,{className:cn("text-text-secondary",t),...r})}function Ao(o){return jsx(i,{render:jsx(XIcon,{}),...o})}function mo(o){return jsx(j,{...o})}function so({className:o,...t}){return jsx(k,{className:cn("flex flex-wrap gap-2",o),...t})}function po({className:o,...t}){return jsx(b$1,{className:cn("ring-1 ring-border-brand text-body-medium-3",o),color:"brand",render:jsx(l,{...t}),size:"lg"})}function ao({className:o,...t}){return jsx(e$1,{className:cn("text-fg-quaternary",o),render:jsx(m,{...t})})}function Ho({className:o$1,align:t="start",sideOffset:r=4,container:i,initialFocus:m,finalFocus:s,style:p$1,children:n$1,...x}){return jsx(n,{container:i,children:jsx(o,{align:t,className:"isolate z-50",sideOffset:r,...x,children:jsx(p,{className:cn("group/combobox-popup bg-bg-primary text-text-primary max-h-(--available-height) w-72 max-w-(--available-width) origin-(--transform-origin) rounded-md border border-border-primary shadow-md outline-hidden",o$1),finalFocus:s,initialFocus:m,style:p$1,children:jsx(no,{children:n$1})})})})}function zo(o){return jsx(n,{...o})}function Vo(o$1){return jsx(o,{...o$1})}function To(o){let{className:t,...r}=o;return jsx(q,{className:cn("bg-black/30",t),...r})}function Bo({className:o,status:t,...r$1}){let{inputValue:i}=a(),m=i?.toString().trim(),p=t==="empty"&&m?`No matches for "${m}".`:t==="empty"&&!m?"No results.":t==="pending"?jsxs(Fragment,{children:[jsx(Loader2Icon,{className:"animate-spin size-4"}),jsx("span",{children:"Searching..."})]}):null;return jsx(r,{className:cn("px-2 py-2.5 text-body-regular-2 text-text-disabled flex items-center gap-2",!p&&"hidden",o),...r$1,children:p})}function Eo({className:o,...t}){return jsx(s,{className:cn("px-3 py-2 text-body-regular-2 text-text-secondary",o),...t})}function Fo({className:o,children:t$1,...r}){let i=E();return jsx(a$1,{size:"sm",viewportRender:jsx(t,{className:cn("max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] flex flex-col p-1 focus-visible:outline-none data-[empty]:hidden",o),...r,children:typeof t$1=="function"?(m,s)=>t$1(m,s,i.length):t$1})})}function no(o){let{className:t,...r}=o;return jsx(u,{className:cn("absolute inset-0 bg-bg-primary-hover",t),...r})}function xo(o){return jsx(v,{...o})}function Mo(o){let{className:t,...r}=o;return jsx(w,{className:cn("group/combobox-row",t),...r})}function Do({className:o,children:t,indicator:r="check-circle",...i}){let{disabled:m}=i;return jsx(xo,{activeClassName:"bg-bg-primary-hover rounded-md",disabled:m,children:jsxs(x,{"data-indicator":r,className:cn("group/combobox-item relative grid grid-cols-[auto_1fr] items-center gap-x-2 my-px p-xp-md cursor-default outline-none select-none [[data-indicator=check-circle][data-selected]]:pr-8 data-[indicator=checkbox]:pl-8",o),...i,children:[t,jsx(Co,{className:"absolute group-data-[indicator=check-circle]/combobox-item:right-2 group-data-[indicator=checkbox]/combobox-item:left-2",keepMounted:r==="checkbox",render:(s,p)=>jsxs("span",{...s,children:[r==="check-circle"&&jsx(CheckCircle2Icon,{className:"size-4 text-fg-brand-primary shrink-0"}),r==="checkbox"&&jsx(a$2,{checked:p.selected})]})})]})})}function Oo({className:o,...t}){return jsx("span",{"data-slot":"combobox-item-title",className:cn("col-start-2 text-body-medium-3 text-text-primary truncate row-span-2 group-has-[[data-slot=combobox-item-description]]/combobox-item:row-span-1",o),...t})}function qo({className:o,...t}){return jsx("span",{"data-slot":"combobox-item-description",className:cn("col-start-2 text-body-regular-3 text-text-secondary truncate",o),...t})}function _o({className:o,...t}){return jsx("div",{"data-slot":"combobox-item-icon",className:cn("row-span-2 col-start-1 flex items-center justify-center size-6 rounded-md bg-bg-brand-solid text-fg-white shrink-0 [&_svg]:size-3.5",o),...t})}function jo({src:o,imageSrc:t,className:r,avatarClassName:i,imageAlt:m,fallbackText:s,children:p,...n}){let x=o??t;return jsx("div",{"data-slot":"combobox-item-avatar",className:cn("row-span-2 col-start-1 size-6 rounded-full overflow-hidden shrink-0",r),children:jsxs(b$2,{className:cn("size-full shrink-0",i),...n,children:[jsx(c$1,{alt:m,src:x}),jsx(d$1,{className:"flex aspect-square size-full items-center justify-center bg-bg-tertiary text-label-semibold-2 text-text-quaternary",children:s??p})]})})}function Co(o){return jsx(y,{...o})}function Uo(o){let{className:t,...r}=o;return jsx(z,{className:cn("my-1 h-px bg-border-primary",t),...r})}function Xo(o){let{className:t,...r}=o;return jsx(A,{className:cn("py-1",t),...r})}function $o(o){let{className:t,...r}=o;return jsx(B,{className:cn("px-3 py-1 text-body-semibold-sm text-text-secondary",t),...r})}function Jo(o){return jsx(C,{...o})}function Ko(o){let{className:t,...r}=o;return jsx(D,{className:cn("fill-bg-primary",t),...r})}function Qo({hasMore:o,threshold:t=.5,...r}){return jsx(a$3,{hasMore:o,threshold:t,...r,children:o&&jsxs("div",{className:"px-2 py-2.5 text-body-regular-2 text-text-disabled flex items-center gap-2",children:[jsx(Loader2Icon,{className:"animate-spin size-4"}),jsx("span",{children:"Loading more..."})]})})}export{jo as A,Co as B,Uo as C,Xo as D,$o as E,Jo as F,Ko as G,Qo as H,wo as a,io as b,ko as c,Lo as d,Ro as e,So as f,Go as g,Ao as h,mo as i,so as j,po as k,ao as l,Ho as m,zo as n,Vo as o,To as p,Bo as q,Eo as r,Fo as s,no as t,xo as u,Mo as v,Do as w,Oo as x,qo as y,_o as z};//# sourceMappingURL=chunk-R4XVXVLJ.js.map
2
- //# sourceMappingURL=chunk-R4XVXVLJ.js.map
1
+ import {c,d,e,f,g,a,h,i,j,k,l,m,n,o,p,q,r,s,E,t,u,v,w,x,y,z,A,B,C,D}from'./chunk-HHG7BSWN.js';import {a as a$3}from'./chunk-TED2PUK6.js';import {b}from'./chunk-Y6TKCAAJ.js';import {a as a$1}from'./chunk-7P4PFMCM.js';import {a as a$2}from'./chunk-XG3W7QMP.js';import {b as b$2,c as c$1,d as d$1}from'./chunk-WQABSLMR.js';import {b as b$1,e as e$1}from'./chunk-QQHSCREG.js';import'react';import {SearchIcon,XIcon,Loader2Icon,CheckCircle2Icon}from'lucide-react';import {cn}from'@xploreu/lib/cn';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function wo(o){return jsx(c,{...o})}function io(o){let{className:t,...r}=o;return jsx(d,{className:cn("group/combobox-trigger flex items-center gap-2",t),...r})}function ko(o){let{className:t,...r}=o;return jsx(e,{className:cn("text-label-semibold-2 text-text-secondary",t),...r})}function Lo(o){let{className:t,...r}=o;return jsx(f,{className:cn("flex w-full items-center gap-2",t),...r})}function Ro({className:o,wrapperClassName:t,size:r="xs",...i}){return jsx("div",{className:cn("p-3 border-b border-border-primary",t),children:jsx(g,{className:o,render:jsx(b,{size:r,startContent:jsx(SearchIcon,{})}),...i})})}function So({className:o,displayValueKey:t={label:"label",value:"value"},placeholder:r="Search and Select Company",inputProps:i,size:m,...s}){let{inputValue:p,setInputValue:n}=a(),{className:x,startContent:to,...ro}=i||{};return jsx("div",{className:cn("flex flex-col gap-2",o),children:jsxs(so,{onMouseDown:C=>C.preventBaseUIHandler(),className:"flex-col",children:[jsx(g,{render:jsx(b,{className:cn("h-9 text-body-regular-3 pl-9 pr-7",x),endContent:jsx(io,{nativeButton:false,render:jsx(XIcon,{className:"!size-5 !right-1.5 data-[hidden=true]:opacity-0 opacity-100 transition-opacity duration-300 cursor-pointer","data-hidden":!p,"data-slot":"combobox-clear-input",onClick:C=>{n("",{reason:"none",event:C.nativeEvent,cancel:()=>{},allowPropagation:()=>{},isCanceled:false,isPropagationAllowed:true,trigger:void 0});}})}),placeholder:r,startContent:to??jsx(SearchIcon,{className:"!size-4 !text-fg-tertiary-hover"}),...ro}),...s}),jsx(mo,{children:C=>C?.map(y=>jsxs(po,{children:[y?.[t.label]||"",jsx(ao,{})]},y?.[t.value]||""))})]})})}function Go(o){let{className:t,...r}=o;return jsx(h,{className:cn("text-text-secondary",t),...r})}function Ao(o){return jsx(i,{render:jsx(XIcon,{}),...o})}function mo(o){return jsx(j,{...o})}function so({className:o,...t}){return jsx(k,{className:cn("flex flex-wrap gap-2",o),...t})}function po({className:o,...t}){return jsx(b$1,{className:cn("ring-1 ring-border-brand text-body-medium-3",o),color:"brand",render:jsx(l,{...t}),size:"lg"})}function ao({className:o,...t}){return jsx(e$1,{className:cn("text-fg-quaternary",o),render:jsx(m,{...t})})}function Ho({className:o$1,align:t="start",sideOffset:r=4,container:i,initialFocus:m,finalFocus:s,style:p$1,children:n$1,...x}){return jsx(n,{container:i,children:jsx(o,{align:t,className:"isolate z-50",sideOffset:r,...x,children:jsx(p,{className:cn("group/combobox-popup bg-bg-primary text-text-primary max-h-(--available-height) w-72 max-w-(--available-width) origin-(--transform-origin) rounded-md border border-border-primary shadow-md outline-hidden",o$1),finalFocus:s,initialFocus:m,style:p$1,children:jsx(no,{children:n$1})})})})}function zo(o){return jsx(n,{...o})}function Vo(o$1){return jsx(o,{...o$1})}function To(o){let{className:t,...r}=o;return jsx(q,{className:cn("bg-black/30",t),...r})}function Bo({className:o,status:t,...r$1}){let{inputValue:i}=a(),m=i?.toString().trim(),p=t==="empty"&&m?`No matches for "${m}".`:t==="empty"&&!m?"No results.":t==="pending"?jsxs(Fragment,{children:[jsx(Loader2Icon,{className:"animate-spin size-4"}),jsx("span",{children:"Searching..."})]}):null;return jsx(r,{className:cn("px-2 py-2.5 text-body-regular-2 text-text-disabled flex items-center gap-2",!p&&"hidden",o),...r$1,children:p})}function Eo({className:o,...t}){return jsx(s,{className:cn("px-3 py-2 text-body-regular-2 text-text-secondary",o),...t})}function Fo({className:o,children:t$1,...r}){let i=E();return jsx(a$1,{size:"sm",viewportRender:jsx(t,{className:cn("max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] flex flex-col p-1 focus-visible:outline-none data-[empty]:hidden",o),...r,children:typeof t$1=="function"?(m,s)=>t$1(m,s,i.length):t$1})})}function no(o){let{className:t,...r}=o;return jsx(u,{className:cn("absolute inset-0 bg-bg-primary-hover",t),...r})}function xo(o){return jsx(v,{...o})}function Mo(o){let{className:t,...r}=o;return jsx(w,{className:cn("group/combobox-row",t),...r})}function Do({className:o,children:t,indicator:r="check-circle",...i}){let{disabled:m}=i;return jsx(xo,{activeClassName:"bg-bg-primary-hover rounded-md",disabled:m,children:jsxs(x,{"data-indicator":r,className:cn("group/combobox-item relative grid grid-cols-[auto_1fr] items-center gap-x-2 my-px p-xp-md cursor-default outline-none select-none [[data-indicator=check-circle][data-selected]]:pr-8 data-[indicator=checkbox]:pl-8",o),...i,children:[t,jsx(Co,{className:"absolute group-data-[indicator=check-circle]/combobox-item:right-2 group-data-[indicator=checkbox]/combobox-item:left-2",keepMounted:r==="checkbox",render:(s,p)=>jsxs("span",{...s,children:[r==="check-circle"&&jsx(CheckCircle2Icon,{className:"size-4 text-fg-brand-primary shrink-0"}),r==="checkbox"&&jsx(a$2,{checked:p.selected})]})})]})})}function Oo({className:o,...t}){return jsx("span",{"data-slot":"combobox-item-title",className:cn("col-start-2 text-body-medium-3 text-text-primary truncate row-span-2 group-has-[[data-slot=combobox-item-description]]/combobox-item:row-span-1",o),...t})}function qo({className:o,...t}){return jsx("span",{"data-slot":"combobox-item-description",className:cn("col-start-2 text-body-regular-3 text-text-secondary truncate",o),...t})}function _o({className:o,...t}){return jsx("div",{"data-slot":"combobox-item-icon",className:cn("row-span-2 col-start-1 flex items-center justify-center size-6 rounded-md bg-bg-brand-solid text-fg-white shrink-0 [&_svg]:size-3.5",o),...t})}function jo({src:o,imageSrc:t,className:r,avatarClassName:i,imageAlt:m,fallbackText:s,children:p,...n}){let x=o??t;return jsx("div",{"data-slot":"combobox-item-avatar",className:cn("row-span-2 col-start-1 size-6 rounded-full overflow-hidden shrink-0",r),children:jsxs(b$2,{className:cn("size-full shrink-0",i),...n,children:[jsx(c$1,{alt:m,src:x}),jsx(d$1,{className:"flex aspect-square size-full items-center justify-center bg-bg-tertiary text-label-semibold-2 text-text-quaternary",children:s??p})]})})}function Co(o){return jsx(y,{...o})}function Uo(o){let{className:t,...r}=o;return jsx(z,{className:cn("my-1 h-px bg-border-primary",t),...r})}function Xo(o){let{className:t,...r}=o;return jsx(A,{className:cn("py-1",t),...r})}function $o(o){let{className:t,...r}=o;return jsx(B,{className:cn("px-3 py-1 text-body-semibold-sm text-text-secondary",t),...r})}function Jo(o){return jsx(C,{...o})}function Ko(o){let{className:t,...r}=o;return jsx(D,{className:cn("fill-bg-primary",t),...r})}function Qo({hasMore:o,threshold:t=.5,...r}){return jsx(a$3,{hasMore:o,threshold:t,...r,children:o&&jsxs("div",{className:"px-2 py-2.5 text-body-regular-2 text-text-disabled flex items-center gap-2",children:[jsx(Loader2Icon,{className:"animate-spin size-4"}),jsx("span",{children:"Loading more..."})]})})}export{jo as A,Co as B,Uo as C,Xo as D,$o as E,Jo as F,Ko as G,Qo as H,wo as a,io as b,ko as c,Lo as d,Ro as e,So as f,Go as g,Ao as h,mo as i,so as j,po as k,ao as l,Ho as m,zo as n,Vo as o,To as p,Bo as q,Eo as r,Fo as s,no as t,xo as u,Mo as v,Do as w,Oo as x,qo as y,_o as z};//# sourceMappingURL=chunk-ILE3MBTR.js.map
2
+ //# sourceMappingURL=chunk-ILE3MBTR.js.map