This commit is contained in:
sion
2026-04-05 19:44:40 +08:00
parent 2fbc47117c
commit 2ea315cefb
71 changed files with 1266 additions and 0 deletions

View File

@@ -0,0 +1 @@
import{I as e,v as t,x as n,xt as r,yt as i,z as a}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{R as o}from"./index-axPHP3AB.js";import{r as s}from"./button-xrpYa8G4.js";var c=n({__name:`AlertDescription`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`div`,{"data-slot":`alert-description`,class:r(i(o)(`text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed`,s.class))},[a(n.$slots,`default`)],2))}}),l=n({__name:`AlertTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`div`,{"data-slot":`alert-title`,class:r(i(o)(`col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight`,s.class))},[a(n.$slots,`default`)],2))}}),u=s(`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=n({__name:`Alert`,props:{class:{type:[Boolean,null,String,Object,Array]},variant:{}},setup(n){let s=n;return(c,l)=>(e(),t(`div`,{"data-slot":`alert`,class:r(i(o)(i(u)({variant:n.variant}),s.class)),role:`alert`},[a(c.$slots,`default`)],2))}});export{l as n,c as r,d as t};

View File

@@ -0,0 +1 @@
import{A as e,I as t,Q as n,Y as r,_ as i,g as a,ut as o,x as s,yt as c,z as l}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as u,v as d}from"./dist-3yfE1dPa.js";import{R as f}from"./index-axPHP3AB.js";import{i as p}from"./button-xrpYa8G4.js";import{t as m}from"./useForwardExpose-B8uiQ7xX.js";import{r as h}from"./AvatarImage-Da9BQozn.js";var g=s({__name:`AvatarFallback`,props:{delayMs:{type:Number,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let s=e,u=h();m();let f=o(s.delayMs===void 0);return r(e=>{if(s.delayMs&&d){let t=window.setTimeout(()=>{f.value=!0},s.delayMs);e(()=>{window.clearTimeout(t)})}}),(e,r)=>f.value&&c(u).imageLoadingStatus.value!==`loaded`?(t(),a(c(p),{key:0,"as-child":e.asChild,as:e.as},{default:n(()=>[l(e.$slots,`default`)]),_:3},8,[`as-child`,`as`])):i(`v-if`,!0)}}),_=s({__name:`AvatarFallback`,props:{delayMs:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(r){let i=r,o=u(i,`class`);return(r,s)=>(t(),a(c(g),e({"data-slot":`avatar-fallback`},c(o),{class:c(f)(`bg-muted flex size-full items-center justify-center rounded-full`,i.class)}),{default:n(()=>[l(r.$slots,`default`)]),_:3},16,[`class`]))}});export{_ as t};

View File

@@ -0,0 +1 @@
import{$ as e,A as t,I as n,J as r,N as i,P as a,Q as o,Y as s,a as c,g as l,gt as u,m as d,ut as f,x as p,xt as m,yt as h,z as g}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{v as _}from"./dist-3yfE1dPa.js";import{R as v}from"./index-axPHP3AB.js";import{O as y}from"./Teleport-f0-_cFyq.js";import{i as b}from"./button-xrpYa8G4.js";import{t as x}from"./useForwardExpose-B8uiQ7xX.js";var[S,C]=y(`AvatarRoot`),w=p({__name:`AvatarRoot`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){return x(),C({imageLoadingStatus:f(`idle`)}),(e,t)=>(n(),l(h(b),{"as-child":e.asChild,as:e.as},{default:o(()=>[g(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(e,{referrerPolicy:t,crossOrigin:n}={}){let r=f(!1),o=f(null),c=d(()=>r.value?(!o.value&&_&&(o.value=new window.Image),o.value):null),l=f(T(c.value,e.value)),u=e=>()=>{r.value&&(l.value=e)};return i(()=>{r.value=!0,s(r=>{let i=c.value;if(!i)return;l.value=T(i,e.value);let a=u(`loaded`),o=u(`error`);i.addEventListener(`load`,a),i.addEventListener(`error`,o),t?.value&&(i.referrerPolicy=t.value),typeof n?.value==`string`&&(i.crossOrigin=n.value),r(()=>{i.removeEventListener(`load`,a),i.removeEventListener(`error`,o)})})}),a(()=>{r.value=!1}),l}var D=p({__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(t,{emit:i}){let a=t,s=i,{src:d,referrerPolicy:f,crossOrigin:p}=u(a);x();let m=S(),_=E(d,{referrerPolicy:f,crossOrigin:p});return r(_,e=>{s(`loadingStatusChange`,e),e!==`idle`&&(m.imageLoadingStatus.value=e)},{immediate:!0}),(t,r)=>e((n(),l(h(b),{role:`img`,"as-child":t.asChild,as:t.as,src:h(d),referrerpolicy:h(f),crossorigin:h(p)},{default:o(()=>[g(t.$slots,`default`)]),_:3},8,[`as-child`,`as`,`src`,`referrerpolicy`,`crossorigin`])),[[c,h(_)===`loaded`]])}}),O=p({__name:`Avatar`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,r)=>(n(),l(h(w),{"data-slot":`avatar`,class:m(h(v)(`relative flex size-8 shrink-0 overflow-hidden rounded-full`,t.class))},{default:o(()=>[g(e.$slots,`default`)]),_:3},8,[`class`]))}}),k=p({__name:`AvatarImage`,props:{src:{},referrerPolicy:{},crossOrigin:{},asChild:{type:Boolean},as:{}},setup(e){let r=e;return(e,i)=>(n(),l(h(D),t({"data-slot":`avatar-image`},r,{class:`aspect-square size-full`}),{default:o(()=>[g(e.$slots,`default`)]),_:3},16))}});export{O as n,S as r,k as t};

View File

@@ -0,0 +1 @@
import{A as e,I as t,Q as n,g as r,x as i,yt as a,z as o}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as s}from"./dist-3yfE1dPa.js";import{R as c}from"./index-axPHP3AB.js";import{i as l,r as u}from"./button-xrpYa8G4.js";var d=u(`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=i({__name:`Badge`,props:{asChild:{type:Boolean},as:{},variant:{},class:{type:[Boolean,null,String,Object,Array]}},setup(i){let u=i,f=s(u,`class`);return(s,p)=>(t(),r(a(l),e({"data-slot":`badge`,class:a(c)(a(d)({variant:i.variant}),u.class)},a(f)),{default:n(()=>[o(s.$slots,`default`)]),_:3},16,[`class`]))}});export{f as t};

View File

@@ -0,0 +1 @@
import{I as e,v as t,x as n,xt as r,yt as i,z as a}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{R as o}from"./index-axPHP3AB.js";var s=n({__name:`Card`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`div`,{"data-slot":`card`,class:r(i(o)(`bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm`,s.class))},[a(n.$slots,`default`)],2))}});export{s as t};

View File

@@ -0,0 +1 @@
import{I as e,v as t,x as n,xt as r,yt as i,z as a}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{R as o}from"./index-axPHP3AB.js";var s=n({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`div`,{"data-slot":`card-content`,class:r(i(o)(`px-6`,s.class))},[a(n.$slots,`default`)],2))}});export{s as t};

View File

@@ -0,0 +1 @@
import{I as e,v as t,x as n,xt as r,yt as i,z as a}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{R as o}from"./index-axPHP3AB.js";var s=n({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`div`,{"data-slot":`card-header`,class:r(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))},[a(n.$slots,`default`)],2))}}),c=n({__name:`CardDescription`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`p`,{"data-slot":`card-description`,class:r(i(o)(`text-muted-foreground text-sm`,s.class))},[a(n.$slots,`default`)],2))}}),l=n({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`h3`,{"data-slot":`card-title`,class:r(i(o)(`leading-none font-semibold`,s.class))},[a(n.$slots,`default`)],2))}});export{c as n,s as r,l as t};

View File

@@ -0,0 +1 @@
import{A as e,C as t,I as n,Q as r,St as i,V as a,_ as o,b as s,g as c,m as l,o as u,s as d,x as f,yt as p,z as m}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as h,p as g}from"./dist-3yfE1dPa.js";import{o as _}from"./SelectValue-BbKWf16W.js";import{R as v}from"./index-axPHP3AB.js";import{n as y,r as b}from"./VisuallyHidden-CunWEljx.js";import{O as x,T as S,g as C,y as w}from"./Teleport-f0-_cFyq.js";import{i as T}from"./button-xrpYa8G4.js";import{t as E}from"./useForwardExpose-B8uiQ7xX.js";import{t as D}from"./VisuallyHiddenInput-Ev2SMjxs.js";import{t as O}from"./RovingFocusItem-D7JDj4yQ.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=f({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:i}){let s=t,f=i,{forwardRef:h,currentElement:_}=E(),v=A(null),x=g(s,`modelValue`,f,{defaultValue:s.defaultValue??s.falseValue,passive:s.modelValue===void 0}),C=l(()=>v?.disabled.value||s.disabled),w=l(()=>b(x.value,s.trueValue)),j=l(()=>S(v?.modelValue.value)?x.value===`indeterminate`?`indeterminate`:w.value:k(v.modelValue.value,s.value));function P(){if(S(v?.modelValue.value))x.value===`indeterminate`?x.value=s.trueValue:x.value=w.value?s.falseValue:s.trueValue;else{let e=[...v.modelValue.value||[]];if(k(e,s.value)){let t=e.findIndex(e=>b(e,s.value));e.splice(t,1)}else e.push(s.value);v.modelValue.value=e}}let I=y(_),L=l(()=>s.id&&_.value?document.querySelector(`[for="${s.id}"]`)?.innerText:void 0);return F({disabled:C,state:j}),(t,i)=>(n(),c(a(p(v)?.rovingFocus.value?p(O):p(T)),e(t.$attrs,{id:t.id,ref:p(h),role:`checkbox`,"as-child":t.asChild,as:t.as,type:t.as===`button`?`button`:void 0,"aria-checked":p(M)(j.value)?`mixed`:j.value,"aria-required":t.required,"aria-label":t.$attrs[`aria-label`]||L.value,"data-state":p(N)(j.value),"data-disabled":C.value?``:void 0,disabled:C.value,focusable:p(v)?.rovingFocus.value?!C.value:void 0,onKeydown:u(d(()=>{},[`prevent`]),[`enter`]),onClick:P}),{default:r(()=>[m(t.$slots,`default`,{modelValue:p(x),state:j.value}),p(I)&&t.name&&!p(v)?(n(),c(p(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`])):o(`v-if`,!0)]),_:3},16,[`id`,`as-child`,`as`,`type`,`aria-checked`,`aria-required`,`aria-label`,`data-state`,`data-disabled`,`disabled`,`focusable`,`onKeydown`]))}}),L=f({__name:`CheckboxIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(t){let{forwardRef:i}=E(),a=P();return(t,o)=>(n(),c(p(C),{present:t.forceMount||p(M)(p(a).state.value)||p(a).state.value===!0},{default:r(()=>[s(p(T),e({ref:p(i),"data-state":p(N)(p(a).state.value),"data-disabled":p(a).disabled.value?``:void 0,style:{pointerEvents:`none`},"as-child":t.asChild,as:t.as},t.$attrs),{default:r(()=>[m(t.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),R=f({__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(a,{emit:o}){let l=a,u=o,d=w(h(l,`class`),u);return(a,o)=>(n(),c(p(I),e({"data-slot":`checkbox`},p(d),{class:p(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:r(e=>[s(p(L),{"data-slot":`checkbox-indicator`,class:`grid place-content-center text-current transition-none`},{default:r(()=>[m(a.$slots,`default`,i(t(e)),()=>[s(p(_),{class:`size-3.5`})])]),_:2},1024)]),_:3},16,[`class`]))}});export{R as t};

View File

@@ -0,0 +1 @@
import{A as e,I as t,Q as n,g as r,x as i,yt as a,z as o}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as s}from"./dist-3yfE1dPa.js";import{R as c}from"./index-axPHP3AB.js";import{b as l}from"./Teleport-f0-_cFyq.js";import{i as u}from"./button-xrpYa8G4.js";import{t as d}from"./useForwardExpose-B8uiQ7xX.js";import{d as f}from"./DialogTitle-vfkBik3a.js";var p=i({__name:`DialogDescription`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`p`}},setup(i){let s=i;d();let c=f();return(i,l)=>(t(),r(a(u),e(s,{id:a(c).descriptionId}),{default:n(()=>[o(i.$slots,`default`)]),_:3},16,[`id`]))}}),m=i({__name:`DialogDescription`,props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(i){let u=i,d=l(s(u,`class`));return(i,s)=>(t(),r(a(p),e({"data-slot":`dialog-description`},a(d),{class:a(c)(`text-muted-foreground text-sm`,u.class)}),{default:n(()=>[o(i.$slots,`default`)]),_:3},16,[`class`]))}});export{p as n,m as t};

View File

@@ -0,0 +1 @@
import{I as e,v as t,x as n,xt as r,yt as i,z as a}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{R as o}from"./index-axPHP3AB.js";var s=n({__name:`DialogFooter`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){let s=n;return(n,c)=>(e(),t(`div`,{"data-slot":`dialog-footer`,class:r(i(o)(`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,s.class))},[a(n.$slots,`default`)],2))}});export{s as t};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{A as e,C as t,I as n,Q as r,St as i,b as a,g as o,ut as s,x as c,yt as l,z as u}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as d}from"./dist-3yfE1dPa.js";import{R as f}from"./index-axPHP3AB.js";import{O as p,_ as m,b as h,d as g,g as _,l as v}from"./Teleport-f0-_cFyq.js";import{i as y}from"./button-xrpYa8G4.js";import{t as b}from"./useForwardExpose-B8uiQ7xX.js";var[x,S]=p([`MenuCheckboxItem`,`MenuRadioItem`],`MenuItemIndicatorContext`),C=c({__name:`MenuItemIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let t=x({modelValue:s(!1)});return(e,i)=>(n(),o(l(_),{present:e.forceMount||l(g)(l(t).modelValue.value)||l(t).modelValue.value===!0},{default:r(()=>[a(l(y),{as:e.as,"as-child":e.asChild,"data-state":l(v)(l(t).modelValue.value)},{default:r(()=>[u(e.$slots,`default`)]),_:3},8,[`as`,`as-child`,`data-state`])]),_:3},8,[`present`]))}}),[w,T]=p(`MenuGroup`),E=c({__name:`MenuGroup`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let i=t,a=m(void 0,`reka-menu-group`);return T({id:a}),(t,s)=>(n(),o(l(y),e({role:`group`},i,{"aria-labelledby":l(a)}),{default:r(()=>[u(t.$slots,`default`)]),_:3},16,[`aria-labelledby`]))}}),D=c({__name:`MenuLabel`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`div`}},setup(t){let i=t,a=w({id:``});return(t,s)=>(n(),o(l(y),e(i,{id:l(a).id||void 0}),{default:r(()=>[u(t.$slots,`default`)]),_:3},16,[`id`]))}}),O=c({__name:`MenuSeparator`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let i=t;return(t,a)=>(n(),o(l(y),e(i,{role:`separator`,"aria-orientation":`horizontal`}),{default:r(()=>[u(t.$slots,`default`)]),_:3},16))}}),k=c({__name:`DropdownMenuItemIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let a=e;return b(),(e,s)=>(n(),o(l(C),i(t(a)),{default:r(()=>[u(e.$slots,`default`)]),_:3},16))}}),A=c({__name:`DropdownMenuLabel`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let a=e;return b(),(e,s)=>(n(),o(l(D),i(t(a)),{default:r(()=>[u(e.$slots,`default`)]),_:3},16))}}),j=c({__name:`DropdownMenuSeparator`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let a=e;return b(),(e,s)=>(n(),o(l(O),i(t(a)),{default:r(()=>[u(e.$slots,`default`)]),_:3},16))}}),M=c({__name:`DropdownMenuSeparator`,props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(t){let r=t,i=d(r,`class`);return(t,a)=>(n(),o(l(j),e({"data-slot":`dropdown-menu-separator`},l(i),{class:l(f)(`bg-border -mx-1 my-1 h-px`,r.class)}),null,16,[`class`]))}}),N=c({__name:`DropdownMenuLabel`,props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]},inset:{type:Boolean}},setup(t){let i=t,a=h(d(i,`class`,`inset`));return(s,c)=>(n(),o(l(A),e({"data-slot":`dropdown-menu-label`,"data-inset":t.inset?``:void 0},l(a),{class:l(f)(`px-2 py-1.5 text-sm font-medium data-[inset]:pl-8`,i.class)}),{default:r(()=>[u(s.$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

@@ -0,0 +1 @@
import{A as e,C as t,I as n,Q as r,St as i,b as a,g as o,gt as s,h as c,m as l,x as u,yt as d,z as f}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as p,p as m}from"./dist-3yfE1dPa.js";import{t as h}from"./circle-Cc5GzalR.js";import{R as g}from"./index-axPHP3AB.js";import{O as _,b as v,l as y,x as b,y as x}from"./Teleport-f0-_cFyq.js";import{a as S}from"./DropdownMenuTrigger-CaEGJhbh.js";import{t as C}from"./useForwardExpose-B8uiQ7xX.js";import{a as w,i as T,r as E}from"./DropdownMenuLabel-BxrcQY1z.js";var[D,O]=_(`MenuRadioGroup`),k=u({__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:a}){let s=e,c=a,l=v(p(s,[`modelValue`])),u=m(s,`modelValue`,c);return O({modelValue:u,onValueChange:e=>{u.value=e}}),(e,a)=>(n(),o(T,i(t(d(l))),{default:r(()=>[f(e.$slots,`default`,{modelValue:d(u)})]),_:3},16))}}),A=u({__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(t,{emit:i}){let a=t,c=i,u=v(p(a,[`value`])),{value:m}=s(a),h=D(),g=l(()=>h.modelValue.value===m?.value);return w({modelValue:g}),(t,i)=>(n(),o(S,e({role:`menuitemradio`},d(u),{"aria-checked":g.value,"data-state":d(y)(g.value),onSelect:i[0]||=async e=>{c(`select`,e),d(h).onValueChange(d(m))}}),{default:r(()=>[f(t.$slots,`default`)]),_:3},16,[`aria-checked`,`data-state`]))}}),j=u({__name:`DropdownMenuRadioGroup`,props:{modelValue:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:modelValue`],setup(e,{emit:a}){let s=e,c=b(a);return C(),(e,a)=>(n(),o(d(k),i(t({...s,...d(c)})),{default:r(()=>[f(e.$slots,`default`)]),_:3},16))}}),M=u({__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:a}){let s=x(e,a);return C(),(e,a)=>(n(),o(d(A),i(t(d(s))),{default:r(()=>[f(e.$slots,`default`)]),_:3},16))}}),N=u({__name:`DropdownMenuRadioGroup`,props:{modelValue:{},asChild:{type:Boolean},as:{}},emits:[`update:modelValue`],setup(t,{emit:i}){let a=x(t,i);return(t,i)=>(n(),o(d(j),e({"data-slot":`dropdown-menu-radio-group`},d(a)),{default:r(()=>[f(t.$slots,`default`)]),_:3},16))}}),P={class:`pointer-events-none absolute left-2 flex size-3.5 items-center justify-center`},F=u({__name:`DropdownMenuRadioItem`,props:{value:{},disabled:{type:Boolean},textValue:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},emits:[`select`],setup(t,{emit:i}){let s=t,l=i,u=x(p(s,`class`),l);return(t,i)=>(n(),o(d(M),e({"data-slot":`dropdown-menu-radio-item`},d(u),{class:d(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:r(()=>[c(`span`,P,[a(d(E),null,{default:r(()=>[f(t.$slots,`indicator-icon`,{},()=>[a(d(h),{class:`size-2 fill-current`})])]),_:3})]),f(t.$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

@@ -0,0 +1 @@
import{$ as e,I as t,at as n,i as r,v as i,x as a,xt as o,yt as s}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{p as c}from"./dist-3yfE1dPa.js";import{R as l}from"./index-axPHP3AB.js";var u=a({__name:`Input`,props:{defaultValue:{},modelValue:{},class:{type:[Boolean,null,String,Object,Array]}},emits:[`update:modelValue`],setup(a,{emit:u}){let d=a,f=c(d,`modelValue`,u,{passive:!0,defaultValue:d.defaultValue});return(a,c)=>e((t(),i(`input`,{"onUpdate:modelValue":c[0]||=e=>n(f)?f.value=e:null,"data-slot":`input`,class:o(s(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)),[[r,s(f)]])}});export{u as t};

View File

@@ -0,0 +1 @@
import{A as e,I as t,Q as n,g as r,x as i,yt as a,z as o}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as s}from"./dist-3yfE1dPa.js";import{R as c}from"./index-axPHP3AB.js";import{i as l}from"./button-xrpYa8G4.js";import{t as u}from"./useForwardExpose-B8uiQ7xX.js";var d=i({__name:`Label`,props:{for:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`label`}},setup(i){let s=i;return u(),(i,c)=>(t(),r(a(l),e(s,{onMousedown:c[0]||=e=>{!e.defaultPrevented&&e.detail>1&&e.preventDefault()}}),{default:n(()=>[o(i.$slots,`default`)]),_:3},16))}}),f=i({__name:`Label`,props:{for:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(i){let l=i,u=s(l,`class`);return(i,s)=>(t(),r(a(d),e({"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:n(()=>[o(i.$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

@@ -0,0 +1 @@
import{I as e,Q as t,b as n,g as r,gt as i,ut as a,x as o,yt as s,z as c}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{p as l}from"./dist-3yfE1dPa.js";import{D as u,O as d}from"./Teleport-f0-_cFyq.js";import{i as f}from"./button-xrpYa8G4.js";import{o as p,u as m}from"./PopperContent-Wu1vPEc9.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=o({__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(o,{expose:u,emit:d}){let _=o,v=d,{loop:y,orientation:x,dir:S}=i(_),w=m(S),T=l(_,`currentTabStopId`,v,{defaultValue:_.defaultCurrentTabStopId,passive:_.currentTabStopId===void 0}),E=a(!1),D=a(!1),O=a(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--}}),(i,a)=>(e(),r(s(A),null,{default:t(()=>[n(s(f),{tabindex:E.value||O.value===0?-1:0,"data-orientation":s(x),as:i.as,"as-child":i.asChild,dir:s(w),style:{outline:`none`},onMousedown:a[0]||=e=>D.value=!0,onMouseup:M,onFocus:j,onBlur:a[1]||=e=>E.value=!1},{default:t(()=>[c(i.$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

@@ -0,0 +1 @@
import{I as e,N as t,P as n,Q as r,b as i,g as a,j as o,m as s,x as c,yt as l,z as u}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{_ as d}from"./Teleport-f0-_cFyq.js";import{i as f}from"./button-xrpYa8G4.js";import{o as p}from"./PopperContent-Wu1vPEc9.js";import{a as m,i as h,n as g,r as _}from"./RovingFocusGroup-CoCJohzY.js";var v=c({__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(c){let v=c,y=g(),b=d(),x=s(()=>v.tabStopId||b),S=s(()=>y.currentTabStopId.value===x.value),{getItems:C,CollectionItem:w}=p();t(()=>{v.focusable&&y.onFocusableItemAdd()}),n(()=>{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)}o(()=>_(n))}}return(t,n)=>(e(),a(l(w),null,{default:r(()=>[i(l(f),{tabindex:S.value?0:-1,"data-orientation":l(y).orientation.value,"data-active":t.active?``:void 0,"data-disabled":t.focusable?void 0:``,as:t.as,"as-child":t.asChild,onMousedown:n[0]||=e=>{t.focusable?l(y).onItemFocus(x.value):e.preventDefault()},onFocus:n[1]||=e=>l(y).onItemFocus(x.value),onKeydown:T},{default:r(()=>[u(t.$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

@@ -0,0 +1 @@
import{A as e,C as t,I as n,Q as r,St as i,g as a,m as o,x as s,yt as c,z as l}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{b as u}from"./dist-3yfE1dPa.js";import{R as d}from"./index-axPHP3AB.js";import{i as f}from"./button-xrpYa8G4.js";var p=s({__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(t){let i=t,s=[`horizontal`,`vertical`];function u(e){return s.includes(e)}let d=o(()=>u(i.orientation)?i.orientation:`horizontal`),p=o(()=>d.value===`vertical`?i.orientation:void 0),m=o(()=>i.decorative?{role:`none`}:{"aria-orientation":p.value,role:`separator`});return(t,i)=>(n(),a(c(f),e({as:t.as,"as-child":t.asChild,"data-orientation":d.value},m.value),{default:r(()=>[l(t.$slots,`default`)]),_:3},16,[`as`,`as-child`,`data-orientation`]))}}),m=s({__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 o=e;return(e,s)=>(n(),a(p,i(t(o)),{default:r(()=>[l(e.$slots,`default`)]),_:3},16))}}),h=s({__name:`Separator`,props:{orientation:{default:`horizontal`},decorative:{type:Boolean,default:!0},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(t){let r=t,i=u(r,`class`);return(t,o)=>(n(),a(c(m),e({"data-slot":`separator`},c(i),{class:c(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`,r.class)}),null,16,[`class`]))}});export{m as n,h as t};

View File

@@ -0,0 +1 @@
import{I as e,h as t,v as n,x as r,xt as i,yt as a,z as o}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{R as s}from"./index-axPHP3AB.js";var c={"data-slot":`table-container`,class:`relative w-full overflow-auto`},l=r({__name:`Table`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let l=r;return(r,u)=>(e(),n(`div`,c,[t(`table`,{"data-slot":`table`,class:i(a(s)(`w-full caption-bottom text-sm`,l.class))},[o(r.$slots,`default`)],2)]))}}),u=r({__name:`TableBody`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(t){let r=t;return(t,c)=>(e(),n(`tbody`,{"data-slot":`table-body`,class:i(a(s)(`[&_tr:last-child]:border-0`,r.class))},[o(t.$slots,`default`)],2))}}),d=r({__name:`TableCell`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(t){let r=t;return(t,c)=>(e(),n(`td`,{"data-slot":`table-cell`,class:i(a(s)(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,r.class))},[o(t.$slots,`default`)],2))}}),f=r({__name:`TableHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(t){let r=t;return(t,c)=>(e(),n(`thead`,{"data-slot":`table-header`,class:i(a(s)(`[&_tr]:border-b`,r.class))},[o(t.$slots,`default`)],2))}}),p=r({__name:`TableRow`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(t){let r=t;return(t,c)=>(e(),n(`tr`,{"data-slot":`table-row`,class:i(a(s)(`hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors`,r.class))},[o(t.$slots,`default`)],2))}}),m=r({__name:`TableHead`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(t){let r=t;return(t,c)=>(e(),n(`th`,{"data-slot":`table-head`,class:i(a(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]`,r.class))},[o(t.$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

@@ -0,0 +1 @@
import{I as e,Q as t,_t as n,g as r,m as i,x as a,yt as o,z as s}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{i as c}from"./dist-3yfE1dPa.js";import{i as l}from"./button-xrpYa8G4.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(e){return i(()=>n(e)?!!c(e)?.closest(`form`):!0)}var m=a({__name:`VisuallyHidden`,props:{feature:{type:String,required:!1,default:`focusable`},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(n){return(n,i)=>(e(),r(o(l),{as:n.as,"as-child":n.asChild,"aria-hidden":n.feature===`focusable`?`true`:void 0,"data-hidden":n.feature===`fully-hidden`?``:void 0,tabindex:n.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:t(()=>[s(n.$slots,`default`)]),_:3},8,[`as`,`as-child`,`aria-hidden`,`data-hidden`,`tabindex`]))}});export{p as n,f as r,m as t};

View File

@@ -0,0 +1 @@
import{A as e,I as t,J as n,R as r,_ as i,g as a,l as o,m as s,v as c,x as l}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{t as u}from"./VisuallyHidden-CunWEljx.js";import{s as d}from"./PopperContent-Wu1vPEc9.js";var f=l({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(r){let i=r,{primitiveElement:o,currentElement:c}=d();return n(s(()=>i.checked??i.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)}}),(n,r)=>(t(),a(u,e({ref_key:`primitiveElement`,ref:o},{...i,...n.$attrs},{as:`input`}),null,16))}}),p=l({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(n){let l=n,u=s(()=>typeof l.value==`object`&&Array.isArray(l.value)&&l.value.length===0&&l.required),d=s(()=>typeof l.value==`string`||typeof l.value==`number`||typeof l.value==`boolean`||l.value===null||l.value===void 0?[{name:l.name,value:l.value}]:typeof l.value==`object`&&Array.isArray(l.value)?l.value.flatMap((e,t)=>typeof e==`object`?Object.entries(e).map(([e,n])=>({name:`${l.name}[${t}][${e}]`,value:n})):{name:`${l.name}[${t}]`,value:e}):l.value!==null&&typeof l.value==`object`&&!Array.isArray(l.value)?Object.entries(l.value).map(([e,t])=>({name:`${l.name}[${e}]`,value:t})):[]);return(n,s)=>(t(),c(o,null,[i(` We render single input if it's required `),u.value?(t(),a(f,e({key:n.name},{...l,...n.$attrs},{name:n.name,value:n.value}),null,16,[`name`,`value`])):(t(!0),c(o,{key:1},r(d.value,r=>(t(),a(f,e({key:r.name},{ref_for:!0},{...l,...n.$attrs},{name:r.name,value:r.value}),null,16,[`name`,`value`]))),128))],2112))}});export{p as t};

View File

@@ -0,0 +1 @@
import{I as e,Q as t,b as n,h as r,v as i,wt as a,x as o,y as s,z as c}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{n as l}from"./button-xrpYa8G4.js";import{t as u}from"./route-block-G560e8nk.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`},_=o({__name:`custom-error`,props:{code:{},subtitle:{},error:{}},setup(o){return(u,_)=>{let v=l;return e(),i(`div`,d,[r(`h1`,f,a(o.code),1),r(`h2`,p,a(o.subtitle),1),r(`p`,m,a(o.error),1),r(`footer`,h,[c(u.$slots,`default`,{},()=>[r(`div`,g,[n(v,{variant:`outline`,onClick:_[0]||=e=>u.$router.back()},{default:t(()=>[..._[2]||=[s(` Go Back `,-1)]]),_:1}),n(v,{onClick:_[1]||=e=>u.$router.push(`/`)},{default:t(()=>[..._[3]||=[s(` Back to Home `,-1)]]),_:1})])])])])}}}),v={class:`flex items-center justify-center h-screen`},y=o({__name:`[...path]`,setup(t){return(t,r)=>(e(),i(`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

View File

@@ -0,0 +1 @@
import{B as e,I as t,g as n}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{I as r}from"./index-axPHP3AB.js";import{t as i}from"./route-block-G560e8nk.js";var a={};function o(r,i){let a=e(`router-view`);return t(),n(a)}typeof i==`function`&&i(a);var s=r(a,[[`render`,o]]);export{s as default};

View File

@@ -0,0 +1 @@
import{B as e,I as t,g as n}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{I as r}from"./index-axPHP3AB.js";var i={};function a(r,i){let a=e(`router-view`);return t(),n(a)}var o=r(i,[[`render`,a]]);export{o as default};

View File

@@ -0,0 +1 @@
import{A as e,I as t,Q as n,c as r,g as i,l as a,p as o,w as s,x as c,xt as l,yt as u,z as d}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{B as f,R as p}from"./index-axPHP3AB.js";function m(e){return e?e.flatMap(e=>e.type===a?m(e.children):[e]):[]}var h=c({name:`PrimitiveSlot`,inheritAttrs:!1,setup(t,{attrs:n,slots:i}){return()=>{if(!i.default)return null;let t=m(i.default()),a=t.findIndex(e=>e.type!==r);if(a===-1)return t;let s=t[a];delete s.props?.ref;let c=s.props?e(n,s.props):n,l=o({...s,props:{}},c);return t.length===1?l:(t[a]=l,t)}}}),g=[`area`,`img`,`input`],_=c({name:`Primitive`,inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:`div`}},setup(e,{attrs:t,slots:n}){let r=e.asChild?`template`:e.as;return typeof r==`string`&&g.includes(r)?()=>s(r,t):r===`template`?()=>s(h,t,{default:n.default}):()=>s(e.as,t,{default:n.default})}}),v=e=>typeof e==`boolean`?`${e}`:e===0?`0`:e,y=f,b=(e,t)=>n=>{if(t?.variants==null)return y(e,n?.class,n?.className);let{variants:r,defaultVariants:i}=t,a=Object.keys(r).map(e=>{let t=n?.[e],a=i?.[e];if(t===null)return null;let o=v(t)||v(a);return r[e][o]}),o=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return r===void 0||(e[n]=r),e},{});return y(e,a,t?.compoundVariants?.reduce((e,t)=>{let{class:n,className:r,...a}=t;return Object.entries(a).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...i,...o}[t]):{...i,...o}[t]===n})?[...e,n,r]:e},[]),n?.class,n?.className)},x=c({__name:`Button`,props:{variant:{},size:{},class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{default:`button`}},setup(e){let r=e;return(a,o)=>(t(),i(u(_),{"data-slot":`button`,as:e.as,"as-child":e.asChild,class:l(u(p)(u(S)({variant:e.variant,size:e.size}),r.class))},{default:n(()=>[d(a.$slots,`default`)]),_:3},8,[`as`,`as-child`,`class`]))}}),S=b(`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{h as a,_ as i,x as n,m as o,b as r,S 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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{B as e,I as t,Q as n,R as r,V as i,_ as a,b as o,g as s,h as c,l,m as u,v as d,wt as f,x as p,xt as m,y as h,yt as g,z as _}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{t as v}from"./chevrons-up-down-Bbw1im9J.js";import{C as y,R as b}from"./index-axPHP3AB.js";import{n as x}from"./button-xrpYa8G4.js";import{i as S,n as C,r as w,t as T}from"./DropdownMenuTrigger-CaEGJhbh.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=p({__name:`basic-header`,props:{title:{},description:{},sticky:{type:Boolean}},setup(e){return(n,r)=>(t(),d(`header`,{class:m(g(b)(`flex flex-col md:flex-row gap-2 justify-between py-2`,e.sticky?`sticky top-0 z-40 bg-background`:``))},[c(`main`,null,[c(`h1`,E,f(e.title),1),e.description?(t(),d(`p`,D,f(e.description),1)):a(``,!0)]),c(`aside`,O,[_(n.$slots,`actions`)])],2))}}),A={class:`py-4`},j=p({__name:`basic-page`,props:{title:{},description:{},sticky:{type:Boolean}},setup(e){return(r,i)=>(t(),d(`main`,null,[o(k,{title:e.title,description:e.description,sticky:e.sticky},{actions:n(()=>[_(r.$slots,`actions`)]),_:3},8,[`title`,`description`,`sticky`]),c(`main`,A,[_(r.$slots,`default`)])]))}}),M={class:`flex flex-col gap-2`},N=`text-primary font-semibold bg-primary/5`,P=p({__name:`two-col-aside`,props:{nav:{}},setup(a){let p=a,_=y(),b=u(()=>_.path),E=u(()=>p.nav.find(e=>e.url===b.value));return(a,u)=>{let _=e(`router-link`),y=x,D=T,O=C,k=w,A=S;return t(),d(`nav`,M,[(t(!0),d(l,null,r(p.nav,e=>(t(),s(_,{key:e.url,to:e.url,class:m([`items-center hidden px-2 py-1 rounded-md lg:flex hover:bg-primary/5`,e.url===g(b)?N:``])},{default:n(()=>[(t(),s(i(e.icon),{class:`size-4 mr-1`})),c(`span`,null,f(e.title),1)]),_:2},1032,[`to`,`class`]))),128)),o(A,{class:`lg:hidden`},{default:n(()=>[o(D,{"as-child":``},{default:n(()=>[o(y,{variant:`outline`,class:`w-48 lg:hidden`},{default:n(()=>[(t(),s(i(g(E)?.icon),{class:`size-4 mr-1`})),c(`span`,null,f(g(E)?.title),1),o(g(v),{class:`size-4 ml-auto`})]),_:1})]),_:1}),o(k,{class:`w-48`,align:`start`},{default:n(()=>[(t(!0),d(l,null,r(p.nav,e=>(t(),s(O,{key:e.url,onClick:t=>a.$router.push(e.url)},{default:n(()=>[(t(),s(i(e.icon),{class:`size-4 mr-1`})),h(` `+f(e.title),1)]),_:2},1032,[`onClick`]))),128))]),_:1})]),_:1})])}}}),F=p({__name:`two-col`,setup(e){return(e,n)=>(t(),d(`div`,{class:m(g(b)(`grid grid-cols-1 lg:grid-cols-[200px_1fr] gap-4 w-full`))},[c(`aside`,null,[_(e.$slots,`aside`)]),c(`section`,null,[_(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

View File

@@ -0,0 +1 @@
.marketing-header[data-v-bceee906]{-webkit-backdrop-filter:saturate(50%)blur(4px);backdrop-filter:saturate(50%)blur(4px);background-size:4px 4px}

View File

@@ -0,0 +1 @@
import{B as e,I as t,Q as n,R as r,b as i,g as a,h as o,l as s,v as c,wt as l,x as u,y as d,yt as f}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{o as p}from"./dist-3yfE1dPa.js";import{n as m,t as h}from"./toggle-theme-BwpYiWnH.js";import{I as g,U as _}from"./index-axPHP3AB.js";import"./Teleport-f0-_cFyq.js";import{n as v}from"./button-xrpYa8G4.js";import{n as y,t as b}from"./AvatarImage-Da9BQozn.js";var x={class:`min-h-18 flex items-center justify-between`},S={class:`flex items-center gap-2`},C=u({__name:`the-footer`,setup(e){let a=p(),l=[{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,u)=>{let d=b,p=y,m=v;return t(),c(`footer`,x,[i(p,null,{default:n(()=>[i(d,{src:`${f(a)===`dark`?`/logo.svg`:`/logo-black.svg`}`,alt:`Logo`},null,8,[`src`])]),_:1}),u[0]||=o(`div`,null,`© 2025 Whbbit1999`,-1),o(`div`,S,[(t(),c(s,null,r(l,e=>i(m,{key:e.name,variant:`outline`,size:`icon`,as:`a`,href:e.url,target:`_blank`},{default:n(()=>[i(f(_),{icon:e.icon},null,8,[`icon`])]),_:2},1032,[`href`])),64))])])}}}),w={};function T(e,r){let i=v;return t(),a(i,{as:`a`,href:`/auth/sign-in`},{default:n(()=>[d(l(e.$t(`login`)),1)]),_:1})}var E=g(w,[[`render`,T]]),D={};function O(e,r){let i=v;return t(),a(i,{as:`a`,href:`/auth/sign-up`,variant:`outline`},{default:n(()=>[d(l(e.$t(`register`)),1)]),_:1})}var k=g(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=g(u({__name:`the-header`,setup(r){let a=p();return(r,s)=>{let l=b,u=y,d=e(`router-link`);return t(),c(`header`,A,[i(d,{to:`/`,class:`flex items-center gap-2`},{default:n(()=>[i(u,null,{default:n(()=>[i(l,{src:`${f(a)===`dark`?`/logo.svg`:`/logo-black.svg`}`,alt:`Logo`},null,8,[`src`])]),_:1}),s[0]||=o(`span`,{class:`text-base font-bold`},`Shadcn Vue Admin`,-1)]),_:1}),s[1]||=o(`div`,{class:`flex-1`},null,-1),o(`div`,j,[i(E),i(k)]),o(`div`,M,[i(m),i(h)])])}}}),[[`__scopeId`,`data-v-bceee906`]]),P={class:`container mx-auto`},F={class:`mx-2 lg:p-0`},I=u({__name:`marketing`,setup(n){return(n,r)=>{let a=e(`router-view`);return t(),c(`div`,P,[o(`div`,F,[i(N),o(`main`,null,[i(a)]),i(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

@@ -0,0 +1 @@
import{I as e,v as t,x as n}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{t as r}from"./route-block-G560e8nk.js";var i=n({__name:`index`,setup(n){return(n,r)=>(e(),t(`div`))}});typeof r==`function`&&r(i);var a=i;export{a as default};

View File

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

View File

@@ -0,0 +1 @@
import{I as e,Q as t,Y as n,_ as r,at as i,b as a,g as o,h as s,s as c,ut as l,v as u,wt as d,x as f,y as p,yt as m}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{T as h}from"./dist-3yfE1dPa.js";import{t as g}from"./eye-off-DDZmXXZv.js";import{L as _,w as v}from"./index-axPHP3AB.js";import{n as y}from"./button-xrpYa8G4.js";import{t as b}from"./Label-BVKK717i.js";import{t as x}from"./Input-BTEnOeoJ.js";import"./monisuo-admin.api-D_Mn0eGz.js";import{t as S}from"./use-auth-DCvz6Dk0.js";import{t as C}from"./route-block-G560e8nk.js";import{t as w}from"./Card-C4ypPl9R.js";import{t as T}from"./CardContent-CjpRZuCW.js";import{r as E,t as D}from"./Alert-Djp0o4Fe.js";import{n as O,r as k,t as A}from"./CardTitle-CmtJJ__x.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=f({__name:`sign-in`,setup(f){let h=l(``),C=l(``),V=l(!1),{login:H,loading:U,error:W,isLogin:G}=S(),K=v();n(()=>{m(G)&&K.push(`/monisuo/dashboard`)});async function q(){!h.value||!C.value||await H(h.value,C.value)}return(n,l)=>{let f=A,v=O,S=k,H=b,G=x,K=E,J=D,Y=_,X=y,Z=T,Q=w;return e(),u(`div`,P,[a(Q,{class:`w-full max-w-lg`},{default:t(()=>[a(S,{class:`space-y-1 text-center`},{default:t(()=>[s(`div`,F,[s(`div`,I,[a(m(M),{class:`size-6 text-primary-foreground`})])]),a(f,{class:`text-2xl font-bold`},{default:t(()=>[...l[3]||=[p(` Monisuo Admin `,-1)]]),_:1}),a(v,null,{default:t(()=>[...l[4]||=[p(` 管理员登录 `,-1)]]),_:1})]),_:1}),a(Z,null,{default:t(()=>[s(`form`,{onSubmit:c(q,[`prevent`]),class:`space-y-4`},[s(`div`,L,[a(H,{for:`username`},{default:t(()=>[...l[5]||=[p(`用户名`,-1)]]),_:1}),s(`div`,R,[a(m(N),{class:`absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),a(G,{id:`username`,modelValue:m(h),"onUpdate:modelValue":l[0]||=e=>i(h)?h.value=e:null,type:`text`,placeholder:`请输入用户名`,class:`pl-9`,disabled:m(U)},null,8,[`modelValue`,`disabled`])])]),s(`div`,z,[a(H,{for:`password`},{default:t(()=>[...l[6]||=[p(`密码`,-1)]]),_:1}),s(`div`,B,[a(m(M),{class:`absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`}),a(G,{id:`password`,modelValue:m(C),"onUpdate:modelValue":l[1]||=e=>i(C)?C.value=e:null,type:m(V)?`text`:`password`,placeholder:`请输入密码`,class:`pl-9 pr-9`,disabled:m(U)},null,8,[`modelValue`,`type`,`disabled`]),s(`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=!m(V)},[m(V)?(e(),o(m(g),{key:1,class:`size-4`})):(e(),o(m(j),{key:0,class:`size-4`}))])])]),m(W)?(e(),o(J,{key:0,variant:`destructive`},{default:t(()=>[a(K,null,{default:t(()=>[p(d(m(W)),1)]),_:1})]),_:1})):r(``,!0),a(X,{type:`submit`,class:`w-full`,disabled:m(U)},{default:t(()=>[m(U)?(e(),o(Y,{key:0,class:`size-4 mr-2`})):r(``,!0),p(` `+d(m(U)?`登录中...`:`登录`),1)]),_:1},8,[`disabled`])],32)]),_:1})]),_:1})])}}});typeof C==`function`&&C(V);var H=V;export{H as default};

View File

@@ -0,0 +1 @@
import{I as e,Q as t,b as n,v as r,w as i,wt as a,x as o,y as s,yt as c}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{n as l}from"./lib-CC9cpJ8Y.js";import"./Teleport-f0-_cFyq.js";import{n as u}from"./button-xrpYa8G4.js";import{a as d,i as f,n as p,r as m,s as h}from"./modal-7NZpSAOO.js";var g=o({__name:`task-delete`,props:{task:{}},setup(o){let g=o;function _(){l(`The following task has been deleted:`,{description:i(`pre`,{class:`mt-2 w-[340px] rounded-md bg-slate-950 p-4`},i(`code`,{class:`text-white`},JSON.stringify(g.task,null,2)))})}return(i,l)=>{let g=u;return e(),r(`div`,null,[n(c(m),null,{default:t(()=>[n(c(p),null,{default:t(()=>[s(` Delete this task: `+a(o.task.id)+` ? `,1)]),_:1}),n(c(d),null,{default:t(()=>[s(` You are about to delete a task with the ID `+a(o.task.id)+`. This action cannot be undone. `,1)]),_:1})]),_:1}),n(c(f),null,{default:t(()=>[n(c(h),{"as-child":``},{default:t(()=>[n(g,{variant:`outline`},{default:t(()=>[...l[0]||=[s(` Cancel `,-1)]]),_:1})]),_:1}),n(c(h),{"as-child":``},{default:t(()=>[n(g,{variant:`destructive`,onClick:_},{default:t(()=>[...l[1]||=[s(` Delete `,-1)]]),_:1})]),_:1})]),_:1})])}}});export{g as default};

View File

@@ -0,0 +1 @@
import{t as e}from"./task-resource-dialog-PGu3CACc.js";import"./Teleport-f0-_cFyq.js";import"./button-xrpYa8G4.js";import"./modal-7NZpSAOO.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

View File

@@ -0,0 +1 @@
import{I as e,Q as t,at as n,b as r,g as i,h as a,wt as o,x as s,y as c,yt as l}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{T as u,o as d}from"./dist-3yfE1dPa.js";import{D as f,E as p,O as m,U as h}from"./index-axPHP3AB.js";import{n as g}from"./button-xrpYa8G4.js";import{i as _,n as v,r as y,t as b}from"./DropdownMenuTrigger-CaEGJhbh.js";import{n as x,t as S}from"./DropdownMenuLabel-BxrcQY1z.js";import{n as C,t as w}from"./DropdownMenuRadioItem-UhUJ6fhi.js";var T=u(`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=u(`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=u(`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=s({__name:`language-change`,setup(s){let{locale:u}=m();function d(){u.value=`en`,f.value=`en`}function v(e){if(typeof e!=`string`||!p.has(e)){d();return}u.value=e,f.value=e}return(s,d)=>{let f=g,p=b,m=S,T=x,E=w,D=C,O=y,k=_;return e(),i(k,null,{default:t(()=>[r(p,{"as-child":``},{default:t(()=>[r(f,{variant:`outline`},{default:t(()=>[r(l(h),{icon:`mdi:translate`,class:`mr-2`}),c(` `+o(s.$t(`language`)),1)]),_:1})]),_:1}),r(O,null,{default:t(()=>[r(m,null,{default:t(()=>[c(o(s.$t(`changeLanguage`)),1)]),_:1}),r(T),r(D,{modelValue:l(u),"onUpdate:modelValue":[d[0]||=e=>n(u)?u.value=e:null,v]},{default:t(()=>[r(E,{value:`en`},{default:t(()=>[r(l(h),{icon:`flag:us-4x3`}),d[1]||=a(`span`,{class:`ml-2`},`English`,-1)]),_:1}),r(E,{value:`zh`},{default:t(()=>[r(l(h),{icon:`flag:cn-4x3`}),d[2]||=a(`span`,{class:`ml-2`},`中文`,-1)]),_:1})]),_:1},8,[`modelValue`])]),_:1})]),_:1})}}}),k=s({__name:`toggle-theme`,setup(n){let o=d();return(n,s)=>{let u=g,d=b,f=v,p=y,m=_;return e(),i(m,null,{default:t(()=>[r(d,{"as-child":``},{default:t(()=>[r(u,{variant:`outline`,size:`icon`},{default:t(()=>[r(l(T),{class:`rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0`}),r(l(D),{class:`absolute rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100`}),s[3]||=a(`span`,{class:`sr-only`},`Toggle theme`,-1)]),_:1})]),_:1}),r(p,{align:`end`},{default:t(()=>[r(f,{onClick:s[0]||=e=>o.value=`light`},{default:t(()=>[r(l(D)),s[4]||=c(` Light `,-1)]),_:1}),r(f,{onClick:s[1]||=e=>o.value=`dark`},{default:t(()=>[r(l(T)),s[5]||=c(` Dark `,-1)]),_:1}),r(f,{onClick:s[2]||=e=>o.value=`auto`},{default:t(()=>[r(l(E)),s[6]||=c(` System `,-1)]),_:1})]),_:1})]),_:1})}}});export{T as a,E as i,O as n,D as r,k as t};

View File

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

View File

@@ -0,0 +1 @@
import{m as e,ut as t}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{T as n}from"./dist-3yfE1dPa.js";import{S as r}from"./index-axPHP3AB.js";var i=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`}]]),a=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`}]]),o=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`}]]),s=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`}]]),c=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`}]]),l=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`}]]),u=n(`trending-up`,[[`path`,{d:`M16 7h6v6`,key:`box55l`}],[`path`,{d:`m22 7-8.5 8.5-5-5L2 17`,key:`1t1m79`}]]),d=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`}]]);function f(){let n=r(),f=e(()=>n.adminInfo?.role??2),p=e(()=>f.value===1),m=[{title:`外观设置`,url:`/settings/appearance`,icon:o}],h=[{title:`Monisuo 管理`,items:[{title:`数据看板`,url:`/monisuo/dashboard`,icon:a,roles:[1]},{title:`用户管理`,url:`/monisuo/users`,icon:d,roles:[1]},{title:`币种管理`,url:`/monisuo/coins`,icon:i,roles:[1]},{title:`订单审批`,url:`/monisuo/orders`,icon:s},{title:`业务分析`,url:`/monisuo/analytics`,icon:u,roles:[1]},{title:`管理员管理`,url:`/monisuo/admins`,icon:l,roles:[1]}]},{title:`Other`,items:[{title:`Settings`,icon:c,items:m}]}];return{navData:e(()=>h.map(e=>({title:e.title,items:e.items.filter(e=>{let t=e.roles;return t?t.includes(f.value):!0})})).filter(e=>e.items.length>0)),otherPages:t([]),settingsNavItems:m,isSuperAdmin:p}}export{f as t};

View File

@@ -0,0 +1 @@
import{F as e,S as t,m as n,ut as r,vt as i}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{i as a}from"./dist-3yfE1dPa.js";function o(){let o=t(),s=r(),c=n(()=>l());e(()=>{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

@@ -0,0 +1 @@
import{I as e,Q as t,b as n,v as r,w as i,wt as a,x as o,y as s,yt as c}from"./vue.runtime.esm-bundler-DS0mm12S.js";import{n as l}from"./lib-CC9cpJ8Y.js";import"./Teleport-f0-_cFyq.js";import{n as u}from"./button-xrpYa8G4.js";import{a as d,i as f,n as p,r as m,s as h}from"./modal-7NZpSAOO.js";var g=o({__name:`user-delete`,props:{user:{}},emits:[`remove`],setup(o,{emit:g}){let _=g;function v(){l(`The following task has been deleted:`,{description:i(`pre`,{class:`mt-2 w-[340px] rounded-md bg-slate-950 p-4`},i(`code`,{class:`text-white`},JSON.stringify(o.user,null,2)))}),_(`remove`)}return(i,l)=>{let g=u;return e(),r(`div`,null,[n(c(m),null,{default:t(()=>[n(c(p),null,{default:t(()=>[s(` Delete this user: `+a(o.user.username)+` ? `,1)]),_:1}),n(c(d),null,{default:t(()=>[s(` You are about to delete a user with the ID `+a(o.user.id)+`. This action cannot be undone. `,1)]),_:1})]),_:1}),n(c(f),null,{default:t(()=>[n(c(h),{"as-child":``},{default:t(()=>[n(g,{variant:`outline`},{default:t(()=>[...l[0]||=[s(` Cancel `,-1)]]),_:1})]),_:1}),n(c(h),{"as-child":``},{default:t(()=>[n(g,{variant:`destructive`,onClick:v},{default:t(()=>[...l[1]||=[s(` Delete `,-1)]]),_:1})]),_:1})]),_:1})])}}});export{g as default};

View File

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

View File

@@ -0,0 +1 @@
import"./Teleport-f0-_cFyq.js";import"./button-xrpYa8G4.js";import"./modal-7NZpSAOO.js";import{t as e}from"./user-resource-DOlPL2P8.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

@@ -0,0 +1,241 @@
<script lang="ts" setup>
import { Icon } from '@iconify/vue'
import { toast } from 'vue-sonner'
import type { AdminRecord } from '@/services/api/monisuo-admin.api'
import { BasicPage } from '@/components/global-layout'
import { useCreateAdminMutation, useGetAdminListQuery, useToggleAdminStatusMutation } from '@/services/api/monisuo-admin.api'
const { data, isLoading, refetch } = useGetAdminListQuery()
const createMutation = useCreateAdminMutation()
const toggleStatusMutation = useToggleAdminStatusMutation()
const admins = computed(() => data.value?.data || [])
const showCreateDialog = ref(false)
const newAdmin = ref({ username: '', password: '', nickname: '', role: 2 as number })
function openCreateDialog() {
newAdmin.value = { username: '', password: '', nickname: '', role: 2 }
showCreateDialog.value = true
}
async function createAdmin() {
if (!newAdmin.value.username || !newAdmin.value.password) {
toast.error('请输入用户名和密码')
return
}
if (newAdmin.value.password.length < 4) {
toast.error('密码至少4位')
return
}
try {
await createMutation.mutateAsync(newAdmin.value)
toast.success('创建成功')
showCreateDialog.value = false
refetch()
}
catch (e: any) {
toast.error(e.message || e.response?.data?.msg || '创建失败')
}
}
async function toggleStatus(admin: AdminRecord) {
if (admin.isSystem === 1) {
toast.error('系统预置管理员不可操作')
return
}
const newStatus = admin.status === 1 ? 0 : 1
try {
await toggleStatusMutation.mutateAsync({ id: admin.id, status: newStatus })
toast.success(newStatus === 1 ? '已启用' : '已禁用')
refetch()
}
catch (e: any) {
toast.error(e.message || e.response?.data?.msg || '操作失败')
}
}
function roleText(role: number) {
if (role === 1) return '超级管理员'
if (role === 2) return '管理员'
if (role === 3) return '财务'
return '未知'
}
function roleBadge(role: number) {
if (role === 1) return 'default'
if (role === 3) return 'outline'
return 'secondary'
}
</script>
<template>
<BasicPage title="管理员管理" description="管理系统管理员和财务账号">
<div class="space-y-4">
<div class="flex justify-end">
<UiButton @click="openCreateDialog">
<Icon icon="lucide:plus" class="size-4 mr-2" />
新增账号
</UiButton>
</div>
<!-- PC端表格 -->
<UiCard class="hidden md:block overflow-x-auto p-4">
<UiTable>
<UiTableHeader>
<UiTableRow>
<UiTableHead class="w-[80px]">
ID
</UiTableHead>
<UiTableHead>用户名</UiTableHead>
<UiTableHead>昵称</UiTableHead>
<UiTableHead>角色</UiTableHead>
<UiTableHead>状态</UiTableHead>
<UiTableHead>创建时间</UiTableHead>
<UiTableHead class="text-right">
操作
</UiTableHead>
</UiTableRow>
</UiTableHeader>
<UiTableBody>
<UiTableRow v-if="isLoading">
<UiTableCell :col-span="7" class="text-center py-8">
<UiSpinner class="mx-auto" />
</UiTableCell>
</UiTableRow>
<UiTableRow v-else-if="admins.length === 0">
<UiTableCell :col-span="7" class="text-center py-8 text-muted-foreground">
暂无数据
</UiTableCell>
</UiTableRow>
<UiTableRow v-for="admin in admins" :key="admin.id">
<UiTableCell>{{ admin.id }}</UiTableCell>
<UiTableCell class="font-mono font-medium">
{{ admin.username }}
</UiTableCell>
<UiTableCell>{{ admin.nickname }}</UiTableCell>
<UiTableCell>
<UiBadge :variant="roleBadge(admin.role)">
{{ roleText(admin.role) }}
</UiBadge>
</UiTableCell>
<UiTableCell>
<UiBadge :variant="admin.status === 1 ? 'default' : 'destructive'">
{{ admin.status === 1 ? '正常' : '禁用' }}
</UiBadge>
</UiTableCell>
<UiTableCell>{{ admin.createTime }}</UiTableCell>
<UiTableCell class="text-right">
<UiButton
v-if="admin.isSystem !== 1"
size="sm"
variant="ghost"
:disabled="toggleStatusMutation.isPending.value"
@click="toggleStatus(admin)"
>
<Icon
:icon="admin.status === 1 ? 'lucide:ban' : 'lucide:check-circle'"
class="size-4"
:class="admin.status === 1 ? 'text-destructive' : 'text-green-500'"
/>
</UiButton>
</UiTableCell>
</UiTableRow>
</UiTableBody>
</UiTable>
</UiCard>
<!-- 移动端卡片 -->
<div class="md:hidden space-y-3">
<div v-if="isLoading" class="text-center py-8">
<UiSpinner class="mx-auto" />
</div>
<template v-else-if="admins.length > 0">
<UiCard v-for="admin in admins" :key="admin.id" class="p-4">
<div class="flex items-start justify-between">
<div>
<div class="font-mono font-bold">
{{ admin.username }}
</div>
<div class="text-sm text-muted-foreground">
{{ admin.nickname }}
</div>
</div>
<div class="flex gap-1">
<UiBadge :variant="roleBadge(admin.role)">
{{ roleText(admin.role) }}
</UiBadge>
<UiBadge :variant="admin.status === 1 ? 'default' : 'destructive'">
{{ admin.status === 1 ? '正常' : '禁用' }}
</UiBadge>
</div>
</div>
<div v-if="admin.isSystem !== 1" class="mt-2 flex justify-end">
<UiButton
size="sm"
variant="outline"
:disabled="toggleStatusMutation.isPending.value"
@click="toggleStatus(admin)"
>
{{ admin.status === 1 ? '禁用' : '启用' }}
</UiButton>
</div>
</UiCard>
</template>
<div v-else class="text-center py-8 text-muted-foreground">
暂无数据
</div>
</div>
</div>
<!-- 新增账号弹窗 -->
<UiDialog v-model:open="showCreateDialog">
<UiDialogContent class="max-w-md">
<UiDialogHeader>
<UiDialogTitle>新增账号</UiDialogTitle>
</UiDialogHeader>
<div class="grid gap-4 py-4">
<div class="grid gap-2">
<UiLabel>用户名 <span class="text-red-500">*</span></UiLabel>
<UiInput v-model="newAdmin.username" placeholder="请输入用户名" />
</div>
<div class="grid gap-2">
<UiLabel>密码 <span class="text-red-500">*</span></UiLabel>
<UiInput v-model="newAdmin.password" type="password" placeholder="至少4位" />
</div>
<div class="grid gap-2">
<UiLabel>昵称</UiLabel>
<UiInput v-model="newAdmin.nickname" placeholder="可选" />
</div>
<div class="grid gap-2">
<UiLabel>角色 <span class="text-red-500">*</span></UiLabel>
<UiSelect v-model="newAdmin.role">
<UiSelectTrigger>
<UiSelectValue placeholder="请选择角色" />
</UiSelectTrigger>
<UiSelectContent>
<UiSelectItem :value="2">
管理员
</UiSelectItem>
<UiSelectItem :value="3">
财务
</UiSelectItem>
</UiSelectContent>
</UiSelect>
</div>
</div>
<UiDialogFooter>
<UiButton variant="outline" @click="showCreateDialog = false">
取消
</UiButton>
<UiButton :disabled="createMutation.isPending.value" @click="createAdmin">
<UiSpinner v-if="createMutation.isPending.value" class="mr-2" />
创建
</UiButton>
</UiDialogFooter>
</UiDialogContent>
</UiDialog>
</BasicPage>
</template>

View File

@@ -0,0 +1,372 @@
<script lang="ts" setup>
import { Icon } from '@iconify/vue'
import { toast } from 'vue-sonner'
import type { OrderFund } from '@/services/api/monisuo-admin.api'
import { BasicPage } from '@/components/global-layout'
import { useApproveOrderMutation, useGetPendingOrdersQuery } from '@/services/api/monisuo-admin.api'
const pageNum = ref(1)
const pageSize = ref(10)
const { data: pendingData, isLoading: pendingLoading, refetch: refetchPending } = useGetPendingOrdersQuery({
pageNum: pageNum.value,
pageSize: pageSize.value,
})
const approveMutation = useApproveOrderMutation()
const pendingOrders = computed(() => pendingData.value?.data?.list || [])
const pendingTotal = computed(() => pendingData.value?.data?.total || 0)
const totalPages = computed(() => Math.ceil(pendingTotal.value / pageSize.value))
const showApproveDialog = ref(false)
const showDetailDialog = ref(false)
const currentOrder = ref<OrderFund | null>(null)
const approveStatus = ref(2)
const rejectReason = ref('')
const adminRemark = ref('')
function viewOrderDetail(order: OrderFund) {
currentOrder.value = order
showDetailDialog.value = true
}
function openApproveDialog(order: OrderFund, status: number) {
currentOrder.value = order
approveStatus.value = status
rejectReason.value = ''
adminRemark.value = ''
showApproveDialog.value = true
}
async function handleApprove() {
if (!currentOrder.value)
return
const action = approveStatus.value === 2 ? '通过' : '驳回'
try {
await approveMutation.mutateAsync({
orderNo: currentOrder.value.orderNo,
status: approveStatus.value,
rejectReason: rejectReason.value || undefined,
adminRemark: adminRemark.value || undefined,
})
toast.success(`订单已${action}`)
showApproveDialog.value = false
refetchPending()
}
catch (e: any) {
toast.error(e.message || e.response?.data?.msg || `${action}失败`)
}
}
function handlePageChange(page: number) {
pageNum.value = page
refetchPending()
}
function handlePageSizeChange(size: unknown) {
if (size === null || size === undefined)
return
pageSize.value = Number(size)
pageNum.value = 1
refetchPending()
}
function formatAmount(amount: number): string {
return amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })
}
function copyToClipboard(text: string) {
navigator.clipboard.writeText(text)
toast.success('已复制到剪贴板')
}
</script>
<template>
<BasicPage title="财务审批" description="审批提现订单">
<div class="space-y-4">
<!-- 提现待财务审核列表 -->
<UiCard class="hidden md:block overflow-x-auto p-4">
<UiTable>
<UiTableHeader>
<UiTableRow>
<UiTableHead>订单号</UiTableHead>
<UiTableHead>用户</UiTableHead>
<UiTableHead class="text-right">
提现金额
</UiTableHead>
<UiTableHead class="text-right">
手续费
</UiTableHead>
<UiTableHead class="text-right">
应收款项
</UiTableHead>
<UiTableHead>审批人</UiTableHead>
<UiTableHead class="hidden xl:table-cell">
时间
</UiTableHead>
<UiTableHead class="text-right">
操作
</UiTableHead>
</UiTableRow>
</UiTableHeader>
<UiTableBody>
<UiTableRow v-if="pendingLoading">
<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="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>
</UiTableRow>
<UiTableRow v-for="order in pendingOrders" :key="order.id">
<UiTableCell class="font-mono text-xs">
{{ order.orderNo }}
</UiTableCell>
<UiTableCell>{{ order.username }}</UiTableCell>
<UiTableCell class="text-right font-mono font-medium">
${{ formatAmount(order.amount) }}
</UiTableCell>
<UiTableCell class="text-right font-mono text-muted-foreground">
-${{ formatAmount(order.fee || 0) }}
</UiTableCell>
<UiTableCell class="text-right font-mono font-bold text-green-600">
${{ formatAmount(order.receivableAmount || 0) }}
</UiTableCell>
<UiTableCell class="text-sm">
{{ order.approveAdminName || '-' }}
</UiTableCell>
<UiTableCell class="hidden xl:table-cell text-muted-foreground text-sm">
{{ order.createTime }}
</UiTableCell>
<UiTableCell class="text-right">
<div class="flex justify-end gap-1">
<UiButton size="sm" variant="ghost" @click="viewOrderDetail(order)">
<Icon icon="lucide:eye" class="size-4" />
</UiButton>
<UiButton
size="sm"
:disabled="approveMutation.isPending.value"
@click="openApproveDialog(order, 2)"
>
通过
</UiButton>
<UiButton
size="sm"
variant="destructive"
:disabled="approveMutation.isPending.value"
@click="openApproveDialog(order, 3)"
>
驳回
</UiButton>
</div>
</UiTableCell>
</UiTableRow>
</UiTableBody>
</UiTable>
</UiCard>
<!-- 移动端卡片 -->
<div class="md:hidden space-y-3">
<div v-if="pendingLoading" class="text-center py-8">
<UiSpinner class="mx-auto" />
</div>
<template v-else-if="pendingOrders.length > 0">
<UiCard v-for="order in pendingOrders" :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>
<UiBadge variant="secondary">
待财务审核
</UiBadge>
</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>
<div class="text-sm text-muted-foreground mt-1">
手续费: -${{ formatAmount(order.fee || 0) }} | 实际到账: ${{ formatAmount(order.receivableAmount || 0) }}
</div>
<div class="text-sm text-muted-foreground mt-1">
审批人: {{ order.approveAdminName || '-' }}
</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>
<div class="text-sm text-muted-foreground mt-1">
{{ order.createTime }}
</div>
</div>
<div class="mt-3 flex gap-2">
<UiButton size="sm" class="flex-1" @click="openApproveDialog(order, 2)">
通过
</UiButton>
<UiButton size="sm" variant="destructive" class="flex-1" @click="openApproveDialog(order, 3)">
驳回
</UiButton>
</div>
</UiCard>
</template>
<div v-else class="text-center py-8 text-muted-foreground">
<Icon icon="lucide:inbox" class="size-8 mx-auto mb-2 opacity-50" />
<p>暂无待审核订单</p>
</div>
</div>
<!-- 分页 -->
<div v-if="pendingTotal > 0" class="flex items-center justify-between gap-4 px-2">
<div class="text-sm text-muted-foreground">
{{ pendingTotal }} 条待审核
</div>
<div class="flex items-center gap-2">
<UiButton
variant="outline"
size="icon"
class="h-8 w-8"
:disabled="pageNum <= 1"
@click="handlePageChange(pageNum - 1)"
>
<Icon icon="lucide:chevron-left" class="size-4" />
</UiButton>
<span class="text-sm min-w-[80px] text-center">
{{ pageNum }} / {{ totalPages }}
</span>
<UiButton
variant="outline"
size="icon"
class="h-8 w-8"
:disabled="pageNum >= totalPages"
@click="handlePageChange(pageNum + 1)"
>
<Icon icon="lucide:chevron-right" class="size-4" />
</UiButton>
</div>
</div>
</div>
<!-- 订单详情弹窗 -->
<UiDialog v-model:open="showDetailDialog">
<UiDialogContent class="max-w-md max-h-[90vh] overflow-y-auto">
<UiDialogHeader>
<UiDialogTitle>提现订单详情</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 font-medium">{{ currentOrder.username }}</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">手续费(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">
<div v-if="currentOrder.walletAddress" class="flex items-start gap-1">
<span class="font-mono text-xs break-all">{{ currentOrder.walletAddress }}</span>
<Icon icon="lucide:copy" class="size-4 cursor-pointer flex-shrink-0" @click="copyToClipboard(currentOrder.walletAddress!)" />
</div>
<span v-else class="text-muted-foreground">-</span>
</div>
<div v-if="currentOrder.approveAdminName" class="text-muted-foreground">审批人</div>
<div v-if="currentOrder.approveAdminName" class="col-span-2">
{{ currentOrder.approveAdminName }}
</div>
<div class="text-muted-foreground">创建时间</div>
<div class="col-span-2">{{ currentOrder.createTime }}</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>
</template>
</UiDialogFooter>
</UiDialogContent>
</UiDialog>
<!-- 审批弹窗 -->
<UiDialog v-model:open="showApproveDialog">
<UiDialogContent class="max-w-md max-h-[90vh] overflow-y-auto">
<UiDialogHeader>
<UiDialogTitle>{{ approveStatus === 2 ? '通过提现' : '驳回提现' }}</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">
<div>
<div class="text-muted-foreground">订单号</div>
<div class="font-mono">{{ currentOrder.orderNo }}</div>
</div>
<div>
<div class="text-muted-foreground">用户</div>
<div class="font-medium">{{ currentOrder.username }}</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>
</div>
<div v-if="approveStatus === 3" class="grid gap-2">
<UiLabel>驳回原因 <span class="text-red-500">*</span></UiLabel>
<UiInput v-model="rejectReason" placeholder="请输入驳回原因" />
</div>
<div class="grid gap-2">
<UiLabel>备注</UiLabel>
<UiInput v-model="adminRemark" placeholder="可选" />
</div>
</div>
<UiDialogFooter>
<UiButton variant="outline" @click="showApproveDialog = false">
取消
</UiButton>
<UiButton
:variant="approveStatus === 3 ? 'destructive' : 'default'"
:disabled="approveMutation.isPending.value || (approveStatus === 3 && !rejectReason.trim())"
@click="handleApprove"
>
<UiSpinner v-if="approveMutation.isPending.value" class="mr-2" />
确认
</UiButton>
</UiDialogFooter>
</UiDialogContent>
</UiDialog>
</BasicPage>
</template>