@digitalwalletcorp/vue-core 1.2.1 → 1.3.1
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/README.md +79 -3
- package/lib/accordion-fieldset.d.cts +14 -4
- package/lib/accordion-fieldset.d.ts +14 -4
- package/lib/accordion-section.d.cts +20 -10
- package/lib/accordion-section.d.ts +20 -10
- package/lib/components-BuTJ1wX8.js +26 -0
- package/lib/components-CKql5lWg.cjs +1 -0
- package/lib/components.d.cts +10 -0
- package/lib/components.d.ts +10 -0
- package/lib/copy-button.d.cts +34 -0
- package/lib/copy-button.d.ts +34 -0
- package/lib/dark-mode-selector.d.cts +32 -0
- package/lib/dark-mode-selector.d.ts +32 -0
- package/lib/data-table.d.cts +29 -0
- package/lib/data-table.d.ts +29 -0
- package/lib/help-button.d.cts +39 -0
- package/lib/help-button.d.ts +39 -0
- package/lib/help-popper.d.cts +39 -0
- package/lib/help-popper.d.ts +39 -0
- package/lib/helpers/data-table-csv.d.cts +17 -0
- package/lib/helpers/data-table-csv.d.ts +17 -0
- package/lib/helpers/show-floating-component.d.cts +86 -0
- package/lib/helpers/show-floating-component.d.ts +86 -0
- package/lib/helpers/show-modal-dialog.d.cts +73 -0
- package/lib/helpers/show-modal-dialog.d.ts +73 -0
- package/lib/helpers/show-overlay-box.d.cts +53 -0
- package/lib/helpers/show-overlay-box.d.ts +53 -0
- package/lib/helpers/show-screen-loading.d.cts +20 -0
- package/lib/helpers/show-screen-loading.d.ts +20 -0
- package/lib/helpers/show-snackbar.d.cts +47 -0
- package/lib/helpers/show-snackbar.d.ts +47 -0
- package/lib/hourglass-loading.d.cts +1 -1
- package/lib/hourglass-loading.d.ts +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.cts +34 -0
- package/lib/index.d.ts +34 -0
- package/lib/index.js +445 -18
- package/lib/internal/anchored-popover.d.cts +35 -0
- package/lib/internal/anchored-popover.d.ts +35 -0
- package/lib/internal/anchored-position.d.cts +50 -0
- package/lib/internal/anchored-position.d.ts +50 -0
- package/lib/internal/data-table-controls.d.cts +42 -0
- package/lib/internal/data-table-controls.d.ts +42 -0
- package/lib/internal/data-table-value.d.cts +32 -0
- package/lib/internal/data-table-value.d.ts +32 -0
- package/lib/internal/floating-component.d.cts +52 -0
- package/lib/internal/floating-component.d.ts +52 -0
- package/lib/internal/icon-popper.d.cts +32 -0
- package/lib/internal/icon-popper.d.ts +32 -0
- package/lib/internal/mount-window.d.cts +39 -0
- package/lib/internal/mount-window.d.ts +39 -0
- package/lib/internal/movable-window.d.cts +55 -0
- package/lib/internal/movable-window.d.ts +55 -0
- package/lib/internal/opened-overlay-boxes.d.cts +2 -0
- package/lib/internal/opened-overlay-boxes.d.ts +2 -0
- package/lib/internal/pagination.d.cts +22 -0
- package/lib/internal/pagination.d.ts +22 -0
- package/lib/internal/snackbar-container.d.cts +20 -0
- package/lib/internal/snackbar-container.d.ts +20 -0
- package/lib/internal/snackbar-item.d.cts +17 -0
- package/lib/internal/snackbar-item.d.ts +17 -0
- package/lib/internal/tab-group-context.d.cts +4 -2
- package/lib/internal/tab-group-context.d.ts +4 -2
- package/lib/internal/use-movable-window.d.cts +44 -0
- package/lib/internal/use-movable-window.d.ts +44 -0
- package/lib/internal/window-order.d.cts +6 -0
- package/lib/internal/window-order.d.ts +6 -0
- package/lib/intersection-lazy-component.d.cts +32 -0
- package/lib/intersection-lazy-component.d.ts +32 -0
- package/lib/label-button.d.cts +2 -2
- package/lib/label-button.d.ts +2 -2
- package/lib/label-icon.d.cts +2 -2
- package/lib/label-icon.d.ts +2 -2
- package/lib/modal-dialog.d.cts +67 -0
- package/lib/modal-dialog.d.ts +67 -0
- package/lib/nuxt.cjs +1 -1
- package/lib/nuxt.js +1 -1
- package/lib/overlay-box.d.cts +52 -0
- package/lib/overlay-box.d.ts +52 -0
- package/lib/page-section.d.cts +2 -2
- package/lib/page-section.d.ts +2 -2
- package/lib/page-title.d.cts +2 -2
- package/lib/page-title.d.ts +2 -2
- package/lib/register.cjs +1 -1
- package/lib/register.js +1 -1
- package/lib/screen-loading.d.cts +7 -0
- package/lib/screen-loading.d.ts +7 -0
- package/lib/style.css +1 -1
- package/lib/tab-content.d.cts +5 -5
- package/lib/tab-content.d.ts +5 -5
- package/lib/tab-group.d.cts +7 -10
- package/lib/tab-group.d.ts +7 -10
- package/lib/types/data-table.d.cts +185 -0
- package/lib/types/data-table.d.ts +185 -0
- package/lib/types/modal-dialog.d.cts +13 -0
- package/lib/types/modal-dialog.d.ts +13 -0
- package/lib/types/movable-window.d.cts +16 -0
- package/lib/types/movable-window.d.ts +16 -0
- package/lib/warning-popper.d.cts +39 -0
- package/lib/warning-popper.d.ts +39 -0
- package/lib/warning-popper.vue_vue_type_style_index_0_lang-BKV_FX6k.js +1837 -0
- package/lib/warning-popper.vue_vue_type_style_index_0_lang-CHmkjVCO.cjs +1 -0
- package/package.json +40 -14
- package/src/accordion-fieldset.vue +24 -19
- package/src/accordion-section.vue +33 -28
- package/src/components.ts +10 -0
- package/src/copy-button.vue +89 -0
- package/src/dark-mode-selector.vue +212 -0
- package/src/data-table.vue +648 -0
- package/src/help-button.vue +128 -0
- package/src/help-popper.vue +70 -0
- package/src/helpers/data-table-csv.ts +55 -0
- package/src/helpers/show-floating-component.ts +177 -0
- package/src/helpers/show-modal-dialog.ts +121 -0
- package/src/helpers/show-overlay-box.ts +106 -0
- package/src/helpers/show-screen-loading.ts +37 -0
- package/src/helpers/show-snackbar.ts +153 -0
- package/src/hourglass-loading.vue +1 -1
- package/src/index.ts +34 -0
- package/src/internal/anchored-popover.vue +192 -0
- package/src/internal/anchored-position.ts +135 -0
- package/src/internal/data-table-controls.vue +203 -0
- package/src/internal/data-table-value.ts +99 -0
- package/src/internal/floating-component.vue +202 -0
- package/src/internal/icon-popper.vue +185 -0
- package/src/internal/mount-window.ts +110 -0
- package/src/internal/movable-window.vue +315 -0
- package/src/internal/opened-overlay-boxes.ts +2 -0
- package/src/internal/pagination.vue +325 -0
- package/src/internal/snackbar-container.vue +258 -0
- package/src/internal/snackbar-item.ts +20 -0
- package/src/internal/tab-group-context.ts +4 -2
- package/src/internal/use-movable-window.ts +208 -0
- package/src/internal/window-order.ts +11 -0
- package/src/intersection-lazy-component.vue +84 -0
- package/src/label-button.vue +9 -6
- package/src/label-icon.vue +2 -2
- package/src/modal-dialog.vue +287 -0
- package/src/overlay-box.vue +218 -0
- package/src/page-section.vue +7 -7
- package/src/page-title.vue +4 -4
- package/src/screen-loading.vue +90 -0
- package/src/tab-content.vue +16 -15
- package/src/tab-group.vue +34 -36
- package/src/types/data-table.ts +196 -0
- package/src/types/modal-dialog.ts +16 -0
- package/src/types/movable-window.ts +18 -0
- package/src/warning-popper.vue +70 -0
- package/lib/accordion-fieldset.cjs +0 -1
- package/lib/accordion-fieldset.js +0 -4
- package/lib/accordion-fieldset.vue_vue_type_style_index_0_lang-Cf4czDXz.js +0 -66
- package/lib/accordion-fieldset.vue_vue_type_style_index_0_lang-DoM5QjpJ.cjs +0 -1
- package/lib/accordion-section.cjs +0 -1
- package/lib/accordion-section.js +0 -4
- package/lib/accordion-section.vue_vue_type_style_index_0_lang-CFDdUEnn.cjs +0 -1
- package/lib/accordion-section.vue_vue_type_style_index_0_lang-Gvjjx02P.js +0 -78
- package/lib/components-C63HJoCn.cjs +0 -1
- package/lib/components-q4Cf97bO.js +0 -24
- package/lib/hourglass-loading.cjs +0 -1
- package/lib/hourglass-loading.js +0 -4
- package/lib/hourglass-loading.vue_vue_type_style_index_0_lang-C72UVA9W.cjs +0 -1
- package/lib/hourglass-loading.vue_vue_type_style_index_0_lang-DkUGIxQ2.js +0 -22
- package/lib/label-button.cjs +0 -1
- package/lib/label-button.js +0 -4
- package/lib/label-button.vue_vue_type_style_index_0_lang-D7ZgfZOL.cjs +0 -1
- package/lib/label-button.vue_vue_type_style_index_0_lang-DqRYddVt.js +0 -44
- package/lib/label-icon.cjs +0 -1
- package/lib/label-icon.js +0 -4
- package/lib/label-icon.vue_vue_type_style_index_0_lang-D9Cimu20.cjs +0 -1
- package/lib/label-icon.vue_vue_type_style_index_0_lang-me52HE2V.js +0 -38
- package/lib/page-section.cjs +0 -1
- package/lib/page-section.js +0 -4
- package/lib/page-section.vue_vue_type_style_index_0_lang-DEAkTLxd.cjs +0 -1
- package/lib/page-section.vue_vue_type_style_index_0_lang-DpVQe_rV.js +0 -54
- package/lib/page-title.cjs +0 -1
- package/lib/page-title.js +0 -4
- package/lib/page-title.vue_vue_type_style_index_0_lang-BqIsIks5.cjs +0 -1
- package/lib/page-title.vue_vue_type_style_index_0_lang-ChZot85K.js +0 -36
- package/lib/tab-content.cjs +0 -1
- package/lib/tab-content.js +0 -4
- package/lib/tab-content.vue_vue_type_style_index_0_lang-BeCi7Xkp.cjs +0 -1
- package/lib/tab-content.vue_vue_type_style_index_0_lang-CcQLHmIF.js +0 -44
- package/lib/tab-group.cjs +0 -1
- package/lib/tab-group.js +0 -4
- package/lib/tab-group.vue_vue_type_style_index_0_lang-C84mDEOC.js +0 -103
- package/lib/tab-group.vue_vue_type_style_index_0_lang-CMaufRJV.cjs +0 -1
- package/lib/use-shrinkable-CS2bmsJJ.js +0 -17
- package/lib/use-shrinkable-Cu9JQZll.cjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("vue"),C=require("@digitalwalletcorp/vue-svg-icons"),M=e.defineComponent({__name:"label-icon",props:{preset:{},gap:{},iconClass:{type:[Boolean,null,String,Object,Array]},iconStyle:{type:[Boolean,null,String,Object,Array]},labelClass:{type:[Boolean,null,String,Object,Array]},labelStyle:{type:[Boolean,null,String,Object,Array]}},setup(r){const n=r,t=e.useSlots();return(o,a)=>(e.openBlock(),e.createElementBlock("span",{class:"dwui-label-icon",style:e.normalizeStyle(n.gap==null?void 0:{"--dwui-gap-label-icon":n.gap})},[e.renderSlot(o.$slots,"icon",{},()=>[n.preset!=null?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.preset.icon),e.mergeProps({key:0},n.preset.iconProps,{class:n.iconClass,style:n.iconStyle}),null,16,["class","style"])):e.createCommentVNode("",!0)]),t.default!=null||n.preset!=null?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["dwui-label",n.labelClass]),style:e.normalizeStyle(n.labelStyle)},[e.renderSlot(o.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(typeof n.preset?.label=="function"?n.preset.label():n.preset?.label),1)])],6)):e.createCommentVNode("",!0)],4))}}),pe=70;function Z(r){const n=e.ref(!0);let t;return e.onMounted(()=>{const o=r.value;o!=null&&(t=new ResizeObserver(()=>{n.value=pe<=o.scrollHeight}),t.observe(o))}),e.onBeforeUnmount(()=>{t?.disconnect()}),n}const fe=["disabled"],ge={class:"dwui-accordion-legend"},ve=["aria-expanded"],he=e.defineComponent({__name:"accordion-fieldset",props:e.mergeModels({legend:{},disabled:{type:Boolean},initialExpand:{type:Boolean}},{expanded:{type:Boolean,default:void 0},expandedModifiers:{}}),emits:["update:expanded"],setup(r){const n=r,t=e.useSlots(),o=e.ref(),a=e.useModel(r,"expanded"),l=e.ref(!!n.initialExpand),i=e.computed({get:()=>a.value??l.value,set:d=>{l.value=d,a.value=d}}),m=Z(o),c=()=>{i.value=!i.value};return(d,v)=>(e.openBlock(),e.createElementBlock("fieldset",{class:"dwui-accordion-fieldset",disabled:n.disabled},[e.createElementVNode("legend",ge,[e.createElementVNode("button",{type:"button",class:"dwui-accordion-toggle","aria-expanded":i.value,onClick:c},[e.createVNode(e.unref(C.SvgTriangleButton),{direction:i.value?"up":"down"},null,8,["direction"]),n.legend!=null||t.legend!=null||t.icon!=null?(e.openBlock(),e.createBlock(M,{key:0},e.createSlots({_:2},[t.icon!=null?{name:"icon",fn:e.withCtx(()=>[e.renderSlot(d.$slots,"icon")]),key:"0"}:void 0,n.legend!=null||t.legend!=null?{name:"default",fn:e.withCtx(()=>[e.renderSlot(d.$slots,"legend",{},()=>[e.createTextVNode(e.toDisplayString(n.legend),1)])]),key:"1"}:void 0]),1024)):e.createCommentVNode("",!0)],8,ve)]),e.createElementVNode("div",{ref_key:"refContents",ref:o,class:e.normalizeClass(["dwui-accordion-contents",e.unref(m)?i.value?"dwui-expanded":"dwui-shrunk":""])},[e.renderSlot(d.$slots,"default")],2)],8,fe))}}),be={class:"dwui-accordion-section"},we={key:0,class:"dwui-accordion-section-control"},ye=["disabled","aria-expanded"],ke=e.defineComponent({__name:"accordion-section",props:e.mergeModels({disabled:{type:Boolean},initialExpand:{type:Boolean},noGradient:{type:Boolean},expandLabel:{},collapseLabel:{},expandPreset:{},collapsePreset:{}},{expanded:{type:Boolean,default:void 0},expandedModifiers:{}}),emits:["update:expanded"],setup(r){const n=r,t=e.useSlots(),o=e.ref(),a=e.useModel(r,"expanded"),l=e.ref(!!n.initialExpand),i=e.computed({get:()=>a.value??l.value,set:y=>{l.value=y,a.value=y}}),m=Z(o),c=e.computed(()=>i.value?n.collapsePreset:n.expandPreset),d=()=>(i.value?t["collapse-icon"]:t["expand-icon"])??c.value?.icon,v=()=>(i.value?t["collapse-icon"]:t["expand-icon"])==null?c.value?.iconProps:void 0,p=e.computed(()=>{const y=i.value?n.collapseLabel:n.expandLabel;if(y!=null)return y;const _=c.value?.label;return typeof _=="function"?_():_}),u=()=>{i.value=!i.value};return(y,_)=>(e.openBlock(),e.createElementBlock("div",be,[e.createElementVNode("div",{ref_key:"refContents",ref:o,class:e.normalizeClass(["dwui-accordion-section-contents",[e.unref(m)?i.value?"dwui-expanded":"dwui-shrunk":"",{"dwui-no-gradient":n.noGradient}]])},[e.renderSlot(y.$slots,"default")],2),e.unref(m)?(e.openBlock(),e.createElementBlock("div",we,[e.createElementVNode("button",{type:"button",class:"dwui-accordion-section-toggle",disabled:n.disabled,"aria-expanded":i.value,onClick:e.withModifiers(u,["stop"])},[d()!=null||p.value!=null?(e.openBlock(),e.createBlock(M,{key:0},e.createSlots({_:2},[d()!=null?{name:"icon",fn:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(d()),e.normalizeProps(e.guardReactiveProps(v())),null,16))]),key:"0"}:void 0,p.value!=null?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.value),1)]),key:"1"}:void 0]),1024)):(e.openBlock(),e.createBlock(e.unref(C.SvgTriangleButton),{key:1,direction:i.value?"up":"down"},null,8,["direction"]))],8,ye)])):e.createCommentVNode("",!0)]))}}),Be=["aria-label"],_e=e.defineComponent({__name:"copy-button",props:{value:{},label:{default:"Copy"}},emits:["emit:copy","emit:error"],setup(r,{emit:n}){const t=r,o=n,a=e.useSlots(),l=async()=>{const i=String(typeof t.value=="function"?t.value():t.value);try{await navigator.clipboard.writeText(i)}catch(m){o("emit:error",m);return}o("emit:copy",i)};return(i,m)=>(e.openBlock(),e.createElementBlock("button",{type:"button",class:"dwui-copy-button","aria-label":a.default?void 0:t.label,onClick:l},[e.renderSlot(i.$slots,"default",{},()=>[e.createVNode(e.unref(C.SvgMemo))])],8,Be))}}),Se=["aria-label","aria-checked"],Ce={class:"dwui-dark-mode-selector-track"},$e={class:"dwui-dark-mode-selector-icon-light"},Ee={class:"dwui-dark-mode-selector-icon-dark"},Ne=e.defineComponent({__name:"dark-mode-selector",props:{storageKey:{default:"dwui-color-scheme"},label:{default:"Dark mode"}},emits:["emit:change"],setup(r,{emit:n}){const t=r,o=n,a=e.ref(!1);let l=null,i=null;const m=w=>w==="light"||w==="dark",c=()=>i?.matches?"dark":"light",d=()=>{try{const w=localStorage.getItem(t.storageKey);return m(w)?w:null}catch{return null}},v=w=>{const h=document.documentElement.classList;h.remove(w==="dark"?"light":"dark"),h.add(w),a.value=w==="dark",l!==w&&(l=w,o("emit:change",w))},p=w=>{try{localStorage.setItem(t.storageKey,w)}catch{}v(w)},u=()=>{p(a.value?"light":"dark")},y=w=>{p(w.matches?"dark":"light")},_=w=>{w.key===t.storageKey&&v(m(w.newValue)?w.newValue:c())};return e.onMounted(()=>{i=window.matchMedia("(prefers-color-scheme: dark)"),v(d()??c()),i.addEventListener("change",y),window.addEventListener("storage",_)}),e.onBeforeUnmount(()=>{i?.removeEventListener("change",y),window.removeEventListener("storage",_)}),(w,h)=>(e.openBlock(),e.createElementBlock("button",{type:"button",role:"switch",class:"dwui-dark-mode-selector","aria-label":t.label,"aria-checked":a.value,onClick:u},[e.createElementVNode("span",Ce,[e.createElementVNode("span",$e,[e.renderSlot(w.$slots,"icon-light",{},()=>[e.createVNode(e.unref(C.SvgHighBrightness))])]),e.createElementVNode("span",Ee,[e.renderSlot(w.$slots,"icon-dark",{},()=>[e.createVNode(e.unref(C.SvgMoonPhases),{"moon-age":3.85})])])]),h[0]||(h[0]=e.createElementVNode("span",{class:"dwui-dark-mode-selector-handle"},null,-1))],8,Se))}}),xe={class:"dwui-pagination"},Pe={class:"dwui-pagination-list"},Ve=["disabled","aria-label","title"],Le=["disabled","aria-label","title"],Me=["disabled","aria-label","title"],Te=["aria-current","onClick"],De=["disabled","aria-label","title"],ze=["disabled","aria-label","title"],Ae=["disabled","aria-label","title"],Ie={key:0,class:"dwui-pagination-select"},Oe=["value","disabled"],He=["value"],Re=e.defineComponent({__name:"pagination",props:{current:{},totalCount:{},limit:{},maxPagination:{},showPageSelect:{type:Boolean},labels:{}},emits:["emit:changePage"],setup(r,{emit:n}){const t=r,o=n,a=e.computed(()=>Math.ceil(t.totalCount/t.limit)),l=e.computed(()=>Math.min(Math.max(t.current,1),a.value)),i=e.ref(!1),m=e.computed(()=>a.value<1?[]:i.value?Array.from({length:a.value},(h,k)=>k+1):[l.value]),c=e.computed(()=>{if(a.value<1)return[];const h=Math.min(Math.max(l.value-Math.floor((t.maxPagination-1)/2),1),Math.max(a.value-t.maxPagination+1,1)),k=Math.min(h+t.maxPagination-1,a.value);return Array.from({length:k-h+1},(g,S)=>h+S)}),d=h=>{h!==t.current&&o("emit:changePage",h)},v=h=>{let k;h<0?k=Math.max(c.value[0]-t.maxPagination,1):k=Math.min(c.value[c.value.length-1]+t.maxPagination,a.value)-t.maxPagination+1,d(k+Math.round((t.maxPagination-1)/2))},p=h=>{d(Number(h.target.value))},u=()=>{i.value=!0},y=h=>{document.activeElement!==h.currentTarget&&(i.value=!1)},_=()=>{i.value=!0},w=()=>{i.value=!1};return(h,k)=>(e.openBlock(),e.createElementBlock("div",xe,[e.createElementVNode("ul",Pe,[e.createElementVNode("li",null,[e.createElementVNode("button",{type:"button",disabled:l.value<=1,"aria-label":t.labels.firstPage,title:t.labels.firstPage,onClick:k[0]||(k[0]=g=>d(1))},[e.createVNode(e.unref(C.SvgChevronDouble),{direction:"left",size:"1em","stroke-width":8})],8,Ve)]),e.createElementVNode("li",null,[e.createElementVNode("button",{type:"button",disabled:l.value<=1,"aria-label":t.labels.previousPage,title:t.labels.previousPage,onClick:k[1]||(k[1]=g=>d(l.value-1))},[e.createVNode(e.unref(C.SvgChevron),{direction:"left",size:"1em","stroke-width":8})],8,Le)]),e.createElementVNode("li",null,[e.createElementVNode("button",{type:"button",disabled:c.value.length===0||c.value[0]===1,"aria-label":t.labels.previousPages,title:t.labels.previousPages,onClick:k[2]||(k[2]=g=>v(-1))},[e.createVNode(e.unref(C.SvgBlackArrow),{direction:"left",size:"1em"})],8,Me)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,g=>(e.openBlock(),e.createElementBlock("li",{key:g},[e.createElementVNode("button",{type:"button",class:e.normalizeClass(["dwui-pagination-page",{"dwui-current":g===l.value}]),"aria-current":g===l.value?"page":void 0,onClick:S=>d(g)},e.toDisplayString(g),11,Te)]))),128)),e.createElementVNode("li",null,[e.createElementVNode("button",{type:"button",disabled:c.value.length===0||c.value[c.value.length-1]===a.value,"aria-label":t.labels.nextPages,title:t.labels.nextPages,onClick:k[3]||(k[3]=g=>v(1))},[e.createVNode(e.unref(C.SvgBlackArrow),{direction:"right",size:"1em"})],8,De)]),e.createElementVNode("li",null,[e.createElementVNode("button",{type:"button",disabled:a.value<=l.value,"aria-label":t.labels.nextPage,title:t.labels.nextPage,onClick:k[4]||(k[4]=g=>d(l.value+1))},[e.createVNode(e.unref(C.SvgChevron),{direction:"right",size:"1em","stroke-width":8})],8,ze)]),e.createElementVNode("li",null,[e.createElementVNode("button",{type:"button",disabled:a.value<=l.value,"aria-label":t.labels.lastPage,title:t.labels.lastPage,onClick:k[5]||(k[5]=g=>d(a.value))},[e.createVNode(e.unref(C.SvgChevronDouble),{direction:"right",size:"1em","stroke-width":8})],8,Ae)])]),t.showPageSelect?(e.openBlock(),e.createElementBlock("label",Ie,[e.createElementVNode("span",null,e.toDisplayString(t.labels.pageNumber),1),e.createElementVNode("select",{value:l.value,disabled:a.value<=1,onPointerenter:u,onPointerleave:y,onFocus:_,onBlur:w,onChange:p},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,g=>(e.openBlock(),e.createElementBlock("option",{key:g,value:g},e.toDisplayString(g)+" ("+e.toDisplayString((g-1)*t.limit+1)+" - "+e.toDisplayString(Math.min(g*t.limit,t.totalCount))+") ",9,He))),128))],40,Oe)])):e.createCommentVNode("",!0)]))}}),Fe={class:"dwui-data-table-controls"},We={class:"dwui-data-table-tools"},je={key:0,class:"dwui-data-table-total"},Ke={class:"dwui-data-table-total-count"},Ue={key:1,class:"dwui-data-table-limit"},Ge=["value","max"],Xe=["title","aria-label"],qe=["title","aria-label"],G=e.defineComponent({__name:"data-table-controls",props:{pagination:{type:Boolean},showTotal:{type:Boolean},showLimit:{type:Boolean},showPageSelect:{type:Boolean},showDownloadPage:{type:Boolean},showDownloadAll:{type:Boolean},current:{},limit:{},maxLimit:{},maxPagination:{},totalCount:{},labels:{},formatTotalCount:{type:Function}},emits:["emit:changePage","emit:changeLimit","emit:downloadPage","emit:downloadAll"],setup(r,{emit:n}){const t=r,o=n,a=new Intl.NumberFormat("en-US"),l=e.computed(()=>t.formatTotalCount?t.formatTotalCount(t.totalCount):a.format(t.totalCount)),i=m=>{const c=m.target,d=Math.min(Math.max(Math.trunc(Number(c.value))||1,1),t.maxLimit);c.value=String(d),d!==t.limit&&o("emit:changeLimit",d)};return(m,c)=>(e.openBlock(),e.createElementBlock("div",Fe,[t.pagination?(e.openBlock(),e.createBlock(Re,{key:0,current:t.current,"total-count":t.totalCount,limit:t.limit,"max-pagination":t.maxPagination,"show-page-select":t.showPageSelect,labels:t.labels,"onEmit:changePage":c[0]||(c[0]=d=>o("emit:changePage",d))},null,8,["current","total-count","limit","max-pagination","show-page-select","labels"])):e.createCommentVNode("",!0),e.createElementVNode("div",We,[t.showTotal?(e.openBlock(),e.createElementBlock("span",je,[e.createElementVNode("span",null,e.toDisplayString(t.labels.totalCount),1),e.createElementVNode("span",Ke,e.toDisplayString(l.value),1),e.createElementVNode("span",null,e.toDisplayString(t.labels.totalUnit),1)])):e.createCommentVNode("",!0),t.showLimit?(e.openBlock(),e.createElementBlock("label",Ue,[e.createElementVNode("span",null,e.toDisplayString(t.labels.limit),1),e.createElementVNode("input",{type:"number",value:t.limit,min:"1",max:t.maxLimit,step:"1",onChange:i},null,40,Ge)])):e.createCommentVNode("",!0),t.showDownloadPage?(e.openBlock(),e.createElementBlock("button",{key:2,type:"button",title:t.labels.downloadPage,"aria-label":t.labels.downloadPage,onClick:c[1]||(c[1]=d=>o("emit:downloadPage"))},[e.createVNode(e.unref(C.SvgFolderDownload))],8,Xe)):e.createCommentVNode("",!0),t.showDownloadAll?(e.openBlock(),e.createElementBlock("button",{key:3,type:"button",title:t.labels.downloadAll,"aria-label":t.labels.downloadAll,onClick:c[2]||(c[2]=d=>o("emit:downloadAll"))},[e.createVNode(e.unref(C.SvgCloudDownload))],8,qe)):e.createCommentVNode("",!0)])]))}}),R=(r,n)=>{let t=r;for(const o of n.replace(/\[(\w+)\]/g,".$1").split(".")){if(t==null)return;t=t[o]}return t},F=r=>typeof r=="function"?r():r??"",X=r=>r===!0||r==="true"||r==="1"||r==="on"||r===1,q=r=>typeof r=="number"?r:Number(String(r).replace(/[^+\-\d.]/g,"")),Ye=(r,n,t)=>{if(r==null&&n==null)return 0;if(r==null)return-1;if(n==null)return 1;if(r===n)return 0;switch(t){case"boolean":return(X(r)?1:0)-(X(n)?1:0);case"number":{const o=q(r),a=q(n);return Number.isNaN(o)||Number.isNaN(a)?(Number.isNaN(o)?0:1)-(Number.isNaN(a)?0:1):o-a}case"object":return A(r).localeCompare(A(n));default:return String(r).localeCompare(String(n))}},A=r=>{try{return JSON.stringify(r,(n,t)=>typeof t=="bigint"?t.toString():t)??""}catch{return""}},Qe=["rowspan","colspan","title","aria-sort"],Je={class:"dwui-data-table-header"},Ze=["role","tabindex","onClick","onKeydown"],et=["innerHTML"],tt={key:2},ot=["onPointerdown"],nt={key:0,class:"dwui-data-table-no-data"},lt=["colspan"],at={key:0,class:"dwui-data-table-loading"},rt=e.defineComponent({__name:"data-table",props:{dataList:{},headers:{},loading:{type:Boolean,default:!1},totalCount:{default:void 0},current:{default:1},limit:{default:100},maxLimit:{default:9999},maxPagination:{default:7},selectable:{type:Boolean,default:!0},controls:{default:"both"},pagination:{default:"both"},showDownloadPage:{type:Boolean,default:!0},showDownloadAll:{type:Boolean,default:!0},showTotal:{type:Boolean,default:!0},showLimit:{type:Boolean,default:!0},showPageSelect:{type:Boolean,default:!1},showNoData:{type:Boolean,default:!0},resizable:{type:Boolean,default:!0},sortable:{type:Boolean,default:!0},sortMode:{default:"remote"},contentClass:{type:[Boolean,null,String,Object,Array],default:void 0},contentStyle:{type:[Boolean,null,String,Object,Array],default:void 0},tableClass:{type:[Boolean,null,String,Object,Array],default:void 0},tableStyle:{type:[Boolean,null,String,Object,Array],default:void 0},labels:{default:void 0},formatTotalCount:{type:Function,default:void 0}},emits:["emit:selectRow","emit:changeSort","emit:updateHeader","emit:dblclickRow","emit:changeLimit","emit:changePage","emit:downloadPage","emit:downloadAll"],setup(r,{expose:n,emit:t}){const o=r,a=t,l=e.ref(),i=e.ref(),m=e.ref(),c=e.ref({}),d=e.ref(""),v=e.ref(!1),p=e.ref();let u;const y=e.computed(()=>o.headers.map(s=>c.value[s.id]==null?s:{...s,width:c.value[s.id]})),_=e.computed(()=>{const s={totalCount:"Total",totalUnit:"",limit:"Rows per page",noData:"No data found",pageNumber:"Page",downloadPage:"Download this page",downloadAll:"Download all",firstPage:"First page",previousPage:"Previous page",previousPages:"Previous pages",nextPages:"Next pages",nextPage:"Next page",lastPage:"Last page",...o.labels},f={};for(const b of Object.keys(s)){const $=s[b];f[b]=typeof $=="function"?$():$}return f}),w=e.computed(()=>Math.min(o.limit,o.maxLimit)),h=e.computed(()=>({showTotal:o.showTotal,showLimit:o.showLimit,showPageSelect:o.showPageSelect,showDownloadPage:o.showDownloadPage,showDownloadAll:o.showDownloadAll,current:o.current,limit:w.value,maxLimit:o.maxLimit,maxPagination:o.maxPagination,totalCount:o.totalCount??o.dataList.length,formatTotalCount:o.formatTotalCount,labels:_.value})),k=e.shallowRef(void 0),g=e.computed(()=>{const s=o.sortMode==="page"?o.headers.find(b=>b.id===d.value):void 0;if(!s)return o.dataList;const f=s.compare??((b,$)=>{const x=s.sortKey??s.id;return Ye(R(b,x),R($,x),s.type??"string")});return[...o.dataList].sort((b,$)=>v.value?f($,b):f(b,$))}),S=e.computed(()=>{const s=k.value;if(s==null)return-1;const f=g.value.indexOf(s);if(f!==-1)return f;const b=A(s);return b===""?-1:g.value.findIndex($=>A($)===b)}),B=e.computed(()=>o.headers.reduce((s,f)=>s+(f.colspan==null?1:Number(f.colspan)),0)),N=s=>{if(s!=null)return typeof s=="number"?`${s}px`:s},E=s=>({width:N(s.width),minWidth:N(s.minWidth),maxWidth:N(s.maxWidth)}),V=s=>{if(d.value===s)return v.value?"descending":"ascending"},P=s=>{if(!(!o.sortable||d.value!==s))return v.value?"down":"up"},L=s=>(o.current-1)*w.value+s+1,W=()=>Array.from(m.value?.children??[]).filter(s=>s.tagName==="TR"&&!s.classList.contains("dwui-data-table-no-data")),ie=s=>Array.from(s.children).filter(f=>f.tagName==="TD"||f.tagName==="TH"),j=()=>{a("emit:updateHeader",y.value.map(s=>({...s})))},I=()=>{W().forEach((s,f)=>s.classList.toggle("dwui-selected",f===S.value))},se=()=>{const s=l.value,f=W()[S.value];if(!s||!f)return;const b=i.value?.offsetHeight??0,$=f.offsetTop,x=$+f.offsetHeight;$<s.scrollTop+b?s.scrollTop=$-b:s.scrollTop+s.clientHeight<x&&(s.scrollTop=x-s.clientHeight)},D=(s,f)=>{k.value=s,a("emit:selectRow",s,f)},K=(s,f)=>{o.selectable&&(f===S.value?D(void 0,-1):(D(s,f),l.value?.focus({preventScroll:!0})))},ce=(s,f)=>{f!==S.value&&K(s,f),a("emit:dblclickRow",s,f)},de=s=>{if(s.target!==s.currentTarget||S.value<0||s.key!=="ArrowUp"&&s.key!=="ArrowDown")return;const f=S.value+(s.key==="ArrowUp"?-1:1);f<0||g.value.length<=f||(s.preventDefault(),D(g.value[f],f))},O=s=>{!o.sortable||o.dataList.length===0||(v.value=d.value===s.id?!v.value:!1,d.value=s.id,a("emit:changeSort",{sortKey:d.value,descending:v.value}))},ue=(s,f)=>{if(!o.resizable)return;s.preventDefault();const b=i.value?.firstElementChild,$=b?ie(b):[];for(const[x,T]of $.entries())c.value[o.headers[x].id]=T.getBoundingClientRect().width;p.value={index:f,x:s.clientX},s.currentTarget.setPointerCapture(s.pointerId),j()},me=s=>{if(!p.value)return;const f=s.clientX-p.value.x;if(f===0)return;p.value.x=s.clientX;const b=p.value.index,$=o.headers.map(T=>T.id);c.value[$[b]]+=f;const x=f/($.length-b-1);for(const T of $.slice(b+1))c.value[T]-=x},U=()=>{p.value&&(p.value=void 0,j())};return e.onMounted(()=>{u=new MutationObserver(I),m.value&&u.observe(m.value,{childList:!0}),I()}),e.onBeforeUnmount(()=>{u?.disconnect()}),e.watch(()=>o.headers,(s,f)=>{const b=s.map(x=>x.id),$=f.map(x=>x.id);(b.length!==$.length||b.some(x=>!$.includes(x)))&&(c.value={})}),e.watch(()=>o.loading,(s,f)=>{f&&!s&&(o.sortMode==="page"&&(d.value="",v.value=!1),k.value!=null&&D(void 0,-1))}),e.watch(S,s=>{0<=s&&se()},{flush:"post"}),e.watch(S,I,{flush:"post"}),n({getSortContext:()=>({sortKey:d.value,descending:v.value})}),(s,f)=>(e.openBlock(),e.createElementBlock("section",{class:e.normalizeClass(["dwui-data-table",{"dwui-selectable":o.selectable}])},[o.controls==="both"||o.controls==="top"?(e.openBlock(),e.createBlock(G,e.mergeProps({key:0},h.value,{pagination:o.pagination==="both"||o.pagination==="top","onEmit:changePage":f[0]||(f[0]=b=>a("emit:changePage",b)),"onEmit:changeLimit":f[1]||(f[1]=b=>a("emit:changeLimit",b)),"onEmit:downloadPage":f[2]||(f[2]=b=>a("emit:downloadPage")),"onEmit:downloadAll":f[3]||(f[3]=b=>a("emit:downloadAll"))}),null,16,["pagination"])):e.createCommentVNode("",!0),e.createElementVNode("div",{ref_key:"refContent",ref:l,class:e.normalizeClass(["dwui-data-table-content",[{"dwui-loading":o.loading},o.contentClass]]),style:e.normalizeStyle(o.contentStyle),tabindex:"-1",onKeydown:de},[e.createElementVNode("table",{class:e.normalizeClass(o.tableClass),style:e.normalizeStyle(o.tableStyle)},[e.createElementVNode("thead",{ref_key:"refThead",ref:i},[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value,(b,$)=>(e.openBlock(),e.createElementBlock("th",{key:b.id,rowspan:b.rowspan,colspan:b.colspan,title:b.title,style:e.normalizeStyle(E(b)),"aria-sort":V(b.id),scope:"col"},[e.createElementVNode("div",Je,[e.createElementVNode("span",{class:"dwui-data-table-sort",role:o.sortable?"button":void 0,tabindex:o.sortable?0:void 0,onClick:x=>O(b),onKeydown:[e.withKeys(e.withModifiers(x=>O(b),["prevent"]),["enter"]),e.withKeys(e.withModifiers(x=>O(b),["prevent"]),["space"])]},[P(b.id)?(e.openBlock(),e.createBlock(e.unref(C.SvgPointingTriangle),{key:0,direction:P(b.id),size:"0.7em"},null,8,["direction"])):e.createCommentVNode("",!0),b.html?(e.openBlock(),e.createElementBlock("span",{key:1,innerHTML:e.unref(F)(b.label)},null,8,et)):(e.openBlock(),e.createElementBlock("span",tt,e.toDisplayString(e.unref(F)(b.label)),1))],40,Ze)]),o.resizable&&$<y.value.length-1?(e.openBlock(),e.createElementBlock("div",{key:0,class:"dwui-data-table-resizer",onPointerdown:x=>ue(x,$),onPointermove:me,onPointerup:U,onPointercancel:U},null,40,ot)):e.createCommentVNode("",!0)],12,Qe))),128))])],512),e.createElementVNode("tbody",{ref_key:"refTbody",ref:m},[o.loading?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.renderSlot(s.$slots,"default",{rows:g.value,clickRow:K,dblclickRow:ce,rowNumber:L,selectedIndex:S.value}),o.dataList.length===0&&o.showNoData?(e.openBlock(),e.createElementBlock("tr",nt,[e.createElementVNode("td",{colspan:B.value},e.toDisplayString(_.value.noData),9,lt)])):e.createCommentVNode("",!0)],64))],512)],6),o.loading?(e.openBlock(),e.createElementBlock("div",at,[e.renderSlot(s.$slots,"loading",{},()=>[f[8]||(f[8]=e.createElementVNode("div",{class:"dwui-data-table-loading-spinner"},null,-1))])])):e.createCommentVNode("",!0)],38),o.controls==="both"||o.controls==="bottom"?(e.openBlock(),e.createBlock(G,e.mergeProps({key:1},h.value,{pagination:o.pagination==="both"||o.pagination==="bottom","onEmit:changePage":f[4]||(f[4]=b=>a("emit:changePage",b)),"onEmit:changeLimit":f[5]||(f[5]=b=>a("emit:changeLimit",b)),"onEmit:downloadPage":f[6]||(f[6]=b=>a("emit:downloadPage")),"onEmit:downloadAll":f[7]||(f[7]=b=>a("emit:downloadAll"))}),null,16,["pagination"])):e.createCommentVNode("",!0)],2))}}),Y={top:"bottom",bottom:"top",left:"right",right:"left"},H=(r,n,t)=>Math.min(Math.max(r,n),t),ee=(r,n,t,o)=>{const{offset:a,margin:l,arrowMargin:i}=o,[m,c="center"]=o.placement.split("-"),d=m==="top"||m==="bottom",v=r.top+r.height,p=r.left+r.width,u={top:r.top-l,bottom:t.height-v-l,left:r.left-l,right:t.width-p-l},w=(d?n.height:n.width)+a<=u[m]||u[Y[m]]<=u[m]?m:Y[m];let h;switch(w){case"top":h=r.top-a-n.height;break;case"bottom":h=v+a;break;case"left":h=r.left-a-n.width;break;default:h=p+a;break}const k=d?r.left:r.top,g=d?r.width:r.height,S=d?n.width:n.height;let B;switch(c){case"start":B=k;break;case"end":B=k+g-S;break;default:B=k+(g-S)/2;break}const N=H(d?h:B,l,Math.max(l,t.height-l-n.height)),E=H(d?B:h,l,Math.max(l,t.width-l-n.width)),V=k+g/2,L=H(V-(d?E:N),i,Math.max(i,S-i));return{top:N,left:E,side:w,arrow:L}},it=["popover","data-side"],st={class:"dwui-anchored-popover-content"},Q=4,ct=7,dt=12,ut=8,te=e.defineComponent({__name:"anchored-popover",props:{anchor:{},placement:{},arrow:{type:Boolean},mode:{}},emits:["emit:open","emit:close"],setup(r,{expose:n,emit:t}){const o=r,a=t,l=e.ref(),i=e.ref(),m=()=>{l.value?.hidePopover()},c=()=>{l.value?.showPopover()},d=()=>{const u=l.value;if(!o.anchor||!u)return;const y={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight},_=ee(o.anchor.getBoundingClientRect(),u.getBoundingClientRect(),y,{placement:o.placement,offset:o.arrow?Q+ct:Q,margin:ut,arrowMargin:dt});i.value=_.side,u.style.top=`${_.top}px`,u.style.left=`${_.left}px`,u.style.setProperty("--dwui-offset-arrow",`${_.arrow}px`),u.style.visibility="visible"},v=u=>{l.value?.contains(u.target)||d()},p=u=>{u.newState==="open"?(d(),window.addEventListener("scroll",v,!0),window.addEventListener("resize",d),a("emit:open")):(l.value&&(l.value.style.visibility=""),window.removeEventListener("scroll",v,!0),window.removeEventListener("resize",d),a("emit:close"))};return e.onBeforeUnmount(()=>{window.removeEventListener("scroll",v,!0),window.removeEventListener("resize",d)}),n({element:l,show:c,hide:m}),(u,y)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"refPanel",ref:l,class:e.normalizeClass(["dwui-anchored-popover",{"dwui-arrow":o.arrow}]),popover:o.mode,"data-side":i.value,onToggle:p},[e.createElementVNode("div",st,[e.renderSlot(u.$slots,"default")])],42,it))}}),mt=["aria-label"],pt=e.defineComponent({inheritAttrs:!1,__name:"help-button",props:{placement:{default:"bottom-start"},arrow:{type:Boolean,default:!1},label:{default:"Help"}},emits:["emit:open","emit:close"],setup(r,{emit:n}){const t=r,o=n,a=e.useAttrs(),l=e.ref(),i=e.ref();return e.onMounted(()=>{const m=i.value?.element;l.value&&m&&(l.value.popoverTargetElement=m)}),(m,c)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("button",e.mergeProps({ref_key:"refButton",ref:l,type:"button",class:"dwui-help-button","aria-label":t.label},e.unref(a)),[e.renderSlot(m.$slots,"icon",{},()=>[e.createVNode(e.unref(C.SvgQuestion))])],16,mt),e.createVNode(te,{ref_key:"refPopover",ref:i,class:"dwui-help-button-popover",mode:"auto",anchor:l.value,placement:t.placement,arrow:t.arrow,"onEmit:open":c[0]||(c[0]=d=>o("emit:open")),"onEmit:close":c[1]||(c[1]=d=>o("emit:close"))},{default:e.withCtx(()=>[e.renderSlot(m.$slots,"default")]),_:3},8,["anchor","placement","arrow"])],64))}}),ft=["aria-label","aria-describedby"],gt=150,oe=e.defineComponent({inheritAttrs:!1,__name:"icon-popper",props:{placement:{},arrow:{type:Boolean},popoverClass:{},label:{}},emits:["emit:open","emit:close"],setup(r,{emit:n}){const t=r,o=n,a=e.useAttrs(),l=e.ref(),i=e.ref(),m=e.ref(!1),c=e.useId();let d;const v=()=>{d!==void 0&&(clearTimeout(d),d=void 0)},p=()=>{v(),i.value?.show()},u=()=>{v(),i.value?.hide()},y=()=>{v(),d=setTimeout(()=>{d=void 0,i.value?.hide()},gt)},_=P=>{const L=P.target;!l.value?.contains(L)&&!i.value?.element?.contains(L)&&u()},w=P=>{P.pointerType!=="touch"&&p()},h=P=>{P.pointerType!=="touch"&&y()},k=P=>{P.pointerType!=="touch"&&v()},g=P=>{P.pointerType==="touch"&&(m.value?u():p())},S=()=>{p()},B=()=>{u()},N=()=>{u()},E=()=>{m.value=!0,document.addEventListener("pointerdown",_,!0),o("emit:open")},V=()=>{m.value=!1,document.removeEventListener("pointerdown",_,!0),o("emit:close")};return e.onBeforeUnmount(()=>{v(),document.removeEventListener("pointerdown",_,!0)}),(P,L)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("span",e.mergeProps({ref_key:"refTrigger",ref:l,class:"dwui-icon-popper",tabindex:"0","aria-label":t.label,"aria-describedby":e.unref(c)},e.unref(a),{onPointerenter:w,onPointerleave:h,onPointerdown:g,onFocus:S,onBlur:B,onKeydown:e.withKeys(N,["esc"])}),[e.renderSlot(P.$slots,"icon")],16,ft),e.createVNode(te,{ref_key:"refPopover",ref:i,id:e.unref(c),class:e.normalizeClass(["dwui-icon-popper-popover",t.popoverClass]),role:"tooltip",mode:"manual",anchor:l.value,placement:t.placement,arrow:t.arrow,onPointerenter:k,onPointerleave:h,"onEmit:open":E,"onEmit:close":V},{default:e.withCtx(()=>[e.renderSlot(P.$slots,"default")]),_:3},8,["id","class","anchor","placement","arrow"])],64))}}),vt=e.defineComponent({__name:"help-popper",props:{placement:{default:"right"},arrow:{type:Boolean,default:!0},label:{default:"Help"}},emits:["emit:open","emit:close"],setup(r,{emit:n}){const t=r,o=n;return(a,l)=>(e.openBlock(),e.createBlock(oe,{class:"dwui-help-popper","popover-class":"dwui-help-popper-popover",placement:t.placement,arrow:t.arrow,label:t.label,"onEmit:open":l[0]||(l[0]=i=>o("emit:open")),"onEmit:close":l[1]||(l[1]=i=>o("emit:close"))},{icon:e.withCtx(()=>[e.renderSlot(a.$slots,"icon",{},()=>[e.createVNode(e.unref(C.SvgQuestion))])]),default:e.withCtx(()=>[e.renderSlot(a.$slots,"default")]),_:3},8,["placement","arrow","label"]))}}),ht=e.defineComponent({__name:"hourglass-loading",props:{loading:{type:Boolean},duration:{},size:{default:"1.2em"}},setup(r){const n=r;return(t,o)=>n.loading?(e.openBlock(),e.createBlock(e.unref(C.SvgHourglass),{key:0,duration:n.duration,size:n.size,class:"dwui-hourglass-loading"},null,8,["duration","size"])):e.renderSlot(t.$slots,"default",{},void 0,void 0,1)}}),bt=e.defineComponent({__name:"intersection-lazy-component",props:{root:{},rootMargin:{},threshold:{}},emits:["emit:visible"],setup(r,{emit:n}){const t=r,o=n,a=e.ref(),l=e.ref(!1);let i;const m=()=>{i?.disconnect(),i=void 0,!(!a.value||l.value)&&(i=new IntersectionObserver(c=>{c.some(d=>d.isIntersecting)&&(l.value=!0,i?.disconnect(),i=void 0,o("emit:visible"))},{root:t.root,rootMargin:t.rootMargin,threshold:t.threshold}),i.observe(a.value))};return e.onMounted(()=>{m()}),e.onBeforeUnmount(()=>{i?.disconnect()}),e.watch(()=>[t.root,t.rootMargin,t.threshold],()=>{m()},{flush:"post"}),(c,d)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"refTarget",ref:a,class:"dwui-intersection-lazy-component"},[l.value?e.renderSlot(c.$slots,"default",{},void 0,void 0,0):e.renderSlot(c.$slots,"placeholder",{},void 0,void 0,1)],512))}}),wt={type:"button",class:"dwui-label-button"},yt=e.defineComponent({__name:"label-button",props:{preset:{},gap:{},iconClass:{type:[Boolean,null,String,Object,Array]},iconStyle:{type:[Boolean,null,String,Object,Array]},labelClass:{type:[Boolean,null,String,Object,Array]},labelStyle:{type:[Boolean,null,String,Object,Array]}},setup(r){const n=r,t=e.useSlots();return(o,a)=>(e.openBlock(),e.createElementBlock("button",wt,[e.createVNode(M,{preset:n.preset,gap:n.gap,"icon-class":n.iconClass,"icon-style":n.iconStyle,"label-class":n.labelClass,"label-style":n.labelStyle},e.createSlots({_:2},[t.icon!=null?{name:"icon",fn:e.withCtx(()=>[e.renderSlot(o.$slots,"icon")]),key:"0"}:void 0,t.default!=null?{name:"default",fn:e.withCtx(()=>[e.renderSlot(o.$slots,"default")]),key:"1"}:void 0]),1032,["preset","gap","icon-class","icon-style","label-class","label-style"])]))}}),kt=["aria-labelledby","aria-describedby"],Bt={class:"dwui-modal-dialog-header"},_t={class:"dwui-modal-dialog-icon"},St=["id","innerHTML"],Ct=["id"],$t=["id"],Et=["innerHTML"],Nt={key:1},xt={key:0,class:"dwui-modal-dialog-images"},Pt=["src","alt"],Vt=["onClick"],Lt=e.defineComponent({__name:"modal-dialog",props:e.mergeModels({type:{default:"info"},title:{default:void 0},message:{default:void 0},html:{type:Boolean,default:!1},image:{default:void 0},buttons:{default:void 0},okLabel:{default:"OK"},yesLabel:{default:"Yes"},noLabel:{default:"No"},cancelLabel:{default:"Cancel"}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:e.mergeModels(["emit:close"],["update:open"]),setup(r,{emit:n}){const t=r,o=n,a=e.useModel(r,"open"),l=e.ref(),i=e.ref(),m=e.useId(),c=e.useId(),d={info:C.SvgInfo,confirm:C.SvgQuestion,warn:C.SvgWarningSign,error:C.SvgCritical},v=["cancel","no","yes","ok"],p=e.computed(()=>t.buttons??(t.type==="confirm"?["yes","no"]:["ok"])),u=e.computed(()=>({ok:t.okLabel,yes:t.yesLabel,no:t.noLabel,cancel:t.cancelLabel})),y=e.computed(()=>t.message==null?[]:[t.message].flat()),_=e.computed(()=>[t.image??[]].flat().map(B=>typeof B=="string"?{src:B,alt:""}:B)),w=B=>{S(B)},h=B=>{B.preventDefault(),S("cancel")},k=B=>{if(B.key!=="ArrowLeft"&&B.key!=="ArrowRight")return;const N=[...i.value?.children??[]],E=N.indexOf(document.activeElement);E<0||N[B.key==="ArrowRight"?E+1:E-1]?.focus()},g=()=>{l.value?.showModal();const B=v.find(E=>p.value.includes(E)),N=B?p.value.indexOf(B):-1;i.value?.children[N]?.focus()},S=B=>{l.value?.close(),a.value=!1,o("emit:close",B)};return e.onMounted(()=>{a.value&&g()}),e.watch(a,B=>{B?g():l.value?.close()},{flush:"post"}),(B,N)=>(e.openBlock(),e.createElementBlock("dialog",{ref_key:"refDialog",ref:l,class:e.normalizeClass(["dwui-modal-dialog",`dwui-modal-dialog-${t.type}`]),"aria-labelledby":t.title?e.unref(m):void 0,"aria-describedby":e.unref(c),onCancel:h,onKeydown:k},[e.createElementVNode("div",Bt,[e.createElementVNode("span",_t,[e.renderSlot(B.$slots,"icon",{},()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(d[t.type])))])]),t.title?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[t.html?(e.openBlock(),e.createElementBlock("span",{key:0,id:e.unref(m),class:"dwui-modal-dialog-title",innerHTML:t.title},null,8,St)):(e.openBlock(),e.createElementBlock("span",{key:1,id:e.unref(m),class:"dwui-modal-dialog-title"},e.toDisplayString(t.title),9,Ct))],64)):e.createCommentVNode("",!0)]),e.createElementVNode("div",{id:e.unref(c),class:"dwui-modal-dialog-body"},[e.renderSlot(B.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value,(E,V)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:V},[t.html?(e.openBlock(),e.createElementBlock("p",{key:0,innerHTML:E},null,8,Et)):(e.openBlock(),e.createElementBlock("p",Nt,e.toDisplayString(E),1))],64))),128)),_.value.length?(e.openBlock(),e.createElementBlock("div",xt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.value,(E,V)=>(e.openBlock(),e.createElementBlock("img",{key:V,src:E.src,alt:E.alt},null,8,Pt))),128))])):e.createCommentVNode("",!0)])],8,$t),e.createElementVNode("div",{ref_key:"refButtons",ref:i,class:"dwui-modal-dialog-buttons"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value,E=>(e.openBlock(),e.createElementBlock("button",{key:E,type:"button",class:e.normalizeClass(["dwui-modal-dialog-button",`dwui-modal-dialog-button-${E}`]),onClick:V=>w(E)},e.toDisplayString(u.value[E]),11,Vt))),128))],512)],42,kt))}});function Mt(r){const n=r.minWidth??20,t=r.minHeight??20,o=e.ref(!1),a=e.ref(!1),l=e.reactive({x:0,y:0}),i=e.reactive({width:-1,height:-1});let m=null,c="bottom-right",d={x:0,y:0};const v=g=>{if(g.pointerId!==m)return;g.preventDefault();const S=g.clientX-d.x,B=g.clientY-d.y;if(d={x:g.clientX,y:g.clientY},o.value)l.x+=S,l.y+=B;else if(a.value){if(c.endsWith("left")){const N=Math.max(n,i.width-S);l.x+=i.width-N,i.width=N}else i.width=Math.max(n,i.width+S);if(c.startsWith("top")){const N=Math.max(t,i.height-B);l.y+=i.height-N,i.height=N}else i.height=Math.max(t,i.height+B)}},p=()=>{const g=r.target.value?.getBoundingClientRect().width||0;l.x<40-g&&(l.x=40-g),window.innerWidth-40<l.x&&(l.x=window.innerWidth-40),l.y<0&&(l.y=0),r.clampBottom&&window.innerHeight-20<l.y&&(l.y=window.innerHeight-20)},u=g=>{if(g.pointerId!==m)return;const S=o.value;y(),S&&p()},y=()=>{document.removeEventListener("pointermove",v,!0),document.removeEventListener("pointerup",u,!0),document.removeEventListener("pointercancel",u,!0),m=null,o.value=!1,a.value=!1},_=g=>{y(),m=g.pointerId,d={x:g.clientX,y:g.clientY},document.addEventListener("pointermove",v,!0),document.addEventListener("pointerup",u,!0),document.addEventListener("pointercancel",u,!0)},w=g=>{g.isPrimary&&r.dragMode()==="body"&&(_(g),o.value=!0)},h=g=>{g.isPrimary&&r.dragMode()==="header"&&(_(g),o.value=!0)},k=(g,S="bottom-right")=>{if(!g.isPrimary)return;c=S;const B=r.target.value?.getBoundingClientRect();B&&(i.width<0&&(i.width=B.width),i.height<0&&(i.height=B.height)),_(g),a.value=!0};return e.onBeforeUnmount(y),{moving:o,resizing:a,currentPosition:l,currentRect:i,onDragStart:w,onDragHeaderStart:h,onResizeStart:k,teardown:y}}const Tt=["aria-labelledby"],Dt=["id"],zt=["aria-label"],At=["onPointerdown"],ne=e.defineComponent({__name:"movable-window",props:{name:{},dragMode:{},loading:{type:Boolean},closeLabel:{},clampBottom:{type:Boolean},headerClass:{type:[Boolean,null,String,Object,Array]},headerStyle:{type:[Boolean,null,String,Object,Array]}},emits:["emit:close"],setup(r,{expose:n,emit:t}){const o=r,a=t,l=e.ref(),i=e.useId(),m=["top-left","top-right","bottom-left"],c=Mt({target:l,dragMode:()=>o.dragMode,clampBottom:o.clampBottom}),d=e.computed(()=>{const{currentPosition:v,currentRect:p}=c;return{top:`${v.y}px`,left:`${v.x}px`,width:0<=p.width?`${p.width}px`:void 0,height:0<=p.height?`${p.height}px`:void 0}});return n({element:l,position:c.currentPosition,size:c.currentRect,teardown:c.teardown}),(v,p)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"refWindow",ref:l,class:"dwui-movable-window",role:"dialog","aria-labelledby":e.unref(i),style:e.normalizeStyle(d.value)},[e.createElementVNode("div",{class:"dwui-movable-window-frame",onPointerdown:p[2]||(p[2]=(...u)=>e.unref(c).onDragStart&&e.unref(c).onDragStart(...u))},[e.createElementVNode("div",{class:e.normalizeClass(["dwui-movable-window-header",[`${o.name}-header`,o.headerClass,{"dwui-movable":o.dragMode}]]),style:e.normalizeStyle(o.headerStyle),onPointerdown:p[1]||(p[1]=(...u)=>e.unref(c).onDragHeaderStart&&e.unref(c).onDragHeaderStart(...u))},[e.createElementVNode("div",{id:e.unref(i),class:e.normalizeClass(["dwui-movable-window-title",`${o.name}-title`])},[e.renderSlot(v.$slots,"title")],10,Dt),e.renderSlot(v.$slots,"actions"),e.createElementVNode("button",{type:"button",class:e.normalizeClass(["dwui-movable-window-close-button",`${o.name}-close-button`]),"aria-label":o.closeLabel,onClick:p[0]||(p[0]=u=>a("emit:close"))},[e.createVNode(e.unref(C.SvgNegativeSquaredCrossMark))],10,zt)],38),e.createElementVNode("div",{class:e.normalizeClass(["dwui-movable-window-body",[`${o.name}-body`,{"dwui-movable":o.dragMode==="body"}]])},[e.renderSlot(v.$slots,"default")],2)],32),o.loading?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["dwui-movable-window-loading",`${o.name}-loading`])},[e.createElementVNode("div",{class:e.normalizeClass(["dwui-movable-window-spinner",`${o.name}-spinner`])},null,2)],2)):e.createCommentVNode("",!0),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(m,u=>e.createElementVNode("div",{key:u,class:e.normalizeClass(["dwui-movable-window-corner",[`${o.name}-corner`,`dwui-${u}`]]),onPointerdown:e.withModifiers(y=>e.unref(c).onResizeStart(y,u),["prevent"])},null,42,At)),64)),e.createElementVNode("div",{class:e.normalizeClass(["dwui-movable-window-resizer",`${o.name}-resizer`]),onPointerdown:p[3]||(p[3]=e.withModifiers(u=>e.unref(c).onResizeStart(u,"bottom-right"),["prevent"]))},[e.createVNode(e.unref(C.SvgCornerDiagonal),{direction:"bottom-right"})],34)],12,Tt))}}),z=[];let J=0;const le=()=>(J+=1,J),It=e.defineComponent({__name:"overlay-box",props:e.mergeModels({title:{default:void 0},dragMode:{default:void 0},closeOnBackdrop:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},closeLabel:{default:"Close"}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:e.mergeModels(["emit:close"],["update:open"]),setup(r,{emit:n}){const t=r,o=n,a=e.useModel(r,"open"),l=e.ref(),i=e.ref(0),m=Symbol("dwui-overlay-box");let c=null;const d=()=>{t.closeOnBackdrop&&(a.value=!1)},v=()=>{a.value=!1},p=h=>{h.key!=="Escape"||!h.isTrusted||h.isComposing||h.target instanceof Element&&h.target.closest("dialog")||z.at(-1)===m&&(a.value=!1)},u=()=>{o("emit:close")},y=()=>{const h=z.indexOf(m);0<=h&&z.splice(h,1)},_=()=>{i.value=le();const h=l.value,k=h?.element?.getBoundingClientRect();h&&(h.position.x=(window.innerWidth-(k?.width||0))/2,h.position.y=Math.max(0,(window.innerHeight-(k?.height||0))/2)),c=document.activeElement instanceof HTMLElement?document.activeElement:null,h?.element?.focus(),z.push(m)},w=()=>{l.value?.teardown(),y(),c?.isConnected&&c.focus(),c=null};return e.onMounted(()=>{a.value&&_()}),e.onBeforeUnmount(()=>{y()}),e.watch(a,h=>{h?_():w()},{flush:"post"}),(h,k)=>(e.openBlock(),e.createBlock(e.Transition,{name:"dwui-overlay-box-fade",onAfterLeave:u},{default:e.withCtx(()=>[a.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"dwui-overlay-box",style:e.normalizeStyle({"--dwui-order-window":i.value})},[e.createElementVNode("div",{class:"dwui-overlay-box-backdrop",onClick:d}),e.createVNode(ne,{ref_key:"refWindow",ref:l,class:"dwui-overlay-box-container",name:"dwui-overlay-box",tabindex:"-1","drag-mode":t.dragMode,loading:t.loading,"close-label":t.closeLabel,"clamp-bottom":"",onKeydown:p,"onEmit:close":v},{title:e.withCtx(()=>[e.renderSlot(h.$slots,"title",{},()=>[e.createTextVNode(e.toDisplayString(t.title),1)])]),default:e.withCtx(()=>[e.renderSlot(h.$slots,"default")]),_:3},8,["drag-mode","loading","close-label"])],4)):e.createCommentVNode("",!0)]),_:3}))}}),Ot={class:"dwui-page-section"},Ht={class:"dwui-page-section-content"},Rt=e.defineComponent({__name:"page-section",props:{title:{},icon:{default:"diamond"},iconVariant:{},iconColor:{},titleClass:{type:[Boolean,null,String,Object,Array]},titleStyle:{type:[Boolean,null,String,Object,Array]}},setup(r){const n=r,t={diamond:{component:C.SvgDiamond,shape:!0,color:"#1a44b6"},circle:{component:C.SvgCircle,shape:!0,color:"#e78b2f"},square:{component:C.SvgSquare,shape:!0,color:"#d13a2b"},pushpin:{component:C.SvgPushpin,shape:!1},"round-pushpin":{component:C.SvgRoundPushpin,shape:!1}},o=e.computed(()=>{const a=t[n.icon];return{component:a.component,props:a.shape?{variant:n.iconVariant,color:n.iconColor??a.color}:{}}});return(a,l)=>(e.openBlock(),e.createElementBlock("section",Ot,[n.title!=null?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["dwui-page-section-title",n.titleClass]),style:e.normalizeStyle(n.titleStyle)},[e.createVNode(M,null,{icon:e.withCtx(()=>[e.renderSlot(a.$slots,"icon",{},()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(o.value.component),e.normalizeProps(e.guardReactiveProps(o.value.props)),null,16))])]),default:e.withCtx(()=>[e.createTextVNode(" "+e.toDisplayString(n.title),1)]),_:3})],6)):e.createCommentVNode("",!0),e.createElementVNode("div",Ht,[e.renderSlot(a.$slots,"default")])]))}}),Ft={class:"dwui-page-title"},Wt={key:0,class:"dwui-page-title-actions"},jt=e.defineComponent({__name:"page-title",props:{title:{}},setup(r){const n=r,t=e.useSlots();return(o,a)=>(e.openBlock(),e.createElementBlock("section",Ft,[e.createVNode(M,{class:"dwui-page-title-label"},e.createSlots({default:e.withCtx(()=>[e.createTextVNode(" "+e.toDisplayString(n.title),1)]),_:2},[t.icon!=null?{name:"icon",fn:e.withCtx(()=>[e.renderSlot(o.$slots,"icon")]),key:"0"}:void 0]),1024),t.default!=null?(e.openBlock(),e.createElementBlock("span",Wt,[e.renderSlot(o.$slots,"default")])):e.createCommentVNode("",!0)]))}}),Kt=e.defineComponent({__name:"screen-loading",props:{loading:{type:Boolean}},setup(r){const n=r,t=e.ref(null),o=()=>{const l=t.value;l&&!l.open&&l.showModal()},a=()=>{const l=t.value;l?.open&&l.close()};return e.onMounted(()=>{n.loading&&o()}),e.onBeforeUnmount(()=>{a()}),e.watch(()=>n.loading,l=>{l?o():a()},{flush:"post"}),(l,i)=>(e.openBlock(),e.createElementBlock("dialog",{ref_key:"refDialog",ref:t,class:"dwui-screen-loading",closedby:"none",onCancel:i[0]||(i[0]=e.withModifiers(()=>{},["prevent"]))},[...i[1]||(i[1]=[e.createElementVNode("div",{class:"dwui-screen-loading-spinner"},null,-1)])],544))}}),ae=Symbol("dwui-tab-group"),Ut=["id","aria-labelledby","aria-busy","hidden"],Gt={key:0,class:"dwui-tab-loading"},Xt={key:1,class:"dwui-tab-loading-spinner"},re=e.defineComponent({__name:"tab-content",props:{tabId:{},label:{},disabled:{type:Boolean},status:{},headerClass:{type:[Boolean,null,String,Object,Array]},headerStyle:{type:[Boolean,null,String,Object,Array]}},setup(r){const n=r,t=e.inject(ae,void 0),o=e.ref(!1),a=()=>t?.loadingSlot(),l=e.computed(()=>t?.activeTabId.value===n.tabId),i=e.computed(()=>!!t?.mounted.value&&l.value),m=c=>{o.value=c};return(c,d)=>n.disabled?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",{key:0,id:e.unref(t)?`${e.unref(t).groupName}-${n.tabId}-panel`:void 0,class:"dwui-tab-content",role:"tabpanel","aria-labelledby":e.unref(t)?`${e.unref(t).groupName}-${n.tabId}`:void 0,"aria-busy":o.value?"true":void 0,hidden:!l.value},[e.renderSlot(c.$slots,"default",{activated:i.value,setLoading:m}),o.value?(e.openBlock(),e.createElementBlock("div",Gt,[a()!=null?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(a()),{key:0})):(e.openBlock(),e.createElementBlock("span",Xt))])):e.createCommentVNode("",!0)],8,Ut))}}),qt={class:"dwui-tab-group"},Yt=["id","name","disabled","checked","aria-selected","aria-controls","onChange"],Qt=["for"],Jt={class:"dwui-tab-items"},Zt=e.defineComponent({__name:"tab-group",props:e.mergeModels({tabGroupName:{},selectFirstEnabled:{type:Boolean},headerClass:{type:[Boolean,null,String,Object,Array]},headerStyle:{type:[Boolean,null,String,Object,Array]},teleport:{}},{selectedTabId:{},selectedTabIdModifiers:{}}),emits:["update:selectedTabId"],setup(r){const n=r,t=e.useModel(r,"selectedTabId"),o=e.useSlots(),a=n.tabGroupName??e.useId(),l=v=>{if(v.type!==re)return;const p=v.props??{},u=p.disabled;return{tabId:String(p["tab-id"]??p.tabId),label:p.label,disabled:u===""||!!u,status:p.status,headerClass:p["header-class"]??p.headerClass,headerStyle:p["header-style"]??p.headerStyle,icon:v.children?.icon}},i=e.computed(()=>{const v=[];for(const p of o.default?.()??[]){const u=Array.isArray(p.children)?p.children:[p];for(const y of u){const _=l(y);_&&v.push(_)}}return v}),m=e.computed(()=>t.value!=null?t.value:(n.selectFirstEnabled?i.value.find(p=>!p.disabled):i.value[0])?.tabId),c=e.ref(!1);e.provide(ae,{groupName:a,activeTabId:m,mounted:c,loadingSlot:()=>o.loading}),e.onMounted(()=>{c.value=!0});const d=v=>{t.value=v};return(v,p)=>(e.openBlock(),e.createElementBlock("div",qt,[(e.openBlock(),e.createBlock(e.Teleport,{to:n.teleport??"body",disabled:n.teleport==null},[e.createElementVNode("div",{class:e.normalizeClass(["dwui-tab-headers",n.headerClass]),role:"tablist",style:e.normalizeStyle(n.headerStyle)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value,u=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:u.tabId},[e.createElementVNode("input",{id:`${e.unref(a)}-${u.tabId}`,type:"radio",class:"dwui-tab-radio",role:"tab",name:e.unref(a),disabled:u.disabled,checked:u.tabId===m.value,"aria-selected":u.tabId===m.value?"true":"false","aria-controls":`${e.unref(a)}-${u.tabId}-panel`,onChange:y=>d(u.tabId)},null,40,Yt),e.createElementVNode("label",{for:`${e.unref(a)}-${u.tabId}`,class:e.normalizeClass(["dwui-tab-item",[u.status!=null?`dwui-tab-${u.status}`:void 0,u.headerClass]]),style:e.normalizeStyle(u.headerStyle)},[e.createVNode(M,null,e.createSlots({default:e.withCtx(()=>[e.createTextVNode(" "+e.toDisplayString(u.label),1)]),_:2},[u.icon!=null?{name:"icon",fn:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(u.icon)))]),key:"0"}:void 0]),1024)],14,Qt)],64))),128))],6)],8,["to","disabled"])),e.createElementVNode("div",Jt,[e.renderSlot(v.$slots,"default")])]))}}),eo=e.defineComponent({__name:"warning-popper",props:{placement:{default:"right"},arrow:{type:Boolean,default:!0},label:{default:"Warning"}},emits:["emit:open","emit:close"],setup(r,{emit:n}){const t=r,o=n;return(a,l)=>(e.openBlock(),e.createBlock(oe,{class:"dwui-warning-popper","popover-class":"dwui-warning-popper-popover",placement:t.placement,arrow:t.arrow,label:t.label,"onEmit:open":l[0]||(l[0]=i=>o("emit:open")),"onEmit:close":l[1]||(l[1]=i=>o("emit:close"))},{icon:e.withCtx(()=>[e.renderSlot(a.$slots,"icon",{},()=>[e.createVNode(e.unref(C.SvgWarningSign))])]),default:e.withCtx(()=>[e.renderSlot(a.$slots,"default")]),_:3},8,["placement","arrow","label"]))}});exports._sfc_main=ne;exports._sfc_main$1=_e;exports._sfc_main$10=vt;exports._sfc_main$11=ht;exports._sfc_main$12=bt;exports._sfc_main$13=yt;exports._sfc_main$14=M;exports._sfc_main$15=Rt;exports._sfc_main$16=jt;exports._sfc_main$17=re;exports._sfc_main$18=Zt;exports._sfc_main$19=eo;exports._sfc_main$2=Lt;exports._sfc_main$3=It;exports._sfc_main$4=Kt;exports._sfc_main$5=he;exports._sfc_main$6=ke;exports._sfc_main$7=Ne;exports._sfc_main$8=rt;exports._sfc_main$9=pt;exports.computeAnchoredPosition=ee;exports.getValueByPath=R;exports.nextWindowOrder=le;exports.resolveLabel=F;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digitalwalletcorp/vue-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Basic UI components for Vue 3",
|
|
6
6
|
"main": "lib/index.cjs",
|
|
@@ -37,23 +37,15 @@
|
|
|
37
37
|
"./global": {
|
|
38
38
|
"types": "./lib/global.d.ts"
|
|
39
39
|
},
|
|
40
|
-
"./style.css": "./lib/style.css"
|
|
41
|
-
"./*": {
|
|
42
|
-
"import": {
|
|
43
|
-
"types": "./lib/*.d.ts",
|
|
44
|
-
"default": "./lib/*.js"
|
|
45
|
-
},
|
|
46
|
-
"require": {
|
|
47
|
-
"types": "./lib/*.d.cts",
|
|
48
|
-
"default": "./lib/*.cjs"
|
|
49
|
-
}
|
|
50
|
-
}
|
|
40
|
+
"./style.css": "./lib/style.css"
|
|
51
41
|
},
|
|
52
42
|
"scripts": {
|
|
53
43
|
"build": "vite build",
|
|
54
44
|
"yarn:dedupe": "npx yarn-deduplicate --strategy highest yarn.lock",
|
|
55
45
|
"install:dev": "rm -rf lib dest && find node_modules -mindepth 1 -delete && yarn install",
|
|
56
|
-
"
|
|
46
|
+
"tsc": "vue-tsc --noEmit -p tsconfig.json",
|
|
47
|
+
"lint": "eslint . && stylelint \"src/**/*.vue\" \"src/**/*.css\"",
|
|
48
|
+
"lint:fix": "eslint --fix . && stylelint --fix \"**/*.vue\" \"**/*.css\"",
|
|
57
49
|
"version:patch": "npm version patch",
|
|
58
50
|
"version:minor": "npm version minor",
|
|
59
51
|
"version:major": "npm version major",
|
|
@@ -69,7 +61,7 @@
|
|
|
69
61
|
"components",
|
|
70
62
|
"ui"
|
|
71
63
|
],
|
|
72
|
-
"author": "
|
|
64
|
+
"author": "Digital Wallet Corporation",
|
|
73
65
|
"license": "MIT",
|
|
74
66
|
"repository": {
|
|
75
67
|
"type": "git",
|
|
@@ -85,23 +77,57 @@
|
|
|
85
77
|
],
|
|
86
78
|
"peerDependencies": {
|
|
87
79
|
"@digitalwalletcorp/vue-svg-icons": "^1.15.3",
|
|
80
|
+
"@nuxt/kit": "^3.17.5",
|
|
88
81
|
"vue": "^3.5.29"
|
|
89
82
|
},
|
|
83
|
+
"peerDependenciesMeta": {
|
|
84
|
+
"@nuxt/kit": {
|
|
85
|
+
"optional": true
|
|
86
|
+
}
|
|
87
|
+
},
|
|
90
88
|
"devDependencies": {
|
|
91
89
|
"@digitalwalletcorp/vue-svg-icons": "^1.15.3",
|
|
92
90
|
"@nuxt/kit": "^3.17.5",
|
|
91
|
+
"@stylistic/eslint-plugin": "5.10.0",
|
|
92
|
+
"@stylistic/stylelint-plugin": "5.3.1",
|
|
93
93
|
"@types/node": "24.13.6",
|
|
94
94
|
"@vitejs/plugin-vue": "^6.0.0",
|
|
95
95
|
"@vitest/coverage-v8": "3.2.4",
|
|
96
|
+
"@vue/compiler-core": "3.5.43",
|
|
96
97
|
"@vue/test-utils": "2.4.6",
|
|
98
|
+
"eslint": "10.11.0",
|
|
99
|
+
"eslint-plugin-vue": "10.11.1",
|
|
100
|
+
"globals": "17.13.0",
|
|
97
101
|
"happy-dom": "20.14.5",
|
|
98
102
|
"nuxt": "^3.17.5",
|
|
103
|
+
"postcss-html": "2.0.0",
|
|
104
|
+
"stylelint": "17.16.0",
|
|
105
|
+
"stylelint-config-recommended-vue": "2.0.0",
|
|
106
|
+
"stylelint-config-standard": "40.0.0",
|
|
99
107
|
"typescript": "6.0.3",
|
|
108
|
+
"typescript-eslint": "8.71.0",
|
|
100
109
|
"vite": "^7.0.0",
|
|
101
110
|
"vite-plugin-dts": "5.1.0",
|
|
102
111
|
"vite-tsconfig-paths": "6.1.1",
|
|
103
112
|
"vitest": "3.2.4",
|
|
104
113
|
"vue": "^3.5.29",
|
|
114
|
+
"vue-eslint-parser": "10.4.1",
|
|
105
115
|
"vue-tsc": "3.1.5"
|
|
116
|
+
},
|
|
117
|
+
"resolutions": {
|
|
118
|
+
"eslint": "10.11.0",
|
|
119
|
+
"eslint-plugin-vue": "10.11.1",
|
|
120
|
+
"typescript-eslint": "8.71.0",
|
|
121
|
+
"@stylistic/eslint-plugin": "5.10.0",
|
|
122
|
+
"globals": "17.13.0",
|
|
123
|
+
"vue-eslint-parser": "10.4.1",
|
|
124
|
+
"stylelint": "17.16.0",
|
|
125
|
+
"@stylistic/stylelint-plugin": "5.3.1",
|
|
126
|
+
"stylelint-config-standard": "40.0.0",
|
|
127
|
+
"stylelint-config-recommended-vue": "2.0.0",
|
|
128
|
+
"stylelint-config-recommended": "18.0.0",
|
|
129
|
+
"stylelint-config-html": "2.0.0",
|
|
130
|
+
"postcss-html": "2.0.0",
|
|
131
|
+
"postcss": "8.5.28"
|
|
106
132
|
}
|
|
107
133
|
}
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
<button
|
|
11
11
|
type="button"
|
|
12
12
|
class="dwui-accordion-toggle"
|
|
13
|
-
:aria-expanded="
|
|
13
|
+
:aria-expanded="expanded"
|
|
14
14
|
@click="onClickToggle"
|
|
15
15
|
>
|
|
16
|
-
<SvgTriangleButton :direction="
|
|
16
|
+
<SvgTriangleButton :direction="expanded ? 'up' : 'down'" />
|
|
17
17
|
<LabelIcon v-if="props.legend != null || slots.legend != null || slots.icon != null">
|
|
18
18
|
<!-- 渡されたスロットだけを中継する。空のラベルを渡すとアイコンの後ろに間隔が空くため -->
|
|
19
19
|
<template
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
</legend>
|
|
34
34
|
<div
|
|
35
35
|
ref="refContents"
|
|
36
|
-
:class="[ 'dwui-accordion-contents', shrinkable ?
|
|
36
|
+
:class="[ 'dwui-accordion-contents', shrinkable ? expanded ? 'dwui-expanded' : 'dwui-shrunk' : '' ]"
|
|
37
37
|
>
|
|
38
38
|
<slot />
|
|
39
39
|
</div>
|
|
@@ -41,22 +41,22 @@
|
|
|
41
41
|
</template>
|
|
42
42
|
|
|
43
43
|
<script setup lang="ts">
|
|
44
|
-
import {
|
|
44
|
+
import { computed, ref } from 'vue';
|
|
45
45
|
import { SvgTriangleButton } from '@digitalwalletcorp/vue-svg-icons';
|
|
46
46
|
import LabelIcon from '@/label-icon.vue';
|
|
47
47
|
import { useShrinkable } from '@/internal/use-shrinkable';
|
|
48
48
|
|
|
49
|
-
interface Props {
|
|
49
|
+
export interface Props {
|
|
50
50
|
/** 凡例の文字。HTMLを含める場合は#legendスロットを使う */
|
|
51
51
|
legend?: string;
|
|
52
52
|
/** trueの場合、fieldsetを無効にする */
|
|
53
53
|
disabled?: boolean;
|
|
54
|
-
/** trueの場合、開いた状態で表示する デフォルト false */
|
|
54
|
+
/** trueの場合、開いた状態で表示する デフォルト false。v-model:expanded で束縛しないときの初期値 */
|
|
55
55
|
initialExpand?: boolean;
|
|
56
56
|
}
|
|
57
57
|
const props = defineProps<Props>();
|
|
58
58
|
|
|
59
|
-
interface Slots {
|
|
59
|
+
export interface Slots {
|
|
60
60
|
/** 凡例の文字の前に表示するアイコン */
|
|
61
61
|
icon?(): unknown;
|
|
62
62
|
/** 凡例。legendより優先する */
|
|
@@ -66,18 +66,23 @@ interface Slots {
|
|
|
66
66
|
const slots = defineSlots<Slots>();
|
|
67
67
|
|
|
68
68
|
const refContents = ref<HTMLElement>();
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
// 真偽値の prop は未指定だと false に変換されるため、未指定を undefined のまま受けるよう既定値を明示する
|
|
70
|
+
/** 親が v-model:expanded で束縛したときの開閉状態。束縛しなければ undefined */
|
|
71
|
+
const model = defineModel<boolean | undefined>('expanded', { default: undefined });
|
|
72
|
+
/** 束縛しないときの開閉状態 */
|
|
73
|
+
const localExpanded = ref(!!props.initialExpand);
|
|
74
|
+
const expanded = computed({
|
|
75
|
+
get: (): boolean => model.value ?? localExpanded.value,
|
|
76
|
+
set: (value: boolean): void => {
|
|
77
|
+
localExpanded.value = value;
|
|
78
|
+
model.value = value;
|
|
79
|
+
}
|
|
71
80
|
});
|
|
72
81
|
const shrinkable = useShrinkable(refContents);
|
|
73
82
|
|
|
74
83
|
const onClickToggle = () => {
|
|
75
|
-
|
|
84
|
+
expanded.value = !expanded.value;
|
|
76
85
|
};
|
|
77
|
-
|
|
78
|
-
onMounted(() => {
|
|
79
|
-
pageContext.expanded = !!props.initialExpand;
|
|
80
|
-
});
|
|
81
86
|
</script>
|
|
82
87
|
|
|
83
88
|
<style>
|
|
@@ -89,8 +94,8 @@ onMounted(() => {
|
|
|
89
94
|
:where(.dwui-accordion-toggle) {
|
|
90
95
|
display: inline-flex;
|
|
91
96
|
align-items: center;
|
|
92
|
-
gap:
|
|
93
|
-
margin-left:
|
|
97
|
+
gap: 0.33em;
|
|
98
|
+
margin-left: 0.33em;
|
|
94
99
|
padding: 0;
|
|
95
100
|
border: none;
|
|
96
101
|
background: none;
|
|
@@ -104,14 +109,14 @@ onMounted(() => {
|
|
|
104
109
|
}
|
|
105
110
|
|
|
106
111
|
:where(.dwui-accordion-toggle:focus-visible) {
|
|
107
|
-
outline: var(--dwui-width-focus-ring, 2px) solid var(--dwui-outline-color-focus-ring, Highlight);
|
|
108
|
-
outline-offset: var(--dwui-offset-focus-ring, 2px);
|
|
112
|
+
outline: var(--dwui-outline-width-focus-ring, 2px) solid var(--dwui-outline-color-focus-ring, Highlight);
|
|
113
|
+
outline-offset: var(--dwui-outline-offset-focus-ring, 2px);
|
|
109
114
|
}
|
|
110
115
|
|
|
111
116
|
:where(.dwui-accordion-contents) {
|
|
112
117
|
position: relative;
|
|
113
118
|
width: fit-content;
|
|
114
|
-
padding:
|
|
119
|
+
padding: 0.17em;
|
|
115
120
|
overflow: hidden;
|
|
116
121
|
opacity: 1;
|
|
117
122
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
ref="refContents"
|
|
8
8
|
class="dwui-accordion-section-contents"
|
|
9
9
|
:class="[
|
|
10
|
-
shrinkable ?
|
|
10
|
+
shrinkable ? expanded ? 'dwui-expanded' : 'dwui-shrunk' : '',
|
|
11
11
|
{ 'dwui-no-gradient': props.noGradient }
|
|
12
12
|
]"
|
|
13
13
|
>
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
type="button"
|
|
22
22
|
class="dwui-accordion-section-toggle"
|
|
23
23
|
:disabled="props.disabled"
|
|
24
|
-
:aria-expanded="
|
|
24
|
+
:aria-expanded="expanded"
|
|
25
25
|
@click.stop="onClickToggle"
|
|
26
26
|
>
|
|
27
27
|
<LabelIcon v-if="toggleIcon() != null || toggleLabel != null">
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
</LabelIcon>
|
|
44
44
|
<SvgTriangleButton
|
|
45
45
|
v-else
|
|
46
|
-
:direction="
|
|
46
|
+
:direction="expanded ? 'up' : 'down'"
|
|
47
47
|
/>
|
|
48
48
|
</button>
|
|
49
49
|
</div>
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
</template>
|
|
52
52
|
|
|
53
53
|
<script setup lang="ts">
|
|
54
|
-
import { computed,
|
|
54
|
+
import { computed, ref } from 'vue';
|
|
55
55
|
import type { Component, Slot } from 'vue';
|
|
56
56
|
import { SvgTriangleButton } from '@digitalwalletcorp/vue-svg-icons';
|
|
57
57
|
import LabelIcon from '@/label-icon.vue';
|
|
@@ -60,40 +60,49 @@ import type { LabelPreset } from '@/types/label-preset';
|
|
|
60
60
|
|
|
61
61
|
// 開閉ボタンのアイコンとラベルは別々に決める。どちらも、スロット/ラベルの指定 > プリセット の順で使う
|
|
62
62
|
// 何も指定が無い場合だけ、既定の三角を表示する
|
|
63
|
-
interface Props {
|
|
63
|
+
export interface Props {
|
|
64
64
|
/** trueの場合、開閉ボタンを無効にする */
|
|
65
65
|
disabled?: boolean;
|
|
66
|
-
/** trueの場合、開いた状態で表示する デフォルト false */
|
|
66
|
+
/** trueの場合、開いた状態で表示する デフォルト false。v-model:expanded で束縛しないときの初期値 */
|
|
67
67
|
initialExpand?: boolean;
|
|
68
68
|
/** trueの場合、縮めたときに中身の下側をぼかさない */
|
|
69
69
|
noGradient?: boolean;
|
|
70
70
|
/** 縮めているときの開閉ボタン(開く)のラベル */
|
|
71
|
-
|
|
71
|
+
expandLabel?: string;
|
|
72
72
|
/** 開いているときの開閉ボタン(閉じる)のラベル */
|
|
73
|
-
|
|
73
|
+
collapseLabel?: string;
|
|
74
74
|
/** 縮めているときの開閉ボタン(開く)のアイコンとラベル */
|
|
75
|
-
|
|
75
|
+
expandPreset?: LabelPreset;
|
|
76
76
|
/** 開いているときの開閉ボタン(閉じる)のアイコンとラベル */
|
|
77
|
-
|
|
77
|
+
collapsePreset?: LabelPreset;
|
|
78
78
|
}
|
|
79
79
|
const props = defineProps<Props>();
|
|
80
80
|
|
|
81
|
-
interface Slots {
|
|
81
|
+
export interface Slots {
|
|
82
82
|
/** 縮めているときの開閉ボタン(開く)のアイコン */
|
|
83
|
-
'
|
|
83
|
+
'expand-icon'?(): unknown;
|
|
84
84
|
/** 開いているときの開閉ボタン(閉じる)のアイコン */
|
|
85
|
-
'
|
|
85
|
+
'collapse-icon'?(): unknown;
|
|
86
86
|
default?(): unknown;
|
|
87
87
|
}
|
|
88
88
|
const slots = defineSlots<Slots>();
|
|
89
89
|
|
|
90
90
|
const refContents = ref<HTMLElement>();
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
// 真偽値の prop は未指定だと false に変換されるため、未指定を undefined のまま受けるよう既定値を明示する
|
|
92
|
+
/** 親が v-model:expanded で束縛したときの開閉状態。束縛しなければ undefined */
|
|
93
|
+
const model = defineModel<boolean | undefined>('expanded', { default: undefined });
|
|
94
|
+
/** 束縛しないときの開閉状態 */
|
|
95
|
+
const localExpanded = ref(!!props.initialExpand);
|
|
96
|
+
const expanded = computed({
|
|
97
|
+
get: (): boolean => model.value ?? localExpanded.value,
|
|
98
|
+
set: (value: boolean): void => {
|
|
99
|
+
localExpanded.value = value;
|
|
100
|
+
model.value = value;
|
|
101
|
+
}
|
|
93
102
|
});
|
|
94
103
|
const shrinkable = useShrinkable(refContents);
|
|
95
104
|
|
|
96
|
-
const togglePreset = computed((): LabelPreset | undefined =>
|
|
105
|
+
const togglePreset = computed((): LabelPreset | undefined => expanded.value ? props.collapsePreset : props.expandPreset);
|
|
97
106
|
|
|
98
107
|
/**
|
|
99
108
|
* 開閉ボタンに表示するアイコン。スロットは関数のままコンポーネントとして描画する
|
|
@@ -102,7 +111,7 @@ const togglePreset = computed((): LabelPreset | undefined => pageContext.expande
|
|
|
102
111
|
* @returns {Slot | Component | undefined}
|
|
103
112
|
*/
|
|
104
113
|
const toggleIcon = (): Slot | Component | undefined => {
|
|
105
|
-
const slot =
|
|
114
|
+
const slot = expanded.value ? slots['collapse-icon'] : slots['expand-icon'];
|
|
106
115
|
return (slot as Slot | undefined) ?? togglePreset.value?.icon;
|
|
107
116
|
};
|
|
108
117
|
|
|
@@ -112,12 +121,12 @@ const toggleIcon = (): Slot | Component | undefined => {
|
|
|
112
121
|
* @returns {Record<string, unknown> | undefined}
|
|
113
122
|
*/
|
|
114
123
|
const toggleIconProps = (): Record<string, unknown> | undefined => {
|
|
115
|
-
const slot =
|
|
124
|
+
const slot = expanded.value ? slots['collapse-icon'] : slots['expand-icon'];
|
|
116
125
|
return slot == null ? togglePreset.value?.iconProps : undefined;
|
|
117
126
|
};
|
|
118
127
|
|
|
119
128
|
const toggleLabel = computed((): string | undefined => {
|
|
120
|
-
const label =
|
|
129
|
+
const label = expanded.value ? props.collapseLabel : props.expandLabel;
|
|
121
130
|
if (label != null) {
|
|
122
131
|
return label;
|
|
123
132
|
}
|
|
@@ -126,12 +135,8 @@ const toggleLabel = computed((): string | undefined => {
|
|
|
126
135
|
});
|
|
127
136
|
|
|
128
137
|
const onClickToggle = () => {
|
|
129
|
-
|
|
138
|
+
expanded.value = !expanded.value;
|
|
130
139
|
};
|
|
131
|
-
|
|
132
|
-
onMounted(() => {
|
|
133
|
-
pageContext.expanded = !!props.initialExpand;
|
|
134
|
-
});
|
|
135
140
|
</script>
|
|
136
141
|
|
|
137
142
|
<style>
|
|
@@ -189,16 +194,16 @@ onMounted(() => {
|
|
|
189
194
|
}
|
|
190
195
|
|
|
191
196
|
:where(.dwui-accordion-section-toggle:focus-visible) {
|
|
192
|
-
outline: var(--dwui-width-focus-ring, 2px) solid var(--dwui-outline-color-focus-ring, Highlight);
|
|
193
|
-
outline-offset: var(--dwui-offset-focus-ring, 2px);
|
|
197
|
+
outline: var(--dwui-outline-width-focus-ring, 2px) solid var(--dwui-outline-color-focus-ring, Highlight);
|
|
198
|
+
outline-offset: var(--dwui-outline-offset-focus-ring, 2px);
|
|
194
199
|
}
|
|
195
200
|
|
|
196
201
|
:where(.dwui-accordion-section-toggle[aria-expanded='true']) {
|
|
197
|
-
margin-top:
|
|
202
|
+
margin-top: 0.67em;
|
|
198
203
|
}
|
|
199
204
|
|
|
200
205
|
/* 縮めたときはボタンを中身のぼかしに少し重ね、中身とボタンの間を詰める */
|
|
201
206
|
:where(.dwui-accordion-section-toggle[aria-expanded='false']) {
|
|
202
|
-
margin-top: -
|
|
207
|
+
margin-top: -0.83em;
|
|
203
208
|
}
|
|
204
209
|
</style>
|
package/src/components.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
// 公開するコンポーネントをここに列挙する。index/register/nuxtはここから読む
|
|
2
2
|
export { default as AccordionFieldset } from '@/accordion-fieldset.vue';
|
|
3
3
|
export { default as AccordionSection } from '@/accordion-section.vue';
|
|
4
|
+
export { default as CopyButton } from '@/copy-button.vue';
|
|
5
|
+
export { default as DarkModeSelector } from '@/dark-mode-selector.vue';
|
|
6
|
+
export { default as DataTable } from '@/data-table.vue';
|
|
7
|
+
export { default as HelpButton } from '@/help-button.vue';
|
|
8
|
+
export { default as HelpPopper } from '@/help-popper.vue';
|
|
4
9
|
export { default as HourglassLoading } from '@/hourglass-loading.vue';
|
|
10
|
+
export { default as IntersectionLazyComponent } from '@/intersection-lazy-component.vue';
|
|
5
11
|
export { default as LabelButton } from '@/label-button.vue';
|
|
6
12
|
export { default as LabelIcon } from '@/label-icon.vue';
|
|
13
|
+
export { default as ModalDialog } from '@/modal-dialog.vue';
|
|
14
|
+
export { default as OverlayBox } from '@/overlay-box.vue';
|
|
7
15
|
export { default as PageSection } from '@/page-section.vue';
|
|
8
16
|
export { default as PageTitle } from '@/page-title.vue';
|
|
17
|
+
export { default as ScreenLoading } from '@/screen-loading.vue';
|
|
9
18
|
export { default as TabContent } from '@/tab-content.vue';
|
|
10
19
|
export { default as TabGroup } from '@/tab-group.vue';
|
|
20
|
+
export { default as WarningPopper } from '@/warning-popper.vue';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
値をクリップボードにコピーするボタン
|
|
3
|
+
-->
|
|
4
|
+
<template>
|
|
5
|
+
<button
|
|
6
|
+
type="button"
|
|
7
|
+
class="dwui-copy-button"
|
|
8
|
+
:aria-label="slots.default ? undefined : props.label"
|
|
9
|
+
@click="onClickCopy"
|
|
10
|
+
>
|
|
11
|
+
<slot>
|
|
12
|
+
<SvgMemo />
|
|
13
|
+
</slot>
|
|
14
|
+
</button>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script setup lang="ts">
|
|
18
|
+
import { SvgMemo } from '@digitalwalletcorp/vue-svg-icons';
|
|
19
|
+
|
|
20
|
+
export interface Props {
|
|
21
|
+
/** コピーする値。関数を渡すとクリック時に呼び出して値を得る */
|
|
22
|
+
value: string | number | (() => string | number);
|
|
23
|
+
/** ボタンの読み上げ名。スロットで文字を渡したときは使わない */
|
|
24
|
+
label?: string;
|
|
25
|
+
}
|
|
26
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
27
|
+
label: 'Copy'
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export interface Emits {
|
|
31
|
+
/** コピーに成功したときに、コピーした文字列を発行する */
|
|
32
|
+
(e: 'emit:copy', value: string): void;
|
|
33
|
+
/** コピーに失敗したときに、原因のエラーを発行する */
|
|
34
|
+
(e: 'emit:error', error: unknown): void;
|
|
35
|
+
}
|
|
36
|
+
const emit = defineEmits<Emits>();
|
|
37
|
+
|
|
38
|
+
export interface Slots {
|
|
39
|
+
/** ボタンの中身。未指定ならメモのアイコン */
|
|
40
|
+
default?(): unknown;
|
|
41
|
+
}
|
|
42
|
+
const slots = defineSlots<Slots>();
|
|
43
|
+
|
|
44
|
+
const onClickCopy = async () => {
|
|
45
|
+
const value = String(typeof props.value === 'function' ? props.value() : props.value);
|
|
46
|
+
try {
|
|
47
|
+
await navigator.clipboard.writeText(value);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
emit('emit:error', error);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
emit('emit:copy', value);
|
|
53
|
+
};
|
|
54
|
+
</script>
|
|
55
|
+
|
|
56
|
+
<style>
|
|
57
|
+
:where(.dwui-copy-button) {
|
|
58
|
+
display: inline-flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
justify-content: center;
|
|
61
|
+
padding: 0.17em;
|
|
62
|
+
border: none;
|
|
63
|
+
border-radius: 4px;
|
|
64
|
+
background-color: transparent;
|
|
65
|
+
background-image: none;
|
|
66
|
+
color: inherit;
|
|
67
|
+
font: inherit;
|
|
68
|
+
line-height: 0;
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
:where(.dwui-copy-button:not(:disabled):hover) {
|
|
73
|
+
background: var(--dwui-background-copy-button-hover, light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.12)));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
:where(.dwui-copy-button:not(:disabled):active) {
|
|
77
|
+
transform: translate(1px, 1px);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
:where(.dwui-copy-button:disabled) {
|
|
81
|
+
opacity: 0.4;
|
|
82
|
+
cursor: not-allowed;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
:where(.dwui-copy-button:focus-visible) {
|
|
86
|
+
outline: var(--dwui-outline-width-focus-ring, 2px) solid var(--dwui-outline-color-focus-ring, Highlight);
|
|
87
|
+
outline-offset: var(--dwui-outline-offset-focus-ring, 2px);
|
|
88
|
+
}
|
|
89
|
+
</style>
|