@exulu/frontend 1.8.0 → 1.9.0

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 (146) hide show
  1. package/dist/.next/BUILD_ID +1 -1
  2. package/dist/.next/app-build-manifest.json +129 -131
  3. package/dist/.next/app-path-routes-manifest.json +1 -1
  4. package/dist/.next/build-manifest.json +2 -2
  5. package/dist/.next/prerender-manifest.json +1 -1
  6. package/dist/.next/server/app/(application)/agents/edit/[id]/page.js +1 -1
  7. package/dist/.next/server/app/(application)/agents/edit/[id]/page.js.nft.json +1 -1
  8. package/dist/.next/server/app/(application)/agents/edit/[id]/page_client-reference-manifest.js +1 -1
  9. package/dist/.next/server/app/(application)/agents/page_client-reference-manifest.js +1 -1
  10. package/dist/.next/server/app/(application)/chat/[agent]/[session]/page.js +7 -7
  11. package/dist/.next/server/app/(application)/chat/[agent]/[session]/page.js.nft.json +1 -1
  12. package/dist/.next/server/app/(application)/chat/[agent]/[session]/page_client-reference-manifest.js +1 -1
  13. package/dist/.next/server/app/(application)/chat/[agent]/page_client-reference-manifest.js +1 -1
  14. package/dist/.next/server/app/(application)/chat/page_client-reference-manifest.js +1 -1
  15. package/dist/.next/server/app/(application)/configuration/page_client-reference-manifest.js +1 -1
  16. package/dist/.next/server/app/(application)/dashboard/page_client-reference-manifest.js +1 -1
  17. package/dist/.next/server/app/(application)/data/[[...query]]/page.js +4 -4
  18. package/dist/.next/server/app/(application)/data/[[...query]]/page.js.nft.json +1 -1
  19. package/dist/.next/server/app/(application)/data/[[...query]]/page_client-reference-manifest.js +1 -1
  20. package/dist/.next/server/app/(application)/evals/[id]/page.js +1 -1
  21. package/dist/.next/server/app/(application)/evals/[id]/page.js.nft.json +1 -1
  22. package/dist/.next/server/app/(application)/evals/[id]/page_client-reference-manifest.js +1 -1
  23. package/dist/.next/server/app/(application)/evals/cases/page.js +1 -1
  24. package/dist/.next/server/app/(application)/evals/cases/page.js.nft.json +1 -1
  25. package/dist/.next/server/app/(application)/evals/cases/page_client-reference-manifest.js +1 -1
  26. package/dist/.next/server/app/(application)/evals/page_client-reference-manifest.js +1 -1
  27. package/dist/.next/server/app/(application)/explorer/page_client-reference-manifest.js +1 -1
  28. package/dist/.next/server/app/(application)/keys/page_client-reference-manifest.js +1 -1
  29. package/dist/.next/server/app/(application)/page_client-reference-manifest.js +1 -1
  30. package/dist/.next/server/app/(application)/projects/[project]/page.js +1 -1
  31. package/dist/.next/server/app/(application)/projects/[project]/page.js.nft.json +1 -1
  32. package/dist/.next/server/app/(application)/projects/[project]/page_client-reference-manifest.js +1 -1
  33. package/dist/.next/server/app/(application)/projects/page.js +1 -1
  34. package/dist/.next/server/app/(application)/projects/page_client-reference-manifest.js +1 -1
  35. package/dist/.next/server/app/(application)/prompts/page.js +1 -1
  36. package/dist/.next/server/app/(application)/prompts/page_client-reference-manifest.js +1 -1
  37. package/dist/.next/server/app/(application)/roles/page_client-reference-manifest.js +1 -1
  38. package/dist/.next/server/app/(application)/token/page_client-reference-manifest.js +1 -1
  39. package/dist/.next/server/app/(application)/users/page_client-reference-manifest.js +1 -1
  40. package/dist/.next/server/app/(application)/variables/create/page_client-reference-manifest.js +1 -1
  41. package/dist/.next/server/app/(application)/variables/edit/[variable_id]/page_client-reference-manifest.js +1 -1
  42. package/dist/.next/server/app/(application)/variables/page_client-reference-manifest.js +1 -1
  43. package/dist/.next/server/app/(application)/variables/usage/[variable_id]/page_client-reference-manifest.js +1 -1
  44. package/dist/.next/server/app/(application)/workflows/page.js +1 -1
  45. package/dist/.next/server/app/(application)/workflows/page_client-reference-manifest.js +1 -1
  46. package/dist/.next/server/app/(authentication)/login/page_client-reference-manifest.js +1 -1
  47. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  48. package/dist/.next/server/app/_not-found.html +1 -1
  49. package/dist/.next/server/app/_not-found.rsc +1 -1
  50. package/dist/.next/server/app-paths-manifest.json +6 -6
  51. package/dist/.next/server/chunks/1025.js +1 -0
  52. package/dist/.next/server/chunks/2270.js +11 -48
  53. package/dist/.next/server/chunks/3434.js +1 -1
  54. package/dist/.next/server/chunks/3503.js +1 -0
  55. package/dist/.next/server/chunks/5084.js +1 -0
  56. package/dist/.next/server/chunks/5192.js +1 -1
  57. package/dist/.next/server/chunks/5485.js +1 -1
  58. package/dist/.next/server/chunks/5600.js +1 -1
  59. package/dist/.next/server/chunks/5974.js +1 -0
  60. package/dist/.next/server/chunks/6590.js +1 -1
  61. package/dist/.next/server/chunks/7471.js +1 -1
  62. package/dist/.next/server/chunks/8286.js +1 -1
  63. package/dist/.next/server/chunks/{3679.js → 9874.js} +5 -5
  64. package/dist/.next/server/middleware-manifest.json +5 -5
  65. package/dist/.next/server/pages/404.html +1 -1
  66. package/dist/.next/server/pages/500.html +1 -1
  67. package/dist/.next/server/server-reference-manifest.json +1 -1
  68. package/dist/.next/static/chunks/1685-939396dad2f8f1e0.js +2 -0
  69. package/dist/.next/static/chunks/1685-939396dad2f8f1e0.js.map +1 -0
  70. package/dist/.next/static/chunks/{4811-316807e25b634f9f.js → 192-72d6868cd891ccc6.js} +8 -8
  71. package/dist/.next/static/chunks/192-72d6868cd891ccc6.js.map +1 -0
  72. package/dist/.next/static/chunks/1957-cf44b1d31a9c7d5c.js +2 -0
  73. package/dist/.next/static/chunks/1957-cf44b1d31a9c7d5c.js.map +1 -0
  74. package/dist/.next/static/chunks/342-d9c2d6ae9f9435cb.js +2 -0
  75. package/dist/.next/static/chunks/342-d9c2d6ae9f9435cb.js.map +1 -0
  76. package/dist/.next/static/chunks/552-39155a93c527ec6d.js +2 -0
  77. package/dist/.next/static/chunks/552-39155a93c527ec6d.js.map +1 -0
  78. package/dist/.next/static/chunks/6367-59655a85d75e19be.js +2 -0
  79. package/dist/.next/static/chunks/6367-59655a85d75e19be.js.map +1 -0
  80. package/dist/.next/static/chunks/6373-601400fab8a3bb55.js +2 -0
  81. package/dist/.next/static/chunks/6373-601400fab8a3bb55.js.map +1 -0
  82. package/dist/.next/static/chunks/8030-9c926ea4dfd3a54e.js +2 -0
  83. package/dist/.next/static/chunks/8030-9c926ea4dfd3a54e.js.map +1 -0
  84. package/dist/.next/static/chunks/{6805-792cc8008b165c07.js → 8293-0e69d89d2dac7111.js} +10 -10
  85. package/dist/.next/static/chunks/8293-0e69d89d2dac7111.js.map +1 -0
  86. package/dist/.next/static/chunks/9953-95900a236271a222.js +2 -0
  87. package/dist/.next/static/chunks/9953-95900a236271a222.js.map +1 -0
  88. package/dist/.next/static/chunks/app/(application)/agents/edit/[id]/page-e4a4693953329671.js +2 -0
  89. package/dist/.next/static/chunks/app/(application)/agents/edit/[id]/page-e4a4693953329671.js.map +1 -0
  90. package/dist/.next/static/chunks/app/(application)/chat/[agent]/[session]/page-7edb1c7c850f982c.js +2 -0
  91. package/dist/.next/static/chunks/app/(application)/chat/[agent]/[session]/page-7edb1c7c850f982c.js.map +1 -0
  92. package/dist/.next/static/chunks/app/(application)/data/[[...query]]/page-8d2b3995cacfd832.js +2 -0
  93. package/dist/.next/static/chunks/app/(application)/data/[[...query]]/page-8d2b3995cacfd832.js.map +1 -0
  94. package/dist/.next/static/chunks/app/(application)/evals/[id]/page-a7728cf9b0524489.js +2 -0
  95. package/dist/.next/static/chunks/app/(application)/evals/[id]/page-a7728cf9b0524489.js.map +1 -0
  96. package/dist/.next/static/chunks/app/(application)/evals/cases/{page-a39fef7444581565.js → page-827f50c6d1f150d0.js} +2 -2
  97. package/dist/.next/static/chunks/app/(application)/evals/cases/{page-a39fef7444581565.js.map → page-827f50c6d1f150d0.js.map} +1 -1
  98. package/dist/.next/static/chunks/app/(application)/projects/[project]/page-f04fd5291a1ef7b1.js +2 -0
  99. package/dist/.next/static/chunks/app/(application)/projects/[project]/page-f04fd5291a1ef7b1.js.map +1 -0
  100. package/dist/.next/static/chunks/app/(application)/prompts/page-2c500e9898447506.js +2 -0
  101. package/dist/.next/static/chunks/app/(application)/prompts/page-2c500e9898447506.js.map +1 -0
  102. package/dist/.next/static/chunks/app/(application)/workflows/{page-47dedb88cec600d5.js → page-e38f9456120dab69.js} +2 -2
  103. package/dist/.next/static/chunks/app/(application)/workflows/page-e38f9456120dab69.js.map +1 -0
  104. package/dist/.next/static/css/6f8c5212af8ef284.css +4 -0
  105. package/dist/.next/static/css/6f8c5212af8ef284.css.map +1 -0
  106. package/dist/.next/static/css/e3f2a16ab7676b05.css.map +1 -1
  107. package/package.json +1 -1
  108. package/dist/.next/server/chunks/2948.js +0 -1
  109. package/dist/.next/server/chunks/38.js +0 -1
  110. package/dist/.next/server/chunks/7958.js +0 -1
  111. package/dist/.next/server/chunks/8050.js +0 -1
  112. package/dist/.next/static/chunks/1685-9cacdee7e3f0942f.js +0 -2
  113. package/dist/.next/static/chunks/1685-9cacdee7e3f0942f.js.map +0 -1
  114. package/dist/.next/static/chunks/1957-39a01a3915f246ab.js +0 -2
  115. package/dist/.next/static/chunks/1957-39a01a3915f246ab.js.map +0 -1
  116. package/dist/.next/static/chunks/4811-316807e25b634f9f.js.map +0 -1
  117. package/dist/.next/static/chunks/5282-68f9880f1f951f44.js +0 -2
  118. package/dist/.next/static/chunks/5282-68f9880f1f951f44.js.map +0 -1
  119. package/dist/.next/static/chunks/6367-59cef3c74213925b.js +0 -2
  120. package/dist/.next/static/chunks/6367-59cef3c74213925b.js.map +0 -1
  121. package/dist/.next/static/chunks/6373-4c5dffaf4193621c.js +0 -2
  122. package/dist/.next/static/chunks/6373-4c5dffaf4193621c.js.map +0 -1
  123. package/dist/.next/static/chunks/6805-792cc8008b165c07.js.map +0 -1
  124. package/dist/.next/static/chunks/8030-c1b6be46253076cb.js +0 -2
  125. package/dist/.next/static/chunks/8030-c1b6be46253076cb.js.map +0 -1
  126. package/dist/.next/static/chunks/9621-f81c4d7c0ecf5a67.js +0 -2
  127. package/dist/.next/static/chunks/9621-f81c4d7c0ecf5a67.js.map +0 -1
  128. package/dist/.next/static/chunks/9953-dfb5fc0e5b74ec09.js +0 -2
  129. package/dist/.next/static/chunks/9953-dfb5fc0e5b74ec09.js.map +0 -1
  130. package/dist/.next/static/chunks/app/(application)/agents/edit/[id]/page-4e7e02768ed1a72a.js +0 -2
  131. package/dist/.next/static/chunks/app/(application)/agents/edit/[id]/page-4e7e02768ed1a72a.js.map +0 -1
  132. package/dist/.next/static/chunks/app/(application)/chat/[agent]/[session]/page-38f845d5ccdad76b.js +0 -2
  133. package/dist/.next/static/chunks/app/(application)/chat/[agent]/[session]/page-38f845d5ccdad76b.js.map +0 -1
  134. package/dist/.next/static/chunks/app/(application)/data/[[...query]]/page-a391b8407f74e9b4.js +0 -2
  135. package/dist/.next/static/chunks/app/(application)/data/[[...query]]/page-a391b8407f74e9b4.js.map +0 -1
  136. package/dist/.next/static/chunks/app/(application)/evals/[id]/page-cf6f8d2bd4e9c819.js +0 -2
  137. package/dist/.next/static/chunks/app/(application)/evals/[id]/page-cf6f8d2bd4e9c819.js.map +0 -1
  138. package/dist/.next/static/chunks/app/(application)/projects/[project]/page-bc859da58d8505f7.js +0 -2
  139. package/dist/.next/static/chunks/app/(application)/projects/[project]/page-bc859da58d8505f7.js.map +0 -1
  140. package/dist/.next/static/chunks/app/(application)/prompts/page-d2f36ff149385efd.js +0 -2
  141. package/dist/.next/static/chunks/app/(application)/prompts/page-d2f36ff149385efd.js.map +0 -1
  142. package/dist/.next/static/chunks/app/(application)/workflows/page-47dedb88cec600d5.js.map +0 -1
  143. package/dist/.next/static/css/c8c015815c72d053.css +0 -4
  144. package/dist/.next/static/css/c8c015815c72d053.css.map +0 -1
  145. /package/dist/.next/static/{GOwerAkBncYx0J8q1TqQb → ls-syPkq9-MWp-VWWDEZJ}/_buildManifest.js +0 -0
  146. /package/dist/.next/static/{GOwerAkBncYx0J8q1TqQb → ls-syPkq9-MWp-VWWDEZJ}/_ssgManifest.js +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5282],{42488:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("Activity",[["path",{d:"M22 12h-4l-3 9L9 3l-3 9H2",key:"d5dnw9"}]])},31047:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("Calendar",[["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",ry:"2",key:"eu3xkr"}],["line",{x1:"16",x2:"16",y1:"2",y2:"6",key:"m3sa8f"}],["line",{x1:"8",x2:"8",y1:"2",y2:"6",key:"18kwsl"}],["line",{x1:"3",x2:"21",y1:"10",y2:"10",key:"xt86sb"}]])},24156:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("ChevronsUpDown",[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]])},91723:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]])},14924:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]])},29202:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]])},25846:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]])},66337:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]])},53417:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]])},17684:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("MoreVertical",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"12",cy:"5",r:"1",key:"gxeob9"}],["circle",{cx:"12",cy:"19",r:"1",key:"lyex9k"}]])},15868:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("SquarePen",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z",key:"1lpok0"}]])},31810:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("ThumbsUp",[["path",{d:"M7 10v12",key:"1qc93n"}],["path",{d:"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z",key:"y3tblf"}]])},92369:function(t,e,a){a.d(e,{Z:function(){return r}});let r=(0,a(39763).Z)("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]])},88985:function(t,e,a){a.d(e,{zF:function(){return b},Fw:function(){return k},wy:function(){return w},fC:function(){return M}});var r=a(2265);"undefined"!=typeof window&&window.document&&window.document.createElement;var o=a(73966),n=a(80886),s=a(61188),i=a(98575),d=a(66840),l=t=>{var e,a;let o,n;let{present:d,children:l}=t,u=function(t){var e,a;let[o,n]=r.useState(),i=r.useRef(null),d=r.useRef(t),l=r.useRef("none"),[u,h]=(e=t?"mounted":"unmounted",a={mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}},r.useReducer((t,e)=>{let r=a[t][e];return null!=r?r:t},e));return r.useEffect(()=>{let t=c(i.current);l.current="mounted"===u?t:"none"},[u]),(0,s.b)(()=>{let e=i.current,a=d.current;if(a!==t){let r=l.current,o=c(e);t?h("MOUNT"):"none"===o||(null==e?void 0:e.display)==="none"?h("UNMOUNT"):a&&r!==o?h("ANIMATION_OUT"):h("UNMOUNT"),d.current=t}},[t,h]),(0,s.b)(()=>{if(o){var t;let e;let a=null!==(t=o.ownerDocument.defaultView)&&void 0!==t?t:window,r=t=>{let r=c(i.current).includes(CSS.escape(t.animationName));if(t.target===o&&r&&(h("ANIMATION_END"),!d.current)){let t=o.style.animationFillMode;o.style.animationFillMode="forwards",e=a.setTimeout(()=>{"forwards"===o.style.animationFillMode&&(o.style.animationFillMode=t)})}},n=t=>{t.target===o&&(l.current=c(i.current))};return o.addEventListener("animationstart",n),o.addEventListener("animationcancel",r),o.addEventListener("animationend",r),()=>{a.clearTimeout(e),o.removeEventListener("animationstart",n),o.removeEventListener("animationcancel",r),o.removeEventListener("animationend",r)}}h("ANIMATION_END")},[o,h]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:r.useCallback(t=>{i.current=t?getComputedStyle(t):null,n(t)},[])}}(d),h="function"==typeof l?l({present:u.isPresent}):r.Children.only(l),f=(0,i.e)(u.ref,(o=null===(e=Object.getOwnPropertyDescriptor(h.props,"ref"))||void 0===e?void 0:e.get)&&"isReactWarning"in o&&o.isReactWarning?h.ref:(o=null===(a=Object.getOwnPropertyDescriptor(h,"ref"))||void 0===a?void 0:a.get)&&"isReactWarning"in o&&o.isReactWarning?h.props.ref:h.props.ref||h.ref);return"function"==typeof l||u.isPresent?r.cloneElement(h,{ref:f}):null};function c(t){return(null==t?void 0:t.animationName)||"none"}l.displayName="Presence";var u=a(99255),h=a(57437),f="Collapsible",[p,m]=(0,o.b)(f),[g,y]=p(f),b=r.forwardRef((t,e)=>{let{__scopeCollapsible:a,open:o,defaultOpen:s,disabled:i,onOpenChange:l,...c}=t,[p,m]=(0,n.T)({prop:o,defaultProp:null!=s&&s,onChange:l,caller:f});return(0,h.jsx)(g,{scope:a,disabled:i,contentId:(0,u.M)(),open:p,onOpenToggle:r.useCallback(()=>m(t=>!t),[m]),children:(0,h.jsx)(d.WV.div,{"data-state":T(p),"data-disabled":i?"":void 0,...c,ref:e})})});b.displayName=f;var v="CollapsibleTrigger",w=r.forwardRef((t,e)=>{let{__scopeCollapsible:a,...r}=t,o=y(v,a);return(0,h.jsx)(d.WV.button,{type:"button","aria-controls":o.contentId,"aria-expanded":o.open||!1,"data-state":T(o.open),"data-disabled":o.disabled?"":void 0,disabled:o.disabled,...r,ref:e,onClick:function(t,e,{checkForDefaultPrevented:a=!0}={}){return function(r){if(t?.(r),!1===a||!r.defaultPrevented)return e?.(r)}}(t.onClick,o.onOpenToggle)})});w.displayName=v;var x="CollapsibleContent",k=r.forwardRef((t,e)=>{let{forceMount:a,...r}=t,o=y(x,t.__scopeCollapsible);return(0,h.jsx)(l,{present:a||o.open,children:t=>{let{present:a}=t;return(0,h.jsx)(N,{...r,ref:e,present:a})}})});k.displayName=x;var N=r.forwardRef((t,e)=>{let{__scopeCollapsible:a,present:o,children:n,...l}=t,c=y(x,a),[u,f]=r.useState(o),p=r.useRef(null),m=(0,i.e)(e,p),g=r.useRef(0),b=g.current,v=r.useRef(0),w=v.current,k=c.open||u,N=r.useRef(k),M=r.useRef(void 0);return r.useEffect(()=>{let t=requestAnimationFrame(()=>N.current=!1);return()=>cancelAnimationFrame(t)},[]),(0,s.b)(()=>{let t=p.current;if(t){M.current=M.current||{transitionDuration:t.style.transitionDuration,animationName:t.style.animationName},t.style.transitionDuration="0s",t.style.animationName="none";let e=t.getBoundingClientRect();g.current=e.height,v.current=e.width,N.current||(t.style.transitionDuration=M.current.transitionDuration,t.style.animationName=M.current.animationName),f(o)}},[c.open,o]),(0,h.jsx)(d.WV.div,{"data-state":T(c.open),"data-disabled":c.disabled?"":void 0,id:c.contentId,hidden:!k,...l,ref:m,style:{"--radix-collapsible-content-height":b?"".concat(b,"px"):void 0,"--radix-collapsible-content-width":w?"".concat(w,"px"):void 0,...t.style},children:k&&n})});function T(t){return t?"open":"closed"}var M=b},14438:function(t,e,a){a.d(e,{Am:function(){return i}});var r=a(2265);a(54887),Array(12).fill(0);var o=1,n=new class{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{let e=this.subscribers.indexOf(t);this.subscribers.splice(e,1)}),this.publish=t=>{this.subscribers.forEach(e=>e(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var e;let{message:a,...r}=t,n="number"==typeof(null==t?void 0:t.id)||(null==(e=t.id)?void 0:e.length)>0?t.id:o++,s=this.toasts.find(t=>t.id===n),i=void 0===t.dismissible||t.dismissible;return this.dismissedToasts.has(n)&&this.dismissedToasts.delete(n),s?this.toasts=this.toasts.map(e=>e.id===n?(this.publish({...e,...t,id:n,title:a}),{...e,...t,id:n,dismissible:i,title:a}):e):this.addToast({title:a,...r,dismissible:i,id:n}),n},this.dismiss=t=>(this.dismissedToasts.add(t),t||this.toasts.forEach(t=>{this.subscribers.forEach(e=>e({id:t.id,dismiss:!0}))}),this.subscribers.forEach(e=>e({id:t,dismiss:!0})),t),this.message=(t,e)=>this.create({...e,message:t}),this.error=(t,e)=>this.create({...e,message:t,type:"error"}),this.success=(t,e)=>this.create({...e,type:"success",message:t}),this.info=(t,e)=>this.create({...e,type:"info",message:t}),this.warning=(t,e)=>this.create({...e,type:"warning",message:t}),this.loading=(t,e)=>this.create({...e,type:"loading",message:t}),this.promise=(t,e)=>{let a;if(!e)return;void 0!==e.loading&&(a=this.create({...e,promise:t,type:"loading",message:e.loading,description:"function"!=typeof e.description?e.description:void 0}));let o=t instanceof Promise?t:t(),n=void 0!==a,i,d=o.then(async t=>{if(i=["resolve",t],r.isValidElement(t))n=!1,this.create({id:a,type:"default",message:t});else if(s(t)&&!t.ok){n=!1;let r="function"==typeof e.error?await e.error("HTTP error! status: ".concat(t.status)):e.error,o="function"==typeof e.description?await e.description("HTTP error! status: ".concat(t.status)):e.description;this.create({id:a,type:"error",message:r,description:o})}else if(void 0!==e.success){n=!1;let r="function"==typeof e.success?await e.success(t):e.success,o="function"==typeof e.description?await e.description(t):e.description;this.create({id:a,type:"success",message:r,description:o})}}).catch(async t=>{if(i=["reject",t],void 0!==e.error){n=!1;let r="function"==typeof e.error?await e.error(t):e.error,o="function"==typeof e.description?await e.description(t):e.description;this.create({id:a,type:"error",message:r,description:o})}}).finally(()=>{var t;n&&(this.dismiss(a),a=void 0),null==(t=e.finally)||t.call(e)}),l=()=>new Promise((t,e)=>d.then(()=>"reject"===i[0]?e(i[1]):t(i[1])).catch(e));return"string"!=typeof a&&"number"!=typeof a?{unwrap:l}:Object.assign(a,{unwrap:l})},this.custom=(t,e)=>{let a=(null==e?void 0:e.id)||o++;return this.create({jsx:t(a),id:a,...e}),a},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},s=t=>t&&"object"==typeof t&&"ok"in t&&"boolean"==typeof t.ok&&"status"in t&&"number"==typeof t.status,i=Object.assign((t,e)=>{let a=(null==e?void 0:e.id)||o++;return n.addToast({title:t,...e,id:a}),a},{success:n.success,info:n.info,warning:n.warning,error:n.error,custom:n.custom,message:n.message,promise:n.promise,dismiss:n.dismiss,loading:n.loading},{getHistory:()=>n.toasts,getToasts:()=>n.getActiveToasts()});!function(t){let{insertAt:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t||"undefined"==typeof document)return;let a=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===e&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=t:r.appendChild(document.createTextNode(t))}(':where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted="true"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted="true"]){transform:none}}:where([data-sonner-toaster][data-x-position="right"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position="left"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\n')}}]);
2
- //# sourceMappingURL=5282-68f9880f1f951f44.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/chunks/5282-68f9880f1f951f44.js","mappings":"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","sources":["webpack://_N_E/../../../src/icons/activity.ts","webpack://_N_E/../../../src/icons/calendar.ts","webpack://_N_E/../../../src/icons/chevrons-up-down.ts","webpack://_N_E/../../../src/icons/clock.ts","webpack://_N_E/../../../src/icons/folder.ts","webpack://_N_E/../../../src/icons/globe.ts","webpack://_N_E/../../../src/icons/lightbulb.ts","webpack://_N_E/../../../src/icons/lock.ts","webpack://_N_E/../../../src/icons/message-square.ts","webpack://_N_E/../../../src/icons/more-vertical.ts","webpack://_N_E/../../../src/icons/square-pen.ts","webpack://_N_E/../../../src/icons/thumbs-up.ts","webpack://_N_E/../../../src/icons/user.ts","webpack://_N_E/./node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive/dist/index.mjs","webpack://_N_E/../src/presence.tsx","webpack://_N_E/../src/use-state-machine.tsx","webpack://_N_E/../src/collapsible.tsx","webpack://_N_E/../src/index.tsx","webpack://_N_E/../src/assets.tsx","webpack://_N_E/../src/hooks.tsx","webpack://_N_E/../src/state.ts","webpack://_N_E/#style-inject:#style-inject","webpack://_N_E/../src/styles.css","webpack://_N_E/../src/types.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Activity\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTJoLTRsLTMgOUw5IDNsLTMgOUgyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Activity = createLucideIcon('Activity', [\n ['path', { d: 'M22 12h-4l-3 9L9 3l-3 9H2', key: 'd5dnw9' }],\n]);\n\nexport default Activity;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Calendar\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjQiIHJ4PSIyIiByeT0iMiIgLz4KICA8bGluZSB4MT0iMTYiIHgyPSIxNiIgeTE9IjIiIHkyPSI2IiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iOCIgeTE9IjIiIHkyPSI2IiAvPgogIDxsaW5lIHgxPSIzIiB4Mj0iMjEiIHkxPSIxMCIgeTI9IjEwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/calendar\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Calendar = createLucideIcon('Calendar', [\n ['rect', { width: '18', height: '18', x: '3', y: '4', rx: '2', ry: '2', key: 'eu3xkr' }],\n ['line', { x1: '16', x2: '16', y1: '2', y2: '6', key: 'm3sa8f' }],\n ['line', { x1: '8', x2: '8', y1: '2', y2: '6', key: '18kwsl' }],\n ['line', { x1: '3', x2: '21', y1: '10', y2: '10', key: 'xt86sb' }],\n]);\n\nexport default Calendar;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronsUpDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNyAxNSA1IDUgNS01IiAvPgogIDxwYXRoIGQ9Im03IDkgNS01IDUgNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevrons-up-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronsUpDown = createLucideIcon('ChevronsUpDown', [\n ['path', { d: 'm7 15 5 5 5-5', key: '1hf1tw' }],\n ['path', { d: 'm7 9 5-5 5 5', key: 'sgt6xg' }],\n]);\n\nexport default ChevronsUpDown;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Clock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cG9seWxpbmUgcG9pbnRzPSIxMiA2IDEyIDEyIDE2IDE0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/clock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Clock = createLucideIcon('Clock', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['polyline', { points: '12 6 12 12 16 14', key: '68esgv' }],\n]);\n\nexport default Clock;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Folder\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/folder\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Folder = createLucideIcon('Folder', [\n [\n 'path',\n {\n d: 'M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z',\n key: '1kt360',\n },\n ],\n]);\n\nexport default Folder;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Globe\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMmExNC41IDE0LjUgMCAwIDAgMCAyMCAxNC41IDE0LjUgMCAwIDAgMC0yMCIgLz4KICA8cGF0aCBkPSJNMiAxMmgyMCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/globe\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Globe = createLucideIcon('Globe', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20', key: '13o1zl' }],\n ['path', { d: 'M2 12h20', key: '9i4pu4' }],\n]);\n\nexport default Globe;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Lightbulb\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMTRjLjItMSAuNy0xLjcgMS41LTIuNSAxLS45IDEuNS0yLjIgMS41LTMuNUE2IDYgMCAwIDAgNiA4YzAgMSAuMiAyLjIgMS41IDMuNS43LjcgMS4zIDEuNSAxLjUgMi41IiAvPgogIDxwYXRoIGQ9Ik05IDE4aDYiIC8+CiAgPHBhdGggZD0iTTEwIDIyaDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/lightbulb\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Lightbulb = createLucideIcon('Lightbulb', [\n [\n 'path',\n {\n d: 'M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5',\n key: '1gvzjb',\n },\n ],\n ['path', { d: 'M9 18h6', key: 'x1upvd' }],\n ['path', { d: 'M10 22h4', key: 'ceow96' }],\n]);\n\nexport default Lightbulb;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Lock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/lock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Lock = createLucideIcon('Lock', [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 10 0v4', key: 'fwvmzm' }],\n]);\n\nexport default Lock;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name MessageSquare\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTVhMiAyIDAgMCAxLTIgMkg3bC00IDRWNWEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/message-square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MessageSquare = createLucideIcon('MessageSquare', [\n ['path', { d: 'M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z', key: '1lielz' }],\n]);\n\nexport default MessageSquare;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name MoreVertical\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iNSIgcj0iMSIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/more-vertical\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MoreVertical = createLucideIcon('MoreVertical', [\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '12', cy: '5', r: '1', key: 'gxeob9' }],\n ['circle', { cx: '12', cy: '19', r: '1', key: 'lyex9k' }],\n]);\n\nexport default MoreVertical;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name SquarePen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM0g1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0ydi03IiAvPgogIDxwYXRoIGQ9Ik0xOC4zNzUgMi42MjVhMi4xMjEgMi4xMjEgMCAxIDEgMyAzTDEyIDE1bC00IDEgMS00WiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/square-pen\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquarePen = createLucideIcon('SquarePen', [\n ['path', { d: 'M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7', key: '1m0v6g' }],\n ['path', { d: 'M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z', key: '1lpok0' }],\n]);\n\nexport default SquarePen;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ThumbsUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNyAxMHYxMiIgLz4KICA8cGF0aCBkPSJNMTUgNS44OCAxNCAxMGg1LjgzYTIgMiAwIDAgMSAxLjkyIDIuNTZsLTIuMzMgOEEyIDIgMCAwIDEgMTcuNSAyMkg0YTIgMiAwIDAgMS0yLTJ2LThhMiAyIDAgMCAxIDItMmgyLjc2YTIgMiAwIDAgMCAxLjc5LTEuMTFMMTIgMmgwYTMuMTMgMy4xMyAwIDAgMSAzIDMuODhaIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/thumbs-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ThumbsUp = createLucideIcon('ThumbsUp', [\n ['path', { d: 'M7 10v12', key: '1qc93n' }],\n [\n 'path',\n {\n d: 'M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z',\n key: 'y3tblf',\n },\n ],\n]);\n\nexport default ThumbsUp;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name User\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTkgMjF2LTJhNCA0IDAgMCAwLTQtNEg5YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjciIHI9IjQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/user\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst User = createLucideIcon('User', [\n ['path', { d: 'M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2', key: '975kel' }],\n ['circle', { cx: '12', cy: '7', r: '4', key: '17ys0d' }],\n]);\n\nexport default User;\n","// src/primitive.tsx\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nfunction composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {\n return function handleEvent(event) {\n originalEventHandler?.(event);\n if (checkForDefaultPrevented === false || !event.defaultPrevented) {\n return ourEventHandler?.(event);\n }\n };\n}\nfunction getOwnerWindow(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access window outside of the DOM\");\n }\n return element?.ownerDocument?.defaultView ?? window;\n}\nfunction getOwnerDocument(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access document outside of the DOM\");\n }\n return element?.ownerDocument ?? document;\n}\nfunction getActiveElement(node, activeDescendant = false) {\n const { activeElement } = getOwnerDocument(node);\n if (!activeElement?.nodeName) {\n return null;\n }\n if (isFrame(activeElement) && activeElement.contentDocument) {\n return getActiveElement(activeElement.contentDocument.body, activeDescendant);\n }\n if (activeDescendant) {\n const id = activeElement.getAttribute(\"aria-activedescendant\");\n if (id) {\n const element = getOwnerDocument(activeElement).getElementById(id);\n if (element) {\n return element;\n }\n }\n }\n return activeElement;\n}\nfunction isFrame(element) {\n return element.tagName === \"IFRAME\";\n}\nexport {\n canUseDOM,\n composeEventHandlers,\n getActiveElement,\n getOwnerDocument,\n getOwnerWindow,\n isFrame\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\nimport { useStateMachine } from './use-state-machine';\n\ninterface PresenceProps {\n children: React.ReactElement | ((props: { present: boolean }) => React.ReactElement);\n present: boolean;\n}\n\nconst Presence: React.FC<PresenceProps> = (props) => {\n const { present, children } = props;\n const presence = usePresence(present);\n\n const child = (\n typeof children === 'function'\n ? children({ present: presence.isPresent })\n : React.Children.only(children)\n ) as React.ReactElement<{ ref?: React.Ref<HTMLElement> }>;\n\n const ref = useComposedRefs(presence.ref, getElementRef(child));\n const forceMount = typeof children === 'function';\n return forceMount || presence.isPresent ? React.cloneElement(child, { ref }) : null;\n};\n\nPresence.displayName = 'Presence';\n\n/* -------------------------------------------------------------------------------------------------\n * usePresence\n * -----------------------------------------------------------------------------------------------*/\n\nfunction usePresence(present: boolean) {\n const [node, setNode] = React.useState<HTMLElement>();\n const stylesRef = React.useRef<CSSStyleDeclaration | null>(null);\n const prevPresentRef = React.useRef(present);\n const prevAnimationNameRef = React.useRef<string>('none');\n const initialState = present ? 'mounted' : 'unmounted';\n const [state, send] = useStateMachine(initialState, {\n mounted: {\n UNMOUNT: 'unmounted',\n ANIMATION_OUT: 'unmountSuspended',\n },\n unmountSuspended: {\n MOUNT: 'mounted',\n ANIMATION_END: 'unmounted',\n },\n unmounted: {\n MOUNT: 'mounted',\n },\n });\n\n React.useEffect(() => {\n const currentAnimationName = getAnimationName(stylesRef.current);\n prevAnimationNameRef.current = state === 'mounted' ? currentAnimationName : 'none';\n }, [state]);\n\n useLayoutEffect(() => {\n const styles = stylesRef.current;\n const wasPresent = prevPresentRef.current;\n const hasPresentChanged = wasPresent !== present;\n\n if (hasPresentChanged) {\n const prevAnimationName = prevAnimationNameRef.current;\n const currentAnimationName = getAnimationName(styles);\n\n if (present) {\n send('MOUNT');\n } else if (currentAnimationName === 'none' || styles?.display === 'none') {\n // If there is no exit animation or the element is hidden, animations won't run\n // so we unmount instantly\n send('UNMOUNT');\n } else {\n /**\n * When `present` changes to `false`, we check changes to animation-name to\n * determine whether an animation has started. We chose this approach (reading\n * computed styles) because there is no `animationrun` event and `animationstart`\n * fires after `animation-delay` has expired which would be too late.\n */\n const isAnimating = prevAnimationName !== currentAnimationName;\n\n if (wasPresent && isAnimating) {\n send('ANIMATION_OUT');\n } else {\n send('UNMOUNT');\n }\n }\n\n prevPresentRef.current = present;\n }\n }, [present, send]);\n\n useLayoutEffect(() => {\n if (node) {\n let timeoutId: number;\n const ownerWindow = node.ownerDocument.defaultView ?? window;\n /**\n * Triggering an ANIMATION_OUT during an ANIMATION_IN will fire an `animationcancel`\n * event for ANIMATION_IN after we have entered `unmountSuspended` state. So, we\n * make sure we only trigger ANIMATION_END for the currently active animation.\n */\n const handleAnimationEnd = (event: AnimationEvent) => {\n const currentAnimationName = getAnimationName(stylesRef.current);\n // The event.animationName is unescaped for CSS syntax,\n // so we need to escape it to compare with the animationName computed from the style.\n const isCurrentAnimation = currentAnimationName.includes(CSS.escape(event.animationName));\n if (event.target === node && isCurrentAnimation) {\n // With React 18 concurrency this update is applied a frame after the\n // animation ends, creating a flash of visible content. By setting the\n // animation fill mode to \"forwards\", we force the node to keep the\n // styles of the last keyframe, removing the flash.\n //\n // Previously we flushed the update via ReactDom.flushSync, but with\n // exit animations this resulted in the node being removed from the\n // DOM before the synthetic animationEnd event was dispatched, meaning\n // user-provided event handlers would not be called.\n // https://github.com/radix-ui/primitives/pull/1849\n send('ANIMATION_END');\n if (!prevPresentRef.current) {\n const currentFillMode = node.style.animationFillMode;\n node.style.animationFillMode = 'forwards';\n // Reset the style after the node had time to unmount (for cases\n // where the component chooses not to unmount). Doing this any\n // sooner than `setTimeout` (e.g. with `requestAnimationFrame`)\n // still causes a flash.\n timeoutId = ownerWindow.setTimeout(() => {\n if (node.style.animationFillMode === 'forwards') {\n node.style.animationFillMode = currentFillMode;\n }\n });\n }\n }\n };\n const handleAnimationStart = (event: AnimationEvent) => {\n if (event.target === node) {\n // if animation occurred, store its name as the previous animation.\n prevAnimationNameRef.current = getAnimationName(stylesRef.current);\n }\n };\n node.addEventListener('animationstart', handleAnimationStart);\n node.addEventListener('animationcancel', handleAnimationEnd);\n node.addEventListener('animationend', handleAnimationEnd);\n return () => {\n ownerWindow.clearTimeout(timeoutId);\n node.removeEventListener('animationstart', handleAnimationStart);\n node.removeEventListener('animationcancel', handleAnimationEnd);\n node.removeEventListener('animationend', handleAnimationEnd);\n };\n } else {\n // Transition to the unmounted state if the node is removed prematurely.\n // We avoid doing so during cleanup as the node may change but still exist.\n send('ANIMATION_END');\n }\n }, [node, send]);\n\n return {\n isPresent: ['mounted', 'unmountSuspended'].includes(state),\n ref: React.useCallback((node: HTMLElement) => {\n stylesRef.current = node ? getComputedStyle(node) : null;\n setNode(node);\n }, []),\n };\n}\n\n/* -----------------------------------------------------------------------------------------------*/\n\nfunction getAnimationName(styles: CSSStyleDeclaration | null) {\n return styles?.animationName || 'none';\n}\n\n// Before React 19 accessing `element.props.ref` will throw a warning and suggest using `element.ref`\n// After React 19 accessing `element.ref` does the opposite.\n// https://github.com/facebook/react/pull/28348\n//\n// Access the ref using the method that doesn't yield a warning.\nfunction getElementRef(element: React.ReactElement<{ ref?: React.Ref<unknown> }>) {\n // React <=18 in DEV\n let getter = Object.getOwnPropertyDescriptor(element.props, 'ref')?.get;\n let mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return (element as any).ref;\n }\n\n // React 19 in DEV\n getter = Object.getOwnPropertyDescriptor(element, 'ref')?.get;\n mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n\n // Not DEV\n return element.props.ref || (element as any).ref;\n}\n\nconst Root = Presence;\n\nexport {\n Presence,\n //\n Root,\n};\nexport type { PresenceProps };\n","import * as React from 'react';\n\ntype Machine<S> = { [k: string]: { [k: string]: S } };\ntype MachineState<T> = keyof T;\ntype MachineEvent<T> = keyof UnionToIntersection<T[keyof T]>;\n\n// 🤯 https://fettblog.eu/typescript-union-to-intersection/\ntype UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any\n ? R\n : never;\n\nexport function useStateMachine<M>(\n initialState: MachineState<M>,\n machine: M & Machine<MachineState<M>>\n) {\n return React.useReducer((state: MachineState<M>, event: MachineEvent<M>): MachineState<M> => {\n const nextState = (machine[state] as any)[event];\n return nextState ?? state;\n }, initialState);\n}\n","import * as React from 'react';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Presence } from '@radix-ui/react-presence';\nimport { useId } from '@radix-ui/react-id';\n\nimport type { Scope } from '@radix-ui/react-context';\n\n/* -------------------------------------------------------------------------------------------------\n * Collapsible\n * -----------------------------------------------------------------------------------------------*/\n\nconst COLLAPSIBLE_NAME = 'Collapsible';\n\ntype ScopedProps<P> = P & { __scopeCollapsible?: Scope };\nconst [createCollapsibleContext, createCollapsibleScope] = createContextScope(COLLAPSIBLE_NAME);\n\ntype CollapsibleContextValue = {\n contentId: string;\n disabled?: boolean;\n open: boolean;\n onOpenToggle(): void;\n};\n\nconst [CollapsibleProvider, useCollapsibleContext] =\n createCollapsibleContext<CollapsibleContextValue>(COLLAPSIBLE_NAME);\n\ntype CollapsibleElement = React.ComponentRef<typeof Primitive.div>;\ntype PrimitiveDivProps = React.ComponentPropsWithoutRef<typeof Primitive.div>;\ninterface CollapsibleProps extends PrimitiveDivProps {\n defaultOpen?: boolean;\n open?: boolean;\n disabled?: boolean;\n onOpenChange?(open: boolean): void;\n}\n\nconst Collapsible = React.forwardRef<CollapsibleElement, CollapsibleProps>(\n (props: ScopedProps<CollapsibleProps>, forwardedRef) => {\n const {\n __scopeCollapsible,\n open: openProp,\n defaultOpen,\n disabled,\n onOpenChange,\n ...collapsibleProps\n } = props;\n\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: COLLAPSIBLE_NAME,\n });\n\n return (\n <CollapsibleProvider\n scope={__scopeCollapsible}\n disabled={disabled}\n contentId={useId()}\n open={open}\n onOpenToggle={React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen])}\n >\n <Primitive.div\n data-state={getState(open)}\n data-disabled={disabled ? '' : undefined}\n {...collapsibleProps}\n ref={forwardedRef}\n />\n </CollapsibleProvider>\n );\n }\n);\n\nCollapsible.displayName = COLLAPSIBLE_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * CollapsibleTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'CollapsibleTrigger';\n\ntype CollapsibleTriggerElement = React.ComponentRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = React.ComponentPropsWithoutRef<typeof Primitive.button>;\ninterface CollapsibleTriggerProps extends PrimitiveButtonProps {}\n\nconst CollapsibleTrigger = React.forwardRef<CollapsibleTriggerElement, CollapsibleTriggerProps>(\n (props: ScopedProps<CollapsibleTriggerProps>, forwardedRef) => {\n const { __scopeCollapsible, ...triggerProps } = props;\n const context = useCollapsibleContext(TRIGGER_NAME, __scopeCollapsible);\n return (\n <Primitive.button\n type=\"button\"\n aria-controls={context.contentId}\n aria-expanded={context.open || false}\n data-state={getState(context.open)}\n data-disabled={context.disabled ? '' : undefined}\n disabled={context.disabled}\n {...triggerProps}\n ref={forwardedRef}\n onClick={composeEventHandlers(props.onClick, context.onOpenToggle)}\n />\n );\n }\n);\n\nCollapsibleTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * CollapsibleContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'CollapsibleContent';\n\ntype CollapsibleContentElement = CollapsibleContentImplElement;\ninterface CollapsibleContentProps extends Omit<CollapsibleContentImplProps, 'present'> {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n}\n\nconst CollapsibleContent = React.forwardRef<CollapsibleContentElement, CollapsibleContentProps>(\n (props: ScopedProps<CollapsibleContentProps>, forwardedRef) => {\n const { forceMount, ...contentProps } = props;\n const context = useCollapsibleContext(CONTENT_NAME, props.__scopeCollapsible);\n return (\n <Presence present={forceMount || context.open}>\n {({ present }) => (\n <CollapsibleContentImpl {...contentProps} ref={forwardedRef} present={present} />\n )}\n </Presence>\n );\n }\n);\n\nCollapsibleContent.displayName = CONTENT_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype CollapsibleContentImplElement = React.ComponentRef<typeof Primitive.div>;\ninterface CollapsibleContentImplProps extends PrimitiveDivProps {\n present: boolean;\n}\n\nconst CollapsibleContentImpl = React.forwardRef<\n CollapsibleContentImplElement,\n CollapsibleContentImplProps\n>((props: ScopedProps<CollapsibleContentImplProps>, forwardedRef) => {\n const { __scopeCollapsible, present, children, ...contentProps } = props;\n const context = useCollapsibleContext(CONTENT_NAME, __scopeCollapsible);\n const [isPresent, setIsPresent] = React.useState(present);\n const ref = React.useRef<CollapsibleContentImplElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const heightRef = React.useRef<number | undefined>(0);\n const height = heightRef.current;\n const widthRef = React.useRef<number | undefined>(0);\n const width = widthRef.current;\n // when opening we want it to immediately open to retrieve dimensions\n // when closing we delay `present` to retrieve dimensions before closing\n const isOpen = context.open || isPresent;\n const isMountAnimationPreventedRef = React.useRef(isOpen);\n const originalStylesRef = React.useRef<Record<string, string>>(undefined);\n\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => (isMountAnimationPreventedRef.current = false));\n return () => cancelAnimationFrame(rAF);\n }, []);\n\n useLayoutEffect(() => {\n const node = ref.current;\n if (node) {\n originalStylesRef.current = originalStylesRef.current || {\n transitionDuration: node.style.transitionDuration,\n animationName: node.style.animationName,\n };\n // block any animations/transitions so the element renders at its full dimensions\n node.style.transitionDuration = '0s';\n node.style.animationName = 'none';\n\n // get width and height from full dimensions\n const rect = node.getBoundingClientRect();\n heightRef.current = rect.height;\n widthRef.current = rect.width;\n\n // kick off any animations/transitions that were originally set up if it isn't the initial mount\n if (!isMountAnimationPreventedRef.current) {\n node.style.transitionDuration = originalStylesRef.current.transitionDuration!;\n node.style.animationName = originalStylesRef.current.animationName!;\n }\n\n setIsPresent(present);\n }\n /**\n * depends on `context.open` because it will change to `false`\n * when a close is triggered but `present` will be `false` on\n * animation end (so when close finishes). This allows us to\n * retrieve the dimensions *before* closing.\n */\n }, [context.open, present]);\n\n return (\n <Primitive.div\n data-state={getState(context.open)}\n data-disabled={context.disabled ? '' : undefined}\n id={context.contentId}\n hidden={!isOpen}\n {...contentProps}\n ref={composedRefs}\n style={{\n [`--radix-collapsible-content-height` as any]: height ? `${height}px` : undefined,\n [`--radix-collapsible-content-width` as any]: width ? `${width}px` : undefined,\n ...props.style,\n }}\n >\n {isOpen && children}\n </Primitive.div>\n );\n});\n\n/* -----------------------------------------------------------------------------------------------*/\n\nfunction getState(open?: boolean) {\n return open ? 'open' : 'closed';\n}\n\nconst Root = Collapsible;\nconst Trigger = CollapsibleTrigger;\nconst Content = CollapsibleContent;\n\nexport {\n createCollapsibleScope,\n //\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n //\n Root,\n Trigger,\n Content,\n};\nexport type { CollapsibleProps, CollapsibleTriggerProps, CollapsibleContentProps };\n","'use client';\n\nimport React, { forwardRef, isValidElement } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { CloseIcon, getAsset, Loader } from './assets';\nimport { useIsDocumentHidden } from './hooks';\nimport { toast, ToastState } from './state';\nimport './styles.css';\nimport {\n isAction,\n SwipeDirection,\n type ExternalToast,\n type HeightT,\n type ToasterProps,\n type ToastProps,\n type ToastT,\n type ToastToDismiss,\n} from './types';\n\n// Visible toasts amount\nconst VISIBLE_TOASTS_AMOUNT = 3;\n\n// Viewport padding\nconst VIEWPORT_OFFSET = '32px';\n\n// Mobile viewport padding\nconst MOBILE_VIEWPORT_OFFSET = '16px';\n\n// Default lifetime of a toasts (in ms)\nconst TOAST_LIFETIME = 4000;\n\n// Default toast width\nconst TOAST_WIDTH = 356;\n\n// Default gap between toasts\nconst GAP = 14;\n\n// Threshold to dismiss a toast\nconst SWIPE_THRESHOLD = 20;\n\n// Equal to exit animation duration\nconst TIME_BEFORE_UNMOUNT = 200;\n\nfunction cn(...classes: (string | undefined)[]) {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction getDefaultSwipeDirections(position: string): Array<SwipeDirection> {\n const [y, x] = position.split('-');\n const directions: Array<SwipeDirection> = [];\n\n if (y) {\n directions.push(y as SwipeDirection);\n }\n\n if (x) {\n directions.push(x as SwipeDirection);\n }\n\n return directions;\n}\n\nconst Toast = (props: ToastProps) => {\n const {\n invert: ToasterInvert,\n toast,\n unstyled,\n interacting,\n setHeights,\n visibleToasts,\n heights,\n index,\n toasts,\n expanded,\n removeToast,\n defaultRichColors,\n closeButton: closeButtonFromToaster,\n style,\n cancelButtonStyle,\n actionButtonStyle,\n className = '',\n descriptionClassName = '',\n duration: durationFromToaster,\n position,\n gap,\n loadingIcon: loadingIconProp,\n expandByDefault,\n classNames,\n icons,\n closeButtonAriaLabel = 'Close toast',\n pauseWhenPageIsHidden,\n } = props;\n const [swipeDirection, setSwipeDirection] = React.useState<'x' | 'y' | null>(null);\n const [swipeOutDirection, setSwipeOutDirection] = React.useState<'left' | 'right' | 'up' | 'down' | null>(null);\n const [mounted, setMounted] = React.useState(false);\n const [removed, setRemoved] = React.useState(false);\n const [swiping, setSwiping] = React.useState(false);\n const [swipeOut, setSwipeOut] = React.useState(false);\n const [isSwiped, setIsSwiped] = React.useState(false);\n const [offsetBeforeRemove, setOffsetBeforeRemove] = React.useState(0);\n const [initialHeight, setInitialHeight] = React.useState(0);\n const remainingTime = React.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);\n const dragStartTime = React.useRef<Date | null>(null);\n const toastRef = React.useRef<HTMLLIElement>(null);\n const isFront = index === 0;\n const isVisible = index + 1 <= visibleToasts;\n const toastType = toast.type;\n const dismissible = toast.dismissible !== false;\n const toastClassname = toast.className || '';\n const toastDescriptionClassname = toast.descriptionClassName || '';\n // Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n const heightIndex = React.useMemo(\n () => heights.findIndex((height) => height.toastId === toast.id) || 0,\n [heights, toast.id],\n );\n const closeButton = React.useMemo(\n () => toast.closeButton ?? closeButtonFromToaster,\n [toast.closeButton, closeButtonFromToaster],\n );\n const duration = React.useMemo(\n () => toast.duration || durationFromToaster || TOAST_LIFETIME,\n [toast.duration, durationFromToaster],\n );\n const closeTimerStartTimeRef = React.useRef(0);\n const offset = React.useRef(0);\n const lastCloseTimerStartTimeRef = React.useRef(0);\n const pointerStartRef = React.useRef<{ x: number; y: number } | null>(null);\n const [y, x] = position.split('-');\n const toastsHeightBefore = React.useMemo(() => {\n return heights.reduce((prev, curr, reducerIndex) => {\n // Calculate offset up until current toast\n if (reducerIndex >= heightIndex) {\n return prev;\n }\n\n return prev + curr.height;\n }, 0);\n }, [heights, heightIndex]);\n const isDocumentHidden = useIsDocumentHidden();\n\n const invert = toast.invert || ToasterInvert;\n const disabled = toastType === 'loading';\n\n offset.current = React.useMemo(() => heightIndex * gap + toastsHeightBefore, [heightIndex, toastsHeightBefore]);\n\n React.useEffect(() => {\n remainingTime.current = duration;\n }, [duration]);\n\n React.useEffect(() => {\n // Trigger enter animation without using CSS animation\n setMounted(true);\n }, []);\n\n React.useEffect(() => {\n const toastNode = toastRef.current;\n if (toastNode) {\n const height = toastNode.getBoundingClientRect().height;\n // Add toast height to heights array after the toast is mounted\n setInitialHeight(height);\n setHeights((h) => [{ toastId: toast.id, height, position: toast.position }, ...h]);\n return () => setHeights((h) => h.filter((height) => height.toastId !== toast.id));\n }\n }, [setHeights, toast.id]);\n\n React.useLayoutEffect(() => {\n if (!mounted) return;\n const toastNode = toastRef.current;\n const originalHeight = toastNode.style.height;\n toastNode.style.height = 'auto';\n const newHeight = toastNode.getBoundingClientRect().height;\n toastNode.style.height = originalHeight;\n\n setInitialHeight(newHeight);\n\n setHeights((heights) => {\n const alreadyExists = heights.find((height) => height.toastId === toast.id);\n if (!alreadyExists) {\n return [{ toastId: toast.id, height: newHeight, position: toast.position }, ...heights];\n } else {\n return heights.map((height) => (height.toastId === toast.id ? { ...height, height: newHeight } : height));\n }\n });\n }, [mounted, toast.title, toast.description, setHeights, toast.id]);\n\n const deleteToast = React.useCallback(() => {\n // Save the offset for the exit swipe animation\n setRemoved(true);\n setOffsetBeforeRemove(offset.current);\n setHeights((h) => h.filter((height) => height.toastId !== toast.id));\n\n setTimeout(() => {\n removeToast(toast);\n }, TIME_BEFORE_UNMOUNT);\n }, [toast, removeToast, setHeights, offset]);\n\n React.useEffect(() => {\n if ((toast.promise && toastType === 'loading') || toast.duration === Infinity || toast.type === 'loading') return;\n let timeoutId: NodeJS.Timeout;\n\n // Pause the timer on each hover\n const pauseTimer = () => {\n if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {\n // Get the elapsed time since the timer started\n const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;\n\n remainingTime.current = remainingTime.current - elapsedTime;\n }\n\n lastCloseTimerStartTimeRef.current = new Date().getTime();\n };\n\n const startTimer = () => {\n // setTimeout(, Infinity) behaves as if the delay is 0.\n // As a result, the toast would be closed immediately, giving the appearance that it was never rendered.\n // See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout\n if (remainingTime.current === Infinity) return;\n\n closeTimerStartTimeRef.current = new Date().getTime();\n\n // Let the toast know it has started\n timeoutId = setTimeout(() => {\n toast.onAutoClose?.(toast);\n deleteToast();\n }, remainingTime.current);\n };\n\n if (expanded || interacting || (pauseWhenPageIsHidden && isDocumentHidden)) {\n pauseTimer();\n } else {\n startTimer();\n }\n\n return () => clearTimeout(timeoutId);\n }, [expanded, interacting, toast, toastType, pauseWhenPageIsHidden, isDocumentHidden, deleteToast]);\n\n React.useEffect(() => {\n if (toast.delete) {\n deleteToast();\n }\n }, [deleteToast, toast.delete]);\n\n function getLoadingIcon() {\n if (icons?.loading) {\n return (\n <div\n className={cn(classNames?.loader, toast?.classNames?.loader, 'sonner-loader')}\n data-visible={toastType === 'loading'}\n >\n {icons.loading}\n </div>\n );\n }\n\n if (loadingIconProp) {\n return (\n <div\n className={cn(classNames?.loader, toast?.classNames?.loader, 'sonner-loader')}\n data-visible={toastType === 'loading'}\n >\n {loadingIconProp}\n </div>\n );\n }\n return <Loader className={cn(classNames?.loader, toast?.classNames?.loader)} visible={toastType === 'loading'} />;\n }\n\n return (\n <li\n tabIndex={0}\n ref={toastRef}\n className={cn(\n className,\n toastClassname,\n classNames?.toast,\n toast?.classNames?.toast,\n classNames?.default,\n classNames?.[toastType],\n toast?.classNames?.[toastType],\n )}\n data-sonner-toast=\"\"\n data-rich-colors={toast.richColors ?? defaultRichColors}\n data-styled={!Boolean(toast.jsx || toast.unstyled || unstyled)}\n data-mounted={mounted}\n data-promise={Boolean(toast.promise)}\n data-swiped={isSwiped}\n data-removed={removed}\n data-visible={isVisible}\n data-y-position={y}\n data-x-position={x}\n data-index={index}\n data-front={isFront}\n data-swiping={swiping}\n data-dismissible={dismissible}\n data-type={toastType}\n data-invert={invert}\n data-swipe-out={swipeOut}\n data-swipe-direction={swipeOutDirection}\n data-expanded={Boolean(expanded || (expandByDefault && mounted))}\n style={\n {\n '--index': index,\n '--toasts-before': index,\n '--z-index': toasts.length - index,\n '--offset': `${removed ? offsetBeforeRemove : offset.current}px`,\n '--initial-height': expandByDefault ? 'auto' : `${initialHeight}px`,\n ...style,\n ...toast.style,\n } as React.CSSProperties\n }\n onDragEnd={() => {\n setSwiping(false);\n setSwipeDirection(null);\n pointerStartRef.current = null;\n }}\n onPointerDown={(event) => {\n if (disabled || !dismissible) return;\n dragStartTime.current = new Date();\n setOffsetBeforeRemove(offset.current);\n // Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n if ((event.target as HTMLElement).tagName === 'BUTTON') return;\n setSwiping(true);\n pointerStartRef.current = { x: event.clientX, y: event.clientY };\n }}\n onPointerUp={() => {\n if (swipeOut || !dismissible) return;\n\n pointerStartRef.current = null;\n const swipeAmountX = Number(\n toastRef.current?.style.getPropertyValue('--swipe-amount-x').replace('px', '') || 0,\n );\n const swipeAmountY = Number(\n toastRef.current?.style.getPropertyValue('--swipe-amount-y').replace('px', '') || 0,\n );\n const timeTaken = new Date().getTime() - dragStartTime.current?.getTime();\n\n const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n const velocity = Math.abs(swipeAmount) / timeTaken;\n\n if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n setOffsetBeforeRemove(offset.current);\n toast.onDismiss?.(toast);\n\n if (swipeDirection === 'x') {\n setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');\n } else {\n setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');\n }\n\n deleteToast();\n setSwipeOut(true);\n setIsSwiped(false);\n return;\n }\n\n setSwiping(false);\n setSwipeDirection(null);\n }}\n onPointerMove={(event) => {\n if (!pointerStartRef.current || !dismissible) return;\n\n const isHighlighted = window.getSelection()?.toString().length > 0;\n if (isHighlighted) return;\n\n const yDelta = event.clientY - pointerStartRef.current.y;\n const xDelta = event.clientX - pointerStartRef.current.x;\n\n const swipeDirections = props.swipeDirections ?? getDefaultSwipeDirections(position);\n\n // Determine swipe direction if not already locked\n if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n }\n\n let swipeAmount = { x: 0, y: 0 };\n\n // Only apply swipe in the locked direction\n if (swipeDirection === 'y') {\n // Handle vertical swipes\n if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {\n if (swipeDirections.includes('top') && yDelta < 0) {\n swipeAmount.y = yDelta;\n } else if (swipeDirections.includes('bottom') && yDelta > 0) {\n swipeAmount.y = yDelta;\n }\n }\n } else if (swipeDirection === 'x') {\n // Handle horizontal swipes\n if (swipeDirections.includes('left') || swipeDirections.includes('right')) {\n if (swipeDirections.includes('left') && xDelta < 0) {\n swipeAmount.x = xDelta;\n } else if (swipeDirections.includes('right') && xDelta > 0) {\n swipeAmount.x = xDelta;\n }\n }\n }\n\n if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n setIsSwiped(true);\n }\n\n // Apply transform using both x and y values\n toastRef.current?.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);\n toastRef.current?.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);\n }}\n >\n {closeButton && !toast.jsx ? (\n <button\n aria-label={closeButtonAriaLabel}\n data-disabled={disabled}\n data-close-button\n onClick={\n disabled || !dismissible\n ? () => {}\n : () => {\n deleteToast();\n toast.onDismiss?.(toast);\n }\n }\n className={cn(classNames?.closeButton, toast?.classNames?.closeButton)}\n >\n {icons?.close ?? CloseIcon}\n </button>\n ) : null}\n {/* TODO: This can be cleaner */}\n {toast.jsx || isValidElement(toast.title) ? (\n toast.jsx ? (\n toast.jsx\n ) : typeof toast.title === 'function' ? (\n toast.title()\n ) : (\n toast.title\n )\n ) : (\n <>\n {toastType || toast.icon || toast.promise ? (\n <div data-icon=\"\" className={cn(classNames?.icon, toast?.classNames?.icon)}>\n {toast.promise || (toast.type === 'loading' && !toast.icon) ? toast.icon || getLoadingIcon() : null}\n {toast.type !== 'loading' ? toast.icon || icons?.[toastType] || getAsset(toastType) : null}\n </div>\n ) : null}\n\n <div data-content=\"\" className={cn(classNames?.content, toast?.classNames?.content)}>\n <div data-title=\"\" className={cn(classNames?.title, toast?.classNames?.title)}>\n {typeof toast.title === 'function' ? toast.title() : toast.title}\n </div>\n {toast.description ? (\n <div\n data-description=\"\"\n className={cn(\n descriptionClassName,\n toastDescriptionClassname,\n classNames?.description,\n toast?.classNames?.description,\n )}\n >\n {typeof toast.description === 'function' ? toast.description() : toast.description}\n </div>\n ) : null}\n </div>\n {isValidElement(toast.cancel) ? (\n toast.cancel\n ) : toast.cancel && isAction(toast.cancel) ? (\n <button\n data-button\n data-cancel\n style={toast.cancelButtonStyle || cancelButtonStyle}\n onClick={(event) => {\n // We need to check twice because typescript\n if (!isAction(toast.cancel)) return;\n if (!dismissible) return;\n toast.cancel.onClick?.(event);\n deleteToast();\n }}\n className={cn(classNames?.cancelButton, toast?.classNames?.cancelButton)}\n >\n {toast.cancel.label}\n </button>\n ) : null}\n {isValidElement(toast.action) ? (\n toast.action\n ) : toast.action && isAction(toast.action) ? (\n <button\n data-button\n data-action\n style={toast.actionButtonStyle || actionButtonStyle}\n onClick={(event) => {\n // We need to check twice because typescript\n if (!isAction(toast.action)) return;\n toast.action.onClick?.(event);\n if (event.defaultPrevented) return;\n deleteToast();\n }}\n className={cn(classNames?.actionButton, toast?.classNames?.actionButton)}\n >\n {toast.action.label}\n </button>\n ) : null}\n </>\n )}\n </li>\n );\n};\n\nfunction getDocumentDirection(): ToasterProps['dir'] {\n if (typeof window === 'undefined') return 'ltr';\n if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n\n const dirAttribute = document.documentElement.getAttribute('dir');\n\n if (dirAttribute === 'auto' || !dirAttribute) {\n return window.getComputedStyle(document.documentElement).direction as ToasterProps['dir'];\n }\n\n return dirAttribute as ToasterProps['dir'];\n}\n\nfunction assignOffset(defaultOffset: ToasterProps['offset'], mobileOffset: ToasterProps['mobileOffset']) {\n const styles = {} as React.CSSProperties;\n\n [defaultOffset, mobileOffset].forEach((offset, index) => {\n const isMobile = index === 1;\n const prefix = isMobile ? '--mobile-offset' : '--offset';\n const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;\n\n function assignAll(offset: string | number) {\n ['top', 'right', 'bottom', 'left'].forEach((key) => {\n styles[`${prefix}-${key}`] = typeof offset === 'number' ? `${offset}px` : offset;\n });\n }\n\n if (typeof offset === 'number' || typeof offset === 'string') {\n assignAll(offset);\n } else if (typeof offset === 'object') {\n ['top', 'right', 'bottom', 'left'].forEach((key) => {\n if (offset[key] === undefined) {\n styles[`${prefix}-${key}`] = defaultValue;\n } else {\n styles[`${prefix}-${key}`] = typeof offset[key] === 'number' ? `${offset[key]}px` : offset[key];\n }\n });\n } else {\n assignAll(defaultValue);\n }\n });\n\n return styles;\n}\n\nfunction useSonner() {\n const [activeToasts, setActiveToasts] = React.useState<ToastT[]>([]);\n\n React.useEffect(() => {\n return ToastState.subscribe((toast) => {\n if ((toast as ToastToDismiss).dismiss) {\n setTimeout(() => {\n ReactDOM.flushSync(() => {\n setActiveToasts((toasts) => toasts.filter((t) => t.id !== toast.id));\n });\n });\n return;\n }\n\n // Prevent batching, temp solution.\n setTimeout(() => {\n ReactDOM.flushSync(() => {\n setActiveToasts((toasts) => {\n const indexOfExistingToast = toasts.findIndex((t) => t.id === toast.id);\n\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n { ...toasts[indexOfExistingToast], ...toast },\n ...toasts.slice(indexOfExistingToast + 1),\n ];\n }\n\n return [toast, ...toasts];\n });\n });\n });\n });\n }, []);\n\n return {\n toasts: activeToasts,\n };\n}\n\nconst Toaster = forwardRef<HTMLElement, ToasterProps>(function Toaster(props, ref) {\n const {\n invert,\n position = 'bottom-right',\n hotkey = ['altKey', 'KeyT'],\n expand,\n closeButton,\n className,\n offset,\n mobileOffset,\n theme = 'light',\n richColors,\n duration,\n style,\n visibleToasts = VISIBLE_TOASTS_AMOUNT,\n toastOptions,\n dir = getDocumentDirection(),\n gap = GAP,\n loadingIcon,\n icons,\n containerAriaLabel = 'Notifications',\n pauseWhenPageIsHidden,\n } = props;\n const [toasts, setToasts] = React.useState<ToastT[]>([]);\n const possiblePositions = React.useMemo(() => {\n return Array.from(\n new Set([position].concat(toasts.filter((toast) => toast.position).map((toast) => toast.position))),\n );\n }, [toasts, position]);\n const [heights, setHeights] = React.useState<HeightT[]>([]);\n const [expanded, setExpanded] = React.useState(false);\n const [interacting, setInteracting] = React.useState(false);\n const [actualTheme, setActualTheme] = React.useState(\n theme !== 'system'\n ? theme\n : typeof window !== 'undefined'\n ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n : 'light',\n );\n\n const listRef = React.useRef<HTMLOListElement>(null);\n const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');\n const lastFocusedElementRef = React.useRef<HTMLElement>(null);\n const isFocusWithinRef = React.useRef(false);\n\n const removeToast = React.useCallback((toastToRemove: ToastT) => {\n setToasts((toasts) => {\n if (!toasts.find((toast) => toast.id === toastToRemove.id)?.delete) {\n ToastState.dismiss(toastToRemove.id);\n }\n\n return toasts.filter(({ id }) => id !== toastToRemove.id);\n });\n }, []);\n\n React.useEffect(() => {\n return ToastState.subscribe((toast) => {\n if ((toast as ToastToDismiss).dismiss) {\n setToasts((toasts) => toasts.map((t) => (t.id === toast.id ? { ...t, delete: true } : t)));\n return;\n }\n\n // Prevent batching, temp solution.\n setTimeout(() => {\n ReactDOM.flushSync(() => {\n setToasts((toasts) => {\n const indexOfExistingToast = toasts.findIndex((t) => t.id === toast.id);\n\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n { ...toasts[indexOfExistingToast], ...toast },\n ...toasts.slice(indexOfExistingToast + 1),\n ];\n }\n\n return [toast, ...toasts];\n });\n });\n });\n });\n }, []);\n\n React.useEffect(() => {\n if (theme !== 'system') {\n setActualTheme(theme);\n return;\n }\n\n if (theme === 'system') {\n // check if current preference is dark\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n // it's currently dark\n setActualTheme('dark');\n } else {\n // it's not dark\n setActualTheme('light');\n }\n }\n\n if (typeof window === 'undefined') return;\n const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n try {\n // Chrome & Firefox\n darkMediaQuery.addEventListener('change', ({ matches }) => {\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n });\n } catch (error) {\n // Safari < 14\n darkMediaQuery.addListener(({ matches }) => {\n try {\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n } catch (e) {\n console.error(e);\n }\n });\n }\n }, [theme]);\n\n React.useEffect(() => {\n // Ensure expanded is always false when no toasts are present / only one left\n if (toasts.length <= 1) {\n setExpanded(false);\n }\n }, [toasts]);\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const isHotkeyPressed = hotkey.every((key) => (event as any)[key] || event.code === key);\n\n if (isHotkeyPressed) {\n setExpanded(true);\n listRef.current?.focus();\n }\n\n if (\n event.code === 'Escape' &&\n (document.activeElement === listRef.current || listRef.current?.contains(document.activeElement))\n ) {\n setExpanded(false);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [hotkey]);\n\n React.useEffect(() => {\n if (listRef.current) {\n return () => {\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({ preventScroll: true });\n lastFocusedElementRef.current = null;\n isFocusWithinRef.current = false;\n }\n };\n }\n }, [listRef.current]);\n\n return (\n // Remove item from normal navigation flow, only available via hotkey\n <section\n ref={ref}\n aria-label={`${containerAriaLabel} ${hotkeyLabel}`}\n tabIndex={-1}\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n aria-atomic=\"false\"\n suppressHydrationWarning\n >\n {possiblePositions.map((position, index) => {\n const [y, x] = position.split('-');\n\n if (!toasts.length) return null;\n\n return (\n <ol\n key={position}\n dir={dir === 'auto' ? getDocumentDirection() : dir}\n tabIndex={-1}\n ref={listRef}\n className={className}\n data-sonner-toaster\n data-theme={actualTheme}\n data-y-position={y}\n data-lifted={expanded && toasts.length > 1 && !expand}\n data-x-position={x}\n style={\n {\n '--front-toast-height': `${heights[0]?.height || 0}px`,\n '--width': `${TOAST_WIDTH}px`,\n '--gap': `${gap}px`,\n ...style,\n ...assignOffset(offset, mobileOffset),\n } as React.CSSProperties\n }\n onBlur={(event) => {\n if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {\n isFocusWithinRef.current = false;\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({ preventScroll: true });\n lastFocusedElementRef.current = null;\n }\n }\n }}\n onFocus={(event) => {\n const isNotDismissible =\n event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n\n if (isNotDismissible) return;\n\n if (!isFocusWithinRef.current) {\n isFocusWithinRef.current = true;\n lastFocusedElementRef.current = event.relatedTarget as HTMLElement;\n }\n }}\n onMouseEnter={() => setExpanded(true)}\n onMouseMove={() => setExpanded(true)}\n onMouseLeave={() => {\n // Avoid setting expanded to false when interacting with a toast, e.g. swiping\n if (!interacting) {\n setExpanded(false);\n }\n }}\n onDragEnd={() => setExpanded(false)}\n onPointerDown={(event) => {\n const isNotDismissible =\n event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n\n if (isNotDismissible) return;\n setInteracting(true);\n }}\n onPointerUp={() => setInteracting(false)}\n >\n {toasts\n .filter((toast) => (!toast.position && index === 0) || toast.position === position)\n .map((toast, index) => (\n <Toast\n key={toast.id}\n icons={icons}\n index={index}\n toast={toast}\n defaultRichColors={richColors}\n duration={toastOptions?.duration ?? duration}\n className={toastOptions?.className}\n descriptionClassName={toastOptions?.descriptionClassName}\n invert={invert}\n visibleToasts={visibleToasts}\n closeButton={toastOptions?.closeButton ?? closeButton}\n interacting={interacting}\n position={position}\n style={toastOptions?.style}\n unstyled={toastOptions?.unstyled}\n classNames={toastOptions?.classNames}\n cancelButtonStyle={toastOptions?.cancelButtonStyle}\n actionButtonStyle={toastOptions?.actionButtonStyle}\n removeToast={removeToast}\n toasts={toasts.filter((t) => t.position == toast.position)}\n heights={heights.filter((h) => h.position == toast.position)}\n setHeights={setHeights}\n expandByDefault={expand}\n gap={gap}\n loadingIcon={loadingIcon}\n expanded={expanded}\n pauseWhenPageIsHidden={pauseWhenPageIsHidden}\n swipeDirections={props.swipeDirections}\n />\n ))}\n </ol>\n );\n })}\n </section>\n );\n});\nexport { toast, Toaster, type ExternalToast, type ToastT, type ToasterProps, useSonner };\nexport { type ToastClassnames, type ToastToDismiss, type Action } from './types';\n","'use client';\nimport React from 'react';\nimport type { ToastTypes } from './types';\n\nexport const getAsset = (type: ToastTypes): JSX.Element | null => {\n switch (type) {\n case 'success':\n return SuccessIcon;\n\n case 'info':\n return InfoIcon;\n\n case 'warning':\n return WarningIcon;\n\n case 'error':\n return ErrorIcon;\n\n default:\n return null;\n }\n};\n\nconst bars = Array(12).fill(0);\n\nexport const Loader = ({ visible, className }: { visible: boolean, className?: string }) => {\n return (\n <div className={['sonner-loading-wrapper', className].filter(Boolean).join(' ')} data-visible={visible}>\n <div className=\"sonner-spinner\">\n {bars.map((_, i) => (\n <div className=\"sonner-loading-bar\" key={`spinner-bar-${i}`} />\n ))}\n </div>\n </div>\n );\n};\n\nconst SuccessIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" height=\"20\" width=\"20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nconst WarningIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" height=\"20\" width=\"20\">\n <path\n fillRule=\"evenodd\"\n d=\"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nconst InfoIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" height=\"20\" width=\"20\">\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nconst ErrorIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" height=\"20\" width=\"20\">\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const CloseIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n);\n","import React from 'react';\n\nexport const useIsDocumentHidden = () => {\n const [isDocumentHidden, setIsDocumentHidden] = React.useState(document.hidden);\n\n React.useEffect(() => {\n const callback = () => {\n setIsDocumentHidden(document.hidden);\n };\n document.addEventListener('visibilitychange', callback);\n return () => window.removeEventListener('visibilitychange', callback);\n }, []);\n\n return isDocumentHidden;\n};\n","import type { ExternalToast, PromiseData, PromiseT, ToastT, ToastToDismiss, ToastTypes } from './types';\n\nimport React from 'react';\n\nlet toastsCounter = 1;\n\ntype titleT = (() => React.ReactNode) | React.ReactNode;\n\nclass Observer {\n subscribers: Array<(toast: ExternalToast | ToastToDismiss) => void>;\n toasts: Array<ToastT | ToastToDismiss>;\n dismissedToasts: Set<string | number>;\n\n constructor() {\n this.subscribers = [];\n this.toasts = [];\n this.dismissedToasts = new Set();\n }\n\n // We use arrow functions to maintain the correct `this` reference\n subscribe = (subscriber: (toast: ToastT | ToastToDismiss) => void) => {\n this.subscribers.push(subscriber);\n\n return () => {\n const index = this.subscribers.indexOf(subscriber);\n this.subscribers.splice(index, 1);\n };\n };\n\n publish = (data: ToastT) => {\n this.subscribers.forEach((subscriber) => subscriber(data));\n };\n\n addToast = (data: ToastT) => {\n this.publish(data);\n this.toasts = [...this.toasts, data];\n };\n\n create = (\n data: ExternalToast & {\n message?: titleT;\n type?: ToastTypes;\n promise?: PromiseT;\n jsx?: React.ReactElement;\n },\n ) => {\n const { message, ...rest } = data;\n const id = typeof data?.id === 'number' || data.id?.length > 0 ? data.id : toastsCounter++;\n const alreadyExists = this.toasts.find((toast) => {\n return toast.id === id;\n });\n const dismissible = data.dismissible === undefined ? true : data.dismissible;\n\n if (this.dismissedToasts.has(id)) {\n this.dismissedToasts.delete(id);\n }\n\n if (alreadyExists) {\n this.toasts = this.toasts.map((toast) => {\n if (toast.id === id) {\n this.publish({ ...toast, ...data, id, title: message });\n return {\n ...toast,\n ...data,\n id,\n dismissible,\n title: message,\n };\n }\n\n return toast;\n });\n } else {\n this.addToast({ title: message, ...rest, dismissible, id });\n }\n\n return id;\n };\n\n dismiss = (id?: number | string) => {\n this.dismissedToasts.add(id);\n\n if (!id) {\n this.toasts.forEach((toast) => {\n this.subscribers.forEach((subscriber) => subscriber({ id: toast.id, dismiss: true }));\n });\n }\n this.subscribers.forEach((subscriber) => subscriber({ id, dismiss: true }));\n return id;\n };\n\n message = (message: titleT | React.ReactNode, data?: ExternalToast) => {\n return this.create({ ...data, message });\n };\n\n error = (message: titleT | React.ReactNode, data?: ExternalToast) => {\n return this.create({ ...data, message, type: 'error' });\n };\n\n success = (message: titleT | React.ReactNode, data?: ExternalToast) => {\n return this.create({ ...data, type: 'success', message });\n };\n\n info = (message: titleT | React.ReactNode, data?: ExternalToast) => {\n return this.create({ ...data, type: 'info', message });\n };\n\n warning = (message: titleT | React.ReactNode, data?: ExternalToast) => {\n return this.create({ ...data, type: 'warning', message });\n };\n\n loading = (message: titleT | React.ReactNode, data?: ExternalToast) => {\n return this.create({ ...data, type: 'loading', message });\n };\n\n promise = <ToastData>(promise: PromiseT<ToastData>, data?: PromiseData<ToastData>) => {\n if (!data) {\n // Nothing to show\n return;\n }\n\n let id: string | number | undefined = undefined;\n if (data.loading !== undefined) {\n id = this.create({\n ...data,\n promise,\n type: 'loading',\n message: data.loading,\n description: typeof data.description !== 'function' ? data.description : undefined,\n });\n }\n\n const p = promise instanceof Promise ? promise : promise();\n\n let shouldDismiss = id !== undefined;\n let result: ['resolve', ToastData] | ['reject', unknown];\n\n const originalPromise = p\n .then(async (response) => {\n result = ['resolve', response];\n const isReactElementResponse = React.isValidElement(response);\n if (isReactElementResponse) {\n shouldDismiss = false;\n this.create({ id, type: 'default', message: response });\n } else if (isHttpResponse(response) && !response.ok) {\n shouldDismiss = false;\n const message =\n typeof data.error === 'function' ? await data.error(`HTTP error! status: ${response.status}`) : data.error;\n const description =\n typeof data.description === 'function'\n ? await data.description(`HTTP error! status: ${response.status}`)\n : data.description;\n this.create({ id, type: 'error', message, description });\n } else if (data.success !== undefined) {\n shouldDismiss = false;\n const message = typeof data.success === 'function' ? await data.success(response) : data.success;\n const description =\n typeof data.description === 'function' ? await data.description(response) : data.description;\n this.create({ id, type: 'success', message, description });\n }\n })\n .catch(async (error) => {\n result = ['reject', error];\n if (data.error !== undefined) {\n shouldDismiss = false;\n const message = typeof data.error === 'function' ? await data.error(error) : data.error;\n const description = typeof data.description === 'function' ? await data.description(error) : data.description;\n this.create({ id, type: 'error', message, description });\n }\n })\n .finally(() => {\n if (shouldDismiss) {\n // Toast is still in load state (and will be indefinitely — dismiss it)\n this.dismiss(id);\n id = undefined;\n }\n\n data.finally?.();\n });\n\n const unwrap = () =>\n new Promise<ToastData>((resolve, reject) =>\n originalPromise.then(() => (result[0] === 'reject' ? reject(result[1]) : resolve(result[1]))).catch(reject),\n );\n\n if (typeof id !== 'string' && typeof id !== 'number') {\n // cannot Object.assign on undefined\n return { unwrap };\n } else {\n return Object.assign(id, { unwrap });\n }\n };\n\n custom = (jsx: (id: number | string) => React.ReactElement, data?: ExternalToast) => {\n const id = data?.id || toastsCounter++;\n this.create({ jsx: jsx(id), id, ...data });\n return id;\n };\n\n getActiveToasts = () => {\n return this.toasts.filter((toast) => !this.dismissedToasts.has(toast.id));\n };\n}\n\nexport const ToastState = new Observer();\n\n// bind this to the toast function\nconst toastFunction = (message: titleT, data?: ExternalToast) => {\n const id = data?.id || toastsCounter++;\n\n ToastState.addToast({\n title: message,\n ...data,\n id,\n });\n return id;\n};\n\nconst isHttpResponse = (data: any): data is Response => {\n return (\n data &&\n typeof data === 'object' &&\n 'ok' in data &&\n typeof data.ok === 'boolean' &&\n 'status' in data &&\n typeof data.status === 'number'\n );\n};\n\nconst basicToast = toastFunction;\n\nconst getHistory = () => ToastState.toasts;\nconst getToasts = () => ToastState.getActiveToasts();\n\n// We use `Object.assign` to maintain the correct types as we would lose them otherwise\nexport const toast = Object.assign(\n basicToast,\n {\n success: ToastState.success,\n info: ToastState.info,\n warning: ToastState.warning,\n error: ToastState.error,\n custom: ToastState.custom,\n message: ToastState.message,\n promise: ToastState.promise,\n dismiss: ToastState.dismiss,\n loading: ToastState.loading,\n },\n { getHistory, getToasts },\n);\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":where(html[dir=\\\"ltr\\\"]),:where([data-sonner-toaster][dir=\\\"ltr\\\"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir=\\\"rtl\\\"]),:where([data-sonner-toaster][dir=\\\"rtl\\\"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted=\\\"true\\\"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted=\\\"true\\\"]){transform:none}}:where([data-sonner-toaster][data-x-position=\\\"right\\\"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position=\\\"left\\\"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position=\\\"center\\\"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position=\\\"top\\\"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position=\\\"bottom\\\"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled=\\\"true\\\"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position=\\\"top\\\"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position=\\\"bottom\\\"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise=\\\"true\\\"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme=\\\"dark\\\"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled=\\\"true\\\"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping=\\\"true\\\"]):before{content:\\\"\\\";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position=\\\"top\\\"][data-swiping=\\\"true\\\"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position=\\\"bottom\\\"][data-swiping=\\\"true\\\"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping=\\\"false\\\"][data-removed=\\\"true\\\"]):before{content:\\\"\\\";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:\\\"\\\";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted=\\\"true\\\"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded=\\\"false\\\"][data-front=\\\"false\\\"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded=\\\"false\\\"][data-front=\\\"false\\\"][data-styled=\\\"true\\\"])>*{opacity:0}:where([data-sonner-toast][data-visible=\\\"false\\\"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted=\\\"true\\\"][data-expanded=\\\"true\\\"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed=\\\"true\\\"][data-front=\\\"true\\\"][data-swipe-out=\\\"false\\\"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed=\\\"true\\\"][data-front=\\\"false\\\"][data-swipe-out=\\\"false\\\"][data-expanded=\\\"true\\\"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed=\\\"true\\\"][data-front=\\\"false\\\"][data-swipe-out=\\\"false\\\"][data-expanded=\\\"false\\\"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed=\\\"true\\\"][data-front=\\\"false\\\"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\\n\")","import React from 'react';\n\nexport type ToastTypes = 'normal' | 'action' | 'success' | 'info' | 'warning' | 'error' | 'loading' | 'default';\n\nexport type PromiseT<Data = any> = Promise<Data> | (() => Promise<Data>);\n\nexport type PromiseTResult<Data = any> =\n | string\n | React.ReactNode\n | ((data: Data) => React.ReactNode | string | Promise<React.ReactNode | string>);\n\nexport type PromiseExternalToast = Omit<ExternalToast, 'description'>;\n\nexport type PromiseData<ToastData = any> = PromiseExternalToast & {\n loading?: string | React.ReactNode;\n success?: PromiseTResult<ToastData>;\n error?: PromiseTResult;\n description?: PromiseTResult;\n finally?: () => void | Promise<void>;\n};\n\nexport interface ToastClassnames {\n toast?: string;\n title?: string;\n description?: string;\n loader?: string;\n closeButton?: string;\n cancelButton?: string;\n actionButton?: string;\n success?: string;\n error?: string;\n info?: string;\n warning?: string;\n loading?: string;\n default?: string;\n content?: string;\n icon?: string;\n}\n\nexport interface ToastIcons {\n success?: React.ReactNode;\n info?: React.ReactNode;\n warning?: React.ReactNode;\n error?: React.ReactNode;\n loading?: React.ReactNode;\n close?: React.ReactNode;\n}\n\nexport interface Action {\n label: React.ReactNode;\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n actionButtonStyle?: React.CSSProperties;\n}\n\nexport interface ToastT {\n id: number | string;\n title?: (() => React.ReactNode) | React.ReactNode;\n type?: ToastTypes;\n icon?: React.ReactNode;\n jsx?: React.ReactNode;\n richColors?: boolean;\n invert?: boolean;\n closeButton?: boolean;\n dismissible?: boolean;\n description?: (() => React.ReactNode) | React.ReactNode;\n duration?: number;\n delete?: boolean;\n action?: Action | React.ReactNode;\n cancel?: Action | React.ReactNode;\n onDismiss?: (toast: ToastT) => void;\n onAutoClose?: (toast: ToastT) => void;\n promise?: PromiseT;\n cancelButtonStyle?: React.CSSProperties;\n actionButtonStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n unstyled?: boolean;\n className?: string;\n classNames?: ToastClassnames;\n descriptionClassName?: string;\n position?: Position;\n}\n\nexport function isAction(action: Action | React.ReactNode): action is Action {\n return (action as Action).label !== undefined;\n}\n\nexport type Position = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center';\nexport interface HeightT {\n height: number;\n toastId: number | string;\n position: Position;\n}\n\ninterface ToastOptions {\n className?: string;\n closeButton?: boolean;\n descriptionClassName?: string;\n style?: React.CSSProperties;\n cancelButtonStyle?: React.CSSProperties;\n actionButtonStyle?: React.CSSProperties;\n duration?: number;\n unstyled?: boolean;\n classNames?: ToastClassnames;\n}\n\ntype Offset =\n | {\n top?: string | number;\n right?: string | number;\n bottom?: string | number;\n left?: string | number;\n }\n | string\n | number;\n\nexport interface ToasterProps {\n invert?: boolean;\n theme?: 'light' | 'dark' | 'system';\n position?: Position;\n hotkey?: string[];\n richColors?: boolean;\n expand?: boolean;\n duration?: number;\n gap?: number;\n visibleToasts?: number;\n closeButton?: boolean;\n toastOptions?: ToastOptions;\n className?: string;\n style?: React.CSSProperties;\n offset?: Offset;\n mobileOffset?: Offset;\n dir?: 'rtl' | 'ltr' | 'auto';\n swipeDirections?: SwipeDirection[];\n /**\n * @deprecated Please use the `icons` prop instead:\n * ```jsx\n * <Toaster\n * icons={{ loading: <LoadingIcon /> }}\n * />\n * ```\n */\n loadingIcon?: React.ReactNode;\n icons?: ToastIcons;\n containerAriaLabel?: string;\n pauseWhenPageIsHidden?: boolean;\n}\n\nexport type SwipeDirection = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface ToastProps {\n toast: ToastT;\n toasts: ToastT[];\n index: number;\n swipeDirections?: SwipeDirection[];\n expanded: boolean;\n invert: boolean;\n heights: HeightT[];\n setHeights: React.Dispatch<React.SetStateAction<HeightT[]>>;\n removeToast: (toast: ToastT) => void;\n gap?: number;\n position: Position;\n visibleToasts: number;\n expandByDefault: boolean;\n closeButton: boolean;\n interacting: boolean;\n style?: React.CSSProperties;\n cancelButtonStyle?: React.CSSProperties;\n actionButtonStyle?: React.CSSProperties;\n duration?: number;\n className?: string;\n unstyled?: boolean;\n descriptionClassName?: string;\n loadingIcon?: React.ReactNode;\n classNames?: ToastClassnames;\n icons?: ToastIcons;\n closeButtonAriaLabel?: string;\n pauseWhenPageIsHidden: boolean;\n defaultRichColors?: boolean;\n}\n\nexport enum SwipeStateTypes {\n SwipedOut = 'SwipedOut',\n SwipedBack = 'SwipedBack',\n NotSwiped = 'NotSwiped',\n}\n\nexport type Theme = 'light' | 'dark';\n\nexport interface ToastToDismiss {\n id: number | string;\n dismiss: boolean;\n}\n\nexport type ExternalToast = Omit<ToastT, 'id' | 'type' | 'title' | 'jsx' | 'delete' | 'promise'> & {\n id?: number | string;\n};\n"],"names":["Activity","createLucideIcon","d","key","Calendar","width","height","x","y","rx","ry","x1","x2","y1","y2","ChevronsUpDown","Clock","cx","cy","r","points","Folder","Globe","Lightbulb","Lock","MessageSquare","MoreVertical","SquarePen","ThumbsUp","User","window","document","createElement","Presence","Object","getter","mayWarn","present","children","props","presence","usePresence","initialState","machine","node","setNode","React2","stylesRef","prevPresentRef","prevAnimationNameRef","state","send","mounted","UNMOUNT","ANIMATION_OUT","unmountSuspended","MOUNT","ANIMATION_END","unmounted","React","event","nextState","currentAnimationName","getAnimationName","current","useLayoutEffect","styles","wasPresent","prevAnimationName","display","timeoutId","ownerWindow","ownerDocument","defaultView","handleAnimationEnd","isCurrentAnimation","includes","CSS","escape","animationName","target","currentFillMode","style","animationFillMode","setTimeout","handleAnimationStart","addEventListener","clearTimeout","removeEventListener","isPresent","ref","getComputedStyle","child","only","useComposedRefs","getOwnPropertyDescriptor","element","get","isReactWarning","forceMount","displayName","COLLAPSIBLE_NAME","createCollapsibleContext","createCollapsibleScope","createContextScope","CollapsibleProvider","useCollapsibleContext","Collapsible","forwardedRef","__scopeCollapsible","open","openProp","defaultOpen","disabled","onOpenChange","collapsibleProps","setOpen","useControllableState","prop","defaultProp","onChange","caller","jsx","scope","contentId","useId","onOpenToggle","prevOpen","Primitive","div","getState","TRIGGER_NAME","CollapsibleTrigger","triggerProps","context","button","type","onClick","composeEventHandlers","originalEventHandler","ourEventHandler","checkForDefaultPrevented","defaultPrevented","CONTENT_NAME","CollapsibleContent","contentProps","param","CollapsibleContentImpl","setIsPresent","composedRefs","heightRef","widthRef","isOpen","isMountAnimationPreventedRef","originalStylesRef","rAF","requestAnimationFrame","cancelAnimationFrame","transitionDuration","rect","getBoundingClientRect","id","hidden","concat","Root","Array","fill","toastsCounter","ToastState","constructor","subscribe","subscriber","subscribers","push","index","indexOf","splice","publish","data","forEach","addToast","toasts","create","_a","message","rest","length","alreadyExists","find","toast","dismissible","dismissedToasts","has","delete","map","title","dismiss","add","error","success","info","warning","loading","promise","description","p","Promise","shouldDismiss","result","originalPromise","then","response","isHttpResponse","ok","status","catch","finally","call","unwrap","resolve","reject","assign","custom","getActiveToasts","filter","Set","getHistory","getToasts","styleInject","css","insertAt","arguments","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6367],{76367:function(e,s,t){t.d(s,{$:function(){return S}});var a=t(57437),i=t(2265),l=t(66070),n=t(62869),r=t(35974),c=t(84190),d=t(31810),o=t(17684),m=t(78867),u=t(15868),x=t(18930),h=t(82222),p=t(42488),v=t(53417),f=t(92369),j=t(31047),g=t(91723),N=t(84544),w=t(12194),y=t(35283),b=t(14438),C=t(7211),_=t(27689),A=t(7598);function S(e){var s,t;let{prompt:S,user:D,onUpdate:Z}=e,[k,P]=(0,i.useState)(!1),[z,F]=(0,i.useState)(!1),[E]=(0,w.iJ)(),{toggleFavorite:B}=(0,w.Lq)(),R=function(e,s){var t,a,i,l;let n="private"===e.rights_mode,r="public"===e.rights_mode,c="users"===e.rights_mode,d="roles"===e.rights_mode,o=s.super_admin,m=e.created_by===s.id.toString(),u=!1;if(m&&(u=!0),!n||m||o||(u=!1),r&&(u=!0),c){let i=null===(a=e.RBAC)||void 0===a?void 0:null===(t=a.users)||void 0===t?void 0:t.find(e=>e.id===s.id);u=(null==i?void 0:i.rights)==="write"}if(d){let t=null===(l=e.RBAC)||void 0===l?void 0:null===(i=l.roles)||void 0===i?void 0:i.find(e=>{var t;return e.id===(null===(t=s.role)||void 0===t?void 0:t.id)});u=(null==t?void 0:t.rights)==="write"}return o&&(u=!0),u}(S,D),I=(0,N.H)(S.content),M=S.is_favorited||!1,{data:U}=(0,C.aM)(_.W9,{variables:{ids:S.assigned_agents||[]},skip:!S.assigned_agents||0===S.assigned_agents.length}),V=(null==U?void 0:null===(s=U.agentByIds)||void 0===s?void 0:s.map(e=>e.name))||[],{data:q}=(0,C.aM)(_.L5,{variables:{id:S.created_by},skip:!S.created_by}),O=(null==q?void 0:null===(t=q.userById)||void 0===t?void 0:t.name)||"Unknown",L=async()=>{if(confirm("Are you sure you want to delete this prompt?"))try{await E({variables:{id:S.id}}),b.Am.success("Prompt deleted successfully"),Z()}catch(e){b.Am.error("Failed to delete prompt"),console.error(e)}},Q=async()=>{if(!z){F(!0);try{await B(S.id,D.id,M,S.favorite_count,void 0),b.Am.success(M?"Removed from favorites":"Added to favorites",{icon:M?"\uD83D\uDC4E":"\uD83D\uDC4D",duration:2e3}),Z()}catch(e){b.Am.error("Failed to update favorite"),console.error(e)}finally{await new Promise(e=>setTimeout(e,200)),F(!1)}}};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.Zb,{className:"flex flex-col hover:shadow-md transition-shadow",children:[(0,a.jsx)(l.Ol,{className:"pb-3",children:(0,a.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,a.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,a.jsx)("h3",{className:"font-semibold text-lg truncate",children:S.name}),S.description&&(0,a.jsx)("p",{className:"text-sm text-muted-foreground line-clamp-2 mt-1",children:S.description})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(n.z,{variant:"ghost",size:"icon",className:"h-8 w-8 transition-all ".concat(z?"scale-125":""," ").concat(M?"text-yellow-500":""),onClick:Q,disabled:z,children:(0,a.jsx)(d.Z,{className:"h-4 w-4 transition-all ".concat(z?"animate-pulse":""," ").concat(M?"fill-yellow-400 text-yellow-400":"")})}),(0,a.jsxs)(c.h_,{modal:!1,children:[(0,a.jsx)(c.$F,{asChild:!0,children:(0,a.jsx)(n.z,{variant:"ghost",size:"icon",className:"h-8 w-8",children:(0,a.jsx)(o.Z,{className:"h-4 w-4"})})}),(0,a.jsxs)(c.AW,{align:"end",children:[(0,a.jsxs)(c.Xi,{onClick:()=>{navigator.clipboard.writeText(S.content),b.Am.success("Prompt copied to clipboard")},children:[(0,a.jsx)(m.Z,{className:"mr-2 h-4 w-4"}),"Copy Content"]}),R&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(c.Xi,{onClick:()=>P(!0),children:[(0,a.jsx)(u.Z,{className:"mr-2 h-4 w-4"}),"Edit"]}),(0,a.jsxs)(c.Xi,{onClick:L,className:"text-destructive",children:[(0,a.jsx)(x.Z,{className:"mr-2 h-4 w-4"}),"Delete"]})]})]})]})]})]})}),(0,a.jsx)(l.aY,{className:"flex-1 pb-3",children:(0,a.jsxs)("div",{className:"space-y-3",children:[(0,a.jsx)("p",{className:"text-sm text-muted-foreground line-clamp-3",children:S.content}),I.length>0&&(0,a.jsxs)(r.C,{variant:"outline",className:"text-xs",children:[I.length," variable",1!==I.length?"s":""]}),V.length>0&&(0,a.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[(0,a.jsx)(h.Z,{className:"h-3 w-3"}),(0,a.jsx)("span",{className:"font-medium",children:"Works with:"})]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-1",children:[V.slice(0,2).map((e,s)=>(0,a.jsx)(r.C,{variant:"default",className:"text-xs bg-primary/10 text-primary hover:bg-primary/20",children:e},s)),V.length>2&&(0,a.jsxs)(r.C,{variant:"default",className:"text-xs bg-primary/10 text-primary hover:bg-primary/20",children:["+",V.length-2," more"]})]})]})]})}),(0,a.jsxs)(l.eW,{className:"flex flex-col gap-3 pt-3 border-t",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between w-full",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 text-xs text-muted-foreground",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1 transition-all ".concat(z?"scale-125":""," ").concat(M?"text-yellow-500":""),children:[(0,a.jsx)(d.Z,{className:"h-3.5 w-3.5"}),(0,a.jsx)("span",{children:S.favorite_count||0})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1",title:"Times used",children:[(0,a.jsx)(p.Z,{className:"h-3.5 w-3.5"}),(0,a.jsx)("span",{children:S.usage_count||0})]})]}),(0,a.jsxs)(n.z,{variant:"secondary",size:"sm",type:"button",onClick:()=>P(!0),children:[(0,a.jsx)(v.Z,{className:"mr-2 h-3.5 w-3.5"}),"View"]})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-1.5 text-xs text-muted-foreground w-full",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(f.Z,{className:"h-3 w-3"}),(0,a.jsxs)("span",{children:["Created by ",O]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(j.Z,{className:"h-3 w-3"}),(0,a.jsxs)("span",{children:["Created ",(0,A.Q)(new Date(S.createdAt),{addSuffix:!0})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(g.Z,{className:"h-3 w-3"}),(0,a.jsxs)("span",{children:["Updated ",(0,A.Q)(new Date(S.updatedAt),{addSuffix:!0})]})]})]})]})]}),(0,a.jsx)(y.D,{open:k,onOpenChange:P,prompt:S,onSuccess:Z,user:D})]})}},35283:function(e,s,t){t.d(s,{D:function(){return _}});var a=t(57437),i=t(2265),l=t(26110),n=t(62869),r=t(95186),c=t(26815),d=t(76818),o=t(35974),m=t(25846),u=t(24156),x=t(30401),h=t(32489),p=t(12194),v=t(84544),f=t(8014),j=t(14438),g=t(74928),N=t(23518),w=t(57054),y=t(7211),b=t(27689),C=t(94508);function _(e){var s;let{open:t,onOpenChange:_,prompt:A,onSuccess:S,user:D,defaultAssignedAgents:Z=[]}=e,k=!!A,[P,{loading:z}]=(0,p.EE)(),[F,{loading:E}]=(0,p.er)(),[B,R]=(0,i.useState)(""),[I,M]=(0,i.useState)(""),[U,V]=(0,i.useState)(""),[q,O]=(0,i.useState)("private"),[L,Q]=(0,i.useState)([]),[T,W]=(0,i.useState)([]),[$,H]=(0,i.useState)([]),[J,X]=(0,i.useState)(!1),[Y,K]=(0,i.useState)([]),[G,ee]=(0,i.useState)(!1),{data:es}=(0,y.aM)(b.ym,{variables:{page:1,limit:100}}),et=(null==es?void 0:null===(s=es.agentsPagination)||void 0===s?void 0:s.items)||[],ea=(0,v.H)(U),{isValid:ei,invalidVariables:el}=function(e){if(!e)return{isValid:!0,invalidVariables:[]};let s=e.matchAll(/\{\{([^}]+)\}\}/g),t=[];for(let e of Array.from(s)){let s=e[1];s&&/^[a-zA-Z0-9_]+$/.test(s)||t.push(s)}return{isValid:0===t.length,invalidVariables:t}}(U);(0,i.useEffect)(()=>{if(t){if(A){var e,s,a;R(A.name),M(A.description||""),V(A.content),O(A.rights_mode),Q((null===(e=A.RBAC)||void 0===e?void 0:e.users)||[]),W((null===(s=A.RBAC)||void 0===s?void 0:s.roles)||[]),H((null===(a=A.RBAC)||void 0===a?void 0:a.projects)||[]),K(A.assigned_agents||[])}else en(),Z&&Z.length>0&&K(Z)}},[A,t]);let en=()=>{R(""),M(""),V(""),O("private"),Q([]),W([]),H([]),X(!1),K([])},er=async()=>{if(!B.trim()){j.Am.error("Please enter a name for the prompt");return}if(!U.trim()){j.Am.error("Please enter prompt content");return}if(!ei){j.Am.error("Invalid variable names: ".concat(el.join(", "),". Use only letters, numbers, and underscores."));return}try{let e={name:B.trim(),description:I.trim()||void 0,content:U.trim(),rights_mode:q,RBAC:"private"!==q&&"public"!==q?{users:L.length>0?L:void 0,roles:T.length>0?T:void 0,projects:$.length>0?$:void 0}:void 0,assigned_agents:Y.length>0?Y:void 0};k?(await F({variables:{id:A.id,...e}}),j.Am.success("Prompt updated successfully")):(await P({variables:e}),j.Am.success("Prompt created successfully")),S(),_(!1),en()}catch(e){console.error(e),j.Am.error(k?"Failed to update prompt":"Failed to create prompt")}};return(0,a.jsx)(l.Vq,{open:t,onOpenChange:_,children:(0,a.jsxs)(l.cZ,{className:"max-w-3xl max-h-[90vh] overflow-y-auto",children:[(0,a.jsxs)(l.fK,{children:[(0,a.jsx)(l.$N,{children:k?"Edit Prompt":"Create New Prompt"}),(0,a.jsx)(l.Be,{children:k?"Update your prompt template":"Create a reusable prompt template with variables"})]}),(0,a.jsxs)("div",{className:"space-y-6 py-4",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)(c._,{htmlFor:"name",children:["Name ",(0,a.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,a.jsx)(r.I,{id:"name",placeholder:"Customer Support Template",value:B,onChange:e=>R(e.target.value)})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)(c._,{htmlFor:"description",children:"Description"}),(0,a.jsx)(r.I,{id:"description",placeholder:"Brief description of this prompt",value:I,onChange:e=>M(e.target.value)})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)(c._,{htmlFor:"content",children:["Prompt Content ",(0,a.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,a.jsx)(d.g,{id:"content",placeholder:"You are helping {{customer_name}} with their {{issue}}...",value:U,onChange:e=>V(e.target.value),rows:8,className:"font-mono text-sm"}),(0,a.jsxs)("div",{className:"flex items-start gap-2 text-xs text-muted-foreground",children:[(0,a.jsx)(m.Z,{className:"h-3.5 w-3.5 mt-0.5 flex-shrink-0"}),(0,a.jsxs)("span",{children:["Use"," ",(0,a.jsxs)("code",{className:"bg-muted px-1 py-0.5 rounded",children:["{","{","variable_name","}}"]})," ","format for dynamic content. Variable names can only contain letters, numbers, and underscores."]})]}),ea.length>0&&(0,a.jsxs)("div",{className:"flex flex-wrap gap-1 pt-2",children:[(0,a.jsx)("span",{className:"text-xs text-muted-foreground mr-2",children:"Detected variables:"}),ea.map(e=>(0,a.jsx)(o.C,{variant:"outline",className:"text-xs",children:e},e))]}),!ei&&(0,a.jsxs)("div",{className:"text-xs text-destructive",children:["Invalid variable names: ",el.join(", ")]})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)(c._,{children:"Assign to Agents"}),(0,a.jsxs)(w.J2,{modal:!0,open:G,onOpenChange:ee,children:[(0,a.jsx)(w.xo,{asChild:!0,children:(0,a.jsxs)(n.z,{variant:"outline",role:"combobox","aria-expanded":G,className:"w-full justify-between",children:[0===Y.length?"Select agents...":"".concat(Y.length," agent").concat(1!==Y.length?"s":""," selected"),(0,a.jsx)(u.Z,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),(0,a.jsx)(w.yk,{className:"w-full p-0",children:(0,a.jsxs)(N.mY,{children:[(0,a.jsx)(N.sZ,{placeholder:"Search agents..."}),(0,a.jsxs)(N.e8,{children:[(0,a.jsx)(N.rb,{children:"No agents found."}),(0,a.jsx)(N.fu,{children:et.map(e=>(0,a.jsxs)(N.di,{value:e.id,onSelect:()=>{K(s=>s.includes(e.id)?s.filter(s=>s!==e.id):[...s,e.id])},children:[(0,a.jsx)(x.Z,{className:(0,C.cn)("mr-2 h-4 w-4",Y.includes(e.id)?"opacity-100":"opacity-0")}),e.name]},e.id))})]})]})})]}),Y.length>0&&(0,a.jsx)("div",{className:"flex flex-wrap gap-2 pt-2",children:Y.map(e=>{let s=et.find(s=>s.id===e);return s?(0,a.jsxs)(o.C,{variant:"secondary",className:"text-sm",children:[s.name,(0,a.jsx)("button",{type:"button",onClick:()=>K(s=>s.filter(s=>s!==e)),className:"ml-1.5 hover:text-destructive",children:(0,a.jsx)(h.Z,{className:"h-3 w-3"})})]},e):null})}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"Assign this prompt to specific agents to show it as recommended in chat"})]}),(0,a.jsx)(g.zF,{open:J,onOpenChange:X,children:(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)(g.wy,{asChild:!0,children:(0,a.jsxs)(n.z,{variant:"outline",className:"w-full justify-between",children:["Access Control",(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:["private"===q&&"Private","public"===q&&"Public","users"===q&&"".concat(L.length," users"),"roles"===q&&"".concat(T.length," roles"),"projects"===q&&"".concat($.length," projects")]})]})}),(0,a.jsx)(g.Fw,{className:"pt-2",children:(0,a.jsx)(f.P,{initialRightsMode:q,initialUsers:L,initialRoles:T,modalMode:!0,initialProjects:$,onChange:(e,s,t,a)=>{O(e),Q(s),W(t),H(a)}})})]})})]}),(0,a.jsxs)(l.cN,{children:[(0,a.jsx)(n.z,{variant:"outline",onClick:()=>_(!1),children:"Cancel"}),(0,a.jsx)(n.z,{onClick:er,disabled:z||E||!B.trim()||!U.trim()||!ei,children:z||E?"Saving...":k?"Save Changes":"Create Prompt"})]})]})})}},12194:function(e,s,t){t.d(s,{EE:function(){return r},Lq:function(){return x},Sh:function(){return n},VR:function(){return o},er:function(){return c},iJ:function(){return d}});var a=t(7211),i=t(12199),l=t(27689);let n=e=>{var s,t,i,n;return(0,a.aM)(l.xx,{variables:{page:null!==(s=null==e?void 0:e.page)&&void 0!==s?s:1,limit:null!==(t=null==e?void 0:e.limit)&&void 0!==t?t:20,filters:null!==(i=null==e?void 0:e.filters)&&void 0!==i?i:[],sort:null!==(n=null==e?void 0:e.sort)&&void 0!==n?n:{field:"updatedAt",direction:"DESC"}}})},r=()=>(0,i.D)(l.Iv,{refetchQueries:[{query:l.xx,variables:{page:1,limit:20}}]}),c=()=>(0,i.D)(l.jA),d=()=>(0,i.D)(l.Ll,{refetchQueries:[{query:l.xx,variables:{page:1,limit:20}}]}),o=()=>(0,i.D)(l.re),m=()=>(0,i.D)(l.Nl),u=()=>(0,i.D)(l.m8),x=()=>{let[e]=m(),[s]=u(),[t]=(0,i.D)(l.UK);return{toggleFavorite:async(a,i,l,n,r)=>{l&&r?(await s({variables:{id:r}}),await t({variables:{id:a,favorite_count:Math.max(0,n-1)}})):(await e({variables:{user_id:i,prompt_id:a}}),await t({variables:{id:a,favorite_count:n+1}}))}}}},84544:function(e,s,t){t.d(s,{H:function(){return a}});function a(e){if(!e)return[];let s=e.matchAll(/\{\{([a-zA-Z0-9_]+)\}\}/g),t=new Set;for(let e of Array.from(s))t.add(e[1]);return Array.from(t).sort()}}}]);
2
- //# sourceMappingURL=6367-59cef3c74213925b.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/chunks/6367-59cef3c74213925b.js","mappings":"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","sources":["webpack://_N_E/./lib/prompts/check-prompt-access.ts","webpack://_N_E/./app/(application)/prompts/components/prompt-card.tsx","webpack://_N_E/./lib/prompts/validate-variable-name.ts","webpack://_N_E/./app/(application)/prompts/components/prompt-editor-modal.tsx","webpack://_N_E/./hooks/use-prompts.tsx","webpack://_N_E/./lib/prompts/extract-variables.ts"],"sourcesContent":["import { PromptLibrary } from \"@/types/models/prompt-library\";\nimport { UserWithRole } from \"@/types/models/user\";\n\n/**\n * Checks if a user has write access to a prompt\n *\n * @param prompt - The prompt to check access for\n * @param user - The user to check access for\n * @returns true if user has write access, false otherwise\n */\nexport function checkPromptWriteAccess(\n prompt: PromptLibrary,\n user: UserWithRole\n): boolean {\n const isPrivate = prompt.rights_mode === \"private\";\n const isPublic = prompt.rights_mode === \"public\";\n const byUsers = prompt.rights_mode === \"users\";\n const byRoles = prompt.rights_mode === \"roles\";\n const isAdmin = user.super_admin;\n const isCreator = prompt.created_by === user.id.toString();\n\n let writeAccess = false;\n\n // Creator always has write access\n if (isCreator) {\n writeAccess = true;\n }\n\n // Private: only creator + admins\n if (isPrivate && !isCreator && !isAdmin) {\n writeAccess = false;\n }\n\n // Public: everyone has write access\n if (isPublic) {\n writeAccess = true;\n }\n\n // By users: check if user has write permission\n if (byUsers) {\n const userAccess = prompt.RBAC?.users?.find((u) => u.id === user.id);\n writeAccess = userAccess?.rights === \"write\";\n }\n\n // By roles: check if user's role has write permission\n if (byRoles) {\n const roleAccess = prompt.RBAC?.roles?.find((r) => r.id === user.role?.id);\n writeAccess = roleAccess?.rights === \"write\";\n }\n\n // Admin override\n if (isAdmin) {\n writeAccess = true;\n }\n\n return writeAccess;\n}\n\n/**\n * Checks if a user has read access to a prompt\n *\n * @param prompt - The prompt to check access for\n * @param user - The user to check access for\n * @returns true if user has read access, false otherwise\n */\nexport function checkPromptReadAccess(\n prompt: PromptLibrary,\n user: UserWithRole\n): boolean {\n const isPrivate = prompt.rights_mode === \"private\";\n const isPublic = prompt.rights_mode === \"public\";\n const byUsers = prompt.rights_mode === \"users\";\n const byRoles = prompt.rights_mode === \"roles\";\n const isAdmin = user.super_admin;\n const isCreator = prompt.created_by === user.id.toString();\n\n // Creator always has read access\n if (isCreator) {\n return true;\n }\n\n // Admin always has read access\n if (isAdmin) {\n return true;\n }\n\n // Private: only creator + admins\n if (isPrivate) {\n return false;\n }\n\n // Public: everyone has read access\n if (isPublic) {\n return true;\n }\n\n // By users: check if user has read or write permission\n if (byUsers) {\n const userAccess = prompt.RBAC?.users?.find((u) => u.id === user.id);\n return userAccess !== undefined;\n }\n\n // By roles: check if user's role has read or write permission\n if (byRoles) {\n const roleAccess = prompt.RBAC?.roles?.find((r) => r.id === user.role?.id);\n return roleAccess !== undefined;\n }\n\n // By projects: would need project context to check\n if (prompt.rights_mode === \"projects\") {\n // This would require project context - for now return false\n // Can be enhanced when project context is available\n return false;\n }\n\n return false;\n}\n","import { useState } from \"react\";\nimport { PromptLibrary } from \"@/types/models/prompt-library\";\nimport { UserWithRole } from \"@/types/models/user\";\nimport { Card, CardContent, CardFooter, CardHeader } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n Edit,\n Trash2,\n MoreVertical,\n Star,\n Activity,\n MessageSquare,\n Copy,\n Bot,\n User,\n Calendar,\n Clock,\n ThumbsUp,\n} from \"lucide-react\";\nimport { checkPromptWriteAccess } from \"@/lib/prompts/check-prompt-access\";\nimport { extractVariables } from \"@/lib/prompts/extract-variables\";\nimport { useDeletePrompt, useTogglePromptFavorite } from \"@/hooks/use-prompts\";\nimport { PromptEditorModal } from \"./prompt-editor-modal\";\nimport { toast } from \"sonner\";\nimport { useQuery } from \"@apollo/client\";\nimport { GET_AGENTS_BY_IDS, GET_USER_BY_ID } from \"@/queries/queries\";\nimport { formatDistanceToNow } from \"date-fns\";\n\ninterface PromptCardProps {\n prompt: PromptLibrary;\n user: UserWithRole;\n onUpdate: () => void;\n}\n\nexport function PromptCard({ prompt, user, onUpdate }: PromptCardProps) {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isFavoriting, setIsFavoriting] = useState(false);\n const [deletePrompt] = useDeletePrompt();\n const { toggleFavorite } = useTogglePromptFavorite();\n\n const hasWriteAccess = checkPromptWriteAccess(prompt, user);\n const variables = extractVariables(prompt.content);\n const isFavorited = prompt.is_favorited || false;\n\n // Fetch only the assigned agents by their IDs\n const { data: agentsData } = useQuery(GET_AGENTS_BY_IDS, {\n variables: { ids: prompt.assigned_agents || [] },\n skip: !prompt.assigned_agents || prompt.assigned_agents.length === 0,\n });\n\n const assignedAgentNames =\n agentsData?.agentByIds?.map((agent: any) => agent.name) || [];\n\n // Fetch creator information\n const { data: creatorData } = useQuery(GET_USER_BY_ID, {\n variables: { id: prompt.created_by },\n skip: !prompt.created_by,\n });\n\n const creatorName = creatorData?.userById?.name || \"Unknown\";\n\n const handleDelete = async () => {\n if (confirm(\"Are you sure you want to delete this prompt?\")) {\n try {\n await deletePrompt({ variables: { id: prompt.id } });\n toast.success(\"Prompt deleted successfully\");\n onUpdate();\n } catch (error) {\n toast.error(\"Failed to delete prompt\");\n console.error(error);\n }\n }\n };\n\n const handleToggleFavorite = async () => {\n if (isFavoriting) return; // Prevent double-clicks\n\n setIsFavoriting(true);\n try {\n // This is a simplified version - you'd need to fetch the favorite ID\n // and current favorite status from the backend\n await toggleFavorite(\n prompt.id,\n user.id,\n isFavorited,\n prompt.favorite_count,\n undefined // favoriteId would come from querying favorites\n );\n toast.success(\n isFavorited ? \"Removed from favorites\" : \"Added to favorites\",\n {\n icon: isFavorited ? \"👎\" : \"👍\",\n duration: 2000,\n }\n );\n onUpdate();\n } catch (error) {\n toast.error(\"Failed to update favorite\");\n console.error(error);\n } finally {\n // wait 1 second\n await new Promise(resolve => setTimeout(resolve, 200));\n setIsFavoriting(false);\n }\n };\n\n const handleCopyContent = () => {\n navigator.clipboard.writeText(prompt.content);\n toast.success(\"Prompt copied to clipboard\");\n };\n\n return (\n <>\n <Card className=\"flex flex-col hover:shadow-md transition-shadow\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-lg truncate\">{prompt.name}</h3>\n {prompt.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-2 mt-1\">\n {prompt.description}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={`h-8 w-8 transition-all ${isFavoriting ? \"scale-125\" : \"\"\n } ${isFavorited ? \"text-yellow-500\" : \"\"}`}\n onClick={handleToggleFavorite}\n disabled={isFavoriting}\n >\n <ThumbsUp\n className={`h-4 w-4 transition-all ${isFavoriting ? \"animate-pulse\" : \"\"\n } ${isFavorited ? \"fill-yellow-400 text-yellow-400\" : \"\"}`}\n />\n </Button>\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={handleCopyContent}>\n <Copy className=\"mr-2 h-4 w-4\" />\n Copy Content\n </DropdownMenuItem>\n {hasWriteAccess && (\n <>\n <DropdownMenuItem onClick={() => setIsEditModalOpen(true)}>\n <Edit className=\"mr-2 h-4 w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={handleDelete}\n className=\"text-destructive\"\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"flex-1 pb-3\">\n <div className=\"space-y-3\">\n {/* Content Preview */}\n <p className=\"text-sm text-muted-foreground line-clamp-3\">\n {prompt.content}\n </p>\n\n {/* Variables Badge */}\n {variables.length > 0 && (\n <Badge variant=\"outline\" className=\"text-xs\">\n {variables.length} variable{variables.length !== 1 ? \"s\" : \"\"}\n </Badge>\n )}\n\n {/* Assigned Agents */}\n {assignedAgentNames.length > 0 && (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Bot className=\"h-3 w-3\" />\n <span className=\"font-medium\">Works with:</span>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {assignedAgentNames.slice(0, 2).map((name, index) => (\n <Badge\n key={index}\n variant=\"default\"\n className=\"text-xs bg-primary/10 text-primary hover:bg-primary/20\"\n >\n {name}\n </Badge>\n ))}\n {assignedAgentNames.length > 2 && (\n <Badge\n variant=\"default\"\n className=\"text-xs bg-primary/10 text-primary hover:bg-primary/20\"\n >\n +{assignedAgentNames.length - 2} more\n </Badge>\n )}\n </div>\n </div>\n )}\n </div>\n </CardContent>\n\n <CardFooter className=\"flex flex-col gap-3 pt-3 border-t\">\n {/* Stats Row */}\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <div className={`flex items-center gap-1 transition-all ${isFavoriting ? \"scale-125\" : \"\"\n } ${isFavorited ? \"text-yellow-500\" : \"\"}`}>\n <ThumbsUp className=\"h-3.5 w-3.5\" />\n <span>{prompt.favorite_count || 0}</span>\n\n </div>\n <div className=\"flex items-center gap-1\" title=\"Times used\">\n <Activity className=\"h-3.5 w-3.5\" />\n <span>{prompt.usage_count || 0}</span>\n </div>\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n type=\"button\"\n onClick={() => setIsEditModalOpen(true)}\n >\n <MessageSquare className=\"mr-2 h-3.5 w-3.5\" />\n View\n </Button>\n </div>\n\n {/* Metadata Row */}\n <div className=\"flex flex-col gap-1.5 text-xs text-muted-foreground w-full\">\n <div className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" />\n <span>Created by {creatorName}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n <span>\n Created {formatDistanceToNow(new Date(prompt.createdAt), { addSuffix: true })}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n <span>\n Updated {formatDistanceToNow(new Date(prompt.updatedAt), { addSuffix: true })}\n </span>\n </div>\n </div>\n </CardFooter>\n </Card>\n\n <PromptEditorModal\n open={isEditModalOpen}\n onOpenChange={setIsEditModalOpen}\n prompt={prompt}\n onSuccess={onUpdate}\n user={user}\n />\n </>\n );\n}\n","/**\n * Validates that a variable name follows the allowed pattern\n * Valid: alphanumeric characters and underscores only\n *\n * @param variable - The variable name to validate\n * @returns true if valid, false otherwise\n *\n * @example\n * validateVariableName(\"customer_name\") // Returns: true\n * validateVariableName(\"issue-id\") // Returns: false (hyphen not allowed)\n * validateVariableName(\"user@email\") // Returns: false (@ not allowed)\n */\nexport function validateVariableName(variable: string): boolean {\n if (!variable) return false;\n\n // Only allow alphanumeric characters and underscores\n const validPattern = /^[a-zA-Z0-9_]+$/;\n return validPattern.test(variable);\n}\n\n/**\n * Validates all variables in a prompt content\n *\n * @param content - The prompt content to validate\n * @returns Object with isValid boolean and array of invalid variables\n *\n * @example\n * validatePromptVariables(\"Hello {{name}}, issue {{issue-id}}\")\n * // Returns: { isValid: false, invalidVariables: [\"issue-id\"] }\n */\nexport function validatePromptVariables(content: string): {\n isValid: boolean;\n invalidVariables: string[];\n} {\n if (!content) return { isValid: true, invalidVariables: [] };\n\n // Match all {{...}} patterns, including invalid ones\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n const matches = content.matchAll(regex);\n const invalidVariables: string[] = [];\n\n for (const match of Array.from(matches)) {\n const variableName = match[1];\n if (!validateVariableName(variableName)) {\n invalidVariables.push(variableName);\n }\n }\n\n return {\n isValid: invalidVariables.length === 0,\n invalidVariables,\n };\n}\n","import { useState, useEffect } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { X, Lightbulb, Check, ChevronsUpDown } from \"lucide-react\";\nimport { PromptLibrary } from \"@/types/models/prompt-library\";\nimport { UserWithRole } from \"@/types/models/user\";\nimport { useCreatePrompt, useUpdatePrompt } from \"@/hooks/use-prompts\";\nimport { extractVariables, validatePromptVariables } from \"@/lib/prompts\";\nimport { RBACControl } from \"@/components/rbac\";\nimport { toast } from \"sonner\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"@/components/ui/command\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { useQuery } from \"@apollo/client\";\nimport { GET_AGENTS } from \"@/queries/queries\";\nimport { cn } from \"@/lib/utils\";\n\ninterface PromptEditorModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n prompt?: PromptLibrary;\n onSuccess: () => void;\n user: UserWithRole;\n defaultAssignedAgents?: string[];\n}\n\nexport function PromptEditorModal({\n open,\n onOpenChange,\n prompt,\n onSuccess,\n user,\n defaultAssignedAgents = [],\n}: PromptEditorModalProps) {\n const isEditing = !!prompt;\n const [createPrompt, { loading: creating }] = useCreatePrompt();\n const [updatePrompt, { loading: updating }] = useUpdatePrompt();\n\n // Form state\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [rightsMode, setRightsMode] = useState<\n \"private\" | \"users\" | \"roles\" | \"public\" | \"projects\"\n >(\"private\");\n const [rbacUsers, setRbacUsers] = useState<\n { id: number; rights: \"read\" | \"write\" }[]\n >([]);\n const [rbacRoles, setRbacRoles] = useState<\n { id: string; rights: \"read\" | \"write\" }[]\n >([]);\n const [rbacProjects, setRbacProjects] = useState<\n { id: string; rights: \"read\" | \"write\" }[]\n >([]);\n const [rbacOpen, setRbacOpen] = useState(false);\n const [assignedAgents, setAssignedAgents] = useState<string[]>([]);\n const [agentSelectorOpen, setAgentSelectorOpen] = useState(false);\n\n // Fetch agents\n const { data: agentsData } = useQuery(GET_AGENTS, {\n variables: { page: 1, limit: 100 },\n });\n\n const agents = agentsData?.agentsPagination?.items || [];\n\n // Extract variables from content\n const variables = extractVariables(content);\n const { isValid, invalidVariables } = validatePromptVariables(content);\n\n // Initialize form when editing\n useEffect(() => {\n if (!open) return; // Only run when modal opens\n\n if (prompt) {\n setName(prompt.name);\n setDescription(prompt.description || \"\");\n setContent(prompt.content);\n setRightsMode(prompt.rights_mode);\n setRbacUsers(prompt.RBAC?.users || []);\n setRbacRoles(prompt.RBAC?.roles || []);\n setRbacProjects(prompt.RBAC?.projects || []);\n setAssignedAgents(prompt.assigned_agents || []);\n } else {\n resetForm();\n // Apply default assigned agents when creating new prompt\n if (defaultAssignedAgents && defaultAssignedAgents.length > 0) {\n setAssignedAgents(defaultAssignedAgents);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prompt, open]);\n\n const resetForm = () => {\n setName(\"\");\n setDescription(\"\");\n setContent(\"\");\n setRightsMode(\"private\");\n setRbacUsers([]);\n setRbacRoles([]);\n setRbacProjects([]);\n setRbacOpen(false);\n setAssignedAgents([]);\n };\n\n const handleSubmit = async () => {\n // Validation\n if (!name.trim()) {\n toast.error(\"Please enter a name for the prompt\");\n return;\n }\n if (!content.trim()) {\n toast.error(\"Please enter prompt content\");\n return;\n }\n if (!isValid) {\n toast.error(\n `Invalid variable names: ${invalidVariables.join(\", \")}. Use only letters, numbers, and underscores.`\n );\n return;\n }\n\n try {\n const input = {\n name: name.trim(),\n description: description.trim() || undefined,\n content: content.trim(),\n rights_mode: rightsMode,\n RBAC:\n rightsMode !== \"private\" && rightsMode !== \"public\"\n ? {\n users: rbacUsers.length > 0 ? rbacUsers : undefined,\n roles: rbacRoles.length > 0 ? rbacRoles : undefined,\n projects: rbacProjects.length > 0 ? rbacProjects : undefined,\n }\n : undefined,\n assigned_agents: assignedAgents.length > 0 ? assignedAgents : undefined,\n };\n\n if (isEditing) {\n await updatePrompt({\n variables: {\n id: prompt.id,\n ...input,\n },\n });\n toast.success(\"Prompt updated successfully\");\n } else {\n await createPrompt({\n variables: input,\n });\n toast.success(\"Prompt created successfully\");\n }\n\n onSuccess();\n onOpenChange(false);\n resetForm();\n } catch (error) {\n console.error(error);\n toast.error(isEditing ? \"Failed to update prompt\" : \"Failed to create prompt\");\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{isEditing ? \"Edit Prompt\" : \"Create New Prompt\"}</DialogTitle>\n <DialogDescription>\n {isEditing\n ? \"Update your prompt template\"\n : \"Create a reusable prompt template with variables\"}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-6 py-4\">\n {/* Name */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"name\">\n Name <span className=\"text-destructive\">*</span>\n </Label>\n <Input\n id=\"name\"\n placeholder=\"Customer Support Template\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n\n {/* Description */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">Description</Label>\n <Input\n id=\"description\"\n placeholder=\"Brief description of this prompt\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n\n {/* Content */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"content\">\n Prompt Content <span className=\"text-destructive\">*</span>\n </Label>\n <Textarea\n id=\"content\"\n placeholder=\"You are helping {{customer_name}} with their {{issue}}...\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n rows={8}\n className=\"font-mono text-sm\"\n />\n <div className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Lightbulb className=\"h-3.5 w-3.5 mt-0.5 flex-shrink-0\" />\n <span>\n Use{\" \"}\n <code className=\"bg-muted px-1 py-0.5 rounded\">\n {\"{\"}\n {\"{\"}variable_name{\"}}\"}\n </code>{\" \"}\n format for dynamic content. Variable names can only contain letters,\n numbers, and underscores.\n </span>\n </div>\n\n {/* Detected Variables */}\n {variables.length > 0 && (\n <div className=\"flex flex-wrap gap-1 pt-2\">\n <span className=\"text-xs text-muted-foreground mr-2\">\n Detected variables:\n </span>\n {variables.map((variable) => (\n <Badge key={variable} variant=\"outline\" className=\"text-xs\">\n {variable}\n </Badge>\n ))}\n </div>\n )}\n\n {/* Invalid Variables Warning */}\n {!isValid && (\n <div className=\"text-xs text-destructive\">\n Invalid variable names: {invalidVariables.join(\", \")}\n </div>\n )}\n </div>\n\n {/* Assign to Agents */}\n <div className=\"space-y-2\">\n <Label>Assign to Agents</Label>\n <Popover modal={true} open={agentSelectorOpen} onOpenChange={setAgentSelectorOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={agentSelectorOpen}\n className=\"w-full justify-between\"\n >\n {assignedAgents.length === 0\n ? \"Select agents...\"\n : `${assignedAgents.length} agent${assignedAgents.length !== 1 ? \"s\" : \"\"} selected`}\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-full p-0\">\n <Command>\n <CommandInput placeholder=\"Search agents...\" />\n <CommandList>\n <CommandEmpty>No agents found.</CommandEmpty>\n <CommandGroup>\n {agents.map((agent: any) => (\n <CommandItem\n key={agent.id}\n value={agent.id}\n onSelect={() => {\n setAssignedAgents((prev) =>\n prev.includes(agent.id)\n ? prev.filter((id) => id !== agent.id)\n : [...prev, agent.id]\n );\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n assignedAgents.includes(agent.id)\n ? \"opacity-100\"\n : \"opacity-0\"\n )}\n />\n {agent.name}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n {assignedAgents.length > 0 && (\n <div className=\"flex flex-wrap gap-2 pt-2\">\n {assignedAgents.map((agentId) => {\n const agent = agents.find((a: any) => a.id === agentId);\n return agent ? (\n <Badge key={agentId} variant=\"secondary\" className=\"text-sm\">\n {agent.name}\n <button\n type=\"button\"\n onClick={() =>\n setAssignedAgents((prev) =>\n prev.filter((id) => id !== agentId)\n )\n }\n className=\"ml-1.5 hover:text-destructive\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ) : null;\n })}\n </div>\n )}\n <p className=\"text-xs text-muted-foreground\">\n Assign this prompt to specific agents to show it as recommended in chat\n </p>\n </div>\n\n {/* RBAC Control */}\n <Collapsible open={rbacOpen} onOpenChange={setRbacOpen}>\n <div className=\"space-y-2\">\n <CollapsibleTrigger asChild>\n <Button variant=\"outline\" className=\"w-full justify-between\">\n Access Control\n <span className=\"text-xs text-muted-foreground\">\n {rightsMode === \"private\" && \"Private\"}\n {rightsMode === \"public\" && \"Public\"}\n {rightsMode === \"users\" && `${rbacUsers.length} users`}\n {rightsMode === \"roles\" && `${rbacRoles.length} roles`}\n {rightsMode === \"projects\" && `${rbacProjects.length} projects`}\n </span>\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-2\">\n <RBACControl\n initialRightsMode={rightsMode}\n initialUsers={rbacUsers}\n initialRoles={rbacRoles}\n modalMode={true}\n initialProjects={rbacProjects}\n onChange={(mode, users, roles, projects) => {\n setRightsMode(mode);\n setRbacUsers(users);\n setRbacRoles(roles);\n setRbacProjects(projects);\n }}\n />\n </CollapsibleContent>\n </div>\n </Collapsible>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={creating || updating || !name.trim() || !content.trim() || !isValid}\n >\n {creating || updating ? \"Saving...\" : isEditing ? \"Save Changes\" : \"Create Prompt\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMutation, useQuery } from \"@apollo/client\";\nimport {\n CREATE_PROMPT,\n CREATE_PROMPT_FAVORITE,\n DELETE_PROMPT,\n DELETE_PROMPT_FAVORITE,\n GET_PROMPT_BY_ID,\n GET_PROMPTS,\n GET_USER_PROMPT_FAVORITES,\n INCREMENT_PROMPT_FAVORITES,\n INCREMENT_PROMPT_USAGE,\n UPDATE_PROMPT,\n} from \"@/queries/queries\";\nimport {\n CreatePromptInput,\n PromptFavorite,\n PromptLibrary,\n UpdatePromptInput,\n} from \"@/types/models/prompt-library\";\n\ninterface PromptsData {\n prompt_libraryPagination: {\n pageInfo: {\n pageCount: number;\n itemCount: number;\n currentPage: number;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n };\n items: PromptLibrary[];\n };\n}\n\ninterface PromptData {\n prompt_library_itemById: PromptLibrary;\n}\n\ninterface PromptFavoritesData {\n prompt_favoritesPagination: {\n items: PromptFavorite[];\n };\n}\n\n/**\n * Hook to fetch paginated prompts with filtering and sorting\n */\nexport const usePrompts = (variables?: {\n page?: number;\n limit?: number;\n filters?: any[];\n sort?: { field: string; direction: \"ASC\" | \"DESC\" };\n}) => {\n return useQuery<PromptsData>(GET_PROMPTS, {\n variables: {\n page: variables?.page ?? 1,\n limit: variables?.limit ?? 20,\n filters: variables?.filters ?? [],\n sort: variables?.sort ?? { field: \"updatedAt\", direction: \"DESC\" },\n },\n });\n};\n\n/**\n * Hook to fetch a single prompt by ID\n */\nexport const usePrompt = (id: string) => {\n return useQuery<PromptData>(GET_PROMPT_BY_ID, {\n variables: { id },\n skip: !id,\n });\n};\n\n/**\n * Hook to create a new prompt\n */\nexport const useCreatePrompt = () => {\n return useMutation<{ prompt_libraryCreateOne: { item: PromptLibrary } }>(\n CREATE_PROMPT,\n {\n refetchQueries: [{ query: GET_PROMPTS, variables: { page: 1, limit: 20 } }],\n }\n );\n};\n\n/**\n * Hook to update an existing prompt\n */\nexport const useUpdatePrompt = () => {\n return useMutation<{ prompt_libraryUpdateOneById: { item: PromptLibrary } }>(\n UPDATE_PROMPT\n );\n};\n\n/**\n * Hook to delete a prompt\n */\nexport const useDeletePrompt = () => {\n return useMutation<{ prompt_libraryRemoveOneById: { id: string } }>(\n DELETE_PROMPT,\n {\n refetchQueries: [{ query: GET_PROMPTS, variables: { page: 1, limit: 20 } }],\n }\n );\n};\n\n/**\n * Hook to increment prompt usage count\n */\nexport const useIncrementPromptUsage = () => {\n return useMutation<{\n prompt_libraryUpdateOneById: { item: Pick<PromptLibrary, \"id\" | \"usage_count\"> };\n }>(INCREMENT_PROMPT_USAGE);\n};\n\n/**\n * Hook to fetch user's favorited prompts\n */\nexport const useUserPromptFavorites = (userId: number) => {\n return useQuery<PromptFavoritesData>(GET_USER_PROMPT_FAVORITES, {\n variables: { user_id: userId },\n skip: !userId,\n });\n};\n\n/**\n * Hook to create a prompt favorite\n */\nexport const useCreatePromptFavorite = () => {\n return useMutation<{ prompt_favoritesCreateOne: { item: PromptFavorite } }>(\n CREATE_PROMPT_FAVORITE\n );\n};\n\n/**\n * Hook to delete a prompt favorite\n */\nexport const useDeletePromptFavorite = () => {\n return useMutation<{ prompt_favoritesRemoveOneById: { id: string } }>(\n DELETE_PROMPT_FAVORITE\n );\n};\n\n/**\n * Hook to toggle favorite status of a prompt\n * Handles both creating and deleting favorites, and updating the favorite count\n */\nexport const useTogglePromptFavorite = () => {\n const [createFavorite] = useCreatePromptFavorite();\n const [deleteFavorite] = useDeletePromptFavorite();\n const [incrementFavorites] = useMutation(INCREMENT_PROMPT_FAVORITES);\n\n const toggleFavorite = async (\n promptId: string,\n userId: number,\n isFavorited: boolean,\n currentFavoriteCount: number,\n favoriteId?: string\n ) => {\n if (isFavorited && favoriteId) {\n // Remove favorite\n await deleteFavorite({ variables: { id: favoriteId } });\n await incrementFavorites({\n variables: {\n id: promptId,\n favorite_count: Math.max(0, currentFavoriteCount - 1),\n },\n });\n } else {\n // Add favorite\n await createFavorite({\n variables: { user_id: userId, prompt_id: promptId },\n });\n await incrementFavorites({\n variables: { id: promptId, favorite_count: currentFavoriteCount + 1 },\n });\n }\n };\n\n return { toggleFavorite };\n};\n","/**\n * Extracts all variable names from a prompt template\n * Variables are in the format {{variable_name}}\n * Only alphanumeric characters and underscores are allowed in variable names\n *\n * @param content - The prompt content to extract variables from\n * @returns Array of unique variable names found in the content\n *\n * @example\n * extractVariables(\"Hello {{name}}, your issue {{issue_id}} is resolved\")\n * // Returns: [\"name\", \"issue_id\"]\n */\nexport function extractVariables(content: string): string[] {\n if (!content) return [];\n\n // Match {{variable_name}} where variable_name contains only alphanumeric and underscore\n const regex = /\\{\\{([a-zA-Z0-9_]+)\\}\\}/g;\n const matches = content.matchAll(regex);\n const variables = new Set<string>();\n\n for (const match of Array.from(matches)) {\n variables.add(match[1]);\n }\n\n return Array.from(variables).sort();\n}\n"],"names":["PromptCard","param","agentsData","creatorData","prompt","user","onUpdate","isEditModalOpen","setIsEditModalOpen","useState","isFavoriting","setIsFavoriting","deletePrompt","useDeletePrompt","toggleFavorite","useTogglePromptFavorite","hasWriteAccess","checkPromptWriteAccess","isPrivate","rights_mode","isPublic","byUsers","byRoles","isAdmin","super_admin","isCreator","created_by","id","toString","writeAccess","userAccess","RBAC","users","find","u","rights","roleAccess","roles","r","role","variables","extractVariables","content","isFavorited","is_favorited","data","useQuery","GET_AGENTS_BY_IDS","ids","assigned_agents","skip","length","assignedAgentNames","agentByIds","map","agent","name","GET_USER_BY_ID","creatorName","userById","handleDelete","confirm","toast","success","error","console","handleToggleFavorite","favorite_count","undefined","icon","duration","Promise","resolve","setTimeout","jsx_runtime","jsxs","Fragment","Card","className","jsx","CardHeader","div","h3","description","p","Button","variant","size","concat","onClick","disabled","ThumbsUp","DropdownMenu","modal","DropdownMenuTrigger","asChild","MoreVertical","DropdownMenuContent","align","DropdownMenuItem","navigator","clipboard","writeText","Copy","Edit","Trash2","CardContent","Badge","Bot","span","slice","index","CardFooter","title","Activity","usage_count","type","MessageSquare","User","Calendar","formatDistanceToNow","Date","createdAt","addSuffix","Clock","updatedAt","PromptEditorModal","open","onOpenChange","onSuccess","defaultAssignedAgents","isEditing","createPrompt","loading","creating","useCreatePrompt","updatePrompt","updating","useUpdatePrompt","setName","setDescription","setContent","rightsMode","setRightsMode","rbacUsers","setRbacUsers","rbacRoles","setRbacRoles","rbacProjects","setRbacProjects","rbacOpen","setRbacOpen","assignedAgents","setAssignedAgents","agentSelectorOpen","setAgentSelectorOpen","GET_AGENTS","page","limit","agents","agentsPagination","items","isValid","invalidVariables","validatePromptVariables","matches","matchAll","match","Array","from","variableName","validPattern","test","push","useEffect","projects","resetForm","handleSubmit","trim","join","input","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","htmlFor","Input","placeholder","value","onChange","e","target","Textarea","rows","Lightbulb","code","variable","Popover","PopoverTrigger","aria-expanded","ChevronsUpDown","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","onSelect","prev","includes","filter","Check","cn","a","agentId","button","X","Collapsible","CollapsibleTrigger","CollapsibleContent","RBACControl","initialRightsMode","initialUsers","initialRoles","modalMode","initialProjects","mode","DialogFooter","usePrompts","GET_PROMPTS","filters","sort","field","direction","useMutation","CREATE_PROMPT","refetchQueries","query","UPDATE_PROMPT","DELETE_PROMPT","useIncrementPromptUsage","INCREMENT_PROMPT_USAGE","useCreatePromptFavorite","CREATE_PROMPT_FAVORITE","useDeletePromptFavorite","DELETE_PROMPT_FAVORITE","createFavorite","deleteFavorite","incrementFavorites","INCREMENT_PROMPT_FAVORITES","promptId","userId","currentFavoriteCount","favoriteId","Math","max","user_id","prompt_id","Set","add"],"sourceRoot":""}