@salesql/sql_components_vue3 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/events.d.ts +16 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +39 -8
- package/dist/index.es.js +1067 -150
- package/dist/index.es.js.map +1 -1
- package/dist/sql_components_vue3.css +1 -1
- package/dist/ui/DsAlert/DsAlert.types.d.ts +13 -0
- package/dist/ui/DsAlert/DsAlert.vue.d.ts +75 -0
- package/dist/ui/DsAlert/index.d.ts +2 -0
- package/dist/ui/DsAvatar/DsAvatar.types.d.ts +8 -0
- package/dist/ui/DsAvatar/DsAvatar.vue.d.ts +62 -0
- package/dist/ui/DsAvatar/index.d.ts +2 -0
- package/dist/ui/DsBadge/DsBadge.types.d.ts +9 -0
- package/dist/ui/DsBadge/DsBadge.vue.d.ts +26 -0
- package/dist/ui/DsBadge/index.d.ts +2 -0
- package/dist/ui/DsButton/DsButton.types.d.ts +21 -0
- package/dist/ui/DsButton/DsButton.vue.d.ts +94 -0
- package/dist/ui/DsButton/index.d.ts +2 -0
- package/dist/ui/DsCheckbox/DsCheckbox.types.d.ts +7 -0
- package/dist/ui/DsCheckbox/DsCheckbox.vue.d.ts +49 -0
- package/dist/ui/DsCheckbox/index.d.ts +2 -0
- package/dist/ui/DsContactValue/DsContactValue.types.d.ts +16 -0
- package/dist/ui/DsContactValue/DsContactValue.vue.d.ts +112 -0
- package/dist/ui/DsContactValue/index.d.ts +2 -0
- package/dist/ui/DsDataCard/DsDataCard.types.d.ts +9 -0
- package/dist/ui/DsDataCard/DsDataCard.vue.d.ts +173 -0
- package/dist/ui/DsDataCard/index.d.ts +2 -0
- package/dist/ui/DsInput/DsInput.types.d.ts +15 -0
- package/dist/ui/DsInput/DsInput.vue.d.ts +112 -0
- package/dist/ui/DsInput/index.d.ts +2 -0
- package/dist/ui/DsModal/DsModal.types.d.ts +8 -0
- package/dist/ui/DsModal/DsModal.vue.d.ts +69 -0
- package/dist/ui/DsModal/index.d.ts +2 -0
- package/dist/ui/DsNotification/DsNotification.types.d.ts +14 -0
- package/dist/ui/DsNotification/DsNotification.vue.d.ts +83 -0
- package/dist/ui/DsNotification/index.d.ts +2 -0
- package/dist/ui/DsSpinner/DsSpinner.types.d.ts +6 -0
- package/dist/ui/{SqlSpinner/SqlSpinner.vue.d.ts → DsSpinner/DsSpinner.vue.d.ts} +15 -15
- package/dist/ui/DsSpinner/index.d.ts +2 -0
- package/dist/ui/DsTable/DsTable.types.d.ts +16 -0
- package/dist/ui/{BasicTable/BasicTable.vue.d.ts → DsTable/DsTable.vue.d.ts} +15 -6
- package/dist/ui/DsTable/index.d.ts +2 -0
- package/dist/ui/DsTag/DsTag.types.d.ts +8 -0
- package/dist/ui/DsTag/DsTag.vue.d.ts +45 -0
- package/dist/ui/DsTag/index.d.ts +2 -0
- package/dist/ui/DsTextarea/DsTextarea.types.d.ts +8 -0
- package/dist/ui/DsTextarea/DsTextarea.vue.d.ts +70 -0
- package/dist/ui/DsTextarea/index.d.ts +2 -0
- package/dist/ui/DsVerificationIcon/DsVerificationIcon.types.d.ts +6 -0
- package/dist/ui/DsVerificationIcon/DsVerificationIcon.vue.d.ts +52 -0
- package/dist/ui/DsVerificationIcon/index.d.ts +2 -0
- package/package.json +6 -6
- package/dist/ui/BasicTable/BasicTable.types.d.ts +0 -16
- package/dist/ui/BasicTable/index.d.ts +0 -2
- package/dist/ui/SqlButton/SqlButton.types.d.ts +0 -31
- package/dist/ui/SqlButton/SqlButton.vue.d.ts +0 -75
- package/dist/ui/SqlButton/index.d.ts +0 -2
- package/dist/ui/SqlSpinner/SqlSpinner.types.d.ts +0 -11
- package/dist/ui/SqlSpinner/index.d.ts +0 -2
|
@@ -1,2 +1,18 @@
|
|
|
1
1
|
export declare const CLICK: "click";
|
|
2
2
|
export type ClickEventName = typeof CLICK;
|
|
3
|
+
export declare const CLOSE: "close";
|
|
4
|
+
export type CloseEventName = typeof CLOSE;
|
|
5
|
+
export declare const FOCUS: "focus";
|
|
6
|
+
export type FocusEventName = typeof FOCUS;
|
|
7
|
+
export declare const BLUR: "blur";
|
|
8
|
+
export type BlurEventName = typeof BLUR;
|
|
9
|
+
export declare const COPY: "copy";
|
|
10
|
+
export type CopyEventName = typeof COPY;
|
|
11
|
+
export declare const CORRECT: "correct";
|
|
12
|
+
export type CorrectEventName = typeof CORRECT;
|
|
13
|
+
export declare const INCORRECT: "incorrect";
|
|
14
|
+
export type IncorrectEventName = typeof INCORRECT;
|
|
15
|
+
export declare const SORT: "sort";
|
|
16
|
+
export type SortEventName = typeof SORT;
|
|
17
|
+
export declare const EDIT: "edit";
|
|
18
|
+
export type EditEventName = typeof EDIT;
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),r={LIGHT:"light",DARK:"dark"},E={SMALL:"small",MEDIUM:"medium",LARGE:"large"},b=["aria-label","aria-live","aria-hidden"],B={key:0,class:"sr-only"},T=e.defineComponent({__name:"SqlSpinner",props:{type:{type:String,default:r.DARK},size:{type:String,default:E.SMALL},label:{type:String,default:""}},setup(t){const s=t,n=e.computed(()=>s.label&&s.label.length>0);return(l,a)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(["sql-spinner",[`theme-${t.type}`,`sql-spinner--${t.size}`]]),role:"status","aria-label":n.value?t.label:void 0,"aria-live":n.value?"polite":void 0,"aria-hidden":n.value?void 0:"true"},[a[0]||(a[0]=e.createElementVNode("span",{class:"ring"},null,-1)),n.value?(e.openBlock(),e.createElementBlock("span",B,e.toDisplayString(t.label),1)):e.createCommentVNode("",!0)],10,b))}}),u=(t,s)=>{const n=t.__vccOpts||t;for(const[l,a]of s)n[l]=a;return n},S=u(T,[["__scopeId","data-v-9694500e"]]),c={DEFAULT:"default",PRIMARY:"primary",SECONDARY:"secondary",TERTIARY:"tertiary",SPECIAL:"special",SPECIAL2:"special2",SPECIAL3:"special3",DOTTED:"dotted",DANGER:"danger",GRADIENT:"gradient"},m={SMALL:"small",SMALL_SQUARE:"small-square",SMALL_SQUARE_NO_PADDING:"small-square-no-padding",MEDIUM:"medium",MEDIUM_SQUARE:"medium-square",LARGE:"large",LARGE_SQUARE:"large-square",XLARGE:"xlarge",XLARGE_SQUARE:"xlarge-square"},y={BUTTON:"button",SUBMIT:"submit",RESET:"reset"},g="click",L=["type","disabled","autofocus","aria-busy","aria-disabled","aria-pressed"],k={key:1,class:"slotted-content"},A=e.defineComponent({__name:"SqlButton",props:{type:{type:String,default:c.DEFAULT},size:{type:String,default:m.LARGE},nativeType:{type:String,default:y.BUTTON},selected:{type:Boolean,default:null},loading:Boolean,disabled:Boolean,plain:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean},setup(t,{emit:s}){const n=t,l=s,a=e.computed(()=>n.type===c.PRIMARY||n.type===c.DANGER?r.LIGHT:r.DARK);function o(i){n.disabled||n.loading||l(g,i)}return(i,_)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["sql-button",[t.type?`sql-button--${t.type}`:"",t.size?`sql-button--${t.size}`:"",{"is-disabled":t.disabled,"is-loading":t.loading,"is-circle":t.circle,"is-plain":t.plain,"is-round":t.round,"selectable-button":t.selected!==null,"is-selected":t.selected}]]),type:t.nativeType,disabled:t.disabled||t.loading,autofocus:t.autofocus,"aria-busy":t.loading||void 0,"aria-disabled":t.disabled||t.loading||void 0,"aria-pressed":t.selected!==null?!!t.selected:void 0,onClick:o},[e.createElementVNode("span",{class:e.normalizeClass(["slot-container",{"is-loading":t.loading}])},[t.loading?(e.openBlock(),e.createBlock(e.unref(S),{key:0,class:"sql-spinner",type:a.value},null,8,["type"])):e.createCommentVNode("",!0),i.$slots.default?(e.openBlock(),e.createElementBlock("div",k,[e.renderSlot(i.$slots,"default",{},void 0,!0)])):e.createCommentVNode("",!0)],2)],10,L))}}),N=u(A,[["__scopeId","data-v-9eeb1a72"]]),d={LEFT:"left",CENTER:"center",RIGHT:"right"},p={class:"basic-table"},I={class:"basic-table__wrapper"},f={class:"basic-table__table"},R={key:0},v=["colspan"],h=e.defineComponent({__name:"BasicTable",props:{columns:{type:Array,required:!0},rows:{type:Array,required:!0},emptyMessage:{type:String,default:""}},setup(t){return(s,n)=>(e.openBlock(),e.createElementBlock("div",p,[e.createElementVNode("div",I,[e.createElementVNode("table",f,[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,l=>{var a;return e.openBlock(),e.createElementBlock("th",{key:l.key,class:e.normalizeClass(`basic-table__th--${(a=l.align)!=null?a:e.unref(d).LEFT}`),style:e.normalizeStyle(l.width?{width:l.width}:void 0)},e.toDisplayString(l.label),7)}),128))])]),e.createElementVNode("tbody",null,[t.rows.length===0?(e.openBlock(),e.createElementBlock("tr",R,[e.createElementVNode("td",{class:"basic-table__empty",colspan:t.columns.length,"data-testid":"basic-table-empty"},[e.renderSlot(s.$slots,"empty",{},()=>[e.createTextVNode(e.toDisplayString(t.emptyMessage),1)],!0)],8,v)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.rows,l=>(e.openBlock(),e.createElementBlock("tr",{key:l.id,"data-testid":"basic-table-row"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,a=>{var o;return e.openBlock(),e.createElementBlock("td",{key:a.key,class:e.normalizeClass(`basic-table__td--${(o=a.align)!=null?o:e.unref(d).LEFT}`)},[e.renderSlot(s.$slots,`cell-${a.key}`,{row:l},()=>[e.createTextVNode(e.toDisplayString(l[a.key]),1)],!0)],2)}),128))]))),128))])])])]))}}),C=u(h,[["__scopeId","data-v-8f713759"]]);exports.BASIC_TABLE_ALIGN=d;exports.BasicTable=C;exports.SQL_BUTTON_NATIVE_TYPES=y;exports.SQL_BUTTON_SIZES=m;exports.SQL_BUTTON_TYPES=c;exports.SQL_SPINNER_SIZES=E;exports.SQL_SPINNER_THEME_MODES=r;exports.SqlButton=N;exports.SqlSpinner=S;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),h={DARK:"dark",LIGHT:"light",ACCENT:"accent"},Q=["aria-label","aria-hidden"],J={key:0,class:"ds-spinner__sr-only"},ee=e.defineComponent({__name:"DsSpinner",props:{size:{type:Number,default:24},tone:{type:String,default:h.DARK},label:{type:String,default:""}},setup(t){return(l,n)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(["ds-spinner",`ds-spinner--${t.tone}`]),role:"status",style:e.normalizeStyle({width:`${t.size}px`,height:`${t.size}px`}),"aria-label":t.label||void 0,"aria-hidden":t.label?void 0:"true"},[t.label?(e.openBlock(),e.createElementBlock("span",J,e.toDisplayString(t.label),1)):e.createCommentVNode("",!0)],14,Q))}}),f=(t,l)=>{const n=t.__vccOpts||t;for(const[a,o]of l)n[a]=o;return n},x=f(ee,[["__scopeId","data-v-190a8af4"]]),z="click",v="close",N="focus",C="blur",T="copy",D="correct",p="incorrect",_="sort",M="edit",V={PRIMARY:"primary",SECONDARY:"secondary",TERTIARY:"tertiary",QUATERNARY:"quaternary",SPECIAL:"special"},L={SMALL:"small",MEDIUM:"medium",LARGE:"large",XLARGE:"xlarge"},F={BUTTON:"button",SUBMIT:"submit",RESET:"reset"},te=["type","disabled","autofocus","aria-busy","aria-disabled","aria-label"],ae={key:1,class:"ds-button__icon ds-button__icon--leading"},oe={class:"material-icons","aria-hidden":"true"},le={key:2,class:"ds-button__label"},ne={key:3,class:"ds-button__icon ds-button__icon--trailing"},ie={class:"material-icons","aria-hidden":"true"},re=e.defineComponent({__name:"DsButton",props:{variant:{type:String,default:V.PRIMARY},size:{type:String,default:L.MEDIUM},nativeType:{type:String,default:F.BUTTON},leftIcon:{type:String,default:""},rightIcon:{type:String,default:""},ariaLabel:{type:String,default:""},disabled:Boolean,loading:Boolean,circle:Boolean,dashed:Boolean,autofocus:Boolean},emits:[z],setup(t,{emit:l}){const n=t,a=l,o=e.computed(()=>n.size===L.SMALL?14:20),i=e.computed(()=>n.variant===V.PRIMARY?h.LIGHT:h.DARK);function r(s){n.disabled||n.loading||a(z,s)}return(s,d)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["ds-button",[`ds-button--${t.variant}`,`ds-button--${t.size}`,{"is-disabled":t.disabled||t.loading,"is-loading":t.loading,"is-circle":t.circle,"is-dashed":t.dashed}]]),type:t.nativeType,disabled:t.disabled||t.loading,autofocus:t.autofocus,"aria-busy":t.loading||void 0,"aria-disabled":t.disabled||t.loading||void 0,"aria-label":t.ariaLabel||void 0,onClick:r},[t.loading?(e.openBlock(),e.createBlock(e.unref(x),{key:0,class:"ds-button__spinner",size:o.value,tone:i.value},null,8,["size","tone"])):e.createCommentVNode("",!0),!t.loading&&(t.leftIcon||s.$slots.leading)?(e.openBlock(),e.createElementBlock("span",ae,[e.renderSlot(s.$slots,"leading",{},()=>[e.createElementVNode("i",oe,e.toDisplayString(t.leftIcon),1)],!0)])):e.createCommentVNode("",!0),!t.loading&&s.$slots.default?(e.openBlock(),e.createElementBlock("span",le,[e.renderSlot(s.$slots,"default",{},void 0,!0)])):e.createCommentVNode("",!0),!t.loading&&(t.rightIcon||s.$slots.trailing)?(e.openBlock(),e.createElementBlock("span",ne,[e.renderSlot(s.$slots,"trailing",{},()=>[e.createElementVNode("i",ie,e.toDisplayString(t.rightIcon),1)],!0)])):e.createCommentVNode("",!0)],10,te))}}),I=f(re,[["__scopeId","data-v-662e5512"]]),U={DEFAULT:"default",SUCCESS:"success",INFO:"info",WARNING:"warning",ERROR:"error"},se=["aria-label"],ce=e.defineComponent({__name:"DsTag",props:{tone:{type:String,default:U.DEFAULT},rounded:Boolean,closable:Boolean,closeLabel:{type:String,default:""}},setup(t,{emit:l}){const n=l;return(a,o)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(["ds-tag",[`ds-tag--${t.tone}`,{"is-rounded":t.rounded}]])},[e.renderSlot(a.$slots,"default",{},void 0,!0),t.closable?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ds-tag__close","aria-label":t.closeLabel||void 0,onClick:o[0]||(o[0]=i=>n(e.unref(v)))},[...o[1]||(o[1]=[e.createElementVNode("i",{class:"material-icons","aria-hidden":"true"},"close",-1)])],8,se)):e.createCommentVNode("",!0)],2))}}),de=f(ce,[["__scopeId","data-v-4507fdca"]]),$={ACCENT:"accent",GREY:"grey",INFO:"info",SUCCESS:"success",ERROR:"error",WARNING:"warning"},ue=e.defineComponent({__name:"DsBadge",props:{tone:{type:String,default:$.ACCENT}},setup(t){return(l,n)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(["ds-badge",`ds-badge--${t.tone}`])},[e.renderSlot(l.$slots,"default",{},void 0,!0)],2))}}),P=f(ue,[["__scopeId","data-v-f10a17a0"]]),me=["src","alt"],fe=["aria-label"],ye=e.defineComponent({__name:"DsAvatar",props:{image:{type:String,default:""},firstName:{type:String,default:""},lastName:{type:String,default:""},uid:{type:String,default:""},size:{type:Number,default:40},circular:Boolean,alt:{type:String,default:""}},setup(t){const l=t,n=e.computed(()=>l.firstName&&l.lastName?(l.firstName.charAt(0)+l.lastName.charAt(0)).toUpperCase():""),a=e.computed(()=>l.alt||`${l.firstName} ${l.lastName}`.trim()),o=e.computed(()=>({width:`${l.size}px`,height:`${l.size}px`})),i=e.computed(()=>{const r=l.uid||l.firstName+l.lastName;let s=0;for(let c=0;c<r.length;c++)s=r.charCodeAt(c)+((s<<5)-s),s=s&s;const d=[0,0,0];for(let c=0;c<3;c++)d[c]=s>>c*8&255;const u=d[0]>=200&&d[1]>=200&&d[2]>=200;return{bg:`rgb(${d[0]}, ${d[1]}, ${d[2]})`,fg:u?"#323f4b":"#fff"}});return(r,s)=>t.image?(e.openBlock(),e.createElementBlock("img",{key:0,class:e.normalizeClass(["ds-avatar",{"is-circular":t.circular}]),src:t.image,alt:t.alt,style:e.normalizeStyle(o.value)},null,14,me)):n.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["ds-avatar ds-avatar--initials",{"is-circular":t.circular}]),role:"img","aria-label":a.value||void 0,style:e.normalizeStyle([o.value,{background:i.value.bg,color:i.value.fg,fontSize:`${Math.round(t.size*.4)}px`}])},e.toDisplayString(n.value),15,fe)):(e.openBlock(),e.createElementBlock("div",{key:2,class:e.normalizeClass(["ds-avatar ds-avatar--placeholder",{"is-circular":t.circular}]),style:e.normalizeStyle(o.value),"aria-hidden":"true"},null,6))}}),ve=f(ye,[["__scopeId","data-v-e965ed47"]]),w={LEFT:"left",CENTER:"center",RIGHT:"right"},be={class:"ds-table"},ke={class:"ds-table__wrapper"},Se={class:"ds-table__table"},ge={key:0},Ee=["colspan"],Be=e.defineComponent({__name:"DsTable",props:{columns:{type:Array,required:!0},rows:{type:Array,required:!0},emptyMessage:{type:String,default:""},highlightRowId:{type:[String,Number],default:null}},setup(t){return(l,n)=>(e.openBlock(),e.createElementBlock("div",be,[e.createElementVNode("div",ke,[e.createElementVNode("table",Se,[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,a=>{var o;return e.openBlock(),e.createElementBlock("th",{key:a.key,class:e.normalizeClass(`ds-table__th--${(o=a.align)!=null?o:e.unref(w).LEFT}`),style:e.normalizeStyle(a.width?{width:a.width}:void 0)},e.toDisplayString(a.label),7)}),128))])]),e.createElementVNode("tbody",null,[t.rows.length===0?(e.openBlock(),e.createElementBlock("tr",ge,[e.createElementVNode("td",{class:"ds-table__empty",colspan:t.columns.length,"data-testid":"ds-table-empty"},[e.renderSlot(l.$slots,"empty",{},()=>[e.createTextVNode(e.toDisplayString(t.emptyMessage),1)],!0)],8,Ee)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.rows,a=>(e.openBlock(),e.createElementBlock("tr",{key:a.id,class:e.normalizeClass({"is-highlighted":a.id===t.highlightRowId}),"data-testid":"ds-table-row"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,o=>{var i;return e.openBlock(),e.createElementBlock("td",{key:o.key,class:e.normalizeClass(`ds-table__td--${(i=o.align)!=null?i:e.unref(w).LEFT}`)},[e.renderSlot(l.$slots,`cell-${o.key}`,{row:a},()=>[e.createTextVNode(e.toDisplayString(a[o.key]),1)],!0)],2)}),128))],2))),128))])])])]))}}),he=f(Be,[["__scopeId","data-v-1735ff35"]]),E={TEXT:"text",EMAIL:"email",PASSWORD:"password",TEL:"tel",NUMBER:"number",SEARCH:"search",URL:"url"},G={SM:"sm",MD:"md"},Ne={class:"ds-input__wrap"},Ce=["id","type","placeholder","disabled","name","autocomplete","aria-invalid","aria-describedby"],Te={key:0,class:"ds-input__suffix"},De={key:0,class:"material-icons ds-input__error-icon","aria-hidden":"true"},pe=["aria-label","aria-pressed"],Ie={class:"material-icons","aria-hidden":"true"},$e=["id"],Ve=e.defineComponent({__name:"DsInput",props:e.mergeModels({type:{type:String,default:E.TEXT},size:{type:String,default:G.SM},placeholder:{type:String,default:""},disabled:Boolean,error:Boolean,errorMessage:{type:String,default:""},showErrorIcon:Boolean,name:{type:String,default:""},id:{type:String,default:""},autocomplete:{type:String,default:""},toggleLabel:{type:String,default:""}},{modelValue:{default:""},modelModifiers:{}}),emits:e.mergeModels([N,C],["update:modelValue"]),setup(t,{emit:l}){const n=e.useModel(t,"modelValue"),a=t,o=l,i=e.useSlots(),r=e.ref(!1),s=e.computed(()=>a.type===E.PASSWORD),d=e.computed(()=>s.value&&r.value?E.TEXT:a.type),u=e.computed(()=>!!i.suffix||a.error&&a.showErrorIcon||s.value);return(c,m)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ds-input",[`ds-input--${t.size}`,{"is-error":t.error,"is-disabled":t.disabled}]])},[e.createElementVNode("div",Ne,[e.withDirectives(e.createElementVNode("input",{id:t.id||void 0,"onUpdate:modelValue":m[0]||(m[0]=y=>n.value=y),class:e.normalizeClass(["ds-input__control",{"has-suffix":u.value}]),type:d.value,placeholder:t.placeholder,disabled:t.disabled,name:t.name||void 0,autocomplete:t.autocomplete||void 0,"aria-invalid":t.error||void 0,"aria-describedby":t.error&&t.errorMessage&&t.id?`${t.id}-error`:void 0,onFocus:m[1]||(m[1]=y=>o(e.unref(N),y)),onBlur:m[2]||(m[2]=y=>o(e.unref(C),y))},null,42,Ce),[[e.vModelDynamic,n.value]]),u.value?(e.openBlock(),e.createElementBlock("div",Te,[e.renderSlot(c.$slots,"suffix",{},void 0,!0),t.error&&t.showErrorIcon?(e.openBlock(),e.createElementBlock("i",De,"warning")):s.value?(e.openBlock(),e.createElementBlock("button",{key:1,type:"button",class:"ds-input__toggle","aria-label":t.toggleLabel||void 0,"aria-pressed":r.value,onClick:m[3]||(m[3]=y=>r.value=!r.value)},[e.createElementVNode("i",Ie,e.toDisplayString(r.value?"visibility":"visibility_off"),1)],8,pe)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.error&&t.errorMessage?(e.openBlock(),e.createElementBlock("p",{key:0,id:t.id?`${t.id}-error`:void 0,class:"ds-input__error"},e.toDisplayString(t.errorMessage),9,$e)):e.createCommentVNode("",!0)],2))}}),Le=f(Ve,[["__scopeId","data-v-d4b27b55"]]),we=["id","placeholder","rows","disabled","name","aria-invalid","aria-describedby"],Re=["id"],Ae=e.defineComponent({__name:"DsTextarea",props:e.mergeModels({placeholder:{type:String,default:""},rows:{type:Number,default:4},disabled:Boolean,error:Boolean,errorMessage:{type:String,default:""},name:{type:String,default:""},id:{type:String,default:""}},{modelValue:{default:""},modelModifiers:{}}),emits:e.mergeModels([N,C],["update:modelValue"]),setup(t,{emit:l}){const n=e.useModel(t,"modelValue"),a=l;return(o,i)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ds-textarea",{"is-error":t.error,"is-disabled":t.disabled}])},[e.withDirectives(e.createElementVNode("textarea",{id:t.id||void 0,"onUpdate:modelValue":i[0]||(i[0]=r=>n.value=r),class:"ds-textarea__control",placeholder:t.placeholder,rows:t.rows,disabled:t.disabled,name:t.name||void 0,"aria-invalid":t.error||void 0,"aria-describedby":t.error&&t.errorMessage&&t.id?`${t.id}-error`:void 0,onFocus:i[1]||(i[1]=r=>a(e.unref(N),r)),onBlur:i[2]||(i[2]=r=>a(e.unref(C),r))},null,40,we),[[e.vModelText,n.value]]),t.error&&t.errorMessage?(e.openBlock(),e.createElementBlock("p",{key:0,id:t.id?`${t.id}-error`:void 0,class:"ds-textarea__error"},e.toDisplayString(t.errorMessage),9,Re)):e.createCommentVNode("",!0)],2))}}),Oe=f(Ae,[["__scopeId","data-v-cfa74e3d"]]),ze=["disabled","name"],_e={key:0,class:"ds-checkbox__mark",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"2.5"},Me={key:1,class:"ds-checkbox__mark",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"2.5"},xe={key:0,class:"ds-checkbox__label"},Fe=e.defineComponent({__name:"DsCheckbox",props:e.mergeModels({indeterminate:Boolean,disabled:Boolean,name:{type:String,default:""},label:{type:String,default:""}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const l=e.useModel(t,"modelValue"),n=t,a=e.ref(null);function o(){a.value&&(a.value.indeterminate=n.indeterminate)}return e.onMounted(o),e.watch(()=>n.indeterminate,o),(i,r)=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass(["ds-checkbox",{"is-disabled":t.disabled}])},[e.withDirectives(e.createElementVNode("input",{ref_key:"inputRef",ref:a,"onUpdate:modelValue":r[0]||(r[0]=s=>l.value=s),type:"checkbox",class:"ds-checkbox__native",disabled:t.disabled,name:t.name||void 0},null,8,ze),[[e.vModelCheckbox,l.value]]),e.createElementVNode("span",{class:e.normalizeClass(["ds-checkbox__box",{"is-active":l.value||t.indeterminate}]),"aria-hidden":"true"},[t.indeterminate?(e.openBlock(),e.createElementBlock("svg",_e,[...r[1]||(r[1]=[e.createElementVNode("line",{x1:"4",y1:"8",x2:"12",y2:"8"},null,-1)])])):l.value?(e.openBlock(),e.createElementBlock("svg",Me,[...r[2]||(r[2]=[e.createElementVNode("path",{d:"M3.5 8.5l3 3 6-6"},null,-1)])])):e.createCommentVNode("",!0)],2),i.$slots.default||t.label?(e.openBlock(),e.createElementBlock("span",xe,[e.renderSlot(i.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(t.label),1)],!0)])):e.createCommentVNode("",!0)],2))}}),Ue=f(Fe,[["__scopeId","data-v-0c1a3c0a"]]),Y={SUCCESS:"success",INFO:"info",WARNING:"warning",ERROR:"error"},K={LIGHT:"light",DARK:"dark"},q={success:"check_circle",info:"info",warning:"warning",error:"error"},Pe={key:0,class:"material-icons ds-alert__icon","aria-hidden":"true"},Ge={class:"ds-alert__content"},Ye={key:1,class:"ds-alert__body"},Ke=["aria-label"],qe=e.defineComponent({__name:"DsAlert",props:{type:{type:String,default:Y.INFO},effect:{type:String,default:K.LIGHT},title:{type:String,default:""},description:{type:String,default:""},showIcon:Boolean,closable:Boolean,center:Boolean,closeLabel:{type:String,default:""}},emits:[v],setup(t,{emit:l}){const n=t,a=l,o=e.useSlots(),i=e.ref(!0),r=e.computed(()=>q[n.type]),s=e.computed(()=>!!o.default||n.description.length>0);function d(){i.value=!1,a(v)}return(u,c)=>i.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["ds-alert",[`ds-alert--${t.type}`,`ds-alert--${t.effect}`,{"is-center":t.center}]]),role:"alert"},[t.showIcon?(e.openBlock(),e.createElementBlock("i",Pe,e.toDisplayString(r.value),1)):e.createCommentVNode("",!0),e.createElementVNode("div",Ge,[t.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["ds-alert__title",{"has-body":s.value}])},e.toDisplayString(t.title),3)):e.createCommentVNode("",!0),s.value?(e.openBlock(),e.createElementBlock("div",Ye,[e.renderSlot(u.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(t.description),1)],!0)])):e.createCommentVNode("",!0)]),t.closable?(e.openBlock(),e.createElementBlock("button",{key:1,type:"button",class:"ds-alert__close","aria-label":t.closeLabel||void 0,onClick:d},[...c[0]||(c[0]=[e.createElementVNode("i",{class:"material-icons","aria-hidden":"true"},"close",-1)])],8,Ke)):e.createCommentVNode("",!0)],2)):e.createCommentVNode("",!0)}}),He=f(qe,[["__scopeId","data-v-58ce7b87"]]),H={INFO:"info",WARNING:"warning",ERROR:"error"},W={TOP_LEFT:"top-left",TOP_RIGHT:"top-right",BOTTOM_LEFT:"bottom-left",BOTTOM_RIGHT:"bottom-right"},X={info:"mode_edit",warning:"warning",error:"warning"},We={class:"material-icons ds-notification__icon","aria-hidden":"true"},Xe={class:"ds-notification__content"},Ze={key:0,class:"ds-notification__title"},je={key:1,class:"ds-notification__desc"},Qe=["href"],Je=["aria-label"],et=e.defineComponent({__name:"DsNotification",props:{type:{type:String,default:H.INFO},position:{type:String,default:W.BOTTOM_LEFT},title:{type:String,default:""},description:{type:String,default:""},linkTitle:{type:String,default:""},link:{type:String,default:""},showClose:{type:Boolean,default:!0},closeLabel:{type:String,default:""}},emits:[v],setup(t,{emit:l}){const n=t,a=l,o=e.ref(!0),i=e.computed(()=>X[n.type]);function r(){o.value=!1,a(v)}return(s,d)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[o.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["ds-notification",`ds-notification--${t.position}`])},[e.createElementVNode("div",{class:e.normalizeClass(["ds-notification__card",`ds-notification__card--${t.type}`]),role:"alert"},[e.createElementVNode("i",We,e.toDisplayString(i.value),1),e.createElementVNode("div",Xe,[t.title?(e.openBlock(),e.createElementBlock("span",Ze,e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),t.description?(e.openBlock(),e.createElementBlock("p",je,e.toDisplayString(t.description),1)):e.createCommentVNode("",!0),t.linkTitle?(e.openBlock(),e.createElementBlock("a",{key:2,class:"ds-notification__link",href:t.link||void 0,target:"_blank",rel:"noreferrer"},e.toDisplayString(t.linkTitle),9,Qe)):e.createCommentVNode("",!0)]),t.showClose?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ds-notification__close","aria-label":t.closeLabel||void 0,onClick:r},[...d[0]||(d[0]=[e.createElementVNode("i",{class:"material-icons","aria-hidden":"true"},"close",-1)])],8,Je)):e.createCommentVNode("",!0)],2)],2)):e.createCommentVNode("",!0)]))}}),tt=f(et,[["__scopeId","data-v-287d5c06"]]),at=["aria-label"],ot={key:0,class:"ds-modal__header"},lt={class:"ds-modal__title"},nt={class:"ds-modal__body"},it={key:1,class:"ds-modal__footer"},rt=e.defineComponent({__name:"DsModal",props:{open:Boolean,title:{type:String,default:""},showClose:{type:Boolean,default:!0},width:{type:String,default:"440px"},closeOnBackdrop:{type:Boolean,default:!0},closeLabel:{type:String,default:""}},emits:[v],setup(t,{emit:l}){const n=t,a=l,o=e.ref(null);let i=null;function r(){n.closeOnBackdrop&&a(v)}function s(){return o.value?Array.from(o.value.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter(c=>c.offsetParent!==null):[]}function d(u){var g;if(u.key==="Escape"){a(v);return}if(u.key!=="Tab")return;const c=s();if(c.length===0){u.preventDefault(),(g=o.value)==null||g.focus();return}const m=c[0],y=c[c.length-1];u.shiftKey&&document.activeElement===m?(u.preventDefault(),y.focus()):!u.shiftKey&&document.activeElement===y&&(u.preventDefault(),m.focus())}return e.watch(()=>n.open,u=>{var c;typeof document!="undefined"&&(u?(i=document.activeElement,document.addEventListener("keydown",d),document.body.style.overflow="hidden",e.nextTick(()=>{var m,y;return(y=(m=s()[0])!=null?m:o.value)==null?void 0:y.focus()})):(document.removeEventListener("keydown",d),document.body.style.overflow="",(c=i==null?void 0:i.focus)==null||c.call(i)))},{immediate:!0}),e.onBeforeUnmount(()=>{typeof document!="undefined"&&(document.removeEventListener("keydown",d),document.body.style.overflow="")}),(u,c)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[t.open?(e.openBlock(),e.createElementBlock("div",{key:0,class:"ds-modal",onClick:r},[e.createElementVNode("div",{ref_key:"dialogRef",ref:o,class:"ds-modal__dialog",role:"dialog","aria-modal":"true","aria-label":t.title||"dialog",tabindex:"-1",style:e.normalizeStyle({width:t.width}),onClick:c[1]||(c[1]=e.withModifiers(()=>{},["stop"]))},[t.title||t.showClose?(e.openBlock(),e.createElementBlock("div",ot,[e.createElementVNode("span",lt,e.toDisplayString(t.title),1),t.showClose?(e.openBlock(),e.createBlock(e.unref(I),{key:0,variant:"tertiary",circle:"","left-icon":"close","aria-label":t.closeLabel||void 0,onClick:c[0]||(c[0]=m=>a(e.unref(v)))},null,8,["aria-label"])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",nt,[e.renderSlot(u.$slots,"default",{},void 0,!0)]),u.$slots.footer?(e.openBlock(),e.createElementBlock("div",it,[e.renderSlot(u.$slots,"footer",{},void 0,!0)])):e.createCommentVNode("",!0)],12,at)])):e.createCommentVNode("",!0)]))}}),st=f(rt,[["__scopeId","data-v-6eecaabb"]]),B={VERIFIED:"verified",UNVERIFIED:"unverified",NEW:"new"},ct=["aria-label","title"],dt=e.defineComponent({__name:"DsVerificationIcon",props:{verified:{type:Boolean,default:null},isContactData:{type:Boolean,default:!1},size:{type:Number,default:20},label:{type:String,default:""}},setup(t){const l=t,n=e.computed(()=>l.verified===null||l.verified===void 0?{state:B.NEW,icon:"new_releases",label:"Newly found"}:l.verified?{state:B.VERIFIED,icon:"verified",label:"Verified"}:{state:B.UNVERIFIED,icon:l.isContactData?"dangerous":"error",label:"Not verified"});return(a,o)=>(e.openBlock(),e.createElementBlock("i",{class:e.normalizeClass(["material-icons ds-verification-icon",[`ds-verification-icon--${n.value.state}`,{"ds-verification-icon--email":t.isContactData}]]),style:e.normalizeStyle({fontSize:`${t.size}px`}),role:"img","aria-label":t.label||n.value.label,title:t.label||n.value.label},[e.renderSlot(a.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(n.value.icon),1)],!0)],14,ct))}}),Z=f(dt,[["__scopeId","data-v-0fd84040"]]),ut=["title"],mt={class:"ds-contact-value__marquee"},ft={class:"ds-contact-value__actions"},yt=["aria-label","title"],vt={class:"material-icons","aria-hidden":"true"},bt=["aria-label","aria-pressed","title"],kt=["aria-label","aria-pressed","title"],St=e.defineComponent({__name:"DsContactValue",props:{value:{type:String,required:!0},valueType:{type:String,default:""},verified:{type:Boolean,default:null},main:{type:Boolean,default:!1},isContactData:{type:Boolean,default:!1},showRate:{type:Boolean,default:!1},correct:{type:Boolean,default:null},copyLabel:{type:String,default:"Copy"},copiedLabel:{type:String,default:"Copied!"},correctLabel:{type:String,default:"Correct"},incorrectLabel:{type:String,default:"Incorrect"}},emits:[T,D,p],setup(t,{emit:l}){const n=t,a=l,o=e.ref(!1);let i;function r(){typeof navigator!="undefined"&&navigator.clipboard&&navigator.clipboard.writeText(n.value).catch(()=>{}),o.value=!0,clearTimeout(i),i=setTimeout(()=>{o.value=!1},1200),a(T,n.value)}function s(){a(D)}function d(){a(p)}return e.onBeforeUnmount(()=>clearTimeout(i)),(u,c)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ds-contact-value",{"ds-contact-value--main":t.main}])},[e.createVNode(e.unref(Z),{verified:t.verified,"is-contact-data":t.isContactData},null,8,["verified","is-contact-data"]),e.createElementVNode("span",{class:"ds-contact-value__value",title:t.value},e.toDisplayString(t.value),9,ut),e.createElementVNode("span",mt,[t.valueType?(e.openBlock(),e.createBlock(e.unref(P),{key:0,class:"ds-contact-value__badge",tone:t.main?e.unref($).ACCENT:e.unref($).GREY,"aria-hidden":"true"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.valueType),1)]),_:1},8,["tone"])):e.createCommentVNode("",!0),e.createElementVNode("span",ft,[e.createElementVNode("button",{type:"button",class:e.normalizeClass(["ds-contact-value__action",{"is-copied":o.value}]),"aria-label":o.value?t.copiedLabel:t.copyLabel,title:o.value?t.copiedLabel:t.copyLabel,onClick:r},[e.createElementVNode("i",vt,e.toDisplayString(o.value?"check":"content_copy"),1)],10,yt),t.showRate?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{type:"button",class:e.normalizeClass(["ds-contact-value__action",{"is-active":t.correct===!0}]),"aria-label":t.correctLabel,"aria-pressed":t.correct===!0,title:t.correctLabel,onClick:s},[e.createElementVNode("i",{class:e.normalizeClass(t.correct===!0?"material-icons":"material-icons-outlined"),"aria-hidden":"true"},"thumb_up",2)],10,bt),e.createElementVNode("button",{type:"button",class:e.normalizeClass(["ds-contact-value__action",{"is-active":t.correct===!1}]),"aria-label":t.incorrectLabel,"aria-pressed":t.correct===!1,title:t.incorrectLabel,onClick:d},[e.createElementVNode("i",{class:e.normalizeClass(t.correct===!1?"material-icons":"material-icons-outlined"),"aria-hidden":"true"},"thumb_down",2)],10,kt)],64)):e.createCommentVNode("",!0)])])],2))}}),R=f(St,[["__scopeId","data-v-014e772b"]]),gt=["aria-label"],Et={class:"ds-data-card__heading"},Bt={class:"material-icons ds-data-card__icon","aria-hidden":"true"},ht={class:"ds-data-card__title"},Nt=["aria-label"],Ct={key:0,class:"ds-data-card__body"},Tt={key:0,class:"ds-data-card__empty"},Dt={class:"material-icons-outlined ds-data-card__empty-icon","aria-hidden":"true"},pt={key:0},It={key:0,class:"ds-data-card__section"},$t={key:1},Vt={key:0,class:"ds-data-card__section"},Lt={class:"ds-data-card__more"},wt=e.defineComponent({__name:"DsDataCard",props:{title:{type:String,required:!0},icon:{type:String,default:"email"},mostLikely:{type:Object,default:null},more:{type:Array,default:()=>[]},collapsible:{type:Boolean,default:!1},showSort:{type:Boolean,default:!0},showEdit:{type:Boolean,default:!1},showClose:{type:Boolean,default:!1},isContactData:{type:Boolean,default:!1},showRate:{type:Boolean,default:!1},editLabel:{type:String,default:"Edit"},emptyLabel:{type:String,default:"No data found"},mostLikelyLabel:{type:String,default:"MOST LIKELY"},moreLabel:{type:String,default:"MORE"},sortLabel:{type:String,default:"Sort"},toggleLabel:{type:String,default:"Toggle"},closeLabel:{type:String,default:"Close"}},emits:[T,_,M,v,D,p],setup(t,{emit:l}){const n=t,a=l,o=e.ref(!1),i=e.computed(()=>n.more.length+(n.mostLikely?1:0)),r=e.computed(()=>i.value>3),s=e.computed(()=>i.value===0),d=e.computed(()=>n.collapsible&&o.value);function u(){o.value=!o.value}function c(S){a(T,S)}function m(){a(_)}function y(){a(M)}function g(){a(v)}function A(S){a(D,S)}function O(S){a(p,S)}return(S,b)=>(e.openBlock(),e.createElementBlock("section",{class:"ds-data-card","aria-label":t.title},[e.createElementVNode("div",{class:e.normalizeClass(["ds-data-card__header",{"is-collapsed":d.value,"is-collapsible":t.collapsible}]),onClick:b[1]||(b[1]=k=>t.collapsible&&u())},[e.createElementVNode("div",Et,[e.createElementVNode("i",Bt,e.toDisplayString(t.icon),1),e.createElementVNode("span",ht,e.toDisplayString(t.title),1)]),e.createElementVNode("div",{class:"ds-data-card__actions",onClick:b[0]||(b[0]=e.withModifiers(()=>{},["stop"]))},[!d.value&&t.showEdit?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"ds-data-card__edit",onClick:y},e.toDisplayString(t.editLabel),1)):e.createCommentVNode("",!0),!d.value&&t.showSort?(e.openBlock(),e.createBlock(e.unref(I),{key:1,variant:"tertiary",size:"medium",circle:"","left-icon":"swap_vert","aria-label":t.sortLabel,onClick:m},null,8,["aria-label"])):e.createCommentVNode("",!0),t.collapsible?(e.openBlock(),e.createBlock(e.unref(I),{key:2,variant:"tertiary",size:"medium",circle:"","left-icon":o.value?"keyboard_arrow_down":"keyboard_arrow_up","aria-label":t.toggleLabel,onClick:u},null,8,["left-icon","aria-label"])):e.createCommentVNode("",!0),t.showClose?(e.openBlock(),e.createElementBlock("button",{key:3,type:"button",class:"ds-data-card__close","aria-label":t.closeLabel,onClick:g},[...b[4]||(b[4]=[e.createElementVNode("i",{class:"material-icons","aria-hidden":"true"},"close",-1)])],8,Nt)):e.createCommentVNode("",!0)])],2),d.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Ct,[s.value?(e.openBlock(),e.createElementBlock("div",Tt,[e.createElementVNode("i",Dt,e.toDisplayString(t.icon),1),e.createElementVNode("span",null,e.toDisplayString(t.emptyLabel),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[t.mostLikely?(e.openBlock(),e.createElementBlock("div",pt,[r.value?(e.openBlock(),e.createElementBlock("div",It,e.toDisplayString(t.mostLikelyLabel),1)):e.createCommentVNode("",!0),e.createVNode(e.unref(R),{value:t.mostLikely.value,"value-type":t.mostLikely.type,verified:t.mostLikely.verified,correct:t.mostLikely.correct,main:"","is-contact-data":t.isContactData,"show-rate":t.showRate,onCopy:c,onCorrect:b[2]||(b[2]=k=>A(t.mostLikely)),onIncorrect:b[3]||(b[3]=k=>O(t.mostLikely))},null,8,["value","value-type","verified","correct","is-contact-data","show-rate"])])):e.createCommentVNode("",!0),t.more.length>0?(e.openBlock(),e.createElementBlock("div",$t,[r.value?(e.openBlock(),e.createElementBlock("div",Vt,e.toDisplayString(t.moreLabel),1)):e.createCommentVNode("",!0),e.createElementVNode("div",Lt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.more,k=>(e.openBlock(),e.createBlock(e.unref(R),{key:k.value,value:k.value,"value-type":k.type,verified:k.verified,correct:k.correct,"is-contact-data":t.isContactData,"show-rate":t.showRate,onCopy:c,onCorrect:j=>A(k),onIncorrect:j=>O(k)},null,8,["value","value-type","verified","correct","is-contact-data","show-rate","onCorrect","onIncorrect"]))),128))])])):e.createCommentVNode("",!0)],64))]))],8,gt))}}),Rt=f(wt,[["__scopeId","data-v-86467226"]]);exports.DS_ALERT_EFFECTS=K;exports.DS_ALERT_ICONS=q;exports.DS_ALERT_TYPES=Y;exports.DS_BADGE_TONES=$;exports.DS_BUTTON_NATIVE_TYPES=F;exports.DS_BUTTON_SIZES=L;exports.DS_BUTTON_VARIANTS=V;exports.DS_INPUT_SIZES=G;exports.DS_INPUT_TYPES=E;exports.DS_NOTIFICATION_ICONS=X;exports.DS_NOTIFICATION_POSITIONS=W;exports.DS_NOTIFICATION_TYPES=H;exports.DS_SPINNER_TONES=h;exports.DS_TABLE_ALIGN=w;exports.DS_TAG_TONES=U;exports.DS_VERIFICATION_STATES=B;exports.DsAlert=He;exports.DsAvatar=ve;exports.DsBadge=P;exports.DsButton=I;exports.DsCheckbox=Ue;exports.DsContactValue=R;exports.DsDataCard=Rt;exports.DsInput=Le;exports.DsModal=st;exports.DsNotification=tt;exports.DsSpinner=x;exports.DsTable=he;exports.DsTag=de;exports.DsTextarea=Oe;exports.DsVerificationIcon=Z;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/ui/SqlSpinner/SqlSpinner.types.ts","../src/ui/SqlSpinner/SqlSpinner.vue","../src/ui/SqlButton/SqlButton.types.ts","../src/constants/events.ts","../src/ui/SqlButton/SqlButton.vue","../src/ui/BasicTable/BasicTable.types.ts","../src/ui/BasicTable/BasicTable.vue"],"sourcesContent":["// Tema del spinner (clases: theme-<mode>)\nexport const SQL_SPINNER_THEME_MODES = {\n LIGHT: 'light', // para fondos oscuros: spinner claro\n DARK: 'dark', // para fondos claros: spinner oscuro\n} as const;\nexport type SqlSpinnerThemeMode =\n (typeof SQL_SPINNER_THEME_MODES)[keyof typeof SQL_SPINNER_THEME_MODES];\n\n// Tamaños (clases: sql-spinner--<size>)\nexport const SQL_SPINNER_SIZES = {\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n} as const;\nexport type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];\n","<script setup lang=\"ts\">\nimport { type PropType, computed } from 'vue';\nimport {\n SQL_SPINNER_SIZES,\n SQL_SPINNER_THEME_MODES,\n type SqlSpinnerSize,\n type SqlSpinnerThemeMode,\n} from './SqlSpinner.types';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlSpinnerThemeMode>,\n default: SQL_SPINNER_THEME_MODES.DARK,\n },\n size: {\n type: String as PropType<SqlSpinnerSize>,\n default: SQL_SPINNER_SIZES.SMALL,\n },\n // Opcional: texto accesible (si no hay, marcamos aria-hidden)\n label: {\n type: String,\n default: '',\n },\n});\n\nconst hasLabel = computed(() => props.label && props.label.length > 0);\n</script>\n\n<template>\n <span\n class=\"sql-spinner\"\n :class=\"[`theme-${type}`, `sql-spinner--${size}`]\"\n role=\"status\"\n :aria-label=\"hasLabel ? label : undefined\"\n :aria-live=\"hasLabel ? 'polite' : undefined\"\n :aria-hidden=\"hasLabel ? undefined : 'true'\"\n >\n <span class=\"ring\" />\n <span v-if=\"hasLabel\" class=\"sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n\n/* Accesibilidad (solo-lectura visual) */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n@keyframes sql-spin {\n to {\n transform: rotate(1turn);\n }\n}\n\n.sql-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n /* color del anillo por tema (paridad con los PNG de frontend-app) */\n --sql-spinner-color: #{colors.$primary-accent-main};\n\n /* Tamaños (paridad con frontend-app: small=20, medium=36, large=64) */\n &.sql-spinner--small {\n width: 20px;\n height: 20px;\n }\n &.sql-spinner--medium {\n width: 36px;\n height: 36px;\n }\n &.sql-spinner--large {\n width: 64px;\n height: 64px;\n }\n\n .ring {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n\n /* Anillo con gradiente cónico transparente → color (arco que se desvanece) */\n background: conic-gradient(from 90deg, transparent 8%, var(--sql-spinner-color) 100%);\n\n /* Recorta el centro para dejar solo el anillo (grosor ~16% del radio ≈ 8% del diámetro,\n medido sobre los PNG de frontend-app) */\n mask: radial-gradient(farthest-side, transparent calc(100% - 16%), #000 calc(100% - 16%));\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-mask: radial-gradient(\n farthest-side,\n transparent calc(100% - 16%),\n #000 calc(100% - 16%)\n );\n\n animation: sql-spin 1s linear infinite;\n }\n\n /* Temas */\n &.theme-dark {\n --sql-spinner-color: #{colors.$primary-accent-main};\n }\n &.theme-light {\n --sql-spinner-color: #{colors.$white};\n }\n}\n</style>\n","// Tipos de botón (clases: sql-button--<type>)\nexport const SQL_BUTTON_TYPES = {\n DEFAULT: 'default',\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SPECIAL: 'special',\n SPECIAL2: 'special2',\n SPECIAL3: 'special3',\n DOTTED: 'dotted',\n DANGER: 'danger',\n GRADIENT: 'gradient',\n} as const;\nexport type SqlButtonType = (typeof SQL_BUTTON_TYPES)[keyof typeof SQL_BUTTON_TYPES];\n\n// Tamaños de botón (clases: sql-button--<size>)\nexport const SQL_BUTTON_SIZES = {\n SMALL: 'small',\n SMALL_SQUARE: 'small-square',\n SMALL_SQUARE_NO_PADDING: 'small-square-no-padding',\n MEDIUM: 'medium',\n MEDIUM_SQUARE: 'medium-square',\n LARGE: 'large',\n LARGE_SQUARE: 'large-square',\n XLARGE: 'xlarge',\n XLARGE_SQUARE: 'xlarge-square',\n} as const;\nexport type SqlButtonSize = (typeof SQL_BUTTON_SIZES)[keyof typeof SQL_BUTTON_SIZES];\n\n// type nativo del <button>\nexport const SQL_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const;\nexport type SqlButtonNativeType =\n (typeof SQL_BUTTON_NATIVE_TYPES)[keyof typeof SQL_BUTTON_NATIVE_TYPES];\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const;\nexport type ClickEventName = typeof CLICK;\n","<template>\n <button\n class=\"sql-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-pressed=\"selected !== null ? !!selected : undefined\"\n :class=\"[\n type ? `sql-button--${type}` : '',\n size ? `sql-button--${size}` : '',\n {\n 'is-disabled': disabled,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-plain': plain,\n 'is-round': round,\n 'selectable-button': selected !== null,\n 'is-selected': selected,\n },\n ]\"\n @click=\"handleClick\"\n >\n <!-- Siempre renderizamos el contenedor para que el spinner funcione con o sin texto -->\n <span class=\"slot-container\" :class=\"{ 'is-loading': loading }\">\n <!-- Spinner superpuesto cuando loading -->\n <SqlSpinner v-if=\"loading\" class=\"sql-spinner\" :type=\"spinnerType\" />\n\n <!-- Texto/slot (se oculta visualmente cuando loading) -->\n <div v-if=\"$slots.default\" class=\"slotted-content\">\n <slot />\n </div>\n </span>\n </button>\n</template>\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { SqlSpinner, SQL_SPINNER_THEME_MODES } from '@shared/ui/SqlSpinner';\nimport {\n SQL_BUTTON_NATIVE_TYPES,\n SQL_BUTTON_SIZES,\n SQL_BUTTON_TYPES,\n type SqlButtonNativeType,\n type SqlButtonSize,\n type SqlButtonType,\n} from './SqlButton.types';\nimport { CLICK } from '@shared/constants/events';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlButtonType>,\n default: SQL_BUTTON_TYPES.DEFAULT,\n },\n size: {\n type: String as PropType<SqlButtonSize>,\n default: SQL_BUTTON_SIZES.LARGE,\n },\n nativeType: {\n type: String as PropType<SqlButtonNativeType>,\n default: SQL_BUTTON_NATIVE_TYPES.BUTTON,\n },\n selected: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean,\n});\n\nconst emit = defineEmits<{\n (e: typeof CLICK, event: MouseEvent): void;\n}>();\n\nconst spinnerType = computed(() =>\n props.type === SQL_BUTTON_TYPES.PRIMARY || props.type === SQL_BUTTON_TYPES.DANGER\n ? SQL_SPINNER_THEME_MODES.LIGHT\n : SQL_SPINNER_THEME_MODES.DARK\n);\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return; // guard\n emit(CLICK, event);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n\n/* keyframes a nivel raíz */\n@keyframes rotating {\n 0% {\n transform: rotateZ(360deg);\n }\n 100% {\n transform: rotateZ(0deg);\n }\n}\n\n$default-background: colors.$white;\n\n.sql-button {\n padding: 0;\n\n color: colors.$primary-main;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n\n border-width: 0;\n border-radius: 4px;\n outline: none;\n\n cursor: pointer;\n transition:\n background 0.2s,\n color 0.2s,\n border-color 0.2s;\n\n &:active,\n &:hover {\n outline: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n }\n\n &.is-circle {\n padding: s.spacing(1);\n border-radius: 50%;\n }\n\n .slot-container {\n position: relative;\n\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .slotted-content {\n display: inline-flex;\n align-items: center;\n\n white-space: nowrap;\n }\n\n &.is-loading {\n .slotted-content {\n visibility: hidden;\n } /* el contenido sigue en el flujo para no cambiar ancho/alto */\n }\n\n .sql-spinner {\n position: absolute;\n inset: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 1em;\n height: 1em;\n margin: auto;\n\n pointer-events: none;\n }\n }\n\n /* Types */\n &.sql-button--default {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.sql-button--primary {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n\n &:hover {\n background-color: colors.$primary-accent-shadow;\n }\n &.is-disabled {\n background-color: colors.$primary-accent-mid;\n }\n }\n\n &.sql-button--secondary {\n color: colors.$primary-main;\n background-color: colors.$secondary-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &.is-disabled {\n color: colors.$primary-secondary-text;\n background-color: colors.$primary-tint;\n }\n }\n\n &.sql-button--tertiary {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &:active {\n color: $default-background;\n background-color: colors.$primary-secondary-text;\n }\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n &:active {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.selectable-button {\n &:active {\n color: colors.$primary-accent-main !important;\n background: colors.$primary-accent-background !important;\n }\n\n &.is-selected {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-main;\n background: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-mid;\n background-color: $default-background;\n\n &:hover {\n border: 1px solid colors.$primary-accent-main;\n }\n &:active {\n border: 1px solid colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n\n &:active {\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n }\n }\n }\n\n &.sql-button--special2 {\n color: colors.$primary-accent-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-accent-background;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special3 {\n color: colors.$primary-accent-main;\n font-weight: 400;\n\n background-color: colors.$primary-accent-tint;\n\n &:hover {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--dotted {\n color: colors.$primary-mid;\n font-weight: bold;\n\n border: 1px dashed colors.$primary-mid;\n border-radius: s.spacing(3);\n\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$primary-accent-main;\n border: 1px dashed colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n }\n\n &.sql-button--danger {\n color: colors.$tertiary-accent-main !important;\n\n background-color: colors.$tertiary-accent-tint;\n\n &:hover {\n background-color: colors.$tertiary-accent-mid;\n }\n &.is-disabled {\n color: colors.$tertiary-accent-mid;\n background-color: colors.$tertiary-accent-tint;\n }\n }\n\n &.sql-button--gradient {\n color: colors.$white !important;\n\n background: linear-gradient(\n 106.21deg,\n colors.$ai-gradient-1 22.52%,\n colors.$ai-gradient-2 100%\n );\n\n &:hover {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-hover 22.52%,\n colors.$ai-gradient-2 100%\n ) !important;\n }\n &.is-disabled {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-disabled 22.52%,\n colors.$ai-gradient-2 100%\n );\n }\n }\n\n /* Sizes */\n &.sql-button--small {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n\n .slot-container {\n padding: 0 s.spacing(1);\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n\n .sql-spinner .spinner {\n height: s.spacing(2);\n }\n }\n\n &.sql-button--small-square {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 4px;\n }\n }\n\n &.sql-button--small-square-no-padding {\n width: s.spacing(3);\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 0;\n }\n }\n\n &.sql-button--medium {\n height: s.spacing(4);\n\n .slot-container {\n padding: 0 12px;\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n }\n\n &.sql-button--medium-square {\n height: s.spacing(4);\n .slot-container {\n padding: 6px;\n }\n }\n\n &.sql-button--large {\n height: 36px;\n\n .slot-container {\n padding: 0 s.spacing(2);\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--large-square {\n height: 36px;\n .slot-container {\n padding: s.spacing(1);\n }\n }\n\n &.sql-button--xlarge {\n height: s.spacing(6);\n\n .slot-container {\n padding: 0 22px;\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--xlarge-square {\n height: s.spacing(6);\n .slot-container {\n padding: s.spacing(2);\n }\n }\n}\n</style>\n","// Alineación de una columna (clases: basic-table__th--<align> / __td--<align>)\nexport const BASIC_TABLE_ALIGN = {\n LEFT: 'left',\n CENTER: 'center',\n RIGHT: 'right',\n} as const;\nexport type BasicTableAlign = (typeof BASIC_TABLE_ALIGN)[keyof typeof BASIC_TABLE_ALIGN];\n\n// Definición de una columna. `key` mapea a la propiedad de la row para el\n// contenido por defecto y da nombre al slot scoped `cell-<key>`.\nexport interface BasicTableColumn {\n key: string;\n label: string;\n align?: BasicTableAlign;\n width?: string;\n}\n\n// Row genérica: sólo se exige un `id` estable para el :key; el resto de las\n// propiedades las consume cada columna vía su `key`.\nexport interface BasicTableRow {\n id: string | number;\n [key: string]: unknown;\n}\n","<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { BASIC_TABLE_ALIGN, type BasicTableColumn, type BasicTableRow } from './BasicTable.types';\n\ndefineProps({\n columns: {\n type: Array as PropType<BasicTableColumn[]>,\n required: true,\n },\n rows: {\n type: Array as PropType<BasicTableRow[]>,\n required: true,\n },\n emptyMessage: {\n type: String,\n default: '',\n },\n});\n</script>\n\n<template>\n <div class=\"basic-table\">\n <div class=\"basic-table__wrapper\">\n <table class=\"basic-table__table\">\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__th--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n :style=\"column.width ? { width: column.width } : undefined\"\n >\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"rows.length === 0\">\n <td\n class=\"basic-table__empty\"\n :colspan=\"columns.length\"\n data-testid=\"basic-table-empty\"\n >\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n <tr v-for=\"row in rows\" :key=\"row.id\" data-testid=\"basic-table-row\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__td--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n >\n <slot :name=\"`cell-${column.key}`\" :row=\"row\">{{ row[column.key] }}</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/font-size.scss' as f;\n\n.basic-table {\n &__wrapper {\n border: 1px solid colors.$primary-tint;\n border-radius: 8px;\n\n overflow-x: auto;\n }\n\n &__table {\n width: 100%;\n\n border-collapse: collapse;\n\n // Own every border/height explicitly so the table stays consistent even\n // when embedded in a host app whose global `table td/th` rules would\n // otherwise leak in. The scoped specificity (block + [data-v]) beats them.\n th {\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$primary-main;\n font-weight: 700;\n font-size: f.font-size('text');\n\n border: 0;\n border-bottom: 1px solid colors.$primary-tint;\n\n background-color: colors.$primary-background;\n }\n\n td {\n height: auto;\n padding: s.spacing(2);\n\n color: colors.$primary-main;\n font-size: f.font-size('text');\n\n border: 0;\n }\n\n tr {\n border: 0;\n }\n\n // Row separator only BETWEEN adjacent body rows: empty/single → none.\n tbody tr + tr {\n border-top: 1px solid colors.$primary-tint;\n }\n }\n\n // Alignment modifiers are always emitted, so each owns its text-align and\n // no base `th` text-align competes on specificity.\n &__th--left,\n &__td--left {\n text-align: left;\n }\n\n &__th--center,\n &__td--center {\n text-align: center;\n }\n\n &__th--right,\n &__td--right {\n text-align: right;\n }\n\n &__empty {\n padding: s.spacing(5) s.spacing(3);\n\n color: colors.$primary-secondary-text;\n text-align: center;\n }\n}\n</style>\n"],"names":["SQL_SPINNER_THEME_MODES","SQL_SPINNER_SIZES","props","__props","hasLabel","computed","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_toDisplayString","SQL_BUTTON_TYPES","SQL_BUTTON_SIZES","SQL_BUTTON_NATIVE_TYPES","CLICK","emit","__emit","spinnerType","handleClick","event","_createBlock","_unref","SqlSpinner","$slots","_openBlock","_renderSlot","_ctx","BASIC_TABLE_ALIGN","_hoisted_1","_hoisted_3","_Fragment","_renderList","column","_a","_normalizeStyle","_hoisted_4","row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/ui/DsSpinner/DsSpinner.types.ts","../src/ui/DsSpinner/DsSpinner.vue","../src/constants/events.ts","../src/ui/DsButton/DsButton.types.ts","../src/ui/DsButton/DsButton.vue","../src/ui/DsTag/DsTag.types.ts","../src/ui/DsTag/DsTag.vue","../src/ui/DsBadge/DsBadge.types.ts","../src/ui/DsBadge/DsBadge.vue","../src/ui/DsAvatar/DsAvatar.vue","../src/ui/DsTable/DsTable.types.ts","../src/ui/DsTable/DsTable.vue","../src/ui/DsInput/DsInput.types.ts","../src/ui/DsInput/DsInput.vue","../src/ui/DsTextarea/DsTextarea.vue","../src/ui/DsCheckbox/DsCheckbox.vue","../src/ui/DsAlert/DsAlert.types.ts","../src/ui/DsAlert/DsAlert.vue","../src/ui/DsNotification/DsNotification.types.ts","../src/ui/DsNotification/DsNotification.vue","../src/ui/DsModal/DsModal.vue","../src/ui/DsVerificationIcon/DsVerificationIcon.types.ts","../src/ui/DsVerificationIcon/DsVerificationIcon.vue","../src/ui/DsContactValue/DsContactValue.vue","../src/ui/DsDataCard/DsDataCard.vue"],"sourcesContent":["// DsSpinner — the DS \"Spinner\": a rotating border-ring. Tones mirror Spinner.jsx.\n\nexport const DS_SPINNER_TONES = {\n DARK: 'dark', // slate ring — for light surfaces (default)\n LIGHT: 'light', // white ring — for dark surfaces / solid buttons\n ACCENT: 'accent', // accent ring\n} as const;\nexport type DsSpinnerTone = (typeof DS_SPINNER_TONES)[keyof typeof DS_SPINNER_TONES];\n","<template>\n <span\n class=\"ds-spinner\"\n :class=\"`ds-spinner--${tone}`\"\n role=\"status\"\n :style=\"{ width: `${size}px`, height: `${size}px` }\"\n :aria-label=\"label || undefined\"\n :aria-hidden=\"label ? undefined : 'true'\"\n >\n <span v-if=\"label\" class=\"ds-spinner__sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { DS_SPINNER_TONES, type DsSpinnerTone } from './DsSpinner.types';\n\ndefineProps({\n size: { type: Number, default: 24 },\n tone: {\n type: String as PropType<DsSpinnerTone>,\n default: DS_SPINNER_TONES.DARK,\n },\n // Optional accessible text; without it the spinner is aria-hidden.\n label: { type: String, default: '' },\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/motion.scss' as m;\n\n@keyframes ds-spinner-rot {\n to {\n transform: rotate(360deg);\n }\n}\n\n.ds-spinner {\n display: inline-block;\n\n border: 2px solid;\n border-radius: 50%;\n\n animation: ds-spinner-rot 1s linear infinite;\n\n @include m.reduce-motion {\n animation: none;\n }\n\n &--dark {\n border-color: colors.$slate-tint;\n border-top-color: colors.$slate-main;\n }\n &--light {\n border-color: rgba(255, 255, 255, 0.4);\n border-top-color: colors.$white;\n }\n &--accent {\n border-color: colors.$accent-mid;\n border-top-color: colors.$accent-main;\n }\n\n &__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n</style>\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const;\nexport type ClickEventName = typeof CLICK;\n\n// Evento de cierre (p. ej. DsTag con × / closable) — mapea a onClose del DS\nexport const CLOSE = 'close' as const;\nexport type CloseEventName = typeof CLOSE;\n\n// Eventos de foco de controles de formulario (DsInput / DsTextarea)\nexport const FOCUS = 'focus' as const;\nexport type FocusEventName = typeof FOCUS;\n\nexport const BLUR = 'blur' as const;\nexport type BlurEventName = typeof BLUR;\n\n// Eventos de la familia data (DsContactValue / DsDataCard).\n// COPY lleva el valor copiado; CORRECT / INCORRECT marcan el rating de un dato.\nexport const COPY = 'copy' as const;\nexport type CopyEventName = typeof COPY;\n\nexport const CORRECT = 'correct' as const;\nexport type CorrectEventName = typeof CORRECT;\n\nexport const INCORRECT = 'incorrect' as const;\nexport type IncorrectEventName = typeof INCORRECT;\n\n// Acciones de cabecera de DsDataCard.\nexport const SORT = 'sort' as const;\nexport type SortEventName = typeof SORT;\n\nexport const EDIT = 'edit' as const;\nexport type EditEventName = typeof EDIT;\n","// DsButton — 1:1 with the SalesQL Design System \"Button\" specimen.\n// Variants/sizes are the ONLY ones the DS defines; more arrive when the DS grows.\n\n// Variants (classes: ds-button--<variant>)\nexport const DS_BUTTON_VARIANTS = {\n PRIMARY: 'primary', // solid accent fill, white text\n SECONDARY: 'secondary', // slate surface fill, dark text\n TERTIARY: 'tertiary', // transparent ghost, dark text\n QUATERNARY: 'quaternary', // accent border + accent text, light fill\n SPECIAL: 'special', // accent text only, no fill/border (link-style)\n} as const;\nexport type DsButtonVariant = (typeof DS_BUTTON_VARIANTS)[keyof typeof DS_BUTTON_VARIANTS];\n\n// Sizes = DS control heights (classes: ds-button--<size>)\nexport const DS_BUTTON_SIZES = {\n SMALL: 'small', // 24px\n MEDIUM: 'medium', // 32px\n LARGE: 'large', // 36px\n XLARGE: 'xlarge', // 48px\n} as const;\nexport type DsButtonSize = (typeof DS_BUTTON_SIZES)[keyof typeof DS_BUTTON_SIZES];\n\n// Native <button> type\nexport const DS_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const;\nexport type DsButtonNativeType =\n (typeof DS_BUTTON_NATIVE_TYPES)[keyof typeof DS_BUTTON_NATIVE_TYPES];\n","<template>\n <button\n class=\"ds-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :class=\"[\n `ds-button--${variant}`,\n `ds-button--${size}`,\n {\n 'is-disabled': disabled || loading,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-dashed': dashed,\n },\n ]\"\n @click=\"handleClick\"\n >\n <DsSpinner v-if=\"loading\" class=\"ds-button__spinner\" :size=\"iconSize\" :tone=\"spinnerTone\" />\n\n <span\n v-if=\"!loading && (leftIcon || $slots.leading)\"\n class=\"ds-button__icon ds-button__icon--leading\"\n >\n <slot name=\"leading\"\n ><i class=\"material-icons\" aria-hidden=\"true\">{{ leftIcon }}</i></slot\n >\n </span>\n\n <span v-if=\"!loading && $slots.default\" class=\"ds-button__label\"><slot /></span>\n\n <span\n v-if=\"!loading && (rightIcon || $slots.trailing)\"\n class=\"ds-button__icon ds-button__icon--trailing\"\n >\n <slot name=\"trailing\"\n ><i class=\"material-icons\" aria-hidden=\"true\">{{ rightIcon }}</i></slot\n >\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { DsSpinner, DS_SPINNER_TONES } from '@shared/ui/DsSpinner';\nimport { CLICK } from '@shared/constants/events';\nimport {\n DS_BUTTON_NATIVE_TYPES,\n DS_BUTTON_SIZES,\n DS_BUTTON_VARIANTS,\n type DsButtonNativeType,\n type DsButtonSize,\n type DsButtonVariant,\n} from './DsButton.types';\n\nconst props = defineProps({\n variant: { type: String as PropType<DsButtonVariant>, default: DS_BUTTON_VARIANTS.PRIMARY },\n size: { type: String as PropType<DsButtonSize>, default: DS_BUTTON_SIZES.MEDIUM },\n nativeType: {\n type: String as PropType<DsButtonNativeType>,\n default: DS_BUTTON_NATIVE_TYPES.BUTTON,\n },\n // Material Icon names (rendered via <i class=\"material-icons\">); a leading/\n // trailing slot overrides. Icon-only buttons need ariaLabel.\n leftIcon: { type: String, default: '' },\n rightIcon: { type: String, default: '' },\n ariaLabel: { type: String, default: '' },\n disabled: Boolean,\n loading: Boolean,\n circle: Boolean,\n dashed: Boolean,\n autofocus: Boolean,\n});\n\n// Runtime array (not the type-only form): the SFC compiler can't resolve\n// `typeof CLICK` to a literal, leaving `emits` empty at runtime. With `click`\n// undeclared, the parent's @click both falls through to the native <button>\n// AND is invoked by emit() → the listener fires twice. Declaring it at runtime\n// (via the CLICK constant, per convention) excludes it from fallthrough.\nconst emit = defineEmits([CLICK]);\n\nconst iconSize = computed(() => (props.size === DS_BUTTON_SIZES.SMALL ? 14 : 20));\nconst spinnerTone = computed(() =>\n props.variant === DS_BUTTON_VARIANTS.PRIMARY ? DS_SPINNER_TONES.LIGHT : DS_SPINNER_TONES.DARK\n);\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return;\n emit(CLICK, event);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n\n padding: 0;\n\n font-family: t.$font-family;\n font-weight: t.$weight-medium; // 500 (DS); small overrides to 400\n font-size: t.font-size('body');\n line-height: 20px;\n\n border: 1px solid transparent;\n border-radius: r.$radius-control;\n outline: none;\n\n cursor: pointer;\n transition:\n background-color m.$duration-default m.$easing,\n border-color m.$duration-default m.$easing,\n opacity m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &.is-disabled {\n opacity: 0.55;\n cursor: not-allowed;\n }\n\n &__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n // DS icon size: 20px (small → 14px). Sizing the glyph to fill its box also\n // removes the optical \"gap\" a smaller glyph leaves against the button edge.\n .material-icons {\n font-size: i.icon-size(20);\n line-height: 1;\n }\n }\n\n // Material glyphs carry a built-in keyline (~2–3px advance bearing). Absorb it\n // on the edge side so a leading/trailing icon sits at the same optical inset as\n // a text-only button. Not for icon-only (circle) buttons — those stay centered.\n &:not(.is-circle) &__icon--leading {\n margin-left: -3px;\n }\n &:not(.is-circle) &__icon--trailing {\n margin-right: -3px;\n }\n\n &__spinner {\n /* size comes from the :size prop (iconSize) */\n }\n\n /* ---------- Variants ---------- */\n &--primary {\n color: colors.$white;\n background-color: colors.$accent-main;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$accent-shadow;\n }\n }\n &--secondary {\n color: colors.$slate-main;\n background-color: colors.$slate-bg;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$slate-tint;\n }\n }\n &--tertiary {\n color: colors.$slate-main;\n background-color: colors.$white;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$slate-tint;\n }\n }\n &--quaternary {\n color: colors.$accent-main;\n border-color: colors.$accent-mid;\n background-color: colors.$white;\n\n &:hover:not(.is-disabled) {\n border-color: colors.$accent-main;\n }\n }\n &--special {\n color: colors.$accent-main;\n background-color: colors.$white;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$accent-bg;\n }\n }\n\n /* ---------- Dashed \"add\" affordance ---------- */\n &.is-dashed {\n color: colors.$slate-mid;\n font-weight: t.$weight-bold;\n\n border: 1px dashed colors.$slate-mid;\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$accent-main;\n border-color: colors.$accent-main;\n background-color: colors.$accent-bg;\n }\n }\n\n /* ---------- Sizes (DS control heights + paddings) ---------- */\n &--small {\n height: s.control-height('small');\n padding: 0 s.control-padding('small');\n gap: 2px;\n\n font-weight: t.$weight-regular; // 400\n font-size: t.font-size('caption');\n\n .ds-button__icon .material-icons {\n font-size: i.icon-size(14);\n }\n }\n &--medium {\n height: s.control-height('medium');\n padding: 0 s.control-padding('medium');\n }\n &--large {\n height: s.control-height('large');\n padding: 0 s.control-padding('large');\n }\n &--xlarge {\n height: s.control-height('xlarge');\n padding: 0 s.control-padding('xlarge');\n }\n\n /* ---------- Circle (icon-only) ---------- */\n &.is-circle {\n padding: 8px;\n border-radius: r.$radius-full;\n aspect-ratio: 1;\n }\n}\n</style>\n","// DsTag — the DS \"Tag\": small bordered chip with optional close (×).\n// ⚠️ NOT the solid pill (that is DsBadge). See DESIGN-SYSTEM.md reconciliation.\n// Tones mirror the DS Tag source (Tag.jsx TONES). `rounded` → semicircular sides.\n\nexport const DS_TAG_TONES = {\n DEFAULT: 'default', // white bg, slate-tint border, muted text\n SUCCESS: 'success', // e.g. Verified\n INFO: 'info', // e.g. Work\n WARNING: 'warning', // e.g. Pending\n ERROR: 'error', // e.g. Bounced\n} as const;\nexport type DsTagTone = (typeof DS_TAG_TONES)[keyof typeof DS_TAG_TONES];\n","<template>\n <span class=\"ds-tag\" :class=\"[`ds-tag--${tone}`, { 'is-rounded': rounded }]\">\n <slot />\n\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"ds-tag__close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"emit(CLOSE)\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { CLOSE } from '@shared/constants/events';\nimport { DS_TAG_TONES, type DsTagTone } from './DsTag.types';\n\ndefineProps({\n tone: {\n type: String as PropType<DsTagTone>,\n default: DS_TAG_TONES.DEFAULT,\n },\n // Semicircular sides (DS `rounded`): radius-round vs the default radius-control.\n rounded: Boolean,\n // Show a × close control that emits `close`.\n closable: Boolean,\n // Accessible name for the × control (the app owns the wording / i18n).\n closeLabel: {\n type: String,\n default: '',\n },\n});\n\nconst emit = defineEmits<{\n (e: typeof CLOSE): void;\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n\n padding: 0 10px;\n\n color: colors.$slate-mid;\n font-family: t.$font-family;\n font-weight: t.$weight-regular;\n font-size: t.font-size('caption');\n line-height: 30px;\n\n background-color: colors.$white;\n\n border: 1px solid colors.$slate-tint;\n border-radius: r.$radius-control;\n\n white-space: nowrap;\n\n &.is-rounded {\n border-radius: r.$radius-round;\n }\n\n &__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n padding: 0;\n\n color: inherit;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n\n .material-icons {\n font-size: i.icon-size(12);\n }\n }\n\n /* ---------- Tones (default: white + tint border + muted text) ---------- */\n &--default {\n color: colors.$slate-mid;\n border-color: colors.$slate-tint;\n background-color: colors.$white;\n }\n &--success {\n color: colors.$success-shadow;\n border-color: colors.$success-mid;\n background-color: colors.$success-tint;\n }\n &--info {\n color: colors.$info-shadow;\n border-color: colors.$info-mid;\n background-color: colors.$info-tint;\n }\n &--warning {\n color: colors.$warning-shadow;\n border-color: colors.$warning-mid;\n background-color: colors.$warning-tint;\n }\n &--error {\n color: colors.$error-shadow;\n border-color: colors.$error-mid;\n background-color: colors.$error-tint;\n }\n}\n</style>\n","// DsBadge — the DS \"Badge\": solid, white-text pill (value types & counts).\n// ⚠️ NOT the tint chip (that is DsTag). See DESIGN-SYSTEM.md reconciliation.\n// Tones mirror the DS Badge source (Badge.jsx TONES).\n\nexport const DS_BADGE_TONES = {\n ACCENT: 'accent', // e.g. Work (purple)\n GREY: 'grey', // e.g. Direct (slate-soft)\n INFO: 'info', // e.g. Mobile (blue)\n SUCCESS: 'success', // e.g. New (green)\n ERROR: 'error', // coral\n WARNING: 'warning', // orange\n} as const;\nexport type DsBadgeTone = (typeof DS_BADGE_TONES)[keyof typeof DS_BADGE_TONES];\n","<template>\n <span class=\"ds-badge\" :class=\"`ds-badge--${tone}`\">\n <slot />\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { DS_BADGE_TONES, type DsBadgeTone } from './DsBadge.types';\n\ndefineProps({\n tone: {\n type: String as PropType<DsBadgeTone>,\n default: DS_BADGE_TONES.ACCENT,\n },\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n\n.ds-badge {\n display: inline-flex;\n align-items: center;\n\n height: 17px;\n padding: 0 8px;\n\n color: colors.$white;\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n line-height: 17px;\n\n border-radius: r.$radius-pill;\n\n white-space: nowrap;\n\n /* ---------- Tones (solid fill, white text) ---------- */\n &--accent {\n background-color: colors.$accent-main;\n }\n &--grey {\n background-color: colors.$slate-soft;\n }\n &--info {\n background-color: colors.$info-main;\n }\n &--success {\n background-color: colors.$success-main;\n }\n &--error {\n background-color: colors.$error-main;\n }\n &--warning {\n background-color: colors.$warning-main;\n }\n}\n</style>\n","<template>\n <img\n v-if=\"image\"\n class=\"ds-avatar\"\n :class=\"{ 'is-circular': circular }\"\n :src=\"image\"\n :alt=\"alt\"\n :style=\"boxStyle\"\n />\n\n <div\n v-else-if=\"initials\"\n class=\"ds-avatar ds-avatar--initials\"\n :class=\"{ 'is-circular': circular }\"\n role=\"img\"\n :aria-label=\"ariaLabel || undefined\"\n :style=\"[\n boxStyle,\n { background: hashed.bg, color: hashed.fg, fontSize: `${Math.round(size * 0.4)}px` },\n ]\"\n >\n {{ initials }}\n </div>\n\n <div\n v-else\n class=\"ds-avatar ds-avatar--placeholder\"\n :class=\"{ 'is-circular': circular }\"\n :style=\"boxStyle\"\n aria-hidden=\"true\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps({\n image: { type: String, default: '' },\n firstName: { type: String, default: '' },\n lastName: { type: String, default: '' },\n uid: { type: String, default: '' },\n size: { type: Number, default: 40 },\n circular: Boolean,\n // Accessible label (defaults to \"firstName lastName\").\n alt: { type: String, default: '' },\n});\n\nconst initials = computed(() =>\n props.firstName && props.lastName\n ? (props.firstName.charAt(0) + props.lastName.charAt(0)).toUpperCase()\n : ''\n);\n\nconst ariaLabel = computed(() => props.alt || `${props.firstName} ${props.lastName}`.trim());\n\nconst boxStyle = computed(() => ({ width: `${props.size}px`, height: `${props.size}px` }));\n\n// Deterministic color from a uid — exact port of SqlAvatar.getBackgroundColor.\nconst hashed = computed(() => {\n const seed = props.uid || props.firstName + props.lastName;\n let hash = 0;\n for (let i = 0; i < seed.length; i++) {\n hash = seed.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n const rgb = [0, 0, 0];\n for (let i = 0; i < 3; i++) rgb[i] = (hash >> (i * 8)) & 255;\n const light = rgb[0] >= 200 && rgb[1] >= 200 && rgb[2] >= 200;\n return { bg: `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`, fg: light ? '#323f4b' : '#fff' };\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n\n.ds-avatar {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: center;\n\n overflow: hidden;\n object-fit: cover;\n\n border-radius: r.$radius-control;\n\n &.is-circular {\n border-radius: r.$radius-full;\n }\n\n &--initials {\n font-family: t.$font-family;\n font-weight: t.$weight-black;\n line-height: 1;\n user-select: none;\n }\n\n &--placeholder {\n background-color: #c0c4cc; // DS placeholder grey (Avatar.jsx)\n }\n}\n</style>\n","// DsTable — the DS data table (data-dense density). Column/row API with hairline\n// borders, row hover, and an optional highlighted \"most likely\" row.\n\nexport const DS_TABLE_ALIGN = {\n LEFT: 'left',\n CENTER: 'center',\n RIGHT: 'right',\n} as const;\nexport type DsTableAlign = (typeof DS_TABLE_ALIGN)[keyof typeof DS_TABLE_ALIGN];\n\n// A column. `key` maps to the row property for default content and names the\n// scoped slot `cell-<key>`.\nexport interface DsTableColumn {\n key: string;\n label: string;\n align?: DsTableAlign;\n width?: string;\n}\n\n// A row: only a stable `id` is required (for :key and highlighting); the rest of\n// the properties are consumed per column via its `key`.\nexport interface DsTableRow {\n id: string | number;\n [key: string]: unknown;\n}\n","<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { DS_TABLE_ALIGN, type DsTableColumn, type DsTableRow } from './DsTable.types';\n\ndefineProps({\n columns: {\n type: Array as PropType<DsTableColumn[]>,\n required: true,\n },\n rows: {\n type: Array as PropType<DsTableRow[]>,\n required: true,\n },\n emptyMessage: {\n type: String,\n default: '',\n },\n // id of the row to highlight (the DS \"most likely\" row → accent surface).\n highlightRowId: {\n type: [String, Number] as PropType<string | number | null>,\n default: null,\n },\n});\n</script>\n\n<template>\n <div class=\"ds-table\">\n <div class=\"ds-table__wrapper\">\n <table class=\"ds-table__table\">\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`ds-table__th--${column.align ?? DS_TABLE_ALIGN.LEFT}`\"\n :style=\"column.width ? { width: column.width } : undefined\"\n >\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"rows.length === 0\">\n <td class=\"ds-table__empty\" :colspan=\"columns.length\" data-testid=\"ds-table-empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n <tr\n v-for=\"row in rows\"\n :key=\"row.id\"\n :class=\"{ 'is-highlighted': row.id === highlightRowId }\"\n data-testid=\"ds-table-row\"\n >\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`ds-table__td--${column.align ?? DS_TABLE_ALIGN.LEFT}`\"\n >\n <slot :name=\"`cell-${column.key}`\" :row=\"row\">{{ row[column.key] }}</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n\n.ds-table {\n &__wrapper {\n overflow-x: auto;\n\n border: 1px solid colors.$slate-tint;\n border-radius: r.$radius-card-lg;\n }\n\n &__table {\n width: 100%;\n border-collapse: collapse;\n\n // Own every border/height explicitly so host-app global table rules can't\n // leak in; scoped specificity (block + [data-v]) beats them.\n th {\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$slate-main;\n font-weight: t.$weight-bold;\n font-size: t.font-size('body');\n\n border: 0;\n border-bottom: 1px solid colors.$slate-tint;\n\n background-color: colors.$slate-bg;\n }\n\n td {\n height: auto;\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$slate-main;\n font-size: t.font-size('body');\n\n border: 0;\n }\n\n tr {\n border: 0;\n transition: background-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n }\n\n // Row separator only BETWEEN adjacent body rows.\n tbody tr + tr {\n border-top: 1px solid colors.$slate-tint;\n }\n\n // Row hover (data-dense affordance).\n tbody tr:hover {\n background-color: colors.$slate-bg;\n }\n\n // The highlighted \"most likely\" row wins over hover.\n tbody tr.is-highlighted {\n background-color: colors.$accent-bg;\n }\n tbody tr.is-highlighted:hover {\n background-color: colors.$accent-tint;\n }\n }\n\n &__th--left,\n &__td--left {\n text-align: left;\n }\n &__th--center,\n &__td--center {\n text-align: center;\n }\n &__th--right,\n &__td--right {\n text-align: right;\n }\n\n &__empty {\n padding: s.spacing(5) s.spacing(3);\n\n color: colors.$slate-soft;\n text-align: center;\n }\n}\n</style>\n","// DsInput — the DS \"Input\": single-line field. Prop vocabulary mirrors Input.jsx.\n// Border: primary-main at rest → accent on focus, coral on error. NO bold-on-focus\n// (the DS source keeps the text at weight 400). Sizes are the DS input heights.\n\nexport const DS_INPUT_TYPES = {\n TEXT: 'text',\n EMAIL: 'email',\n PASSWORD: 'password',\n TEL: 'tel',\n NUMBER: 'number',\n SEARCH: 'search',\n URL: 'url',\n} as const;\nexport type DsInputType = (typeof DS_INPUT_TYPES)[keyof typeof DS_INPUT_TYPES];\n\nexport const DS_INPUT_SIZES = {\n SM: 'sm', // 36px\n MD: 'md', // 48px\n} as const;\nexport type DsInputSize = (typeof DS_INPUT_SIZES)[keyof typeof DS_INPUT_SIZES];\n","<template>\n <div\n class=\"ds-input\"\n :class=\"[`ds-input--${size}`, { 'is-error': error, 'is-disabled': disabled }]\"\n >\n <div class=\"ds-input__wrap\">\n <input\n :id=\"id || undefined\"\n v-model=\"model\"\n class=\"ds-input__control\"\n :class=\"{ 'has-suffix': hasSuffix }\"\n :type=\"resolvedType\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :name=\"name || undefined\"\n :autocomplete=\"autocomplete || undefined\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"error && errorMessage && id ? `${id}-error` : undefined\"\n @focus=\"emit(FOCUS, $event)\"\n @blur=\"emit(BLUR, $event)\"\n />\n\n <div v-if=\"hasSuffix\" class=\"ds-input__suffix\">\n <slot name=\"suffix\" />\n\n <i\n v-if=\"error && showErrorIcon\"\n class=\"material-icons ds-input__error-icon\"\n aria-hidden=\"true\"\n >warning</i\n >\n\n <button\n v-else-if=\"isPassword\"\n type=\"button\"\n class=\"ds-input__toggle\"\n :aria-label=\"toggleLabel || undefined\"\n :aria-pressed=\"reveal\"\n @click=\"reveal = !reveal\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">{{\n reveal ? 'visibility' : 'visibility_off'\n }}</i>\n </button>\n </div>\n </div>\n\n <p v-if=\"error && errorMessage\" :id=\"id ? `${id}-error` : undefined\" class=\"ds-input__error\">\n {{ errorMessage }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots, type PropType } from 'vue';\nimport { FOCUS, BLUR } from '@shared/constants/events';\nimport {\n DS_INPUT_TYPES,\n DS_INPUT_SIZES,\n type DsInputType,\n type DsInputSize,\n} from './DsInput.types';\n\nconst model = defineModel<string>({ default: '' });\n\nconst props = defineProps({\n type: { type: String as PropType<DsInputType>, default: DS_INPUT_TYPES.TEXT },\n size: { type: String as PropType<DsInputSize>, default: DS_INPUT_SIZES.SM },\n placeholder: { type: String, default: '' },\n disabled: Boolean,\n error: Boolean,\n errorMessage: { type: String, default: '' },\n showErrorIcon: Boolean,\n name: { type: String, default: '' },\n id: { type: String, default: '' },\n autocomplete: { type: String, default: '' },\n // Accessible name for the password visibility toggle.\n toggleLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([FOCUS, BLUR]);\n\nconst slots = useSlots();\nconst reveal = ref(false);\nconst isPassword = computed(() => props.type === DS_INPUT_TYPES.PASSWORD);\nconst resolvedType = computed(() =>\n isPassword.value && reveal.value ? DS_INPUT_TYPES.TEXT : props.type\n);\nconst hasSuffix = computed(\n () => !!slots.suffix || (props.error && props.showErrorIcon) || isPassword.value\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-input {\n display: block;\n width: 100%;\n\n &__wrap {\n position: relative;\n width: 100%;\n }\n\n &__control {\n box-sizing: border-box;\n width: 100%;\n padding: 0 16px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n font-weight: t.$weight-regular;\n line-height: 20px;\n\n background-color: colors.$white;\n\n /* Border: primary-main at rest → accent on focus (see precedence below). */\n border: 1px solid colors.$slate-main;\n border-radius: r.$radius-control;\n outline: none;\n\n transition: border-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &.has-suffix {\n padding-right: 50px;\n }\n\n &:focus {\n border-color: colors.$accent-main;\n }\n\n &::placeholder {\n color: colors.$slate-soft;\n }\n }\n\n &__suffix {\n position: absolute;\n top: 0;\n right: 0;\n\n display: flex;\n align-items: center;\n gap: 4px;\n\n height: 100%;\n padding: 0 16px;\n\n color: colors.$slate-soft;\n }\n\n &__toggle {\n display: inline-flex;\n padding: 0;\n\n color: inherit;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n }\n\n &__error-icon {\n color: colors.$error-main;\n }\n\n &__error {\n margin-top: 2px;\n\n color: colors.$error-main;\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n line-height: 18px;\n }\n\n /* ---------- Sizes (DS input heights + icon sizes) ---------- */\n &--sm {\n .ds-input__control {\n height: 36px;\n }\n .material-icons {\n font-size: i.icon-size(20);\n }\n }\n &--md {\n .ds-input__control {\n height: 48px;\n }\n .material-icons {\n font-size: i.icon-size(24);\n }\n }\n\n /* ---------- States (precedence: rest → focus → disabled → error) ---------- */\n &.is-disabled .ds-input__control {\n color: colors.$slate-mid;\n background-color: colors.$slate-bg;\n border-color: colors.$slate-mid;\n cursor: not-allowed;\n }\n &.is-error .ds-input__control,\n &.is-error .ds-input__control:focus {\n border-color: colors.$error-main;\n }\n}\n</style>\n","<template>\n <div class=\"ds-textarea\" :class=\"{ 'is-error': error, 'is-disabled': disabled }\">\n <textarea\n :id=\"id || undefined\"\n v-model=\"model\"\n class=\"ds-textarea__control\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n :disabled=\"disabled\"\n :name=\"name || undefined\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"error && errorMessage && id ? `${id}-error` : undefined\"\n @focus=\"emit(FOCUS, $event)\"\n @blur=\"emit(BLUR, $event)\"\n />\n <p v-if=\"error && errorMessage\" :id=\"id ? `${id}-error` : undefined\" class=\"ds-textarea__error\">\n {{ errorMessage }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { FOCUS, BLUR } from '@shared/constants/events';\n\nconst model = defineModel<string>({ default: '' });\n\ndefineProps({\n placeholder: { type: String, default: '' },\n rows: { type: Number, default: 4 },\n disabled: Boolean,\n error: Boolean,\n errorMessage: { type: String, default: '' },\n name: { type: String, default: '' },\n id: { type: String, default: '' },\n});\n\nconst emit = defineEmits([FOCUS, BLUR]);\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n\n.ds-textarea {\n display: block;\n width: 100%;\n\n &__control {\n box-sizing: border-box;\n width: 100%;\n padding: 12px 16px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n line-height: 20px;\n\n background-color: colors.$white;\n\n border: 1px solid colors.$slate-main;\n border-radius: r.$radius-control;\n outline: none;\n\n resize: vertical;\n transition: border-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &:focus {\n border-color: colors.$accent-main;\n }\n\n &::placeholder {\n color: colors.$slate-soft;\n }\n }\n\n &__error {\n margin-top: 2px;\n\n color: colors.$error-main;\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n line-height: 18px;\n }\n\n &.is-disabled .ds-textarea__control {\n color: colors.$slate-mid;\n background-color: colors.$slate-bg;\n border-color: colors.$slate-mid;\n cursor: not-allowed;\n }\n &.is-error .ds-textarea__control,\n &.is-error .ds-textarea__control:focus {\n border-color: colors.$error-main;\n }\n}\n</style>\n","<template>\n <label class=\"ds-checkbox\" :class=\"{ 'is-disabled': disabled }\">\n <input\n ref=\"inputRef\"\n v-model=\"model\"\n type=\"checkbox\"\n class=\"ds-checkbox__native\"\n :disabled=\"disabled\"\n :name=\"name || undefined\"\n />\n <span\n class=\"ds-checkbox__box\"\n :class=\"{ 'is-active': model || indeterminate }\"\n aria-hidden=\"true\"\n >\n <svg\n v-if=\"indeterminate\"\n class=\"ds-checkbox__mark\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n >\n <line x1=\"4\" y1=\"8\" x2=\"12\" y2=\"8\" />\n </svg>\n <svg\n v-else-if=\"model\"\n class=\"ds-checkbox__mark\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n >\n <path d=\"M3.5 8.5l3 3 6-6\" />\n </svg>\n </span>\n <span v-if=\"$slots.default || label\" class=\"ds-checkbox__label\"\n ><slot>{{ label }}</slot></span\n >\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, watch } from 'vue';\n\nconst model = defineModel<boolean>({ default: false });\n\nconst props = defineProps({\n indeterminate: Boolean,\n disabled: Boolean,\n name: { type: String, default: '' },\n // Label text (DS `label` prop); a default slot overrides it.\n label: { type: String, default: '' },\n});\n\nconst inputRef = ref<HTMLInputElement | null>(null);\n\n// `indeterminate` is a DOM property, not an attribute — keep it in sync for a11y.\nfunction syncIndeterminate() {\n if (inputRef.value) inputRef.value.indeterminate = props.indeterminate;\n}\nonMounted(syncIndeterminate);\nwatch(() => props.indeterminate, syncIndeterminate);\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n\n.ds-checkbox {\n display: inline-flex;\n align-items: center;\n gap: s.spacing(1);\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n\n cursor: pointer;\n\n &.is-disabled {\n color: colors.$slate-soft;\n cursor: not-allowed;\n }\n\n /* Native control drives state + focus, visually replaced by the custom box. */\n &__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n }\n\n &__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n\n width: 18px;\n height: 18px;\n\n color: colors.$white;\n\n background-color: colors.$white;\n\n border: 1px solid colors.$slate-mid;\n border-radius: r.$radius-control;\n\n transition:\n background-color m.$duration-default m.$easing,\n border-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &.is-active {\n background-color: colors.$accent-main;\n border-color: colors.$accent-main;\n }\n }\n\n /* Focus ring on the box when the (hidden) native input is focused. */\n &__native:focus-visible + &__box {\n outline: 2px solid colors.$accent-mid;\n outline-offset: 1px;\n }\n\n &__mark {\n width: 14px;\n height: 14px;\n }\n\n &__label {\n line-height: 1.3;\n }\n}\n</style>\n","// DsAlert — the DS inline banner (Alert.jsx). type × effect (light tint / dark solid).\n\nexport const DS_ALERT_TYPES = {\n SUCCESS: 'success',\n INFO: 'info',\n WARNING: 'warning',\n ERROR: 'error',\n} as const;\nexport type DsAlertType = (typeof DS_ALERT_TYPES)[keyof typeof DS_ALERT_TYPES];\n\nexport const DS_ALERT_EFFECTS = {\n LIGHT: 'light', // tinted: family tint bg + mid border + shadow text\n DARK: 'dark', // solid: family shadow bg + white text\n} as const;\nexport type DsAlertEffect = (typeof DS_ALERT_EFFECTS)[keyof typeof DS_ALERT_EFFECTS];\n\n// Material Icon per type (leading icon when showIcon).\nexport const DS_ALERT_ICONS: Record<DsAlertType, string> = {\n success: 'check_circle',\n info: 'info',\n warning: 'warning',\n error: 'error',\n};\n","<template>\n <div\n v-if=\"visible\"\n class=\"ds-alert\"\n :class=\"[`ds-alert--${type}`, `ds-alert--${effect}`, { 'is-center': center }]\"\n role=\"alert\"\n >\n <i v-if=\"showIcon\" class=\"material-icons ds-alert__icon\" aria-hidden=\"true\">{{ icon }}</i>\n\n <div class=\"ds-alert__content\">\n <div v-if=\"title\" class=\"ds-alert__title\" :class=\"{ 'has-body': hasBody }\">{{ title }}</div>\n <div v-if=\"hasBody\" class=\"ds-alert__body\">\n <slot>{{ description }}</slot>\n </div>\n </div>\n\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"ds-alert__close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"onClose\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots, type PropType } from 'vue';\nimport { CLOSE } from '@shared/constants/events';\nimport {\n DS_ALERT_TYPES,\n DS_ALERT_EFFECTS,\n DS_ALERT_ICONS,\n type DsAlertType,\n type DsAlertEffect,\n} from './DsAlert.types';\n\nconst props = defineProps({\n type: { type: String as PropType<DsAlertType>, default: DS_ALERT_TYPES.INFO },\n effect: { type: String as PropType<DsAlertEffect>, default: DS_ALERT_EFFECTS.LIGHT },\n title: { type: String, default: '' },\n description: { type: String, default: '' },\n showIcon: Boolean,\n closable: Boolean,\n center: Boolean,\n closeLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([CLOSE]);\n\nconst slots = useSlots();\nconst visible = ref(true);\nconst icon = computed(() => DS_ALERT_ICONS[props.type]);\nconst hasBody = computed(() => !!slots.default || props.description.length > 0);\n\nfunction onClose() {\n visible.value = false;\n emit(CLOSE);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-alert {\n position: relative;\n\n display: flex;\n align-items: center;\n\n padding: 8px 16px;\n\n font-family: t.$font-family;\n\n border: 1px solid transparent;\n border-radius: r.$radius-control;\n\n &.is-center {\n justify-content: center;\n }\n\n &__icon {\n margin-right: 8px;\n // Status glyph uses the DS default icon size (md-20) for presence next to the\n // 13px title; the close ✕ below stays at 14 (discreet secondary action).\n font-size: i.icon-size(20);\n }\n\n &__content {\n flex: 1;\n padding: 0 8px;\n }\n\n &__title {\n font-size: t.font-size('small');\n font-weight: t.$weight-regular;\n line-height: 18px;\n\n &.has-body {\n font-weight: t.$weight-bold;\n }\n }\n\n &__body {\n margin-top: 5px;\n font-size: t.font-size('caption');\n }\n\n &__title.has-body + .ds-alert__body {\n margin-top: 5px;\n }\n\n &__close {\n display: inline-flex;\n padding: 0;\n\n color: inherit;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n\n .material-icons {\n font-size: i.icon-size(14);\n }\n }\n\n /* ---------- light (tinted) — bg tint + mid border + shadow text ---------- */\n &--light {\n &.ds-alert--success {\n color: colors.$success-shadow;\n border-color: colors.$success-mid;\n background-color: colors.$success-tint;\n }\n &.ds-alert--info {\n color: colors.$info-shadow;\n border-color: colors.$info-mid;\n background-color: colors.$info-tint;\n }\n &.ds-alert--warning {\n color: colors.$warning-shadow;\n border-color: colors.$warning-mid;\n background-color: colors.$warning-tint;\n }\n &.ds-alert--error {\n color: colors.$error-shadow;\n border-color: colors.$error-mid;\n background-color: colors.$error-tint;\n }\n }\n\n /* ---------- dark (solid) — bg shadow + white text ---------- */\n &--dark {\n color: colors.$white;\n border-color: transparent;\n\n &.ds-alert--success {\n background-color: colors.$success-shadow;\n }\n &.ds-alert--info {\n background-color: colors.$info-shadow;\n }\n &.ds-alert--warning {\n background-color: colors.$warning-shadow;\n }\n &.ds-alert--error {\n background-color: colors.$error-shadow;\n }\n }\n}\n</style>\n","// DsNotification — the DS toast card (Notification.jsx). Fixed-position, 3 types.\n\nexport const DS_NOTIFICATION_TYPES = {\n INFO: 'info',\n WARNING: 'warning',\n ERROR: 'error',\n} as const;\nexport type DsNotificationType = (typeof DS_NOTIFICATION_TYPES)[keyof typeof DS_NOTIFICATION_TYPES];\n\nexport const DS_NOTIFICATION_POSITIONS = {\n TOP_LEFT: 'top-left',\n TOP_RIGHT: 'top-right',\n BOTTOM_LEFT: 'bottom-left',\n BOTTOM_RIGHT: 'bottom-right',\n} as const;\nexport type DsNotificationPosition =\n (typeof DS_NOTIFICATION_POSITIONS)[keyof typeof DS_NOTIFICATION_POSITIONS];\n\n// Material Icon per type (Notification.jsx).\nexport const DS_NOTIFICATION_ICONS: Record<DsNotificationType, string> = {\n info: 'mode_edit',\n warning: 'warning',\n error: 'warning',\n};\n","<template>\n <Teleport to=\"body\">\n <div v-if=\"visible\" class=\"ds-notification\" :class=\"`ds-notification--${position}`\">\n <div class=\"ds-notification__card\" :class=\"`ds-notification__card--${type}`\" role=\"alert\">\n <i class=\"material-icons ds-notification__icon\" aria-hidden=\"true\">{{ icon }}</i>\n\n <div class=\"ds-notification__content\">\n <span v-if=\"title\" class=\"ds-notification__title\">{{ title }}</span>\n <p v-if=\"description\" class=\"ds-notification__desc\">{{ description }}</p>\n <a\n v-if=\"linkTitle\"\n class=\"ds-notification__link\"\n :href=\"link || undefined\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >{{ linkTitle }}</a\n >\n </div>\n\n <button\n v-if=\"showClose\"\n type=\"button\"\n class=\"ds-notification__close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"onClose\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </div>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, type PropType } from 'vue';\nimport { CLOSE } from '@shared/constants/events';\nimport {\n DS_NOTIFICATION_TYPES,\n DS_NOTIFICATION_POSITIONS,\n DS_NOTIFICATION_ICONS,\n type DsNotificationType,\n type DsNotificationPosition,\n} from './DsNotification.types';\n\nconst props = defineProps({\n type: { type: String as PropType<DsNotificationType>, default: DS_NOTIFICATION_TYPES.INFO },\n position: {\n type: String as PropType<DsNotificationPosition>,\n default: DS_NOTIFICATION_POSITIONS.BOTTOM_LEFT,\n },\n title: { type: String, default: '' },\n description: { type: String, default: '' },\n linkTitle: { type: String, default: '' },\n link: { type: String, default: '' },\n showClose: { type: Boolean, default: true },\n closeLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([CLOSE]);\n\nconst visible = ref(true);\nconst icon = computed(() => DS_NOTIFICATION_ICONS[props.type]);\n\nfunction onClose() {\n visible.value = false;\n emit(CLOSE);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/shadow.scss' as sh;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-notification {\n position: fixed;\n z-index: 2000;\n\n &--top-left {\n top: 0;\n left: 0;\n }\n &--top-right {\n top: 0;\n right: 0;\n }\n &--bottom-left {\n bottom: 0;\n left: 0;\n }\n &--bottom-right {\n bottom: 0;\n right: 0;\n }\n\n &__card {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n\n max-width: 331px;\n margin: 24px;\n padding: 16px;\n\n border: 1px solid transparent;\n border-radius: r.$radius-card-lg;\n\n box-shadow: sh.$shadow-soft;\n\n &--info {\n background-color: colors.$info-tint;\n border-color: rgba(colors.$info-main, 0.7);\n\n .ds-notification__icon {\n color: colors.$info-main;\n }\n }\n &--warning {\n background-color: colors.$warning-tint;\n border-color: rgba(colors.$warning-main, 0.7);\n\n .ds-notification__icon {\n color: colors.$warning-main;\n }\n }\n &--error {\n background-color: colors.$error-tint;\n border-color: rgba(colors.$error-main, 0.7);\n\n .ds-notification__icon {\n color: colors.$error-main;\n }\n }\n }\n\n &__icon {\n font-size: i.icon-size(20);\n }\n\n &__content {\n display: flex;\n flex-direction: column;\n\n color: colors.$slate-shadow;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n line-height: 21px;\n }\n\n &__title {\n font-weight: t.$weight-bold;\n }\n\n &__desc {\n margin: 0;\n padding-top: 8px;\n }\n\n &__link {\n padding-top: 8px;\n\n color: colors.$accent-main;\n text-decoration: underline;\n }\n\n &__close {\n display: inline-flex;\n margin-left: auto;\n padding: 0;\n\n color: colors.$slate-soft;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n\n .material-icons {\n font-size: i.icon-size(20);\n }\n }\n}\n</style>\n","<template>\n <Teleport to=\"body\">\n <div v-if=\"open\" class=\"ds-modal\" @click=\"onBackdrop\">\n <div\n ref=\"dialogRef\"\n class=\"ds-modal__dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"title || 'dialog'\"\n tabindex=\"-1\"\n :style=\"{ width }\"\n @click.stop\n >\n <div v-if=\"title || showClose\" class=\"ds-modal__header\">\n <span class=\"ds-modal__title\">{{ title }}</span>\n <DsButton\n v-if=\"showClose\"\n variant=\"tertiary\"\n circle\n left-icon=\"close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"emit(CLOSE)\"\n />\n </div>\n\n <div class=\"ds-modal__body\"><slot /></div>\n\n <div v-if=\"$slots.footer\" class=\"ds-modal__footer\"><slot name=\"footer\" /></div>\n </div>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, nextTick, onBeforeUnmount } from 'vue';\nimport { DsButton } from '@shared/ui/DsButton';\nimport { CLOSE } from '@shared/constants/events';\n\nconst props = defineProps({\n open: Boolean,\n title: { type: String, default: '' },\n showClose: { type: Boolean, default: true },\n width: { type: String, default: '440px' },\n closeOnBackdrop: { type: Boolean, default: true },\n closeLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([CLOSE]);\n\nconst dialogRef = ref<HTMLElement | null>(null);\nlet lastFocused: HTMLElement | null = null;\n\nfunction onBackdrop() {\n if (props.closeOnBackdrop) emit(CLOSE);\n}\n\nfunction focusables(): HTMLElement[] {\n if (!dialogRef.value) return [];\n const sel =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(dialogRef.value.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null\n );\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n emit(CLOSE);\n return;\n }\n if (e.key !== 'Tab') return;\n const f = focusables();\n if (f.length === 0) {\n e.preventDefault();\n dialogRef.value?.focus();\n return;\n }\n const first = f[0];\n const last = f[f.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n}\n\nwatch(\n () => props.open,\n (open) => {\n if (typeof document === 'undefined') return;\n if (open) {\n lastFocused = document.activeElement as HTMLElement;\n document.addEventListener('keydown', onKeydown);\n document.body.style.overflow = 'hidden';\n nextTick(() => (focusables()[0] ?? dialogRef.value)?.focus());\n } else {\n document.removeEventListener('keydown', onKeydown);\n document.body.style.overflow = '';\n lastFocused?.focus?.();\n }\n },\n { immediate: true }\n);\n\nonBeforeUnmount(() => {\n if (typeof document === 'undefined') return;\n document.removeEventListener('keydown', onKeydown);\n document.body.style.overflow = '';\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/shadow.scss' as sh;\n\n.ds-modal {\n position: fixed;\n inset: 0;\n z-index: 2001;\n\n display: flex;\n align-items: flex-start;\n justify-content: center;\n\n padding: 15vh 16px 50px;\n overflow: auto;\n\n background: colors.$backdrop; // grey-10 @ 50%, no blur\n\n &__dialog {\n max-width: 100%;\n\n background: colors.$white;\n\n border-radius: r.$radius-card;\n box-shadow: sh.$shadow-card;\n\n padding: 8px;\n\n outline: none;\n }\n\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n min-height: 36px;\n padding: 8px 0 8px 12px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n font-weight: t.$weight-bold;\n\n border-bottom: 1px solid colors.$slate-tint;\n }\n\n &__body {\n padding: 20px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n }\n\n &__footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n\n padding: 8px;\n\n border-top: 1px solid colors.$slate-tint;\n }\n}\n</style>\n","// DsVerificationIcon — status glyph for a contact data point.\n// 1:1 with the DS source (components/data/VerificationIcon.jsx):\n// verified === true -> \"verified\" (info-main, blue)\n// verified === false + email -> \"dangerous\" (error-main, coral)\n// verified === false + phone -> \"error\" (warning-main, orange)\n// verified == null (new) -> \"new_releases\" (slate-soft, grey)\n// `isContactData` flags emails (coral) vs phones (orange) when unverified.\n\nexport const DS_VERIFICATION_STATES = {\n VERIFIED: 'verified',\n UNVERIFIED: 'unverified',\n NEW: 'new',\n} as const;\nexport type DsVerificationState =\n (typeof DS_VERIFICATION_STATES)[keyof typeof DS_VERIFICATION_STATES];\n","<template>\n <i\n class=\"material-icons ds-verification-icon\"\n :class=\"[\n `ds-verification-icon--${status.state}`,\n { 'ds-verification-icon--email': isContactData },\n ]\"\n :style=\"{ fontSize: `${size}px` }\"\n role=\"img\"\n :aria-label=\"label || status.label\"\n :title=\"label || status.label\"\n >\n <slot>{{ status.icon }}</slot>\n </i>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { DS_VERIFICATION_STATES } from './DsVerificationIcon.types';\n\nconst props = defineProps({\n // true = verified · false = not verified · null/undefined = newly found.\n verified: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n // Emails (true) use the coral \"dangerous\" glyph when unverified; phones use orange.\n isContactData: {\n type: Boolean,\n default: false,\n },\n size: {\n type: Number,\n default: 20,\n },\n // Optional override for the accessible label / tooltip (the app owns i18n).\n // Empty → the English default derived from the verification state.\n label: {\n type: String,\n default: '',\n },\n});\n\nconst status = computed(() => {\n if (props.verified === null || props.verified === undefined) {\n return {\n state: DS_VERIFICATION_STATES.NEW,\n icon: 'new_releases',\n label: 'Newly found',\n };\n }\n if (props.verified) {\n return {\n state: DS_VERIFICATION_STATES.VERIFIED,\n icon: 'verified',\n label: 'Verified',\n };\n }\n return {\n state: DS_VERIFICATION_STATES.UNVERIFIED,\n icon: props.isContactData ? 'dangerous' : 'error',\n label: 'Not verified',\n };\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n\n.ds-verification-icon {\n line-height: 1;\n\n // States map DS colors (VerificationIcon.jsx). isContactData splits the\n // unverified color into coral (email) vs orange (phone).\n &--new {\n color: colors.$slate-soft; // --primary-secondary-text\n }\n &--verified {\n color: colors.$info-main;\n }\n &--unverified {\n color: colors.$warning-main; // phone (orange)\n\n &.ds-verification-icon--email {\n color: colors.$error-main; // email (coral \"dangerous\")\n }\n }\n}\n</style>\n","<template>\n <div class=\"ds-contact-value\" :class=\"{ 'ds-contact-value--main': main }\">\n <DsVerificationIcon :verified=\"verified\" :is-contact-data=\"isContactData\" />\n\n <span class=\"ds-contact-value__value\" :title=\"value\">{{ value }}</span>\n\n <!-- Marquee slot: badge and actions share one grid cell and cross-fade/slide\n on hover (or keyboard focus-within). -->\n <span class=\"ds-contact-value__marquee\">\n <DsBadge\n v-if=\"valueType\"\n class=\"ds-contact-value__badge\"\n :tone=\"main ? DS_BADGE_TONES.ACCENT : DS_BADGE_TONES.GREY\"\n aria-hidden=\"true\"\n >{{ valueType }}</DsBadge\n >\n\n <span class=\"ds-contact-value__actions\">\n <button\n type=\"button\"\n class=\"ds-contact-value__action\"\n :class=\"{ 'is-copied': copied }\"\n :aria-label=\"copied ? copiedLabel : copyLabel\"\n :title=\"copied ? copiedLabel : copyLabel\"\n @click=\"handleCopy\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">{{ copied ? 'check' : 'content_copy' }}</i>\n </button>\n\n <template v-if=\"showRate\">\n <button\n type=\"button\"\n class=\"ds-contact-value__action\"\n :class=\"{ 'is-active': correct === true }\"\n :aria-label=\"correctLabel\"\n :aria-pressed=\"correct === true\"\n :title=\"correctLabel\"\n @click=\"handleCorrect\"\n >\n <i\n :class=\"correct === true ? 'material-icons' : 'material-icons-outlined'\"\n aria-hidden=\"true\"\n >thumb_up</i\n >\n </button>\n <button\n type=\"button\"\n class=\"ds-contact-value__action\"\n :class=\"{ 'is-active': correct === false }\"\n :aria-label=\"incorrectLabel\"\n :aria-pressed=\"correct === false\"\n :title=\"incorrectLabel\"\n @click=\"handleIncorrect\"\n >\n <i\n :class=\"correct === false ? 'material-icons' : 'material-icons-outlined'\"\n aria-hidden=\"true\"\n >thumb_down</i\n >\n </button>\n </template>\n </span>\n </span>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onBeforeUnmount, type PropType } from 'vue';\nimport { DsVerificationIcon } from '@shared/ui/DsVerificationIcon';\nimport { DsBadge, DS_BADGE_TONES } from '@shared/ui/DsBadge';\nimport { COPY, CORRECT, INCORRECT } from '@shared/constants/events';\n\nconst props = defineProps({\n value: { type: String, required: true },\n valueType: { type: String, default: '' },\n verified: { type: Boolean as PropType<boolean | null>, default: null },\n main: { type: Boolean, default: false },\n isContactData: { type: Boolean, default: false },\n showRate: { type: Boolean, default: false },\n correct: { type: Boolean as PropType<boolean | null>, default: null },\n // User-facing labels (the app owns i18n); English DS defaults.\n copyLabel: { type: String, default: 'Copy' },\n copiedLabel: { type: String, default: 'Copied!' },\n correctLabel: { type: String, default: 'Correct' },\n incorrectLabel: { type: String, default: 'Incorrect' },\n});\n\n// Runtime array so the emit names are registered at runtime (the type-only\n// form with `typeof CONST` compiles to an empty `emits`, which lets listeners\n// fall through as native attrs). Names come from the shared events constants.\nconst emit = defineEmits([COPY, CORRECT, INCORRECT]);\n\nconst copied = ref(false);\nlet copiedTimer: ReturnType<typeof setTimeout> | undefined;\n\nfunction handleCopy() {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(props.value).catch(() => {});\n }\n copied.value = true;\n clearTimeout(copiedTimer);\n copiedTimer = setTimeout(() => {\n copied.value = false;\n }, 1200);\n emit(COPY, props.value);\n}\n\nfunction handleCorrect() {\n emit(CORRECT);\n}\nfunction handleIncorrect() {\n emit(INCORRECT);\n}\n\nonBeforeUnmount(() => clearTimeout(copiedTimer));\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-contact-value {\n display: flex;\n align-items: center;\n\n padding: 6px; // DS ContactValue.jsx\n border-radius: r.$radius-control;\n\n background: transparent;\n transition: background-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &:hover,\n &:focus-within {\n background-color: colors.$slate-bg; // --primary-background\n }\n\n &--main:hover,\n &--main:focus-within {\n background-color: colors.$accent-bg;\n }\n\n // -- value ---------------------------------------------------------------\n &__value {\n flex: 1;\n min-width: 0;\n margin: 0 8px; // DS\n\n color: colors.$slate-main; // --primary-main\n font-family: t.$font-family;\n font-size: t.font-size('body');\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // -- marquee (badge + actions share one cell) ----------------------------\n &__marquee {\n display: inline-grid;\n align-items: center;\n justify-items: end;\n margin-left: auto;\n }\n\n &__badge,\n &__actions {\n grid-area: 1 / 1;\n transition:\n transform m.$duration-reveal m.$easing,\n opacity m.$duration-reveal m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n }\n\n // At rest: badge in place, actions parked to the right and hidden.\n &__badge {\n transform: translateX(0);\n opacity: 1;\n }\n &__actions {\n display: inline-flex;\n align-items: center;\n gap: 8px; // DS\n\n transform: translateX(8px);\n opacity: 0;\n pointer-events: none;\n }\n\n // On hover / keyboard focus: badge slides out, actions slide in.\n &:hover &__badge,\n &:focus-within &__badge {\n transform: translateX(8px);\n opacity: 0;\n }\n &:hover &__actions,\n &:focus-within &__actions {\n transform: translateX(0);\n opacity: 1;\n pointer-events: auto;\n }\n\n // -- action buttons ------------------------------------------------------\n &__action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n\n color: colors.$slate-soft; // --primary-secondary-text\n\n .material-icons,\n .material-icons-outlined {\n font-size: i.icon-size(20);\n line-height: 1;\n }\n\n &.is-copied {\n color: colors.$success-shadow;\n }\n }\n}\n</style>\n","<template>\n <section class=\"ds-data-card\" :aria-label=\"title\">\n <!-- header -->\n <div\n class=\"ds-data-card__header\"\n :class=\"{ 'is-collapsed': isCollapsed, 'is-collapsible': collapsible }\"\n @click=\"collapsible && toggle()\"\n >\n <div class=\"ds-data-card__heading\">\n <i class=\"material-icons ds-data-card__icon\" aria-hidden=\"true\">{{ icon }}</i>\n <span class=\"ds-data-card__title\">{{ title }}</span>\n </div>\n\n <div class=\"ds-data-card__actions\" @click.stop>\n <button\n v-if=\"!isCollapsed && showEdit\"\n type=\"button\"\n class=\"ds-data-card__edit\"\n @click=\"onEdit\"\n >\n {{ editLabel }}\n </button>\n\n <DsButton\n v-if=\"!isCollapsed && showSort\"\n variant=\"tertiary\"\n size=\"medium\"\n circle\n left-icon=\"swap_vert\"\n :aria-label=\"sortLabel\"\n @click=\"onSort\"\n />\n\n <DsButton\n v-if=\"collapsible\"\n variant=\"tertiary\"\n size=\"medium\"\n circle\n :left-icon=\"collapsed ? 'keyboard_arrow_down' : 'keyboard_arrow_up'\"\n :aria-label=\"toggleLabel\"\n @click=\"toggle\"\n />\n\n <button\n v-if=\"showClose\"\n type=\"button\"\n class=\"ds-data-card__close\"\n :aria-label=\"closeLabel\"\n @click=\"onClose\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </div>\n </div>\n\n <!-- body -->\n <div v-if=\"!isCollapsed\" class=\"ds-data-card__body\">\n <div v-if=\"empty\" class=\"ds-data-card__empty\">\n <i class=\"material-icons-outlined ds-data-card__empty-icon\" aria-hidden=\"true\">{{\n icon\n }}</i>\n <span>{{ emptyLabel }}</span>\n </div>\n\n <template v-else>\n <div v-if=\"mostLikely\">\n <div v-if=\"showSections\" class=\"ds-data-card__section\">{{ mostLikelyLabel }}</div>\n <DsContactValue\n :value=\"mostLikely.value\"\n :value-type=\"mostLikely.type\"\n :verified=\"mostLikely.verified\"\n :correct=\"mostLikely.correct\"\n main\n :is-contact-data=\"isContactData\"\n :show-rate=\"showRate\"\n @copy=\"onCopy\"\n @correct=\"onCorrect(mostLikely)\"\n @incorrect=\"onIncorrect(mostLikely)\"\n />\n </div>\n\n <div v-if=\"more.length > 0\">\n <div v-if=\"showSections\" class=\"ds-data-card__section\">{{ moreLabel }}</div>\n <div class=\"ds-data-card__more\">\n <DsContactValue\n v-for=\"datum in more\"\n :key=\"datum.value\"\n :value=\"datum.value\"\n :value-type=\"datum.type\"\n :verified=\"datum.verified\"\n :correct=\"datum.correct\"\n :is-contact-data=\"isContactData\"\n :show-rate=\"showRate\"\n @copy=\"onCopy\"\n @correct=\"onCorrect(datum)\"\n @incorrect=\"onIncorrect(datum)\"\n />\n </div>\n </div>\n </template>\n </div>\n </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, type PropType } from 'vue';\nimport { DsButton } from '@shared/ui/DsButton';\nimport { DsContactValue } from '@shared/ui/DsContactValue';\nimport { COPY, SORT, EDIT, CLOSE, CORRECT, INCORRECT } from '@shared/constants/events';\nimport type { DsContactDatum } from './DsDataCard.types';\n\nconst props = defineProps({\n title: { type: String, required: true },\n // Material Icon name for the header (e.g. \"email\", \"call\").\n icon: { type: String, default: 'email' },\n mostLikely: { type: Object as PropType<DsContactDatum | null>, default: null },\n more: { type: Array as PropType<DsContactDatum[]>, default: () => [] },\n collapsible: { type: Boolean, default: false },\n showSort: { type: Boolean, default: true },\n showEdit: { type: Boolean, default: false },\n showClose: { type: Boolean, default: false },\n isContactData: { type: Boolean, default: false },\n showRate: { type: Boolean, default: false },\n // User-facing labels (the app owns i18n); English DS defaults.\n editLabel: { type: String, default: 'Edit' },\n emptyLabel: { type: String, default: 'No data found' },\n mostLikelyLabel: { type: String, default: 'MOST LIKELY' },\n moreLabel: { type: String, default: 'MORE' },\n sortLabel: { type: String, default: 'Sort' },\n toggleLabel: { type: String, default: 'Toggle' },\n closeLabel: { type: String, default: 'Close' },\n});\n\n// Runtime array so the emit names are registered at runtime (the type-only\n// form with `typeof CONST` compiles to an empty `emits`, which lets listeners\n// fall through as native attrs). Names come from the shared events constants.\nconst emit = defineEmits([COPY, SORT, EDIT, CLOSE, CORRECT, INCORRECT]);\n\nconst collapsed = ref(false);\n\nconst total = computed(() => props.more.length + (props.mostLikely ? 1 : 0));\nconst showSections = computed(() => total.value > 3);\nconst empty = computed(() => total.value === 0);\nconst isCollapsed = computed(() => props.collapsible && collapsed.value);\n\nfunction toggle() {\n collapsed.value = !collapsed.value;\n}\nfunction onCopy(value: string) {\n emit(COPY, value);\n}\nfunction onSort() {\n emit(SORT);\n}\nfunction onEdit() {\n emit(EDIT);\n}\nfunction onClose() {\n emit(CLOSE);\n}\nfunction onCorrect(datum: DsContactDatum) {\n emit(CORRECT, datum);\n}\nfunction onIncorrect(datum: DsContactDatum) {\n emit(INCORRECT, datum);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/shadow.scss' as sh;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-data-card {\n display: block;\n\n padding: 8px;\n\n background-color: colors.$white;\n border-radius: r.$radius-card;\n box-shadow: sh.$shadow-card;\n\n // -- header --------------------------------------------------------------\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 6px 6px 14px; // DS DataCard.jsx\n border-bottom: 1px solid colors.$slate-tint; // --primary-tint\n\n &.is-collapsible {\n cursor: pointer;\n }\n &.is-collapsed {\n border-bottom: none;\n }\n }\n\n &__heading {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n &__icon {\n font-size: i.icon-size(20);\n line-height: 1;\n color: colors.$slate-main; // --primary-main\n }\n\n &__title {\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('body');\n color: colors.$slate-main;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n &__edit {\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n color: colors.$accent-main;\n }\n\n &__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n\n color: colors.$slate-soft; // --primary-secondary-text\n\n .material-icons {\n font-size: i.icon-size(20);\n line-height: 1;\n }\n }\n\n // -- body ----------------------------------------------------------------\n &__body {\n padding-top: 8px;\n }\n\n &__section {\n padding: 6px;\n\n font-family: t.$font-family;\n font-size: t.font-size('micro');\n line-height: 18px;\n letter-spacing: 0.04em;\n color: colors.$slate-main;\n }\n\n &__more {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n max-height: 132px; // DS: ~3 rows before the \"MORE\" list scrolls\n overflow: auto;\n }\n\n &__empty {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px;\n\n font-family: t.$font-family;\n font-size: t.font-size('body');\n color: colors.$slate-main;\n }\n\n &__empty-icon {\n font-size: i.icon-size(20);\n line-height: 1;\n color: colors.$slate-soft;\n }\n}\n</style>\n"],"names":["DS_SPINNER_TONES","_createElementBlock","_normalizeClass","__props","_normalizeStyle","_hoisted_2","_toDisplayString","CLICK","CLOSE","FOCUS","BLUR","COPY","CORRECT","INCORRECT","SORT","EDIT","DS_BUTTON_VARIANTS","DS_BUTTON_SIZES","DS_BUTTON_NATIVE_TYPES","props","emit","__emit","iconSize","computed","spinnerTone","handleClick","event","_createBlock","_unref","DsSpinner","$slots","_openBlock","_renderSlot","_ctx","_createElementVNode","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","DS_TAG_TONES","_cache","$event","DS_BADGE_TONES","initials","ariaLabel","boxStyle","hashed","seed","hash","i","rgb","light","DS_TABLE_ALIGN","_hoisted_1","_Fragment","_renderList","column","_a","row","DS_INPUT_TYPES","DS_INPUT_SIZES","model","_useModel","slots","useSlots","reveal","ref","isPassword","resolvedType","hasSuffix","_hoisted_7","inputRef","syncIndeterminate","onMounted","watch","DS_ALERT_TYPES","DS_ALERT_EFFECTS","DS_ALERT_ICONS","visible","icon","hasBody","onClose","DS_NOTIFICATION_TYPES","DS_NOTIFICATION_POSITIONS","DS_NOTIFICATION_ICONS","_Teleport","dialogRef","lastFocused","onBackdrop","focusables","el","onKeydown","e","f","first","last","open","nextTick","_b","onBeforeUnmount","DsButton","DS_VERIFICATION_STATES","status","_createTextVNode","copied","copiedTimer","handleCopy","handleCorrect","handleIncorrect","_createVNode","DsVerificationIcon","DsBadge","collapsed","total","showSections","empty","isCollapsed","toggle","onCopy","value","onSort","onEdit","onCorrect","datum","onIncorrect","_hoisted_8","_hoisted_9","_hoisted_10","DsContactValue","_hoisted_11","_hoisted_12","_hoisted_13"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,40 @@
|
|
|
1
1
|
import './assets/css/base.scss';
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export type {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export type {
|
|
8
|
-
export {
|
|
9
|
-
export
|
|
2
|
+
export { DsButton } from './ui/DsButton';
|
|
3
|
+
export { DS_BUTTON_VARIANTS, DS_BUTTON_SIZES, DS_BUTTON_NATIVE_TYPES } from './ui/DsButton';
|
|
4
|
+
export type { DsButtonVariant, DsButtonSize, DsButtonNativeType } from './ui/DsButton';
|
|
5
|
+
export { DsTag } from './ui/DsTag';
|
|
6
|
+
export { DS_TAG_TONES } from './ui/DsTag';
|
|
7
|
+
export type { DsTagTone } from './ui/DsTag';
|
|
8
|
+
export { DsBadge } from './ui/DsBadge';
|
|
9
|
+
export { DS_BADGE_TONES } from './ui/DsBadge';
|
|
10
|
+
export type { DsBadgeTone } from './ui/DsBadge';
|
|
11
|
+
export { DsAvatar } from './ui/DsAvatar';
|
|
12
|
+
export type { DsAvatarProps } from './ui/DsAvatar';
|
|
13
|
+
export { DsSpinner } from './ui/DsSpinner';
|
|
14
|
+
export { DS_SPINNER_TONES } from './ui/DsSpinner';
|
|
15
|
+
export type { DsSpinnerTone } from './ui/DsSpinner';
|
|
16
|
+
export { DsTable } from './ui/DsTable';
|
|
17
|
+
export { DS_TABLE_ALIGN } from './ui/DsTable';
|
|
18
|
+
export type { DsTableColumn, DsTableRow, DsTableAlign } from './ui/DsTable';
|
|
19
|
+
export { DsInput } from './ui/DsInput';
|
|
20
|
+
export { DS_INPUT_TYPES, DS_INPUT_SIZES } from './ui/DsInput';
|
|
21
|
+
export type { DsInputType, DsInputSize } from './ui/DsInput';
|
|
22
|
+
export { DsTextarea } from './ui/DsTextarea';
|
|
23
|
+
export type { DsTextareaProps } from './ui/DsTextarea';
|
|
24
|
+
export { DsCheckbox } from './ui/DsCheckbox';
|
|
25
|
+
export type { DsCheckboxProps } from './ui/DsCheckbox';
|
|
26
|
+
export { DsAlert } from './ui/DsAlert';
|
|
27
|
+
export { DS_ALERT_TYPES, DS_ALERT_EFFECTS, DS_ALERT_ICONS } from './ui/DsAlert';
|
|
28
|
+
export type { DsAlertType, DsAlertEffect } from './ui/DsAlert';
|
|
29
|
+
export { DsNotification } from './ui/DsNotification';
|
|
30
|
+
export { DS_NOTIFICATION_TYPES, DS_NOTIFICATION_POSITIONS, DS_NOTIFICATION_ICONS, } from './ui/DsNotification';
|
|
31
|
+
export type { DsNotificationType, DsNotificationPosition } from './ui/DsNotification';
|
|
32
|
+
export { DsModal } from './ui/DsModal';
|
|
33
|
+
export type { DsModalProps } from './ui/DsModal';
|
|
34
|
+
export { DsVerificationIcon } from './ui/DsVerificationIcon';
|
|
35
|
+
export { DS_VERIFICATION_STATES } from './ui/DsVerificationIcon';
|
|
36
|
+
export type { DsVerificationState } from './ui/DsVerificationIcon';
|
|
37
|
+
export { DsContactValue } from './ui/DsContactValue';
|
|
38
|
+
export type { DsContactValueProps } from './ui/DsContactValue';
|
|
39
|
+
export { DsDataCard } from './ui/DsDataCard';
|
|
40
|
+
export type { DsContactDatum } from './ui/DsDataCard';
|