This commit is contained in:
sion
2026-04-23 00:44:39 +08:00
parent 685202dd55
commit 8047cfaa76
209 changed files with 2660 additions and 5560 deletions

View File

@@ -1 +0,0 @@
import{D as e,Dt as t,G as n,H as r,Tt as i,w as a}from"./iconify-DYZHDLa8.js";import{t as o}from"./ui-vendor-Za4p7XTd.js";import{J as s}from"./index-Uji7rFqr.js";var c=e({__name:`AlertDescription`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let o=e;return(e,c)=>(r(),a(`div`,{"data-slot":`alert-description`,class:t(i(s)(`text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed`,o.class))},[n(e.$slots,`default`)],2))}}),l=e({__name:`AlertTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let o=e;return(e,c)=>(r(),a(`div`,{"data-slot":`alert-title`,class:t(i(s)(`col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight`,o.class))},[n(e.$slots,`default`)],2))}}),u=o(`relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current`,{variants:{variant:{default:`bg-card text-card-foreground`,destructive:`text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90`}},defaultVariants:{variant:`default`}}),d=e({__name:`Alert`,props:{class:{type:[Boolean,null,String,Object,Array]},variant:{}},setup(e){let o=e;return(c,l)=>(r(),a(`div`,{"data-slot":`alert`,class:t(i(s)(i(u)({variant:e.variant}),o.class)),role:`alert`},[n(c.$slots,`default`)],2))}});export{l as n,c as r,d as t};

View File

@@ -1 +0,0 @@
import{C as e,D as t,G as n,H as r,I as i,S as a,Tt as o,gt as s,it as c,tt as l}from"./iconify-DYZHDLa8.js";import{E as u,w as d}from"./vue-vendor-DjtlKxRy.js";import{J as f}from"./index-Uji7rFqr.js";import{r as p}from"./button-BuRmTYve.js";import{t as m}from"./useForwardExpose-B0BXtanw.js";import{r as h}from"./AvatarImage-2cn_wg2h.js";var g=t({__name:`AvatarFallback`,props:{delayMs:{type:Number,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(t){let i=t,u=h();m();let f=s(i.delayMs===void 0);return l(e=>{if(i.delayMs&&d){let t=window.setTimeout(()=>{f.value=!0},i.delayMs);e(()=>{window.clearTimeout(t)})}}),(t,i)=>f.value&&o(u).imageLoadingStatus.value!==`loaded`?(r(),a(o(p),{key:0,"as-child":t.asChild,as:t.as},{default:c(()=>[n(t.$slots,`default`)]),_:3},8,[`as-child`,`as`])):e(`v-if`,!0)}}),_=t({__name:`AvatarFallback`,props:{delayMs:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e,s=u(t,`class`);return(e,l)=>(r(),a(o(g),i({"data-slot":`avatar-fallback`},o(s),{class:o(f)(`bg-muted flex size-full items-center justify-center rounded-full`,t.class)}),{default:c(()=>[n(e.$slots,`default`)]),_:3},16,[`class`]))}});export{_ as t};

View File

@@ -1 +0,0 @@
import{B as e,D as t,Dt as n,G as r,H as i,I as a,S as o,St as s,Tt as c,at as l,b as u,d,et as f,gt as p,it as m,tt as h,z as g}from"./iconify-DYZHDLa8.js";import{w as _}from"./vue-vendor-DjtlKxRy.js";import{J as v}from"./index-Uji7rFqr.js";import{O as y}from"./Teleport-BIYegdAM.js";import{r as b}from"./button-BuRmTYve.js";import{t as x}from"./useForwardExpose-B0BXtanw.js";var[S,C]=y(`AvatarRoot`),w=t({__name:`AvatarRoot`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){return x(),C({imageLoadingStatus:p(`idle`)}),(e,t)=>(i(),o(c(b),{"as-child":e.asChild,as:e.as},{default:m(()=>[r(e.$slots,`default`)]),_:3},8,[`as-child`,`as`]))}});function T(e,t){return e?t?(e.src!==t&&(e.src=t),e.complete&&e.naturalWidth>0?`loaded`:`loading`):`error`:`idle`}function E(t,{referrerPolicy:n,crossOrigin:r}={}){let i=p(!1),a=p(null),o=u(()=>i.value?(!a.value&&_&&(a.value=new window.Image),a.value):null),s=p(T(o.value,t.value)),c=e=>()=>{i.value&&(s.value=e)};return g(()=>{i.value=!0,h(e=>{let i=o.value;if(!i)return;s.value=T(i,t.value);let a=c(`loaded`),l=c(`error`);i.addEventListener(`load`,a),i.addEventListener(`error`,l),n?.value&&(i.referrerPolicy=n.value),typeof r?.value==`string`&&(i.crossOrigin=r.value),e(()=>{i.removeEventListener(`load`,a),i.removeEventListener(`error`,l)})})}),e(()=>{i.value=!1}),s}var D=t({__name:`AvatarImage`,props:{src:{type:String,required:!0},referrerPolicy:{type:null,required:!1},crossOrigin:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`img`}},emits:[`loadingStatusChange`],setup(e,{emit:t}){let n=e,a=t,{src:u,referrerPolicy:p,crossOrigin:h}=s(n);x();let g=S(),_=E(u,{referrerPolicy:p,crossOrigin:h});return f(_,e=>{a(`loadingStatusChange`,e),e!==`idle`&&(g.imageLoadingStatus.value=e)},{immediate:!0}),(e,t)=>l((i(),o(c(b),{role:`img`,"as-child":e.asChild,as:e.as,src:c(u),referrerpolicy:c(p),crossorigin:c(h)},{default:m(()=>[r(e.$slots,`default`)]),_:3},8,[`as-child`,`as`,`src`,`referrerpolicy`,`crossorigin`])),[[d,c(_)===`loaded`]])}}),O=t({__name:`Avatar`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,a)=>(i(),o(c(w),{"data-slot":`avatar`,class:n(c(v)(`relative flex size-8 shrink-0 overflow-hidden rounded-full`,t.class))},{default:m(()=>[r(e.$slots,`default`)]),_:3},8,[`class`]))}}),k=t({__name:`AvatarImage`,props:{src:{},referrerPolicy:{},crossOrigin:{},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,n)=>(i(),o(c(D),a({"data-slot":`avatar-image`},t,{class:`aspect-square size-full`}),{default:m(()=>[r(e.$slots,`default`)]),_:3},16))}});export{O as n,S as r,k as t};

View File

@@ -1 +0,0 @@
import{D as e,G as t,H as n,I as r,S as i,Tt as a,it as o}from"./iconify-DYZHDLa8.js";import{t as s}from"./ui-vendor-Za4p7XTd.js";import{E as c}from"./vue-vendor-DjtlKxRy.js";import{J as l}from"./index-Uji7rFqr.js";import{r as u}from"./button-BuRmTYve.js";var d=s(`inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden`,{variants:{variant:{default:`border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90`,secondary:`border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90`,destructive:`border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60`,outline:`text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground`}},defaultVariants:{variant:`default`}}),f=e({__name:`Badge`,props:{asChild:{type:Boolean},as:{},variant:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e,f=c(s,`class`);return(c,p)=>(n(),i(a(u),r({"data-slot":`badge`,class:a(l)(a(d)({variant:e.variant}),s.class)},a(f)),{default:o(()=>[t(c.$slots,`default`)]),_:3},16,[`class`]))}});export{f as t};

View File

@@ -1 +0,0 @@
import{D as e,Dt as t,G as n,H as r,Tt as i,w as a}from"./iconify-DYZHDLa8.js";import{J as o}from"./index-Uji7rFqr.js";var s=e({__name:`Card`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),a(`div`,{"data-slot":`card`,class:t(i(o)(`bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm`,s.class))},[n(e.$slots,`default`)],2))}});export{s as t};

View File

@@ -1 +0,0 @@
import{D as e,Dt as t,G as n,H as r,Tt as i,w as a}from"./iconify-DYZHDLa8.js";import{J as o}from"./index-Uji7rFqr.js";var s=e({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),a(`div`,{"data-slot":`card-content`,class:t(i(o)(`px-6`,s.class))},[n(e.$slots,`default`)],2))}});export{s as t};

View File

@@ -1 +0,0 @@
import{D as e,Dt as t,G as n,H as r,Tt as i,w as a}from"./iconify-DYZHDLa8.js";import{J as o}from"./index-Uji7rFqr.js";var s=e({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),a(`div`,{"data-slot":`card-header`,class:t(i(o)(`@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,s.class))},[n(e.$slots,`default`)],2))}}),c=e({__name:`CardDescription`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),a(`p`,{"data-slot":`card-description`,class:t(i(o)(`text-muted-foreground text-sm`,s.class))},[n(e.$slots,`default`)],2))}}),l=e({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),a(`h3`,{"data-slot":`card-title`,class:t(i(o)(`leading-none font-semibold`,s.class))},[n(e.$slots,`default`)],2))}});export{c as n,s as r,l as t};

View File

@@ -1 +0,0 @@
import{C as e,D as t,E as n,G as r,H as i,I as a,Ot as o,S as s,Tt as c,b as l,f as u,it as d,k as f,p,q as m}from"./iconify-DYZHDLa8.js";import{o as h}from"./SelectValue-Dhq6ao6U.js";import{E as g,y as _}from"./vue-vendor-DjtlKxRy.js";import{J as v}from"./index-Uji7rFqr.js";import{n as y,r as b}from"./VisuallyHidden-CeN_p2Md.js";import{O as x,T as S,g as C,y as w}from"./Teleport-BIYegdAM.js";import{r as T}from"./button-BuRmTYve.js";import{t as E}from"./useForwardExpose-B0BXtanw.js";import{t as D}from"./VisuallyHiddenInput-dn3LBkPE.js";import{t as O}from"./RovingFocusItem-BIHcXQd-.js";function k(e,t){return S(e)?!1:Array.isArray(e)?e.some(e=>b(e,t)):b(e,t)}var[A,j]=x(`CheckboxGroupRoot`);function M(e){return e===`indeterminate`}function N(e){return M(e)?`indeterminate`:e?`checked`:`unchecked`}var[P,F]=x(`CheckboxRoot`),I=t({inheritAttrs:!1,__name:`CheckboxRoot`,props:{defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1,default:void 0},disabled:{type:Boolean,required:!1},value:{type:null,required:!1,default:`on`},id:{type:String,required:!1},trueValue:{type:null,required:!1,default:()=>!0},falseValue:{type:null,required:!1,default:()=>!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`update:modelValue`],setup(t,{emit:n}){let o=t,f=n,{forwardRef:h,currentElement:g}=E(),v=A(null),x=_(o,`modelValue`,f,{defaultValue:o.defaultValue??o.falseValue,passive:o.modelValue===void 0}),C=l(()=>v?.disabled.value||o.disabled),w=l(()=>b(x.value,o.trueValue)),j=l(()=>S(v?.modelValue.value)?x.value===`indeterminate`?`indeterminate`:w.value:k(v.modelValue.value,o.value));function P(){if(S(v?.modelValue.value))x.value===`indeterminate`?x.value=o.trueValue:x.value=w.value?o.falseValue:o.trueValue;else{let e=[...v.modelValue.value||[]];if(k(e,o.value)){let t=e.findIndex(e=>b(e,o.value));e.splice(t,1)}else e.push(o.value);v.modelValue.value=e}}let I=y(g),L=l(()=>o.id&&g.value?document.querySelector(`[for="${o.id}"]`)?.innerText:void 0);return F({disabled:C,state:j}),(t,n)=>(i(),s(m(c(v)?.rovingFocus.value?c(O):c(T)),a(t.$attrs,{id:t.id,ref:c(h),role:`checkbox`,"as-child":t.asChild,as:t.as,type:t.as===`button`?`button`:void 0,"aria-checked":c(M)(j.value)?`mixed`:j.value,"aria-required":t.required,"aria-label":t.$attrs[`aria-label`]||L.value,"data-state":c(N)(j.value),"data-disabled":C.value?``:void 0,disabled:C.value,focusable:c(v)?.rovingFocus.value?!C.value:void 0,onKeydown:u(p(()=>{},[`prevent`]),[`enter`]),onClick:P}),{default:d(()=>[r(t.$slots,`default`,{modelValue:c(x),state:j.value}),c(I)&&t.name&&!c(v)?(i(),s(c(D),{key:0,type:`checkbox`,checked:!!j.value,name:t.name,value:t.value,disabled:C.value,required:t.required},null,8,[`checked`,`name`,`value`,`disabled`,`required`])):e(`v-if`,!0)]),_:3},16,[`id`,`as-child`,`as`,`type`,`aria-checked`,`aria-required`,`aria-label`,`data-state`,`data-disabled`,`disabled`,`focusable`,`onKeydown`]))}}),L=t({__name:`CheckboxIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let{forwardRef:t}=E(),o=P();return(e,l)=>(i(),s(c(C),{present:e.forceMount||c(M)(c(o).state.value)||c(o).state.value===!0},{default:d(()=>[n(c(T),a({ref:c(t),"data-state":c(N)(c(o).state.value),"data-disabled":c(o).disabled.value?``:void 0,style:{pointerEvents:`none`},"as-child":e.asChild,as:e.as},e.$attrs),{default:d(()=>[r(e.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),R=t({__name:`Checkbox`,props:{defaultValue:{},modelValue:{},disabled:{type:Boolean},value:{},id:{},trueValue:{},falseValue:{},asChild:{type:Boolean},as:{},name:{},required:{type:Boolean},class:{type:[Boolean,null,String,Object,Array]}},emits:[`update:modelValue`],setup(e,{emit:t}){let l=e,u=t,p=w(g(l,`class`),u);return(e,t)=>(i(),s(c(I),a({"data-slot":`checkbox`},c(p),{class:c(v)(`peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50`,l.class)}),{default:d(t=>[n(c(L),{"data-slot":`checkbox-indicator`,class:`grid place-content-center text-current transition-none`},{default:d(()=>[r(e.$slots,`default`,o(f(t)),()=>[n(c(h),{class:`size-3.5`})])]),_:2},1024)]),_:3},16,[`class`]))}});export{R as t};

View File

@@ -1 +0,0 @@
import{D as e,G as t,H as n,I as r,S as i,Tt as a,it as o}from"./iconify-DYZHDLa8.js";import{u as s}from"./DialogTitle-CMQDEO8n.js";var c=e({__name:`DialogClose`,props:{asChild:{type:Boolean},as:{}},setup(e){let c=e;return(e,l)=>(n(),i(a(s),r({"data-slot":`dialog-close`},c),{default:o(()=>[t(e.$slots,`default`)]),_:3},16))}});export{c as t};

View File

@@ -1 +0,0 @@
import{D as e,G as t,H as n,I as r,S as i,Tt as a,it as o}from"./iconify-DYZHDLa8.js";import{E as s}from"./vue-vendor-DjtlKxRy.js";import{J as c}from"./index-Uji7rFqr.js";import{b as l}from"./Teleport-BIYegdAM.js";import{r as u}from"./button-BuRmTYve.js";import{t as d}from"./useForwardExpose-B0BXtanw.js";import{f}from"./DialogTitle-CMQDEO8n.js";var p=e({__name:`DialogDescription`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`p`}},setup(e){let s=e;d();let c=f();return(e,l)=>(n(),i(a(u),r(s,{id:a(c).descriptionId}),{default:o(()=>[t(e.$slots,`default`)]),_:3},16,[`id`]))}}),m=e({__name:`DialogDescription`,props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let u=e,d=l(s(u,`class`));return(e,s)=>(n(),i(a(p),r({"data-slot":`dialog-description`},a(d),{class:a(c)(`text-muted-foreground text-sm`,u.class)}),{default:o(()=>[t(e.$slots,`default`)]),_:3},16,[`class`]))}});export{p as n,m as t};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{D as e,E as t,G as n,H as r,I as i,Ot as a,S as o,Tt as s,gt as c,it as l,k as u}from"./iconify-DYZHDLa8.js";import{E as d}from"./vue-vendor-DjtlKxRy.js";import{J as f}from"./index-Uji7rFqr.js";import{O as p,_ as m,b as h,d as g,g as _,l as v}from"./Teleport-BIYegdAM.js";import{r as y}from"./button-BuRmTYve.js";import{t as b}from"./useForwardExpose-B0BXtanw.js";var[x,S]=p([`MenuCheckboxItem`,`MenuRadioItem`],`MenuItemIndicatorContext`),C=e({__name:`MenuItemIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let i=x({modelValue:c(!1)});return(e,a)=>(r(),o(s(_),{present:e.forceMount||s(g)(s(i).modelValue.value)||s(i).modelValue.value===!0},{default:l(()=>[t(s(y),{as:e.as,"as-child":e.asChild,"data-state":s(v)(s(i).modelValue.value)},{default:l(()=>[n(e.$slots,`default`)]),_:3},8,[`as`,`as-child`,`data-state`])]),_:3},8,[`present`]))}}),[w,T]=p(`MenuGroup`),E=e({__name:`MenuGroup`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e,a=m(void 0,`reka-menu-group`);return T({id:a}),(e,c)=>(r(),o(s(y),i({role:`group`},t,{"aria-labelledby":s(a)}),{default:l(()=>[n(e.$slots,`default`)]),_:3},16,[`aria-labelledby`]))}}),D=e({__name:`MenuLabel`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`div`}},setup(e){let t=e,a=w({id:``});return(e,c)=>(r(),o(s(y),i(t,{id:s(a).id||void 0}),{default:l(()=>[n(e.$slots,`default`)]),_:3},16,[`id`]))}}),O=e({__name:`MenuSeparator`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e;return(e,a)=>(r(),o(s(y),i(t,{role:`separator`,"aria-orientation":`horizontal`}),{default:l(()=>[n(e.$slots,`default`)]),_:3},16))}}),k=e({__name:`DropdownMenuItemIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e;return b(),(e,i)=>(r(),o(s(C),a(u(t)),{default:l(()=>[n(e.$slots,`default`)]),_:3},16))}}),A=e({__name:`DropdownMenuLabel`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e;return b(),(e,i)=>(r(),o(s(D),a(u(t)),{default:l(()=>[n(e.$slots,`default`)]),_:3},16))}}),j=e({__name:`DropdownMenuSeparator`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e;return b(),(e,i)=>(r(),o(s(O),a(u(t)),{default:l(()=>[n(e.$slots,`default`)]),_:3},16))}}),M=e({__name:`DropdownMenuSeparator`,props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e,n=d(t,`class`);return(e,a)=>(r(),o(s(j),i({"data-slot":`dropdown-menu-separator`},s(n),{class:s(f)(`bg-border -mx-1 my-1 h-px`,t.class)}),null,16,[`class`]))}}),N=e({__name:`DropdownMenuLabel`,props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]},inset:{type:Boolean}},setup(e){let t=e,a=h(d(t,`class`,`inset`));return(c,u)=>(r(),o(s(A),i({"data-slot":`dropdown-menu-label`,"data-inset":e.inset?``:void 0},s(a),{class:s(f)(`px-2 py-1.5 text-sm font-medium data-[inset]:pl-8`,t.class)}),{default:l(()=>[n(c.$slots,`default`)]),_:3},16,[`data-inset`,`class`]))}});export{S as a,E as i,M as n,k as r,N as t};

View File

@@ -1 +0,0 @@
import{D as e,E as t,G as n,H as r,I as i,Ot as a,S as o,St as s,Tt as c,b as l,it as u,k as d,x as f}from"./iconify-DYZHDLa8.js";import{t as p}from"./circle-CK69KO4g.js";import{E as m,y as h}from"./vue-vendor-DjtlKxRy.js";import{J as g}from"./index-Uji7rFqr.js";import{O as _,b as v,l as y,x as b,y as x}from"./Teleport-BIYegdAM.js";import{a as S}from"./DropdownMenuTrigger-GJTdpRDr.js";import{t as C}from"./useForwardExpose-B0BXtanw.js";import{a as w,i as T,r as E}from"./DropdownMenuLabel-BHmU9FEw.js";var[D,O]=_(`MenuRadioGroup`),k=e({__name:`MenuRadioGroup`,props:{modelValue:{type:null,required:!1,default:``},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let i=e,s=t,l=v(m(i,[`modelValue`])),f=h(i,`modelValue`,s);return O({modelValue:f,onValueChange:e=>{f.value=e}}),(e,t)=>(r(),o(T,a(d(c(l))),{default:u(()=>[n(e.$slots,`default`,{modelValue:c(f)})]),_:3},16))}}),A=e({__name:`MenuRadioItem`,props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`select`],setup(e,{emit:t}){let a=e,d=t,f=v(m(a,[`value`])),{value:p}=s(a),h=D(),g=l(()=>h.modelValue.value===p?.value);return w({modelValue:g}),(e,t)=>(r(),o(S,i({role:`menuitemradio`},c(f),{"aria-checked":g.value,"data-state":c(y)(g.value),onSelect:t[0]||=async e=>{d(`select`,e),c(h).onValueChange(c(p))}}),{default:u(()=>[n(e.$slots,`default`)]),_:3},16,[`aria-checked`,`data-state`]))}}),j=e({__name:`DropdownMenuRadioGroup`,props:{modelValue:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let i=e,s=b(t);return C(),(e,t)=>(r(),o(c(k),a(d({...i,...c(s)})),{default:u(()=>[n(e.$slots,`default`)]),_:3},16))}}),M=e({__name:`DropdownMenuRadioItem`,props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`select`],setup(e,{emit:t}){let i=x(e,t);return C(),(e,t)=>(r(),o(c(A),a(d(c(i))),{default:u(()=>[n(e.$slots,`default`)]),_:3},16))}}),N=e({__name:`DropdownMenuRadioGroup`,props:{modelValue:{},asChild:{type:Boolean},as:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let a=x(e,t);return(e,t)=>(r(),o(c(j),i({"data-slot":`dropdown-menu-radio-group`},c(a)),{default:u(()=>[n(e.$slots,`default`)]),_:3},16))}}),P={class:`pointer-events-none absolute left-2 flex size-3.5 items-center justify-center`},F=e({__name:`DropdownMenuRadioItem`,props:{value:{},disabled:{type:Boolean},textValue:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},emits:[`select`],setup(e,{emit:a}){let s=e,l=a,d=x(m(s,`class`),l);return(e,a)=>(r(),o(c(M),i({"data-slot":`dropdown-menu-radio-item`},c(d),{class:c(g)(`focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,s.class)}),{default:u(()=>[f(`span`,P,[t(c(E),null,{default:u(()=>[n(e.$slots,`indicator-icon`,{},()=>[t(c(p),{class:`size-2 fill-current`})])]),_:3})]),n(e.$slots,`default`)]),_:3},16,[`class`]))}});export{N as n,F as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{D as e,Dt as t,H as n,Tt as r,at as i,dt as a,u as o,w as s}from"./iconify-DYZHDLa8.js";import{y as c}from"./vue-vendor-DjtlKxRy.js";import{J as l}from"./index-Uji7rFqr.js";var u=e({__name:`Input`,props:{defaultValue:{},modelValue:{},class:{type:[Boolean,null,String,Object,Array]}},emits:[`update:modelValue`],setup(e,{emit:u}){let d=e,f=c(d,`modelValue`,u,{passive:!0,defaultValue:d.defaultValue});return(e,c)=>i((n(),s(`input`,{"onUpdate:modelValue":c[0]||=e=>a(f)?f.value=e:null,"data-slot":`input`,class:t(r(l)(`file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm`,`focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]`,`aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive`,d.class))},null,2)),[[o,r(f)]])}});export{u as t};

View File

@@ -1 +0,0 @@
import{D as e,G as t,H as n,I as r,S as i,Tt as a,it as o}from"./iconify-DYZHDLa8.js";import{E as s}from"./vue-vendor-DjtlKxRy.js";import{J as c}from"./index-Uji7rFqr.js";import{r as l}from"./button-BuRmTYve.js";import{t as u}from"./useForwardExpose-B0BXtanw.js";var d=e({__name:`Label`,props:{for:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`label`}},setup(e){let s=e;return u(),(e,c)=>(n(),i(a(l),r(s,{onMousedown:c[0]||=e=>{!e.defaultPrevented&&e.detail>1&&e.preventDefault()}}),{default:o(()=>[t(e.$slots,`default`)]),_:3},16))}}),f=e({__name:`Label`,props:{for:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let l=e,u=s(l,`class`);return(e,s)=>(n(),i(a(d),r({"data-slot":`label`},a(u),{class:a(c)(`flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,l.class)}),{default:o(()=>[t(e.$slots,`default`)]),_:3},16,[`class`]))}});export{f as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{D as e,E as t,G as n,H as r,S as i,St as a,Tt as o,gt as s,it as c}from"./iconify-DYZHDLa8.js";import{y as l}from"./vue-vendor-DjtlKxRy.js";import{D as u,O as d}from"./Teleport-BIYegdAM.js";import{r as f}from"./button-BuRmTYve.js";import{o as p,u as m}from"./PopperContent-BqlvlxQe.js";var h=`rovingFocusGroup.onEntryFocus`,g={bubbles:!1,cancelable:!0},_={ArrowLeft:`prev`,ArrowUp:`prev`,ArrowRight:`next`,ArrowDown:`next`,PageUp:`first`,Home:`first`,PageDown:`last`,End:`last`};function v(e,t){return t===`rtl`?e===`ArrowLeft`?`ArrowRight`:e===`ArrowRight`?`ArrowLeft`:e:e}function y(e,t,n){let r=v(e.key,n);if(!(t===`vertical`&&[`ArrowLeft`,`ArrowRight`].includes(r))&&!(t===`horizontal`&&[`ArrowUp`,`ArrowDown`].includes(r)))return _[r]}function b(e,t=!1){let n=u();for(let r of e)if(r===n||(r.focus({preventScroll:t}),u()!==n))return}function x(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var[S,C]=d(`RovingFocusGroup`),w=e({__name:`RovingFocusGroup`,props:{orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!1},currentTabStopId:{type:[String,null],required:!1},defaultCurrentTabStopId:{type:String,required:!1},preventScrollOnEntryFocus:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`entryFocus`,`update:currentTabStopId`],setup(e,{expose:u,emit:d}){let _=e,v=d,{loop:y,orientation:x,dir:S}=a(_),w=m(S),T=l(_,`currentTabStopId`,v,{defaultValue:_.defaultCurrentTabStopId,passive:_.currentTabStopId===void 0}),E=s(!1),D=s(!1),O=s(0),{getItems:k,CollectionSlot:A}=p({isProvider:!0});function j(e){let t=!D.value;if(e.currentTarget&&e.target===e.currentTarget&&t&&!E.value){let t=new CustomEvent(h,g);if(e.currentTarget.dispatchEvent(t),v(`entryFocus`,t),!t.defaultPrevented){let e=k().map(e=>e.ref).filter(e=>e.dataset.disabled!==``);b([e.find(e=>e.getAttribute(`data-active`)===``),e.find(e=>e.getAttribute(`data-highlighted`)===``),e.find(e=>e.id===T.value),...e].filter(Boolean),_.preventScrollOnEntryFocus)}}D.value=!1}function M(){setTimeout(()=>{D.value=!1},1)}return u({getItems:k}),C({loop:y,dir:w,orientation:x,currentTabStopId:T,onItemFocus:e=>{T.value=e},onItemShiftTab:()=>{E.value=!0},onFocusableItemAdd:()=>{O.value++},onFocusableItemRemove:()=>{O.value--}}),(e,a)=>(r(),i(o(A),null,{default:c(()=>[t(o(f),{tabindex:E.value||O.value===0?-1:0,"data-orientation":o(x),as:e.as,"as-child":e.asChild,dir:o(w),style:{outline:`none`},onMousedown:a[0]||=e=>D.value=!0,onMouseup:M,onFocus:j,onBlur:a[1]||=e=>E.value=!1},{default:c(()=>[n(e.$slots,`default`)]),_:3},8,[`tabindex`,`data-orientation`,`as`,`as-child`,`dir`])]),_:3}))}});export{x as a,y as i,S as n,b as r,w as t};

View File

@@ -1 +0,0 @@
import{B as e,D as t,E as n,G as r,H as i,L as a,S as o,Tt as s,b as c,it as l,z as u}from"./iconify-DYZHDLa8.js";import{_ as d}from"./Teleport-BIYegdAM.js";import{r as f}from"./button-BuRmTYve.js";import{o as p}from"./PopperContent-BqlvlxQe.js";import{a as m,i as h,n as g,r as _}from"./RovingFocusGroup-DF8fLFe7.js";var v=t({__name:`RovingFocusItem`,props:{tabStopId:{type:String,required:!1},focusable:{type:Boolean,required:!1,default:!0},active:{type:Boolean,required:!1},allowShiftKey:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(t){let v=t,y=g(),b=d(),x=c(()=>v.tabStopId||b),S=c(()=>y.currentTabStopId.value===x.value),{getItems:C,CollectionItem:w}=p();u(()=>{v.focusable&&y.onFocusableItemAdd()}),e(()=>{v.focusable&&y.onFocusableItemRemove()});function T(e){if(e.key===`Tab`&&e.shiftKey){y.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=h(e,y.orientation.value,y.dir.value);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||!v.allowShiftKey&&e.shiftKey)return;e.preventDefault();let n=[...C().map(e=>e.ref).filter(e=>e.dataset.disabled!==``)];if(t===`last`)n.reverse();else if(t===`prev`||t===`next`){t===`prev`&&n.reverse();let r=n.indexOf(e.currentTarget);n=y.loop.value?m(n,r+1):n.slice(r+1)}a(()=>_(n))}}return(e,t)=>(i(),o(s(w),null,{default:l(()=>[n(s(f),{tabindex:S.value?0:-1,"data-orientation":s(y).orientation.value,"data-active":e.active?``:void 0,"data-disabled":e.focusable?void 0:``,as:e.as,"as-child":e.asChild,onMousedown:t[0]||=t=>{e.focusable?s(y).onItemFocus(x.value):t.preventDefault()},onFocus:t[1]||=e=>s(y).onItemFocus(x.value),onKeydown:T},{default:l(()=>[r(e.$slots,`default`)]),_:3},8,[`tabindex`,`data-orientation`,`data-active`,`data-disabled`,`as`,`as-child`])]),_:3}))}});export{v as t};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{D as e,G as t,H as n,I as r,Ot as i,S as a,Tt as o,b as s,it as c,k as l}from"./iconify-DYZHDLa8.js";import{E as u}from"./vue-vendor-DjtlKxRy.js";import{J as d}from"./index-Uji7rFqr.js";import{r as f}from"./button-BuRmTYve.js";var p=e({__name:`BaseSeparator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let i=e,l=[`horizontal`,`vertical`];function u(e){return l.includes(e)}let d=s(()=>u(i.orientation)?i.orientation:`horizontal`),p=s(()=>d.value===`vertical`?i.orientation:void 0),m=s(()=>i.decorative?{role:`none`}:{"aria-orientation":p.value,role:`separator`});return(e,i)=>(n(),a(o(f),r({as:e.as,"as-child":e.asChild,"data-orientation":d.value},m.value),{default:c(()=>[t(e.$slots,`default`)]),_:3},16,[`as`,`as-child`,`data-orientation`]))}}),m=e({__name:`Separator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let r=e;return(e,o)=>(n(),a(p,i(l(r)),{default:c(()=>[t(e.$slots,`default`)]),_:3},16))}}),h=e({__name:`Separator`,props:{orientation:{default:`horizontal`},decorative:{type:Boolean,default:!0},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e,i=u(t,`class`);return(e,s)=>(n(),a(o(m),r({"data-slot":`separator`},o(i),{class:o(d)(`bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px`,t.class)}),null,16,[`class`]))}});export{m as n,h as t};

View File

@@ -1 +0,0 @@
import{D as e,Dt as t,G as n,H as r,Tt as i,w as a,x as o}from"./iconify-DYZHDLa8.js";import{J as s}from"./index-Uji7rFqr.js";var c={"data-slot":`table-container`,class:`relative w-full overflow-auto`},l=e({__name:`Table`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let l=e;return(e,u)=>(r(),a(`div`,c,[o(`table`,{"data-slot":`table`,class:t(i(s)(`w-full caption-bottom text-sm`,l.class))},[n(e.$slots,`default`)],2)]))}}),u=e({__name:`TableBody`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let o=e;return(e,c)=>(r(),a(`tbody`,{"data-slot":`table-body`,class:t(i(s)(`[&_tr:last-child]:border-0`,o.class))},[n(e.$slots,`default`)],2))}}),d=e({__name:`TableCell`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let o=e;return(e,c)=>(r(),a(`td`,{"data-slot":`table-cell`,class:t(i(s)(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,o.class))},[n(e.$slots,`default`)],2))}}),f=e({__name:`TableHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let o=e;return(e,c)=>(r(),a(`thead`,{"data-slot":`table-header`,class:t(i(s)(`[&_tr]:border-b`,o.class))},[n(e.$slots,`default`)],2))}}),p=e({__name:`TableRow`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let o=e;return(e,c)=>(r(),a(`tr`,{"data-slot":`table-row`,class:t(i(s)(`hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors`,o.class))},[n(e.$slots,`default`)],2))}}),m=e({__name:`TableHead`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let o=e;return(e,c)=>(r(),a(`th`,{"data-slot":`table-head`,class:t(i(s)(`text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,o.class))},[n(e.$slots,`default`)],2))}});export{u as a,d as i,p as n,l as o,f as r,m as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{Ct as e,D as t,G as n,H as r,S as i,Tt as a,b as o,it as s}from"./iconify-DYZHDLa8.js";import{u as c}from"./vue-vendor-DjtlKxRy.js";import{r as l}from"./button-BuRmTYve.js";function u(e){return typeof e==`string`?`'${e}'`:new d().serialize(e)}var d=function(){class e{#e=new Map;compare(e,t){let n=typeof e,r=typeof t;return n===`string`&&r===`string`?e.localeCompare(t):n===`number`&&r===`number`?e-t:String.prototype.localeCompare.call(this.serialize(e,!0),this.serialize(t,!0))}serialize(e,t){if(e===null)return`null`;switch(typeof e){case`string`:return t?e:`'${e}'`;case`bigint`:return`${e}n`;case`object`:return this.$object(e);case`function`:return this.$function(e)}return String(e)}serializeObject(e){let t=Object.prototype.toString.call(e);if(t!==`[object Object]`)return this.serializeBuiltInType(t.length<10?`unknown:${t}`:t.slice(8,-1),e);let n=e.constructor,r=n===Object||n===void 0?``:n.name;if(r!==``&&globalThis[r]===n)return this.serializeBuiltInType(r,e);if(typeof e.toJSON==`function`){let t=e.toJSON();return r+(typeof t==`object`&&t?this.$object(t):`(${this.serialize(t)})`)}return this.serializeObjectEntries(r,Object.entries(e))}serializeBuiltInType(e,t){let n=this[`$`+e];if(n)return n.call(this,t);if(typeof t?.entries==`function`)return this.serializeObjectEntries(e,t.entries());throw Error(`Cannot serialize ${e}`)}serializeObjectEntries(e,t){let n=Array.from(t).sort((e,t)=>this.compare(e[0],t[0])),r=`${e}{`;for(let e=0;e<n.length;e++){let[t,i]=n[e];r+=`${this.serialize(t,!0)}:${this.serialize(i)}`,e<n.length-1&&(r+=`,`)}return r+`}`}$object(e){let t=this.#e.get(e);return t===void 0&&(this.#e.set(e,`#${this.#e.size}`),t=this.serializeObject(e),this.#e.set(e,t)),t}$function(e){let t=Function.prototype.toString.call(e);return t.slice(-15)===`[native code] }`?`${e.name||``}()[native]`:`${e.name}(${e.length})${t.replace(/\s*\n\s*/g,``)}`}$Array(e){let t=`[`;for(let n=0;n<e.length;n++)t+=this.serialize(e[n]),n<e.length-1&&(t+=`,`);return t+`]`}$Date(e){try{return`Date(${e.toISOString()})`}catch{return`Date(null)`}}$ArrayBuffer(e){return`ArrayBuffer[${new Uint8Array(e).join(`,`)}]`}$Set(e){return`Set${this.$Array(Array.from(e).sort((e,t)=>this.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e}();function f(e,t){return e===t||u(e)===u(t)}function p(t){return o(()=>e(t)?!!c(t)?.closest(`form`):!0)}var m=t({__name:`VisuallyHidden`,props:{feature:{type:String,required:!1,default:`focusable`},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){return(e,t)=>(r(),i(a(l),{as:e.as,"as-child":e.asChild,"aria-hidden":e.feature===`focusable`?`true`:void 0,"data-hidden":e.feature===`fully-hidden`?``:void 0,tabindex:e.feature===`fully-hidden`?`-1`:void 0,style:{position:`absolute`,border:0,width:`1px`,height:`1px`,padding:0,margin:`-1px`,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,clipPath:`inset(50%)`,whiteSpace:`nowrap`,wordWrap:`normal`,top:`-1px`,left:`-1px`}},{default:s(()=>[n(e.$slots,`default`)]),_:3},8,[`as`,`as-child`,`aria-hidden`,`data-hidden`,`tabindex`]))}});export{p as n,f as r,m as t};

View File

@@ -1 +0,0 @@
import{C as e,D as t,H as n,I as r,S as i,W as a,b as o,et as s,h as c,w as l}from"./iconify-DYZHDLa8.js";import{t as u}from"./VisuallyHidden-CeN_p2Md.js";import{s as d}from"./PopperContent-BqlvlxQe.js";var f=t({inheritAttrs:!1,__name:`VisuallyHiddenInputBubble`,props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:`fully-hidden`}},setup(e){let t=e,{primitiveElement:a,currentElement:c}=d();return s(o(()=>t.checked??t.value),(e,t)=>{if(!c.value)return;let n=c.value,r=window.HTMLInputElement.prototype,i=Object.getOwnPropertyDescriptor(r,`value`).set;if(i&&e!==t){let t=new Event(`input`,{bubbles:!0}),r=new Event(`change`,{bubbles:!0});i.call(n,e),n.dispatchEvent(t),n.dispatchEvent(r)}}),(e,o)=>(n(),i(u,r({ref_key:`primitiveElement`,ref:a},{...t,...e.$attrs},{as:`input`}),null,16))}}),p=t({inheritAttrs:!1,__name:`VisuallyHiddenInput`,props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:`fully-hidden`}},setup(t){let s=t,u=o(()=>typeof s.value==`object`&&Array.isArray(s.value)&&s.value.length===0&&s.required),d=o(()=>typeof s.value==`string`||typeof s.value==`number`||typeof s.value==`boolean`||s.value===null||s.value===void 0?[{name:s.name,value:s.value}]:typeof s.value==`object`&&Array.isArray(s.value)?s.value.flatMap((e,t)=>typeof e==`object`?Object.entries(e).map(([e,n])=>({name:`${s.name}[${t}][${e}]`,value:n})):{name:`${s.name}[${t}]`,value:e}):s.value!==null&&typeof s.value==`object`&&!Array.isArray(s.value)?Object.entries(s.value).map(([e,t])=>({name:`${s.name}[${e}]`,value:t})):[]);return(t,o)=>(n(),l(c,null,[e(` We render single input if it's required `),u.value?(n(),i(f,r({key:t.name},{...s,...t.$attrs},{name:t.name,value:t.value}),null,16,[`name`,`value`])):(n(!0),l(c,{key:1},a(d.value,e=>(n(),i(f,r({key:e.name},{ref_for:!0},{...s,...t.$attrs},{name:e.name,value:e.value}),null,16,[`name`,`value`]))),128))],2112))}});export{p as t};

View File

@@ -1 +0,0 @@
import{At as e,D as t,E as n,G as r,H as i,T as a,it as o,w as s,x as c}from"./iconify-DYZHDLa8.js";import{n as l}from"./button-BuRmTYve.js";import{t as u}from"./route-block-DB3S2hJK.js";var d={class:`max-w-2xl mx-auto text-center`},f={class:`font-bold text-8xl`},p={class:`mt-4 text-2xl font-bold`},m={class:`text-stone-400`},h={class:`mt-8`},g={class:`flex justify-center gap-2`},_=t({__name:`custom-error`,props:{code:{},subtitle:{},error:{}},setup(t){return(u,_)=>{let v=l;return i(),s(`div`,d,[c(`h1`,f,e(t.code),1),c(`h2`,p,e(t.subtitle),1),c(`p`,m,e(t.error),1),c(`footer`,h,[r(u.$slots,`default`,{},()=>[c(`div`,g,[n(v,{variant:`outline`,onClick:_[0]||=e=>u.$router.back()},{default:o(()=>[..._[2]||=[a(` Go Back `,-1)]]),_:1}),n(v,{onClick:_[1]||=e=>u.$router.push(`/`)},{default:o(()=>[..._[3]||=[a(` Back to Home `,-1)]]),_:1})])])])])}}}),v={class:`flex items-center justify-center h-screen`},y=t({__name:`[...path]`,setup(e){return(e,t)=>(i(),s(`div`,v,[n(_,{code:404,subtitle:`Page Not Found`,error:`The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.`})]))}});typeof u==`function`&&u(y);var b=y;export{b as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{H as e,K as t,S as n}from"./iconify-DYZHDLa8.js";import{K as r}from"./index-Uji7rFqr.js";import{t as i}from"./route-block-DB3S2hJK.js";var a={};function o(r,i){let a=t(`router-view`);return e(),n(a)}typeof i==`function`&&i(a);var s=r(a,[[`render`,o]]);export{s as default};

View File

@@ -1 +0,0 @@
import{H as e,K as t,S as n}from"./iconify-DYZHDLa8.js";import{K as r}from"./index-Uji7rFqr.js";var i={};function a(r,i){let a=t(`router-view`);return e(),n(a)}var o=r(i,[[`render`,a]]);export{o as default};

View File

@@ -1 +0,0 @@
import{A as e,D as t,Dt as n,G as r,H as i,I as a,S as o,Tt as s,h as c,it as l,m as u,y as d}from"./iconify-DYZHDLa8.js";import{t as f}from"./ui-vendor-Za4p7XTd.js";import{J as p}from"./index-Uji7rFqr.js";function m(e){return e?e.flatMap(e=>e.type===c?m(e.children):[e]):[]}var h=t({name:`PrimitiveSlot`,inheritAttrs:!1,setup(e,{attrs:t,slots:n}){return()=>{if(!n.default)return null;let e=m(n.default()),r=e.findIndex(e=>e.type!==u);if(r===-1)return e;let i=e[r];delete i.props?.ref;let o=i.props?a(t,i.props):t,s=d({...i,props:{}},o);return e.length===1?s:(e[r]=s,e)}}}),g=[`area`,`img`,`input`],_=t({name:`Primitive`,inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:`div`}},setup(t,{attrs:n,slots:r}){let i=t.asChild?`template`:t.as;return typeof i==`string`&&g.includes(i)?()=>e(i,n):i===`template`?()=>e(h,n,{default:r.default}):()=>e(t.as,n,{default:r.default})}}),v=t({__name:`Button`,props:{variant:{},size:{},class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{default:`button`}},setup(e){let t=e;return(a,c)=>(i(),o(s(_),{"data-slot":`button`,as:e.as,"as-child":e.asChild,class:n(s(p)(s(y)({variant:e.variant,size:e.size}),t.class))},{default:l(()=>[r(a.$slots,`default`)]),_:3},8,[`as`,`as-child`,`class`]))}}),y=f(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive`,{variants:{variant:{default:`bg-primary text-primary-foreground hover:bg-primary/90`,destructive:`bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60`,outline:`border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50`,secondary:`bg-secondary text-secondary-foreground hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50`,link:`text-primary underline-offset-4 hover:underline`},size:{default:`h-9 px-4 py-2 has-[>svg]:px-3`,sm:`h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5`,lg:`h-10 rounded-md px-6 has-[>svg]:px-4`,icon:`size-9`,"icon-sm":`size-8`,"icon-lg":`size-10`}},defaultVariants:{variant:`default`,size:`default`}});export{m as a,h as i,v as n,_ as r,y as t};

View File

@@ -1 +0,0 @@
import{t as e}from"./createLucideIcon-KbkxXQD8.js";var t=e(`chevrons-up-down`,[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]);export{t};

View File

@@ -1 +0,0 @@
import{t as e}from"./createLucideIcon-KbkxXQD8.js";var t=e(`circle`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]);export{t};

View File

@@ -1 +0,0 @@
import{t as e}from"./createLucideIcon-KbkxXQD8.js";var t=e(`arrow-down`,[[`path`,{d:`M12 5v14`,key:`s699le`}],[`path`,{d:`m19 12-7 7-7-7`,key:`1idqje`}]]),n=e(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),r=e(`arrow-up`,[[`path`,{d:`m5 12 7-7 7 7`,key:`hav0vg`}],[`path`,{d:`M12 19V5`,key:`x0mq9r`}]]),i=e(`circle-plus`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M8 12h8`,key:`1wcyev`}],[`path`,{d:`M12 8v8`,key:`napkw2`}]]);export{t as i,r as n,n as r,i as t};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{A as e}from"./iconify-DYZHDLa8.js";var t=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},n=e=>e===``,r=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),i=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),a=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),o=e=>{let t=a(e);return t.charAt(0).toUpperCase()+t.slice(1)},s={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},c=({name:a,iconNode:c,absoluteStrokeWidth:l,"absolute-stroke-width":u,strokeWidth:d,"stroke-width":f,size:p=s.width,color:m=s.stroke,...h},{slots:g})=>e(`svg`,{...s,...h,width:p,height:p,stroke:m,"stroke-width":n(l)||n(u)||l===!0||u===!0?Number(d||f||s[`stroke-width`])*24/Number(p):d||f||s[`stroke-width`],class:r(`lucide`,h.class,...a?[`lucide-${i(o(a))}-icon`,`lucide-${i(a)}`]:[`lucide-icon`]),...!g.default&&!t(h)&&{"aria-hidden":`true`}},[...c.map(t=>e(...t)),...g.default?[g.default()]:[]]),l=(t,n)=>(r,{slots:i,attrs:a})=>e(c,{...a,...r,iconNode:n,name:t},i);export{l as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{t as e}from"./createLucideIcon-KbkxXQD8.js";var t=e(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]);export{t};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{At as e,C as t,D as n,Dt as r,E as i,G as a,H as o,K as s,S as c,T as l,Tt as u,W as d,b as f,h as p,it as m,q as h,w as g,x as _}from"./iconify-DYZHDLa8.js";import{t as v}from"./chevrons-up-down-kQRjQJq9.js";import{i as y}from"./vue-vendor-DjtlKxRy.js";import{J as b}from"./index-Uji7rFqr.js";import{n as x}from"./button-BuRmTYve.js";import{i as S,n as C,r as w,t as T}from"./DropdownMenuTrigger-GJTdpRDr.js";var E={class:`text-2xl font-bold`},D={key:0,class:`text-muted-foreground`},O={class:`flex items-center gap-2 flex-wrap`},k=n({__name:`basic-header`,props:{title:{},description:{},sticky:{type:Boolean}},setup(n){return(i,s)=>(o(),g(`header`,{class:r(u(b)(`flex flex-col md:flex-row gap-2 justify-between py-2`,n.sticky?`sticky top-0 z-40 bg-background`:``))},[_(`main`,null,[_(`h1`,E,e(n.title),1),n.description?(o(),g(`p`,D,e(n.description),1)):t(``,!0)]),_(`aside`,O,[a(i.$slots,`actions`)])],2))}}),A={class:`py-4`},j=n({__name:`basic-page`,props:{title:{},description:{},sticky:{type:Boolean}},setup(e){return(t,n)=>(o(),g(`main`,null,[i(k,{title:e.title,description:e.description,sticky:e.sticky},{actions:m(()=>[a(t.$slots,`actions`)]),_:3},8,[`title`,`description`,`sticky`]),_(`main`,A,[a(t.$slots,`default`)])]))}}),M={class:`flex flex-col gap-2`},N=`text-primary font-semibold bg-primary/5`,P=n({__name:`two-col-aside`,props:{nav:{}},setup(t){let n=t,a=y(),b=f(()=>a.path),E=f(()=>n.nav.find(e=>e.url===b.value));return(t,a)=>{let f=s(`router-link`),y=x,D=T,O=C,k=w,A=S;return o(),g(`nav`,M,[(o(!0),g(p,null,d(n.nav,t=>(o(),c(f,{key:t.url,to:t.url,class:r([`items-center hidden px-2 py-1 rounded-md lg:flex hover:bg-primary/5`,t.url===u(b)?N:``])},{default:m(()=>[(o(),c(h(t.icon),{class:`size-4 mr-1`})),_(`span`,null,e(t.title),1)]),_:2},1032,[`to`,`class`]))),128)),i(A,{class:`lg:hidden`},{default:m(()=>[i(D,{"as-child":``},{default:m(()=>[i(y,{variant:`outline`,class:`w-48 lg:hidden`},{default:m(()=>[(o(),c(h(u(E)?.icon),{class:`size-4 mr-1`})),_(`span`,null,e(u(E)?.title),1),i(u(v),{class:`size-4 ml-auto`})]),_:1})]),_:1}),i(k,{class:`w-48`,align:`start`},{default:m(()=>[(o(!0),g(p,null,d(n.nav,n=>(o(),c(O,{key:n.url,onClick:e=>t.$router.push(n.url)},{default:m(()=>[(o(),c(h(n.icon),{class:`size-4 mr-1`})),l(` `+e(n.title),1)]),_:2},1032,[`onClick`]))),128))]),_:1})]),_:1})])}}}),F=n({__name:`two-col`,setup(e){return(e,t)=>(o(),g(`div`,{class:r(u(b)(`grid grid-cols-1 lg:grid-cols-[200px_1fr] gap-4 w-full`))},[_(`aside`,null,[a(e.$slots,`aside`)]),_(`section`,null,[a(e.$slots,`default`)])],2))}});export{P as n,j as r,F as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{At as e,D as t,E as n,H as r,K as i,S as a,T as o,Tt as s,W as c,a as l,h as u,it as d,w as f,x as p}from"./iconify-DYZHDLa8.js";import{n as m,t as h}from"./toggle-theme-DJeMx_CM.js";import{f as g}from"./vue-vendor-DjtlKxRy.js";import{K as _}from"./index-Uji7rFqr.js";import"./Teleport-BIYegdAM.js";import{n as v}from"./button-BuRmTYve.js";import{n as y,t as b}from"./AvatarImage-2cn_wg2h.js";var x={class:`min-h-18 flex items-center justify-between`},S={class:`flex items-center gap-2`},C=t({__name:`the-footer`,setup(e){let t=g(),i=[{name:`bluesky`,icon:`simple-icons:bluesky`,url:`https://bsky.app/profile/bitmc.bsky.social`},{name:`github`,icon:`simple-icons:github`,url:`https://www.github.com/whbbit1999/shadcn-vue-admin`},{name:`bilibili`,icon:`simple-icons:bilibili`,url:`https://space.bilibili.com/104376935`}];return(e,a)=>{let o=b,m=y,h=v;return r(),f(`footer`,x,[n(m,null,{default:d(()=>[n(o,{src:`${s(t)===`dark`?`/logo.svg`:`/logo-black.svg`}`,alt:`Logo`},null,8,[`src`])]),_:1}),a[0]||=p(`div`,null,`© 2025 Whbbit1999`,-1),p(`div`,S,[(r(),f(u,null,c(i,e=>n(h,{key:e.name,variant:`outline`,size:`icon`,as:`a`,href:e.url,target:`_blank`},{default:d(()=>[n(s(l),{icon:e.icon},null,8,[`icon`])]),_:2},1032,[`href`])),64))])])}}}),w={};function T(t,n){let i=v;return r(),a(i,{as:`a`,href:`/auth/sign-in`},{default:d(()=>[o(e(t.$t(`login`)),1)]),_:1})}var E=_(w,[[`render`,T]]),D={};function O(t,n){let i=v;return r(),a(i,{as:`a`,href:`/auth/sign-up`,variant:`outline`},{default:d(()=>[o(e(t.$t(`register`)),1)]),_:1})}var k=_(D,[[`render`,O]]),A={class:`h-14 flex items-center marketing-header sticky top-0 z-99`},j={class:`mr-2 hidden lg:flex lg:gap-2`},M={class:`flex gap-2`},N=_(t({__name:`the-header`,setup(e){let t=g();return(e,a)=>{let o=b,c=y,l=i(`router-link`);return r(),f(`header`,A,[n(l,{to:`/`,class:`flex items-center gap-2`},{default:d(()=>[n(c,null,{default:d(()=>[n(o,{src:`${s(t)===`dark`?`/logo.svg`:`/logo-black.svg`}`,alt:`Logo`},null,8,[`src`])]),_:1}),a[0]||=p(`span`,{class:`text-base font-bold`},`Shadcn Vue Admin`,-1)]),_:1}),a[1]||=p(`div`,{class:`flex-1`},null,-1),p(`div`,j,[n(E),n(k)]),p(`div`,M,[n(m),n(h)])])}}}),[[`__scopeId`,`data-v-bceee906`]]),P={class:`container mx-auto`},F={class:`mx-2 lg:p-0`},I=t({__name:`marketing`,setup(e){return(e,t)=>{let a=i(`router-view`);return r(),f(`div`,P,[p(`div`,F,[n(N),p(`main`,null,[n(a)]),n(C)])])}}});export{I as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{D as e,H as t,w as n}from"./iconify-DYZHDLa8.js";import{t as r}from"./route-block-DB3S2hJK.js";var i=e({__name:`index`,setup(e){return(e,r)=>(t(),n(`div`))}});typeof r==`function`&&r(i);var a=i;export{a as default};

View File

@@ -1 +0,0 @@
var e={};export{e as t};

View File

@@ -1 +0,0 @@
import{t as e}from"./createLucideIcon-KbkxXQD8.js";var t=e(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]);export{t};

View File

@@ -1 +0,0 @@
import{D as e,E as t,G as n,H as r,S as i,Tt as a,it as o}from"./iconify-DYZHDLa8.js";import{t as s}from"./use-sidebar-DLbHg08t.js";import{n as c,r as l,t as u}from"./global-layout-BGXP2p6j.js";var d=e({__name:`settings-layout`,setup(e){let{settingsNavItems:d}=s();return(e,s)=>(r(),i(a(l),{title:`Settings`,description:`Manage your store settings.`},{default:o(()=>[t(a(u),null,{aside:o(()=>[t(a(c),{nav:a(d)},null,8,[`nav`])]),default:o(()=>[n(e.$slots,`default`)]),_:3})]),_:3}))}});export{d as t};

View File

@@ -1 +0,0 @@
import{At as e,C as t,D as n,E as r,H as i,S as a,T as o,Tt as s,dt as c,gt as l,it as u,p as d,tt as f,w as p,x as m}from"./iconify-DYZHDLa8.js";import{t as h}from"./createLucideIcon-KbkxXQD8.js";import{t as g}from"./eye-off-zNoi7wuS.js";import{a as _}from"./vue-vendor-DjtlKxRy.js";import{q as v}from"./index-Uji7rFqr.js";import{n as y}from"./button-BuRmTYve.js";import{t as b}from"./Label-BOs1t85p.js";import{t as x}from"./Input-DFmzhatB.js";import"./monisuo-admin.api-dPrln-7F.js";import{t as S}from"./use-auth-twSJ0MPL.js";import{t as C}from"./route-block-DB3S2hJK.js";import{t as w}from"./Card-mLutrMBs.js";import{t as T}from"./CardContent-CfcCWlf4.js";import{r as E,t as D}from"./Alert-IVeByMOV.js";import{n as O,r as k,t as A}from"./CardTitle-DKqKY8Zs.js";var j=h(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),M=h(`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`}]]),N=h(`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`}]]),P={class:`min-h-screen flex items-center justify-center bg-gradient-to-br from-background to-muted p-4`},F={class:`flex justify-center mb-4`},I={class:`size-12 rounded-xl bg-primary flex items-center justify-center`},L={class:`space-y-2`},R={class:`relative`},z={class:`space-y-2`},B={class:`relative`},V=n({__name:`sign-in`,setup(n){let h=l(``),C=l(``),V=l(!1),{login:H,loading:U,error:W,isLogin:G}=S(),K=_();f(()=>{s(G)&&K.push(`/monisuo/dashboard`)});async function q(){!h.value||!C.value||await H(h.value,C.value)}return(n,l)=>{let f=A,_=O,S=k,H=b,G=x,K=E,J=D,Y=v,X=y,Z=T,Q=w;return i(),p(`div`,P,[r(Q,{class:`w-full max-w-lg`},{default:u(()=>[r(S,{class:`space-y-1 text-center`},{default:u(()=>[m(`div`,F,[m(`div`,I,[r(s(M),{class:`size-6 text-primary-foreground`})])]),r(f,{class:`text-2xl font-bold`},{default:u(()=>[...l[3]||=[o(` Monisuo Admin `,-1)]]),_:1}),r(_,null,{default:u(()=>[...l[4]||=[o(` 管理员登录 `,-1)]]),_:1})]),_:1}),r(Z,null,{default:u(()=>[m(`form`,{onSubmit:d(q,[`prevent`]),class:`space-y-4`},[m(`div`,L,[r(H,{for:`username`},{default:u(()=>[...l[5]||=[o(`用户名`,-1)]]),_:1}),m(`div`,R,[r(s(N),{class:`absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),r(G,{id:`username`,modelValue:s(h),"onUpdate:modelValue":l[0]||=e=>c(h)?h.value=e:null,type:`text`,placeholder:`请输入用户名`,class:`pl-9`,disabled:s(U)},null,8,[`modelValue`,`disabled`])])]),m(`div`,z,[r(H,{for:`password`},{default:u(()=>[...l[6]||=[o(`密码`,-1)]]),_:1}),m(`div`,B,[r(s(M),{class:`absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),r(G,{id:`password`,modelValue:s(C),"onUpdate:modelValue":l[1]||=e=>c(C)?C.value=e:null,type:s(V)?`text`:`password`,placeholder:`请输入密码`,class:`pl-9 pr-9`,disabled:s(U)},null,8,[`modelValue`,`type`,`disabled`]),m(`button`,{type:`button`,class:`absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground`,onClick:l[2]||=e=>V.value=!s(V)},[s(V)?(i(),a(s(g),{key:1,class:`size-4`})):(i(),a(s(j),{key:0,class:`size-4`}))])])]),s(W)?(i(),a(J,{key:0,variant:`destructive`},{default:u(()=>[r(K,null,{default:u(()=>[o(e(s(W)),1)]),_:1})]),_:1})):t(``,!0),r(X,{type:`submit`,class:`w-full`,disabled:s(U)},{default:u(()=>[s(U)?(i(),a(Y,{key:0,class:`size-4 mr-2`})):t(``,!0),o(` `+e(s(U)?`登录中...`:`登录`),1)]),_:1},8,[`disabled`])],32)]),_:1})]),_:1})])}}});typeof C==`function`&&C(V);var H=V;export{H as default};

View File

@@ -1 +0,0 @@
import{At as e,C as t,D as n,E as r,H as i,S as a,T as o,Tt as s,b as c,dt as l,et as u,gt as d,h as f,it as p,w as m,x as h}from"./iconify-DYZHDLa8.js";import"./use-sidebar-DLbHg08t.js";import"./vue-vendor-DjtlKxRy.js";import{G as g}from"./index-Uji7rFqr.js";import"./Teleport-BIYegdAM.js";import{n as _}from"./button-BuRmTYve.js";import{t as v}from"./Input-DFmzhatB.js";import{g as y,w as b}from"./monisuo-admin.api-dPrln-7F.js";import"./global-layout-BGXP2p6j.js";import{t as x}from"./settings-layout-C49P92lm.js";var S={class:`space-y-6`},C={key:0,class:`text-muted-foreground`},w={key:1,class:`space-y-4`},T={class:`grid gap-2`},E={class:`flex items-center justify-between`},D={class:`flex gap-2`},O={key:1,class:`text-sm text-muted-foreground bg-muted px-3 py-2 rounded-md`},k=n({__name:`system`,setup(n){let{data:k,isLoading:A}=y(`customer_service_contact`),j=b(),M=c({get:()=>k.value?.data?.value??``,set:e=>{}}),N=d(``),P=d(!1);u(k,e=>{e?.data?.value!==void 0&&(N.value=e.data.value)},{immediate:!0});function F(){N.value=M.value,P.value=!0}function I(){j.mutate({key:`customer_service_contact`,value:N.value,description:`客服联系账号`},{onSuccess:()=>{g.success(`保存成功`),P.value=!1},onError:()=>{g.error(`保存失败`)}})}return(n,c)=>{let u=_,d=v;return i(),a(x,null,{default:p(()=>[h(`div`,S,[c[5]||=h(`div`,null,[h(`h3`,{class:`text-lg font-semibold`},` 客服设置 `),h(`p`,{class:`text-sm text-muted-foreground`},` 配置前端用户可见的客服联系信息(如 Telegram、微信等 `)],-1),s(A)?(i(),m(`div`,C,` 加载中... `)):(i(),m(`div`,w,[h(`div`,T,[h(`div`,E,[c[3]||=h(`label`,{class:`text-sm font-medium`},`客服联系账号`,-1),s(P)?t(``,!0):(i(),a(u,{key:0,variant:`outline`,size:`sm`,onClick:F},{default:p(()=>[...c[2]||=[o(` 编辑 `,-1)]]),_:1}))]),s(P)?(i(),m(f,{key:0},[r(d,{modelValue:s(N),"onUpdate:modelValue":c[0]||=e=>l(N)?N.value=e:null,placeholder:`输入客服联系账号Telegram/微信等)`},null,8,[`modelValue`]),h(`div`,D,[r(u,{size:`sm`,disabled:s(j).isPending.value,onClick:I},{default:p(()=>[o(e(s(j).isPending.value?`保存中...`:`保存`),1)]),_:1},8,[`disabled`]),r(u,{variant:`outline`,size:`sm`,onClick:c[1]||=e=>P.value=!1},{default:p(()=>[...c[4]||=[o(` 取消 `,-1)]]),_:1})])],64)):(i(),m(`p`,O,e(s(M)||`未设置`),1))])]))])]),_:1})}}});export{k as default};

View File

@@ -1 +0,0 @@
import{A as e,At as t,D as n,E as r,H as i,T as a,Tt as o,it as s,w as c}from"./iconify-DYZHDLa8.js";import"./vue-vendor-DjtlKxRy.js";import{G as l}from"./index-Uji7rFqr.js";import"./Teleport-BIYegdAM.js";import{n as u}from"./button-BuRmTYve.js";import{a as d,i as f,n as p,r as m,s as h}from"./modal-DDjjVbEC.js";var g=n({__name:`task-delete`,props:{task:{}},setup(n){let g=n;function _(){l(`The following task has been deleted:`,{description:e(`pre`,{class:`mt-2 w-[340px] rounded-md bg-slate-950 p-4`},e(`code`,{class:`text-white`},JSON.stringify(g.task,null,2)))})}return(e,l)=>{let g=u;return i(),c(`div`,null,[r(o(m),null,{default:s(()=>[r(o(p),null,{default:s(()=>[a(` Delete this task: `+t(n.task.id)+` ? `,1)]),_:1}),r(o(d),null,{default:s(()=>[a(` You are about to delete a task with the ID `+t(n.task.id)+`. This action cannot be undone. `,1)]),_:1})]),_:1}),r(o(f),null,{default:s(()=>[r(o(h),{"as-child":``},{default:s(()=>[r(g,{variant:`outline`},{default:s(()=>[...l[0]||=[a(` Cancel `,-1)]]),_:1})]),_:1}),r(o(h),{"as-child":``},{default:s(()=>[r(g,{variant:`destructive`,onClick:_},{default:s(()=>[...l[1]||=[a(` Delete `,-1)]]),_:1})]),_:1})]),_:1})])}}});export{g as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import"./iconify-DYZHDLa8.js";import{t as e}from"./task-resource-dialog-CNnuYfue.js";import"./vue-vendor-DjtlKxRy.js";import"./Teleport-BIYegdAM.js";import"./button-BuRmTYve.js";import"./modal-DDjjVbEC.js";export{e as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{At as e,D as t,E as n,H as r,S as i,T as a,Tt as o,a as s,dt as c,it as l,x as u}from"./iconify-DYZHDLa8.js";import{t as d}from"./createLucideIcon-KbkxXQD8.js";import{f}from"./vue-vendor-DjtlKxRy.js";import{I as p,L as m,R as h}from"./index-Uji7rFqr.js";import{n as g}from"./button-BuRmTYve.js";import{i as _,n as v,r as y,t as b}from"./DropdownMenuTrigger-GJTdpRDr.js";import{n as x,t as S}from"./DropdownMenuLabel-BHmU9FEw.js";import{n as C,t as w}from"./DropdownMenuRadioItem-rRjwCXWS.js";var T=d(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),E=d(`sun-moon`,[[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M14.837 16.385a6 6 0 1 1-7.223-7.222c.624-.147.97.66.715 1.248a4 4 0 0 0 5.26 5.259c.589-.255 1.396.09 1.248.715`,key:`xlf6rm`}],[`path`,{d:`M16 12a4 4 0 0 0-4-4`,key:`6vsxu`}],[`path`,{d:`m19 5-1.256 1.256`,key:`1yg6a6`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}]]),D=d(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),O=t({__name:`language-change`,setup(t){let{locale:d}=h();function f(){d.value=`en`,m.value=`en`}function v(e){if(typeof e!=`string`||!p.has(e)){f();return}d.value=e,m.value=e}return(t,f)=>{let p=g,m=b,h=S,T=x,E=w,D=C,O=y,k=_;return r(),i(k,null,{default:l(()=>[n(m,{"as-child":``},{default:l(()=>[n(p,{variant:`outline`},{default:l(()=>[n(o(s),{icon:`mdi:translate`,class:`mr-2`}),a(` `+e(t.$t(`language`)),1)]),_:1})]),_:1}),n(O,null,{default:l(()=>[n(h,null,{default:l(()=>[a(e(t.$t(`changeLanguage`)),1)]),_:1}),n(T),n(D,{modelValue:o(d),"onUpdate:modelValue":[f[0]||=e=>c(d)?d.value=e:null,v]},{default:l(()=>[n(E,{value:`en`},{default:l(()=>[n(o(s),{icon:`flag:us-4x3`}),f[1]||=u(`span`,{class:`ml-2`},`English`,-1)]),_:1}),n(E,{value:`zh`},{default:l(()=>[n(o(s),{icon:`flag:cn-4x3`}),f[2]||=u(`span`,{class:`ml-2`},`中文`,-1)]),_:1})]),_:1},8,[`modelValue`])]),_:1})]),_:1})}}}),k=t({__name:`toggle-theme`,setup(e){let t=f();return(e,s)=>{let c=g,d=b,f=v,p=y,m=_;return r(),i(m,null,{default:l(()=>[n(d,{"as-child":``},{default:l(()=>[n(c,{variant:`outline`,size:`icon`},{default:l(()=>[n(o(T),{class:`rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0`}),n(o(D),{class:`absolute rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100`}),s[3]||=u(`span`,{class:`sr-only`},`Toggle theme`,-1)]),_:1})]),_:1}),n(p,{align:`end`},{default:l(()=>[n(f,{onClick:s[0]||=e=>t.value=`light`},{default:l(()=>[n(o(D)),s[4]||=a(` Light `,-1)]),_:1}),n(f,{onClick:s[1]||=e=>t.value=`dark`},{default:l(()=>[n(o(T)),s[5]||=a(` Dark `,-1)]),_:1}),n(f,{onClick:s[2]||=e=>t.value=`auto`},{default:l(()=>[n(o(E)),s[6]||=a(` System `,-1)]),_:1})]),_:1})]),_:1})}}});export{T as a,E as i,O as n,D as r,k as t};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{gt as e}from"./iconify-DYZHDLa8.js";import{N as t,a as n}from"./vue-vendor-DjtlKxRy.js";import{r}from"./useMutation-VMyHxPGH.js";import{P as i}from"./index-Uji7rFqr.js";import{t as a}from"./monisuo-admin.api-dPrln-7F.js";function o(){let o=n(),s=r(),c=i(),{isLogin:l,adminInfo:u}=t(c),d=e(!1),f=e(null),p=a();function m(){c.logout(),s.clear(),o.push({path:`/auth/sign-in`})}function h(){o.push({path:`/monisuo/dashboard`})}async function g(e,t){d.value=!0,f.value=null;try{let n=await p.mutateAsync({username:e,password:t});if(console.log(`Login result:`,n),n.code===`0000`&&n.data){console.log(`Setting token and adminInfo...`),c.setToken(n.data.token),c.setAdminInfo(n.data.adminInfo),console.log(`isLogin after setToken:`,c.isLogin);let e=o.currentRoute.value.query.redirect;console.log(`Redirecting to:`,e||`/monisuo/dashboard`),!e||e.startsWith(`//`)?h():o.push(e)}else console.log(`Login failed:`,n.code,n.msg),f.value=n.msg||`登录失败`}catch(e){console.error(`Login error:`,e),f.value=e.message||e.response?.data?.msg||`网络错误,请稍后重试`}finally{d.value=!1}}return{loading:d,error:f,isLogin:l,adminInfo:u,logout:m,login:g}}export{o as t};

View File

@@ -1 +0,0 @@
import{b as e,gt as t}from"./iconify-DYZHDLa8.js";import{t as n}from"./createLucideIcon-KbkxXQD8.js";import{t as r}from"./settings-2-S4frxvwx.js";import{P as i}from"./index-Uji7rFqr.js";var a=n(`circle-dollar-sign`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8`,key:`1h4pet`}],[`path`,{d:`M12 18V6`,key:`zqpxq5`}]]),o=n(`coins`,[[`path`,{d:`M13.744 17.736a6 6 0 1 1-7.48-7.48`,key:`bq4yh3`}],[`path`,{d:`M15 6h1v4`,key:`11y1tn`}],[`path`,{d:`m6.134 14.768.866-.5 2 3.464`,key:`17snzx`}],[`circle`,{cx:`16`,cy:`8`,r:`6`,key:`14bfc9`}]]),s=n(`dollar-sign`,[[`line`,{x1:`12`,x2:`12`,y1:`2`,y2:`22`,key:`7eqyqh`}],[`path`,{d:`M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6`,key:`1b0p4s`}]]),c=n(`palette`,[[`path`,{d:`M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z`,key:`e79jfc`}],[`circle`,{cx:`13.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`1okk4w`}],[`circle`,{cx:`17.5`,cy:`10.5`,r:`.5`,fill:`currentColor`,key:`f64h9f`}],[`circle`,{cx:`6.5`,cy:`12.5`,r:`.5`,fill:`currentColor`,key:`qy21gx`}],[`circle`,{cx:`8.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`fotxhn`}]]),l=n(`receipt`,[[`path`,{d:`M12 17V7`,key:`pyj7ub`}],[`path`,{d:`M16 8h-6a2 2 0 0 0 0 4h4a2 2 0 0 1 0 4H8`,key:`1elt7d`}],[`path`,{d:`M4 3a1 1 0 0 1 1-1 1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1 1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2 1 1 0 0 1-1-1z`,key:`ycz6yz`}]]),u=n(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),d=n(`shield-check`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),f=n(`trending-up`,[[`path`,{d:`M16 7h6v6`,key:`box55l`}],[`path`,{d:`m22 7-8.5 8.5-5-5L2 17`,key:`1t1m79`}]]),p=n(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),m=n(`wallet`,[[`path`,{d:`M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1`,key:`18etb6`}],[`path`,{d:`M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4`,key:`xoc0q4`}]]);function h(){let n=i(),h=e(()=>n.adminInfo?.role??2),g=e(()=>h.value===1),_=[{title:`外观设置`,url:`/settings/appearance`,icon:c},{title:`系统设置`,url:`/settings/system`,icon:r}],v=[{title:`Monisuo 管理`,items:[{title:`数据看板`,url:`/monisuo/dashboard`,icon:s,roles:[1]},{title:`用户管理`,url:`/monisuo/users`,icon:p,roles:[1]},{title:`币种管理`,url:`/monisuo/coins`,icon:o,roles:[1]},{title:`钱包管理`,url:`/monisuo/wallets`,icon:m,roles:[1]},{title:`订单审批`,url:`/monisuo/orders`,icon:l,roles:[1,2]},{title:`财务审批`,url:`/monisuo/finance-orders`,icon:a,roles:[1,3]},{title:`业务分析`,url:`/monisuo/analytics`,icon:f,roles:[1]},{title:`管理员管理`,url:`/monisuo/admins`,icon:d,roles:[1]}]},{title:`Other`,items:[{title:`Settings`,icon:u,items:_}]}];return{navData:e(()=>v.map(e=>({title:e.title,items:e.items.filter(e=>{let t=e.roles;return t?t.includes(h.value):!0})})).filter(e=>e.items.length>0)),otherPages:t([]),settingsNavItems:_,isSuperAdmin:g}}export{h as t};

View File

@@ -1 +0,0 @@
import{O as e,V as t,b as n,gt as r,wt as i}from"./iconify-DYZHDLa8.js";import{u as a}from"./vue-vendor-DjtlKxRy.js";function o(){let o=e(),s=r(),c=n(()=>l());t(()=>{c.value!==l()&&i(s)});function l(){return s.value&&`$el`in s.value&&[`#text`,`#comment`].includes(s.value.$el.nodeName)?s.value.$el.nextElementSibling:a(s)}let u=Object.assign({},o.exposed),d={};for(let e in o.props)Object.defineProperty(d,e,{enumerable:!0,configurable:!0,get:()=>o.props[e]});if(Object.keys(u).length>0)for(let e in u)Object.defineProperty(d,e,{enumerable:!0,configurable:!0,get:()=>u[e]});Object.defineProperty(d,`$el`,{enumerable:!0,configurable:!0,get:()=>o.vnode.el}),o.exposed=d;function f(e){if(s.value=e,e&&(Object.defineProperty(d,`$el`,{enumerable:!0,configurable:!0,get:()=>e instanceof Element?e:e.$el}),!(e instanceof Element)&&!Object.prototype.hasOwnProperty.call(e,`$el`))){let t=e.$.exposed,n=Object.assign({},d);for(let e in t)Object.defineProperty(n,e,{enumerable:!0,configurable:!0,get:()=>t[e]});o.exposed=n}}return{forwardRef:f,currentRef:s,currentElement:c}}export{o as t};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{A as e,At as t,D as n,E as r,H as i,T as a,Tt as o,it as s,w as c}from"./iconify-DYZHDLa8.js";import"./vue-vendor-DjtlKxRy.js";import{G as l}from"./index-Uji7rFqr.js";import"./Teleport-BIYegdAM.js";import{n as u}from"./button-BuRmTYve.js";import{a as d,i as f,n as p,r as m,s as h}from"./modal-DDjjVbEC.js";var g=n({__name:`user-delete`,props:{user:{}},emits:[`remove`],setup(n,{emit:g}){let _=g;function v(){l(`The following task has been deleted:`,{description:e(`pre`,{class:`mt-2 w-[340px] rounded-md bg-slate-950 p-4`},e(`code`,{class:`text-white`},JSON.stringify(n.user,null,2)))}),_(`remove`)}return(e,l)=>{let g=u;return i(),c(`div`,null,[r(o(m),null,{default:s(()=>[r(o(p),null,{default:s(()=>[a(` Delete this user: `+t(n.user.username)+` ? `,1)]),_:1}),r(o(d),null,{default:s(()=>[a(` You are about to delete a user with the ID `+t(n.user.id)+`. This action cannot be undone. `,1)]),_:1})]),_:1}),r(o(f),null,{default:s(()=>[r(o(h),{"as-child":``},{default:s(()=>[r(g,{variant:`outline`},{default:s(()=>[...l[0]||=[a(` Cancel `,-1)]]),_:1})]),_:1}),r(o(h),{"as-child":``},{default:s(()=>[r(g,{variant:`destructive`,onClick:v},{default:s(()=>[...l[1]||=[a(` Delete `,-1)]]),_:1})]),_:1})]),_:1})])}}});export{g as default};

View File

@@ -1 +0,0 @@
import{A as e,At as t,D as n,E as r,H as i,I as a,Ot as o,T as s,Tt as c,W as l,b as u,h as d,it as f,k as p,mt as m,w as h,x as g}from"./iconify-DYZHDLa8.js";import{a as _,i as v,n as y,r as b,t as x}from"./SelectValue-Dhq6ao6U.js";import{G as S,a as C,d as w,f as T,l as E,p as D,u as O}from"./index-Uji7rFqr.js";import{n as k}from"./button-BuRmTYve.js";import{a as A,n as j,r as M}from"./modal-DDjjVbEC.js";import{a as N,c as P,i as F,l as I,n as L,r as R,s as z,t as B}from"./vee-validate-zod-CSNgsVeg.js";import{t as V}from"./Input-DFmzhatB.js";var H=E([`active`,`inactive`,`invited`,`suspended`]),U=E([`superadmin`,`admin`,`cashier`,`manager`]);O(T({id:D(),firstName:D(),lastName:D(),username:D(),email:D(),phoneNumber:D(),status:H,role:U,createdAt:C(),updatedAt:C()}));var W=T({id:D().optional(),firstName:D().min(1),lastName:D().min(1),username:D().min(1),email:w().min(1),phoneNumber:D().min(1),status:H,role:U}),G={class:`max-h-[500px] overflow-y-auto`},K=n({__name:`user-form`,props:{user:{}},emits:[`close`],setup(n,{emit:u}){let C=u,w=[`superadmin`,`admin`,`cashier`,`manager`],T=[`active`,`inactive`,`invited`,`suspended`],E=m({firstName:n.user?.firstName||``,lastName:n.user?.lastName||``,username:n.user?.username||``,email:n.user?.email||``,phoneNumber:n.user?.phoneNumber||``,status:n.user?.status||`active`,role:n.user?.role||`cashier`}),{handleSubmit:D}=P({validationSchema:B(W),initialValues:E}),O=D(t=>{let r={...t};n.user&&(r.id=n.user.id),S(`You submitted the following values:`,{description:e(`pre`,{class:`mt-2 w-[340px] rounded-md bg-slate-950 p-4`},e(`code`,{class:`text-white`},JSON.stringify(r,null,2)))}),C(`close`)});return(e,n)=>(i(),h(`div`,G,[g(`form`,{class:`space-y-8`,onSubmit:n[0]||=(...e)=>c(O)&&c(O)(...e)},[r(c(z),{name:`firstName`},{default:f(({componentField:e})=>[r(c(F),null,{default:f(()=>[r(c(R),null,{default:f(()=>[...n[1]||=[s(`First Name`,-1)]]),_:1}),r(c(N),null,{default:f(()=>[r(c(V),a({type:`text`},e),null,16)]),_:2},1024),r(c(L))]),_:2},1024)]),_:1}),r(c(z),{name:`lastName`},{default:f(({componentField:e})=>[r(c(F),null,{default:f(()=>[r(c(R),null,{default:f(()=>[...n[2]||=[s(`Last Name`,-1)]]),_:1}),r(c(N),null,{default:f(()=>[r(c(V),a({type:`text`},e),null,16)]),_:2},1024),r(c(L))]),_:2},1024)]),_:1}),r(c(z),{name:`username`},{default:f(({componentField:e})=>[r(c(F),null,{default:f(()=>[r(c(R),null,{default:f(()=>[...n[3]||=[s(`User Name`,-1)]]),_:1}),r(c(N),null,{default:f(()=>[r(c(V),a({type:`text`},e),null,16)]),_:2},1024),r(c(L))]),_:2},1024)]),_:1}),r(c(z),{name:`email`},{default:f(({componentField:e})=>[r(c(F),null,{default:f(()=>[r(c(R),null,{default:f(()=>[...n[4]||=[s(`Email address`,-1)]]),_:1}),r(c(N),null,{default:f(()=>[r(c(V),a({type:`text`},e),null,16)]),_:2},1024),r(c(L))]),_:2},1024)]),_:1}),r(c(z),{name:`phoneNumber`},{default:f(({componentField:e})=>[r(c(F),null,{default:f(()=>[r(c(R),null,{default:f(()=>[...n[5]||=[s(`Phone Number`,-1)]]),_:1}),r(c(N),null,{default:f(()=>[r(c(V),a({type:`text`},e),null,16)]),_:2},1024),r(c(L))]),_:2},1024)]),_:1}),r(c(z),{name:`status`},{default:f(({componentField:e})=>[r(c(F),null,{default:f(()=>[r(c(R),null,{default:f(()=>[...n[6]||=[s(`Status`,-1)]]),_:1}),r(c(N),null,{default:f(()=>[r(c(_),o(p(e)),{default:f(()=>[r(c(N),null,{default:f(()=>[r(c(y),{class:`w-full`},{default:f(()=>[r(c(x),{placeholder:`Select a status`})]),_:1})]),_:1}),r(c(v),null,{default:f(()=>[r(c(I),null,{default:f(()=>[(i(),h(d,null,l(T,e=>r(c(b),{key:e,value:e},{default:f(()=>[s(t(e),1)]),_:2},1032,[`value`])),64))]),_:1})]),_:1})]),_:1},16)]),_:2},1024),r(c(L))]),_:2},1024)]),_:1}),r(c(z),{name:`role`},{default:f(({componentField:e})=>[r(c(F),null,{default:f(()=>[r(c(R),null,{default:f(()=>[...n[7]||=[s(`Role`,-1)]]),_:1}),r(c(N),null,{default:f(()=>[r(c(_),o(p(e)),{default:f(()=>[r(c(N),null,{default:f(()=>[r(c(y),{class:`w-full`},{default:f(()=>[r(c(x),{placeholder:`Select a role`})]),_:1})]),_:1}),r(c(v),null,{default:f(()=>[r(c(I),null,{default:f(()=>[(i(),h(d,null,l(w,e=>r(c(b),{key:e,value:e},{default:f(()=>[s(t(e),1)]),_:2},1032,[`value`])),64))]),_:1})]),_:1})]),_:1},16)]),_:2},1024),r(c(L))]),_:2},1024)]),_:1}),r(c(k),{type:`submit`,class:`w-full`},{default:f(()=>[...n[8]||=[s(` SaveChanges `,-1)]]),_:1})],32)]))}}),q=n({__name:`user-resource`,props:{user:{}},emits:[`close`],setup(e){let n=e,a=u(()=>n.user),o=u(()=>a.value?.id?`Edit User`:`New User`),l=u(()=>a.value?.id?`Edit user ${a.value.username}`:`Create new user`);return(e,n)=>(i(),h(`div`,null,[r(c(M),null,{default:f(()=>[r(c(j),null,{default:f(()=>[s(t(c(o)),1)]),_:1}),r(c(A),null,{default:f(()=>[s(t(c(l)),1)]),_:1})]),_:1}),r(K,{user:c(a),onClose:n[0]||=t=>e.$emit(`close`)},null,8,[`user`])]))}});export{q as t};

View File

@@ -1 +0,0 @@
import"./iconify-DYZHDLa8.js";import"./vue-vendor-DjtlKxRy.js";import"./Teleport-BIYegdAM.js";import"./button-BuRmTYve.js";import"./modal-DDjjVbEC.js";import{t as e}from"./user-resource-4TUrecRM.js";export{e as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -14,13 +14,15 @@
name="keywords"
content="vue,vue-router,vite,typescript,tailwindcss,shadcn-vue,tanstack-vue-query,tanstack-table,eslint,pinia,pnpm"
/>
<script type="module" crossorigin src="/assets/index-Uji7rFqr.js"></script>
<script type="module" crossorigin src="/assets/index-DfpqRhmZ.js"></script>
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dw2cE7zH.js">
<link rel="modulepreload" crossorigin href="/assets/iconify-DYZHDLa8.js">
<link rel="modulepreload" crossorigin href="/assets/vue-vendor-DjtlKxRy.js">
<link rel="modulepreload" crossorigin href="/assets/ui-vendor-Za4p7XTd.js">
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-KbkxXQD8.js">
<link rel="stylesheet" crossorigin href="/assets/index-CUIp_KwK.css">
<link rel="modulepreload" crossorigin href="/assets/iconify-DZhaWUcP.js">
<link rel="modulepreload" crossorigin href="/assets/tanstack-DCA-W282.js">
<link rel="modulepreload" crossorigin href="/assets/vue-vendor-scK6fGv1.js">
<link rel="modulepreload" crossorigin href="/assets/axios-CAMzs3B1.js">
<link rel="modulepreload" crossorigin href="/assets/ui-vendor-DEKg_cPQ.js">
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Z3H64jz2.js">
<link rel="stylesheet" crossorigin href="/assets/index-DRcMemqx.css">
</head>
<body>
<div id="app"></div>

View File

@@ -81,11 +81,6 @@
"devDependencies": {
"@antfu/eslint-config": "^7.7.2",
"@faker-js/faker": "^10.3.0",
"@iconify-json/carbon": "^1.2.20",
"@iconify-json/flag": "^1.2.11",
"@iconify-json/lucide": "^1.2.100",
"@iconify-json/mdi": "^1.2.3",
"@iconify-json/simple-icons": "^1.2.74",
"@iconify/vue": "^5.0.0",
"@tanstack/eslint-plugin-query": "^5.91.4",
"@tanstack/vue-query-devtools": "^6.1.5",

View File

@@ -129,21 +129,6 @@ importers:
'@faker-js/faker':
specifier: ^10.3.0
version: 10.3.0
'@iconify-json/carbon':
specifier: ^1.2.20
version: 1.2.20
'@iconify-json/flag':
specifier: ^1.2.11
version: 1.2.11
'@iconify-json/lucide':
specifier: ^1.2.100
version: 1.2.100
'@iconify-json/mdi':
specifier: ^1.2.3
version: 1.2.3
'@iconify-json/simple-icons':
specifier: ^1.2.74
version: 1.2.74
'@iconify/vue':
specifier: ^5.0.0
version: 5.0.0(vue@3.5.30(typescript@5.9.3))
@@ -935,21 +920,6 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
'@iconify-json/carbon@1.2.20':
resolution: {integrity: sha512-wqyxKEbIRdzGdfCAwQqn8iSfO6jx0m1toZAAQdx1NFjxd6iFl1YY4eKI1woWt7XOxs7s7phMW530kDD867JZGw==}
'@iconify-json/flag@1.2.11':
resolution: {integrity: sha512-yqaID0FXzdXSXBBVi+/huqxrBWc0tySVvOsAmO/Vu/5UW+A3MNAOzXMIUfzA1SEiaZaxUHE9dDo6/wno3zggyw==}
'@iconify-json/lucide@1.2.100':
resolution: {integrity: sha512-vCrhQ/6T530HEMkWOkSyedvMiuQdVU1tMHEs32k4tklJmCmjokH3Dej6ycvfLt7kftBSQ2kPSUiyOpoW3uOF5g==}
'@iconify-json/mdi@1.2.3':
resolution: {integrity: sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg==}
'@iconify-json/simple-icons@1.2.74':
resolution: {integrity: sha512-yqaohfY6jnYjTVpuTkaBQHrWbdUrQyWXhau0r/0EZiNWYXPX/P8WWwl1DoLH5CbvDjjcWQw5J0zADhgCUklOqA==}
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
@@ -7397,26 +7367,6 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
'@iconify-json/carbon@1.2.20':
dependencies:
'@iconify/types': 2.0.0
'@iconify-json/flag@1.2.11':
dependencies:
'@iconify/types': 2.0.0
'@iconify-json/lucide@1.2.100':
dependencies:
'@iconify/types': 2.0.0
'@iconify-json/mdi@1.2.3':
dependencies:
'@iconify/types': 2.0.0
'@iconify-json/simple-icons@1.2.74':
dependencies:
'@iconify/types': 2.0.0
'@iconify/types@2.0.0': {}
'@iconify/utils@3.1.0':
@@ -12624,7 +12574,7 @@ snapshots:
pkg-types@1.3.1:
dependencies:
confbox: 0.1.8
mlly: 1.8.0
mlly: 1.8.1
pathe: 2.0.3
pkg-types@2.3.0:

View File

@@ -12,7 +12,7 @@ const { contentLayout } = storeToRefs(themeStore)
<template>
<div class="space-y-1.5 pt-6">
<UiLabel for="radius" class="text-xs">
Content Layout
内容布局
</UiLabel>
<div class="grid grid-cols-2 gap-2 py-1.5">
<UiButton

View File

@@ -4,6 +4,17 @@ import { storeToRefs } from 'pinia'
import { THEME_PRIMARY_COLORS, THEMES } from '@/constants/themes'
import { useThemeStore } from '@/stores/theme'
const THEME_NAMES: Record<string, string> = {
zinc: '灰',
red: '红',
rose: '玫红',
orange: '橙',
green: '绿',
blue: '蓝',
yellow: '黄',
violet: '紫',
}
const themeStore = useThemeStore()
const { setTheme } = themeStore
const { theme: t } = storeToRefs(themeStore)
@@ -17,7 +28,7 @@ watchEffect(() => {
<template>
<div class="space-y-1.5 pt-6">
<UiLabel for="radius" class="text-xs">
Color
颜色
</UiLabel>
<div class="grid grid-cols-2 gap-2 py-1.5">
<UiButton
@@ -33,7 +44,7 @@ watchEffect(() => {
}"
class="size-2 rounded-full bg-(--theme-primary)"
/>
<span class="text-xs">{{ theme.theme[0].toUpperCase() }}{{ theme.theme.slice(1) }}</span>
<span class="text-xs">{{ THEME_NAMES[theme.theme] ?? theme.theme }}</span>
</UiButton>
</div>
</div>

View File

@@ -16,7 +16,7 @@ watchEffect(() => {
<template>
<div class="space-y-1.5 pt-6">
<UiLabel for="radius" class="text-xs">
Radius
圆角
</UiLabel>
<div class="grid grid-cols-5 gap-2 py-1.5">
<UiButton

View File

@@ -5,10 +5,10 @@
<template>
<div class="grid space-y-1">
<h1 class="font-semibold text-md text-foreground">
Customize
主题定制
</h1>
<p class="text-xs text-muted-foreground">
Pick a style and color for your components.
选择组件样式和颜色
</p>
</div>
</template>

View File

@@ -24,7 +24,7 @@ function setColorMode(colorMode: BasicColorSchema) {
<template>
<div class="space-y-1.5 pt-6">
<UiLabel for="radius" class="text-xs">
Color Mode
颜色模式
</UiLabel>
<div class="grid grid-cols-3 gap-2 py-1.5">
<UiButton
@@ -35,7 +35,7 @@ function setColorMode(colorMode: BasicColorSchema) {
@click="setColorMode(item.colorMode)"
>
<component :is="item.icon" />
<span class="text-xs">{{ item.colorMode }}</span>
<span class="text-xs">{{ item.colorMode === 'light' ? '浅色' : item.colorMode === 'dark' ? '深色' : '自动' }}</span>
</UiButton>
</div>
</div>

View File

@@ -1,29 +1,16 @@
<script lang="ts" setup>
import { cn } from '@/lib/utils'
import type { LayoutHeaderProps } from './types'
defineProps<LayoutHeaderProps>()
defineProps<{ sticky?: boolean }>()
</script>
<template>
<header
:class="cn(
'flex flex-col md:flex-row gap-2 justify-between py-2',
'flex items-center justify-end gap-2',
sticky ? 'sticky top-0 z-40 bg-background' : '',
)"
>
<main>
<h1 class="text-2xl font-bold">
{{ title }}
</h1>
<p v-if="description" class="text-muted-foreground">
{{ description }}
</p>
</main>
<aside class="flex items-center gap-2 flex-wrap">
<slot name="actions" />
</aside>
<slot name="actions" />
</header>
</template>

View File

@@ -1,24 +1,18 @@
<script lang="ts" setup>
import type { LayoutHeaderProps } from './types'
import BasicHeader from './basic-header.vue'
defineProps<LayoutHeaderProps>()
defineProps<{ sticky?: boolean }>()
</script>
<template>
<main>
<BasicHeader
:title="title"
:description="description"
:sticky="sticky"
>
<BasicHeader :sticky="sticky">
<template #actions>
<slot name="actions" />
</template>
</BasicHeader>
<main class="py-4">
<main>
<slot />
</main>
</main>

View File

@@ -1,11 +1,5 @@
import type { Component } from 'vue'
export interface LayoutHeaderProps {
title: string
description: string
sticky?: boolean
}
export interface TwoColAsideNavItem {
title: string
url: string

View File

@@ -1,4 +1,4 @@
import { CircleDollarSign, Coins, DollarSign, Palette, Receipt, Settings, Settings2, ShieldCheck, TrendingUp, Users, Wallet } from 'lucide-vue-next'
import { CircleDollarSign, Coins, DollarSign, Palette, Receipt, Settings, Settings2, ShieldCheck, Ticket, TrendingUp, Users, Wallet } from 'lucide-vue-next'
import type { NavGroup } from '@/components/app-sidebar/types'
import { useAuthStore } from '@/stores/auth'
@@ -23,14 +23,15 @@ export function useSidebar() {
{ title: '钱包管理', url: '/monisuo/wallets', icon: Wallet, roles: [1] },
{ title: '订单审批', url: '/monisuo/orders', icon: Receipt, roles: [1, 2] },
{ title: '财务审批', url: '/monisuo/finance-orders', icon: CircleDollarSign, roles: [1, 3] },
{ title: '交易码管理', url: '/monisuo/trade-codes', icon: Ticket, roles: [1, 2] },
{ title: '业务分析', url: '/monisuo/analytics', icon: TrendingUp, roles: [1] },
{ title: '管理员管理', url: '/monisuo/admins', icon: ShieldCheck, roles: [1] },
],
},
{
title: 'Other',
title: '系统',
items: [
{ title: 'Settings', icon: Settings, items: settingsNavItems },
{ title: '设置', icon: Settings, items: settingsNavItems },
],
},
]

View File

@@ -19,6 +19,6 @@ export const RADIUS = [0, 0.25, 0.5, 0.75, 1] as const
export type ContentLayout = 'full' | 'centered'
export const CONTENT_LAYOUTS = [
{ label: 'Full', value: 'full', icon: UnfoldHorizontal },
{ label: 'Centered', value: 'centered', icon: MoveHorizontal },
{ label: '全宽', value: 'full', icon: UnfoldHorizontal },
{ label: '居中', value: 'centered', icon: MoveHorizontal },
] as const

View File

@@ -3,9 +3,7 @@ import { useCookies } from '@vueuse/integrations/useCookies'
import { storeToRefs } from 'pinia'
import AppSidebar from '@/components/app-sidebar/index.vue'
import CommandMenuPanel from '@/components/command-menu-panel/index.vue'
import ThemePopover from '@/components/custom-theme/theme-popover.vue'
import LanguageChange from '@/components/language-change.vue'
import ToggleTheme from '@/components/toggle-theme.vue'
import { SIDEBAR_COOKIE_NAME } from '@/components/ui/sidebar/utils'
import { cn } from '@/lib/utils'
@@ -21,14 +19,11 @@ const { contentLayout } = storeToRefs(themeStore)
<AppSidebar />
<UiSidebarInset class="w-full max-w-full peer-data-[state=collapsed]:w-[calc(100%-var(--sidebar-width-icon)-1rem)] peer-data-[state=expanded]:w-[calc(100%-var(--sidebar-width))]">
<header
class="flex items-center gap-3 sm:gap-4 h-16 p-4 shrink-0 transition-[width,height] ease-linear"
class="flex items-center gap-3 sm:gap-4 h-12 p-4 shrink-0 transition-[width,height] ease-linear"
>
<UiSidebarTrigger class="-ml-1" />
<UiSeparator orientation="vertical" class="h-6" />
<CommandMenuPanel />
<div class="flex-1" />
<div class="ml-auto flex items-center space-x-4">
<LanguageChange />
<ToggleTheme />
<ThemePopover />
</div>

View File

@@ -1,20 +1,8 @@
import { createApp } from 'vue'
import { addCollection } from '@iconify/vue'
import App from './App.vue'
import { setupPlugins } from './plugins'
// 使用本地图标数据,避免远程 API 调用
import { icons as mdiIcons } from '@iconify-json/mdi'
import { icons as lucideIcons } from '@iconify-json/lucide'
import { icons as flagIcons } from '@iconify-json/flag'
import { icons as carbonIcons } from '@iconify-json/carbon'
addCollection(mdiIcons)
addCollection(lucideIcons)
addCollection(flagIcons)
addCollection(carbonIcons)
import '@/assets/index.css'
import '@/assets/scrollbar.css'
import '@/assets/themes.css'

View File

@@ -1,273 +0,0 @@
<script setup lang="ts">
import { VisArea, VisAxis, VisLine, VisXYContainer } from '@unovis/vue'
import type { ChartConfig } from '@/components/ui/chart'
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from '@/components/ui/card'
import {
ChartContainer,
ChartCrosshair,
ChartLegendContent,
ChartTooltip,
ChartTooltipContent,
componentToString,
} from '@/components/ui/chart'
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/components/ui/select'
const chartData = [
{ date: new Date('2024-04-01'), desktop: 222, mobile: 150 },
{ date: new Date('2024-04-02'), desktop: 97, mobile: 180 },
{ date: new Date('2024-04-03'), desktop: 167, mobile: 120 },
{ date: new Date('2024-04-04'), desktop: 242, mobile: 260 },
{ date: new Date('2024-04-05'), desktop: 373, mobile: 290 },
{ date: new Date('2024-04-06'), desktop: 301, mobile: 340 },
{ date: new Date('2024-04-07'), desktop: 245, mobile: 180 },
{ date: new Date('2024-04-08'), desktop: 409, mobile: 320 },
{ date: new Date('2024-04-09'), desktop: 59, mobile: 110 },
{ date: new Date('2024-04-10'), desktop: 261, mobile: 190 },
{ date: new Date('2024-04-11'), desktop: 327, mobile: 350 },
{ date: new Date('2024-04-12'), desktop: 292, mobile: 210 },
{ date: new Date('2024-04-13'), desktop: 342, mobile: 380 },
{ date: new Date('2024-04-14'), desktop: 137, mobile: 220 },
{ date: new Date('2024-04-15'), desktop: 120, mobile: 170 },
{ date: new Date('2024-04-16'), desktop: 138, mobile: 190 },
{ date: new Date('2024-04-17'), desktop: 446, mobile: 360 },
{ date: new Date('2024-04-18'), desktop: 364, mobile: 410 },
{ date: new Date('2024-04-19'), desktop: 243, mobile: 180 },
{ date: new Date('2024-04-20'), desktop: 89, mobile: 150 },
{ date: new Date('2024-04-21'), desktop: 137, mobile: 200 },
{ date: new Date('2024-04-22'), desktop: 224, mobile: 170 },
{ date: new Date('2024-04-23'), desktop: 138, mobile: 230 },
{ date: new Date('2024-04-24'), desktop: 387, mobile: 290 },
{ date: new Date('2024-04-25'), desktop: 215, mobile: 250 },
{ date: new Date('2024-04-26'), desktop: 75, mobile: 130 },
{ date: new Date('2024-04-27'), desktop: 383, mobile: 420 },
{ date: new Date('2024-04-28'), desktop: 122, mobile: 180 },
{ date: new Date('2024-04-29'), desktop: 315, mobile: 240 },
{ date: new Date('2024-04-30'), desktop: 454, mobile: 380 },
{ date: new Date('2024-05-01'), desktop: 165, mobile: 220 },
{ date: new Date('2024-05-02'), desktop: 293, mobile: 310 },
{ date: new Date('2024-05-03'), desktop: 247, mobile: 190 },
{ date: new Date('2024-05-04'), desktop: 385, mobile: 420 },
{ date: new Date('2024-05-05'), desktop: 481, mobile: 390 },
{ date: new Date('2024-05-06'), desktop: 498, mobile: 520 },
{ date: new Date('2024-05-07'), desktop: 388, mobile: 300 },
{ date: new Date('2024-05-08'), desktop: 149, mobile: 210 },
{ date: new Date('2024-05-09'), desktop: 227, mobile: 180 },
{ date: new Date('2024-05-10'), desktop: 293, mobile: 330 },
{ date: new Date('2024-05-11'), desktop: 335, mobile: 270 },
{ date: new Date('2024-05-12'), desktop: 197, mobile: 240 },
{ date: new Date('2024-05-13'), desktop: 197, mobile: 160 },
{ date: new Date('2024-05-14'), desktop: 448, mobile: 490 },
{ date: new Date('2024-05-15'), desktop: 473, mobile: 380 },
{ date: new Date('2024-05-16'), desktop: 338, mobile: 400 },
{ date: new Date('2024-05-17'), desktop: 499, mobile: 420 },
{ date: new Date('2024-05-18'), desktop: 315, mobile: 350 },
{ date: new Date('2024-05-19'), desktop: 235, mobile: 180 },
{ date: new Date('2024-05-20'), desktop: 177, mobile: 230 },
{ date: new Date('2024-05-21'), desktop: 82, mobile: 140 },
{ date: new Date('2024-05-22'), desktop: 81, mobile: 120 },
{ date: new Date('2024-05-23'), desktop: 252, mobile: 290 },
{ date: new Date('2024-05-24'), desktop: 294, mobile: 220 },
{ date: new Date('2024-05-25'), desktop: 201, mobile: 250 },
{ date: new Date('2024-05-26'), desktop: 213, mobile: 170 },
{ date: new Date('2024-05-27'), desktop: 420, mobile: 460 },
{ date: new Date('2024-05-28'), desktop: 233, mobile: 190 },
{ date: new Date('2024-05-29'), desktop: 78, mobile: 130 },
{ date: new Date('2024-05-30'), desktop: 340, mobile: 280 },
{ date: new Date('2024-05-31'), desktop: 178, mobile: 230 },
{ date: new Date('2024-06-01'), desktop: 178, mobile: 200 },
{ date: new Date('2024-06-02'), desktop: 470, mobile: 410 },
{ date: new Date('2024-06-03'), desktop: 103, mobile: 160 },
{ date: new Date('2024-06-04'), desktop: 439, mobile: 380 },
{ date: new Date('2024-06-05'), desktop: 88, mobile: 140 },
{ date: new Date('2024-06-06'), desktop: 294, mobile: 250 },
{ date: new Date('2024-06-07'), desktop: 323, mobile: 370 },
{ date: new Date('2024-06-08'), desktop: 385, mobile: 320 },
{ date: new Date('2024-06-09'), desktop: 438, mobile: 480 },
{ date: new Date('2024-06-10'), desktop: 155, mobile: 200 },
{ date: new Date('2024-06-11'), desktop: 92, mobile: 150 },
{ date: new Date('2024-06-12'), desktop: 492, mobile: 420 },
{ date: new Date('2024-06-13'), desktop: 81, mobile: 130 },
{ date: new Date('2024-06-14'), desktop: 426, mobile: 380 },
{ date: new Date('2024-06-15'), desktop: 307, mobile: 350 },
{ date: new Date('2024-06-16'), desktop: 371, mobile: 310 },
{ date: new Date('2024-06-17'), desktop: 475, mobile: 520 },
{ date: new Date('2024-06-18'), desktop: 107, mobile: 170 },
{ date: new Date('2024-06-19'), desktop: 341, mobile: 290 },
{ date: new Date('2024-06-20'), desktop: 408, mobile: 450 },
{ date: new Date('2024-06-21'), desktop: 169, mobile: 210 },
{ date: new Date('2024-06-22'), desktop: 317, mobile: 270 },
{ date: new Date('2024-06-23'), desktop: 480, mobile: 530 },
{ date: new Date('2024-06-24'), desktop: 132, mobile: 180 },
{ date: new Date('2024-06-25'), desktop: 141, mobile: 190 },
{ date: new Date('2024-06-26'), desktop: 434, mobile: 380 },
{ date: new Date('2024-06-27'), desktop: 448, mobile: 490 },
{ date: new Date('2024-06-28'), desktop: 149, mobile: 200 },
{ date: new Date('2024-06-29'), desktop: 103, mobile: 160 },
{ date: new Date('2024-06-30'), desktop: 446, mobile: 400 },
]
type Data = typeof chartData[number]
const chartConfig = {
// visitors: {
// label: 'Visitors',
// },
mobile: {
label: 'Mobile',
color: 'var(--chart-2)',
},
desktop: {
label: 'Desktop',
color: 'var(--chart-1)',
},
} satisfies ChartConfig
const svgDefs = `
<linearGradient id="fillDesktop" x1="0" y1="0" x2="0" y2="1">
<stop
offset="5%"
stop-color="var(--color-desktop)"
stop-opacity="0.8"
/>
<stop
offset="95%"
stop-color="var(--color-desktop)"
stop-opacity="0.1"
/>
</linearGradient>
<linearGradient id="fillMobile" x1="0" y1="0" x2="0" y2="1">
<stop
offset="5%"
stop-color="var(--color-mobile)"
stop-opacity="0.8"
/>
<stop
offset="95%"
stop-color="var(--color-mobile)"
stop-opacity="0.1"
/>
</linearGradient>
`
const timeRange = ref('90d')
const filterRange = computed(() => {
return chartData.filter((item) => {
const date = new Date(item.date)
const referenceDate = new Date('2024-06-30')
let daysToSubtract = 90
if (timeRange.value === '30d') {
daysToSubtract = 30
}
else if (timeRange.value === '7d') {
daysToSubtract = 7
}
const startDate = new Date(referenceDate)
startDate.setDate(startDate.getDate() - daysToSubtract)
return date >= startDate
})
})
</script>
<template>
<Card class="pt-0">
<CardHeader class="flex items-center gap-2 space-y-0 border-b py-5 sm:flex-row">
<div class="grid flex-1 gap-1">
<CardTitle>Area Chart - Interactive</CardTitle>
<CardDescription>
Showing total visitors for the last 3 months
</CardDescription>
</div>
<Select v-model="timeRange">
<SelectTrigger
class="hidden w-[160px] rounded-lg sm:ml-auto sm:flex"
aria-label="Select a value"
>
<SelectValue placeholder="Last 3 months" />
</SelectTrigger>
<SelectContent class="rounded-xl">
<SelectItem value="90d" class="rounded-lg">
Last 3 months
</SelectItem>
<SelectItem value="30d" class="rounded-lg">
Last 30 days
</SelectItem>
<SelectItem value="7d" class="rounded-lg">
Last 7 days
</SelectItem>
</SelectContent>
</Select>
</CardHeader>
<CardContent class="px-2 pt-4 sm:px-6 sm:pt-6 pb-4">
<ChartContainer :config="chartConfig" class="aspect-auto h-[250px] w-full" :cursor="false">
<VisXYContainer
:data="filterRange"
:svg-defs="svgDefs"
:margin="{ left: -40 }"
:y-domain="[0, 1200]"
>
<VisArea
:x="(d: Data) => d.date"
:y="[(d: Data) => d.mobile, (d: Data) => d.desktop]"
:color="(_d: Data, i: number) => ['url(#fillMobile)', 'url(#fillDesktop)'][i]"
:opacity="0.6"
/>
<VisLine
:x="(d: Data) => d.date"
:y="[(d: Data) => d.mobile, (d: Data) => d.mobile + d.desktop]"
:color="(_d: Data, i: number) => [chartConfig.mobile.color, chartConfig.desktop.color][i]"
:line-width="1"
/>
<VisAxis
type="x"
:x="(d: Data) => d.date"
:tick-line="false"
:domain-line="false"
:grid-line="false"
:num-ticks="6"
:tick-format="(d: number, _index: number) => {
const date = new Date(d)
return date.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
})
}"
/>
<VisAxis
type="y"
:num-ticks="3"
:tick-line="false"
:domain-line="false"
/>
<ChartTooltip />
<ChartCrosshair
:template="componentToString(chartConfig, ChartTooltipContent, {
labelFormatter: (d) => {
return new Date(d).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
})
},
})"
:color="(_d: Data, i: number) => [chartConfig.mobile.color, chartConfig.desktop.color][i % 2]"
/>
</VisXYContainer>
<ChartLegendContent />
</ChartContainer>
</CardContent>
</Card>
</template>

View File

@@ -1,135 +0,0 @@
<script lang="ts" setup>
import OverviewChart from './overview-chart.vue'
import RecentSales from './recent-sales.vue'
</script>
<template>
<div class="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
Total Revenue
</UiCardTitle>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
class="size-4 text-muted-foreground"
>
<path d="M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" />
</svg>
</UiCardHeader>
<UiCardContent>
<div class="text-2xl font-bold">
$45,231.89
</div>
<p class="text-xs text-muted-foreground">
+20.1% from last month
</p>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
Subscriptions
</UiCardTitle>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
class="size-4 text-muted-foreground"
>
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" />
</svg>
</UiCardHeader>
<UiCardContent>
<div class="text-2xl font-bold">
+2350
</div>
<p class="text-xs text-muted-foreground">
+180.1% from last month
</p>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
Sales
</UiCardTitle>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
class="size-4 text-muted-foreground"
>
<rect width="20" height="14" x="2" y="5" rx="2" />
<path d="M2 10h20" />
</svg>
</UiCardHeader>
<UiCardContent>
<div class="text-2xl font-bold">
+12,234
</div>
<p class="text-xs text-muted-foreground">
+19% from last month
</p>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
Active Now
</UiCardTitle>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
class="size-4 text-muted-foreground"
>
<path d="M22 12h-4l-3 9L9 3l-3 9H2" />
</svg>
</UiCardHeader>
<UiCardContent>
<div class="text-2xl font-bold">
+573
</div>
<p class="text-xs text-muted-foreground">
+201 since last hour
</p>
</UiCardContent>
</UiCard>
</div>
<div class="grid grid-cols-1 gap-4 lg:grid-cols-7">
<OverviewChart class="col-span-1 lg:col-span-4" />
<UiCard class="col-span-1 lg:col-span-3">
<UiCardHeader>
<UiCardTitle>Recent Sales</UiCardTitle>
<UiCardDescription>
You made 265 sales this month.
</UiCardDescription>
</UiCardHeader>
<UiCardContent>
<RecentSales />
</UiCardContent>
</UiCard>
</div>
</template>

View File

@@ -1,42 +0,0 @@
<script lang="ts" setup>
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
interface User {
avatar: string
name: string
email: string
amount: string
}
const list = ref<User[]>([
{ avatar: '', name: 'Olivia Martin', email: 'olivia.martin@email.com', amount: '$1,999.00' },
{ avatar: '', name: 'Jackson Lee', email: 'jackson.lee@email.com', amount: '$39.00' },
{ avatar: '', name: 'Isabella Nguyen', email: 'isabella.nguyen@email.com', amount: '$299.00' },
{ avatar: '', name: 'William Kim', email: 'will@email.com', amount: '$99.00' },
{ avatar: '', name: 'Sofia Davis', email: 'sofia.davis@email.com', amount: '$39.00' },
])
</script>
<template>
<div class="space-y-8">
<div v-for="item in list" :key="item.name" class="flex items-center gap-4">
<Avatar class-name="h-9 w-9">
<AvatarImage :src="item.avatar" alt="Avatar" />
<AvatarFallback>{{ item.name[0].toUpperCase() }}</AvatarFallback>
</Avatar>
<div class="flex flex-wrap items-center justify-between flex-1">
<div class="space-y-1">
<p class="text-sm font-medium leading-none">
{{ item.name }}
</p>
<p class="text-sm text-muted-foreground">
{{ item.email }}
</p>
</div>
<div class="font-medium">
{{ item.amount }}
</div>
</div>
</div>
</div>
</template>

View File

@@ -1,50 +0,0 @@
<script lang="ts" setup>
import { toast } from 'vue-sonner'
import { BasicPage } from '@/components/global-layout'
import { Button } from '@/components/ui/button'
import OverviewContent from './components/overview-content.vue'
const tabs = ref([
{ name: 'Overview', value: 'overview' },
{ name: 'Analytics', value: 'analytics', disabled: true },
{ name: 'Reports', value: 'reports', disabled: true },
{ name: 'Notifications', value: 'notifications', disabled: true },
])
const activeTab = ref(tabs.value[0].value)
</script>
<template>
<BasicPage
title="workspace"
description="workspace description"
sticky
>
<template #actions>
<Button
@click="() => toast('hello', {
position: 'top-center',
})"
>
{{ $t('download') }}
</Button>
</template>
<UiTabs :default-value="activeTab" class="w-full">
<UiTabsList>
<UiTabsTrigger
v-for="tab in tabs" :key="tab.value"
:value="tab.value"
:disabled="tab.disabled"
>
{{ tab.name }}
</UiTabsTrigger>
</UiTabsList>
<UiTabsContent value="overview" class="space-y-4">
<OverviewContent />
</UiTabsContent>
</UiTabs>
</BasicPage>
</template>

View File

@@ -75,7 +75,7 @@ function roleBadge(role: number) {
<BasicPage title="管理员管理" description="管理系统管理员和财务账号">
<div class="space-y-4">
<div class="flex justify-end">
<UiButton @click="openCreateDialog">
<UiButton size="sm" @click="openCreateDialog">
<Icon icon="lucide:plus" class="size-4 mr-2" />
新增账号
</UiButton>

View File

@@ -14,11 +14,10 @@ const statusMutation = useUpdateCoinStatusMutation()
const simConfigMutation = useUpdateCoinSimulationConfigMutation()
const coins = computed(() => {
const list = data.value?.data?.list || [] as Coin[]
const list: Coin[] = data.value?.data?.list || []
return [...list].sort((a, b) => {
// 平台代币优先
const aPlatform = (a as any).isPlatform === 1 ? 0 : 1
const bPlatform = (b as any).isPlatform === 1 ? 0 : 1
const aPlatform = a.isPlatform === 1 ? 0 : 1
const bPlatform = b.isPlatform === 1 ? 0 : 1
if (aPlatform !== bPlatform) return aPlatform - bPlatform
return (b.sort || 0) - (a.sort || 0)
})
@@ -297,7 +296,7 @@ async function saveSimConfig() {
<BasicPage title="币种管理" description="管理交易币种">
<div class="space-y-4">
<div class="flex justify-end">
<UiButton @click="openEditDialog()">
<UiButton size="sm" @click="openEditDialog()">
<Icon icon="lucide:plus" class="size-4 mr-2" />
新增币种
</UiButton>

View File

@@ -15,11 +15,15 @@ const filterStatus = ref<number | string>('all')
const allPageNum = ref(1)
const allPageSize = ref(10)
const authStore = useAuthStore()
const adminRole = computed(() => authStore.adminInfo?.role ?? 2)
const pendingParams = computed(() => ({
pageNum: pageNum.value,
pageSize: pageSize.value,
type: 2,
status: 5,
// 财务页只查充值待确认和提现待财务审核
// 传 role=3 让后端走财务路由,即使超管也能看到正确的待审核列表
role: adminRole.value === 1 ? 3 : undefined,
}))
const allParams = computed(() => ({
@@ -103,9 +107,11 @@ async function handleApprove() {
// 立即更新本地订单状态,防止旧状态仍显示操作按钮
if (approveStatus.value === 2) {
currentOrder.value.status = 2 // 财务通过→已出款
// 充值通过→已完成(3),提现通过→已出款(2)
currentOrder.value.status = isDeposit(currentOrder.value) ? 3 : 2
} else {
currentOrder.value.status = 3 // 驳回
// 充值驳回→已驳回(4),提现驳回→已驳回(3)
currentOrder.value.status = isDeposit(currentOrder.value) ? 4 : 3
}
toast.success(`订单已${action}`)
@@ -147,6 +153,19 @@ function formatAmount(amount: number): string {
return amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })
}
function isDeposit(order: OrderFund): boolean {
return order.type === 1
}
function orderTypeLabel(order: OrderFund): string {
return isDeposit(order) ? '充值' : '提现'
}
function pendingBadgeText(order: OrderFund): string {
if (isDeposit(order)) return '待确认'
return '待财务审核'
}
function copyToClipboard(text: string) {
navigator.clipboard.writeText(text)
toast.success('已复制到剪贴板')
@@ -154,7 +173,7 @@ function copyToClipboard(text: string) {
</script>
<template>
<BasicPage title="财务审批" description="审批提现订单">
<BasicPage title="财务审批" description="审批充值与提现订单">
<UiTabs v-model="activeTab" class="space-y-4">
<UiTabsList>
<UiTabsTrigger value="pending">
@@ -174,31 +193,22 @@ function copyToClipboard(text: string) {
<UiTableRow>
<UiTableHead>订单号</UiTableHead>
<UiTableHead>用户</UiTableHead>
<UiTableHead class="text-right">
提现金额
</UiTableHead>
<UiTableHead class="text-right">
手续费
</UiTableHead>
<UiTableHead class="text-right">
应出款
</UiTableHead>
<UiTableHead class="hidden xl:table-cell">
时间
</UiTableHead>
<UiTableHead class="text-right">
操作
</UiTableHead>
<UiTableHead>类型</UiTableHead>
<UiTableHead class="text-right">金额</UiTableHead>
<UiTableHead v-if="pendingOrders.some(o => !isDeposit(o))" class="text-right">手续费</UiTableHead>
<UiTableHead v-if="pendingOrders.some(o => !isDeposit(o))" class="text-right">应出款</UiTableHead>
<UiTableHead class="hidden xl:table-cell">时间</UiTableHead>
<UiTableHead class="text-right">操作</UiTableHead>
</UiTableRow>
</UiTableHeader>
<UiTableBody>
<UiTableRow v-if="pendingLoading">
<UiTableCell :col-span="7" class="text-center py-8">
<UiTableCell :col-span="8" class="text-center py-8">
<UiSpinner class="mx-auto" />
</UiTableCell>
</UiTableRow>
<UiTableRow v-else-if="pendingOrders.length === 0">
<UiTableCell :col-span="7" class="text-center py-8 text-muted-foreground">
<UiTableCell :col-span="8" class="text-center py-8 text-muted-foreground">
<Icon icon="lucide:inbox" class="size-8 mx-auto mb-2 opacity-50" />
<p>暂无待审核订单</p>
</UiTableCell>
@@ -208,14 +218,19 @@ function copyToClipboard(text: string) {
{{ order.orderNo }}
</UiTableCell>
<UiTableCell>{{ order.username }}</UiTableCell>
<UiTableCell class="text-right font-mono font-medium">
{{ formatAmount(order.amount) }}
<UiTableCell>
<UiBadge :variant="isDeposit(order) ? 'default' : 'destructive'">
{{ orderTypeLabel(order) }}
</UiBadge>
</UiTableCell>
<UiTableCell class="text-right font-mono text-muted-foreground">
-{{ formatAmount(order.fee || 0) }}
<UiTableCell class="text-right font-mono font-medium" :class="isDeposit(order) ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'">
{{ isDeposit(order) ? '+' : '-' }}{{ formatAmount(order.amount) }}
</UiTableCell>
<UiTableCell class="text-right font-mono font-bold text-green-600">
{{ formatAmount(order.receivableAmount || 0) }}
<UiTableCell v-if="pendingOrders.some(o => !isDeposit(o))" class="text-right font-mono text-muted-foreground">
{{ isDeposit(order) ? '-' : `-${formatAmount(order.fee || 0)}` }}
</UiTableCell>
<UiTableCell v-if="pendingOrders.some(o => !isDeposit(o))" class="text-right font-mono font-bold text-green-600">
{{ isDeposit(order) ? '-' : formatAmount(order.receivableAmount || 0) }}
</UiTableCell>
<UiTableCell class="hidden xl:table-cell text-muted-foreground text-sm">
{{ order.createTime }}
@@ -263,24 +278,40 @@ function copyToClipboard(text: string) {
{{ order.username }}
</div>
</div>
<UiBadge variant="secondary">
待财务审核
</UiBadge>
<div class="text-right">
<UiBadge :variant="isDeposit(order) ? 'default' : 'destructive'" class="mb-1">
{{ orderTypeLabel(order) }}
</UiBadge>
<UiBadge variant="secondary" class="block">
{{ pendingBadgeText(order) }}
</UiBadge>
</div>
</div>
<div class="mt-3 pt-3 border-t">
<div class="text-xl font-mono font-bold text-red-600 dark:text-red-400">
-{{ formatAmount(order.amount) }}
<div class="text-xl font-mono font-bold" :class="isDeposit(order) ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'">
{{ isDeposit(order) ? '+' : '-' }}{{ formatAmount(order.amount) }} USDT
</div>
<div class="text-sm text-muted-foreground mt-1">
手续费: -{{ formatAmount(order.fee || 0) }} | 实际到账: {{ formatAmount(order.receivableAmount || 0) }}
</div>
<div v-if="order.walletAddress" class="mt-2 text-sm">
<span class="text-muted-foreground">提现地址:</span>
<div class="font-mono text-xs break-all mt-1 flex items-center gap-1">
{{ order.walletAddress }}
<Icon icon="lucide:copy" class="size-3 cursor-pointer" @click="copyToClipboard(order.walletAddress!)" />
<template v-if="!isDeposit(order)">
<div class="text-sm text-muted-foreground mt-1">
手续费: -{{ formatAmount(order.fee || 0) }} | 应出款: {{ formatAmount(order.receivableAmount || 0) }}
</div>
</div>
<div v-if="order.walletAddress" class="mt-2 text-sm">
<span class="text-muted-foreground">提现地址:</span>
<div class="font-mono text-xs break-all mt-1 flex items-center gap-1">
{{ order.walletAddress }}
<Icon icon="lucide:copy" class="size-3 cursor-pointer" @click="copyToClipboard(order.walletAddress!)" />
</div>
</div>
</template>
<template v-else>
<div v-if="order.walletAddress" class="mt-2 text-sm">
<span class="text-muted-foreground">充值地址:</span>
<div class="font-mono text-xs break-all mt-1 flex items-center gap-1">
{{ order.walletAddress }}
<Icon icon="lucide:copy" class="size-3 cursor-pointer" @click="copyToClipboard(order.walletAddress!)" />
</div>
</div>
</template>
<div class="text-sm text-muted-foreground mt-1">
{{ order.createTime }}
</div>
@@ -292,6 +323,9 @@ function copyToClipboard(text: string) {
<UiButton size="sm" variant="destructive" class="flex-1" @click="openApproveDialog(order, 3)">
驳回
</UiButton>
<UiButton size="sm" variant="outline" class="flex-1" @click="viewOrderDetail(order)">
详情
</UiButton>
</div>
</UiCard>
</template>
@@ -412,6 +446,63 @@ function copyToClipboard(text: string) {
</UiTable>
</UiCard>
<div class="md:hidden space-y-3">
<div v-if="allLoading" class="text-center py-8">
<UiSpinner class="mx-auto" />
</div>
<template v-else-if="allOrders.length > 0">
<UiCard v-for="order in allOrders" :key="order.id" class="p-4">
<div class="flex items-start justify-between">
<div class="space-y-1">
<div class="font-mono text-xs text-muted-foreground">
{{ order.orderNo }}
</div>
<div class="font-medium">
{{ order.username }}
</div>
</div>
<div class="text-right">
<UiBadge :variant="order.type === 1 ? 'default' : 'destructive'" class="mb-1">
{{ order.type === 1 ? '充值' : '提现' }}
</UiBadge>
<UiBadge variant="outline" class="block">
{{ getOrderStatusText(order.type, order.status) }}
</UiBadge>
</div>
</div>
<div class="mt-3 pt-3 border-t">
<div class="text-xl font-mono font-bold">
{{ formatAmount(order.amount) }}
</div>
<div v-if="order.walletAddress" class="mt-2 text-sm">
<span class="text-muted-foreground">{{ order.type === 1 ? '充值地址' : '提现地址' }}:</span>
<div class="font-mono text-xs break-all mt-1 flex items-center gap-1">
{{ order.walletAddress }}
<Icon icon="lucide:copy" class="size-3 cursor-pointer" @click="copyToClipboard(order.walletAddress!)" />
</div>
</div>
<div class="text-sm text-muted-foreground mt-1">
{{ order.createTime }}
</div>
<div v-if="order.approveAdminName" class="text-xs text-muted-foreground">
审批人: {{ order.approveAdminName }}
</div>
<div v-if="order.rejectReason || order.adminRemark" class="text-sm text-muted-foreground mt-1">
备注: {{ order.rejectReason || order.adminRemark }}
</div>
</div>
<div class="mt-3">
<UiButton size="sm" variant="outline" class="w-full" @click="viewOrderDetail(order)">
查看详情
</UiButton>
</div>
</UiCard>
</template>
<div v-else class="text-center py-8 text-muted-foreground">
暂无数据
</div>
</div>
<!-- 全部订单分页 -->
<div v-if="allTotal > 0" class="flex items-center justify-between gap-4 px-2">
<div class="text-sm text-muted-foreground"> {{ allTotal }} 条记录</div>
@@ -432,13 +523,20 @@ function copyToClipboard(text: string) {
<UiDialog v-model:open="showDetailDialog">
<UiDialogContent class="w-full max-w-md max-h-[90vh] overflow-y-auto">
<UiDialogHeader>
<UiDialogTitle>提现订单详情</UiDialogTitle>
<UiDialogTitle>{{ currentOrder ? `${orderTypeLabel(currentOrder)}订单详情` : '订单详情' }}</UiDialogTitle>
</UiDialogHeader>
<div v-if="currentOrder" class="space-y-4">
<div class="grid grid-cols-3 gap-2 text-sm">
<div class="text-muted-foreground">订单号</div>
<div class="col-span-2 font-mono">{{ currentOrder.orderNo }}</div>
<div class="text-muted-foreground">类型</div>
<div class="col-span-2">
<UiBadge :variant="isDeposit(currentOrder) ? 'default' : 'destructive'">
{{ orderTypeLabel(currentOrder) }}
</UiBadge>
</div>
<div class="text-muted-foreground">用户</div>
<div class="col-span-2 font-medium">
{{ currentOrder.username }}
@@ -458,107 +556,77 @@ function copyToClipboard(text: string) {
</div>
<div class="grid grid-cols-3 gap-2 text-center">
<div>
<div class="text-xs text-muted-foreground">
资金余额
</div>
<div class="font-mono font-bold">
{{ formatVal(userStats.fundAccount?.balance) }}
</div>
<div class="text-xs text-muted-foreground">资金余额</div>
<div class="font-mono font-bold">{{ formatVal(userStats.fundAccount?.balance) }}</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
累计充值
</div>
<div class="font-mono font-bold text-green-600 dark:text-green-400">
{{ formatVal(userStats.fundAccount?.totalDeposit) }}
</div>
<div class="text-xs text-muted-foreground">累计充值</div>
<div class="font-mono font-bold text-green-600 dark:text-green-400">{{ formatVal(userStats.fundAccount?.totalDeposit) }}</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
累计提现
</div>
<div class="font-mono font-bold text-red-600 dark:text-red-400">
{{ formatVal(userStats.fundAccount?.totalWithdraw) }}
</div>
<div class="text-xs text-muted-foreground">累计提现</div>
<div class="font-mono font-bold text-red-600 dark:text-red-400">{{ formatVal(userStats.fundAccount?.totalWithdraw) }}</div>
</div>
</div>
<div class="grid grid-cols-4 gap-2 text-center pt-2 border-t">
<div>
<div class="text-xs text-muted-foreground">
冻结金额
</div>
<div class="font-mono">
{{ formatVal(userStats.fundAccount?.frozen) }}
</div>
<div class="text-xs text-muted-foreground">冻结金额</div>
<div class="font-mono">{{ formatVal(userStats.fundAccount?.frozen) }}</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
交易账户
</div>
<div class="font-mono font-bold text-blue-600 dark:text-blue-400">
{{ formatVal(tradeTotalValue(userStats)) }}
</div>
<div class="text-xs text-muted-foreground">交易账户</div>
<div class="font-mono font-bold text-blue-600 dark:text-blue-400">{{ formatVal(tradeTotalValue(userStats)) }}</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
推广人数
</div>
<div class="font-mono">
{{ userStats.referralStats?.directCount || 0 }}
</div>
<div class="text-xs text-muted-foreground">推广人数</div>
<div class="font-mono">{{ userStats.referralStats?.directCount || 0 }}</div>
</div>
<div>
<div class="text-xs text-muted-foreground">
累计福利
</div>
<div class="font-mono text-amber-600 dark:text-amber-400">
{{ formatVal(userStats.bonusStats?.totalBonusClaimed) }}
</div>
<div class="text-xs text-muted-foreground">累计福利</div>
<div class="font-mono text-amber-600 dark:text-amber-400">{{ formatVal(userStats.bonusStats?.totalBonusClaimed) }}</div>
</div>
</div>
<div class="text-xs text-muted-foreground">
注册时间: {{ userStats.user?.createTime || '-' }}
</div>
<!-- 45天规则提示仅提现订单 -->
<template v-if="!isDeposit(currentOrder) && userStats.isWithin45Days">
<div class="p-3 rounded-lg bg-amber-50 dark:bg-amber-950/20 border border-amber-200 dark:border-amber-800 space-y-1.5">
<div class="flex items-center gap-2 text-amber-700 dark:text-amber-400 font-medium text-sm">
<Icon icon="lucide:alert-triangle" class="size-4" />
<span>本金未满45天{{ userStats.depositDays }}</span>
</div>
<div class="text-xs space-y-0.5 text-amber-600 dark:text-amber-300">
<div>累计盈利: {{ formatVal(userStats.totalProfit) }} USDT</div>
<div>累计奖励: {{ formatVal(userStats.totalBonus) }} USDT</div>
<div>已提现盈利+奖励: {{ formatVal(userStats.alreadyWithdrawnProfit) }} USDT</div>
<div class="font-bold">可提现盈利+奖励: {{ formatVal(userStats.availableProfit) }} USDT</div>
</div>
<div class="text-xs font-medium text-amber-700 dark:text-amber-300 pt-1 border-t border-amber-200 dark:border-amber-800">
应出款 = {{ formatVal(currentOrder.receivableAmount) }} - 已提盈利 {{ formatVal(userStats.alreadyWithdrawnProfit) }} = {{ formatVal(Number(currentOrder.receivableAmount || 0) - Number(userStats.alreadyWithdrawnProfit || 0)) }} USDT
</div>
</div>
</template>
<!-- 成功充值记录 -->
<template v-if="userStats.recentFundOrders?.filter(o => o.type === 1 && o.status === 3).length">
<div class="font-medium text-muted-foreground pt-2 border-t">
成功充值记录
</div>
<div class="font-medium text-muted-foreground pt-2 border-t">成功充值记录</div>
<div class="max-h-[200px] overflow-y-auto">
<div class="rounded border">
<UiTable>
<UiTableHeader>
<UiTableRow>
<UiTableHead class="text-xs h-8">
时间
</UiTableHead>
<UiTableHead class="text-xs h-8 text-right">
金额
</UiTableHead>
<UiTableHead class="text-xs h-8 text-right">
距今
</UiTableHead>
<UiTableHead class="text-xs h-8">
状态
</UiTableHead>
<UiTableHead class="text-xs h-8">时间</UiTableHead>
<UiTableHead class="text-xs h-8 text-right">金额</UiTableHead>
<UiTableHead class="text-xs h-8 text-right">距今</UiTableHead>
<UiTableHead class="text-xs h-8">状态</UiTableHead>
</UiTableRow>
</UiTableHeader>
<UiTableBody>
<UiTableRow v-for="dep in userStats.recentFundOrders.filter(o => o.type === 1 && o.status === 3)" :key="dep.orderNo">
<UiTableCell class="text-xs py-1">
{{ dep.createTime?.replace('T', ' ').substring(0, 16) }}
</UiTableCell>
<UiTableCell class="text-xs py-1 text-right font-mono text-green-600 dark:text-green-400">
+{{ formatVal(dep.amount) }}
</UiTableCell>
<UiTableCell class="text-xs py-1 text-right text-muted-foreground">
{{ daysAgo(dep.createTime) }}
</UiTableCell>
<UiTableCell class="text-xs py-1">
<UiBadge variant="default" class="text-xs">
已完成
</UiBadge>
</UiTableCell>
<UiTableCell class="text-xs py-1">{{ dep.createTime?.replace('T', ' ').substring(0, 16) }}</UiTableCell>
<UiTableCell class="text-xs py-1 text-right font-mono text-green-600 dark:text-green-400">+{{ formatVal(dep.amount) }}</UiTableCell>
<UiTableCell class="text-xs py-1 text-right text-muted-foreground">{{ daysAgo(dep.createTime) }}</UiTableCell>
<UiTableCell class="text-xs py-1"><UiBadge variant="default" class="text-xs">已完成</UiBadge></UiTableCell>
</UiTableRow>
</UiTableBody>
</UiTable>
@@ -568,16 +636,21 @@ function copyToClipboard(text: string) {
</div>
</div>
<div class="text-muted-foreground">提现金额</div>
<div class="col-span-2 font-mono font-bold text-lg">{{ formatAmount(currentOrder.amount) }}</div>
<!-- 充值金额 / 提现金额 -->
<div class="text-muted-foreground">{{ isDeposit(currentOrder) ? '充值金额' : '提现金额' }}</div>
<div class="col-span-2 font-mono font-bold text-lg">{{ formatAmount(currentOrder.amount) }} USDT</div>
<div class="text-muted-foreground">手续费(10%)</div>
<div class="col-span-2 font-mono">-{{ formatAmount(currentOrder.fee || 0) }}</div>
<!-- 提现专属字段 -->
<template v-if="!isDeposit(currentOrder)">
<div class="text-muted-foreground">手续费(10%)</div>
<div class="col-span-2 font-mono">-{{ formatAmount(currentOrder.fee || 0) }}</div>
<div class="text-muted-foreground">应出款</div>
<div class="col-span-2 font-mono font-bold text-green-600">{{ formatAmount(currentOrder.receivableAmount || 0) }}</div>
<div class="text-muted-foreground">应出款</div>
<div class="col-span-2 font-mono font-bold text-green-600">{{ formatAmount(currentOrder.receivableAmount || 0) }}</div>
</template>
<div class="text-muted-foreground">提现地址</div>
<!-- 地址 -->
<div class="text-muted-foreground">{{ isDeposit(currentOrder) ? '充值地址' : '提现地址' }}</div>
<div class="col-span-2">
<div v-if="currentOrder.walletAddress" class="flex items-start gap-1">
<span class="font-mono text-xs break-all">{{ currentOrder.walletAddress }}</span>
@@ -586,12 +659,14 @@ function copyToClipboard(text: string) {
<span v-else class="text-muted-foreground">-</span>
</div>
<template v-if="currentOrder.network">
<!-- 提现网络 -->
<template v-if="!isDeposit(currentOrder) && currentOrder.network">
<div class="text-muted-foreground">提现网络</div>
<div class="col-span-2">{{ currentOrder.network }}</div>
</template>
<template v-if="currentOrder.withdrawContact">
<!-- 提现联系方式 -->
<template v-if="!isDeposit(currentOrder) && currentOrder.withdrawContact">
<div class="text-muted-foreground">联系方式</div>
<div class="col-span-2">{{ currentOrder.withdrawContact }}</div>
</template>
@@ -599,26 +674,24 @@ function copyToClipboard(text: string) {
<div class="text-muted-foreground">发起时间</div>
<div class="col-span-2">{{ currentOrder.createTime }}</div>
<div v-if="currentOrder.financeApproveTime" class="text-muted-foreground">到账时间</div>
<div v-if="currentOrder.financeApproveTime" class="col-span-2">{{ currentOrder.financeApproveTime }}</div>
<div v-if="currentOrder.payTime" class="text-muted-foreground">打款时间</div>
<div v-if="currentOrder.payTime" class="col-span-2">{{ currentOrder.payTime }}</div>
<div v-if="currentOrder.confirmTime" class="text-muted-foreground">{{ isDeposit(currentOrder) ? '确认时间' : '到账时间' }}</div>
<div v-if="currentOrder.confirmTime" class="col-span-2">{{ currentOrder.confirmTime }}</div>
<div v-if="currentOrder.approveAdminName" class="text-muted-foreground">审批人</div>
<div v-if="currentOrder.approveAdminName" class="col-span-2">
{{ currentOrder.approveAdminName }}
</div>
<div v-if="currentOrder.approveAdminName" class="col-span-2">{{ currentOrder.approveAdminName }}</div>
<div v-if="currentOrder.financeAdminName" class="text-muted-foreground">财务审批人</div>
<div v-if="currentOrder.financeAdminName" class="col-span-2">{{ currentOrder.financeAdminName }}</div>
</div>
</div>
<UiDialogFooter>
<template v-if="currentOrder">
<UiButton variant="outline" @click="showDetailDialog = false">
关闭
</UiButton>
<UiButton @click="openApproveDialog(currentOrder, 2); showDetailDialog = false">
通过
</UiButton>
<UiButton variant="destructive" @click="openApproveDialog(currentOrder, 3); showDetailDialog = false">
驳回
</UiButton>
<UiButton variant="outline" @click="showDetailDialog = false">关闭</UiButton>
<UiButton @click="openApproveDialog(currentOrder, 2); showDetailDialog = false">通过</UiButton>
<UiButton variant="destructive" @click="openApproveDialog(currentOrder, 3); showDetailDialog = false">驳回</UiButton>
</template>
</UiDialogFooter>
</UiDialogContent>
@@ -628,7 +701,14 @@ function copyToClipboard(text: string) {
<UiDialog v-model:open="showApproveDialog">
<UiDialogContent class="w-full max-w-md max-h-[90vh] overflow-y-auto">
<UiDialogHeader>
<UiDialogTitle>{{ approveStatus === 2 ? '通过提现' : '驳回提现' }}</UiDialogTitle>
<UiDialogTitle>
{{ currentOrder
? (approveStatus === 2
? `确认${orderTypeLabel(currentOrder)}`
: `驳回${orderTypeLabel(currentOrder)}`)
: '审批'
}}
</UiDialogTitle>
</UiDialogHeader>
<div v-if="currentOrder" class="grid gap-4 py-4">
<div class="p-3 rounded-lg bg-muted/50 text-sm space-y-2">
@@ -636,6 +716,14 @@ function copyToClipboard(text: string) {
<div class="text-muted-foreground">订单号</div>
<div class="font-mono">{{ currentOrder.orderNo }}</div>
</div>
<div>
<div class="text-muted-foreground">类型</div>
<div>
<UiBadge :variant="isDeposit(currentOrder) ? 'default' : 'destructive'">
{{ orderTypeLabel(currentOrder) }}
</UiBadge>
</div>
</div>
<div>
<div class="text-muted-foreground">用户</div>
<div class="font-medium">
@@ -650,28 +738,16 @@ function copyToClipboard(text: string) {
<div v-else-if="userStats" class="p-2 rounded bg-background text-xs space-y-1">
<div class="grid grid-cols-3 gap-1 text-center">
<div>
<div class="text-muted-foreground">
资金余额
</div>
<div class="font-mono font-bold">
{{ formatVal(userStats.fundAccount?.balance) }}
</div>
<div class="text-muted-foreground">资金余额</div>
<div class="font-mono font-bold">{{ formatVal(userStats.fundAccount?.balance) }}</div>
</div>
<div>
<div class="text-muted-foreground">
累计充值
</div>
<div class="font-mono font-bold text-green-600 dark:text-green-400">
{{ formatVal(userStats.fundAccount?.totalDeposit) }}
</div>
<div class="text-muted-foreground">累计充值</div>
<div class="font-mono font-bold text-green-600 dark:text-green-400">{{ formatVal(userStats.fundAccount?.totalDeposit) }}</div>
</div>
<div>
<div class="text-muted-foreground">
累计提现
</div>
<div class="font-mono font-bold text-red-600 dark:text-red-400">
{{ formatVal(userStats.fundAccount?.totalWithdraw) }}
</div>
<div class="text-muted-foreground">累计提现</div>
<div class="font-mono font-bold text-red-600 dark:text-red-400">{{ formatVal(userStats.fundAccount?.totalWithdraw) }}</div>
</div>
</div>
<div class="text-muted-foreground text-center">
@@ -679,13 +755,15 @@ function copyToClipboard(text: string) {
</div>
</div>
<div>
<div class="text-muted-foreground">提现金额</div>
<div class="font-mono font-bold text-lg">{{ formatAmount(currentOrder.amount) }}</div>
</div>
<div>
<div class="text-muted-foreground">应出款</div>
<div class="font-mono text-green-600">{{ formatAmount(currentOrder.receivableAmount || 0) }}</div>
<div class="text-muted-foreground">{{ isDeposit(currentOrder) ? '充值金额' : '提现金额' }}</div>
<div class="font-mono font-bold text-lg">{{ formatAmount(currentOrder.amount) }} USDT</div>
</div>
<template v-if="!isDeposit(currentOrder)">
<div>
<div class="text-muted-foreground">应出款</div>
<div class="font-mono text-green-600">{{ formatAmount(currentOrder.receivableAmount || 0) }}</div>
</div>
</template>
</div>
<div v-if="approveStatus === 3" class="grid gap-2">
<UiLabel>驳回原因 <span class="text-red-500">*</span></UiLabel>
@@ -697,9 +775,7 @@ function copyToClipboard(text: string) {
</div>
</div>
<UiDialogFooter>
<UiButton variant="outline" @click="showApproveDialog = false">
取消
</UiButton>
<UiButton variant="outline" @click="showApproveDialog = false">取消</UiButton>
<UiButton
:variant="approveStatus === 3 ? 'destructive' : 'default'"
:disabled="approveMutation.isPending.value || (approveStatus === 3 && !rejectReason.trim())"

Some files were not shown because too many files have changed in this diff Show More