@nextclaw/ui 0.11.21 → 0.11.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/assets/{ChannelsList-ByHWHkQS.js → ChannelsList-Zeys_w43.js} +6 -6
- package/dist/assets/ChatPage-DWOU_8P6.js +43 -0
- package/dist/assets/DocBrowser-B9OaZjmg.js +1 -0
- package/dist/assets/{DocBrowser-3y_NHZ71.js → DocBrowser-BmtBLFU0.js} +1 -1
- package/dist/assets/{DocBrowserContext-CVJuwCcw.js → DocBrowserContext-YIKkPb76.js} +1 -1
- package/dist/assets/{LogoBadge-D8fyilO-.js → LogoBadge-F7ZWdxLT.js} +1 -1
- package/dist/assets/MarketplacePage-BfaTTqN6.js +1 -0
- package/dist/assets/{MarketplacePage-CmhsZXr1.js → MarketplacePage-Cd4faegU.js} +2 -2
- package/dist/assets/{McpMarketplacePage-C7PkCYbp.js → McpMarketplacePage-C09Ngs7O.js} +2 -2
- package/dist/assets/ModelConfig-DJgdcgvQ.js +1 -0
- package/dist/assets/ProvidersList-w0rVFIBf.js +1 -0
- package/dist/assets/RemoteAccessPage-BJ_ckkOV.js +1 -0
- package/dist/assets/RuntimeConfig-Cmn2xPQO.js +1 -0
- package/dist/assets/{SearchConfig-Dm7r2yfp.js → SearchConfig-BT13qpR_.js} +1 -1
- package/dist/assets/{SecretsConfig-BBP_mbQh.js → SecretsConfig-CvqEVn0B.js} +2 -2
- package/dist/assets/{SessionsConfig-6wNJloZN.js → SessionsConfig-DHHcYznk.js} +2 -2
- package/dist/assets/{book-open-B26jGBjY.js → book-open-CXoF5nQC.js} +1 -1
- package/dist/assets/chat-session-display-VW6ZMvZP.js +1 -0
- package/dist/assets/{chunk-JZWAC4HX-B-4B29RN.js → chunk-JZWAC4HX-CvRWvTy5.js} +1 -1
- package/dist/assets/{config-BaC29Qf-.js → config-DJswxxE8.js} +1 -1
- package/dist/assets/{createLucideIcon-DiFAvXmK.js → createLucideIcon-CjGHOWb6.js} +1 -1
- package/dist/assets/{dist-pCfWPG1A.js → dist-Cl2QB-2y.js} +1 -1
- package/dist/assets/{dist-kW_O3kyZ.js → dist-nqTTbVdA.js} +1 -1
- package/dist/assets/{external-link-D5-p-Gmm.js → external-link-tIO7zING.js} +1 -1
- package/dist/assets/{hash-BlwrSV0q.js → hash-JWUyl1pT.js} +1 -1
- package/dist/assets/i18n-CDHMXlRZ.js +1 -0
- package/dist/assets/index-BlH4-cBw.css +1 -0
- package/dist/assets/{index-DvKS3L9j.js → index-C6d0xmtm.js} +3 -3
- package/dist/assets/{label-RyXfZqkP.js → label-BIpeNu4r.js} +1 -1
- package/dist/assets/loader-circle-Cs8XVFTw.js +1 -0
- package/dist/assets/{logos-Bpl8QTgI.js → logos-DThdM9lk.js} +1 -1
- package/dist/assets/{page-layout--S0YBU0W.js → page-layout-D3Xo605Z.js} +1 -1
- package/dist/assets/plus-PHf8q-Ct.js +1 -0
- package/dist/assets/{popover-BEjfbEwy.js → popover-BJRUGA_H.js} +1 -1
- package/dist/assets/provider-models-bz5y28rq.js +1 -0
- package/dist/assets/{react-BuSP2-8B.js → react-7ZHqQtEV.js} +1 -1
- package/dist/assets/refresh-ccw-CC6-_QuL.js +1 -0
- package/dist/assets/{save-DPPPpD_c.js → save-DJM5RRWW.js} +1 -1
- package/dist/assets/search-C91yH_6y.js +1 -0
- package/dist/assets/{security-config-6t78Ph-I.js → security-config-T5zpg16O.js} +1 -1
- package/dist/assets/{select-CT50pzod.js → select-DSkTc61S.js} +1 -1
- package/dist/assets/skeleton-Dzg-HOiN.js +1 -0
- package/dist/assets/{status-dot-BbBqRHfh.js → status-dot-LNBlDu3q.js} +1 -1
- package/dist/assets/{switch-D3l6AcCk.js → switch-Bo-Y46HZ.js} +1 -1
- package/dist/assets/tabs-custom-DXv507_2.js +1 -0
- package/dist/assets/{trash-2-B2_AGVE3.js → trash-2-DFZmW6Gg.js} +1 -1
- package/dist/assets/useConfirmDialog-Bs5Ll17m.js +1 -0
- package/dist/assets/{useMutation-BzCrO8j-.js → useMutation-DrZrOgVL.js} +1 -1
- package/dist/assets/x-D7Q1yqSF.js +1 -0
- package/dist/index.html +18 -18
- package/package.json +3 -3
- package/src/api/ncp-session.test.ts +37 -0
- package/src/api/ncp-session.ts +29 -1
- package/src/api/server-path.ts +23 -0
- package/src/api/types.ts +41 -0
- package/src/components/chat/ChatConversationPanel.test.tsx +43 -7
- package/src/components/chat/ChatConversationPanel.tsx +23 -17
- package/src/components/chat/ChatSidebar.test.tsx +2 -2
- package/src/components/chat/ChatSidebar.tsx +2 -2
- package/src/components/chat/adapters/chat-input-bar.adapter.test.ts +1 -0
- package/src/components/chat/adapters/chat-input-bar.adapter.ts +7 -2
- package/src/components/chat/adapters/chat-message-part.adapter.ts +13 -9
- package/src/components/chat/adapters/chat-message.adapter.test.ts +76 -4
- package/src/components/chat/adapters/{chat-message.file-operation-card.ts → file-operation/card.ts} +74 -181
- package/src/components/chat/adapters/{chat-message.file-operation-diff.ts → file-operation/diff.ts} +178 -188
- package/src/components/chat/adapters/file-operation/line-builder.ts +249 -0
- package/src/components/chat/adapters/file-operation/record-readers.ts +233 -0
- package/src/components/chat/chat-composer-state.ts +3 -3
- package/src/components/chat/chat-session-display.test.ts +21 -0
- package/src/components/chat/chat-session-display.ts +6 -1
- package/src/components/chat/containers/chat-input-bar.container.tsx +21 -24
- package/src/components/chat/hooks/use-chat-session-label.ts +19 -0
- package/src/components/chat/hooks/use-chat-session-project.test.tsx +117 -0
- package/src/components/chat/hooks/use-chat-session-project.ts +40 -0
- package/src/components/chat/{chat-session-label.service.ts → hooks/use-chat-session-update.ts} +11 -7
- package/src/components/chat/managers/chat-session-list.manager.ts +5 -1
- package/src/components/chat/ncp/NcpChatPage.tsx +55 -17
- package/src/components/chat/ncp/ncp-chat-page-data.test.ts +33 -0
- package/src/components/chat/ncp/ncp-chat-page-data.ts +21 -15
- package/src/components/chat/ncp/ncp-session-adapter.test.ts +3 -0
- package/src/components/chat/ncp/ncp-session-adapter.ts +16 -0
- package/src/components/chat/session-header/chat-session-header-actions.test.tsx +63 -0
- package/src/components/chat/session-header/chat-session-header-actions.tsx +95 -0
- package/src/components/chat/session-header/chat-session-header-menu-item.tsx +35 -0
- package/src/components/chat/session-header/chat-session-project-badge.test.tsx +66 -0
- package/src/components/chat/session-header/chat-session-project-badge.tsx +102 -0
- package/src/components/chat/session-header/chat-session-project-dialog.tsx +34 -0
- package/src/components/chat/stores/chat-input.store.ts +6 -3
- package/src/components/chat/stores/chat-thread.store.ts +6 -2
- package/src/components/path-picker/server-path-picker-dialog.test.tsx +92 -0
- package/src/components/path-picker/server-path-picker-dialog.tsx +282 -0
- package/src/hooks/server-path/use-server-path-browse.ts +19 -0
- package/src/hooks/useConfig.ts +26 -1
- package/src/lib/i18n/i18n-language-owner.ts +94 -0
- package/src/lib/i18n/i18n.path-picker.ts +12 -0
- package/src/lib/i18n.chat.ts +23 -0
- package/src/lib/i18n.ts +21 -84
- package/src/lib/session-project/session-project.utils.ts +30 -0
- package/dist/assets/ChatPage-FdT3pDnw.js +0 -42
- package/dist/assets/DocBrowser-CMdPdbZj.js +0 -1
- package/dist/assets/MarketplacePage-9oKmxN2n.js +0 -1
- package/dist/assets/ModelConfig-DmCY6jWM.js +0 -1
- package/dist/assets/ProvidersList-ClT-34aX.js +0 -1
- package/dist/assets/RemoteAccessPage-B6hUZl1O.js +0 -1
- package/dist/assets/RuntimeConfig-C5aqliGk.js +0 -1
- package/dist/assets/chat-session-display-Bjmn4aIZ.js +0 -1
- package/dist/assets/i18n-CSytxMFI.js +0 -1
- package/dist/assets/index-CUy6doWo.css +0 -1
- package/dist/assets/loader-circle-B2J777gj.js +0 -1
- package/dist/assets/plus-CM9XJ0Tf.js +0 -1
- package/dist/assets/provider-models-C8JQUd1E.js +0 -1
- package/dist/assets/search-Ctaw34Kp.js +0 -1
- package/dist/assets/skeleton-Bycyb0zU.js +0 -1
- package/dist/assets/tabs-custom-TZQ5WPWP.js +0 -1
- package/dist/assets/useConfirmDialog-BDpdjfIO.js +0 -1
- package/dist/assets/x-CHOBE-63.js +0 -1
- /package/dist/assets/{config-hints-fGnUjDe9.js → config-hints-WtpHP_DW.js} +0 -0
- /package/dist/assets/{config-layout-B-7erZRN.js → config-layout-LQ10ozRC.js} +0 -0
- /package/dist/assets/{marketplace-localization-CXeGRf6E.js → marketplace-localization-CxSTG9wr.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,
|
|
1
|
+
import{_ as e,i as t,m as n,p as r}from"./i18n-CDHMXlRZ.js";import{n as i,o as a}from"./dist-Cl2QB-2y.js";import{B as o,G as s,H as c,J as l,K as u,U as d,V as f,W as p,Y as m,q as h,z as g}from"./index-C6d0xmtm.js";import{t as _}from"./label-BIpeNu4r.js";import{n as v,t as y}from"./page-layout-D3Xo605Z.js";import{t as b}from"./switch-Bo-Y46HZ.js";var x=e(n(),1),S=r(),C=8;function w(e){return e.trim().length>=C}function T(e,n){return e===n?!0:(i.error(t(`authPasswordMismatch`)),!1)}function E(){let e=g(),n=f(),r=c(),i=d(),v=o(),[y,C]=(0,x.useState)(``),[E,D]=(0,x.useState)(``),[O,k]=(0,x.useState)(``),[A,j]=(0,x.useState)(``),[M,N]=(0,x.useState)(``),P=e.data,F=y.trim().length>0&&w(E)&&E===O&&!n.isPending,I=w(A)&&A===M&&!i.isPending,L=async()=>{if(T(E,O))try{await n.mutateAsync({username:y.trim(),password:E}),D(``),k(``)}catch{}},R=async()=>{if(T(A,M))try{await i.mutateAsync({password:A}),j(``),N(``)}catch{}},z=async e=>{try{await r.mutateAsync({enabled:e})}catch{}},B=async()=>{try{await v.mutateAsync()}catch{}};return e.isLoading&&!P?(0,S.jsxs)(s,{children:[(0,S.jsxs)(l,{children:[(0,S.jsx)(m,{children:t(`authSecurityTitle`)}),(0,S.jsx)(h,{children:t(`authSecurityDescription`)})]}),(0,S.jsx)(u,{className:`text-sm text-gray-500`,children:t(`loading`)})]}):e.isError||!P?(0,S.jsxs)(s,{children:[(0,S.jsxs)(l,{children:[(0,S.jsx)(m,{children:t(`authSecurityTitle`)}),(0,S.jsx)(h,{children:t(`authSecurityDescription`)})]}),(0,S.jsxs)(u,{className:`space-y-4`,children:[(0,S.jsx)(`p`,{className:`text-sm text-gray-500`,children:t(`authStatusLoadFailed`)}),(0,S.jsx)(a,{variant:`outline`,onClick:()=>{e.refetch()},children:t(`authRetryStatus`)})]})]}):P.configured?(0,S.jsxs)(s,{children:[(0,S.jsxs)(l,{children:[(0,S.jsx)(m,{children:t(`authSecurityTitle`)}),(0,S.jsx)(h,{children:t(`authSecurityDescription`)})]}),(0,S.jsxs)(u,{className:`space-y-6`,children:[(0,S.jsxs)(`div`,{className:`rounded-xl border border-gray-200 p-4`,children:[(0,S.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-start md:justify-between`,children:[(0,S.jsxs)(`div`,{className:`space-y-1`,children:[(0,S.jsx)(`p`,{className:`text-sm font-medium text-gray-900`,children:t(`authStatusLabel`)}),(0,S.jsx)(`p`,{className:`text-sm text-gray-600`,children:t(`authStatusConfiguredUser`).replace(`{username}`,P.username??``)}),(0,S.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`authUsernameFixedHelp`)})]}),(0,S.jsx)(`span`,{className:`inline-flex items-center rounded-full bg-gray-100 px-3 py-1 text-xs font-medium text-gray-700`,children:P.enabled?t(`enabled`):t(`disabled`)})]}),(0,S.jsxs)(`div`,{className:`mt-4 flex flex-col gap-4 border-t border-gray-200 pt-4 md:flex-row md:items-center md:justify-between`,children:[(0,S.jsxs)(`div`,{className:`space-y-1`,children:[(0,S.jsx)(`p`,{className:`text-sm font-medium text-gray-900`,children:t(`authEnableLabel`)}),(0,S.jsx)(`p`,{className:`text-xs text-gray-500`,children:P.enabled?t(`authEnableOnHelp`):t(`authEnableOffHelp`)})]}),(0,S.jsx)(b,{checked:P.enabled,disabled:r.isPending,onCheckedChange:e=>{z(e)}})]})]}),(0,S.jsxs)(`div`,{className:`rounded-xl border border-gray-200 p-4 space-y-4`,children:[(0,S.jsxs)(`div`,{className:`space-y-1`,children:[(0,S.jsx)(`p`,{className:`text-sm font-medium text-gray-900`,children:t(`authPasswordSectionTitle`)}),(0,S.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`authPasswordSectionDescription`)})]}),(0,S.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsx)(_,{htmlFor:`auth-password-next`,children:t(`authPassword`)}),(0,S.jsx)(p,{id:`auth-password-next`,type:`password`,value:A,onChange:e=>j(e.target.value),placeholder:t(`authPasswordPlaceholder`)})]}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsx)(_,{htmlFor:`auth-password-confirm`,children:t(`authConfirmPassword`)}),(0,S.jsx)(p,{id:`auth-password-confirm`,type:`password`,value:M,onChange:e=>N(e.target.value),placeholder:t(`authConfirmPasswordPlaceholder`)})]})]}),(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,S.jsx)(a,{type:`button`,disabled:!I,onClick:()=>void R(),children:i.isPending?t(`authPasswordUpdating`):t(`authPasswordAction`)}),P.enabled&&P.authenticated?(0,S.jsx)(a,{type:`button`,variant:`outline`,disabled:v.isPending,onClick:()=>void B(),children:v.isPending?t(`authLoggingOut`):t(`authLogoutAction`)}):null]}),(0,S.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`authSessionMemoryNotice`)})]})]})]}):(0,S.jsxs)(s,{children:[(0,S.jsxs)(l,{children:[(0,S.jsx)(m,{children:t(`authSecurityTitle`)}),(0,S.jsx)(h,{children:t(`authSecurityDescription`)})]}),(0,S.jsxs)(u,{className:`space-y-5`,children:[(0,S.jsxs)(`div`,{className:`rounded-xl border border-dashed border-gray-200 bg-gray-50/70 p-4`,children:[(0,S.jsx)(`p`,{className:`text-sm font-medium text-gray-900`,children:t(`authSetupTitle`)}),(0,S.jsx)(`p`,{className:`mt-1 text-sm text-gray-500`,children:t(`authSetupDescription`)})]}),(0,S.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsx)(_,{htmlFor:`auth-setup-username`,children:t(`authUsername`)}),(0,S.jsx)(p,{id:`auth-setup-username`,value:y,onChange:e=>C(e.target.value),placeholder:t(`authUsernamePlaceholder`)})]}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsx)(_,{htmlFor:`auth-setup-password`,children:t(`authPassword`)}),(0,S.jsx)(p,{id:`auth-setup-password`,type:`password`,value:E,onChange:e=>D(e.target.value),placeholder:t(`authPasswordPlaceholder`)})]})]}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsx)(_,{htmlFor:`auth-setup-confirm`,children:t(`authConfirmPassword`)}),(0,S.jsx)(p,{id:`auth-setup-confirm`,type:`password`,value:O,onChange:e=>k(e.target.value),placeholder:t(`authConfirmPasswordPlaceholder`)}),(0,S.jsx)(`p`,{className:`text-xs text-gray-500`,children:t(`authPasswordMinLengthHint`)})]}),(0,S.jsx)(a,{type:`button`,disabled:!F,onClick:()=>void L(),children:n.isPending?t(`authSettingUp`):t(`authSetupAction`)})]})]})}function D(){return(0,S.jsxs)(v,{className:`space-y-6`,children:[(0,S.jsx)(y,{title:t(`authSecurityTitle`),description:t(`authSecurityDescription`)}),(0,S.jsx)(E,{})]})}export{D as SecurityConfig};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as e,m as t,p as n,u as r}from"./i18n-CSytxMFI.js";import{N as i}from"./dist-pCfWPG1A.js";import{t as a}from"./createLucideIcon-DiFAvXmK.js";typeof window<`u`&&window.document&&window.document.createElement;function o(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),n===!1||!r.defaultPrevented)return t?.(r)}}var s=e(t(),1);function c(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}function l(...e){return t=>{let n=!1,r=e.map(e=>{let r=c(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){let n=r[t];typeof n==`function`?n():c(e[t],null)}}}}function u(...e){return s.useCallback(l(...e),e)}var d=n();function f(e,t){let n=s.createContext(t),r=e=>{let{children:t,...r}=e,i=s.useMemo(()=>r,Object.values(r));return(0,d.jsx)(n.Provider,{value:i,children:t})};r.displayName=e+`Provider`;function i(r){let i=s.useContext(n);if(i)return i;if(t!==void 0)return t;throw Error(`\`${r}\` must be used within \`${e}\``)}return[r,i]}function p(e,t=[]){let n=[];function r(t,r){let i=s.createContext(r),a=n.length;n=[...n,r];let o=t=>{let{scope:n,children:r,...o}=t,c=n?.[e]?.[a]||i,l=s.useMemo(()=>o,Object.values(o));return(0,d.jsx)(c.Provider,{value:l,children:r})};o.displayName=t+`Provider`;function c(n,o){let c=o?.[e]?.[a]||i,l=s.useContext(c);if(l)return l;if(r!==void 0)return r;throw Error(`\`${n}\` must be used within \`${t}\``)}return[o,c]}let i=()=>{let t=n.map(e=>s.createContext(e));return function(n){let r=n?.[e]||t;return s.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])}};return i.scopeName=e,[r,m(i,...t)]}function m(...e){let t=e[0];if(e.length===1)return t;let n=()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let r=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return s.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])}};return n.scopeName=t.scopeName,n}var h=globalThis?.document?s.useLayoutEffect:()=>{},g=s.useId||(()=>void 0),_=0;function v(e){let[t,n]=s.useState(g());return h(()=>{e||n(e=>e??String(_++))},[e]),e||(t?`radix-${t}`:``)}var y=s.useInsertionEffect||h;function b({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){let[i,a,o]=x({defaultProp:t,onChange:n}),c=e!==void 0,l=c?e:i;{let t=s.useRef(e!==void 0);s.useEffect(()=>{let e=t.current;e!==c&&console.warn(`${r} is changing from ${e?`controlled`:`uncontrolled`} to ${c?`controlled`:`uncontrolled`}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),t.current=c},[c,r])}return[l,s.useCallback(t=>{if(c){let n=S(t)?t(e):t;n!==e&&o.current?.(n)}else a(t)},[c,e,a,o])]}function x({defaultProp:e,onChange:t}){let[n,r]=s.useState(e),i=s.useRef(n),a=s.useRef(t);return y(()=>{a.current=t},[t]),s.useEffect(()=>{i.current!==n&&(a.current?.(n),i.current=n)},[n,i]),[n,r,a]}function S(e){return typeof e==`function`}function C(e){let t=w(e),n=s.forwardRef((e,n)=>{let{children:r,...i}=e,a=s.Children.toArray(r),o=a.find(D);if(o){let e=o.props.children,r=a.map(t=>t===o?s.Children.count(e)>1?s.Children.only(null):s.isValidElement(e)?e.props.children:null:t);return(0,d.jsx)(t,{...i,ref:n,children:s.isValidElement(e)?s.cloneElement(e,void 0,r):null})}return(0,d.jsx)(t,{...i,ref:n,children:r})});return n.displayName=`${e}.Slot`,n}function w(e){let t=s.forwardRef((e,t)=>{let{children:n,...r}=e;if(s.isValidElement(n)){let e=k(n),i=O(r,n.props);return n.type!==s.Fragment&&(i.ref=t?l(t,e):e),s.cloneElement(n,i)}return s.Children.count(n)>1?s.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var T=Symbol(`radix.slottable`);function E(e){let t=({children:e})=>(0,d.jsx)(d.Fragment,{children:e});return t.displayName=`${e}.Slottable`,t.__radixId=T,t}function D(e){return s.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===T}function O(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`&&(n[r]=[i,a].filter(Boolean).join(` `))}return{...e,...n}}function k(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var A=e(i(),1),j=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=C(`Primitive.${t}`),r=s.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,d.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function M(e,t){e&&A.flushSync(()=>e.dispatchEvent(t))}function N(e){let t=s.useRef(e);return s.useEffect(()=>{t.current=e}),s.useMemo(()=>(...e)=>t.current?.(...e),[])}function P(e,t=globalThis?.document){let n=N(e);s.useEffect(()=>{let e=e=>{e.key===`Escape`&&n(e)};return t.addEventListener(`keydown`,e,{capture:!0}),()=>t.removeEventListener(`keydown`,e,{capture:!0})},[n,t])}var F=`DismissableLayer`,ee=`dismissableLayer.update`,te=`dismissableLayer.pointerDownOutside`,ne=`dismissableLayer.focusOutside`,I,L=s.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),re=s.forwardRef((e,t)=>{let{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:i,onFocusOutside:a,onInteractOutside:c,onDismiss:l,...f}=e,p=s.useContext(L),[m,h]=s.useState(null),g=m?.ownerDocument??globalThis?.document,[,_]=s.useState({}),v=u(t,e=>h(e)),y=Array.from(p.layers),[b]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),x=y.indexOf(b),S=m?y.indexOf(m):-1,C=p.layersWithOutsidePointerEventsDisabled.size>0,w=S>=x,T=oe(e=>{let t=e.target,n=[...p.branches].some(e=>e.contains(t));!w||n||(i?.(e),c?.(e),e.defaultPrevented||l?.())},g),E=se(e=>{let t=e.target;[...p.branches].some(e=>e.contains(t))||(a?.(e),c?.(e),e.defaultPrevented||l?.())},g);return P(e=>{S===p.layers.size-1&&(r?.(e),!e.defaultPrevented&&l&&(e.preventDefault(),l()))},g),s.useEffect(()=>{if(m)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(I=g.body.style.pointerEvents,g.body.style.pointerEvents=`none`),p.layersWithOutsidePointerEventsDisabled.add(m)),p.layers.add(m),ce(),()=>{n&&p.layersWithOutsidePointerEventsDisabled.size===1&&(g.body.style.pointerEvents=I)}},[m,g,n,p]),s.useEffect(()=>()=>{m&&(p.layers.delete(m),p.layersWithOutsidePointerEventsDisabled.delete(m),ce())},[m,p]),s.useEffect(()=>{let e=()=>_({});return document.addEventListener(ee,e),()=>document.removeEventListener(ee,e)},[]),(0,d.jsx)(j.div,{...f,ref:v,style:{pointerEvents:C?w?`auto`:`none`:void 0,...e.style},onFocusCapture:o(e.onFocusCapture,E.onFocusCapture),onBlurCapture:o(e.onBlurCapture,E.onBlurCapture),onPointerDownCapture:o(e.onPointerDownCapture,T.onPointerDownCapture)})});re.displayName=F;var ie=`DismissableLayerBranch`,ae=s.forwardRef((e,t)=>{let n=s.useContext(L),r=s.useRef(null),i=u(t,r);return s.useEffect(()=>{let e=r.current;if(e)return n.branches.add(e),()=>{n.branches.delete(e)}},[n.branches]),(0,d.jsx)(j.div,{...e,ref:i})});ae.displayName=ie;function oe(e,t=globalThis?.document){let n=N(e),r=s.useRef(!1),i=s.useRef(()=>{});return s.useEffect(()=>{let e=e=>{if(e.target&&!r.current){let r=function(){le(te,n,a,{discrete:!0})},a={originalEvent:e};e.pointerType===`touch`?(t.removeEventListener(`click`,i.current),i.current=r,t.addEventListener(`click`,i.current,{once:!0})):r()}else t.removeEventListener(`click`,i.current);r.current=!1},a=window.setTimeout(()=>{t.addEventListener(`pointerdown`,e)},0);return()=>{window.clearTimeout(a),t.removeEventListener(`pointerdown`,e),t.removeEventListener(`click`,i.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function se(e,t=globalThis?.document){let n=N(e),r=s.useRef(!1);return s.useEffect(()=>{let e=e=>{e.target&&!r.current&&le(ne,n,{originalEvent:e},{discrete:!1})};return t.addEventListener(`focusin`,e),()=>t.removeEventListener(`focusin`,e)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function ce(){let e=new CustomEvent(ee);document.dispatchEvent(e)}function le(e,t,n,{discrete:r}){let i=n.originalEvent.target,a=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&i.addEventListener(e,t,{once:!0}),r?M(i,a):i.dispatchEvent(a)}var ue=`focusScope.autoFocusOnMount`,de=`focusScope.autoFocusOnUnmount`,fe={bubbles:!1,cancelable:!0},pe=`FocusScope`,me=s.forwardRef((e,t)=>{let{loop:n=!1,trapped:r=!1,onMountAutoFocus:i,onUnmountAutoFocus:a,...o}=e,[c,l]=s.useState(null),f=N(i),p=N(a),m=s.useRef(null),h=u(t,e=>l(e)),g=s.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;s.useEffect(()=>{if(r){let e=function(e){if(g.paused||!c)return;let t=e.target;c.contains(t)?m.current=t:R(m.current,{select:!0})},t=function(e){if(g.paused||!c)return;let t=e.relatedTarget;t!==null&&(c.contains(t)||R(m.current,{select:!0}))},n=function(e){if(document.activeElement===document.body)for(let t of e)t.removedNodes.length>0&&R(c)};document.addEventListener(`focusin`,e),document.addEventListener(`focusout`,t);let r=new MutationObserver(n);return c&&r.observe(c,{childList:!0,subtree:!0}),()=>{document.removeEventListener(`focusin`,e),document.removeEventListener(`focusout`,t),r.disconnect()}}},[r,c,g.paused]),s.useEffect(()=>{if(c){xe.add(g);let e=document.activeElement;if(!c.contains(e)){let t=new CustomEvent(ue,fe);c.addEventListener(ue,f),c.dispatchEvent(t),t.defaultPrevented||(he(we(_e(c)),{select:!0}),document.activeElement===e&&R(c))}return()=>{c.removeEventListener(ue,f),setTimeout(()=>{let t=new CustomEvent(de,fe);c.addEventListener(de,p),c.dispatchEvent(t),t.defaultPrevented||R(e??document.body,{select:!0}),c.removeEventListener(de,p),xe.remove(g)},0)}}},[c,f,p,g]);let _=s.useCallback(e=>{if(!n&&!r||g.paused)return;let t=e.key===`Tab`&&!e.altKey&&!e.ctrlKey&&!e.metaKey,i=document.activeElement;if(t&&i){let t=e.currentTarget,[r,a]=ge(t);r&&a?!e.shiftKey&&i===a?(e.preventDefault(),n&&R(r,{select:!0})):e.shiftKey&&i===r&&(e.preventDefault(),n&&R(a,{select:!0})):i===t&&e.preventDefault()}},[n,r,g.paused]);return(0,d.jsx)(j.div,{tabIndex:-1,...o,ref:h,onKeyDown:_})});me.displayName=pe;function he(e,{select:t=!1}={}){let n=document.activeElement;for(let r of e)if(R(r,{select:t}),document.activeElement!==n)return}function ge(e){let t=_e(e);return[ve(t,e),ve(t.reverse(),e)]}function _e(e){let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:e=>{let t=e.tagName===`INPUT`&&e.type===`hidden`;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function ve(e,t){for(let n of e)if(!ye(n,{upTo:t}))return n}function ye(e,{upTo:t}){if(getComputedStyle(e).visibility===`hidden`)return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display===`none`)return!0;e=e.parentElement}return!1}function be(e){return e instanceof HTMLInputElement&&`select`in e}function R(e,{select:t=!1}={}){if(e&&e.focus){let n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&be(e)&&t&&e.select()}}var xe=Se();function Se(){let e=[];return{add(t){let n=e[0];t!==n&&n?.pause(),e=Ce(e,t),e.unshift(t)},remove(t){e=Ce(e,t),e[0]?.resume()}}}function Ce(e,t){let n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function we(e){return e.filter(e=>e.tagName!==`A`)}var Te=`Portal`,Ee=s.forwardRef((e,t)=>{let{container:n,...r}=e,[i,a]=s.useState(!1);h(()=>a(!0),[]);let o=n||i&&globalThis?.document?.body;return o?A.createPortal((0,d.jsx)(j.div,{...r,ref:t}),o):null});Ee.displayName=Te;var De=0;function Oe(){s.useEffect(()=>{let e=document.querySelectorAll(`[data-radix-focus-guard]`);return document.body.insertAdjacentElement(`afterbegin`,e[0]??ke()),document.body.insertAdjacentElement(`beforeend`,e[1]??ke()),De++,()=>{De===1&&document.querySelectorAll(`[data-radix-focus-guard]`).forEach(e=>e.remove()),De--}},[])}function ke(){let e=document.createElement(`span`);return e.setAttribute(`data-radix-focus-guard`,``),e.tabIndex=0,e.style.outline=`none`,e.style.opacity=`0`,e.style.position=`fixed`,e.style.pointerEvents=`none`,e}var z=function(){return z=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},z.apply(this,arguments)};function Ae(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols==`function`)for(var i=0,r=Object.getOwnPropertySymbols(e);i<r.length;i++)t.indexOf(r[i])<0&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(n[r[i]]=e[r[i]]);return n}function je(e,t,n){if(n||arguments.length===2)for(var r=0,i=t.length,a;r<i;r++)(a||!(r in t))&&(a||=Array.prototype.slice.call(t,0,r),a[r]=t[r]);return e.concat(a||Array.prototype.slice.call(t))}var Me=`right-scroll-bar-position`,Ne=`width-before-scroll-bar`,Pe=`with-scroll-bars-hidden`,Fe=`--removed-body-scroll-bar-size`;function Ie(e,t){return typeof e==`function`?e(t):e&&(e.current=t),e}function Le(e,t){var n=(0,s.useState)(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(e){var t=n.value;t!==e&&(n.value=e,n.callback(e,t))}}}})[0];return n.callback=t,n.facade}var Re=typeof window<`u`?s.useLayoutEffect:s.useEffect,ze=new WeakMap;function Be(e,t){var n=Le(t||null,function(t){return e.forEach(function(e){return Ie(e,t)})});return Re(function(){var t=ze.get(n);if(t){var r=new Set(t),i=new Set(e),a=n.current;r.forEach(function(e){i.has(e)||Ie(e,null)}),i.forEach(function(e){r.has(e)||Ie(e,a)})}ze.set(n,e)},[e]),n}function Ve(e){return e}function He(e,t){t===void 0&&(t=Ve);var n=[],r=!1;return{read:function(){if(r)throw Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return n.length?n[n.length-1]:e},useMedium:function(e){var i=t(e,r);return n.push(i),function(){n=n.filter(function(e){return e!==i})}},assignSyncMedium:function(e){for(r=!0;n.length;){var t=n;n=[],t.forEach(e)}n={push:function(t){return e(t)},filter:function(){return n}}},assignMedium:function(e){r=!0;var t=[];if(n.length){var i=n;n=[],i.forEach(e),t=n}var a=function(){var n=t;t=[],n.forEach(e)},o=function(){return Promise.resolve().then(a)};o(),n={push:function(e){t.push(e),o()},filter:function(e){return t=t.filter(e),n}}}}}function Ue(e){e===void 0&&(e={});var t=He(null);return t.options=z({async:!0,ssr:!1},e),t}var We=function(e){var t=e.sideCar,n=Ae(e,[`sideCar`]);if(!t)throw Error("Sidecar: please provide `sideCar` property to import the right car");var r=t.read();if(!r)throw Error(`Sidecar medium not found`);return s.createElement(r,z({},n))};We.isSideCarExport=!0;function Ge(e,t){return e.useMedium(t),We}var Ke=Ue(),qe=function(){},Je=s.forwardRef(function(e,t){var n=s.useRef(null),r=s.useState({onScrollCapture:qe,onWheelCapture:qe,onTouchMoveCapture:qe}),i=r[0],a=r[1],o=e.forwardProps,c=e.children,l=e.className,u=e.removeScrollBar,d=e.enabled,f=e.shards,p=e.sideCar,m=e.noRelative,h=e.noIsolation,g=e.inert,_=e.allowPinchZoom,v=e.as,y=v===void 0?`div`:v,b=e.gapMode,x=Ae(e,[`forwardProps`,`children`,`className`,`removeScrollBar`,`enabled`,`shards`,`sideCar`,`noRelative`,`noIsolation`,`inert`,`allowPinchZoom`,`as`,`gapMode`]),S=p,C=Be([n,t]),w=z(z({},x),i);return s.createElement(s.Fragment,null,d&&s.createElement(S,{sideCar:Ke,removeScrollBar:u,shards:f,noRelative:m,noIsolation:h,inert:g,setCallbacks:a,allowPinchZoom:!!_,lockRef:n,gapMode:b}),o?s.cloneElement(s.Children.only(c),z(z({},w),{ref:C})):s.createElement(y,z({},w,{className:l,ref:C}),c))});Je.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},Je.classNames={fullWidth:Ne,zeroRight:Me};var Ye,Xe=function(){if(Ye)return Ye;if(typeof __webpack_nonce__<`u`)return __webpack_nonce__};function Ze(){if(!document)return null;var e=document.createElement(`style`);e.type=`text/css`;var t=Xe();return t&&e.setAttribute(`nonce`,t),e}function Qe(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function $e(e){(document.head||document.getElementsByTagName(`head`)[0]).appendChild(e)}var et=function(){var e=0,t=null;return{add:function(n){e==0&&(t=Ze())&&(Qe(t,n),$e(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},tt=function(){var e=et();return function(t,n){s.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},nt=function(){var e=tt();return function(t){var n=t.styles,r=t.dynamic;return e(n,r),null}},rt={left:0,top:0,right:0,gap:0},it=function(e){return parseInt(e||``,10)||0},at=function(e){var t=window.getComputedStyle(document.body),n=t[e===`padding`?`paddingLeft`:`marginLeft`],r=t[e===`padding`?`paddingTop`:`marginTop`],i=t[e===`padding`?`paddingRight`:`marginRight`];return[it(n),it(r),it(i)]},ot=function(e){if(e===void 0&&(e=`margin`),typeof window>`u`)return rt;var t=at(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},st=nt(),ct=`data-scroll-locked`,lt=function(e,t,n,r){var i=e.left,a=e.top,o=e.right,s=e.gap;return n===void 0&&(n=`margin`),`
|
|
1
|
+
import{_ as e,m as t,p as n,u as r}from"./i18n-CDHMXlRZ.js";import{N as i}from"./dist-Cl2QB-2y.js";import{t as a}from"./createLucideIcon-CjGHOWb6.js";typeof window<`u`&&window.document&&window.document.createElement;function o(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),n===!1||!r.defaultPrevented)return t?.(r)}}var s=e(t(),1);function c(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}function l(...e){return t=>{let n=!1,r=e.map(e=>{let r=c(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){let n=r[t];typeof n==`function`?n():c(e[t],null)}}}}function u(...e){return s.useCallback(l(...e),e)}var d=n();function f(e,t){let n=s.createContext(t),r=e=>{let{children:t,...r}=e,i=s.useMemo(()=>r,Object.values(r));return(0,d.jsx)(n.Provider,{value:i,children:t})};r.displayName=e+`Provider`;function i(r){let i=s.useContext(n);if(i)return i;if(t!==void 0)return t;throw Error(`\`${r}\` must be used within \`${e}\``)}return[r,i]}function p(e,t=[]){let n=[];function r(t,r){let i=s.createContext(r),a=n.length;n=[...n,r];let o=t=>{let{scope:n,children:r,...o}=t,c=n?.[e]?.[a]||i,l=s.useMemo(()=>o,Object.values(o));return(0,d.jsx)(c.Provider,{value:l,children:r})};o.displayName=t+`Provider`;function c(n,o){let c=o?.[e]?.[a]||i,l=s.useContext(c);if(l)return l;if(r!==void 0)return r;throw Error(`\`${n}\` must be used within \`${t}\``)}return[o,c]}let i=()=>{let t=n.map(e=>s.createContext(e));return function(n){let r=n?.[e]||t;return s.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])}};return i.scopeName=e,[r,m(i,...t)]}function m(...e){let t=e[0];if(e.length===1)return t;let n=()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let r=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return s.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])}};return n.scopeName=t.scopeName,n}var h=globalThis?.document?s.useLayoutEffect:()=>{},g=s.useId||(()=>void 0),_=0;function v(e){let[t,n]=s.useState(g());return h(()=>{e||n(e=>e??String(_++))},[e]),e||(t?`radix-${t}`:``)}var y=s.useInsertionEffect||h;function b({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){let[i,a,o]=x({defaultProp:t,onChange:n}),c=e!==void 0,l=c?e:i;{let t=s.useRef(e!==void 0);s.useEffect(()=>{let e=t.current;e!==c&&console.warn(`${r} is changing from ${e?`controlled`:`uncontrolled`} to ${c?`controlled`:`uncontrolled`}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),t.current=c},[c,r])}return[l,s.useCallback(t=>{if(c){let n=S(t)?t(e):t;n!==e&&o.current?.(n)}else a(t)},[c,e,a,o])]}function x({defaultProp:e,onChange:t}){let[n,r]=s.useState(e),i=s.useRef(n),a=s.useRef(t);return y(()=>{a.current=t},[t]),s.useEffect(()=>{i.current!==n&&(a.current?.(n),i.current=n)},[n,i]),[n,r,a]}function S(e){return typeof e==`function`}function C(e){let t=w(e),n=s.forwardRef((e,n)=>{let{children:r,...i}=e,a=s.Children.toArray(r),o=a.find(D);if(o){let e=o.props.children,r=a.map(t=>t===o?s.Children.count(e)>1?s.Children.only(null):s.isValidElement(e)?e.props.children:null:t);return(0,d.jsx)(t,{...i,ref:n,children:s.isValidElement(e)?s.cloneElement(e,void 0,r):null})}return(0,d.jsx)(t,{...i,ref:n,children:r})});return n.displayName=`${e}.Slot`,n}function w(e){let t=s.forwardRef((e,t)=>{let{children:n,...r}=e;if(s.isValidElement(n)){let e=k(n),i=O(r,n.props);return n.type!==s.Fragment&&(i.ref=t?l(t,e):e),s.cloneElement(n,i)}return s.Children.count(n)>1?s.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var T=Symbol(`radix.slottable`);function E(e){let t=({children:e})=>(0,d.jsx)(d.Fragment,{children:e});return t.displayName=`${e}.Slottable`,t.__radixId=T,t}function D(e){return s.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===T}function O(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`&&(n[r]=[i,a].filter(Boolean).join(` `))}return{...e,...n}}function k(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var A=e(i(),1),j=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=C(`Primitive.${t}`),r=s.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,d.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function M(e,t){e&&A.flushSync(()=>e.dispatchEvent(t))}function N(e){let t=s.useRef(e);return s.useEffect(()=>{t.current=e}),s.useMemo(()=>(...e)=>t.current?.(...e),[])}function P(e,t=globalThis?.document){let n=N(e);s.useEffect(()=>{let e=e=>{e.key===`Escape`&&n(e)};return t.addEventListener(`keydown`,e,{capture:!0}),()=>t.removeEventListener(`keydown`,e,{capture:!0})},[n,t])}var F=`DismissableLayer`,ee=`dismissableLayer.update`,te=`dismissableLayer.pointerDownOutside`,ne=`dismissableLayer.focusOutside`,I,L=s.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),re=s.forwardRef((e,t)=>{let{disableOutsidePointerEvents:n=!1,onEscapeKeyDown:r,onPointerDownOutside:i,onFocusOutside:a,onInteractOutside:c,onDismiss:l,...f}=e,p=s.useContext(L),[m,h]=s.useState(null),g=m?.ownerDocument??globalThis?.document,[,_]=s.useState({}),v=u(t,e=>h(e)),y=Array.from(p.layers),[b]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),x=y.indexOf(b),S=m?y.indexOf(m):-1,C=p.layersWithOutsidePointerEventsDisabled.size>0,w=S>=x,T=oe(e=>{let t=e.target,n=[...p.branches].some(e=>e.contains(t));!w||n||(i?.(e),c?.(e),e.defaultPrevented||l?.())},g),E=se(e=>{let t=e.target;[...p.branches].some(e=>e.contains(t))||(a?.(e),c?.(e),e.defaultPrevented||l?.())},g);return P(e=>{S===p.layers.size-1&&(r?.(e),!e.defaultPrevented&&l&&(e.preventDefault(),l()))},g),s.useEffect(()=>{if(m)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(I=g.body.style.pointerEvents,g.body.style.pointerEvents=`none`),p.layersWithOutsidePointerEventsDisabled.add(m)),p.layers.add(m),ce(),()=>{n&&p.layersWithOutsidePointerEventsDisabled.size===1&&(g.body.style.pointerEvents=I)}},[m,g,n,p]),s.useEffect(()=>()=>{m&&(p.layers.delete(m),p.layersWithOutsidePointerEventsDisabled.delete(m),ce())},[m,p]),s.useEffect(()=>{let e=()=>_({});return document.addEventListener(ee,e),()=>document.removeEventListener(ee,e)},[]),(0,d.jsx)(j.div,{...f,ref:v,style:{pointerEvents:C?w?`auto`:`none`:void 0,...e.style},onFocusCapture:o(e.onFocusCapture,E.onFocusCapture),onBlurCapture:o(e.onBlurCapture,E.onBlurCapture),onPointerDownCapture:o(e.onPointerDownCapture,T.onPointerDownCapture)})});re.displayName=F;var ie=`DismissableLayerBranch`,ae=s.forwardRef((e,t)=>{let n=s.useContext(L),r=s.useRef(null),i=u(t,r);return s.useEffect(()=>{let e=r.current;if(e)return n.branches.add(e),()=>{n.branches.delete(e)}},[n.branches]),(0,d.jsx)(j.div,{...e,ref:i})});ae.displayName=ie;function oe(e,t=globalThis?.document){let n=N(e),r=s.useRef(!1),i=s.useRef(()=>{});return s.useEffect(()=>{let e=e=>{if(e.target&&!r.current){let r=function(){le(te,n,a,{discrete:!0})},a={originalEvent:e};e.pointerType===`touch`?(t.removeEventListener(`click`,i.current),i.current=r,t.addEventListener(`click`,i.current,{once:!0})):r()}else t.removeEventListener(`click`,i.current);r.current=!1},a=window.setTimeout(()=>{t.addEventListener(`pointerdown`,e)},0);return()=>{window.clearTimeout(a),t.removeEventListener(`pointerdown`,e),t.removeEventListener(`click`,i.current)}},[t,n]),{onPointerDownCapture:()=>r.current=!0}}function se(e,t=globalThis?.document){let n=N(e),r=s.useRef(!1);return s.useEffect(()=>{let e=e=>{e.target&&!r.current&&le(ne,n,{originalEvent:e},{discrete:!1})};return t.addEventListener(`focusin`,e),()=>t.removeEventListener(`focusin`,e)},[t,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function ce(){let e=new CustomEvent(ee);document.dispatchEvent(e)}function le(e,t,n,{discrete:r}){let i=n.originalEvent.target,a=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&i.addEventListener(e,t,{once:!0}),r?M(i,a):i.dispatchEvent(a)}var ue=`focusScope.autoFocusOnMount`,de=`focusScope.autoFocusOnUnmount`,fe={bubbles:!1,cancelable:!0},pe=`FocusScope`,me=s.forwardRef((e,t)=>{let{loop:n=!1,trapped:r=!1,onMountAutoFocus:i,onUnmountAutoFocus:a,...o}=e,[c,l]=s.useState(null),f=N(i),p=N(a),m=s.useRef(null),h=u(t,e=>l(e)),g=s.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;s.useEffect(()=>{if(r){let e=function(e){if(g.paused||!c)return;let t=e.target;c.contains(t)?m.current=t:R(m.current,{select:!0})},t=function(e){if(g.paused||!c)return;let t=e.relatedTarget;t!==null&&(c.contains(t)||R(m.current,{select:!0}))},n=function(e){if(document.activeElement===document.body)for(let t of e)t.removedNodes.length>0&&R(c)};document.addEventListener(`focusin`,e),document.addEventListener(`focusout`,t);let r=new MutationObserver(n);return c&&r.observe(c,{childList:!0,subtree:!0}),()=>{document.removeEventListener(`focusin`,e),document.removeEventListener(`focusout`,t),r.disconnect()}}},[r,c,g.paused]),s.useEffect(()=>{if(c){xe.add(g);let e=document.activeElement;if(!c.contains(e)){let t=new CustomEvent(ue,fe);c.addEventListener(ue,f),c.dispatchEvent(t),t.defaultPrevented||(he(we(_e(c)),{select:!0}),document.activeElement===e&&R(c))}return()=>{c.removeEventListener(ue,f),setTimeout(()=>{let t=new CustomEvent(de,fe);c.addEventListener(de,p),c.dispatchEvent(t),t.defaultPrevented||R(e??document.body,{select:!0}),c.removeEventListener(de,p),xe.remove(g)},0)}}},[c,f,p,g]);let _=s.useCallback(e=>{if(!n&&!r||g.paused)return;let t=e.key===`Tab`&&!e.altKey&&!e.ctrlKey&&!e.metaKey,i=document.activeElement;if(t&&i){let t=e.currentTarget,[r,a]=ge(t);r&&a?!e.shiftKey&&i===a?(e.preventDefault(),n&&R(r,{select:!0})):e.shiftKey&&i===r&&(e.preventDefault(),n&&R(a,{select:!0})):i===t&&e.preventDefault()}},[n,r,g.paused]);return(0,d.jsx)(j.div,{tabIndex:-1,...o,ref:h,onKeyDown:_})});me.displayName=pe;function he(e,{select:t=!1}={}){let n=document.activeElement;for(let r of e)if(R(r,{select:t}),document.activeElement!==n)return}function ge(e){let t=_e(e);return[ve(t,e),ve(t.reverse(),e)]}function _e(e){let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:e=>{let t=e.tagName===`INPUT`&&e.type===`hidden`;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function ve(e,t){for(let n of e)if(!ye(n,{upTo:t}))return n}function ye(e,{upTo:t}){if(getComputedStyle(e).visibility===`hidden`)return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display===`none`)return!0;e=e.parentElement}return!1}function be(e){return e instanceof HTMLInputElement&&`select`in e}function R(e,{select:t=!1}={}){if(e&&e.focus){let n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&be(e)&&t&&e.select()}}var xe=Se();function Se(){let e=[];return{add(t){let n=e[0];t!==n&&n?.pause(),e=Ce(e,t),e.unshift(t)},remove(t){e=Ce(e,t),e[0]?.resume()}}}function Ce(e,t){let n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}function we(e){return e.filter(e=>e.tagName!==`A`)}var Te=`Portal`,Ee=s.forwardRef((e,t)=>{let{container:n,...r}=e,[i,a]=s.useState(!1);h(()=>a(!0),[]);let o=n||i&&globalThis?.document?.body;return o?A.createPortal((0,d.jsx)(j.div,{...r,ref:t}),o):null});Ee.displayName=Te;var De=0;function Oe(){s.useEffect(()=>{let e=document.querySelectorAll(`[data-radix-focus-guard]`);return document.body.insertAdjacentElement(`afterbegin`,e[0]??ke()),document.body.insertAdjacentElement(`beforeend`,e[1]??ke()),De++,()=>{De===1&&document.querySelectorAll(`[data-radix-focus-guard]`).forEach(e=>e.remove()),De--}},[])}function ke(){let e=document.createElement(`span`);return e.setAttribute(`data-radix-focus-guard`,``),e.tabIndex=0,e.style.outline=`none`,e.style.opacity=`0`,e.style.position=`fixed`,e.style.pointerEvents=`none`,e}var z=function(){return z=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},z.apply(this,arguments)};function Ae(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols==`function`)for(var i=0,r=Object.getOwnPropertySymbols(e);i<r.length;i++)t.indexOf(r[i])<0&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(n[r[i]]=e[r[i]]);return n}function je(e,t,n){if(n||arguments.length===2)for(var r=0,i=t.length,a;r<i;r++)(a||!(r in t))&&(a||=Array.prototype.slice.call(t,0,r),a[r]=t[r]);return e.concat(a||Array.prototype.slice.call(t))}var Me=`right-scroll-bar-position`,Ne=`width-before-scroll-bar`,Pe=`with-scroll-bars-hidden`,Fe=`--removed-body-scroll-bar-size`;function Ie(e,t){return typeof e==`function`?e(t):e&&(e.current=t),e}function Le(e,t){var n=(0,s.useState)(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(e){var t=n.value;t!==e&&(n.value=e,n.callback(e,t))}}}})[0];return n.callback=t,n.facade}var Re=typeof window<`u`?s.useLayoutEffect:s.useEffect,ze=new WeakMap;function Be(e,t){var n=Le(t||null,function(t){return e.forEach(function(e){return Ie(e,t)})});return Re(function(){var t=ze.get(n);if(t){var r=new Set(t),i=new Set(e),a=n.current;r.forEach(function(e){i.has(e)||Ie(e,null)}),i.forEach(function(e){r.has(e)||Ie(e,a)})}ze.set(n,e)},[e]),n}function Ve(e){return e}function He(e,t){t===void 0&&(t=Ve);var n=[],r=!1;return{read:function(){if(r)throw Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return n.length?n[n.length-1]:e},useMedium:function(e){var i=t(e,r);return n.push(i),function(){n=n.filter(function(e){return e!==i})}},assignSyncMedium:function(e){for(r=!0;n.length;){var t=n;n=[],t.forEach(e)}n={push:function(t){return e(t)},filter:function(){return n}}},assignMedium:function(e){r=!0;var t=[];if(n.length){var i=n;n=[],i.forEach(e),t=n}var a=function(){var n=t;t=[],n.forEach(e)},o=function(){return Promise.resolve().then(a)};o(),n={push:function(e){t.push(e),o()},filter:function(e){return t=t.filter(e),n}}}}}function Ue(e){e===void 0&&(e={});var t=He(null);return t.options=z({async:!0,ssr:!1},e),t}var We=function(e){var t=e.sideCar,n=Ae(e,[`sideCar`]);if(!t)throw Error("Sidecar: please provide `sideCar` property to import the right car");var r=t.read();if(!r)throw Error(`Sidecar medium not found`);return s.createElement(r,z({},n))};We.isSideCarExport=!0;function Ge(e,t){return e.useMedium(t),We}var Ke=Ue(),qe=function(){},Je=s.forwardRef(function(e,t){var n=s.useRef(null),r=s.useState({onScrollCapture:qe,onWheelCapture:qe,onTouchMoveCapture:qe}),i=r[0],a=r[1],o=e.forwardProps,c=e.children,l=e.className,u=e.removeScrollBar,d=e.enabled,f=e.shards,p=e.sideCar,m=e.noRelative,h=e.noIsolation,g=e.inert,_=e.allowPinchZoom,v=e.as,y=v===void 0?`div`:v,b=e.gapMode,x=Ae(e,[`forwardProps`,`children`,`className`,`removeScrollBar`,`enabled`,`shards`,`sideCar`,`noRelative`,`noIsolation`,`inert`,`allowPinchZoom`,`as`,`gapMode`]),S=p,C=Be([n,t]),w=z(z({},x),i);return s.createElement(s.Fragment,null,d&&s.createElement(S,{sideCar:Ke,removeScrollBar:u,shards:f,noRelative:m,noIsolation:h,inert:g,setCallbacks:a,allowPinchZoom:!!_,lockRef:n,gapMode:b}),o?s.cloneElement(s.Children.only(c),z(z({},w),{ref:C})):s.createElement(y,z({},w,{className:l,ref:C}),c))});Je.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},Je.classNames={fullWidth:Ne,zeroRight:Me};var Ye,Xe=function(){if(Ye)return Ye;if(typeof __webpack_nonce__<`u`)return __webpack_nonce__};function Ze(){if(!document)return null;var e=document.createElement(`style`);e.type=`text/css`;var t=Xe();return t&&e.setAttribute(`nonce`,t),e}function Qe(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function $e(e){(document.head||document.getElementsByTagName(`head`)[0]).appendChild(e)}var et=function(){var e=0,t=null;return{add:function(n){e==0&&(t=Ze())&&(Qe(t,n),$e(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},tt=function(){var e=et();return function(t,n){s.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},nt=function(){var e=tt();return function(t){var n=t.styles,r=t.dynamic;return e(n,r),null}},rt={left:0,top:0,right:0,gap:0},it=function(e){return parseInt(e||``,10)||0},at=function(e){var t=window.getComputedStyle(document.body),n=t[e===`padding`?`paddingLeft`:`marginLeft`],r=t[e===`padding`?`paddingTop`:`marginTop`],i=t[e===`padding`?`paddingRight`:`marginRight`];return[it(n),it(r),it(i)]},ot=function(e){if(e===void 0&&(e=`margin`),typeof window>`u`)return rt;var t=at(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},st=nt(),ct=`data-scroll-locked`,lt=function(e,t,n,r){var i=e.left,a=e.top,o=e.right,s=e.gap;return n===void 0&&(n=`margin`),`
|
|
2
2
|
.${Pe} {
|
|
3
3
|
overflow: hidden ${r};
|
|
4
4
|
padding-right: ${s}px ${r};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as e,u as t}from"./i18n-CDHMXlRZ.js";var n=e();function r({className:e,...r}){return(0,n.jsx)(`div`,{className:t(`animate-pulse rounded-md bg-slate-200`,e),...r})}export{r as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{p as e,u as t}from"./i18n-
|
|
1
|
+
import{p as e,u as t}from"./i18n-CDHMXlRZ.js";var n=e(),r={active:{dot:`bg-emerald-500`,text:`text-emerald-600`,bg:`bg-emerald-50`},ready:{dot:`bg-emerald-500`,text:`text-emerald-600`,bg:`bg-emerald-50`},inactive:{dot:`bg-gray-300`,text:`text-gray-400`,bg:`bg-gray-100/80`},setup:{dot:`bg-gray-300`,text:`text-gray-400`,bg:`bg-gray-100/80`},warning:{dot:`bg-amber-400`,text:`text-amber-600`,bg:`bg-amber-50`}};function i({status:e,label:i,className:a}){let o=r[e];return(0,n.jsxs)(`div`,{className:t(`inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full px-2 py-0.5`,o.bg,a),children:[(0,n.jsx)(`span`,{className:t(`h-1.5 w-1.5 rounded-full`,o.dot)}),(0,n.jsx)(`span`,{className:t(`text-[11px] font-medium`,o.text),children:i})]})}export{i as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,m as t,p as n,u as r}from"./i18n-
|
|
1
|
+
import{_ as e,m as t,p as n,u as r}from"./i18n-CDHMXlRZ.js";var i=e(t(),1),a=n(),o=i.forwardRef(({className:e,checked:t=!1,onCheckedChange:n,...i},o)=>(0,a.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":t,ref:o,className:r(`peer inline-flex h-[22px] w-10 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50`,t?`bg-primary`:`bg-gray-200/80 hover:bg-gray-300/80`,e),onClick:()=>n?.(!t),...i,children:(0,a.jsx)(`span`,{className:r(`pointer-events-none block h-5 w-5 rounded-full bg-white shadow-md ring-0 transition-transform duration-fast`,t?`translate-x-5`:`translate-x-0`)})}));o.displayName=`Switch`;export{o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as e,p as t,r as n,u as r}from"./i18n-CDHMXlRZ.js";e();var i=t();function a({tabs:e,activeTab:t,onChange:a,className:o}){return(0,i.jsx)(`div`,{className:r(`flex items-center gap-6 border-b border-gray-200/60 mb-6`,o),children:e.map(e=>{let o=t===e.id;return(0,i.jsxs)(`button`,{onClick:()=>a(e.id),className:r(`relative pb-3 text-[14px] font-medium transition-all duration-fast flex items-center gap-1.5`,o?`text-gray-900`:`text-gray-600 hover:text-gray-900`),children:[e.label,e.count!==void 0&&(0,i.jsx)(`span`,{className:r(`text-[11px] font-medium`,`text-gray-500`),children:n(e.count)}),o&&(0,i.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-[2px] bg-primary rounded-full`})]},e.id)})})}export{a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-
|
|
1
|
+
import{t as e}from"./createLucideIcon-CjGHOWb6.js";var t=e(`Trash2`,[[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6`,key:`4alrt4`}],[`path`,{d:`M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2`,key:`v07s0e`}],[`line`,{x1:`10`,x2:`10`,y1:`11`,y2:`17`,key:`1uufr5`}],[`line`,{x1:`14`,x2:`14`,y1:`11`,y2:`17`,key:`xtxkd`}]]);export{t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,i as t,m as n,p as r}from"./i18n-CDHMXlRZ.js";import{o as i}from"./dist-Cl2QB-2y.js";import{at as a,et as o,it as s,nt as c,rt as l,tt as u}from"./index-C6d0xmtm.js";var d=e(n(),1),f=r(),p=({open:e,onOpenChange:n,title:r,description:d,confirmLabel:p=t(`confirm`),cancelLabel:m=t(`cancel`),variant:h=`default`,onConfirm:g,onCancel:_})=>(0,f.jsx)(o,{open:e,onOpenChange:n,children:(0,f.jsxs)(u,{className:`[&>:last-child]:hidden`,onCloseAutoFocus:e=>e.preventDefault(),children:[(0,f.jsxs)(s,{children:[(0,f.jsx)(a,{children:r}),d?(0,f.jsx)(c,{children:d}):null]}),(0,f.jsxs)(l,{className:`gap-2 sm:gap-0`,children:[(0,f.jsx)(i,{type:`button`,variant:`outline`,onClick:()=>{_(),n(!1)},children:m}),(0,f.jsx)(i,{type:`button`,variant:h===`destructive`?`destructive`:`default`,onClick:()=>{g(),n(!1)},children:p})]})]})}),m={open:!1,title:``,description:``,confirmLabel:t(`confirm`),cancelLabel:t(`cancel`),variant:`default`,resolve:null};function h(){let[e,n]=(0,d.useState)(m),r=(0,d.useCallback)(e=>new Promise(r=>{n({open:!0,title:e.title,description:e.description??``,confirmLabel:e.confirmLabel??t(`confirm`),cancelLabel:e.cancelLabel??t(`cancel`),variant:e.variant??`default`,resolve:e=>{r(e),n(e=>({...e,open:!1,resolve:null}))}})}),[]),i=(0,d.useCallback)(e=>{n(t=>(!e&&t.resolve&&t.resolve(!1),{...t,open:e,resolve:e?t.resolve:null}))},[]);return{confirm:r,ConfirmDialog:(0,d.useCallback)(()=>(0,f.jsx)(p,{open:e.open,onOpenChange:i,title:e.title,description:e.description||void 0,confirmLabel:e.confirmLabel,cancelLabel:e.cancelLabel,variant:e.variant,onConfirm:()=>e.resolve?.(!0),onCancel:()=>e.resolve?.(!1)}),[e,i])}}export{h as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,m as t}from"./i18n-
|
|
1
|
+
import{_ as e,m as t}from"./i18n-CDHMXlRZ.js";import{A as n,E as r,M as i,S as a,f as o,h as s,k as c,u as l}from"./dist-Cl2QB-2y.js";var u=class extends i{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),c(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&a(t.mutationKey)!==a(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??o();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){s.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},d=e(t(),1);function f(e,t){let i=l(t),[a]=d.useState(()=>new u(i,e));d.useEffect(()=>{a.setOptions(e)},[a,e]);let o=d.useSyncExternalStore(d.useCallback(e=>a.subscribe(s.batchCalls(e)),[a]),()=>a.getCurrentResult(),()=>a.getCurrentResult()),c=d.useCallback((e,t)=>{a.mutate(e,t).catch(r)},[a]);if(o.error&&n(a.options.throwOnError,[o.error]))throw o.error;return{...o,mutate:c,mutateAsync:o.mutate}}export{f as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./createLucideIcon-CjGHOWb6.js";var t=e(`X`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t};
|
package/dist/index.html
CHANGED
|
@@ -6,24 +6,24 @@
|
|
|
6
6
|
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
8
8
|
<title>NextClaw</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/i18n-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/chunk-JZWAC4HX-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/dist-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/select-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/dist-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/react-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/useMutation-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/book-open-
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/external-link-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/plus-
|
|
21
|
-
<link rel="modulepreload" crossorigin href="/assets/search-
|
|
22
|
-
<link rel="modulepreload" crossorigin href="/assets/x-
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/DocBrowserContext-
|
|
24
|
-
<link rel="modulepreload" crossorigin href="/assets/DocBrowser-
|
|
25
|
-
<link rel="modulepreload" crossorigin href="/assets/config-
|
|
26
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-C6d0xmtm.js"></script>
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/i18n-CDHMXlRZ.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/chunk-JZWAC4HX-CvRWvTy5.js">
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/dist-Cl2QB-2y.js">
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-CjGHOWb6.js">
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/select-DSkTc61S.js">
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/dist-nqTTbVdA.js">
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/react-7ZHqQtEV.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/assets/useMutation-DrZrOgVL.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="/assets/book-open-CXoF5nQC.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/external-link-tIO7zING.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/plus-PHf8q-Ct.js">
|
|
21
|
+
<link rel="modulepreload" crossorigin href="/assets/search-C91yH_6y.js">
|
|
22
|
+
<link rel="modulepreload" crossorigin href="/assets/x-D7Q1yqSF.js">
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/DocBrowserContext-YIKkPb76.js">
|
|
24
|
+
<link rel="modulepreload" crossorigin href="/assets/DocBrowser-BmtBLFU0.js">
|
|
25
|
+
<link rel="modulepreload" crossorigin href="/assets/config-DJswxxE8.js">
|
|
26
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BlH4-cBw.css">
|
|
27
27
|
</head>
|
|
28
28
|
|
|
29
29
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextclaw/ui",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.22",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
"tailwind-merge": "^2.5.4",
|
|
29
29
|
"zod": "^3.23.8",
|
|
30
30
|
"zustand": "^5.0.2",
|
|
31
|
-
"@nextclaw/ncp-react": "0.4.12",
|
|
32
31
|
"@nextclaw/ncp": "0.4.6",
|
|
32
|
+
"@nextclaw/ncp-react": "0.4.13",
|
|
33
33
|
"@nextclaw/ncp-http-agent-client": "0.3.10",
|
|
34
|
-
"@nextclaw/agent-chat-ui": "0.2.
|
|
34
|
+
"@nextclaw/agent-chat-ui": "0.2.20",
|
|
35
35
|
"@nextclaw/agent-chat": "0.1.6"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { fetchNcpSessionSkills } from '@/api/ncp-session';
|
|
2
|
+
import { api } from '@/api/client';
|
|
3
|
+
|
|
4
|
+
vi.mock('@/api/client', () => ({
|
|
5
|
+
api: {
|
|
6
|
+
get: vi.fn()
|
|
7
|
+
}
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
describe('api/ncp-session', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.mocked(api.get).mockReset();
|
|
13
|
+
vi.mocked(api.get).mockResolvedValue({
|
|
14
|
+
ok: true,
|
|
15
|
+
data: {
|
|
16
|
+
sessionId: 'session-1',
|
|
17
|
+
total: 0,
|
|
18
|
+
refs: [],
|
|
19
|
+
records: []
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('does not send an empty projectRoot query when no override is provided', async () => {
|
|
25
|
+
await fetchNcpSessionSkills('session-1', { projectRoot: null });
|
|
26
|
+
|
|
27
|
+
expect(api.get).toHaveBeenCalledWith('/api/ncp/sessions/session-1/skills');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('sends projectRoot only when the override is non-empty', async () => {
|
|
31
|
+
await fetchNcpSessionSkills('session-1', { projectRoot: ' /tmp/project-alpha ' });
|
|
32
|
+
|
|
33
|
+
expect(api.get).toHaveBeenCalledWith(
|
|
34
|
+
'/api/ncp/sessions/session-1/skills?projectRoot=%2Ftmp%2Fproject-alpha'
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
});
|
package/src/api/ncp-session.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { api } from './client';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
NcpSessionMessagesView,
|
|
4
|
+
NcpSessionSkillsView,
|
|
5
|
+
NcpSessionsListView,
|
|
6
|
+
NcpSessionSummaryView,
|
|
7
|
+
SessionPatchUpdate
|
|
8
|
+
} from './types';
|
|
3
9
|
|
|
4
10
|
// GET /api/ncp/sessions
|
|
5
11
|
export async function fetchNcpSessions(params?: { limit?: number }): Promise<NcpSessionsListView> {
|
|
@@ -26,6 +32,28 @@ export async function fetchNcpSessionMessages(sessionId: string, limit = 200): P
|
|
|
26
32
|
return response.data;
|
|
27
33
|
}
|
|
28
34
|
|
|
35
|
+
// GET /api/ncp/sessions/:sessionId/skills
|
|
36
|
+
export async function fetchNcpSessionSkills(
|
|
37
|
+
sessionId: string,
|
|
38
|
+
params?: { projectRoot?: string | null }
|
|
39
|
+
): Promise<NcpSessionSkillsView> {
|
|
40
|
+
const query = new URLSearchParams();
|
|
41
|
+
const projectRoot = params?.projectRoot?.trim();
|
|
42
|
+
if (projectRoot) {
|
|
43
|
+
query.set('projectRoot', projectRoot);
|
|
44
|
+
}
|
|
45
|
+
const suffix = query.toString();
|
|
46
|
+
const response = await api.get<NcpSessionSkillsView>(
|
|
47
|
+
suffix
|
|
48
|
+
? `/api/ncp/sessions/${encodeURIComponent(sessionId)}/skills?${suffix}`
|
|
49
|
+
: `/api/ncp/sessions/${encodeURIComponent(sessionId)}/skills`
|
|
50
|
+
);
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
throw new Error(response.error.message);
|
|
53
|
+
}
|
|
54
|
+
return response.data;
|
|
55
|
+
}
|
|
56
|
+
|
|
29
57
|
// PUT /api/ncp/sessions/:sessionId
|
|
30
58
|
export async function updateNcpSession(
|
|
31
59
|
sessionId: string,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { api } from './client';
|
|
2
|
+
import type { ServerPathBrowseView } from './types';
|
|
3
|
+
|
|
4
|
+
export async function fetchServerPathBrowse(params?: {
|
|
5
|
+
path?: string | null;
|
|
6
|
+
includeFiles?: boolean;
|
|
7
|
+
}): Promise<ServerPathBrowseView> {
|
|
8
|
+
const query = new URLSearchParams();
|
|
9
|
+
if (typeof params?.path === 'string' && params.path.trim().length > 0) {
|
|
10
|
+
query.set('path', params.path.trim());
|
|
11
|
+
}
|
|
12
|
+
if (params?.includeFiles) {
|
|
13
|
+
query.set('includeFiles', '1');
|
|
14
|
+
}
|
|
15
|
+
const suffix = query.toString();
|
|
16
|
+
const response = await api.get<ServerPathBrowseView>(
|
|
17
|
+
suffix ? `/api/server-paths/browse?${suffix}` : '/api/server-paths/browse'
|
|
18
|
+
);
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
throw new Error(response.error.message);
|
|
21
|
+
}
|
|
22
|
+
return response.data;
|
|
23
|
+
}
|
package/src/api/types.ts
CHANGED
|
@@ -206,6 +206,8 @@ export type SessionEntryView = {
|
|
|
206
206
|
type?: string;
|
|
207
207
|
preferredModel?: string;
|
|
208
208
|
preferredThinking?: ThinkingLevel | null;
|
|
209
|
+
projectRoot?: string | null;
|
|
210
|
+
projectName?: string | null;
|
|
209
211
|
sessionType: string;
|
|
210
212
|
sessionTypeMutable: boolean;
|
|
211
213
|
messageCount: number;
|
|
@@ -245,6 +247,24 @@ export type NcpSessionMessagesView = {
|
|
|
245
247
|
total: number;
|
|
246
248
|
};
|
|
247
249
|
|
|
250
|
+
export type SessionSkillEntryView = {
|
|
251
|
+
ref: string;
|
|
252
|
+
name: string;
|
|
253
|
+
path: string;
|
|
254
|
+
scope: 'project' | 'workspace';
|
|
255
|
+
source: 'project' | 'workspace';
|
|
256
|
+
available: boolean;
|
|
257
|
+
description?: string;
|
|
258
|
+
descriptionZh?: string;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
export type NcpSessionSkillsView = {
|
|
262
|
+
sessionId: string;
|
|
263
|
+
total: number;
|
|
264
|
+
refs: string[];
|
|
265
|
+
records: SessionSkillEntryView[];
|
|
266
|
+
};
|
|
267
|
+
|
|
248
268
|
export type NcpAssetView = {
|
|
249
269
|
id: string;
|
|
250
270
|
name: string;
|
|
@@ -265,9 +285,30 @@ export type SessionPatchUpdate = {
|
|
|
265
285
|
preferredModel?: string | null;
|
|
266
286
|
preferredThinking?: ThinkingLevel | null;
|
|
267
287
|
sessionType?: string | null;
|
|
288
|
+
projectRoot?: string | null;
|
|
268
289
|
clearHistory?: boolean;
|
|
269
290
|
};
|
|
270
291
|
|
|
292
|
+
export type ServerPathEntryView = {
|
|
293
|
+
name: string;
|
|
294
|
+
path: string;
|
|
295
|
+
kind: "directory" | "file";
|
|
296
|
+
hidden: boolean;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
export type ServerPathBreadcrumbView = {
|
|
300
|
+
label: string;
|
|
301
|
+
path: string;
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
export type ServerPathBrowseView = {
|
|
305
|
+
currentPath: string;
|
|
306
|
+
parentPath: string | null;
|
|
307
|
+
homePath: string;
|
|
308
|
+
breadcrumbs: ServerPathBreadcrumbView[];
|
|
309
|
+
entries: ServerPathEntryView[];
|
|
310
|
+
};
|
|
311
|
+
|
|
271
312
|
export type {
|
|
272
313
|
ChatSessionTypeCtaView,
|
|
273
314
|
ChatSessionTypeOptionView,
|
|
@@ -8,11 +8,15 @@ const mocks = vi.hoisted(() => ({
|
|
|
8
8
|
goToProviders: vi.fn()
|
|
9
9
|
}));
|
|
10
10
|
|
|
11
|
-
vi.mock('@nextclaw/agent-chat-ui', () =>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
vi.mock('@nextclaw/agent-chat-ui', async (importOriginal) => {
|
|
12
|
+
const actual = await importOriginal();
|
|
13
|
+
return {
|
|
14
|
+
...(actual as object),
|
|
15
|
+
useStickyBottomScroll: () => ({
|
|
16
|
+
onScroll: vi.fn()
|
|
17
|
+
})
|
|
18
|
+
};
|
|
19
|
+
});
|
|
16
20
|
|
|
17
21
|
vi.mock('@/components/chat/nextclaw', () => ({
|
|
18
22
|
ChatInputBarContainer: () => <div data-testid="chat-input-bar" />,
|
|
@@ -29,10 +33,21 @@ vi.mock('@/components/chat/presenter/chat-presenter-context', () => ({
|
|
|
29
33
|
deleteSession: mocks.deleteSession,
|
|
30
34
|
goToProviders: mocks.goToProviders,
|
|
31
35
|
createSession: vi.fn()
|
|
36
|
+
},
|
|
37
|
+
chatSessionListManager: {
|
|
38
|
+
selectSession: vi.fn()
|
|
32
39
|
}
|
|
33
40
|
})
|
|
34
41
|
}));
|
|
35
42
|
|
|
43
|
+
vi.mock('@/components/chat/session-header/chat-session-header-actions', () => ({
|
|
44
|
+
ChatSessionHeaderActions: () => <button aria-label="More actions" />
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
vi.mock('@/components/chat/session-header/chat-session-project-badge', () => ({
|
|
48
|
+
ChatSessionProjectBadge: ({ projectName }: { projectName: string }) => <button>{projectName}</button>
|
|
49
|
+
}));
|
|
50
|
+
|
|
36
51
|
describe('ChatConversationPanel', () => {
|
|
37
52
|
beforeEach(() => {
|
|
38
53
|
mocks.deleteSession.mockReset();
|
|
@@ -43,8 +58,10 @@ describe('ChatConversationPanel', () => {
|
|
|
43
58
|
isProviderStateResolved: true,
|
|
44
59
|
modelOptions: [{ value: 'openai/gpt-5.1', modelLabel: 'gpt-5.1', providerLabel: 'OpenAI' } as never],
|
|
45
60
|
sessionTypeLabel: 'Codex',
|
|
46
|
-
|
|
61
|
+
sessionKey: 'draft-session-1',
|
|
47
62
|
sessionDisplayName: undefined,
|
|
63
|
+
sessionProjectRoot: null,
|
|
64
|
+
sessionProjectName: null,
|
|
48
65
|
canDeleteSession: false,
|
|
49
66
|
isDeletePending: false,
|
|
50
67
|
isHistoryLoading: false,
|
|
@@ -60,6 +77,25 @@ describe('ChatConversationPanel', () => {
|
|
|
60
77
|
|
|
61
78
|
expect(screen.getByText('New Task')).toBeTruthy();
|
|
62
79
|
expect(screen.getByText('Codex')).toBeTruthy();
|
|
63
|
-
expect(screen.
|
|
80
|
+
expect(screen.getByLabelText('More actions')).toBeTruthy();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('shows the selected session project badge and more actions trigger', () => {
|
|
84
|
+
useChatThreadStore.setState({
|
|
85
|
+
snapshot: {
|
|
86
|
+
...useChatThreadStore.getState().snapshot,
|
|
87
|
+
sessionKey: 'session-1',
|
|
88
|
+
sessionDisplayName: 'Project Thread',
|
|
89
|
+
sessionProjectRoot: '/Users/demo/workspace/project-alpha',
|
|
90
|
+
sessionProjectName: 'project-alpha',
|
|
91
|
+
canDeleteSession: true,
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
render(<ChatConversationPanel />);
|
|
96
|
+
|
|
97
|
+
expect(screen.getByText('Project Thread')).toBeTruthy();
|
|
98
|
+
expect(screen.getByText('project-alpha')).toBeTruthy();
|
|
99
|
+
expect(screen.getByLabelText('More actions')).toBeTruthy();
|
|
64
100
|
});
|
|
65
101
|
});
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { useRef } from "react";
|
|
2
2
|
import { useStickyBottomScroll } from "@nextclaw/agent-chat-ui";
|
|
3
|
-
import { Button } from "@/components/ui/button";
|
|
4
3
|
import {
|
|
5
4
|
ChatInputBarContainer,
|
|
6
5
|
ChatMessageListContainer,
|
|
7
6
|
} from "@/components/chat/nextclaw";
|
|
8
7
|
import { ChatWelcome } from "@/components/chat/ChatWelcome";
|
|
9
8
|
import { usePresenter } from "@/components/chat/presenter/chat-presenter-context";
|
|
9
|
+
import { ChatSessionHeaderActions } from "@/components/chat/session-header/chat-session-header-actions";
|
|
10
|
+
import { ChatSessionProjectBadge } from "@/components/chat/session-header/chat-session-project-badge";
|
|
10
11
|
import { useChatThreadStore } from "@/components/chat/stores/chat-thread.store";
|
|
11
12
|
import { t } from "@/lib/i18n";
|
|
12
13
|
import { cn } from "@/lib/utils";
|
|
13
|
-
import { Trash2 } from "lucide-react";
|
|
14
14
|
|
|
15
15
|
function ChatConversationSkeleton() {
|
|
16
16
|
return (
|
|
@@ -46,15 +46,15 @@ export function ChatConversationPanel() {
|
|
|
46
46
|
const fallbackThreadRef = useRef<HTMLDivElement | null>(null);
|
|
47
47
|
const threadRef = snapshot.threadRef ?? fallbackThreadRef;
|
|
48
48
|
const shouldShowSessionHeader = Boolean(
|
|
49
|
-
snapshot.
|
|
49
|
+
snapshot.sessionKey || snapshot.sessionTypeLabel,
|
|
50
50
|
);
|
|
51
51
|
const sessionHeaderTitle =
|
|
52
52
|
snapshot.sessionDisplayName ||
|
|
53
|
-
snapshot.
|
|
53
|
+
(snapshot.canDeleteSession && snapshot.sessionKey ? snapshot.sessionKey : null) ||
|
|
54
54
|
t("chatSidebarNewTask");
|
|
55
55
|
|
|
56
56
|
const showWelcome =
|
|
57
|
-
!snapshot.
|
|
57
|
+
!snapshot.canDeleteSession &&
|
|
58
58
|
snapshot.messages.length === 0 &&
|
|
59
59
|
!snapshot.isSending;
|
|
60
60
|
const hasConfiguredModel = snapshot.modelOptions.length > 0;
|
|
@@ -68,7 +68,7 @@ export function ChatConversationPanel() {
|
|
|
68
68
|
|
|
69
69
|
const { onScroll: handleScroll } = useStickyBottomScroll({
|
|
70
70
|
scrollRef: threadRef,
|
|
71
|
-
resetKey: snapshot.
|
|
71
|
+
resetKey: snapshot.sessionKey,
|
|
72
72
|
isLoading: snapshot.isHistoryLoading,
|
|
73
73
|
hasContent: snapshot.messages.length > 0,
|
|
74
74
|
contentVersion: snapshot.messages[snapshot.messages.length - 1] ?? null,
|
|
@@ -97,17 +97,23 @@ export function ChatConversationPanel() {
|
|
|
97
97
|
{snapshot.sessionTypeLabel}
|
|
98
98
|
</span>
|
|
99
99
|
) : null}
|
|
100
|
+
{snapshot.sessionProjectName ? (
|
|
101
|
+
<ChatSessionProjectBadge
|
|
102
|
+
sessionKey={snapshot.sessionKey ?? "draft"}
|
|
103
|
+
projectName={snapshot.sessionProjectName}
|
|
104
|
+
projectRoot={snapshot.sessionProjectRoot}
|
|
105
|
+
persistToServer={snapshot.canDeleteSession}
|
|
106
|
+
/>
|
|
107
|
+
) : null}
|
|
100
108
|
</div>
|
|
101
|
-
{snapshot.
|
|
102
|
-
<
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<Trash2 className="h-4 w-4" />
|
|
110
|
-
</Button>
|
|
109
|
+
{snapshot.sessionKey ? (
|
|
110
|
+
<ChatSessionHeaderActions
|
|
111
|
+
sessionKey={snapshot.sessionKey}
|
|
112
|
+
canDeleteSession={snapshot.canDeleteSession}
|
|
113
|
+
isDeletePending={snapshot.isDeletePending}
|
|
114
|
+
projectRoot={snapshot.sessionProjectRoot}
|
|
115
|
+
onDeleteSession={presenter.chatThreadManager.deleteSession}
|
|
116
|
+
/>
|
|
111
117
|
) : null}
|
|
112
118
|
</div>
|
|
113
119
|
|
|
@@ -153,7 +159,7 @@ export function ChatConversationPanel() {
|
|
|
153
159
|
) : (
|
|
154
160
|
<div className="mx-auto w-full max-w-[min(1120px,100%)] px-6 py-5">
|
|
155
161
|
<ChatMessageListContainer
|
|
156
|
-
key={snapshot.
|
|
162
|
+
key={snapshot.sessionKey ?? "draft"}
|
|
157
163
|
messages={snapshot.messages}
|
|
158
164
|
isSending={
|
|
159
165
|
snapshot.isSending && snapshot.isAwaitingAssistantOutput
|
|
@@ -36,8 +36,8 @@ vi.mock('@/components/doc-browser', () => ({
|
|
|
36
36
|
})
|
|
37
37
|
}));
|
|
38
38
|
|
|
39
|
-
vi.mock('@/components/chat/chat-session-label
|
|
40
|
-
|
|
39
|
+
vi.mock('@/components/chat/hooks/use-chat-session-label', () => ({
|
|
40
|
+
useChatSessionLabel: () => async (params: {
|
|
41
41
|
sessionKey: string;
|
|
42
42
|
label: string | null;
|
|
43
43
|
}) => {
|
|
@@ -8,7 +8,7 @@ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover
|
|
|
8
8
|
import { SelectItem } from '@/components/ui/select';
|
|
9
9
|
import { ChatSidebarSessionItem } from '@/components/chat/chat-sidebar-session-item';
|
|
10
10
|
import { resolveSessionContextView } from '@/lib/session-context.utils';
|
|
11
|
-
import {
|
|
11
|
+
import { useChatSessionLabel } from '@/components/chat/hooks/use-chat-session-label';
|
|
12
12
|
import { useNcpSessionListView, type NcpSessionListItemView } from '@/components/chat/ncp/use-ncp-session-list-view';
|
|
13
13
|
import { usePresenter } from '@/components/chat/presenter/chat-presenter-context';
|
|
14
14
|
import { useChatInputStore } from '@/components/chat/stores/chat-input.store';
|
|
@@ -108,7 +108,7 @@ export function ChatSidebar() {
|
|
|
108
108
|
const { isLoading, items } = useNcpSessionListView();
|
|
109
109
|
const { language, setLanguage } = useI18n();
|
|
110
110
|
const { theme, setTheme } = useTheme();
|
|
111
|
-
const updateSessionLabel =
|
|
111
|
+
const updateSessionLabel = useChatSessionLabel();
|
|
112
112
|
const currentThemeLabel = t(THEME_OPTIONS.find((o) => o.value === theme)?.labelKey ?? 'themeWarm');
|
|
113
113
|
const currentLanguageLabel = LANGUAGE_OPTIONS.find((o) => o.value === language)?.label ?? language;
|
|
114
114
|
|