@rft-rc/recycle-ui 0.0.1-rc.6 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/search-area/index.d.ts +10 -0
- package/dist/components/search-area/index.d.ts.map +1 -0
- package/dist/components/search-area/index.vue.d.ts +51 -0
- package/dist/components/search-area/index.vue.d.ts.map +1 -0
- package/dist/favicon.svg +10 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +506 -278
- package/dist/index.mjs.map +1 -1
- package/dist/logo.svg +22 -0
- package/dist/style.css +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 基础用法
|
|
3
|
+
*/
|
|
4
|
+
import type { App } from 'vue';
|
|
5
|
+
import RcSearchArea from './index.vue';
|
|
6
|
+
export { RcSearchArea };
|
|
7
|
+
export type { FilterItem, FilterOption } from './index.vue';
|
|
8
|
+
export declare const install: (app: App) => void;
|
|
9
|
+
export default RcSearchArea;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/search-area/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,YAAY,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,OAAO,GAAI,KAAK,GAAG,SAG/B,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface FilterOption {
|
|
2
|
+
label: string;
|
|
3
|
+
value: any;
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}
|
|
6
|
+
export interface FilterItem {
|
|
7
|
+
/** 筛选项标签 */
|
|
8
|
+
label: string;
|
|
9
|
+
/** 筛选项唯一标识 */
|
|
10
|
+
key: string;
|
|
11
|
+
/** 选项列表 */
|
|
12
|
+
options: FilterOption[] | string[];
|
|
13
|
+
/** 筛选类型:single 单选,multiple 多选(默认) */
|
|
14
|
+
type?: 'single' | 'multiple';
|
|
15
|
+
/** 多选时的列数(默认 2) */
|
|
16
|
+
column?: number;
|
|
17
|
+
}
|
|
18
|
+
type __VLS_Props = {
|
|
19
|
+
/** 筛选项配置 */
|
|
20
|
+
items: FilterItem[];
|
|
21
|
+
/** 当前筛选值(支持 v-model) */
|
|
22
|
+
modelValue?: Record<string, any>;
|
|
23
|
+
/** 是否显示蒙层 */
|
|
24
|
+
showMask?: boolean;
|
|
25
|
+
};
|
|
26
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
27
|
+
/** 获取当前筛选值 */
|
|
28
|
+
getValues: () => {
|
|
29
|
+
[x: string]: any;
|
|
30
|
+
};
|
|
31
|
+
/** 重置所有筛选 */
|
|
32
|
+
reset: () => void;
|
|
33
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
34
|
+
"update:modelValue": (values: Record<string, any>) => any;
|
|
35
|
+
change: (values: Record<string, any>, item: FilterItem) => any;
|
|
36
|
+
confirm: (values: Record<string, any>, item: FilterItem) => any;
|
|
37
|
+
reset: (key?: string | undefined) => any;
|
|
38
|
+
"item-change": (key: string, value: any) => any;
|
|
39
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
40
|
+
"onUpdate:modelValue"?: ((values: Record<string, any>) => any) | undefined;
|
|
41
|
+
onChange?: ((values: Record<string, any>, item: FilterItem) => any) | undefined;
|
|
42
|
+
onConfirm?: ((values: Record<string, any>, item: FilterItem) => any) | undefined;
|
|
43
|
+
onReset?: ((key?: string | undefined) => any) | undefined;
|
|
44
|
+
"onItem-change"?: ((key: string, value: any) => any) | undefined;
|
|
45
|
+
}>, {
|
|
46
|
+
items: FilterItem[];
|
|
47
|
+
modelValue: Record<string, any>;
|
|
48
|
+
showMask: boolean;
|
|
49
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
50
|
+
export default _default;
|
|
51
|
+
//# sourceMappingURL=index.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.vue.d.ts","sourceRoot":"","sources":["../../../src/components/search-area/index.vue"],"names":[],"mappings":"AAsrBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAAC;IACnC,qCAAqC;IACrC,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,WAAW,GAAG;IACjB,YAAY;IACZ,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,aAAa;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;IA+TA,cAAc;;;;IAEd,aAAa;;;;;;;;;;;;;;;WAtUN,UAAU,EAAE;gBAEN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;cAErB,OAAO;;AA6mBpB,wBASG"}
|
package/dist/favicon.svg
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg width="32" height="32" viewBox="0 0 1162 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- 统一蓝色渐变 -->
|
|
4
|
+
<linearGradient id="faviconGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" style="stop-color:#1890ff;stop-opacity:1" />
|
|
6
|
+
<stop offset="100%" style="stop-color:#40a9ff;stop-opacity:1" />
|
|
7
|
+
</linearGradient>
|
|
8
|
+
</defs>
|
|
9
|
+
<path d="M1162 453.2C1162 238.2 901.8 64 581 64S0 238.2 0 453.2C0 644.8 206.6 804 478.8 836.2V960h198.2v-123c48.6-5.4 95.2-14.8 138.8-27.8L896 960h224l-134.8-227.4c109-70.8 176.8-169.8 176.8-279.4z m-933.6 29c0-147 197.8-266 441.6-266s423.8 81.4 423.8 266c0 100.2-53 170-140.6 212.8-4.8-3.2-9.4-5.8-12.8-7.4-20.4-10.4-55.6-21-55.6-21s173.2-12.8 173.2-185.4-181.2-175.8-181.2-175.8h-398V722c-148.2-43-250.4-134.2-250.4-239.8z m450.2 76.6v-111.2c115.6 0 175.6-13.6 175.6 54.6 0 73-76.4 56.6-175.6 56.6z m-1.8 145H730c21.6 0 37.8 23.4 48 38.4-32.2 3.8-66 5.6-101.2 5.8v-44.2z" fill="url(#faviconGradient)"></path>
|
|
10
|
+
</svg>
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),A=["disabled"],P={key:0,class:"rc-button__spinner"},F=e.defineComponent({__name:"index",props:{type:{default:"default"},size:{default:"medium"},plain:{type:Boolean,default:!1},block:{type:Boolean,default:!1},label:{default:""},round:{type:[Number,String,Boolean],default:6},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["click"],setup(t,{emit:n}){const o=t,s=n,r=i=>{!o.disabled&&!o.loading&&s("click",i)},d=e.computed(()=>{const i=o.round;return typeof i=="boolean"?i?"999px":"6px":typeof i=="number"?`${i}px`:String(i)});return(i,a)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["rc-button",[`rc-button--${t.type}`,`rc-button--${t.size}`,{"is-plain":t.plain,"is-block":t.block,"is-disabled":t.disabled,"is-loading":t.loading}]]),style:e.normalizeStyle({borderRadius:d.value}),disabled:t.disabled||t.loading,onClick:r},[t.loading?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.renderSlot(i.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(t.label),1)],!0)],14,A))}}),v=(t,n)=>{const o=t.__vccOpts||t;for(const[s,r]of n)o[s]=r;return o},x=v(F,[["__scopeId","data-v-a70e95bb"]]);x.name="rc-button";function N(t){return t.component(x.name,x),t}const O={class:"rc-desc-item__value"},Y=e.defineComponent({name:"rc-descriptions-item",__name:"item",props:{label:{default:""},value:{default:""},labelWidth:{default:""},span:{default:1}},setup(t){const n=t;e.inject("rcDescItemWidth",void 0),e.inject("rcDescSingleWidth",""),e.inject("rcDescGap","0px");const o=e.inject("rcDescGapPx",0),s=e.inject("rcDescColCount",1),r=e.inject("rcDescLabelWidth",""),d=e.computed(()=>{const c=typeof n.span=="string"?parseInt(n.span,10):n.span,l=typeof(s==null?void 0:s.value)=="number"?s.value:s,u=!Number.isNaN(c)&&c>0?c:1;return Math.min(u,l||1)}),i=e.computed(()=>{const c=typeof(s==null?void 0:s.value)=="number"?s.value:s,l=typeof(o==null?void 0:o.value)=="number"?o.value:o,u=d.value;if(!c||c<=1||u>=c)return"100%";const m=(c-1)*l,f=(u-1)*l;return`calc((100% - ${m}px) * ${u} / ${c} + ${f}px)`}),a=e.computed(()=>{const c=typeof(r==null?void 0:r.value)=="string"?r.value:r,l=n.labelWidth!==""?n.labelWidth:c||"";return l?{width:typeof l=="number"?`${l}px`:String(l),flex:"0 0 auto"}:{}});return(c,l)=>(e.openBlock(),e.createElementBlock("div",{class:"rc-desc-item",style:e.normalizeStyle({width:i.value,flex:`0 0 ${i.value}`})},[e.createElementVNode("div",{class:"rc-desc-item__label",style:e.normalizeStyle(a.value)},[e.renderSlot(c.$slots,"label",{},()=>[e.createTextVNode(e.toDisplayString(t.label),1)],!0)],4),e.createElementVNode("div",O,[e.renderSlot(c.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(t.value),1)],!0)])],4))}}),k=v(Y,[["__scopeId","data-v-970d0b99"]]),q={class:"rc-descriptions"},H={key:0,class:"rc-descriptions__title"},K=e.defineComponent({name:"rc-descriptions",__name:"index",props:{title:{},column:{default:2},gap:{default:4},labelWidth:{default:""},data:{default:()=>[]},keyMap:{}},setup(t){const n=t,o=e.ref(null),s=e.computed(()=>typeof n.gap=="number"?`${n.gap}px`:String(n.gap)),r=e.computed(()=>{const l=typeof n.column=="string"?Number.parseInt(n.column,10):n.column??1;return!Number.isNaN(l)&&l>0?l:1}),d=e.ref("100%"),i=e.ref("100%");e.watchEffect(()=>{const l=r.value;if(l<=1)d.value="100%",i.value="100%";else{const u=typeof n.gap=="number"?n.gap:parseFloat(String(n.gap))||0,f=`calc((100% - ${(l-1)*u}px) / ${l})`;i.value=f,d.value=f}}),e.provide("rcDescItemWidth",d),e.provide("rcDescSingleWidth",i),e.provide("rcDescColCount",r),e.provide("rcDescGapPx",e.computed(()=>typeof n.gap=="number"?n.gap:parseFloat(String(n.gap))||0));const a=e.computed(()=>n.labelWidth===""||n.labelWidth===void 0?"":typeof n.labelWidth=="number"?`${n.labelWidth}px`:String(n.labelWidth));e.provide("rcDescLabelWidth",a),e.provide("rcDescGap",e.computed(()=>typeof n.gap=="number"?`${n.gap}px`:String(n.gap)));const c=e.computed(()=>{var m,f,W;const l=((m=n.keyMap)==null?void 0:m.key)??"label",u=((f=n.keyMap)==null?void 0:f.value)??"value";return(W=n.data)!=null&&W.length?n.data.map(b=>({label:b==null?void 0:b[l],value:b==null?void 0:b[u]})):[]});return(l,u)=>(e.openBlock(),e.createElementBlock("div",q,[l.$slots.title||t.title?(e.openBlock(),e.createElementBlock("div",H,[e.renderSlot(l.$slots,"title",{},()=>[e.createTextVNode(e.toDisplayString(t.title),1)],!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",{class:"rc-descriptions__body",style:e.normalizeStyle({gap:s.value}),ref_key:"wrapEl",ref:o},[c.value.length?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(c.value,(m,f)=>(e.openBlock(),e.createBlock(k,{key:f,label:m.label,value:m.value,"label-width":t.labelWidth},null,8,["label","value","label-width"]))),128)):e.renderSlot(l.$slots,"default",{key:1},void 0,!0)],4)]))}}),$=v(K,[["__scopeId","data-v-5fcaa235"]]);$.name="rc-descriptions";k.name="rc-descriptions-item";function D(t){return t.component($.name,$),t.component("RcDescriptions",$),t.component(k.name,k),t.component("RcDescriptionsItem",k),t}const U=$,L=k,J={class:"rc-card__title"},Q={class:"rc-card__title-text"},X={key:0,class:"rc-card__status"},Z={key:1,class:"rc-card__divider"},ee={key:2,class:"rc-card__action"},te=e.defineComponent({name:"rc-card",__name:"index",props:{color:{default:"var(--rc-white)"},topBgColor:{default:"rgba(29, 133, 252, 0.05)"},title:{default:""},status:{default:""},statusColor:{default:"var(--rc-primary)"},round:{default:8},bordered:{type:Boolean,default:!1},elevation:{default:2},padding:{default:"16px"},gap:{default:12},width:{default:"100%"},height:{default:""}},setup(t){const n=t,o=e.computed(()=>{const a=typeof n.round=="boolean"?n.round?"12px":"0":typeof n.round=="number"?`${n.round}px`:String(n.round);return{backgroundColor:n.color||"var(--rc-white)",borderRadius:a,boxShadow:i(n.elevation),width:d(n.width),height:d(n.height)}}),s=e.computed(()=>n.padding||"16px"),r=e.computed(()=>typeof n.gap=="number"?`${n.gap}px`:String(n.gap));function d(a){return a==null||a===""?"":typeof a=="number"?`${a}px`:String(a)}function i(a){if(!a||a<=0)return"none";const c=4*a;return`0 ${Math.round(c/2)}px ${c}px rgba(0,0,0,0.06), 0 ${Math.round(c/4)}px ${Math.round(c/2)}px rgba(0,0,0,0.04)`}return(a,c)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["rc-card",[{"rc-card--bordered":t.bordered}]]),style:e.normalizeStyle(o.value)},[a.$slots.title||t.title||a.$slots.status||t.status?(e.openBlock(),e.createElementBlock("div",{key:0,class:"rc-card__top",style:e.normalizeStyle({backgroundColor:t.topBgColor||"rgba(29, 133, 252, 0.05)"})},[e.createElementVNode("div",J,[e.renderSlot(a.$slots,"title",{},()=>[e.createElementVNode("span",Q,e.toDisplayString(t.title),1)],!0)]),a.$slots.status||t.status?(e.openBlock(),e.createElementBlock("div",X,[e.renderSlot(a.$slots,"status",{},()=>[e.createElementVNode("span",{class:"rc-card__status-text",style:e.normalizeStyle({color:t.statusColor||"var(--rc-primary)"})},e.toDisplayString(t.status),5)],!0)])):e.createCommentVNode("",!0)],4)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:"rc-card__body",style:e.normalizeStyle({padding:s.value,gap:r.value})},[e.renderSlot(a.$slots,"content",{},()=>[e.renderSlot(a.$slots,"default",{},void 0,!0)],!0)],4),a.$slots.action?(e.openBlock(),e.createElementBlock("div",Z)):e.createCommentVNode("",!0),a.$slots.action?(e.openBlock(),e.createElementBlock("div",ee,[e.renderSlot(a.$slots,"action",{},void 0,!0)])):e.createCommentVNode("",!0)],6))}}),C=v(te,[["__scopeId","data-v-a7b95214"]]);C.name="rc-card";const ne="RcCard";function I(t){return t.component(C.name,C),t.component(ne,C),t}const oe={key:0,class:"rc-toast__mask"},ce={class:"rc-toast__content"},ae={key:0,class:"rc-toast__spinner"},le={key:1,class:"rc-toast__icon rc-toast__icon--success"},se={key:2,class:"rc-toast__icon rc-toast__icon--fail"},re={class:"rc-toast__text"},ie=e.defineComponent({__name:"index",props:{message:{default:""},type:{default:"text"},duration:{default:2e3},mask:{type:Boolean,default:!1},onAfterLeave:{}},setup(t,{expose:n}){const o=t,s=e.ref(!0);let r;function d(){r&&(clearTimeout(r),r=null)}function i(){d(),s.value=!1}return n({close:i}),e.onMounted(()=>{o.duration&&o.duration>0&&(r=setTimeout(()=>{i()},o.duration))}),e.onUnmounted(()=>{d()}),(a,c)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[e.createVNode(e.Transition,{name:"rc-toast-fade",onAfterLeave:t.onAfterLeave},{default:e.withCtx(()=>[s.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["rc-toast",[`rc-toast--${t.type}`]])},[t.mask?(e.openBlock(),e.createElementBlock("div",oe)):e.createCommentVNode("",!0),e.createElementVNode("div",ce,[t.type==="loading"?(e.openBlock(),e.createElementBlock("div",ae)):t.type==="success"?(e.openBlock(),e.createElementBlock("div",le)):t.type==="fail"?(e.openBlock(),e.createElementBlock("div",se)):e.createCommentVNode("",!0),e.createElementVNode("div",re,e.toDisplayString(t.message),1)])],2)):e.createCommentVNode("",!0)]),_:1},8,["onAfterLeave"])])),e.renderSlot(a.$slots,"default",{},void 0,!0)],64))}}),S=v(ie,[["__scopeId","data-v-d234c9c5"]]);let g=null,_=null;function T(){g&&(g.unmount(),g=null),_&&(document.body.removeChild(_),_=null)}function de(t){const n=typeof t=="string"?{message:t}:t||{};T(),_=document.createElement("div"),document.body.appendChild(_);const o={message:n.message,type:n.type??"text",duration:n.duration??2e3,mask:n.mask??!1,onAfterLeave:()=>{var s;T(),(s=n.onClose)==null||s.call(n)}};return g=e.createApp(S,o),g.mount(_),{close:G}}function G(){var t,n,o;g&&((o=(n=(t=g._instance)==null?void 0:t.exposed)==null?void 0:n.close)==null||o.call(n))}S.name="rc-toast";function M(t){return t.component(S.name,S),t}const ue={class:"rc-message",role:"alert","aria-live":"polite"},me={class:"rc-message__content"},fe=e.defineComponent({__name:"index",setup(t,{expose:n}){const o=e.reactive([]);let s=1;function r(i){const a=o.findIndex(c=>c.id===i);a>=0&&o.splice(a,1)}function d(i,a,c){const l=s++;return o.push({id:l,type:i,content:a,duration:c}),c>0&&window.setTimeout(()=>r(l),c),l}return n({add:d,remove:r}),(i,a)=>(e.openBlock(),e.createElementBlock("div",ue,[e.createVNode(e.TransitionGroup,{name:"rc-message-fade",tag:"div"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o,c=>(e.openBlock(),e.createElementBlock("div",{key:c.id,class:e.normalizeClass(["rc-message__item",`rc-message--${c.type}`])},[e.createElementVNode("span",me,e.toDisplayString(c.content),1)],2))),128))]),_:1})]))}}),pe=v(fe,[["__scopeId","data-v-87811df0"]]);let y=null,p=null;function ye(){var n;if(y&&p)return;y=document.createElement("div"),document.body.appendChild(y);const t=e.createVNode(pe,{});e.render(t,y),p=(n=t.component)==null?void 0:n.exposed}function h(t,n,o){var r;ye();const s=typeof o=="number"?o:t==="loading"?0:2e3;return(r=p==null?void 0:p.add)==null?void 0:r.call(p,t,n,s)}const j={open(t){return h(t.type||"info",t.content,t.duration)},info(t,n){return h("info",t,n)},success(t,n){return h("success",t,n)},warning(t,n){return h("warning",t,n)},error(t,n){return h("error",t,n)},loading(t,n){return h("loading",t,n)},destroy(){y&&(e.render(null,y),y.remove(),y=null,p=null)}};function w(t){return t.config.globalProperties.$message=j,t}const ge={key:0,class:"rc-icon__unicode"},ve=e.defineComponent({name:"rc-icon",__name:"index",props:{name:{},size:{default:16},color:{default:""},spin:{type:Boolean,default:!1},code:{default:""}},setup(t){const n=t,o=e.inject(E,{}),s=e.computed(()=>(o==null?void 0:o.iconClass)||"iconfont"),r=e.computed(()=>n.name||""),d=e.computed(()=>typeof n.size=="number"?`${n.size}px`:n.size||"16px"),i=e.computed(()=>({fontSize:d.value,color:n.color||void 0,lineHeight:1,fontFamily:(o==null?void 0:o.iconClass)||"iconfont"})),a=e.computed(()=>{const c=n.code;if(c==null||c===""||c===0)return"";if(typeof c=="number")return String.fromCharCode(c);const l=String(c).replace(/^0x/i,""),u=parseInt(l,16);return Number.isNaN(u)?"":String.fromCharCode(u)});return e.onMounted(()=>{if(typeof window>"u")return;const c=o&&o.iconCssUrl||z.iconCssUrl;if(!c)return;const l=`link[rel="stylesheet"][data-rcui-icon="true"][href="${c}"]`;if(!document.head.querySelector(l)){const m=document.createElement("link");m.rel="stylesheet",m.href=c,m.setAttribute("data-rcui-icon","true"),document.head.appendChild(m)}}),(c,l)=>(e.openBlock(),e.createElementBlock("i",{class:e.normalizeClass(["rc-icon",[s.value,r.value,{"rc-icon--spin":t.spin}]]),style:e.normalizeStyle(i.value),"aria-hidden":"true"},[a.value?(e.openBlock(),e.createElementBlock("span",ge,e.toDisplayString(a.value),1)):e.createCommentVNode("",!0)],6))}}),B=v(ve,[["__scopeId","data-v-3857a892"]]);B.name="rc-icon";function V(t){return t.component(B.name,B),t.component("RcIcon",B),t}const E=Symbol("RECYCLE_UI_CONFIG"),z={prefix:"rc",autoRegister:!0,provideKey:E,theme:{},iconCssUrl:"//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css",iconClass:"iconfont"};function be(t,n){n.autoRegister!==!1&&(typeof N=="function"&&N(t),typeof D=="function"&&D(t),typeof I=="function"&&I(t),typeof M=="function"&&M(t),typeof V=="function"&&V(t),typeof w=="function"&&w(t))}const R=(t,n)=>{const o={...z,...n||{}};if(t.provide(o.provideKey??E,o),t.config.globalProperties.$recycleUI=o,typeof window<"u"&&o.iconCssUrl){const s=`link[rel="stylesheet"][data-rcui-icon="true"][href="${o.iconCssUrl}"]`;if(!document.head.querySelector(s)){const d=document.createElement("link");d.rel="stylesheet",d.href=o.iconCssUrl,d.setAttribute("data-rcui-icon","true"),document.head.appendChild(d)}}return be(t,o),t},he={install:R};function ke(t){return{install(n){R(n,t)}}}exports.RECYCLE_UI_SYMBOL=E;exports.RcButton=x;exports.RcCard=C;exports.RcDescriptions=U;exports.RcDescriptionsItem=L;exports.RcIcon=B;exports.RcToast=S;exports.createRecycleUI=ke;exports.default=he;exports.defaultRecycleUIConfig=z;exports.hideToast=G;exports.install=R;exports.installButton=N;exports.installCard=I;exports.installDescriptions=D;exports.installIcon=V;exports.installMessage=w;exports.message=j;exports.rcDescriptions=U;exports.rcDescriptionsItem=L;exports.showToast=de;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),me=["disabled"],fe={key:0,class:"rc-button__spinner"},pe=e.defineComponent({__name:"index",props:{type:{default:"default"},size:{default:"medium"},plain:{type:Boolean,default:!1},block:{type:Boolean,default:!1},label:{default:""},round:{type:[Number,String,Boolean],default:6},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["click"],setup(t,{emit:n}){const l=t,i=n,m=f=>{!l.disabled&&!l.loading&&i("click",f)},d=e.computed(()=>{const f=l.round;return typeof f=="boolean"?f?"999px":"6px":typeof f=="number"?`${f}px`:String(f)});return(f,c)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["rc-button",[`rc-button--${t.type}`,`rc-button--${t.size}`,{"is-plain":t.plain,"is-block":t.block,"is-disabled":t.disabled,"is-loading":t.loading}]]),style:e.normalizeStyle({borderRadius:d.value}),disabled:t.disabled||t.loading,onClick:m},[t.loading?(e.openBlock(),e.createElementBlock("span",fe)):e.createCommentVNode("",!0),e.renderSlot(f.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(t.label),1)],!0)],14,me))}}),E=(t,n)=>{const l=t.__vccOpts||t;for(const[i,m]of n)l[i]=m;return l},D=E(pe,[["__scopeId","data-v-a70e95bb"]]);D.name="rc-button";function F(t){return t.component(D.name,D),t}const ve={class:"rc-desc-item__value"},ye=e.defineComponent({name:"rc-descriptions-item",__name:"item",props:{label:{default:""},value:{default:""},labelWidth:{default:""},span:{default:1}},setup(t){const n=t;e.inject("rcDescItemWidth",void 0),e.inject("rcDescSingleWidth",""),e.inject("rcDescGap","0px");const l=e.inject("rcDescGapPx",0),i=e.inject("rcDescColCount",1),m=e.inject("rcDescLabelWidth",""),d=e.computed(()=>{const r=typeof n.span=="string"?parseInt(n.span,10):n.span,s=typeof(i==null?void 0:i.value)=="number"?i.value:i,g=!Number.isNaN(r)&&r>0?r:1;return Math.min(g,s||1)}),f=e.computed(()=>{const r=typeof(i==null?void 0:i.value)=="number"?i.value:i,s=typeof(l==null?void 0:l.value)=="number"?l.value:l,g=d.value;if(!r||r<=1||g>=r)return"100%";const v=(r-1)*s,k=(g-1)*s;return`calc((100% - ${v}px) * ${g} / ${r} + ${k}px)`}),c=e.computed(()=>{const r=typeof(m==null?void 0:m.value)=="string"?m.value:m,s=n.labelWidth!==""?n.labelWidth:r||"";return s?{width:typeof s=="number"?`${s}px`:String(s),flex:"0 0 auto"}:{}});return(r,s)=>(e.openBlock(),e.createElementBlock("div",{class:"rc-desc-item",style:e.normalizeStyle({width:f.value,flex:`0 0 ${f.value}`})},[e.createElementVNode("div",{class:"rc-desc-item__label",style:e.normalizeStyle(c.value)},[e.renderSlot(r.$slots,"label",{},()=>[e.createTextVNode(e.toDisplayString(t.label),1)],!0)],4),e.createElementVNode("div",ve,[e.renderSlot(r.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(t.value),1)],!0)])],4))}}),x=E(ye,[["__scopeId","data-v-970d0b99"]]),ke={class:"rc-descriptions"},ge={key:0,class:"rc-descriptions__title"},he=e.defineComponent({name:"rc-descriptions",__name:"index",props:{title:{},column:{default:2},gap:{default:4},labelWidth:{default:""},data:{default:()=>[]},keyMap:{}},setup(t){const n=t,l=e.ref(null),i=e.computed(()=>typeof n.gap=="number"?`${n.gap}px`:String(n.gap)),m=e.computed(()=>{const s=typeof n.column=="string"?Number.parseInt(n.column,10):n.column??1;return!Number.isNaN(s)&&s>0?s:1}),d=e.ref("100%"),f=e.ref("100%");e.watchEffect(()=>{const s=m.value;if(s<=1)d.value="100%",f.value="100%";else{const g=typeof n.gap=="number"?n.gap:parseFloat(String(n.gap))||0,k=`calc((100% - ${(s-1)*g}px) / ${s})`;f.value=k,d.value=k}}),e.provide("rcDescItemWidth",d),e.provide("rcDescSingleWidth",f),e.provide("rcDescColCount",m),e.provide("rcDescGapPx",e.computed(()=>typeof n.gap=="number"?n.gap:parseFloat(String(n.gap))||0));const c=e.computed(()=>n.labelWidth===""||n.labelWidth===void 0?"":typeof n.labelWidth=="number"?`${n.labelWidth}px`:String(n.labelWidth));e.provide("rcDescLabelWidth",c),e.provide("rcDescGap",e.computed(()=>typeof n.gap=="number"?`${n.gap}px`:String(n.gap)));const r=e.computed(()=>{var v,k,y;const s=((v=n.keyMap)==null?void 0:v.key)??"label",g=((k=n.keyMap)==null?void 0:k.value)??"value";return(y=n.data)!=null&&y.length?n.data.map(C=>({label:C==null?void 0:C[s],value:C==null?void 0:C[g]})):[]});return(s,g)=>(e.openBlock(),e.createElementBlock("div",ke,[s.$slots.title||t.title?(e.openBlock(),e.createElementBlock("div",ge,[e.renderSlot(s.$slots,"title",{},()=>[e.createTextVNode(e.toDisplayString(t.title),1)],!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",{class:"rc-descriptions__body",style:e.normalizeStyle({gap:i.value}),ref_key:"wrapEl",ref:l},[r.value.length?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(r.value,(v,k)=>(e.openBlock(),e.createBlock(x,{key:k,label:v.label,value:v.value,"label-width":t.labelWidth},null,8,["label","value","label-width"]))),128)):e.renderSlot(s.$slots,"default",{key:1},void 0,!0)],4)]))}}),I=E(he,[["__scopeId","data-v-5fcaa235"]]);I.name="rc-descriptions";x.name="rc-descriptions-item";function O(t){return t.component(I.name,I),t.component("RcDescriptions",I),t.component(x.name,x),t.component("RcDescriptionsItem",x),t}const ee=I,te=x,_e={class:"rc-card__title"},be={class:"rc-card__title-text"},Ce={key:0,class:"rc-card__status"},Be={key:1,class:"rc-card__divider"},$e={key:2,class:"rc-card__action"},Se=e.defineComponent({name:"rc-card",__name:"index",props:{color:{default:"var(--rc-white)"},topBgColor:{default:"rgba(29, 133, 252, 0.05)"},title:{default:""},status:{default:""},statusColor:{default:"var(--rc-primary)"},round:{default:8},bordered:{type:Boolean,default:!1},elevation:{default:2},padding:{default:"16px"},gap:{default:12},width:{default:"100%"},height:{default:""}},setup(t){const n=t,l=e.computed(()=>{const c=typeof n.round=="boolean"?n.round?"12px":"0":typeof n.round=="number"?`${n.round}px`:String(n.round);return{backgroundColor:n.color||"var(--rc-white)",borderRadius:c,boxShadow:f(n.elevation),width:d(n.width),height:d(n.height)}}),i=e.computed(()=>n.padding||"16px"),m=e.computed(()=>typeof n.gap=="number"?`${n.gap}px`:String(n.gap));function d(c){return c==null||c===""?"":typeof c=="number"?`${c}px`:String(c)}function f(c){if(!c||c<=0)return"none";const r=4*c;return`0 ${Math.round(r/2)}px ${r}px rgba(0,0,0,0.06), 0 ${Math.round(r/4)}px ${Math.round(r/2)}px rgba(0,0,0,0.04)`}return(c,r)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["rc-card",[{"rc-card--bordered":t.bordered}]]),style:e.normalizeStyle(l.value)},[c.$slots.title||t.title||c.$slots.status||t.status?(e.openBlock(),e.createElementBlock("div",{key:0,class:"rc-card__top",style:e.normalizeStyle({backgroundColor:t.topBgColor||"rgba(29, 133, 252, 0.05)"})},[e.createElementVNode("div",_e,[e.renderSlot(c.$slots,"title",{},()=>[e.createElementVNode("span",be,e.toDisplayString(t.title),1)],!0)]),c.$slots.status||t.status?(e.openBlock(),e.createElementBlock("div",Ce,[e.renderSlot(c.$slots,"status",{},()=>[e.createElementVNode("span",{class:"rc-card__status-text",style:e.normalizeStyle({color:t.statusColor||"var(--rc-primary)"})},e.toDisplayString(t.status),5)],!0)])):e.createCommentVNode("",!0)],4)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:"rc-card__body",style:e.normalizeStyle({padding:i.value,gap:m.value})},[e.renderSlot(c.$slots,"content",{},()=>[e.renderSlot(c.$slots,"default",{},void 0,!0)],!0)],4),c.$slots.action?(e.openBlock(),e.createElementBlock("div",Be)):e.createCommentVNode("",!0),c.$slots.action?(e.openBlock(),e.createElementBlock("div",$e,[e.renderSlot(c.$slots,"action",{},void 0,!0)])):e.createCommentVNode("",!0)],6))}}),R=E(Se,[["__scopeId","data-v-a7b95214"]]);R.name="rc-card";const Ee="RcCard";function j(t){return t.component(R.name,R),t.component(Ee,R),t}const Ve={key:0,class:"rc-toast__mask"},Ne={class:"rc-toast__content"},xe={key:0,class:"rc-toast__spinner"},we={key:1,class:"rc-toast__icon rc-toast__icon--success"},De={key:2,class:"rc-toast__icon rc-toast__icon--fail"},Ie={class:"rc-toast__text"},Re=e.defineComponent({__name:"index",props:{message:{default:""},type:{default:"text"},duration:{default:2e3},mask:{type:Boolean,default:!1},onAfterLeave:{}},setup(t,{expose:n}){const l=t,i=e.ref(!0);let m;function d(){m&&(clearTimeout(m),m=null)}function f(){d(),i.value=!1}return n({close:f}),e.onMounted(()=>{l.duration&&l.duration>0&&(m=setTimeout(()=>{f()},l.duration))}),e.onUnmounted(()=>{d()}),(c,r)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[e.createVNode(e.Transition,{name:"rc-toast-fade",onAfterLeave:t.onAfterLeave},{default:e.withCtx(()=>[i.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["rc-toast",[`rc-toast--${t.type}`]])},[t.mask?(e.openBlock(),e.createElementBlock("div",Ve)):e.createCommentVNode("",!0),e.createElementVNode("div",Ne,[t.type==="loading"?(e.openBlock(),e.createElementBlock("div",xe)):t.type==="success"?(e.openBlock(),e.createElementBlock("div",we)):t.type==="fail"?(e.openBlock(),e.createElementBlock("div",De)):e.createCommentVNode("",!0),e.createElementVNode("div",Ie,e.toDisplayString(t.message),1)])],2)):e.createCommentVNode("",!0)]),_:1},8,["onAfterLeave"])])),e.renderSlot(c.$slots,"default",{},void 0,!0)],64))}}),z=E(Re,[["__scopeId","data-v-d234c9c5"]]);let V=null,w=null;function X(){V&&(V.unmount(),V=null),w&&(document.body.removeChild(w),w=null)}function ze(t){const n=typeof t=="string"?{message:t}:t||{};X(),w=document.createElement("div"),document.body.appendChild(w);const l={message:n.message,type:n.type??"text",duration:n.duration??2e3,mask:n.mask??!1,onAfterLeave:()=>{var i;X(),(i=n.onClose)==null||i.call(n)}};return V=e.createApp(z,l),V.mount(w),{close:ne}}function ne(){var t,n,l;V&&((l=(n=(t=V._instance)==null?void 0:t.exposed)==null?void 0:n.close)==null||l.call(n))}z.name="rc-toast";function Z(t){return t.component(z.name,z),t}const Ae={class:"rc-message",role:"alert","aria-live":"polite"},Te={class:"rc-message__content"},Le=e.defineComponent({__name:"index",setup(t,{expose:n}){const l=e.reactive([]);let i=1;function m(f){const c=l.findIndex(r=>r.id===f);c>=0&&l.splice(c,1)}function d(f,c,r){const s=i++;return l.push({id:s,type:f,content:c,duration:r}),r>0&&window.setTimeout(()=>m(s),r),s}return n({add:d,remove:m}),(f,c)=>(e.openBlock(),e.createElementBlock("div",Ae,[e.createVNode(e.TransitionGroup,{name:"rc-message-fade",tag:"div"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l,r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:e.normalizeClass(["rc-message__item",`rc-message--${r.type}`])},[e.createElementVNode("span",Te,e.toDisplayString(r.content),1)],2))),128))]),_:1})]))}}),We=E(Le,[["__scopeId","data-v-87811df0"]]);let $=null,B=null;function Me(){var n;if($&&B)return;$=document.createElement("div"),document.body.appendChild($);const t=e.createVNode(We,{});e.render(t,$),B=(n=t.component)==null?void 0:n.exposed}function N(t,n,l){var m;Me();const i=typeof l=="number"?l:t==="loading"?0:2e3;return(m=B==null?void 0:B.add)==null?void 0:m.call(B,t,n,i)}const oe={open(t){return N(t.type||"info",t.content,t.duration)},info(t,n){return N("info",t,n)},success(t,n){return N("success",t,n)},warning(t,n){return N("warning",t,n)},error(t,n){return N("error",t,n)},loading(t,n){return N("loading",t,n)},destroy(){$&&(e.render(null,$),$.remove(),$=null,B=null)}};function G(t){return t.config.globalProperties.$message=oe,t}const Ue={key:0,class:"rc-icon__unicode"},Fe=e.defineComponent({name:"rc-icon",__name:"index",props:{name:{},size:{default:16},color:{default:""},spin:{type:Boolean,default:!1},code:{default:""}},setup(t){const n=t,l=e.inject(W,{}),i=e.computed(()=>(l==null?void 0:l.iconClass)||"iconfont"),m=e.computed(()=>n.name||""),d=e.computed(()=>typeof n.size=="number"?`${n.size}px`:n.size||"16px"),f=e.computed(()=>({fontSize:d.value,color:n.color||void 0,lineHeight:1,fontFamily:(l==null?void 0:l.iconClass)||"iconfont"})),c=e.computed(()=>{const r=n.code;if(r==null||r===""||r===0)return"";if(typeof r=="number")return String.fromCharCode(r);const s=String(r).replace(/^0x/i,""),g=parseInt(s,16);return Number.isNaN(g)?"":String.fromCharCode(g)});return e.onMounted(()=>{if(typeof window>"u")return;const r=l&&l.iconCssUrl||H.iconCssUrl;if(!r)return;const s=`link[rel="stylesheet"][data-rcui-icon="true"][href="${r}"]`;if(!document.head.querySelector(s)){const v=document.createElement("link");v.rel="stylesheet",v.href=r,v.setAttribute("data-rcui-icon","true"),document.head.appendChild(v)}}),(r,s)=>(e.openBlock(),e.createElementBlock("i",{class:e.normalizeClass(["rc-icon",[i.value,m.value,{"rc-icon--spin":t.spin}]]),style:e.normalizeStyle(f.value),"aria-hidden":"true"},[c.value?(e.openBlock(),e.createElementBlock("span",Ue,e.toDisplayString(c.value),1)):e.createCommentVNode("",!0)],6))}}),S=E(Fe,[["__scopeId","data-v-3857a892"]]);S.name="rc-icon";function P(t){return t.component(S.name,S),t.component("RcIcon",S),t}const Oe={class:"rc-search-area"},je={class:"rc-search-area__bar"},Ge=["onClick"],Pe={class:"rc-search-area__item-label"},Ye={class:"rc-search-area__panel-content"},qe={key:0,class:"rc-search-area__options-grid"},He=["onClick"],Ke={class:"rc-search-area__option-label"},Je={key:1,class:"rc-search-area__options-grid"},Qe=["onClick"],Xe={class:"rc-search-area__option-label"},Ze={key:2,class:"rc-search-area__empty"},et={class:"rc-search-area__panel-footer"},tt=e.defineComponent({name:"rc-search-area",__name:"index",props:{items:{default:()=>[]},modelValue:{default:()=>({})},showMask:{type:Boolean,default:!0}},emits:["update:modelValue","change","confirm","reset","item-change"],setup(t,{expose:n,emit:l}){const i=t,m=l,d=e.ref(null),f=e.ref(null),c=e.ref(null),r=e.ref({top:"0px"}),s=async()=>{if(d.value===null||!f.value)return;await e.nextTick();const a=f.value.getBoundingClientRect().top;r.value={top:`${a}px`}},g=o=>{if(d.value===null||!f.value)return;const a=o.target;if(f.value.contains(a))return;const u=f.value.closest(".rc-search-area");if(u){const p=u.querySelector(".rc-search-area__bar");if(p&&p.contains(a))return}M()};e.watch(d,async o=>{o!==null?(await e.nextTick(),s(),window.addEventListener("resize",s),window.addEventListener("scroll",s,!0),document.addEventListener("click",g,!0)):(window.removeEventListener("resize",s),window.removeEventListener("scroll",s,!0),document.removeEventListener("click",g,!0))}),e.onUnmounted(()=>{window.removeEventListener("resize",s),window.removeEventListener("scroll",s,!0),document.removeEventListener("click",g,!0)});const v=e.ref({}),k=e.ref({...i.modelValue});e.watch(()=>i.modelValue,o=>{k.value={...o||{}}},{deep:!0,immediate:!0});const y=e.computed(()=>d.value===null?null:i.items[d.value]),C=e.computed(()=>{if(!y.value)return"";const o=ue(y.value);return o>0?`(${o}项)`:""}),ae=o=>{const a=k.value[o.key];if(a==null||a==="")return o.label;if(o.type==="single"){const u=J(o,a);if(u)return`${o.label}: ${A(u)}`}else{const u=Array.isArray(a)?a:[a];if(u.length>0){const p=u.map(h=>{const _=J(o,h);return _?A(_):null}).filter(h=>h!==null);if(p.length>0)return`${o.label}: ${p.join("、")}`}}return o.label},le=o=>{const a=i.items[o];if(!a)return;if(d.value===o){d.value=null;return}const u=k.value[a.key];a.type==="single"?v.value[a.key]=u!==void 0?u:null:v.value[a.key]=u!==void 0?Array.isArray(u)?[...u]:[u]:[],d.value=o},M=()=>{d.value=null},A=o=>typeof o=="string"?o:o.label||String(o.value),T=o=>typeof o=="string"?o:o.value!==void 0?o.value:o,J=(o,a)=>o.options.find(u=>{const p=T(u);return p===a||String(p)===String(a)})||null,L=o=>{if(!y.value)return!1;const a=y.value.key,u=v.value[a],p=T(o);return y.value.type==="single"?u!=null&&u===p:(Array.isArray(u)?u:[]).some(_=>_===p||String(_)===String(p))},re=o=>{if(!y.value)return;const a=y.value.key,u=T(o);v.value[a]===u?v.value[a]=null:v.value[a]=u},ce=o=>{if(!y.value)return;const a=y.value.key,u=T(o),p=Array.isArray(v.value[a])?[...v.value[a]]:[],h=p.findIndex(_=>_===u||String(_)===String(u));h>=0?p.splice(h,1):p.push(u),v.value[a]=p},se=()=>{if(!y.value)return;const o=y.value.key;y.value.type==="single"?v.value[o]=null:v.value[o]=[]},ie=()=>{if(!y.value)return;const o=y.value.key,a=v.value[o],u=k.value[o];let p;y.value.type==="single"?(p=a??void 0,k.value[o]=p):(p=Array.isArray(a)&&a.length>0?a:void 0,k.value[o]=p),m("update:modelValue",{...k.value}),m("change",{...k.value},y.value),m("confirm",{...k.value},y.value),JSON.stringify(u)!==JSON.stringify(p)&&m("item-change",o,p),M()},Q=o=>{const a=k.value[o.key];return a==null||a===""?0:o.type==="single"?1:Array.isArray(a)?a.length:a?1:0},ue=o=>{const a=v.value[o.key];return a==null||a===""?0:o.type==="single"?1:Array.isArray(a)?a.length:0};return n({getValues:()=>({...k.value}),reset:()=>{k.value={},v.value={},m("update:modelValue",{}),m("change",{},null),m("reset")}}),(o,a)=>(e.openBlock(),e.createElementBlock("div",Oe,[e.createElementVNode("div",je,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.items,(u,p)=>(e.openBlock(),e.createElementBlock("div",{key:p,class:e.normalizeClass(["rc-search-area__item",{"is-active":d.value===p,"has-value":Q(u)>0}]),onClick:h=>le(p)},[e.createElementVNode("span",Pe,e.toDisplayString(ae(u)),1),e.createVNode(e.unref(S),{name:"icon_a-xiala2",color:d.value!==p&&Q(u)>0?"#1677ff":"#969799",class:e.normalizeClass(["rc-search-area__item-arrow",{"is-up":d.value===p}])},null,8,["color","class"])],10,Ge))),128))]),e.createVNode(e.Transition,{name:"rc-search-area-fade"},{default:e.withCtx(()=>[d.value!==null&&i.showMask?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"maskRef",ref:c,class:"rc-search-area__mask",style:e.normalizeStyle(r.value),onClick:M},null,4)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(e.Transition,{name:"rc-search-area-slide"},{default:e.withCtx(()=>{var u,p,h,_;return[d.value!==null?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"panelRef",ref:f,class:"rc-search-area__panel"},[e.createElementVNode("div",Ye,[((u=y.value)==null?void 0:u.type)==="single"?(e.openBlock(),e.createElementBlock("div",qe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value.options,(b,U)=>(e.openBlock(),e.createElementBlock("div",{key:U,class:e.normalizeClass(["rc-search-area__option",{"is-selected":L(b)}]),onClick:de=>re(b)},[e.createElementVNode("span",Ke,e.toDisplayString(A(b)),1),L(b)?(e.openBlock(),e.createBlock(e.unref(S),{key:0,name:"icon_select",class:"rc-search-area__option-check"})):e.createCommentVNode("",!0)],10,He))),128))])):(e.openBlock(),e.createElementBlock("div",Je,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(((p=y.value)==null?void 0:p.options)||[],(b,U)=>(e.openBlock(),e.createElementBlock("div",{key:U,class:e.normalizeClass(["rc-search-area__option",{"is-selected":L(b)}]),onClick:de=>ce(b)},[e.createElementVNode("span",Xe,e.toDisplayString(A(b)),1),L(b)?(e.openBlock(),e.createBlock(e.unref(S),{key:0,name:"icon_select",class:"rc-search-area__option-check"})):e.createCommentVNode("",!0)],10,Qe))),128))])),((_=(h=y.value)==null?void 0:h.options)==null?void 0:_.length)===0?(e.openBlock(),e.createElementBlock("div",Ze,[...a[0]||(a[0]=[e.createElementVNode("p",null,"暂无选项",-1)])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",et,[e.createVNode(e.unref(D),{block:"",onClick:se},{default:e.withCtx(()=>[...a[1]||(a[1]=[e.createTextVNode(" 重置 ",-1)])]),_:1}),e.createVNode(e.unref(D),{type:"primary",block:"",onClick:ie},{default:e.withCtx(()=>[e.createTextVNode(" 确定"+e.toDisplayString(C.value),1)]),_:1})])],512)):e.createCommentVNode("",!0)]}),_:1})]))}}),Y=E(tt,[["__scopeId","data-v-6a70650d"]]),q=t=>{t.component("RcSearchArea",Y),t.component("rc-search-area",Y)},W=Symbol("RECYCLE_UI_CONFIG"),H={prefix:"rc",autoRegister:!0,provideKey:W,theme:{},iconCssUrl:"//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css",iconClass:"iconfont"};function nt(t,n){n.autoRegister!==!1&&(typeof F=="function"&&F(t),typeof O=="function"&&O(t),typeof j=="function"&&j(t),typeof Z=="function"&&Z(t),typeof P=="function"&&P(t),typeof G=="function"&&G(t),typeof q=="function"&&q(t))}const K=(t,n)=>{const l={...H,...n||{}};if(t.provide(l.provideKey??W,l),t.config.globalProperties.$recycleUI=l,typeof window<"u"&&l.iconCssUrl){const i=`link[rel="stylesheet"][data-rcui-icon="true"][href="${l.iconCssUrl}"]`;if(!document.head.querySelector(i)){const d=document.createElement("link");d.rel="stylesheet",d.href=l.iconCssUrl,d.setAttribute("data-rcui-icon","true"),document.head.appendChild(d)}}return nt(t,l),t},ot={install:K};function at(t){return{install(n){K(n,t)}}}exports.RECYCLE_UI_SYMBOL=W;exports.RcButton=D;exports.RcCard=R;exports.RcDescriptions=ee;exports.RcDescriptionsItem=te;exports.RcIcon=S;exports.RcSearchArea=Y;exports.RcToast=z;exports.createRecycleUI=at;exports.default=ot;exports.defaultRecycleUIConfig=H;exports.hideToast=ne;exports.install=K;exports.installButton=F;exports.installCard=j;exports.installDescriptions=O;exports.installIcon=P;exports.installMessage=G;exports.installSearchArea=q;exports.message=oe;exports.rcDescriptions=ee;exports.rcDescriptionsItem=te;exports.showToast=ze;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/components/button/index.vue","../src/components/button/index.ts","../src/components/descriptions/item.vue","../src/components/descriptions/index.vue","../src/components/descriptions/index.ts","../src/components/card/index.vue","../src/components/card/index.ts","../src/components/toast/index.vue","../src/components/toast/index.ts","../src/components/message/index.vue","../src/components/message/index.ts","../src/components/icon/index.vue","../src/components/icon/index.ts","../src/index.ts"],"sourcesContent":["<template>\r\n <button\r\n class=\"rc-button\"\r\n :class=\"[`rc-button--${type}`, `rc-button--${size}`, { 'is-plain': plain, 'is-block': block, 'is-disabled': disabled, 'is-loading': loading }]\"\r\n :style=\"{ borderRadius: radius }\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"onClick\"\r\n >\r\n <span v-if=\"loading\" class=\"rc-button__spinner\" />\r\n <slot>{{ label }}</slot>\r\n </button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\ntype ButtonType = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype ButtonSize = 'mini' | 'small' | 'medium' | 'large';\r\n\r\ninterface Props {\r\n type?: ButtonType;\r\n size?: ButtonSize;\r\n plain?: boolean;\r\n block?: boolean;\r\n /** 按钮文本,提供时可不写默认插槽 */\r\n label?: string;\r\n /** 圆角;number 代表 px,string 支持百分比等写法(如 '50%')。也兼容 boolean,true 表示大圆角。 */\r\n round?: number | string | boolean;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'default',\r\n size: 'medium',\r\n plain: false,\r\n block: false,\r\n label: '',\r\n round: 6,\r\n disabled: false,\r\n loading: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: 'click', ev: MouseEvent): void\r\n}>();\r\n\r\nconst onClick = (ev: MouseEvent) => {\r\n if (!props.disabled && !props.loading) emit('click', ev);\r\n};\r\n\r\nconst radius = computed(() => {\r\n const v = props.round;\r\n if (typeof v === 'boolean') return v ? '999px' : '6px';\r\n if (typeof v === 'number') return `${v}px`;\r\n return String(v);\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.rc-button {\r\n --rc-primary: #1677ff;\r\n --rc-success: #00b578;\r\n --rc-warning: #ff8f1f;\r\n --rc-danger: #ff3141;\r\n --rc-text: #323233;\r\n --rc-border: #dcdee0;\r\n --rc-white: #ffffff;\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 36px;\r\n padding: 0 16px;\r\n border: 1px solid var(--rc-border);\r\n border-radius: 6px;\r\n background: var(--rc-white);\r\n color: var(--rc-text);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: all .2s ease;\r\n\r\n &.is-disabled { cursor: not-allowed; opacity: .6; }\r\n &.is-block { display: flex; width: 100%; }\r\n &.is-plain { background: var(--rc-white); }\r\n &.is-loading { opacity: .85; }\r\n\r\n &__spinner {\r\n width: 14px;\r\n height: 14px;\r\n margin-right: 6px;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: rc-spin 0.8s linear infinite;\r\n }\r\n\r\n &--primary { background: var(--rc-primary); color: var(--rc-white); border-color: var(--rc-primary); }\r\n &--success { background: var(--rc-success); color: var(--rc-white); border-color: var(--rc-success); }\r\n &--warning { background: var(--rc-warning); color: var(--rc-white); border-color: var(--rc-warning); }\r\n &--danger { background: var(--rc-danger); color: var(--rc-white); border-color: var(--rc-danger); }\r\n\r\n &--mini { height: 24px; padding: 0 8px; font-size: 12px; }\r\n &--small { height: 28px; padding: 0 10px; font-size: 13px; }\r\n &--medium { height: 36px; padding: 0 16px; font-size: 14px; }\r\n &--large { height: 44px; padding: 0 20px; font-size: 16px; }\r\n}\r\n\r\n@keyframes rc-spin { to { transform: rotate(360deg) } }\r\n</style>\r\n\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Button from './index.vue';\r\n\r\n// 组件名使用全小写,以 <rc-button> 形式在模板中使用\r\n(Button as any).name = 'rc-button';\r\n\r\nexport function install(app: App) {\r\n app.component((Button as any).name, Button);\r\n return app;\r\n}\r\n\r\n\r\nexport default Button;\r\n","<template>\n <div class=\"rc-desc-item\" :style=\"{ width: computedWidth, flex: `0 0 ${computedWidth}` }\">\n <div class=\"rc-desc-item__label\" :style=\"labelStyle\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </div>\n <div class=\"rc-desc-item__value\">\n <slot>\n {{ value }}\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, Ref } from 'vue';\n\ndefineOptions({ name: 'rc-descriptions-item' });\n\nconst props = withDefaults(defineProps<{\n label?: string | number;\n value?: any;\n labelWidth?: string | number;\n /** 跨越的列数,默认 1,可传字符串数字 */\n span?: number | string;\n}>(), {\n label: '',\n value: '',\n labelWidth: '',\n span: 1,\n});\n\nconst providedWidth = inject<Ref<string>>('rcDescItemWidth', undefined as unknown as Ref<string>);\nconst providedSingleWidth = inject<Ref<string> | string>('rcDescSingleWidth', '' as unknown as Ref<string>);\nconst providedGap = inject<string>('rcDescGap', '0px');\nconst providedGapPx = inject<Ref<number> | number>('rcDescGapPx', 0 as unknown as Ref<number>);\nconst providedColCount = inject<Ref<number> | number>('rcDescColCount', 1 as unknown as Ref<number>);\nconst providedLabelWidth = inject<Ref<string> | string>('rcDescLabelWidth', '' as unknown as Ref<string>);\n\nconst spanNum = computed(() => {\n const n = typeof props.span === 'string' ? parseInt(props.span, 10) : props.span;\n const max = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const safe = !Number.isNaN(n as number) && (n as number) > 0 ? (n as number) : 1;\n return Math.min(safe, max || 1);\n});\n\nconst computedWidth = computed(() => {\n const n = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const gapPx = typeof (providedGapPx as any)?.value === 'number' ? (providedGapPx as any).value : (providedGapPx as any);\n const k = spanNum.value;\n if (!n || n <= 1) return '100%';\n if (k >= n) return '100%';\n // 展开为单层 calc:((100% - (n-1)*gap) * k / n + (k-1)*gap)\n const totalGap = (n - 1) * gapPx;\n const interGap = (k - 1) * gapPx;\n return `calc((100% - ${totalGap}px) * ${k} / ${n} + ${interGap}px)`;\n});\n\nconst labelStyle = computed(() => {\n const injected = typeof (providedLabelWidth as any)?.value === 'string'\n ? (providedLabelWidth as any).value\n : (providedLabelWidth as any);\n const w = props.labelWidth !== '' ? props.labelWidth : (injected || '');\n return w ? { width: typeof w === 'number' ? `${w}px` : String(w), flex: '0 0 auto' } : {};\n});\n</script>\n\n<style scoped>\n.rc-desc-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 0;\n flex: 0 0 auto;\n}\n.rc-desc-item__label {\n color: #666;\n font-size: 14px;\n line-height: 22px;\n /* 不强制最小宽度,交由 label-width 控制 */\n min-width: 0;\n}\n.rc-desc-item__value {\n flex: 1 1 auto;\n font-size: 14px;\n line-height: 22px;\n}\n\n</style>\n\n\n","<template>\n <div class=\"rc-descriptions\">\n <div v-if=\"$slots.title || title\" class=\"rc-descriptions__title\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n <div class=\"rc-descriptions__body\" :style=\"{ gap: gapStyle }\" ref=\"wrapEl\">\n <template v-if=\"normalizedData.length\">\n <rcDescriptionsItem\n v-for=\"(it, idx) in normalizedData\"\n :key=\"idx\"\n :label=\"it.label\"\n :value=\"it.value\"\n :label-width=\"labelWidth\"\n />\n </template>\n <slot v-else />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watchEffect } from 'vue';\nimport rcDescriptionsItem from './item.vue';\n\ndefineOptions({ name: 'rc-descriptions' });\n\ntype KeyMap = { key: string; value: string };\n\nconst props = withDefaults(defineProps<{\n title?: string;\n /** 每行展示的列数,支持数字或字符串数字 */\n column?: number | string;\n /** 列间距,支持数字(px)或字符串值,例如 '12px' */\n gap?: number | string;\n /** label 固定宽度,数字代表 px,也可直接传入 '120px' */\n labelWidth?: number | string | '';\n /** 直接通过数据渲染 */\n data?: Array<Record<string, any>>;\n /** data 的字段映射,如 { key: 'label', value: 'value' } */\n keyMap?: KeyMap;\n}>(), {\n column: 2,\n gap: 4,\n labelWidth: '',\n data: () => [],\n});\n\nconst wrapEl = ref<HTMLElement | null>(null);\nconst gapStyle = computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)));\nconst colCount = computed(() => {\n const n = typeof props.column === 'string' ? Number.parseInt(props.column as string, 10) : (props.column ?? 1);\n return !Number.isNaN(n) && n > 0 ? n : 1;\n});\n\n// compute child item width as percentage string or 'auto'\nconst itemWidth = ref<string>('100%');\nconst singleWidth = ref<string>('100%');\nwatchEffect(() => {\n const n = colCount.value;\n if (n <= 1) {\n itemWidth.value = '100%';\n singleWidth.value = '100%';\n } else {\n // subtract total horizontal gaps from 100%\n const gapPx = typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0;\n const totalGap = (n - 1) * gapPx;\n const base = `calc((100% - ${totalGap}px) / ${n})`;\n singleWidth.value = base;\n itemWidth.value = base;\n }\n});\n\nprovide('rcDescItemWidth', itemWidth);\nprovide('rcDescSingleWidth', singleWidth);\nprovide('rcDescColCount', colCount);\nprovide('rcDescGapPx', computed(() => (typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0)));\nconst labelWidthCss = computed(() => {\n if (props.labelWidth === '' || props.labelWidth === undefined) return '';\n return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : String(props.labelWidth);\n});\nprovide('rcDescLabelWidth', labelWidthCss);\nprovide('rcDescGap', computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap))));\n\nconst normalizedData = computed(() => {\n const keyK = (props.keyMap?.key ?? 'label') as string;\n const keyV = (props.keyMap?.value ?? 'value') as string;\n if (!props.data?.length) return [];\n return props.data.map((it) => ({\n label: it?.[keyK],\n value: it?.[keyV],\n }));\n});\n\n</script>\n\n<style scoped>\n.rc-descriptions {\n width: 100%;\n}\n.rc-descriptions__title {\n font-weight: 600;\n font-size: 16px;\n margin: 0 0 12px 0;\n}\n.rc-description__row {\n display: contents;\n}\n.rc-descriptions__body {\n display: flex;\n flex-wrap: wrap;\n}\n\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Descriptions from './index.vue';\r\nimport DescriptionsItem from './item.vue';\r\n\r\n(Descriptions as any).name = 'rc-descriptions';\r\n(DescriptionsItem as any).name = 'rc-descriptions-item';\r\n\r\nexport function install(app: App) {\r\n // 同时注册 kebab 与 PascalCase 名称,便于 <rc-descriptions>/<RcDescriptions> 使用\r\n app.component((Descriptions as any).name, Descriptions);\r\n app.component('RcDescriptions', Descriptions);\r\n app.component((DescriptionsItem as any).name, DescriptionsItem);\r\n app.component('RcDescriptionsItem', DescriptionsItem);\r\n return app;\r\n}\r\n\r\nexport const RcDescriptions = Descriptions;\r\nexport const RcDescriptionsItem = DescriptionsItem;\r\n\r\nexport default Descriptions;\r\n\r\n\r\n\r\n","<template>\n <div\n class=\"rc-card\"\n :class=\"[{ 'rc-card--bordered': bordered }]\"\n :style=\"wrapperStyle\"\n >\n <div\n v-if=\"$slots.title || title || $slots.status || status\"\n class=\"rc-card__top\"\n :style=\"{ backgroundColor: topBgColor || 'rgba(29, 133, 252, 0.05)' }\"\n >\n <div class=\"rc-card__title\">\n <slot name=\"title\">\n <span class=\"rc-card__title-text\">{{ title }}</span>\n </slot>\n </div>\n <div class=\"rc-card__status\" v-if=\"$slots.status || status\">\n <slot name=\"status\">\n <span class=\"rc-card__status-text\" :style=\"{ color: statusColor || 'var(--rc-primary)' }\">\n {{ status }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"rc-card__body\" :style=\"{ padding: bodyPadding, gap: bodyGap }\">\n <slot name=\"content\">\n <slot />\n </slot>\n </div>\n\n <div v-if=\"$slots.action\" class=\"rc-card__divider\" />\n\n <div v-if=\"$slots.action\" class=\"rc-card__action\">\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'rc-card' });\n\ninterface Props {\n /** 卡片整体背景色,默认白色 */\n color?: string;\n /** 顶部色块背景色 */\n topBgColor?: string;\n /** 标题文本(可用 slot=\"title\" 自定义) */\n title?: string;\n /** 右侧状态文案(可用 slot=\"status\" 自定义) */\n status?: string;\n /** 状态文本颜色 */\n statusColor?: string;\n /** 圆角:数值代表 px,字符串可用百分比 */\n round?: number | string;\n /** 是否描边 */\n bordered?: boolean;\n /** 阴影强度:0/1/2/3... -> 转换为不同阴影强度 */\n elevation?: number;\n /** 内边距(CSS 值,如 '16px 12px') */\n padding?: string;\n /** 主体内容的垂直间距(px 或 CSS 字符串) */\n gap?: number | string;\n /** 宽度(px/百分比) */\n width?: string | number;\n /** 高度(px/百分比) */\n height?: string | number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n color: 'var(--rc-white)',\n topBgColor: 'rgba(29, 133, 252, 0.05)',\n title: '',\n status: '',\n statusColor: 'var(--rc-primary)',\n round: 8,\n bordered: false,\n elevation: 2,\n padding: '16px',\n gap: 12,\n width: '100%',\n height: '',\n});\n\nconst wrapperStyle = computed(() => {\n const radius =\n typeof props.round === 'boolean'\n ? props.round\n ? '12px'\n : '0'\n : typeof props.round === 'number'\n ? `${props.round}px`\n : String(props.round);\n\n return {\n backgroundColor: props.color || 'var(--rc-white)',\n borderRadius: radius,\n boxShadow: shadowByLevel(props.elevation),\n width: toCssSize(props.width),\n height: toCssSize(props.height),\n } as Record<string, string>;\n});\n\nconst bodyPadding = computed(() => props.padding || '16px');\nconst bodyGap = computed(() =>\n typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)\n);\n\nfunction toCssSize(v?: string | number) {\n if (v === undefined || v === null || v === '') return '';\n return typeof v === 'number' ? `${v}px` : String(v);\n}\n\nfunction shadowByLevel(level: number) {\n if (!level || level <= 0) return 'none';\n // 简单的多层阴影(可按需微调)\n const base = 4 * level;\n return `0 ${Math.round(base / 2)}px ${base}px rgba(0,0,0,0.06), 0 ${Math.round(\n base / 4\n )}px ${Math.round(base / 2)}px rgba(0,0,0,0.04)`;\n}\n</script>\n\n<style scoped>\n.rc-card {\n --rc-white: #ffffff;\n --rc-border: #e5e6eb;\n --rc-primary: #1677ff;\n\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid transparent;\n background: var(.rc-white);\n}\n.rc-card--bordered {\n border-color: var(--rc-border);\n}\n\n.rc-card__top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.rc-card__title {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.rc-card__title-text {\n font-weight: 600;\n font-size: 16px;\n color: #1d2129;\n}\n.rc-card__status-text {\n font-size: 14px;\n}\n.rc-card__body {\n display: flex;\n flex-direction: column;\n}\n.rc-card__divider {\n height: 1px;\n background: var(--rc-border);\n}\n.rc-card__action {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n}\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Card from './index.vue';\r\n\r\n// 同时注册小写与驼峰,便于 <rc-card> / <RcCard> 两种写法\r\n(Card as any).name = 'rc-card';\r\nconst PascalName = 'RcCard';\r\n\r\nexport function install(app: App) {\r\n app.component((Card as any).name, Card);\r\n app.component(PascalName, Card);\r\n return app;\r\n}\r\n\r\nexport default Card;\r\n\r\n\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition name=\"rc-toast-fade\" @after-leave=\"onAfterLeave\">\r\n <div v-if=\"visible\" class=\"rc-toast\" :class=\"[`rc-toast--${type}`]\">\r\n <div v-if=\"mask\" class=\"rc-toast__mask\" />\r\n <div class=\"rc-toast__content\">\r\n <div v-if=\"type === 'loading'\" class=\"rc-toast__spinner\" />\r\n <div v-else-if=\"type === 'success'\" class=\"rc-toast__icon rc-toast__icon--success\" />\r\n <div v-else-if=\"type === 'fail'\" class=\"rc-toast__icon rc-toast__icon--fail\" />\r\n <div class=\"rc-toast__text\">{{ message }}</div>\r\n </div>\r\n </div>\r\n </transition>\r\n </teleport>\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch, defineExpose } from 'vue';\r\n\r\nexport type ToastType = 'text' | 'success' | 'fail' | 'loading';\r\nexport interface ToastProps {\r\n message?: string;\r\n type?: ToastType;\r\n duration?: number;\r\n mask?: boolean;\r\n /** 服务端关闭回调,用于卸载容器 */\r\n onAfterLeave?: () => void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ToastProps>(), {\r\n message: '',\r\n type: 'text',\r\n duration: 2000,\r\n mask: false,\r\n});\r\n\r\nconst visible = ref(true);\r\nlet timer: any;\r\n\r\nfunction clearTimer() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n visible.value = false;\r\n}\r\n\r\ndefineExpose({ close });\r\n\r\nonMounted(() => {\r\n if (props.duration && props.duration > 0) {\r\n timer = setTimeout(() => {\r\n close();\r\n }, props.duration);\r\n }\r\n});\r\n\r\nonUnmounted(() => {\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-toast {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.rc-toast__mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.35);\r\n pointer-events: auto;\r\n backdrop-filter: blur(1px);\r\n}\r\n.rc-toast__content {\r\n position: relative;\r\n max-width: 80%;\r\n background: rgba(0, 0, 0, 0.75);\r\n color: #fff;\r\n border-radius: 12px;\r\n padding: 12px 14px;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n}\r\n.rc-toast__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n}\r\n.rc-toast__spinner {\r\n width: 18px;\r\n height: 18px;\r\n border: 2px solid rgba(255,255,255,0.35);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: rc-toast-spin 0.8s linear infinite;\r\n}\r\n.rc-toast__icon {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 50%;\r\n position: relative;\r\n flex: 0 0 18px;\r\n}\r\n.rc-toast__icon--success::before {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n top: 3px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid #fff;\r\n border-bottom: 2px solid #fff;\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::before,\r\n.rc-toast__icon--fail::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 8px;\r\n height: 2px;\r\n background: #fff;\r\n}\r\n.rc-toast__icon--fail::before {\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::after {\r\n transform: rotate(-45deg);\r\n}\r\n\r\n.rc-toast-fade-enter-active,\r\n.rc-toast-fade-leave-active {\r\n transition: opacity .2s ease;\r\n}\r\n.rc-toast-fade-enter-from,\r\n.rc-toast-fade-leave-to {\r\n opacity: 0;\r\n}\r\n@keyframes rc-toast-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import { App, createApp } from 'vue';\r\nimport Toast, { type ToastProps } from './index.vue';\r\n\r\nexport type { ToastProps };\r\nexport interface ShowToastOptions {\r\n message?: string;\r\n type?: 'text' | 'success' | 'fail' | 'loading';\r\n duration?: number;\r\n mask?: boolean;\r\n /** 关闭时回调(仅服务方式有效) */\r\n onClose?: () => void;\r\n}\r\n\r\nlet app: App<Element> | null = null;\r\nlet host: HTMLDivElement | null = null;\r\n\r\nfunction unmount() {\r\n if (app) {\r\n app.unmount();\r\n app = null;\r\n }\r\n if (host) {\r\n document.body.removeChild(host);\r\n host = null;\r\n }\r\n}\r\n\r\nexport function showToast(options: string | ShowToastOptions) {\r\n const opt: ShowToastOptions =\r\n typeof options === 'string' ? { message: options } : (options || {});\r\n unmount();\r\n host = document.createElement('div');\r\n document.body.appendChild(host);\r\n const toastProps: ToastProps = {\r\n message: opt.message,\r\n type: (opt as any).type ?? 'text',\r\n duration: (opt as any).duration ?? 2000,\r\n mask: (opt as any).mask ?? false,\r\n onAfterLeave: () => {\r\n unmount();\r\n opt.onClose?.();\r\n },\r\n };\r\n app = createApp(Toast, toastProps as any);\r\n app.mount(host);\r\n return {\r\n close: hideToast,\r\n };\r\n}\r\n\r\nexport function hideToast() {\r\n if (!app) return;\r\n // 调用暴露的 close 方法\r\n // @ts-ignore\r\n app._instance?.exposed?.close?.();\r\n}\r\n\r\n// 组件注册(可选,提供 rc-toast 用于手动放置 Portal)\r\n(Toast as any).name = 'rc-toast';\r\nexport function install(app: App) {\r\n app.component((Toast as any).name, Toast);\r\n return app;\r\n}\r\n\r\nexport default Toast;\r\n\r\n\r\n","<template>\r\n <div class=\"rc-message\" role=\"alert\" aria-live=\"polite\">\r\n <transition-group name=\"rc-message-fade\" tag=\"div\">\r\n <div\r\n v-for=\"m in messages\"\r\n :key=\"m.id\"\r\n class=\"rc-message__item\"\r\n :class=\"`rc-message--${m.type}`\"\r\n >\r\n <span class=\"rc-message__content\">{{ m.content }}</span>\r\n </div>\r\n </transition-group>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive } from 'vue';\r\n\r\nexport type MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\nexport interface MessageItem {\r\n id: number;\r\n type: MessageType;\r\n content: string;\r\n duration: number; // ms; 0 = persistent (except loading default)\r\n}\r\n\r\nconst messages = reactive<MessageItem[]>([]);\r\nlet uid = 1;\r\n\r\nfunction remove(id: number) {\r\n const idx = messages.findIndex((x) => x.id === id);\r\n if (idx >= 0) messages.splice(idx, 1);\r\n}\r\n\r\nfunction add(type: MessageType, content: string, duration: number) {\r\n const id = uid++;\r\n messages.push({ id, type, content, duration });\r\n if (duration > 0) {\r\n window.setTimeout(() => remove(id), duration);\r\n }\r\n return id;\r\n}\r\n\r\ndefineExpose({ add, remove });\r\n</script>\r\n\r\n<style scoped>\r\n.rc-message {\r\n position: fixed;\r\n top: 16px;\r\n left: 0;\r\n right: 0;\r\n z-index: 10000;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.rc-message__item {\r\n pointer-events: auto;\r\n min-width: 120px;\r\n max-width: 80%;\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n color: #fff;\r\n background: rgba(0, 0, 0, 0.78);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n font-size: 14px;\r\n}\r\n.rc-message--success { background: rgba(22,119,255,0.9); }\r\n.rc-message--warning { background: rgba(250,173,20,0.95); }\r\n.rc-message--error { background: rgba(245,63,63,0.95); }\r\n.rc-message--info { background: rgba(0,0,0,0.78); }\r\n.rc-message--loading { background: rgba(0,0,0,0.78); }\r\n\r\n.rc-message-fade-enter-active,\r\n.rc-message-fade-leave-active {\r\n transition: all .2s ease;\r\n}\r\n.rc-message-fade-enter-from,\r\n.rc-message-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-6px);\r\n}\r\n</style>\r\n\r\n\r\n","import { createVNode, render, type App } from 'vue';\r\nimport MessageHost from './index.vue';\r\n\r\ntype MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n\r\nexport interface MessageOptions {\r\n content: string;\r\n duration?: number; // ms; default 2000, loading 默认 0\r\n type?: MessageType;\r\n}\r\n\r\nlet container: HTMLElement | null = null;\r\nlet hostExposed: any = null;\r\n\r\nfunction ensureHost() {\r\n if (container && hostExposed) return;\r\n container = document.createElement('div');\r\n document.body.appendChild(container);\r\n const vnode = createVNode(MessageHost, {});\r\n render(vnode, container);\r\n hostExposed = (vnode.component as any)?.exposed;\r\n}\r\n\r\nfunction open(type: MessageType, content: string, duration?: number) {\r\n ensureHost();\r\n const d = typeof duration === 'number'\r\n ? duration\r\n : (type === 'loading' ? 0 : 2000);\r\n return hostExposed?.add?.(type, content, d);\r\n}\r\n\r\nexport const message = {\r\n open(opts: MessageOptions) {\r\n return open(opts.type || 'info', opts.content, opts.duration);\r\n },\r\n info(content: string, duration?: number) {\r\n return open('info', content, duration);\r\n },\r\n success(content: string, duration?: number) {\r\n return open('success', content, duration);\r\n },\r\n warning(content: string, duration?: number) {\r\n return open('warning', content, duration);\r\n },\r\n error(content: string, duration?: number) {\r\n return open('error', content, duration);\r\n },\r\n loading(content: string, duration?: number) {\r\n return open('loading', content, duration);\r\n },\r\n destroy() {\r\n if (container) {\r\n render(null, container);\r\n container.remove();\r\n container = null;\r\n hostExposed = null;\r\n }\r\n },\r\n};\r\n\r\nexport default message;\r\n\r\n// 可选:提供 install,注入到 app.config.globalProperties 以便 this.$message 使用\r\nexport function install(app: App) {\r\n (app.config.globalProperties as any).$message = message;\r\n return app;\r\n}\r\n\r\n\r\n","<template>\r\n <i\r\n class=\"rc-icon\"\r\n :class=\"[baseClass, iconClassName, { 'rc-icon--spin': spin }]\"\r\n :style=\"iconStyle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span v-if=\"char\" class=\"rc-icon__unicode\">{{ char }}</span>\r\n </i>\r\n </template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted } from 'vue';\r\nimport type { RecycleUIOptions } from '../../types';\r\nimport { RECYCLE_UI_SYMBOL, defaultRecycleUIConfig } from '../../index';\r\n\r\ndefineOptions({ name: 'rc-icon' });\r\n\r\nconst props = withDefaults(defineProps<{\r\n /** 图标名,例如 'icon_a_in_store',也可直接传完整类名 */\r\n name: string;\r\n /** 尺寸,数字按 px 处理,也可传 '1.2em' 等 */\r\n size?: number | string;\r\n /** 颜色 */\r\n color?: string;\r\n /** 是否旋转(用于 loading 类图标) */\r\n spin?: boolean;\r\n /** Unicode 码点(不带 \\\\u,十六进制,如 'e609' 或 0xe609),用于无类名时渲染 */\r\n code?: string | number;\r\n}>(), {\r\n size: 16,\r\n color: '',\r\n spin: false,\r\n code: '',\r\n});\r\n\r\nconst cfg = inject<RecycleUIOptions>(RECYCLE_UI_SYMBOL, {} as RecycleUIOptions);\r\n\r\nconst baseClass = computed(() => cfg?.iconClass || 'iconfont');\r\nconst iconClassName = computed(() => props.name || '');\r\n\r\nconst sizeCss = computed(() => (typeof props.size === 'number' ? `${props.size}px` : (props.size || '16px')));\r\nconst iconStyle = computed(() => ({\r\n fontSize: sizeCss.value,\r\n color: props.color || undefined,\r\n lineHeight: 1,\r\n fontFamily: cfg?.iconClass || 'iconfont',\r\n}));\r\n\r\n// 将 code 转为字符\r\nconst char = computed(() => {\r\n const c = props.code as any;\r\n if (c === undefined || c === null || c === '' || c === 0) return '';\r\n if (typeof c === 'number') {\r\n return String.fromCharCode(c);\r\n }\r\n const hex = String(c).replace(/^0x/i, '');\r\n const num = parseInt(hex, 16);\r\n if (Number.isNaN(num)) return '';\r\n return String.fromCharCode(num);\r\n});\r\n\r\n// 兜底:若未通过 app.use 安装插件,则在组件挂载时尝试注入默认的 iconfont 样式\r\nonMounted(() => {\r\n if (typeof window === 'undefined') return;\r\n const url = (cfg && cfg.iconCssUrl) || defaultRecycleUIConfig.iconCssUrl;\r\n if (!url) return;\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${url}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url as string;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-icon {\r\n display: inline-block;\r\n vertical-align: -0.125em;\r\n}\r\n.rc-icon__unicode {\r\n /* 让 Unicode 文本走同一字体,确保显示 */\r\n font-family: inherit;\r\n line-height: 1;\r\n}\r\n.rc-icon--spin {\r\n animation: rc-icon-rot 1s linear infinite;\r\n}\r\n@keyframes rc-icon-rot {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Icon from './index.vue';\r\n\r\n(Icon as any).name = 'rc-icon';\r\n\r\nexport function install(app: App) {\r\n app.component((Icon as any).name, Icon);\r\n app.component('RcIcon', Icon);\r\n return app;\r\n}\r\n\r\nexport const RcIcon = Icon;\r\nexport default Icon;\r\n\r\n\r\n","// library entry\r\nimport type { App, Plugin } from 'vue';\r\nimport { install as installButton } from './components/button';\r\nimport { install as installDescriptions } from './components/descriptions';\r\nimport { install as installCard } from './components/card';\r\nimport { install as installToast } from './components/toast';\r\nimport { install as installMessage } from './components/message';\r\nimport { install as installIcon } from './components/icon/index';\r\nimport type { RecycleUIOptions } from './types';\r\n\r\nexport const RECYCLE_UI_SYMBOL = Symbol('RECYCLE_UI_CONFIG');\r\n\r\nexport const defaultRecycleUIConfig: RecycleUIOptions = {\r\n prefix: 'rc',\r\n autoRegister: true,\r\n provideKey: RECYCLE_UI_SYMBOL,\r\n // 预留主题/其他全局配置\r\n theme: {},\r\n // IconFont 默认配置(可在 app.use 时覆盖)\r\n iconCssUrl: '//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css',\r\n iconClass: 'iconfont',\r\n};\r\n\r\n// 统一导出所有类型的命名空间\r\nexport namespace RecycleUi {\r\n // 核心配置类型\r\n export type Options = RecycleUIOptions;\r\n export type DefaultConfig = typeof defaultRecycleUIConfig;\r\n \r\n // Message 相关类型\r\n export type MessageOptions = import('./components/message').MessageOptions;\r\n export type MessageType = import('./components/message/index.vue').MessageType;\r\n export type MessageItem = import('./components/message/index.vue').MessageItem;\r\n \r\n // Toast 相关类型\r\n export type ToastProps = import('./components/toast/index.vue').ToastProps;\r\n export type ToastType = import('./components/toast/index.vue').ToastType;\r\n export type ShowToastOptions = import('./components/toast').ShowToastOptions;\r\n}\r\n\r\nfunction doAutoRegister(app: App, opts: RecycleUIOptions) {\r\n if (opts.autoRegister === false) return;\r\n if (typeof installButton === 'function') installButton(app);\r\n if (typeof installDescriptions === 'function') installDescriptions(app);\r\n if (typeof installCard === 'function') installCard(app);\r\n if (typeof installToast === 'function') installToast(app);\r\n if (typeof installIcon === 'function') installIcon(app);\r\n if (typeof installMessage === 'function') installMessage(app);\r\n}\r\n\r\nexport const install = (app: App, options?: RecycleUIOptions) => {\r\n const cfg: RecycleUIOptions = { ...defaultRecycleUIConfig, ...(options || {}) };\r\n // 提供全局配置\r\n app.provide(cfg.provideKey ?? RECYCLE_UI_SYMBOL, cfg);\r\n // 供模板/实例访问:this.$recycleUI\r\n (app.config.globalProperties as any).$recycleUI = cfg;\r\n // 注入 IconFont 样式链接(浏览器环境)\r\n if (typeof window !== 'undefined' && cfg.iconCssUrl) {\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${cfg.iconCssUrl}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = cfg.iconCssUrl;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n }\r\n // 自动注册内置组件(可通过 autoRegister 关闭)\r\n doAutoRegister(app, cfg);\r\n return app;\r\n};\r\n\r\n// 默认导出为插件,支持 app.use(recycleUi, options)\r\nconst plugin: Plugin = { install };\r\nexport default plugin;\r\n\r\n// 也导出命名组件安装器与默认配置(defaultRecycleUIConfig 已在上方以常量形式导出)\r\n\r\n// 可选:工厂方法,便于创建带预设配置的插件\r\nexport function createRecycleUI(options?: RecycleUIOptions): Plugin {\r\n return {\r\n install(app: App) {\r\n install(app, options);\r\n },\r\n };\r\n}\r\n\r\n// 按需导出组件与其安装器(供文档与业务直接使用)\r\nexport { default as RcButton } from './components/button';\r\nexport { RcDescriptions, RcDescriptionsItem } from './components/descriptions';\r\nexport { install as installButton } from './components/button';\r\nexport { install as installDescriptions } from './components/descriptions';\r\nexport { default as RcCard } from './components/card';\r\nexport { install as installCard } from './components/card';\r\n// 兼容别名导出(文档示例中的 rcXxx)\r\nexport { RcDescriptions as rcDescriptions, RcDescriptionsItem as rcDescriptionsItem } from './components/descriptions';\r\n// Toast 服务导出\r\nexport { default as RcToast, showToast, hideToast } from './components/toast';\r\n// Icon 组件导出\r\nexport { default as RcIcon } from './components/icon/index';\r\nexport { install as installIcon } from './components/icon/index';\r\n// Message 服务(对标 antd 的 message)\r\nexport { default as message } from './components/message';\r\nexport { install as installMessage } from './components/message';\r\n"],"names":["props","__props","emit","__emit","onClick","ev","radius","computed","v","_createElementBlock","_normalizeClass","_openBlock","_hoisted_2","_renderSlot","_ctx","Button","install","app","inject","providedGapPx","providedColCount","providedLabelWidth","spanNum","n","max","safe","computedWidth","gapPx","k","totalGap","interGap","labelStyle","injected","w","_normalizeStyle","_createElementVNode","_hoisted_1","wrapEl","ref","gapStyle","colCount","itemWidth","singleWidth","watchEffect","base","provide","labelWidthCss","normalizedData","keyK","_a","keyV","_b","_c","it","$slots","_Fragment","_renderList","idx","_createBlock","rcDescriptionsItem","Descriptions","DescriptionsItem","RcDescriptions","RcDescriptionsItem","wrapperStyle","shadowByLevel","toCssSize","bodyPadding","bodyGap","level","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","Card","PascalName","visible","timer","clearTimer","close","__expose","onMounted","onUnmounted","_Teleport","_createVNode","_Transition","_hoisted_6","host","unmount","showToast","options","opt","toastProps","createApp","Toast","hideToast","messages","reactive","uid","remove","id","x","add","type","content","duration","_TransitionGroup","m","container","hostExposed","ensureHost","vnode","createVNode","MessageHost","render","open","d","message","opts","cfg","RECYCLE_UI_SYMBOL","baseClass","iconClassName","sizeCss","iconStyle","char","hex","num","url","defaultRecycleUIConfig","selector","link","Icon","doAutoRegister","installButton","installDescriptions","installCard","installToast","installIcon","installMessage","plugin","createRecycleUI"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/components/button/index.vue","../src/components/button/index.ts","../src/components/descriptions/item.vue","../src/components/descriptions/index.vue","../src/components/descriptions/index.ts","../src/components/card/index.vue","../src/components/card/index.ts","../src/components/toast/index.vue","../src/components/toast/index.ts","../src/components/message/index.vue","../src/components/message/index.ts","../src/components/icon/index.vue","../src/components/icon/index.ts","../src/components/search-area/index.vue","../src/components/search-area/index.ts","../src/index.ts"],"sourcesContent":["<template>\r\n <button\r\n class=\"rc-button\"\r\n :class=\"[`rc-button--${type}`, `rc-button--${size}`, { 'is-plain': plain, 'is-block': block, 'is-disabled': disabled, 'is-loading': loading }]\"\r\n :style=\"{ borderRadius: radius }\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"onClick\"\r\n >\r\n <span v-if=\"loading\" class=\"rc-button__spinner\" />\r\n <slot>{{ label }}</slot>\r\n </button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\ntype ButtonType = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype ButtonSize = 'mini' | 'small' | 'medium' | 'large';\r\n\r\ninterface Props {\r\n type?: ButtonType;\r\n size?: ButtonSize;\r\n plain?: boolean;\r\n block?: boolean;\r\n /** 按钮文本,提供时可不写默认插槽 */\r\n label?: string;\r\n /** 圆角;number 代表 px,string 支持百分比等写法(如 '50%')。也兼容 boolean,true 表示大圆角。 */\r\n round?: number | string | boolean;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'default',\r\n size: 'medium',\r\n plain: false,\r\n block: false,\r\n label: '',\r\n round: 6,\r\n disabled: false,\r\n loading: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: 'click', ev: MouseEvent): void\r\n}>();\r\n\r\nconst onClick = (ev: MouseEvent) => {\r\n if (!props.disabled && !props.loading) emit('click', ev);\r\n};\r\n\r\nconst radius = computed(() => {\r\n const v = props.round;\r\n if (typeof v === 'boolean') return v ? '999px' : '6px';\r\n if (typeof v === 'number') return `${v}px`;\r\n return String(v);\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.rc-button {\r\n --rc-primary: #1677ff;\r\n --rc-success: #00b578;\r\n --rc-warning: #ff8f1f;\r\n --rc-danger: #ff3141;\r\n --rc-text: #323233;\r\n --rc-border: #dcdee0;\r\n --rc-white: #ffffff;\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 36px;\r\n padding: 0 16px;\r\n border: 1px solid var(--rc-border);\r\n border-radius: 6px;\r\n background: var(--rc-white);\r\n color: var(--rc-text);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: all .2s ease;\r\n\r\n &.is-disabled { cursor: not-allowed; opacity: .6; }\r\n &.is-block { display: flex; width: 100%; }\r\n &.is-plain { background: var(--rc-white); }\r\n &.is-loading { opacity: .85; }\r\n\r\n &__spinner {\r\n width: 14px;\r\n height: 14px;\r\n margin-right: 6px;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: rc-spin 0.8s linear infinite;\r\n }\r\n\r\n &--primary { background: var(--rc-primary); color: var(--rc-white); border-color: var(--rc-primary); }\r\n &--success { background: var(--rc-success); color: var(--rc-white); border-color: var(--rc-success); }\r\n &--warning { background: var(--rc-warning); color: var(--rc-white); border-color: var(--rc-warning); }\r\n &--danger { background: var(--rc-danger); color: var(--rc-white); border-color: var(--rc-danger); }\r\n\r\n &--mini { height: 24px; padding: 0 8px; font-size: 12px; }\r\n &--small { height: 28px; padding: 0 10px; font-size: 13px; }\r\n &--medium { height: 36px; padding: 0 16px; font-size: 14px; }\r\n &--large { height: 44px; padding: 0 20px; font-size: 16px; }\r\n}\r\n\r\n@keyframes rc-spin { to { transform: rotate(360deg) } }\r\n</style>\r\n\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Button from './index.vue';\r\n\r\n// 组件名使用全小写,以 <rc-button> 形式在模板中使用\r\n(Button as any).name = 'rc-button';\r\n\r\nexport function install(app: App) {\r\n app.component((Button as any).name, Button);\r\n return app;\r\n}\r\n\r\n\r\nexport default Button;\r\n","<template>\n <div class=\"rc-desc-item\" :style=\"{ width: computedWidth, flex: `0 0 ${computedWidth}` }\">\n <div class=\"rc-desc-item__label\" :style=\"labelStyle\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </div>\n <div class=\"rc-desc-item__value\">\n <slot>\n {{ value }}\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, Ref } from 'vue';\n\ndefineOptions({ name: 'rc-descriptions-item' });\n\nconst props = withDefaults(defineProps<{\n label?: string | number;\n value?: any;\n labelWidth?: string | number;\n /** 跨越的列数,默认 1,可传字符串数字 */\n span?: number | string;\n}>(), {\n label: '',\n value: '',\n labelWidth: '',\n span: 1,\n});\n\nconst providedWidth = inject<Ref<string>>('rcDescItemWidth', undefined as unknown as Ref<string>);\nconst providedSingleWidth = inject<Ref<string> | string>('rcDescSingleWidth', '' as unknown as Ref<string>);\nconst providedGap = inject<string>('rcDescGap', '0px');\nconst providedGapPx = inject<Ref<number> | number>('rcDescGapPx', 0 as unknown as Ref<number>);\nconst providedColCount = inject<Ref<number> | number>('rcDescColCount', 1 as unknown as Ref<number>);\nconst providedLabelWidth = inject<Ref<string> | string>('rcDescLabelWidth', '' as unknown as Ref<string>);\n\nconst spanNum = computed(() => {\n const n = typeof props.span === 'string' ? parseInt(props.span, 10) : props.span;\n const max = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const safe = !Number.isNaN(n as number) && (n as number) > 0 ? (n as number) : 1;\n return Math.min(safe, max || 1);\n});\n\nconst computedWidth = computed(() => {\n const n = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const gapPx = typeof (providedGapPx as any)?.value === 'number' ? (providedGapPx as any).value : (providedGapPx as any);\n const k = spanNum.value;\n if (!n || n <= 1) return '100%';\n if (k >= n) return '100%';\n // 展开为单层 calc:((100% - (n-1)*gap) * k / n + (k-1)*gap)\n const totalGap = (n - 1) * gapPx;\n const interGap = (k - 1) * gapPx;\n return `calc((100% - ${totalGap}px) * ${k} / ${n} + ${interGap}px)`;\n});\n\nconst labelStyle = computed(() => {\n const injected = typeof (providedLabelWidth as any)?.value === 'string'\n ? (providedLabelWidth as any).value\n : (providedLabelWidth as any);\n const w = props.labelWidth !== '' ? props.labelWidth : (injected || '');\n return w ? { width: typeof w === 'number' ? `${w}px` : String(w), flex: '0 0 auto' } : {};\n});\n</script>\n\n<style scoped>\n.rc-desc-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 0;\n flex: 0 0 auto;\n}\n.rc-desc-item__label {\n color: #666;\n font-size: 14px;\n line-height: 22px;\n /* 不强制最小宽度,交由 label-width 控制 */\n min-width: 0;\n}\n.rc-desc-item__value {\n flex: 1 1 auto;\n font-size: 14px;\n line-height: 22px;\n}\n\n</style>\n\n\n","<template>\n <div class=\"rc-descriptions\">\n <div v-if=\"$slots.title || title\" class=\"rc-descriptions__title\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n <div class=\"rc-descriptions__body\" :style=\"{ gap: gapStyle }\" ref=\"wrapEl\">\n <template v-if=\"normalizedData.length\">\n <rcDescriptionsItem\n v-for=\"(it, idx) in normalizedData\"\n :key=\"idx\"\n :label=\"it.label\"\n :value=\"it.value\"\n :label-width=\"labelWidth\"\n />\n </template>\n <slot v-else />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watchEffect } from 'vue';\nimport rcDescriptionsItem from './item.vue';\n\ndefineOptions({ name: 'rc-descriptions' });\n\ntype KeyMap = { key: string; value: string };\n\nconst props = withDefaults(defineProps<{\n title?: string;\n /** 每行展示的列数,支持数字或字符串数字 */\n column?: number | string;\n /** 列间距,支持数字(px)或字符串值,例如 '12px' */\n gap?: number | string;\n /** label 固定宽度,数字代表 px,也可直接传入 '120px' */\n labelWidth?: number | string | '';\n /** 直接通过数据渲染 */\n data?: Array<Record<string, any>>;\n /** data 的字段映射,如 { key: 'label', value: 'value' } */\n keyMap?: KeyMap;\n}>(), {\n column: 2,\n gap: 4,\n labelWidth: '',\n data: () => [],\n});\n\nconst wrapEl = ref<HTMLElement | null>(null);\nconst gapStyle = computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)));\nconst colCount = computed(() => {\n const n = typeof props.column === 'string' ? Number.parseInt(props.column as string, 10) : (props.column ?? 1);\n return !Number.isNaN(n) && n > 0 ? n : 1;\n});\n\n// compute child item width as percentage string or 'auto'\nconst itemWidth = ref<string>('100%');\nconst singleWidth = ref<string>('100%');\nwatchEffect(() => {\n const n = colCount.value;\n if (n <= 1) {\n itemWidth.value = '100%';\n singleWidth.value = '100%';\n } else {\n // subtract total horizontal gaps from 100%\n const gapPx = typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0;\n const totalGap = (n - 1) * gapPx;\n const base = `calc((100% - ${totalGap}px) / ${n})`;\n singleWidth.value = base;\n itemWidth.value = base;\n }\n});\n\nprovide('rcDescItemWidth', itemWidth);\nprovide('rcDescSingleWidth', singleWidth);\nprovide('rcDescColCount', colCount);\nprovide('rcDescGapPx', computed(() => (typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0)));\nconst labelWidthCss = computed(() => {\n if (props.labelWidth === '' || props.labelWidth === undefined) return '';\n return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : String(props.labelWidth);\n});\nprovide('rcDescLabelWidth', labelWidthCss);\nprovide('rcDescGap', computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap))));\n\nconst normalizedData = computed(() => {\n const keyK = (props.keyMap?.key ?? 'label') as string;\n const keyV = (props.keyMap?.value ?? 'value') as string;\n if (!props.data?.length) return [];\n return props.data.map((it) => ({\n label: it?.[keyK],\n value: it?.[keyV],\n }));\n});\n\n</script>\n\n<style scoped>\n.rc-descriptions {\n width: 100%;\n}\n.rc-descriptions__title {\n font-weight: 600;\n font-size: 16px;\n margin: 0 0 12px 0;\n}\n.rc-description__row {\n display: contents;\n}\n.rc-descriptions__body {\n display: flex;\n flex-wrap: wrap;\n}\n\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Descriptions from './index.vue';\r\nimport DescriptionsItem from './item.vue';\r\n\r\n(Descriptions as any).name = 'rc-descriptions';\r\n(DescriptionsItem as any).name = 'rc-descriptions-item';\r\n\r\nexport function install(app: App) {\r\n // 同时注册 kebab 与 PascalCase 名称,便于 <rc-descriptions>/<RcDescriptions> 使用\r\n app.component((Descriptions as any).name, Descriptions);\r\n app.component('RcDescriptions', Descriptions);\r\n app.component((DescriptionsItem as any).name, DescriptionsItem);\r\n app.component('RcDescriptionsItem', DescriptionsItem);\r\n return app;\r\n}\r\n\r\nexport const RcDescriptions = Descriptions;\r\nexport const RcDescriptionsItem = DescriptionsItem;\r\n\r\nexport default Descriptions;\r\n\r\n\r\n\r\n","<template>\n <div\n class=\"rc-card\"\n :class=\"[{ 'rc-card--bordered': bordered }]\"\n :style=\"wrapperStyle\"\n >\n <div\n v-if=\"$slots.title || title || $slots.status || status\"\n class=\"rc-card__top\"\n :style=\"{ backgroundColor: topBgColor || 'rgba(29, 133, 252, 0.05)' }\"\n >\n <div class=\"rc-card__title\">\n <slot name=\"title\">\n <span class=\"rc-card__title-text\">{{ title }}</span>\n </slot>\n </div>\n <div class=\"rc-card__status\" v-if=\"$slots.status || status\">\n <slot name=\"status\">\n <span class=\"rc-card__status-text\" :style=\"{ color: statusColor || 'var(--rc-primary)' }\">\n {{ status }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"rc-card__body\" :style=\"{ padding: bodyPadding, gap: bodyGap }\">\n <slot name=\"content\">\n <slot />\n </slot>\n </div>\n\n <div v-if=\"$slots.action\" class=\"rc-card__divider\" />\n\n <div v-if=\"$slots.action\" class=\"rc-card__action\">\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'rc-card' });\n\ninterface Props {\n /** 卡片整体背景色,默认白色 */\n color?: string;\n /** 顶部色块背景色 */\n topBgColor?: string;\n /** 标题文本(可用 slot=\"title\" 自定义) */\n title?: string;\n /** 右侧状态文案(可用 slot=\"status\" 自定义) */\n status?: string;\n /** 状态文本颜色 */\n statusColor?: string;\n /** 圆角:数值代表 px,字符串可用百分比 */\n round?: number | string;\n /** 是否描边 */\n bordered?: boolean;\n /** 阴影强度:0/1/2/3... -> 转换为不同阴影强度 */\n elevation?: number;\n /** 内边距(CSS 值,如 '16px 12px') */\n padding?: string;\n /** 主体内容的垂直间距(px 或 CSS 字符串) */\n gap?: number | string;\n /** 宽度(px/百分比) */\n width?: string | number;\n /** 高度(px/百分比) */\n height?: string | number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n color: 'var(--rc-white)',\n topBgColor: 'rgba(29, 133, 252, 0.05)',\n title: '',\n status: '',\n statusColor: 'var(--rc-primary)',\n round: 8,\n bordered: false,\n elevation: 2,\n padding: '16px',\n gap: 12,\n width: '100%',\n height: '',\n});\n\nconst wrapperStyle = computed(() => {\n const radius =\n typeof props.round === 'boolean'\n ? props.round\n ? '12px'\n : '0'\n : typeof props.round === 'number'\n ? `${props.round}px`\n : String(props.round);\n\n return {\n backgroundColor: props.color || 'var(--rc-white)',\n borderRadius: radius,\n boxShadow: shadowByLevel(props.elevation),\n width: toCssSize(props.width),\n height: toCssSize(props.height),\n } as Record<string, string>;\n});\n\nconst bodyPadding = computed(() => props.padding || '16px');\nconst bodyGap = computed(() =>\n typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)\n);\n\nfunction toCssSize(v?: string | number) {\n if (v === undefined || v === null || v === '') return '';\n return typeof v === 'number' ? `${v}px` : String(v);\n}\n\nfunction shadowByLevel(level: number) {\n if (!level || level <= 0) return 'none';\n // 简单的多层阴影(可按需微调)\n const base = 4 * level;\n return `0 ${Math.round(base / 2)}px ${base}px rgba(0,0,0,0.06), 0 ${Math.round(\n base / 4\n )}px ${Math.round(base / 2)}px rgba(0,0,0,0.04)`;\n}\n</script>\n\n<style scoped>\n.rc-card {\n --rc-white: #ffffff;\n --rc-border: #e5e6eb;\n --rc-primary: #1677ff;\n\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid transparent;\n background: var(.rc-white);\n}\n.rc-card--bordered {\n border-color: var(--rc-border);\n}\n\n.rc-card__top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.rc-card__title {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.rc-card__title-text {\n font-weight: 600;\n font-size: 16px;\n color: #1d2129;\n}\n.rc-card__status-text {\n font-size: 14px;\n}\n.rc-card__body {\n display: flex;\n flex-direction: column;\n}\n.rc-card__divider {\n height: 1px;\n background: var(--rc-border);\n}\n.rc-card__action {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n}\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Card from './index.vue';\r\n\r\n// 同时注册小写与驼峰,便于 <rc-card> / <RcCard> 两种写法\r\n(Card as any).name = 'rc-card';\r\nconst PascalName = 'RcCard';\r\n\r\nexport function install(app: App) {\r\n app.component((Card as any).name, Card);\r\n app.component(PascalName, Card);\r\n return app;\r\n}\r\n\r\nexport default Card;\r\n\r\n\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition name=\"rc-toast-fade\" @after-leave=\"onAfterLeave\">\r\n <div v-if=\"visible\" class=\"rc-toast\" :class=\"[`rc-toast--${type}`]\">\r\n <div v-if=\"mask\" class=\"rc-toast__mask\" />\r\n <div class=\"rc-toast__content\">\r\n <div v-if=\"type === 'loading'\" class=\"rc-toast__spinner\" />\r\n <div v-else-if=\"type === 'success'\" class=\"rc-toast__icon rc-toast__icon--success\" />\r\n <div v-else-if=\"type === 'fail'\" class=\"rc-toast__icon rc-toast__icon--fail\" />\r\n <div class=\"rc-toast__text\">{{ message }}</div>\r\n </div>\r\n </div>\r\n </transition>\r\n </teleport>\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch, defineExpose } from 'vue';\r\n\r\nexport type ToastType = 'text' | 'success' | 'fail' | 'loading';\r\nexport interface ToastProps {\r\n message?: string;\r\n type?: ToastType;\r\n duration?: number;\r\n mask?: boolean;\r\n /** 服务端关闭回调,用于卸载容器 */\r\n onAfterLeave?: () => void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ToastProps>(), {\r\n message: '',\r\n type: 'text',\r\n duration: 2000,\r\n mask: false,\r\n});\r\n\r\nconst visible = ref(true);\r\nlet timer: any;\r\n\r\nfunction clearTimer() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n visible.value = false;\r\n}\r\n\r\ndefineExpose({ close });\r\n\r\nonMounted(() => {\r\n if (props.duration && props.duration > 0) {\r\n timer = setTimeout(() => {\r\n close();\r\n }, props.duration);\r\n }\r\n});\r\n\r\nonUnmounted(() => {\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-toast {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.rc-toast__mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.35);\r\n pointer-events: auto;\r\n backdrop-filter: blur(1px);\r\n}\r\n.rc-toast__content {\r\n position: relative;\r\n max-width: 80%;\r\n background: rgba(0, 0, 0, 0.75);\r\n color: #fff;\r\n border-radius: 12px;\r\n padding: 12px 14px;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n}\r\n.rc-toast__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n}\r\n.rc-toast__spinner {\r\n width: 18px;\r\n height: 18px;\r\n border: 2px solid rgba(255,255,255,0.35);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: rc-toast-spin 0.8s linear infinite;\r\n}\r\n.rc-toast__icon {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 50%;\r\n position: relative;\r\n flex: 0 0 18px;\r\n}\r\n.rc-toast__icon--success::before {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n top: 3px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid #fff;\r\n border-bottom: 2px solid #fff;\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::before,\r\n.rc-toast__icon--fail::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 8px;\r\n height: 2px;\r\n background: #fff;\r\n}\r\n.rc-toast__icon--fail::before {\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::after {\r\n transform: rotate(-45deg);\r\n}\r\n\r\n.rc-toast-fade-enter-active,\r\n.rc-toast-fade-leave-active {\r\n transition: opacity .2s ease;\r\n}\r\n.rc-toast-fade-enter-from,\r\n.rc-toast-fade-leave-to {\r\n opacity: 0;\r\n}\r\n@keyframes rc-toast-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import { App, createApp } from 'vue';\r\nimport Toast, { type ToastProps } from './index.vue';\r\n\r\nexport type { ToastProps };\r\nexport interface ShowToastOptions {\r\n message?: string;\r\n type?: 'text' | 'success' | 'fail' | 'loading';\r\n duration?: number;\r\n mask?: boolean;\r\n /** 关闭时回调(仅服务方式有效) */\r\n onClose?: () => void;\r\n}\r\n\r\nlet app: App<Element> | null = null;\r\nlet host: HTMLDivElement | null = null;\r\n\r\nfunction unmount() {\r\n if (app) {\r\n app.unmount();\r\n app = null;\r\n }\r\n if (host) {\r\n document.body.removeChild(host);\r\n host = null;\r\n }\r\n}\r\n\r\nexport function showToast(options: string | ShowToastOptions) {\r\n const opt: ShowToastOptions =\r\n typeof options === 'string' ? { message: options } : (options || {});\r\n unmount();\r\n host = document.createElement('div');\r\n document.body.appendChild(host);\r\n const toastProps: ToastProps = {\r\n message: opt.message,\r\n type: (opt as any).type ?? 'text',\r\n duration: (opt as any).duration ?? 2000,\r\n mask: (opt as any).mask ?? false,\r\n onAfterLeave: () => {\r\n unmount();\r\n opt.onClose?.();\r\n },\r\n };\r\n app = createApp(Toast, toastProps as any);\r\n app.mount(host);\r\n return {\r\n close: hideToast,\r\n };\r\n}\r\n\r\nexport function hideToast() {\r\n if (!app) return;\r\n // 调用暴露的 close 方法\r\n // @ts-ignore\r\n app._instance?.exposed?.close?.();\r\n}\r\n\r\n// 组件注册(可选,提供 rc-toast 用于手动放置 Portal)\r\n(Toast as any).name = 'rc-toast';\r\nexport function install(app: App) {\r\n app.component((Toast as any).name, Toast);\r\n return app;\r\n}\r\n\r\nexport default Toast;\r\n\r\n\r\n","<template>\r\n <div class=\"rc-message\" role=\"alert\" aria-live=\"polite\">\r\n <transition-group name=\"rc-message-fade\" tag=\"div\">\r\n <div\r\n v-for=\"m in messages\"\r\n :key=\"m.id\"\r\n class=\"rc-message__item\"\r\n :class=\"`rc-message--${m.type}`\"\r\n >\r\n <span class=\"rc-message__content\">{{ m.content }}</span>\r\n </div>\r\n </transition-group>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive } from 'vue';\r\n\r\nexport type MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\nexport interface MessageItem {\r\n id: number;\r\n type: MessageType;\r\n content: string;\r\n duration: number; // ms; 0 = persistent (except loading default)\r\n}\r\n\r\nconst messages = reactive<MessageItem[]>([]);\r\nlet uid = 1;\r\n\r\nfunction remove(id: number) {\r\n const idx = messages.findIndex((x) => x.id === id);\r\n if (idx >= 0) messages.splice(idx, 1);\r\n}\r\n\r\nfunction add(type: MessageType, content: string, duration: number) {\r\n const id = uid++;\r\n messages.push({ id, type, content, duration });\r\n if (duration > 0) {\r\n window.setTimeout(() => remove(id), duration);\r\n }\r\n return id;\r\n}\r\n\r\ndefineExpose({ add, remove });\r\n</script>\r\n\r\n<style scoped>\r\n.rc-message {\r\n position: fixed;\r\n top: 16px;\r\n left: 0;\r\n right: 0;\r\n z-index: 10000;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.rc-message__item {\r\n pointer-events: auto;\r\n min-width: 120px;\r\n max-width: 80%;\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n color: #fff;\r\n background: rgba(0, 0, 0, 0.78);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n font-size: 14px;\r\n}\r\n.rc-message--success { background: rgba(22,119,255,0.9); }\r\n.rc-message--warning { background: rgba(250,173,20,0.95); }\r\n.rc-message--error { background: rgba(245,63,63,0.95); }\r\n.rc-message--info { background: rgba(0,0,0,0.78); }\r\n.rc-message--loading { background: rgba(0,0,0,0.78); }\r\n\r\n.rc-message-fade-enter-active,\r\n.rc-message-fade-leave-active {\r\n transition: all .2s ease;\r\n}\r\n.rc-message-fade-enter-from,\r\n.rc-message-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-6px);\r\n}\r\n</style>\r\n\r\n\r\n","import { createVNode, render, type App } from 'vue';\r\nimport MessageHost from './index.vue';\r\n\r\ntype MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n\r\nexport interface MessageOptions {\r\n content: string;\r\n duration?: number; // ms; default 2000, loading 默认 0\r\n type?: MessageType;\r\n}\r\n\r\nlet container: HTMLElement | null = null;\r\nlet hostExposed: any = null;\r\n\r\nfunction ensureHost() {\r\n if (container && hostExposed) return;\r\n container = document.createElement('div');\r\n document.body.appendChild(container);\r\n const vnode = createVNode(MessageHost, {});\r\n render(vnode, container);\r\n hostExposed = (vnode.component as any)?.exposed;\r\n}\r\n\r\nfunction open(type: MessageType, content: string, duration?: number) {\r\n ensureHost();\r\n const d = typeof duration === 'number'\r\n ? duration\r\n : (type === 'loading' ? 0 : 2000);\r\n return hostExposed?.add?.(type, content, d);\r\n}\r\n\r\nexport const message = {\r\n open(opts: MessageOptions) {\r\n return open(opts.type || 'info', opts.content, opts.duration);\r\n },\r\n info(content: string, duration?: number) {\r\n return open('info', content, duration);\r\n },\r\n success(content: string, duration?: number) {\r\n return open('success', content, duration);\r\n },\r\n warning(content: string, duration?: number) {\r\n return open('warning', content, duration);\r\n },\r\n error(content: string, duration?: number) {\r\n return open('error', content, duration);\r\n },\r\n loading(content: string, duration?: number) {\r\n return open('loading', content, duration);\r\n },\r\n destroy() {\r\n if (container) {\r\n render(null, container);\r\n container.remove();\r\n container = null;\r\n hostExposed = null;\r\n }\r\n },\r\n};\r\n\r\nexport default message;\r\n\r\n// 可选:提供 install,注入到 app.config.globalProperties 以便 this.$message 使用\r\nexport function install(app: App) {\r\n (app.config.globalProperties as any).$message = message;\r\n return app;\r\n}\r\n\r\n\r\n","<template>\r\n <i\r\n class=\"rc-icon\"\r\n :class=\"[baseClass, iconClassName, { 'rc-icon--spin': spin }]\"\r\n :style=\"iconStyle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span v-if=\"char\" class=\"rc-icon__unicode\">{{ char }}</span>\r\n </i>\r\n </template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted } from 'vue';\r\nimport type { RecycleUIOptions } from '../../types';\r\nimport { RECYCLE_UI_SYMBOL, defaultRecycleUIConfig } from '../../index';\r\n\r\ndefineOptions({ name: 'rc-icon' });\r\n\r\nconst props = withDefaults(defineProps<{\r\n /** 图标名,例如 'icon_a_in_store',也可直接传完整类名 */\r\n name: string;\r\n /** 尺寸,数字按 px 处理,也可传 '1.2em' 等 */\r\n size?: number | string;\r\n /** 颜色 */\r\n color?: string;\r\n /** 是否旋转(用于 loading 类图标) */\r\n spin?: boolean;\r\n /** Unicode 码点(不带 \\\\u,十六进制,如 'e609' 或 0xe609),用于无类名时渲染 */\r\n code?: string | number;\r\n}>(), {\r\n size: 16,\r\n color: '',\r\n spin: false,\r\n code: '',\r\n});\r\n\r\nconst cfg = inject<RecycleUIOptions>(RECYCLE_UI_SYMBOL, {} as RecycleUIOptions);\r\n\r\nconst baseClass = computed(() => cfg?.iconClass || 'iconfont');\r\nconst iconClassName = computed(() => props.name || '');\r\n\r\nconst sizeCss = computed(() => (typeof props.size === 'number' ? `${props.size}px` : (props.size || '16px')));\r\nconst iconStyle = computed(() => ({\r\n fontSize: sizeCss.value,\r\n color: props.color || undefined,\r\n lineHeight: 1,\r\n fontFamily: cfg?.iconClass || 'iconfont',\r\n}));\r\n\r\n// 将 code 转为字符\r\nconst char = computed(() => {\r\n const c = props.code as any;\r\n if (c === undefined || c === null || c === '' || c === 0) return '';\r\n if (typeof c === 'number') {\r\n return String.fromCharCode(c);\r\n }\r\n const hex = String(c).replace(/^0x/i, '');\r\n const num = parseInt(hex, 16);\r\n if (Number.isNaN(num)) return '';\r\n return String.fromCharCode(num);\r\n});\r\n\r\n// 兜底:若未通过 app.use 安装插件,则在组件挂载时尝试注入默认的 iconfont 样式\r\nonMounted(() => {\r\n if (typeof window === 'undefined') return;\r\n const url = (cfg && cfg.iconCssUrl) || defaultRecycleUIConfig.iconCssUrl;\r\n if (!url) return;\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${url}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url as string;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-icon {\r\n display: inline-block;\r\n vertical-align: -0.125em;\r\n}\r\n.rc-icon__unicode {\r\n /* 让 Unicode 文本走同一字体,确保显示 */\r\n font-family: inherit;\r\n line-height: 1;\r\n}\r\n.rc-icon--spin {\r\n animation: rc-icon-rot 1s linear infinite;\r\n}\r\n@keyframes rc-icon-rot {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Icon from './index.vue';\r\n\r\n(Icon as any).name = 'rc-icon';\r\n\r\nexport function install(app: App) {\r\n app.component((Icon as any).name, Icon);\r\n app.component('RcIcon', Icon);\r\n return app;\r\n}\r\n\r\nexport const RcIcon = Icon;\r\nexport default Icon;\r\n\r\n\r\n","<template>\r\n <div class=\"rc-search-area\">\r\n <!-- 筛选项按钮行 -->\r\n <div class=\"rc-search-area__bar\">\r\n <div\r\n v-for=\"(item, index) in props.items\"\r\n :key=\"index\"\r\n class=\"rc-search-area__item\"\r\n :class=\"{ \r\n 'is-active': activeIndex === index,\r\n 'has-value': getSelectedCount(item) > 0\r\n }\"\r\n @click=\"openFilter(index)\"\r\n >\r\n <span class=\"rc-search-area__item-label\">{{ getItemDisplayText(item) }}</span>\r\n <rc-icon \r\n name=\"icon_a-xiala2\" \r\n :color=\"(activeIndex !== index && getSelectedCount(item) > 0) ? '#1677ff' : '#969799'\"\r\n class=\"rc-search-area__item-arrow\" \r\n :class=\"{ 'is-up': activeIndex === index }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 蒙层 -->\r\n <transition name=\"rc-search-area-fade\">\r\n <div \r\n v-if=\"activeIndex !== null && props.showMask\" \r\n ref=\"maskRef\"\r\n class=\"rc-search-area__mask\"\r\n :style=\"maskStyle\"\r\n @click=\"closeFilter\"\r\n ></div>\r\n </transition>\r\n\r\n <!-- 筛选面板 -->\r\n <transition name=\"rc-search-area-slide\">\r\n <div v-if=\"activeIndex !== null\" ref=\"panelRef\" class=\"rc-search-area__panel\">\r\n <div class=\"rc-search-area__panel-content\">\r\n <!-- 单选模式 -->\r\n <template v-if=\"currentFilter?.type === 'single'\">\r\n <div class=\"rc-search-area__options-grid\">\r\n <div\r\n v-for=\"(option, optIdx) in currentFilter.options\"\r\n :key=\"optIdx\"\r\n class=\"rc-search-area__option\"\r\n :class=\"{ 'is-selected': isSelected(option) }\"\r\n @click=\"selectSingle(option)\"\r\n >\r\n <span class=\"rc-search-area__option-label\">{{ getOptionLabel(option) }}</span>\r\n <rc-icon v-if=\"isSelected(option)\" name=\"icon_select\" class=\"rc-search-area__option-check\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <!-- 多选模式 -->\r\n <template v-else>\r\n <div class=\"rc-search-area__options-grid\">\r\n <div\r\n v-for=\"(option, optIdx) in currentFilter?.options || []\"\r\n :key=\"optIdx\"\r\n class=\"rc-search-area__option\"\r\n :class=\"{ 'is-selected': isSelected(option) }\"\r\n @click=\"toggleOption(option)\"\r\n >\r\n <span class=\"rc-search-area__option-label\">{{ getOptionLabel(option) }}</span>\r\n <rc-icon v-if=\"isSelected(option)\" name=\"icon_select\" class=\"rc-search-area__option-check\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <!-- 无结果提示 -->\r\n <div v-if=\"currentFilter?.options?.length === 0\" class=\"rc-search-area__empty\">\r\n <p>暂无选项</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"rc-search-area__panel-footer\">\r\n <rc-button \r\n block \r\n @click=\"resetCurrentFilter\"\r\n >\r\n 重置\r\n </rc-button>\r\n <rc-button \r\n type=\"primary\"\r\n block \r\n @click=\"confirmFilter\"\r\n >\r\n 确定{{ selectedCountText }}\r\n </rc-button>\r\n </div>\r\n </div>\r\n </transition>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch, nextTick, onUnmounted } from 'vue';\r\nimport RcIcon from '../icon';\r\nimport RcButton from '../button';\r\n\r\ndefineOptions({ name: 'rc-search-area' });\r\n\r\nexport interface FilterOption {\r\n label: string;\r\n value: any;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface FilterItem {\r\n /** 筛选项标签 */\r\n label: string;\r\n /** 筛选项唯一标识 */\r\n key: string;\r\n /** 选项列表 */\r\n options: FilterOption[] | string[];\r\n /** 筛选类型:single 单选,multiple 多选(默认) */\r\n type?: 'single' | 'multiple';\r\n /** 多选时的列数(默认 2) */\r\n column?: number;\r\n}\r\n\r\nconst props = withDefaults(defineProps<{\r\n /** 筛选项配置 */\r\n items: FilterItem[];\r\n /** 当前筛选值(支持 v-model) */\r\n modelValue?: Record<string, any>;\r\n /** 是否显示蒙层 */\r\n showMask?: boolean;\r\n}>(), {\r\n items: () => [],\r\n modelValue: () => ({}),\r\n showMask: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n /** v-model 更新事件 */\r\n (e: 'update:modelValue', values: Record<string, any>): void;\r\n /** 筛选条件变化时触发 */\r\n (e: 'change', values: Record<string, any>, item: FilterItem): void;\r\n /** 确认筛选时触发 */\r\n (e: 'confirm', values: Record<string, any>, item: FilterItem): void;\r\n /** 重置筛选时触发 */\r\n (e: 'reset', key?: string): void;\r\n /** 某个筛选项的值被修改并确认时触发 */\r\n (e: 'item-change', key: string, value: any): void;\r\n}>();\r\n\r\n// 当前打开的筛选项索引\r\nconst activeIndex = ref<number | null>(null);\r\n\r\n// 面板和蒙层的 ref\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst maskRef = ref<HTMLElement | null>(null);\r\n\r\n// 蒙层样式 - 从面板底部开始\r\nconst maskStyle = ref<{ top: string }>({ top: '0px' });\r\n\r\n// 计算蒙层位置\r\nconst updateMaskPosition = async () => {\r\n if (activeIndex.value === null || !panelRef.value) {\r\n return;\r\n }\r\n await nextTick();\r\n const panelRect = panelRef.value.getBoundingClientRect();\r\n const panelTop = panelRect.top;\r\n maskStyle.value = { top: `${panelTop}px` };\r\n};\r\n\r\n// 处理点击外部区域关闭面板\r\nconst handleClickOutside = (event: MouseEvent) => {\r\n if (activeIndex.value === null || !panelRef.value) {\r\n return;\r\n }\r\n \r\n const target = event.target as HTMLElement;\r\n \r\n // 检查点击的目标是否在面板内部\r\n if (panelRef.value.contains(target)) {\r\n return;\r\n }\r\n \r\n // 检查是否点击的是筛选项按钮(避免点击按钮时关闭)\r\n const searchAreaEl = panelRef.value.closest('.rc-search-area');\r\n if (searchAreaEl) {\r\n const barEl = searchAreaEl.querySelector('.rc-search-area__bar');\r\n if (barEl && barEl.contains(target)) {\r\n // 点击的是筛选项按钮,不关闭面板(由按钮的点击事件处理)\r\n return;\r\n }\r\n }\r\n \r\n // 点击的是外部区域,关闭面板\r\n closeFilter();\r\n};\r\n\r\n// 监听面板打开,更新蒙层位置和添加外部点击监听\r\nwatch(activeIndex, async (newVal) => {\r\n if (newVal !== null) {\r\n await nextTick();\r\n updateMaskPosition();\r\n // 监听窗口大小变化和滚动,更新蒙层位置\r\n window.addEventListener('resize', updateMaskPosition);\r\n window.addEventListener('scroll', updateMaskPosition, true);\r\n // 添加点击外部区域关闭面板的监听\r\n document.addEventListener('click', handleClickOutside, true);\r\n } else {\r\n window.removeEventListener('resize', updateMaskPosition);\r\n window.removeEventListener('scroll', updateMaskPosition, true);\r\n document.removeEventListener('click', handleClickOutside, true);\r\n }\r\n});\r\n\r\n// 组件卸载时清理事件监听器\r\nonUnmounted(() => {\r\n window.removeEventListener('resize', updateMaskPosition);\r\n window.removeEventListener('scroll', updateMaskPosition, true);\r\n document.removeEventListener('click', handleClickOutside, true);\r\n});\r\n\r\n// 每个筛选项的选中值(临时状态,用于模态窗内选择)\r\nconst tempSelectedValues = ref<Record<string, any>>({});\r\n\r\n// 已确认的筛选值\r\nconst confirmedValues = ref<Record<string, any>>({ ...props.modelValue });\r\n\r\n// 监听外部传入的 modelValue 变化\r\nwatch(() => props.modelValue, (newValue) => {\r\n confirmedValues.value = { ...(newValue || {}) };\r\n}, { deep: true, immediate: true });\r\n\r\n// 当前打开的筛选项\r\nconst currentFilter = computed(() => {\r\n if (activeIndex.value === null) return null;\r\n return props.items[activeIndex.value];\r\n});\r\n\r\n// 确定按钮文本\r\nconst selectedCountText = computed(() => {\r\n if (!currentFilter.value) return '';\r\n const count = getTempSelectedCount(currentFilter.value);\r\n return count > 0 ? `(${count}项)` : '';\r\n});\r\n\r\n// 获取筛选项的显示文本\r\nconst getItemDisplayText = (item: FilterItem): string => {\r\n const value = confirmedValues.value[item.key];\r\n if (value === undefined || value === null || value === '') {\r\n return item.label;\r\n }\r\n \r\n if (item.type === 'single') {\r\n const option = findOption(item, value);\r\n if (option) {\r\n return `${item.label}: ${getOptionLabel(option)}`;\r\n }\r\n } else {\r\n // 多选\r\n const values = Array.isArray(value) ? value : [value];\r\n if (values.length > 0) {\r\n const labels = values\r\n .map((val) => {\r\n const opt = findOption(item, val);\r\n return opt ? getOptionLabel(opt) : null;\r\n })\r\n .filter((label) => label !== null);\r\n \r\n if (labels.length > 0) {\r\n return `${item.label}: ${labels.join('、')}`;\r\n }\r\n }\r\n }\r\n \r\n return item.label;\r\n};\r\n\r\n// 打开筛选模态窗\r\nconst openFilter = (index: number) => {\r\n const item = props.items[index];\r\n if (!item) return;\r\n \r\n // 如果点击的是当前已打开的筛选项,则收起\r\n if (activeIndex.value === index) {\r\n activeIndex.value = null;\r\n return;\r\n }\r\n \r\n // 初始化临时选中值\r\n const currentValue = confirmedValues.value[item.key];\r\n if (item.type === 'single') {\r\n tempSelectedValues.value[item.key] = currentValue !== undefined ? currentValue : null;\r\n } else {\r\n tempSelectedValues.value[item.key] = currentValue !== undefined \r\n ? (Array.isArray(currentValue) ? [...currentValue] : [currentValue])\r\n : [];\r\n }\r\n \r\n activeIndex.value = index;\r\n};\r\n\r\n// 关闭筛选模态窗\r\nconst closeFilter = () => {\r\n activeIndex.value = null;\r\n};\r\n\r\n// 获取选项的显示文本\r\nconst getOptionLabel = (option: FilterOption | string): string => {\r\n if (typeof option === 'string') return option;\r\n return option.label || String(option.value);\r\n};\r\n\r\n// 获取选项的值\r\nconst getOptionValue = (option: FilterOption | string): any => {\r\n if (typeof option === 'string') return option;\r\n return option.value !== undefined ? option.value : option;\r\n};\r\n\r\n// 查找选项\r\nconst findOption = (item: FilterItem, value: any): FilterOption | string | null => {\r\n return item.options.find((opt) => {\r\n const optValue = getOptionValue(opt);\r\n return optValue === value || String(optValue) === String(value);\r\n }) || null;\r\n};\r\n\r\n// 判断选项是否被选中(临时状态)\r\nconst isSelected = (option: FilterOption | string): boolean => {\r\n if (!currentFilter.value) return false;\r\n const key = currentFilter.value.key;\r\n const tempValue = tempSelectedValues.value[key];\r\n const optValue = getOptionValue(option);\r\n \r\n if (currentFilter.value.type === 'single') {\r\n return tempValue !== null && tempValue !== undefined && tempValue === optValue;\r\n } else {\r\n const tempArray = Array.isArray(tempValue) ? tempValue : [];\r\n return tempArray.some((v) => v === optValue || String(v) === String(optValue));\r\n }\r\n};\r\n\r\n// 单选\r\nconst selectSingle = (option: FilterOption | string) => {\r\n if (!currentFilter.value) return;\r\n const key = currentFilter.value.key;\r\n const optValue = getOptionValue(option);\r\n \r\n // 如果已选中,则取消选中\r\n if (tempSelectedValues.value[key] === optValue) {\r\n tempSelectedValues.value[key] = null;\r\n } else {\r\n tempSelectedValues.value[key] = optValue;\r\n }\r\n};\r\n\r\n// 多选切换\r\nconst toggleOption = (option: FilterOption | string) => {\r\n if (!currentFilter.value) return;\r\n const key = currentFilter.value.key;\r\n const optValue = getOptionValue(option);\r\n const tempArray = Array.isArray(tempSelectedValues.value[key]) \r\n ? [...tempSelectedValues.value[key]] \r\n : [];\r\n \r\n const existingIndex = tempArray.findIndex(\r\n (v) => v === optValue || String(v) === String(optValue)\r\n );\r\n \r\n if (existingIndex >= 0) {\r\n tempArray.splice(existingIndex, 1);\r\n } else {\r\n tempArray.push(optValue);\r\n }\r\n \r\n tempSelectedValues.value[key] = tempArray;\r\n};\r\n\r\n// 重置当前筛选项\r\nconst resetCurrentFilter = () => {\r\n if (!currentFilter.value) return;\r\n const key = currentFilter.value.key;\r\n if (currentFilter.value.type === 'single') {\r\n tempSelectedValues.value[key] = null;\r\n } else {\r\n tempSelectedValues.value[key] = [];\r\n }\r\n};\r\n\r\n// 确认筛选\r\nconst confirmFilter = () => {\r\n if (!currentFilter.value) return;\r\n const key = currentFilter.value.key;\r\n const tempValue = tempSelectedValues.value[key];\r\n const oldValue = confirmedValues.value[key];\r\n \r\n // 更新已确认的值\r\n let newValue: any;\r\n if (currentFilter.value.type === 'single') {\r\n newValue = tempValue !== null && tempValue !== undefined ? tempValue : undefined;\r\n confirmedValues.value[key] = newValue;\r\n } else {\r\n newValue = Array.isArray(tempValue) && tempValue.length > 0 ? tempValue : undefined;\r\n confirmedValues.value[key] = newValue;\r\n }\r\n \r\n // 更新 v-model\r\n emit('update:modelValue', { ...confirmedValues.value });\r\n \r\n // 触发事件\r\n emit('change', { ...confirmedValues.value }, currentFilter.value);\r\n emit('confirm', { ...confirmedValues.value }, currentFilter.value);\r\n \r\n // 如果值发生变化,触发 item-change 事件\r\n const valueChanged = JSON.stringify(oldValue) !== JSON.stringify(newValue);\r\n if (valueChanged) {\r\n emit('item-change', key, newValue);\r\n }\r\n \r\n closeFilter();\r\n};\r\n\r\n// 获取已选中的数量(已确认的)\r\nconst getSelectedCount = (item: FilterItem): number => {\r\n const value = confirmedValues.value[item.key];\r\n if (value === undefined || value === null || value === '') return 0;\r\n \r\n if (item.type === 'single') {\r\n return 1;\r\n } else {\r\n return Array.isArray(value) ? value.length : (value ? 1 : 0);\r\n }\r\n};\r\n\r\n// 获取临时选中的数量\r\nconst getTempSelectedCount = (item: FilterItem): number => {\r\n const tempValue = tempSelectedValues.value[item.key];\r\n if (tempValue === undefined || tempValue === null || tempValue === '') return 0;\r\n \r\n if (item.type === 'single') {\r\n return 1;\r\n } else {\r\n return Array.isArray(tempValue) ? tempValue.length : 0;\r\n }\r\n};\r\n\r\n// 暴露方法供外部调用\r\ndefineExpose({\r\n /** 获取当前筛选值 */\r\n getValues: () => ({ ...confirmedValues.value }),\r\n /** 重置所有筛选 */\r\n reset: () => {\r\n confirmedValues.value = {};\r\n tempSelectedValues.value = {};\r\n emit('update:modelValue', {});\r\n emit('change', {}, null as any);\r\n emit('reset');\r\n },\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.rc-search-area {\r\n position: relative;\r\n width: 100%;\r\n\r\n &__bar {\r\n display: flex;\r\n align-items: center;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n -webkit-overflow-scrolling: touch;\r\n scrollbar-width: none;\r\n -ms-overflow-style: none;\r\n touch-action: pan-x;\r\n padding: 4px 8px;\r\n box-sizing: border-box;\r\n\r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n\r\n &__item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 4px 6px;\r\n font-size: 14px;\r\n color: #323233;\r\n cursor: pointer;\r\n user-select: none;\r\n -webkit-user-select: none;\r\n -webkit-tap-highlight-color: transparent;\r\n transition: all 0.2s;\r\n white-space: nowrap;\r\n flex-shrink: 0;\r\n flex-grow: 0;\r\n background: #f0f0f0;\r\n border: 1px solid transparent;\r\n border-radius: 4px;\r\n margin-right: 8px;\r\n max-width: calc(100% - 16px);\r\n min-width: 0;\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n\r\n &.has-value {\r\n border-color: #1677ff;\r\n color: #1677ff;\r\n background: #fff;\r\n }\r\n\r\n &.is-active {\r\n background: #f0f0f0;\r\n border-color: transparent;\r\n color: #323233;\r\n\r\n &::after {\r\n content: '';\r\n border: 1px solid #f0f0f0;\r\n position: absolute;\r\n bottom: -8px;\r\n width: 100%;\r\n height: 8px;\r\n background: #f0f0f0;\r\n }\r\n }\r\n\r\n &-label {\r\n margin-right: 4px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n min-width: 0;\r\n flex: 1;\r\n max-width: 100%;\r\n }\r\n\r\n &-count {\r\n min-width: 16px;\r\n height: 16px;\r\n padding: 0 4px;\r\n margin-right: 4px;\r\n background: #1677ff;\r\n color: #fff;\r\n border-radius: 8px;\r\n font-size: 11px;\r\n line-height: 16px;\r\n text-align: center;\r\n }\r\n\r\n &-arrow {\r\n font-size: 10px;\r\n color: #969799;\r\n transition: transform 0.2s;\r\n transform: rotate(0deg);\r\n flex-shrink: 0;\r\n\r\n &.is-up {\r\n transform: rotate(180deg);\r\n }\r\n }\r\n }\r\n\r\n &__mask {\r\n position: fixed;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.5);\r\n z-index: 999;\r\n }\r\n\r\n &__panel {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n max-height: 70vh;\r\n background: #f0f0f0;\r\n z-index: 1000;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n border-bottom-right-radius: 8px;\r\n border-bottom-left-radius: 8px;\r\n }\r\n\r\n &__panel-content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 8px;\r\n }\r\n\r\n &__options-grid {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n }\r\n\r\n &__option {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 4px 6px;\r\n background: #f7f8fa;\r\n border: 1px solid #dcdee0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n white-space: nowrap;\r\n flex-shrink: 0;\r\n\r\n &:hover {\r\n border-color: #1677ff;\r\n }\r\n\r\n &.is-selected {\r\n background: #e6f4ff;\r\n border-color: #1677ff;\r\n color: #1677ff;\r\n }\r\n\r\n &-label {\r\n font-size: 14px;\r\n }\r\n\r\n &-check {\r\n color: #1677ff;\r\n }\r\n }\r\n\r\n &__empty {\r\n padding: 40px 0;\r\n text-align: center;\r\n color: #969799;\r\n font-size: 14px;\r\n }\r\n\r\n &__panel-footer {\r\n display: flex;\r\n gap: 12px;\r\n padding: 8px;\r\n border-top: 1px solid #eee;\r\n flex-shrink: 0;\r\n }\r\n}\r\n\r\n// 过渡动画\r\n.rc-search-area-fade-enter-active,\r\n.rc-search-area-fade-leave-active {\r\n transition: opacity 0.3s ease-out;\r\n}\r\n\r\n.rc-search-area-fade-enter-from,\r\n.rc-search-area-fade-leave-to {\r\n opacity: 0;\r\n}\r\n\r\n.rc-search-area-fade-enter-to,\r\n.rc-search-area-fade-leave-from {\r\n opacity: 1;\r\n}\r\n\r\n.rc-search-area-slide-enter-active,\r\n.rc-search-area-slide-leave-active {\r\n transition: max-height 0.3s ease-out, opacity 0.3s ease-out;\r\n overflow: hidden;\r\n}\r\n\r\n.rc-search-area-slide-enter-from,\r\n.rc-search-area-slide-leave-to {\r\n max-height: 0;\r\n opacity: 0;\r\n}\r\n\r\n.rc-search-area-slide-enter-to,\r\n.rc-search-area-slide-leave-from {\r\n max-height: 70vh;\r\n opacity: 1;\r\n}\r\n</style>\r\n\r\n","/**\r\n * @description 基础用法\r\n */\r\nimport type { App } from 'vue';\r\nimport RcSearchArea from './index.vue';\r\n\r\nexport { RcSearchArea };\r\nexport type { FilterItem, FilterOption } from './index.vue';\r\n\r\nexport const install = (app: App) => {\r\n app.component('RcSearchArea', RcSearchArea);\r\n app.component('rc-search-area', RcSearchArea);\r\n};\r\n\r\nexport default RcSearchArea;\r\n\r\n","// library entry\r\nimport type { App, Plugin } from 'vue';\r\nimport { install as installButton } from './components/button';\r\nimport { install as installDescriptions } from './components/descriptions';\r\nimport { install as installCard } from './components/card';\r\nimport { install as installToast } from './components/toast';\r\nimport { install as installMessage } from './components/message';\r\nimport { install as installIcon } from './components/icon/index';\r\nimport { install as installSearchArea } from './components/search-area';\r\nimport type { RecycleUIOptions } from './types';\r\n\r\nexport const RECYCLE_UI_SYMBOL = Symbol('RECYCLE_UI_CONFIG');\r\n\r\nexport const defaultRecycleUIConfig: RecycleUIOptions = {\r\n prefix: 'rc',\r\n autoRegister: true,\r\n provideKey: RECYCLE_UI_SYMBOL,\r\n // 预留主题/其他全局配置\r\n theme: {},\r\n // IconFont 默认配置(可在 app.use 时覆盖)\r\n iconCssUrl: '//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css',\r\n iconClass: 'iconfont',\r\n};\r\n\r\n// 统一导出所有类型的命名空间\r\nexport namespace RecycleUiTypes {\r\n // 核心配置类型\r\n export type Options = RecycleUIOptions;\r\n export type DefaultConfig = typeof defaultRecycleUIConfig;\r\n \r\n // Message 相关类型\r\n export type MessageOptions = import('./components/message').MessageOptions;\r\n export type MessageType = import('./components/message/index.vue').MessageType;\r\n export type MessageItem = import('./components/message/index.vue').MessageItem;\r\n \r\n // Toast 相关类型\r\n export type ToastProps = import('./components/toast/index.vue').ToastProps;\r\n export type ToastType = import('./components/toast/index.vue').ToastType;\r\n export type ShowToastOptions = import('./components/toast').ShowToastOptions;\r\n}\r\n\r\nfunction doAutoRegister(app: App, opts: RecycleUIOptions) {\r\n if (opts.autoRegister === false) return;\r\n if (typeof installButton === 'function') installButton(app);\r\n if (typeof installDescriptions === 'function') installDescriptions(app);\r\n if (typeof installCard === 'function') installCard(app);\r\n if (typeof installToast === 'function') installToast(app);\r\n if (typeof installIcon === 'function') installIcon(app);\r\n if (typeof installMessage === 'function') installMessage(app);\r\n if (typeof installSearchArea === 'function') installSearchArea(app);\r\n}\r\n\r\nexport const install = (app: App, options?: RecycleUIOptions) => {\r\n const cfg: RecycleUIOptions = { ...defaultRecycleUIConfig, ...(options || {}) };\r\n // 提供全局配置\r\n app.provide(cfg.provideKey ?? RECYCLE_UI_SYMBOL, cfg);\r\n // 供模板/实例访问:this.$recycleUI\r\n (app.config.globalProperties as any).$recycleUI = cfg;\r\n // 注入 IconFont 样式链接(浏览器环境)\r\n if (typeof window !== 'undefined' && cfg.iconCssUrl) {\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${cfg.iconCssUrl}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = cfg.iconCssUrl;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n }\r\n // 自动注册内置组件(可通过 autoRegister 关闭)\r\n doAutoRegister(app, cfg);\r\n return app;\r\n};\r\n\r\n// 默认导出为插件,支持 app.use(recycleUi, options)\r\nconst plugin: Plugin = { install };\r\nexport default plugin;\r\n\r\n// 也导出命名组件安装器与默认配置(defaultRecycleUIConfig 已在上方以常量形式导出)\r\n\r\n// 可选:工厂方法,便于创建带预设配置的插件\r\nexport function createRecycleUI(options?: RecycleUIOptions): Plugin {\r\n return {\r\n install(app: App) {\r\n install(app, options);\r\n },\r\n };\r\n}\r\n\r\n// 按需导出组件与其安装器(供文档与业务直接使用)\r\nexport { default as RcButton } from './components/button';\r\nexport { RcDescriptions, RcDescriptionsItem } from './components/descriptions';\r\nexport { install as installButton } from './components/button';\r\nexport { install as installDescriptions } from './components/descriptions';\r\nexport { default as RcCard } from './components/card';\r\nexport { install as installCard } from './components/card';\r\n// 兼容别名导出(文档示例中的 rcXxx)\r\nexport { RcDescriptions as rcDescriptions, RcDescriptionsItem as rcDescriptionsItem } from './components/descriptions';\r\n// Toast 服务导出\r\nexport { default as RcToast, showToast, hideToast } from './components/toast';\r\n// Icon 组件导出\r\nexport { default as RcIcon } from './components/icon/index';\r\nexport { install as installIcon } from './components/icon/index';\r\n// Message 服务(对标 antd 的 message)\r\nexport { default as message } from './components/message';\r\nexport { install as installMessage } from './components/message';\r\n// SearchArea 组件导出\r\nexport { default as RcSearchArea } from './components/search-area';\r\nexport { install as installSearchArea } from './components/search-area';\r\nexport type { FilterItem, FilterOption } from './components/search-area';\r\n"],"names":["props","__props","emit","__emit","onClick","ev","radius","computed","v","_createElementBlock","_normalizeClass","_openBlock","_hoisted_2","_renderSlot","_ctx","Button","install","app","inject","providedGapPx","providedColCount","providedLabelWidth","spanNum","n","max","safe","computedWidth","gapPx","k","totalGap","interGap","labelStyle","injected","w","_normalizeStyle","_createElementVNode","_hoisted_1","wrapEl","ref","gapStyle","colCount","itemWidth","singleWidth","watchEffect","base","provide","labelWidthCss","normalizedData","keyK","_a","keyV","_b","_c","it","$slots","_Fragment","_renderList","idx","_createBlock","rcDescriptionsItem","Descriptions","DescriptionsItem","RcDescriptions","RcDescriptionsItem","wrapperStyle","shadowByLevel","toCssSize","bodyPadding","bodyGap","level","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","Card","PascalName","visible","timer","clearTimer","close","__expose","onMounted","onUnmounted","_Teleport","_createVNode","_Transition","_hoisted_6","host","unmount","showToast","options","opt","toastProps","createApp","Toast","hideToast","messages","reactive","uid","remove","id","x","add","type","content","duration","_TransitionGroup","m","container","hostExposed","ensureHost","vnode","createVNode","MessageHost","render","open","d","message","opts","cfg","RECYCLE_UI_SYMBOL","baseClass","iconClassName","sizeCss","iconStyle","char","c","hex","num","url","defaultRecycleUIConfig","selector","link","Icon","activeIndex","panelRef","maskRef","maskStyle","updateMaskPosition","nextTick","panelTop","handleClickOutside","event","target","searchAreaEl","barEl","closeFilter","watch","newVal","tempSelectedValues","confirmedValues","newValue","currentFilter","selectedCountText","count","getTempSelectedCount","getItemDisplayText","item","value","option","findOption","getOptionLabel","values","labels","val","label","openFilter","index","currentValue","getOptionValue","optValue","isSelected","key","tempValue","selectSingle","toggleOption","tempArray","existingIndex","resetCurrentFilter","confirmFilter","oldValue","getSelectedCount","$event","_unref","RcIcon","optIdx","_hoisted_8","_hoisted_9","_hoisted_11","_d","_hoisted_12","_cache","_hoisted_13","RcButton","_createTextVNode","RcSearchArea","doAutoRegister","installButton","installDescriptions","installCard","installToast","installIcon","installMessage","installSearchArea","plugin","createRecycleUI"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { App, Plugin } from 'vue';
|
|
|
2
2
|
import type { RecycleUIOptions } from './types';
|
|
3
3
|
export declare const RECYCLE_UI_SYMBOL: unique symbol;
|
|
4
4
|
export declare const defaultRecycleUIConfig: RecycleUIOptions;
|
|
5
|
-
export declare namespace
|
|
5
|
+
export declare namespace RecycleUiTypes {
|
|
6
6
|
type Options = RecycleUIOptions;
|
|
7
7
|
type DefaultConfig = typeof defaultRecycleUIConfig;
|
|
8
8
|
type MessageOptions = import('./components/message').MessageOptions;
|
|
@@ -28,4 +28,7 @@ export { default as RcIcon } from './components/icon/index';
|
|
|
28
28
|
export { install as installIcon } from './components/icon/index';
|
|
29
29
|
export { default as message } from './components/message';
|
|
30
30
|
export { install as installMessage } from './components/message';
|
|
31
|
+
export { default as RcSearchArea } from './components/search-area';
|
|
32
|
+
export { install as installSearchArea } from './components/search-area';
|
|
33
|
+
export type { FilterItem, FilterOption } from './components/search-area';
|
|
31
34
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAQvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAE7D,eAAO,MAAM,sBAAsB,EAAE,gBASpC,CAAC;AAGF,yBAAiB,cAAc,CAAC;IAE9B,KAAY,OAAO,GAAG,gBAAgB,CAAC;IACvC,KAAY,aAAa,GAAG,OAAO,sBAAsB,CAAC;IAG1D,KAAY,cAAc,GAAG,OAAO,sBAAsB,EAAE,cAAc,CAAC;IAC3E,KAAY,WAAW,GAAG,OAAO,gCAAgC,EAAE,WAAW,CAAC;IAC/E,KAAY,WAAW,GAAG,OAAO,gCAAgC,EAAE,WAAW,CAAC;IAG/E,KAAY,UAAU,GAAG,OAAO,8BAA8B,EAAE,UAAU,CAAC;IAC3E,KAAY,SAAS,GAAG,OAAO,8BAA8B,EAAE,SAAS,CAAC;IACzE,KAAY,gBAAgB,GAAG,OAAO,oBAAoB,EAAE,gBAAgB,CAAC;CAC9E;AAaD,eAAO,MAAM,OAAO,GAAI,KAAK,GAAG,EAAE,UAAU,gBAAgB,aAqB3D,CAAC;AAGF,QAAA,MAAM,MAAM,EAAE,MAAoB,CAAC;AACnC,eAAe,MAAM,CAAC;AAKtB,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAMlE;AAGD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEvH,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
|