bootstrap-vue-next 0.43.4 → 0.43.5
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/{BDropdown.vue_vue_type_script_setup_true_lang-BaE67YrE.js → BDropdown.vue_vue_type_script_setup_true_lang-DRMdWPlp.js} +2 -2
- package/dist/{BDropdown.vue_vue_type_script_setup_true_lang-BaE67YrE.js.map → BDropdown.vue_vue_type_script_setup_true_lang-DRMdWPlp.js.map} +1 -1
- package/dist/{BDropdown.vue_vue_type_script_setup_true_lang-DLUeuZ9X.mjs → BDropdown.vue_vue_type_script_setup_true_lang-c0BxCMGB.mjs} +2 -2
- package/dist/{BDropdown.vue_vue_type_script_setup_true_lang-DLUeuZ9X.mjs.map → BDropdown.vue_vue_type_script_setup_true_lang-c0BxCMGB.mjs.map} +1 -1
- package/dist/{BFormFile.vue_vue_type_script_setup_true_lang-nHLntSo0.js → BFormFile.vue_vue_type_script_setup_true_lang-CA61Ck_m.js} +2 -2
- package/dist/BFormFile.vue_vue_type_script_setup_true_lang-CA61Ck_m.js.map +1 -0
- package/dist/{BFormFile.vue_vue_type_script_setup_true_lang-BOIiVYvE.mjs → BFormFile.vue_vue_type_script_setup_true_lang-DRpf0N3X.mjs} +2 -2
- package/dist/BFormFile.vue_vue_type_script_setup_true_lang-DRpf0N3X.mjs.map +1 -0
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-D4gp11CP.mjs +2 -0
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-D4gp11CP.mjs.map +1 -0
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-fqgP9P-m.js +2 -0
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-fqgP9P-m.js.map +1 -0
- package/dist/{BNavText.vue_vue_type_script_setup_true_lang-D6qES9jG.js → BNavText.vue_vue_type_script_setup_true_lang-CpAN-7mY.js} +2 -2
- package/dist/{BNavText.vue_vue_type_script_setup_true_lang-D6qES9jG.js.map → BNavText.vue_vue_type_script_setup_true_lang-CpAN-7mY.js.map} +1 -1
- package/dist/{BNavText.vue_vue_type_script_setup_true_lang-DSMN_O7L.mjs → BNavText.vue_vue_type_script_setup_true_lang-CxIc6aLv.mjs} +2 -2
- package/dist/{BNavText.vue_vue_type_script_setup_true_lang-DSMN_O7L.mjs.map → BNavText.vue_vue_type_script_setup_true_lang-CxIc6aLv.mjs.map} +1 -1
- package/dist/BTable.vue_vue_type_script_setup_true_lang-BasI6gHe.js.map +1 -1
- package/dist/BTable.vue_vue_type_script_setup_true_lang-DYZeXsLE.mjs.map +1 -1
- package/dist/BTooltip.vue_vue_type_script_setup_true_lang-CmAIGYcx.js +2 -0
- package/dist/{BTooltip.vue_vue_type_script_setup_true_lang-ChGvfBmJ.js.map → BTooltip.vue_vue_type_script_setup_true_lang-CmAIGYcx.js.map} +1 -1
- package/dist/{BTooltip.vue_vue_type_script_setup_true_lang-Dq05FC3T.mjs → BTooltip.vue_vue_type_script_setup_true_lang-Dmnro243.mjs} +2 -2
- package/dist/{BTooltip.vue_vue_type_script_setup_true_lang-Dq05FC3T.mjs.map → BTooltip.vue_vue_type_script_setup_true_lang-Dmnro243.mjs.map} +1 -1
- package/dist/bootstrap-vue-next.css +1 -1
- package/dist/bootstrap-vue-next.mjs +1 -1
- package/dist/bootstrap-vue-next.umd.js +1 -1
- package/dist/{floatingUi-CKlUKFP8.js → floatingUi-BfpD9uQE.js} +2 -2
- package/dist/{floatingUi-CKlUKFP8.js.map → floatingUi-BfpD9uQE.js.map} +1 -1
- package/dist/{floatingUi-7gf2Xf9M.mjs → floatingUi-C_sODraS.mjs} +2 -2
- package/dist/{floatingUi-7gf2Xf9M.mjs.map → floatingUi-C_sODraS.mjs.map} +1 -1
- package/dist/{index-B-U7ORru.js → index-Bv4Fjo_n.js} +2 -2
- package/dist/index-Bv4Fjo_n.js.map +1 -0
- package/dist/{index-CBhqPGmW.mjs → index-Ck23V1M0.mjs} +2 -2
- package/dist/index-Ck23V1M0.mjs.map +1 -0
- package/dist/src/components/BDropdown/index.mjs +1 -1
- package/dist/src/components/BDropdown/index.umd.js +1 -1
- package/dist/src/components/BFormFile/index.mjs +1 -1
- package/dist/src/components/BFormFile/index.umd.js +1 -1
- package/dist/src/components/BFormInput/index.mjs +1 -1
- package/dist/src/components/BFormInput/index.umd.js +1 -1
- package/dist/src/components/BNav/index.mjs +1 -1
- package/dist/src/components/BNav/index.umd.js +1 -1
- package/dist/src/components/BPopover/BPopover.vue.d.mts +2 -0
- package/dist/src/components/BPopover/BPopover.vue.d.ts +2 -0
- package/dist/src/components/BPopover/BPopoverOrchestrator.vue.d.mts +30 -2
- package/dist/src/components/BPopover/BPopoverOrchestrator.vue.d.ts +30 -2
- package/dist/src/components/BPopover/index.mjs +1 -1
- package/dist/src/components/BPopover/index.umd.js +1 -1
- package/dist/src/components/BTooltip/BTooltip.vue.d.mts +12 -2
- package/dist/src/components/BTooltip/BTooltip.vue.d.ts +12 -2
- package/dist/src/components/BTooltip/index.mjs +1 -1
- package/dist/src/components/BTooltip/index.umd.js +1 -1
- package/dist/src/components/index.mjs +1 -1
- package/dist/src/components/index.umd.js +1 -1
- package/dist/src/composables/usePopover/index.d.mts +60 -4
- package/dist/src/composables/usePopover/index.d.ts +60 -4
- package/dist/src/composables/usePopover/index.mjs +1 -1
- package/dist/src/composables/usePopover/index.umd.js +1 -1
- package/dist/src/directives/BPopover/index.mjs +1 -1
- package/dist/src/directives/BPopover/index.umd.js +1 -1
- package/dist/src/directives/BScrollspy/index.mjs +1 -1
- package/dist/src/directives/BScrollspy/index.umd.js +1 -1
- package/dist/src/directives/BToggle/index.mjs +1 -1
- package/dist/src/directives/BToggle/index.umd.js +1 -1
- package/dist/src/directives/BTooltip/index.mjs +1 -1
- package/dist/src/directives/BTooltip/index.umd.js +1 -1
- package/dist/src/types/ComponentEmits.d.mts +1 -0
- package/dist/src/types/ComponentEmits.d.ts +1 -0
- package/dist/src/types/TableTypes.d.mts +3 -2
- package/dist/src/types/TableTypes.d.ts +3 -2
- package/dist/src/types/index.d.mts +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/{utils-CMyJoXOo.js → utils-BpYCGdCO.js} +2 -2
- package/dist/{utils-CMyJoXOo.js.map → utils-BpYCGdCO.js.map} +1 -1
- package/dist/{utils-CcDOWZPQ.mjs → utils-BuImj8ta.mjs} +2 -2
- package/dist/{utils-CcDOWZPQ.mjs.map → utils-BuImj8ta.mjs.map} +1 -1
- package/package.json +1 -1
- package/src/components/BInputGroup/_input-group.scss +3 -0
- package/dist/BFormFile.vue_vue_type_script_setup_true_lang-BOIiVYvE.mjs.map +0 -1
- package/dist/BFormFile.vue_vue_type_script_setup_true_lang-nHLntSo0.js.map +0 -1
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-CRXPh1qJ.js +0 -2
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-CRXPh1qJ.js.map +0 -1
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-zHjcH6xn.mjs +0 -2
- package/dist/BFormInput.vue_vue_type_script_setup_true_lang-zHjcH6xn.mjs.map +0 -1
- package/dist/BTooltip.vue_vue_type_script_setup_true_lang-ChGvfBmJ.js +0 -2
- package/dist/index-B-U7ORru.js.map +0 -1
- package/dist/index-CBhqPGmW.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("vue"),t=require("./floatingUi-
|
|
2
|
-
//# sourceMappingURL=BDropdown.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
"use strict";const e=require("vue"),t=require("./floatingUi-BfpD9uQE.js"),o=require("./index-8Vu3L2de.js"),a=require("./useDefaults-DspAih6L.js"),l=require("./useId-owZCNodL.js"),n=require("./BButton.vue_vue_type_script_setup_true_lang-ch6lNAVX.js"),i=require("./ConditionalWrapper.vue_vue_type_script_lang-CdLqzk6C.js"),r=require("./ConditionalTeleport.vue_vue_type_script_lang-BLAPKacY.js"),s=require("./getElement-BIaUkSEc.js"),u=require("./keys-D59bcWpQ.js"),d=require("./useShowHide-B6z-iwdX.js"),p=require("./index-CbGpN2AJ.js"),f={class:"visually-hidden"},c=["id","aria-labelledby","role"],v=e.defineComponent({__name:"BDropdown",props:e.mergeModels({ariaLabel:{default:void 0},autoClose:{type:[Boolean,String],default:!0},boundary:{default:"clippingAncestors"},boundaryPadding:{default:void 0},disabled:{type:Boolean,default:!1},floatingMiddleware:{default:void 0},icon:{type:Boolean,default:!1},id:{default:void 0},isNav:{type:Boolean,default:!1},menuClass:{default:void 0},noCaret:{type:Boolean,default:!1},noFlip:{type:Boolean,default:!1},noShift:{type:Boolean,default:!1},noSize:{type:Boolean,default:!1},offset:{default:0},role:{default:"menu"},size:{default:"md"},noWrapper:{type:Boolean,default:!1},split:{type:Boolean,default:!1},splitButtonType:{default:"button"},splitClass:{default:void 0},splitDisabled:{type:Boolean,default:void 0},splitHref:{default:void 0},splitTo:{default:void 0},splitVariant:{default:void 0},strategy:{default:"absolute"},text:{default:void 0},toggleClass:{default:void 0},toggleText:{default:"Toggle dropdown"},variant:{default:"secondary"},wrapperClass:{default:void 0},placement:{default:"bottom-start"},teleportDisabled:{type:Boolean,default:!1},teleportTo:{default:void 0},initialAnimation:{type:Boolean,default:!1},noAnimation:{type:Boolean},noFade:{type:Boolean,default:!1},lazy:{type:Boolean,default:!1},unmountLazy:{type:Boolean,default:!1},show:{type:Boolean,default:!1},transProps:{default:void 0},visible:{type:Boolean,default:!1}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:e.mergeModels(["split-click","hide","hide-prevented","hidden","show","show-prevented","shown","toggle","toggle-prevented","cancel","ok"],["update:modelValue"]),setup(v,{expose:g,emit:y}){const m=v,b=a.useDefaults(m,"BDropdown"),h=y,w=l.useId(()=>b.id,"dropdown"),B=e.useModel(v,"modelValue"),C=e.inject(u.inputGroupKey,!1),_=e.inject(u.buttonGroupKey,!1),k=e.computed(()=>"string"==typeof b.offset||"number"==typeof b.offset?b.offset:Number.NaN),x=p.useToNumber(k),S=e.useTemplateRef("_floating"),T=e.useTemplateRef("_button"),N=e.useTemplateRef("_splitButton"),z=e.computed(()=>t.isBoundary(b.boundary)?b.boundary:void 0),V=e.computed(()=>t.isRootBoundary(b.boundary)?b.boundary:void 0),j=e.computed(()=>b.split?T.value:N.value);let q;const{showRef:D,renderRef:A,hide:K,show:M,toggle:R,computedNoAnimation:E,transitionProps:F,contentShowing:H,isVisible:P}=d.useShowHide(B,b,h,j,w,{showFn:()=>{L(),e.nextTick(()=>{q=t.autoUpdate(j.value,S.value,L,{animationFrame:!1})})},hideFn:()=>{q&&(q(),q=void 0)}}),W=e.computed(()=>[{show:P.value,fade:!E.value}]);o.onKeyStroke("Escape",()=>{K(),s.getElement(j.value)?.focus()},{target:j}),o.onKeyStroke("Escape",()=>{K(),s.getElement(j.value)?.focus()},{target:S});const $=(t,o)=>{if(S.value?.contains(t.target?.closest("form")))return;if(/input|select|option|textarea|form/i.test(t.target?.tagName))return;if(t.preventDefault(),!D.value){M();const a=setInterval(()=>{P.value&&(clearInterval(a),e.nextTick(()=>$(t,o)))},16);return}const a=S.value?.querySelectorAll(".dropdown-item:not(.disabled):not(:disabled)");if(a)if(S.value?.contains(document.activeElement)){const e=S.value.querySelector(".dropdown-item:focus"),t=Array.prototype.indexOf.call(a,e)+o;t>=0&&t<a?.length&&a[t]?.focus()}else a[-1===o?a.length-1:0]?.focus()};o.onKeyStroke("ArrowUp",e=>$(e,-1),{target:j}),o.onKeyStroke("ArrowDown",e=>$(e,1),{target:j}),o.onKeyStroke("ArrowUp",e=>$(e,-1),{target:S}),o.onKeyStroke("ArrowDown",e=>$(e,1),{target:S});const I=e.ref({}),U=e.computed(()=>{if(void 0!==b.floatingMiddleware)return b.floatingMiddleware;const e="string"==typeof b.offset||"number"==typeof b.offset?x.value:b.offset,o=[t.offset(e)];return!1===b.noFlip&&o.push(t.flip({boundary:z.value,rootBoundary:V.value,padding:b.boundaryPadding})),!1===b.noShift&&o.push(t.shift({boundary:z.value,rootBoundary:V.value,padding:b.boundaryPadding})),!1===b.noSize&&o.push(t.size({boundary:z.value,rootBoundary:V.value,padding:b.boundaryPadding,apply({availableWidth:e,availableHeight:t}){I.value={maxHeight:t>=(S.value?.scrollHeight??0)?void 0:t?`${Math.max(0,t)}px`:void 0,maxWidth:e>=(S.value?.scrollWidth??0)?void 0:e?`${Math.max(0,e)}px`:void 0}}})),o}),{update:L,floatingStyles:G}=t.useFloating(j,S,{placement:()=>b.placement,middleware:U,strategy:e.toRef(()=>b.strategy)}),O=_?{class:"btn-group",role:"group"}:void 0,J=e.computed(()=>[O?.class,b.wrapperClass,{"btn-group":!b.wrapperClass&&b.split,[`drop${t.resolveBootstrapCaret(b.placement)}`]:!b.wrapperClass,"position-static":"clippingAncestors"!==b.boundary&&!b.isNav}]),Q=e.computed(()=>[b.split?b.splitClass:b.toggleClass,{"nav-link":b.isNav,"dropdown-toggle":!b.split,"dropdown-toggle-no-caret":b.noCaret&&!b.split,show:b.split?void 0:D.value}]),X=()=>{R()},Y=e=>{b.split?h("split-click",e):X()};o.onClickOutside(S,()=>{!D.value||!0!==b.autoClose&&"outside"!==b.autoClose||K()},{ignore:[T,N]});const Z=()=>{!D.value||!0!==b.autoClose&&"inside"!==b.autoClose||K()};return e.watch(P,()=>{L()}),g({hide:K,show:M,toggle:R}),e.provide(u.dropdownInjectionKey,{id:w,show:M,hide:K,toggle:R,visible:e.readonly(D),isNav:e.toRef(()=>b.isNav)}),(t,o)=>(e.openBlock(),e.createBlock(i._sfc_main,{skip:e.unref(C)||e.unref(b).noWrapper,class:e.normalizeClass(J.value),role:e.unref(O)?.role},{default:e.withCtx(()=>[e.createVNode(n._sfc_main,{id:e.unref(w),ref:"_splitButton",variant:e.unref(b).splitVariant||e.unref(b).variant,size:e.unref(b).size,class:e.normalizeClass(Q.value),disabled:e.unref(b).splitDisabled||e.unref(b).disabled,type:e.unref(b).splitButtonType,"aria-label":e.unref(b).ariaLabel,"aria-expanded":e.unref(b).split?void 0:e.unref(D),"aria-haspopup":e.unref(b).split?void 0:"menu",href:e.unref(b).split?e.unref(b).splitHref:void 0,icon:e.unref(b).icon,to:e.unref(b).split&&e.unref(b).splitTo?e.unref(b).splitTo:void 0,onClick:Y},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"button-content",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(b).text),1)])]),_:3},8,["id","variant","size","class","disabled","type","aria-label","aria-expanded","aria-haspopup","href","icon","to"]),e.unref(b).split?(e.openBlock(),e.createBlock(n._sfc_main,{key:0,id:e.unref(w)+"-split",ref:"_button",variant:e.unref(b).variant,size:e.unref(b).size,disabled:e.unref(b).disabled,class:e.normalizeClass([[e.unref(b).toggleClass,{show:e.unref(D)}],"dropdown-toggle-split dropdown-toggle"]),"aria-expanded":e.unref(D),"aria-haspopup":"menu",onClick:X},{default:e.withCtx(()=>[e.createElementVNode("span",f,[e.renderSlot(t.$slots,"toggle-text",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(b).toggleText),1)])])]),_:3},8,["id","variant","size","disabled","class","aria-expanded"])):e.createCommentVNode("",!0),e.createVNode(r._sfc_main,{to:e.unref(b).teleportTo,disabled:!e.unref(b).teleportTo||e.unref(b).teleportDisabled},{default:e.withCtx(()=>[e.unref(A)||e.unref(H)?(e.openBlock(),e.createBlock(e.Transition,e.mergeProps({key:0},e.unref(F),{appear:B.value||e.unref(b).visible}),{default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("ul",{id:e.unref(w)+"-menu",ref:"_floating",style:e.normalizeStyle([e.unref(G),I.value,{display:e.unref(D)?"block":"none"}]),class:e.normalizeClass(["dropdown-menu overflow-auto",[e.unref(b).menuClass,W.value]]),"aria-labelledby":e.unref(w),role:e.unref(b).role,onClick:Z},[e.unref(H)?e.renderSlot(t.$slots,"default",{key:0,id:e.unref(w),hide:e.unref(K),show:e.unref(M),visible:e.unref(D),click:Z,toggle:X,active:e.unref(D)}):e.createCommentVNode("",!0)],14,c),[[e.vShow,e.unref(D)]])]),_:3},16,["appear"])):e.createCommentVNode("",!0)]),_:3},8,["to","disabled"])]),_:3},8,["skip","class","role"]))}});exports._sfc_main=v;
|
|
2
|
+
//# sourceMappingURL=BDropdown.vue_vue_type_script_setup_true_lang-DRMdWPlp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BDropdown.vue_vue_type_script_setup_true_lang-BaE67YrE.js","sources":["../src/components/BDropdown/BDropdown.vue"],"sourcesContent":["<template>\n <ConditionalWrapper\n :skip=\"inInputGroup || props.noWrapper\"\n :class=\"computedClasses\"\n :role=\"inButtonGroupAttributes?.role\"\n >\n <BButton\n :id=\"computedId\"\n ref=\"_splitButton\"\n :variant=\"props.splitVariant || props.variant\"\n :size=\"props.size\"\n :class=\"buttonClasses\"\n :disabled=\"props.splitDisabled || props.disabled\"\n :type=\"props.splitButtonType\"\n :aria-label=\"props.ariaLabel\"\n :aria-expanded=\"props.split ? undefined : showRef\"\n :aria-haspopup=\"props.split ? undefined : 'menu'\"\n :href=\"props.split ? props.splitHref : undefined\"\n :icon=\"props.icon\"\n :to=\"props.split && props.splitTo ? props.splitTo : undefined\"\n @click=\"onSplitClick\"\n >\n <slot name=\"button-content\"> {{ props.text }} </slot>\n </BButton>\n <BButton\n v-if=\"props.split\"\n :id=\"computedId + '-split'\"\n ref=\"_button\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :class=\"[props.toggleClass, {show: showRef}]\"\n class=\"dropdown-toggle-split dropdown-toggle\"\n :aria-expanded=\"showRef\"\n aria-haspopup=\"menu\"\n @click=\"onButtonClick\"\n >\n <span class=\"visually-hidden\">\n <slot name=\"toggle-text\">\n {{ props.toggleText }}\n </slot>\n </span>\n </BButton>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"!props.teleportTo || props.teleportDisabled\"\n >\n <Transition\n v-if=\"renderRef || contentShowing\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <ul\n v-show=\"showRef\"\n :id=\"computedId + '-menu'\"\n ref=\"_floating\"\n :style=\"[floatingStyles, sizeStyles, {display: showRef ? 'block' : 'none'}]\"\n class=\"dropdown-menu overflow-auto\"\n :class=\"[props.menuClass, computedMenuClasses]\"\n :aria-labelledby=\"computedId\"\n :role=\"props.role\"\n @click=\"onClickInside\"\n >\n <slot\n v-if=\"contentShowing\"\n :id=\"computedId\"\n :hide=\"hide\"\n :show=\"show\"\n :visible=\"showRef\"\n :click=\"onClickInside\"\n :toggle=\"onButtonClick\"\n :active=\"showRef\"\n />\n </ul>\n </Transition>\n </ConditionalTeleport>\n </ConditionalWrapper>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n autoUpdate,\n type Boundary,\n flip,\n type Middleware,\n offset as offsetMiddleware,\n type ReferenceElement,\n type RootBoundary,\n shift,\n size as sizeMiddleware,\n useFloating,\n} from '@floating-ui/vue'\nimport {onClickOutside, onKeyStroke, useToNumber} from '@vueuse/core'\nimport {\n computed,\n type ComputedRef,\n type CSSProperties,\n type EmitFn,\n inject,\n nextTick,\n provide,\n readonly,\n ref,\n toRef,\n useTemplateRef,\n watch,\n} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {BDropdownProps} from '../../types/ComponentProps'\nimport type {BDropdownEmits} from '../../types/ComponentEmits'\nimport BButton from '../BButton/BButton.vue'\nimport ConditionalWrapper from '../ConditionalWrapper.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {isBoundary, isRootBoundary, resolveBootstrapCaret} from '../../utils/floatingUi'\nimport {getElement} from '../../utils/getElement'\nimport {buttonGroupKey, dropdownInjectionKey, inputGroupKey} from '../../utils/keys'\nimport {useShowHide} from '../../composables/useShowHide'\nimport type {BDropdownSlots} from '../../types'\n\nconst _props = withDefaults(defineProps<Omit<BDropdownProps, 'modelValue'>>(), {\n ariaLabel: undefined,\n autoClose: true,\n boundary: 'clippingAncestors',\n boundaryPadding: undefined,\n teleportTo: undefined,\n teleportDisabled: false,\n disabled: false,\n floatingMiddleware: undefined,\n icon: false,\n id: undefined,\n initialAnimation: false,\n isNav: false,\n lazy: false,\n menuClass: undefined,\n noCaret: false,\n noFade: false,\n noFlip: false,\n noShift: false,\n noSize: false,\n offset: 0,\n unmountLazy: false,\n role: 'menu',\n size: 'md',\n noWrapper: false,\n split: false,\n splitButtonType: 'button',\n splitClass: undefined,\n splitDisabled: undefined,\n splitHref: undefined,\n splitTo: undefined,\n placement: 'bottom-start',\n splitVariant: undefined,\n strategy: 'absolute',\n text: undefined,\n show: false,\n toggleClass: undefined,\n toggleText: 'Toggle dropdown',\n transProps: undefined,\n variant: 'secondary',\n visible: false,\n wrapperClass: undefined,\n})\nconst props = useDefaults(_props, 'BDropdown')\nconst emit = defineEmits<BDropdownEmits>()\ndefineSlots<BDropdownSlots>()\n\nconst computedId = useId(() => props.id, 'dropdown')\n\nconst modelValue = defineModel<Exclude<BDropdownProps['modelValue'], undefined>>({default: false})\n\nconst inInputGroup = inject(inputGroupKey, false)\nconst inButtonGroup = inject(buttonGroupKey, false)\n\nconst computedOffset = computed(() =>\n typeof props.offset === 'string' || typeof props.offset === 'number' ? props.offset : Number.NaN\n)\nconst offsetToNumber = useToNumber(computedOffset)\n\nconst floatingElement = useTemplateRef<HTMLUListElement | null>('_floating')\nconst button = useTemplateRef<HTMLElement | null>('_button')\nconst splitButton = useTemplateRef<HTMLElement | null>('_splitButton')\n\nconst boundary = computed<Boundary | undefined>(() =>\n isBoundary(props.boundary) ? props.boundary : undefined\n)\nconst rootBoundary = computed<RootBoundary | undefined>(() =>\n isRootBoundary(props.boundary) ? props.boundary : undefined\n)\n\nconst referenceElement = computed(() => (!props.split ? splitButton.value : button.value))\nlet cleanup: ReturnType<typeof autoUpdate> | undefined\n\nconst {\n showRef,\n renderRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n transitionProps,\n contentShowing,\n isVisible,\n} = useShowHide(modelValue, props, emit as EmitFn, referenceElement, computedId, {\n showFn: () => {\n update()\n nextTick(() => {\n cleanup = autoUpdate(\n referenceElement.value as ReferenceElement,\n floatingElement.value as HTMLElement,\n update,\n {\n animationFrame: false,\n }\n )\n })\n },\n hideFn: () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n },\n})\n\nconst computedMenuClasses = computed(() => [\n {\n show: isVisible.value,\n fade: !computedNoAnimation.value,\n },\n])\n\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: referenceElement}\n)\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: floatingElement}\n)\n\nconst keynav = (e: Readonly<Event>, v: number) => {\n if (floatingElement.value?.contains((e.target as HTMLElement)?.closest('form'))) return\n if (/input|select|option|textarea|form/i.test((e.target as HTMLElement)?.tagName)) return\n e.preventDefault()\n if (!showRef.value) {\n show()\n const loop = setInterval(() => {\n if (isVisible.value) {\n clearInterval(loop)\n nextTick(() => keynav(e, v))\n }\n }, 16)\n return\n }\n const list = floatingElement.value?.querySelectorAll(\n '.dropdown-item:not(.disabled):not(:disabled)'\n )\n if (!list) return\n if (floatingElement.value?.contains(document.activeElement)) {\n const active = floatingElement.value.querySelector('.dropdown-item:focus')\n const index = Array.prototype.indexOf.call(list, active) + v\n if (index >= 0 && index < list?.length) (list[index] as HTMLElement)?.focus()\n } else {\n ;(list[v === -1 ? list.length - 1 : 0] as HTMLElement)?.focus()\n }\n}\n\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: referenceElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: referenceElement})\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: floatingElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: floatingElement})\n\nconst sizeStyles = ref<CSSProperties>({})\nconst floatingMiddleware = computed<readonly Middleware[]>(() => {\n if (props.floatingMiddleware !== undefined) {\n return props.floatingMiddleware\n }\n const localOffset =\n typeof props.offset === 'string' || typeof props.offset === 'number'\n ? offsetToNumber.value\n : props.offset\n const arr: Middleware[] = [offsetMiddleware(localOffset)]\n if (props.noFlip === false) {\n arr.push(\n flip({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noShift === false) {\n arr.push(\n shift({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noSize === false) {\n arr.push(\n sizeMiddleware({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n apply({availableWidth, availableHeight}) {\n sizeStyles.value = {\n maxHeight:\n availableHeight >= (floatingElement.value?.scrollHeight ?? 0)\n ? undefined\n : availableHeight\n ? `${Math.max(0, availableHeight)}px`\n : undefined,\n maxWidth:\n availableWidth >= (floatingElement.value?.scrollWidth ?? 0)\n ? undefined\n : availableWidth\n ? `${Math.max(0, availableWidth)}px`\n : undefined,\n }\n },\n })\n )\n }\n return arr\n})\nconst {update, floatingStyles} = useFloating(referenceElement, floatingElement, {\n placement: () => props.placement,\n middleware: floatingMiddleware as ComputedRef<Middleware[]>,\n strategy: toRef(() => props.strategy),\n})\n\nconst inButtonGroupAttributes = inButtonGroup\n ? {\n class: 'btn-group',\n role: 'group',\n }\n : undefined\n\nconst computedClasses = computed(() => [\n inButtonGroupAttributes?.class,\n props.wrapperClass,\n {\n 'btn-group': !props.wrapperClass && props.split,\n [`drop${resolveBootstrapCaret(props.placement)}`]: !props.wrapperClass,\n 'position-static': props.boundary !== 'clippingAncestors' && !props.isNav,\n },\n])\n\nconst buttonClasses = computed(() => [\n props.split ? props.splitClass : props.toggleClass,\n {\n 'nav-link': props.isNav,\n 'dropdown-toggle': !props.split,\n 'dropdown-toggle-no-caret': props.noCaret && !props.split,\n 'show': props.split ? undefined : showRef.value,\n },\n])\n\nconst onButtonClick = () => {\n toggle()\n}\n\nconst onSplitClick = (event: Readonly<MouseEvent>) => {\n if (props.split) {\n emit('split-click', event)\n return\n }\n onButtonClick()\n}\n\nonClickOutside(\n floatingElement,\n () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'outside')) {\n hide()\n }\n },\n {ignore: [button, splitButton]}\n)\nconst onClickInside = () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'inside')) {\n hide()\n }\n}\n\nwatch(isVisible, () => {\n update()\n})\n\ndefineExpose({\n hide,\n show,\n toggle,\n})\n\nprovide(dropdownInjectionKey, {\n id: computedId,\n show,\n hide,\n toggle,\n visible: readonly(showRef),\n isNav: toRef(() => props.isNav),\n})\n</script>\n"],"names":["_props","__props","props","useDefaults","emit","__emit","computedId","useId","id","modelValue","_useModel","inInputGroup","inject","inputGroupKey","inButtonGroup","buttonGroupKey","computedOffset","computed","offset","Number","NaN","offsetToNumber","useToNumber","floatingElement","useTemplateRef","button","splitButton","boundary","isBoundary","rootBoundary","isRootBoundary","referenceElement","split","value","cleanup","showRef","renderRef","hide","show","toggle","computedNoAnimation","transitionProps","contentShowing","isVisible","useShowHide","showFn","update","nextTick","autoUpdate","animationFrame","hideFn","computedMenuClasses","fade","onKeyStroke","getElement","focus","target","keynav","e","v","contains","closest","test","tagName","preventDefault","loop","setInterval","clearInterval","list","querySelectorAll","document","activeElement","active","querySelector","index","Array","prototype","indexOf","call","length","sizeStyles","ref","floatingMiddleware","localOffset","arr","offsetMiddleware","noFlip","push","flip","padding","boundaryPadding","noShift","shift","noSize","sizeMiddleware","apply","availableWidth","availableHeight","maxHeight","scrollHeight","Math","max","maxWidth","scrollWidth","floatingStyles","useFloating","placement","middleware","strategy","toRef","inButtonGroupAttributes","class","role","computedClasses","wrapperClass","resolveBootstrapCaret","isNav","buttonClasses","splitClass","toggleClass","noCaret","onButtonClick","onSplitClick","event","onClickOutside","autoClose","ignore","onClickInside","watch","__expose","provide","dropdownInjectionKey","visible","readonly","_createBlock","ConditionalWrapper","skip","_unref","noWrapper","_createVNode","BButton","variant","splitVariant","size","disabled","splitDisabled","type","splitButtonType","ariaLabel","href","splitHref","icon","to","splitTo","onClick","_renderSlot","_ctx","_createTextVNode","_toDisplayString","text","_createElementVNode","_hoisted_1","toggleText","ConditionalTeleport","teleportTo","teleportDisabled","_Transition","_mergeProps","key","appear","style","_normalizeStyle","menuClass","$slots","click"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BDropdown.vue_vue_type_script_setup_true_lang-DRMdWPlp.js","sources":["../src/components/BDropdown/BDropdown.vue"],"sourcesContent":["<template>\n <ConditionalWrapper\n :skip=\"inInputGroup || props.noWrapper\"\n :class=\"computedClasses\"\n :role=\"inButtonGroupAttributes?.role\"\n >\n <BButton\n :id=\"computedId\"\n ref=\"_splitButton\"\n :variant=\"props.splitVariant || props.variant\"\n :size=\"props.size\"\n :class=\"buttonClasses\"\n :disabled=\"props.splitDisabled || props.disabled\"\n :type=\"props.splitButtonType\"\n :aria-label=\"props.ariaLabel\"\n :aria-expanded=\"props.split ? undefined : showRef\"\n :aria-haspopup=\"props.split ? undefined : 'menu'\"\n :href=\"props.split ? props.splitHref : undefined\"\n :icon=\"props.icon\"\n :to=\"props.split && props.splitTo ? props.splitTo : undefined\"\n @click=\"onSplitClick\"\n >\n <slot name=\"button-content\"> {{ props.text }} </slot>\n </BButton>\n <BButton\n v-if=\"props.split\"\n :id=\"computedId + '-split'\"\n ref=\"_button\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :class=\"[props.toggleClass, {show: showRef}]\"\n class=\"dropdown-toggle-split dropdown-toggle\"\n :aria-expanded=\"showRef\"\n aria-haspopup=\"menu\"\n @click=\"onButtonClick\"\n >\n <span class=\"visually-hidden\">\n <slot name=\"toggle-text\">\n {{ props.toggleText }}\n </slot>\n </span>\n </BButton>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"!props.teleportTo || props.teleportDisabled\"\n >\n <Transition\n v-if=\"renderRef || contentShowing\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <ul\n v-show=\"showRef\"\n :id=\"computedId + '-menu'\"\n ref=\"_floating\"\n :style=\"[floatingStyles, sizeStyles, {display: showRef ? 'block' : 'none'}]\"\n class=\"dropdown-menu overflow-auto\"\n :class=\"[props.menuClass, computedMenuClasses]\"\n :aria-labelledby=\"computedId\"\n :role=\"props.role\"\n @click=\"onClickInside\"\n >\n <slot\n v-if=\"contentShowing\"\n :id=\"computedId\"\n :hide=\"hide\"\n :show=\"show\"\n :visible=\"showRef\"\n :click=\"onClickInside\"\n :toggle=\"onButtonClick\"\n :active=\"showRef\"\n />\n </ul>\n </Transition>\n </ConditionalTeleport>\n </ConditionalWrapper>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n autoUpdate,\n type Boundary,\n flip,\n type Middleware,\n offset as offsetMiddleware,\n type ReferenceElement,\n type RootBoundary,\n shift,\n size as sizeMiddleware,\n useFloating,\n} from '@floating-ui/vue'\nimport {onClickOutside, onKeyStroke, useToNumber} from '@vueuse/core'\nimport {\n computed,\n type ComputedRef,\n type CSSProperties,\n type EmitFn,\n inject,\n nextTick,\n provide,\n readonly,\n ref,\n toRef,\n useTemplateRef,\n watch,\n} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {BDropdownProps} from '../../types/ComponentProps'\nimport type {BDropdownEmits} from '../../types/ComponentEmits'\nimport BButton from '../BButton/BButton.vue'\nimport ConditionalWrapper from '../ConditionalWrapper.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {isBoundary, isRootBoundary, resolveBootstrapCaret} from '../../utils/floatingUi'\nimport {getElement} from '../../utils/getElement'\nimport {buttonGroupKey, dropdownInjectionKey, inputGroupKey} from '../../utils/keys'\nimport {useShowHide} from '../../composables/useShowHide'\nimport type {BDropdownSlots} from '../../types'\n\nconst _props = withDefaults(defineProps<Omit<BDropdownProps, 'modelValue'>>(), {\n ariaLabel: undefined,\n autoClose: true,\n boundary: 'clippingAncestors',\n boundaryPadding: undefined,\n teleportTo: undefined,\n teleportDisabled: false,\n disabled: false,\n floatingMiddleware: undefined,\n icon: false,\n id: undefined,\n initialAnimation: false,\n isNav: false,\n lazy: false,\n menuClass: undefined,\n noCaret: false,\n noFade: false,\n noFlip: false,\n noShift: false,\n noSize: false,\n offset: 0,\n unmountLazy: false,\n role: 'menu',\n size: 'md',\n noWrapper: false,\n split: false,\n splitButtonType: 'button',\n splitClass: undefined,\n splitDisabled: undefined,\n splitHref: undefined,\n splitTo: undefined,\n placement: 'bottom-start',\n splitVariant: undefined,\n strategy: 'absolute',\n text: undefined,\n show: false,\n toggleClass: undefined,\n toggleText: 'Toggle dropdown',\n transProps: undefined,\n variant: 'secondary',\n visible: false,\n wrapperClass: undefined,\n})\nconst props = useDefaults(_props, 'BDropdown')\nconst emit = defineEmits<BDropdownEmits>()\ndefineSlots<BDropdownSlots>()\n\nconst computedId = useId(() => props.id, 'dropdown')\n\nconst modelValue = defineModel<Exclude<BDropdownProps['modelValue'], undefined>>({default: false})\n\nconst inInputGroup = inject(inputGroupKey, false)\nconst inButtonGroup = inject(buttonGroupKey, false)\n\nconst computedOffset = computed(() =>\n typeof props.offset === 'string' || typeof props.offset === 'number' ? props.offset : Number.NaN\n)\nconst offsetToNumber = useToNumber(computedOffset)\n\nconst floatingElement = useTemplateRef<HTMLUListElement | null>('_floating')\nconst button = useTemplateRef<HTMLElement | null>('_button')\nconst splitButton = useTemplateRef<HTMLElement | null>('_splitButton')\n\nconst boundary = computed<Boundary | undefined>(() =>\n isBoundary(props.boundary) ? props.boundary : undefined\n)\nconst rootBoundary = computed<RootBoundary | undefined>(() =>\n isRootBoundary(props.boundary) ? props.boundary : undefined\n)\n\nconst referenceElement = computed(() => (!props.split ? splitButton.value : button.value))\nlet cleanup: ReturnType<typeof autoUpdate> | undefined\n\nconst {\n showRef,\n renderRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n transitionProps,\n contentShowing,\n isVisible,\n} = useShowHide(modelValue, props, emit as EmitFn, referenceElement, computedId, {\n showFn: () => {\n update()\n nextTick(() => {\n cleanup = autoUpdate(\n referenceElement.value as ReferenceElement,\n floatingElement.value as HTMLElement,\n update,\n {\n animationFrame: false,\n }\n )\n })\n },\n hideFn: () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n },\n})\n\nconst computedMenuClasses = computed(() => [\n {\n show: isVisible.value,\n fade: !computedNoAnimation.value,\n },\n])\n\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: referenceElement}\n)\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: floatingElement}\n)\n\nconst keynav = (e: Readonly<Event>, v: number) => {\n if (floatingElement.value?.contains((e.target as HTMLElement)?.closest('form'))) return\n if (/input|select|option|textarea|form/i.test((e.target as HTMLElement)?.tagName)) return\n e.preventDefault()\n if (!showRef.value) {\n show()\n const loop = setInterval(() => {\n if (isVisible.value) {\n clearInterval(loop)\n nextTick(() => keynav(e, v))\n }\n }, 16)\n return\n }\n const list = floatingElement.value?.querySelectorAll(\n '.dropdown-item:not(.disabled):not(:disabled)'\n )\n if (!list) return\n if (floatingElement.value?.contains(document.activeElement)) {\n const active = floatingElement.value.querySelector('.dropdown-item:focus')\n const index = Array.prototype.indexOf.call(list, active) + v\n if (index >= 0 && index < list?.length) (list[index] as HTMLElement)?.focus()\n } else {\n ;(list[v === -1 ? list.length - 1 : 0] as HTMLElement)?.focus()\n }\n}\n\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: referenceElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: referenceElement})\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: floatingElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: floatingElement})\n\nconst sizeStyles = ref<CSSProperties>({})\nconst floatingMiddleware = computed<readonly Middleware[]>(() => {\n if (props.floatingMiddleware !== undefined) {\n return props.floatingMiddleware\n }\n const localOffset =\n typeof props.offset === 'string' || typeof props.offset === 'number'\n ? offsetToNumber.value\n : props.offset\n const arr: Middleware[] = [offsetMiddleware(localOffset)]\n if (props.noFlip === false) {\n arr.push(\n flip({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noShift === false) {\n arr.push(\n shift({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noSize === false) {\n arr.push(\n sizeMiddleware({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n apply({availableWidth, availableHeight}) {\n sizeStyles.value = {\n maxHeight:\n availableHeight >= (floatingElement.value?.scrollHeight ?? 0)\n ? undefined\n : availableHeight\n ? `${Math.max(0, availableHeight)}px`\n : undefined,\n maxWidth:\n availableWidth >= (floatingElement.value?.scrollWidth ?? 0)\n ? undefined\n : availableWidth\n ? `${Math.max(0, availableWidth)}px`\n : undefined,\n }\n },\n })\n )\n }\n return arr\n})\nconst {update, floatingStyles} = useFloating(referenceElement, floatingElement, {\n placement: () => props.placement,\n middleware: floatingMiddleware as ComputedRef<Middleware[]>,\n strategy: toRef(() => props.strategy),\n})\n\nconst inButtonGroupAttributes = inButtonGroup\n ? {\n class: 'btn-group',\n role: 'group',\n }\n : undefined\n\nconst computedClasses = computed(() => [\n inButtonGroupAttributes?.class,\n props.wrapperClass,\n {\n 'btn-group': !props.wrapperClass && props.split,\n [`drop${resolveBootstrapCaret(props.placement)}`]: !props.wrapperClass,\n 'position-static': props.boundary !== 'clippingAncestors' && !props.isNav,\n },\n])\n\nconst buttonClasses = computed(() => [\n props.split ? props.splitClass : props.toggleClass,\n {\n 'nav-link': props.isNav,\n 'dropdown-toggle': !props.split,\n 'dropdown-toggle-no-caret': props.noCaret && !props.split,\n 'show': props.split ? undefined : showRef.value,\n },\n])\n\nconst onButtonClick = () => {\n toggle()\n}\n\nconst onSplitClick = (event: Readonly<MouseEvent>) => {\n if (props.split) {\n emit('split-click', event)\n return\n }\n onButtonClick()\n}\n\nonClickOutside(\n floatingElement,\n () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'outside')) {\n hide()\n }\n },\n {ignore: [button, splitButton]}\n)\nconst onClickInside = () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'inside')) {\n hide()\n }\n}\n\nwatch(isVisible, () => {\n update()\n})\n\ndefineExpose({\n hide,\n show,\n toggle,\n})\n\nprovide(dropdownInjectionKey, {\n id: computedId,\n show,\n hide,\n toggle,\n visible: readonly(showRef),\n isNav: toRef(() => props.isNav),\n})\n</script>\n"],"names":["_props","__props","props","useDefaults","emit","__emit","computedId","useId","id","modelValue","_useModel","inInputGroup","inject","inputGroupKey","inButtonGroup","buttonGroupKey","computedOffset","computed","offset","Number","NaN","offsetToNumber","useToNumber","floatingElement","useTemplateRef","button","splitButton","boundary","isBoundary","rootBoundary","isRootBoundary","referenceElement","split","value","cleanup","showRef","renderRef","hide","show","toggle","computedNoAnimation","transitionProps","contentShowing","isVisible","useShowHide","showFn","update","nextTick","autoUpdate","animationFrame","hideFn","computedMenuClasses","fade","onKeyStroke","getElement","focus","target","keynav","e","v","contains","closest","test","tagName","preventDefault","loop","setInterval","clearInterval","list","querySelectorAll","document","activeElement","active","querySelector","index","Array","prototype","indexOf","call","length","sizeStyles","ref","floatingMiddleware","localOffset","arr","offsetMiddleware","noFlip","push","flip","padding","boundaryPadding","noShift","shift","noSize","sizeMiddleware","apply","availableWidth","availableHeight","maxHeight","scrollHeight","Math","max","maxWidth","scrollWidth","floatingStyles","useFloating","placement","middleware","strategy","toRef","inButtonGroupAttributes","class","role","computedClasses","wrapperClass","resolveBootstrapCaret","isNav","buttonClasses","splitClass","toggleClass","noCaret","onButtonClick","onSplitClick","event","onClickOutside","autoClose","ignore","onClickInside","watch","__expose","provide","dropdownInjectionKey","visible","readonly","_createBlock","ConditionalWrapper","skip","_unref","noWrapper","_createVNode","BButton","variant","splitVariant","size","disabled","splitDisabled","type","splitButtonType","ariaLabel","href","splitHref","icon","to","splitTo","onClick","_renderSlot","_ctx","_createTextVNode","_toDisplayString","text","_createElementVNode","_hoisted_1","toggleText","ConditionalTeleport","teleportTo","teleportDisabled","_Transition","_mergeProps","key","appear","style","_normalizeStyle","menuClass","$slots","click"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineComponent as e,mergeModels as a,useModel as t,inject as o,computed as l,useTemplateRef as i,ref as s,toRef as d,watch as n,provide as r,readonly as p,createBlock as u,openBlock as f,unref as v,normalizeClass as g,withCtx as m,createVNode as c,createCommentVNode as y,renderSlot as b,createTextVNode as h,toDisplayString as w,createElementVNode as B,Transition as _,mergeProps as C,withDirectives as x,normalizeStyle as k,vShow as T,nextTick as j}from"vue";import{i as z,a as A,o as D,f as N,s as S,b as F,u as H,r as M,c as P}from"./floatingUi-
|
|
2
|
-
//# sourceMappingURL=BDropdown.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import{defineComponent as e,mergeModels as a,useModel as t,inject as o,computed as l,useTemplateRef as i,ref as s,toRef as d,watch as n,provide as r,readonly as p,createBlock as u,openBlock as f,unref as v,normalizeClass as g,withCtx as m,createVNode as c,createCommentVNode as y,renderSlot as b,createTextVNode as h,toDisplayString as w,createElementVNode as B,Transition as _,mergeProps as C,withDirectives as x,normalizeStyle as k,vShow as T,nextTick as j}from"vue";import{i as z,a as A,o as D,f as N,s as S,b as F,u as H,r as M,c as P}from"./floatingUi-C_sODraS.mjs";import{o as V,a as W}from"./index-Ddq_OcxM.mjs";import{u as $}from"./useDefaults-C9d4iJX7.mjs";import{u as E}from"./useId-Dth2TyyG.mjs";import{_ as I}from"./BButton.vue_vue_type_script_setup_true_lang-Dnz-A1_v.mjs";import{_ as L}from"./ConditionalWrapper.vue_vue_type_script_lang-BqF-hPiY.mjs";import{_ as R}from"./ConditionalTeleport.vue_vue_type_script_lang-CQlzMNc_.mjs";import{g as U}from"./getElement-xDgQdUkC.mjs";import{i as q,b as O,d as G}from"./keys-DiEDpjjR.mjs";import{u as J}from"./useShowHide-rO7x91Im.mjs";import{u as K}from"./index-D4cKGJ0C.mjs";const Q={class:"visually-hidden"},X=["id","aria-labelledby","role"],Y=/* @__PURE__ */e({__name:"BDropdown",props:/* @__PURE__ */a({ariaLabel:{default:void 0},autoClose:{type:[Boolean,String],default:!0},boundary:{default:"clippingAncestors"},boundaryPadding:{default:void 0},disabled:{type:Boolean,default:!1},floatingMiddleware:{default:void 0},icon:{type:Boolean,default:!1},id:{default:void 0},isNav:{type:Boolean,default:!1},menuClass:{default:void 0},noCaret:{type:Boolean,default:!1},noFlip:{type:Boolean,default:!1},noShift:{type:Boolean,default:!1},noSize:{type:Boolean,default:!1},offset:{default:0},role:{default:"menu"},size:{default:"md"},noWrapper:{type:Boolean,default:!1},split:{type:Boolean,default:!1},splitButtonType:{default:"button"},splitClass:{default:void 0},splitDisabled:{type:Boolean,default:void 0},splitHref:{default:void 0},splitTo:{default:void 0},splitVariant:{default:void 0},strategy:{default:"absolute"},text:{default:void 0},toggleClass:{default:void 0},toggleText:{default:"Toggle dropdown"},variant:{default:"secondary"},wrapperClass:{default:void 0},placement:{default:"bottom-start"},teleportDisabled:{type:Boolean,default:!1},teleportTo:{default:void 0},initialAnimation:{type:Boolean,default:!1},noAnimation:{type:Boolean},noFade:{type:Boolean,default:!1},lazy:{type:Boolean,default:!1},unmountLazy:{type:Boolean,default:!1},show:{type:Boolean,default:!1},transProps:{default:void 0},visible:{type:Boolean,default:!1}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:/* @__PURE__ */a(["split-click","hide","hide-prevented","hidden","show","show-prevented","shown","toggle","toggle-prevented","cancel","ok"],["update:modelValue"]),setup(e,{expose:a,emit:Y}){const Z=$(e,"BDropdown"),ee=Y,ae=E(()=>Z.id,"dropdown"),te=t(e,"modelValue"),oe=o(q,!1),le=o(O,!1),ie=l(()=>"string"==typeof Z.offset||"number"==typeof Z.offset?Z.offset:Number.NaN),se=K(ie),de=i("_floating"),ne=i("_button"),re=i("_splitButton"),pe=l(()=>z(Z.boundary)?Z.boundary:void 0),ue=l(()=>A(Z.boundary)?Z.boundary:void 0),fe=l(()=>Z.split?ne.value:re.value);let ve;const{showRef:ge,renderRef:me,hide:ce,show:ye,toggle:be,computedNoAnimation:he,transitionProps:we,contentShowing:Be,isVisible:_e}=J(te,Z,ee,fe,ae,{showFn:()=>{je(),j(()=>{ve=P(fe.value,de.value,je,{animationFrame:!1})})},hideFn:()=>{ve&&(ve(),ve=void 0)}}),Ce=l(()=>[{show:_e.value,fade:!he.value}]);V("Escape",()=>{ce(),U(fe.value)?.focus()},{target:fe}),V("Escape",()=>{ce(),U(fe.value)?.focus()},{target:de});const xe=(e,a)=>{if(de.value?.contains(e.target?.closest("form")))return;if(/input|select|option|textarea|form/i.test(e.target?.tagName))return;if(e.preventDefault(),!ge.value){ye();const t=setInterval(()=>{_e.value&&(clearInterval(t),j(()=>xe(e,a)))},16);return}const t=de.value?.querySelectorAll(".dropdown-item:not(.disabled):not(:disabled)");if(t)if(de.value?.contains(document.activeElement)){const e=de.value.querySelector(".dropdown-item:focus"),o=Array.prototype.indexOf.call(t,e)+a;o>=0&&o<t?.length&&t[o]?.focus()}else t[-1===a?t.length-1:0]?.focus()};V("ArrowUp",e=>xe(e,-1),{target:fe}),V("ArrowDown",e=>xe(e,1),{target:fe}),V("ArrowUp",e=>xe(e,-1),{target:de}),V("ArrowDown",e=>xe(e,1),{target:de});const ke=s({}),Te=l(()=>{if(void 0!==Z.floatingMiddleware)return Z.floatingMiddleware;const e="string"==typeof Z.offset||"number"==typeof Z.offset?se.value:Z.offset,a=[D(e)];return!1===Z.noFlip&&a.push(N({boundary:pe.value,rootBoundary:ue.value,padding:Z.boundaryPadding})),!1===Z.noShift&&a.push(S({boundary:pe.value,rootBoundary:ue.value,padding:Z.boundaryPadding})),!1===Z.noSize&&a.push(F({boundary:pe.value,rootBoundary:ue.value,padding:Z.boundaryPadding,apply({availableWidth:e,availableHeight:a}){ke.value={maxHeight:a>=(de.value?.scrollHeight??0)?void 0:a?`${Math.max(0,a)}px`:void 0,maxWidth:e>=(de.value?.scrollWidth??0)?void 0:e?`${Math.max(0,e)}px`:void 0}}})),a}),{update:je,floatingStyles:ze}=H(fe,de,{placement:()=>Z.placement,middleware:Te,strategy:d(()=>Z.strategy)}),Ae=le?{class:"btn-group",role:"group"}:void 0,De=l(()=>[Ae?.class,Z.wrapperClass,{"btn-group":!Z.wrapperClass&&Z.split,[`drop${M(Z.placement)}`]:!Z.wrapperClass,"position-static":"clippingAncestors"!==Z.boundary&&!Z.isNav}]),Ne=l(()=>[Z.split?Z.splitClass:Z.toggleClass,{"nav-link":Z.isNav,"dropdown-toggle":!Z.split,"dropdown-toggle-no-caret":Z.noCaret&&!Z.split,show:Z.split?void 0:ge.value}]),Se=()=>{be()},Fe=e=>{Z.split?ee("split-click",e):Se()};W(de,()=>{!ge.value||!0!==Z.autoClose&&"outside"!==Z.autoClose||ce()},{ignore:[ne,re]});const He=()=>{!ge.value||!0!==Z.autoClose&&"inside"!==Z.autoClose||ce()};return n(_e,()=>{je()}),a({hide:ce,show:ye,toggle:be}),r(G,{id:ae,show:ye,hide:ce,toggle:be,visible:p(ge),isNav:d(()=>Z.isNav)}),(e,a)=>(f(),u(L,{skip:v(oe)||v(Z).noWrapper,class:g(De.value),role:v(Ae)?.role},{default:m(()=>[c(I,{id:v(ae),ref:"_splitButton",variant:v(Z).splitVariant||v(Z).variant,size:v(Z).size,class:g(Ne.value),disabled:v(Z).splitDisabled||v(Z).disabled,type:v(Z).splitButtonType,"aria-label":v(Z).ariaLabel,"aria-expanded":v(Z).split?void 0:v(ge),"aria-haspopup":v(Z).split?void 0:"menu",href:v(Z).split?v(Z).splitHref:void 0,icon:v(Z).icon,to:v(Z).split&&v(Z).splitTo?v(Z).splitTo:void 0,onClick:Fe},{default:m(()=>[b(e.$slots,"button-content",{},()=>[h(w(v(Z).text),1)])]),_:3},8,["id","variant","size","class","disabled","type","aria-label","aria-expanded","aria-haspopup","href","icon","to"]),v(Z).split?(f(),u(I,{key:0,id:v(ae)+"-split",ref:"_button",variant:v(Z).variant,size:v(Z).size,disabled:v(Z).disabled,class:g([[v(Z).toggleClass,{show:v(ge)}],"dropdown-toggle-split dropdown-toggle"]),"aria-expanded":v(ge),"aria-haspopup":"menu",onClick:Se},{default:m(()=>[B("span",Q,[b(e.$slots,"toggle-text",{},()=>[h(w(v(Z).toggleText),1)])])]),_:3},8,["id","variant","size","disabled","class","aria-expanded"])):y("",!0),c(R,{to:v(Z).teleportTo,disabled:!v(Z).teleportTo||v(Z).teleportDisabled},{default:m(()=>[v(me)||v(Be)?(f(),u(_,C({key:0},v(we),{appear:te.value||v(Z).visible}),{default:m(()=>[x(B("ul",{id:v(ae)+"-menu",ref:"_floating",style:k([v(ze),ke.value,{display:v(ge)?"block":"none"}]),class:g(["dropdown-menu overflow-auto",[v(Z).menuClass,Ce.value]]),"aria-labelledby":v(ae),role:v(Z).role,onClick:He},[v(Be)?b(e.$slots,"default",{key:0,id:v(ae),hide:v(ce),show:v(ye),visible:v(ge),click:He,toggle:Se,active:v(ge)}):y("",!0)],14,X),[[T,v(ge)]])]),_:3},16,["appear"])):y("",!0)]),_:3},8,["to","disabled"])]),_:3},8,["skip","class","role"]))}});export{Y as _};
|
|
2
|
+
//# sourceMappingURL=BDropdown.vue_vue_type_script_setup_true_lang-c0BxCMGB.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BDropdown.vue_vue_type_script_setup_true_lang-DLUeuZ9X.mjs","sources":["../src/components/BDropdown/BDropdown.vue"],"sourcesContent":["<template>\n <ConditionalWrapper\n :skip=\"inInputGroup || props.noWrapper\"\n :class=\"computedClasses\"\n :role=\"inButtonGroupAttributes?.role\"\n >\n <BButton\n :id=\"computedId\"\n ref=\"_splitButton\"\n :variant=\"props.splitVariant || props.variant\"\n :size=\"props.size\"\n :class=\"buttonClasses\"\n :disabled=\"props.splitDisabled || props.disabled\"\n :type=\"props.splitButtonType\"\n :aria-label=\"props.ariaLabel\"\n :aria-expanded=\"props.split ? undefined : showRef\"\n :aria-haspopup=\"props.split ? undefined : 'menu'\"\n :href=\"props.split ? props.splitHref : undefined\"\n :icon=\"props.icon\"\n :to=\"props.split && props.splitTo ? props.splitTo : undefined\"\n @click=\"onSplitClick\"\n >\n <slot name=\"button-content\"> {{ props.text }} </slot>\n </BButton>\n <BButton\n v-if=\"props.split\"\n :id=\"computedId + '-split'\"\n ref=\"_button\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :class=\"[props.toggleClass, {show: showRef}]\"\n class=\"dropdown-toggle-split dropdown-toggle\"\n :aria-expanded=\"showRef\"\n aria-haspopup=\"menu\"\n @click=\"onButtonClick\"\n >\n <span class=\"visually-hidden\">\n <slot name=\"toggle-text\">\n {{ props.toggleText }}\n </slot>\n </span>\n </BButton>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"!props.teleportTo || props.teleportDisabled\"\n >\n <Transition\n v-if=\"renderRef || contentShowing\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <ul\n v-show=\"showRef\"\n :id=\"computedId + '-menu'\"\n ref=\"_floating\"\n :style=\"[floatingStyles, sizeStyles, {display: showRef ? 'block' : 'none'}]\"\n class=\"dropdown-menu overflow-auto\"\n :class=\"[props.menuClass, computedMenuClasses]\"\n :aria-labelledby=\"computedId\"\n :role=\"props.role\"\n @click=\"onClickInside\"\n >\n <slot\n v-if=\"contentShowing\"\n :id=\"computedId\"\n :hide=\"hide\"\n :show=\"show\"\n :visible=\"showRef\"\n :click=\"onClickInside\"\n :toggle=\"onButtonClick\"\n :active=\"showRef\"\n />\n </ul>\n </Transition>\n </ConditionalTeleport>\n </ConditionalWrapper>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n autoUpdate,\n type Boundary,\n flip,\n type Middleware,\n offset as offsetMiddleware,\n type ReferenceElement,\n type RootBoundary,\n shift,\n size as sizeMiddleware,\n useFloating,\n} from '@floating-ui/vue'\nimport {onClickOutside, onKeyStroke, useToNumber} from '@vueuse/core'\nimport {\n computed,\n type ComputedRef,\n type CSSProperties,\n type EmitFn,\n inject,\n nextTick,\n provide,\n readonly,\n ref,\n toRef,\n useTemplateRef,\n watch,\n} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {BDropdownProps} from '../../types/ComponentProps'\nimport type {BDropdownEmits} from '../../types/ComponentEmits'\nimport BButton from '../BButton/BButton.vue'\nimport ConditionalWrapper from '../ConditionalWrapper.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {isBoundary, isRootBoundary, resolveBootstrapCaret} from '../../utils/floatingUi'\nimport {getElement} from '../../utils/getElement'\nimport {buttonGroupKey, dropdownInjectionKey, inputGroupKey} from '../../utils/keys'\nimport {useShowHide} from '../../composables/useShowHide'\nimport type {BDropdownSlots} from '../../types'\n\nconst _props = withDefaults(defineProps<Omit<BDropdownProps, 'modelValue'>>(), {\n ariaLabel: undefined,\n autoClose: true,\n boundary: 'clippingAncestors',\n boundaryPadding: undefined,\n teleportTo: undefined,\n teleportDisabled: false,\n disabled: false,\n floatingMiddleware: undefined,\n icon: false,\n id: undefined,\n initialAnimation: false,\n isNav: false,\n lazy: false,\n menuClass: undefined,\n noCaret: false,\n noFade: false,\n noFlip: false,\n noShift: false,\n noSize: false,\n offset: 0,\n unmountLazy: false,\n role: 'menu',\n size: 'md',\n noWrapper: false,\n split: false,\n splitButtonType: 'button',\n splitClass: undefined,\n splitDisabled: undefined,\n splitHref: undefined,\n splitTo: undefined,\n placement: 'bottom-start',\n splitVariant: undefined,\n strategy: 'absolute',\n text: undefined,\n show: false,\n toggleClass: undefined,\n toggleText: 'Toggle dropdown',\n transProps: undefined,\n variant: 'secondary',\n visible: false,\n wrapperClass: undefined,\n})\nconst props = useDefaults(_props, 'BDropdown')\nconst emit = defineEmits<BDropdownEmits>()\ndefineSlots<BDropdownSlots>()\n\nconst computedId = useId(() => props.id, 'dropdown')\n\nconst modelValue = defineModel<Exclude<BDropdownProps['modelValue'], undefined>>({default: false})\n\nconst inInputGroup = inject(inputGroupKey, false)\nconst inButtonGroup = inject(buttonGroupKey, false)\n\nconst computedOffset = computed(() =>\n typeof props.offset === 'string' || typeof props.offset === 'number' ? props.offset : Number.NaN\n)\nconst offsetToNumber = useToNumber(computedOffset)\n\nconst floatingElement = useTemplateRef<HTMLUListElement | null>('_floating')\nconst button = useTemplateRef<HTMLElement | null>('_button')\nconst splitButton = useTemplateRef<HTMLElement | null>('_splitButton')\n\nconst boundary = computed<Boundary | undefined>(() =>\n isBoundary(props.boundary) ? props.boundary : undefined\n)\nconst rootBoundary = computed<RootBoundary | undefined>(() =>\n isRootBoundary(props.boundary) ? props.boundary : undefined\n)\n\nconst referenceElement = computed(() => (!props.split ? splitButton.value : button.value))\nlet cleanup: ReturnType<typeof autoUpdate> | undefined\n\nconst {\n showRef,\n renderRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n transitionProps,\n contentShowing,\n isVisible,\n} = useShowHide(modelValue, props, emit as EmitFn, referenceElement, computedId, {\n showFn: () => {\n update()\n nextTick(() => {\n cleanup = autoUpdate(\n referenceElement.value as ReferenceElement,\n floatingElement.value as HTMLElement,\n update,\n {\n animationFrame: false,\n }\n )\n })\n },\n hideFn: () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n },\n})\n\nconst computedMenuClasses = computed(() => [\n {\n show: isVisible.value,\n fade: !computedNoAnimation.value,\n },\n])\n\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: referenceElement}\n)\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: floatingElement}\n)\n\nconst keynav = (e: Readonly<Event>, v: number) => {\n if (floatingElement.value?.contains((e.target as HTMLElement)?.closest('form'))) return\n if (/input|select|option|textarea|form/i.test((e.target as HTMLElement)?.tagName)) return\n e.preventDefault()\n if (!showRef.value) {\n show()\n const loop = setInterval(() => {\n if (isVisible.value) {\n clearInterval(loop)\n nextTick(() => keynav(e, v))\n }\n }, 16)\n return\n }\n const list = floatingElement.value?.querySelectorAll(\n '.dropdown-item:not(.disabled):not(:disabled)'\n )\n if (!list) return\n if (floatingElement.value?.contains(document.activeElement)) {\n const active = floatingElement.value.querySelector('.dropdown-item:focus')\n const index = Array.prototype.indexOf.call(list, active) + v\n if (index >= 0 && index < list?.length) (list[index] as HTMLElement)?.focus()\n } else {\n ;(list[v === -1 ? list.length - 1 : 0] as HTMLElement)?.focus()\n }\n}\n\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: referenceElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: referenceElement})\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: floatingElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: floatingElement})\n\nconst sizeStyles = ref<CSSProperties>({})\nconst floatingMiddleware = computed<readonly Middleware[]>(() => {\n if (props.floatingMiddleware !== undefined) {\n return props.floatingMiddleware\n }\n const localOffset =\n typeof props.offset === 'string' || typeof props.offset === 'number'\n ? offsetToNumber.value\n : props.offset\n const arr: Middleware[] = [offsetMiddleware(localOffset)]\n if (props.noFlip === false) {\n arr.push(\n flip({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noShift === false) {\n arr.push(\n shift({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noSize === false) {\n arr.push(\n sizeMiddleware({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n apply({availableWidth, availableHeight}) {\n sizeStyles.value = {\n maxHeight:\n availableHeight >= (floatingElement.value?.scrollHeight ?? 0)\n ? undefined\n : availableHeight\n ? `${Math.max(0, availableHeight)}px`\n : undefined,\n maxWidth:\n availableWidth >= (floatingElement.value?.scrollWidth ?? 0)\n ? undefined\n : availableWidth\n ? `${Math.max(0, availableWidth)}px`\n : undefined,\n }\n },\n })\n )\n }\n return arr\n})\nconst {update, floatingStyles} = useFloating(referenceElement, floatingElement, {\n placement: () => props.placement,\n middleware: floatingMiddleware as ComputedRef<Middleware[]>,\n strategy: toRef(() => props.strategy),\n})\n\nconst inButtonGroupAttributes = inButtonGroup\n ? {\n class: 'btn-group',\n role: 'group',\n }\n : undefined\n\nconst computedClasses = computed(() => [\n inButtonGroupAttributes?.class,\n props.wrapperClass,\n {\n 'btn-group': !props.wrapperClass && props.split,\n [`drop${resolveBootstrapCaret(props.placement)}`]: !props.wrapperClass,\n 'position-static': props.boundary !== 'clippingAncestors' && !props.isNav,\n },\n])\n\nconst buttonClasses = computed(() => [\n props.split ? props.splitClass : props.toggleClass,\n {\n 'nav-link': props.isNav,\n 'dropdown-toggle': !props.split,\n 'dropdown-toggle-no-caret': props.noCaret && !props.split,\n 'show': props.split ? undefined : showRef.value,\n },\n])\n\nconst onButtonClick = () => {\n toggle()\n}\n\nconst onSplitClick = (event: Readonly<MouseEvent>) => {\n if (props.split) {\n emit('split-click', event)\n return\n }\n onButtonClick()\n}\n\nonClickOutside(\n floatingElement,\n () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'outside')) {\n hide()\n }\n },\n {ignore: [button, splitButton]}\n)\nconst onClickInside = () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'inside')) {\n hide()\n }\n}\n\nwatch(isVisible, () => {\n update()\n})\n\ndefineExpose({\n hide,\n show,\n toggle,\n})\n\nprovide(dropdownInjectionKey, {\n id: computedId,\n show,\n hide,\n toggle,\n visible: readonly(showRef),\n isNav: toRef(() => props.isNav),\n})\n</script>\n"],"names":["props","useDefaults","__props","emit","__emit","computedId","useId","id","modelValue","_useModel","inInputGroup","inject","inputGroupKey","inButtonGroup","buttonGroupKey","computedOffset","computed","offset","Number","NaN","offsetToNumber","useToNumber","floatingElement","useTemplateRef","button","splitButton","boundary","isBoundary","rootBoundary","isRootBoundary","referenceElement","split","value","cleanup","showRef","renderRef","hide","show","toggle","computedNoAnimation","transitionProps","contentShowing","isVisible","useShowHide","showFn","update","nextTick","autoUpdate","animationFrame","hideFn","computedMenuClasses","fade","onKeyStroke","getElement","focus","target","keynav","e","v","contains","closest","test","tagName","preventDefault","loop","setInterval","clearInterval","list","querySelectorAll","document","activeElement","active","querySelector","index","Array","prototype","indexOf","call","length","sizeStyles","ref","floatingMiddleware","localOffset","arr","offsetMiddleware","noFlip","push","flip","padding","boundaryPadding","noShift","shift","noSize","sizeMiddleware","apply","availableWidth","availableHeight","maxHeight","scrollHeight","Math","max","maxWidth","scrollWidth","floatingStyles","useFloating","placement","middleware","strategy","toRef","inButtonGroupAttributes","class","role","computedClasses","wrapperClass","resolveBootstrapCaret","isNav","buttonClasses","splitClass","toggleClass","noCaret","onButtonClick","onSplitClick","event","onClickOutside","autoClose","ignore","onClickInside","watch","__expose","provide","dropdownInjectionKey","visible","readonly","_createBlock","ConditionalWrapper","skip","_unref","noWrapper","_createVNode","BButton","variant","splitVariant","size","disabled","splitDisabled","type","splitButtonType","ariaLabel","href","splitHref","icon","to","splitTo","onClick","_renderSlot","_ctx","_createTextVNode","_toDisplayString","text","_createElementVNode","_hoisted_1","toggleText","ConditionalTeleport","teleportTo","teleportDisabled","_Transition","_mergeProps","key","appear","style","_normalizeStyle","menuClass","$slots","click"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BDropdown.vue_vue_type_script_setup_true_lang-c0BxCMGB.mjs","sources":["../src/components/BDropdown/BDropdown.vue"],"sourcesContent":["<template>\n <ConditionalWrapper\n :skip=\"inInputGroup || props.noWrapper\"\n :class=\"computedClasses\"\n :role=\"inButtonGroupAttributes?.role\"\n >\n <BButton\n :id=\"computedId\"\n ref=\"_splitButton\"\n :variant=\"props.splitVariant || props.variant\"\n :size=\"props.size\"\n :class=\"buttonClasses\"\n :disabled=\"props.splitDisabled || props.disabled\"\n :type=\"props.splitButtonType\"\n :aria-label=\"props.ariaLabel\"\n :aria-expanded=\"props.split ? undefined : showRef\"\n :aria-haspopup=\"props.split ? undefined : 'menu'\"\n :href=\"props.split ? props.splitHref : undefined\"\n :icon=\"props.icon\"\n :to=\"props.split && props.splitTo ? props.splitTo : undefined\"\n @click=\"onSplitClick\"\n >\n <slot name=\"button-content\"> {{ props.text }} </slot>\n </BButton>\n <BButton\n v-if=\"props.split\"\n :id=\"computedId + '-split'\"\n ref=\"_button\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :class=\"[props.toggleClass, {show: showRef}]\"\n class=\"dropdown-toggle-split dropdown-toggle\"\n :aria-expanded=\"showRef\"\n aria-haspopup=\"menu\"\n @click=\"onButtonClick\"\n >\n <span class=\"visually-hidden\">\n <slot name=\"toggle-text\">\n {{ props.toggleText }}\n </slot>\n </span>\n </BButton>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"!props.teleportTo || props.teleportDisabled\"\n >\n <Transition\n v-if=\"renderRef || contentShowing\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <ul\n v-show=\"showRef\"\n :id=\"computedId + '-menu'\"\n ref=\"_floating\"\n :style=\"[floatingStyles, sizeStyles, {display: showRef ? 'block' : 'none'}]\"\n class=\"dropdown-menu overflow-auto\"\n :class=\"[props.menuClass, computedMenuClasses]\"\n :aria-labelledby=\"computedId\"\n :role=\"props.role\"\n @click=\"onClickInside\"\n >\n <slot\n v-if=\"contentShowing\"\n :id=\"computedId\"\n :hide=\"hide\"\n :show=\"show\"\n :visible=\"showRef\"\n :click=\"onClickInside\"\n :toggle=\"onButtonClick\"\n :active=\"showRef\"\n />\n </ul>\n </Transition>\n </ConditionalTeleport>\n </ConditionalWrapper>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n autoUpdate,\n type Boundary,\n flip,\n type Middleware,\n offset as offsetMiddleware,\n type ReferenceElement,\n type RootBoundary,\n shift,\n size as sizeMiddleware,\n useFloating,\n} from '@floating-ui/vue'\nimport {onClickOutside, onKeyStroke, useToNumber} from '@vueuse/core'\nimport {\n computed,\n type ComputedRef,\n type CSSProperties,\n type EmitFn,\n inject,\n nextTick,\n provide,\n readonly,\n ref,\n toRef,\n useTemplateRef,\n watch,\n} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {BDropdownProps} from '../../types/ComponentProps'\nimport type {BDropdownEmits} from '../../types/ComponentEmits'\nimport BButton from '../BButton/BButton.vue'\nimport ConditionalWrapper from '../ConditionalWrapper.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {isBoundary, isRootBoundary, resolveBootstrapCaret} from '../../utils/floatingUi'\nimport {getElement} from '../../utils/getElement'\nimport {buttonGroupKey, dropdownInjectionKey, inputGroupKey} from '../../utils/keys'\nimport {useShowHide} from '../../composables/useShowHide'\nimport type {BDropdownSlots} from '../../types'\n\nconst _props = withDefaults(defineProps<Omit<BDropdownProps, 'modelValue'>>(), {\n ariaLabel: undefined,\n autoClose: true,\n boundary: 'clippingAncestors',\n boundaryPadding: undefined,\n teleportTo: undefined,\n teleportDisabled: false,\n disabled: false,\n floatingMiddleware: undefined,\n icon: false,\n id: undefined,\n initialAnimation: false,\n isNav: false,\n lazy: false,\n menuClass: undefined,\n noCaret: false,\n noFade: false,\n noFlip: false,\n noShift: false,\n noSize: false,\n offset: 0,\n unmountLazy: false,\n role: 'menu',\n size: 'md',\n noWrapper: false,\n split: false,\n splitButtonType: 'button',\n splitClass: undefined,\n splitDisabled: undefined,\n splitHref: undefined,\n splitTo: undefined,\n placement: 'bottom-start',\n splitVariant: undefined,\n strategy: 'absolute',\n text: undefined,\n show: false,\n toggleClass: undefined,\n toggleText: 'Toggle dropdown',\n transProps: undefined,\n variant: 'secondary',\n visible: false,\n wrapperClass: undefined,\n})\nconst props = useDefaults(_props, 'BDropdown')\nconst emit = defineEmits<BDropdownEmits>()\ndefineSlots<BDropdownSlots>()\n\nconst computedId = useId(() => props.id, 'dropdown')\n\nconst modelValue = defineModel<Exclude<BDropdownProps['modelValue'], undefined>>({default: false})\n\nconst inInputGroup = inject(inputGroupKey, false)\nconst inButtonGroup = inject(buttonGroupKey, false)\n\nconst computedOffset = computed(() =>\n typeof props.offset === 'string' || typeof props.offset === 'number' ? props.offset : Number.NaN\n)\nconst offsetToNumber = useToNumber(computedOffset)\n\nconst floatingElement = useTemplateRef<HTMLUListElement | null>('_floating')\nconst button = useTemplateRef<HTMLElement | null>('_button')\nconst splitButton = useTemplateRef<HTMLElement | null>('_splitButton')\n\nconst boundary = computed<Boundary | undefined>(() =>\n isBoundary(props.boundary) ? props.boundary : undefined\n)\nconst rootBoundary = computed<RootBoundary | undefined>(() =>\n isRootBoundary(props.boundary) ? props.boundary : undefined\n)\n\nconst referenceElement = computed(() => (!props.split ? splitButton.value : button.value))\nlet cleanup: ReturnType<typeof autoUpdate> | undefined\n\nconst {\n showRef,\n renderRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n transitionProps,\n contentShowing,\n isVisible,\n} = useShowHide(modelValue, props, emit as EmitFn, referenceElement, computedId, {\n showFn: () => {\n update()\n nextTick(() => {\n cleanup = autoUpdate(\n referenceElement.value as ReferenceElement,\n floatingElement.value as HTMLElement,\n update,\n {\n animationFrame: false,\n }\n )\n })\n },\n hideFn: () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n },\n})\n\nconst computedMenuClasses = computed(() => [\n {\n show: isVisible.value,\n fade: !computedNoAnimation.value,\n },\n])\n\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: referenceElement}\n)\nonKeyStroke(\n 'Escape',\n () => {\n hide()\n getElement(referenceElement.value)?.focus()\n },\n {target: floatingElement}\n)\n\nconst keynav = (e: Readonly<Event>, v: number) => {\n if (floatingElement.value?.contains((e.target as HTMLElement)?.closest('form'))) return\n if (/input|select|option|textarea|form/i.test((e.target as HTMLElement)?.tagName)) return\n e.preventDefault()\n if (!showRef.value) {\n show()\n const loop = setInterval(() => {\n if (isVisible.value) {\n clearInterval(loop)\n nextTick(() => keynav(e, v))\n }\n }, 16)\n return\n }\n const list = floatingElement.value?.querySelectorAll(\n '.dropdown-item:not(.disabled):not(:disabled)'\n )\n if (!list) return\n if (floatingElement.value?.contains(document.activeElement)) {\n const active = floatingElement.value.querySelector('.dropdown-item:focus')\n const index = Array.prototype.indexOf.call(list, active) + v\n if (index >= 0 && index < list?.length) (list[index] as HTMLElement)?.focus()\n } else {\n ;(list[v === -1 ? list.length - 1 : 0] as HTMLElement)?.focus()\n }\n}\n\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: referenceElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: referenceElement})\nonKeyStroke('ArrowUp', (e) => keynav(e, -1), {target: floatingElement})\nonKeyStroke('ArrowDown', (e) => keynav(e, 1), {target: floatingElement})\n\nconst sizeStyles = ref<CSSProperties>({})\nconst floatingMiddleware = computed<readonly Middleware[]>(() => {\n if (props.floatingMiddleware !== undefined) {\n return props.floatingMiddleware\n }\n const localOffset =\n typeof props.offset === 'string' || typeof props.offset === 'number'\n ? offsetToNumber.value\n : props.offset\n const arr: Middleware[] = [offsetMiddleware(localOffset)]\n if (props.noFlip === false) {\n arr.push(\n flip({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noShift === false) {\n arr.push(\n shift({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n })\n )\n }\n if (props.noSize === false) {\n arr.push(\n sizeMiddleware({\n boundary: boundary.value,\n rootBoundary: rootBoundary.value,\n padding: props.boundaryPadding,\n apply({availableWidth, availableHeight}) {\n sizeStyles.value = {\n maxHeight:\n availableHeight >= (floatingElement.value?.scrollHeight ?? 0)\n ? undefined\n : availableHeight\n ? `${Math.max(0, availableHeight)}px`\n : undefined,\n maxWidth:\n availableWidth >= (floatingElement.value?.scrollWidth ?? 0)\n ? undefined\n : availableWidth\n ? `${Math.max(0, availableWidth)}px`\n : undefined,\n }\n },\n })\n )\n }\n return arr\n})\nconst {update, floatingStyles} = useFloating(referenceElement, floatingElement, {\n placement: () => props.placement,\n middleware: floatingMiddleware as ComputedRef<Middleware[]>,\n strategy: toRef(() => props.strategy),\n})\n\nconst inButtonGroupAttributes = inButtonGroup\n ? {\n class: 'btn-group',\n role: 'group',\n }\n : undefined\n\nconst computedClasses = computed(() => [\n inButtonGroupAttributes?.class,\n props.wrapperClass,\n {\n 'btn-group': !props.wrapperClass && props.split,\n [`drop${resolveBootstrapCaret(props.placement)}`]: !props.wrapperClass,\n 'position-static': props.boundary !== 'clippingAncestors' && !props.isNav,\n },\n])\n\nconst buttonClasses = computed(() => [\n props.split ? props.splitClass : props.toggleClass,\n {\n 'nav-link': props.isNav,\n 'dropdown-toggle': !props.split,\n 'dropdown-toggle-no-caret': props.noCaret && !props.split,\n 'show': props.split ? undefined : showRef.value,\n },\n])\n\nconst onButtonClick = () => {\n toggle()\n}\n\nconst onSplitClick = (event: Readonly<MouseEvent>) => {\n if (props.split) {\n emit('split-click', event)\n return\n }\n onButtonClick()\n}\n\nonClickOutside(\n floatingElement,\n () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'outside')) {\n hide()\n }\n },\n {ignore: [button, splitButton]}\n)\nconst onClickInside = () => {\n if (showRef.value && (props.autoClose === true || props.autoClose === 'inside')) {\n hide()\n }\n}\n\nwatch(isVisible, () => {\n update()\n})\n\ndefineExpose({\n hide,\n show,\n toggle,\n})\n\nprovide(dropdownInjectionKey, {\n id: computedId,\n show,\n hide,\n toggle,\n visible: readonly(showRef),\n isNav: toRef(() => props.isNav),\n})\n</script>\n"],"names":["props","useDefaults","__props","emit","__emit","computedId","useId","id","modelValue","_useModel","inInputGroup","inject","inputGroupKey","inButtonGroup","buttonGroupKey","computedOffset","computed","offset","Number","NaN","offsetToNumber","useToNumber","floatingElement","useTemplateRef","button","splitButton","boundary","isBoundary","rootBoundary","isRootBoundary","referenceElement","split","value","cleanup","showRef","renderRef","hide","show","toggle","computedNoAnimation","transitionProps","contentShowing","isVisible","useShowHide","showFn","update","nextTick","autoUpdate","animationFrame","hideFn","computedMenuClasses","fade","onKeyStroke","getElement","focus","target","keynav","e","v","contains","closest","test","tagName","preventDefault","loop","setInterval","clearInterval","list","querySelectorAll","document","activeElement","active","querySelector","index","Array","prototype","indexOf","call","length","sizeStyles","ref","floatingMiddleware","localOffset","arr","offsetMiddleware","noFlip","push","flip","padding","boundaryPadding","noShift","shift","noSize","sizeMiddleware","apply","availableWidth","availableHeight","maxHeight","scrollHeight","Math","max","maxWidth","scrollWidth","floatingStyles","useFloating","placement","middleware","strategy","toRef","inButtonGroupAttributes","class","role","computedClasses","wrapperClass","resolveBootstrapCaret","isNav","buttonClasses","splitClass","toggleClass","noCaret","onButtonClick","onSplitClick","event","onClickOutside","autoClose","ignore","onClickInside","watch","__expose","provide","dropdownInjectionKey","visible","readonly","_createBlock","ConditionalWrapper","skip","_unref","noWrapper","_createVNode","BButton","variant","splitVariant","size","disabled","splitDisabled","type","splitButtonType","ariaLabel","href","splitHref","icon","to","splitTo","onClick","_renderSlot","_ctx","_createTextVNode","_toDisplayString","text","_createElementVNode","_hoisted_1","toggleText","ConditionalTeleport","teleportTo","teleportDisabled","_Transition","_mergeProps","key","appear","style","_normalizeStyle","menuClass","$slots","click"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("vue"),l=require("./index-8Vu3L2de.js"),t=require("./useDefaults-DspAih6L.js"),r=require("./useId-owZCNodL.js"),a=require("./useStateClass-B3zxUwpk.js"),o=require("./dom-Cbel14Rh.js"),i=["for"],u=["aria-disabled"],n=["id","disabled","aria-label","aria-labelledby"],d={class:"b-form-file-text"},s={key:0},c={key:1,class:"text-muted"},f={key:0,class:"b-form-file-drag-overlay"},p={class:"b-form-file-drag-text"},m=["name","form","multiple","disabled","required","accept","capture","directory","webkitdirectory"],v=["id","form","name","multiple","disabled","capture","accept","required","aria-label","aria-labelledby","aria-required","directory","webkitdirectory"],y={key:3,class:"b-form-file-display mt-2"},b={key:0,class:"small text-muted"},k={key:1,class:"small text-muted"},h={key:4,class:"visually-hidden","aria-live":"polite","aria-atomic":"true"},B=e.defineComponent({inheritAttrs:!1,__name:"BFormFile",props:e.mergeModels({ariaLabel:{default:void 0},ariaLabelledby:{default:void 0},accept:{default:""},autofocus:{type:Boolean,default:!1},browseText:{default:void 0},capture:{default:void 0},directory:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},dropPlaceholder:{default:void 0},fileNameFormatter:{type:Function,default:void 0},form:{default:void 0},id:{default:void 0},label:{default:""},labelClass:{default:void 0},multiple:{type:Boolean,default:!1},name:{default:void 0},noButton:{type:Boolean,default:!1},noDrop:{type:Boolean,default:!1},plain:{type:Boolean,default:!1},placeholder:{default:"No file chosen"},required:{type:Boolean,default:!1},showFileNames:{type:Boolean,default:!1},size:{default:void 0},state:{type:[Boolean,null],default:null}},{modelValue:{default:null},modelModifiers:{}}),emits:e.mergeModels(["change"],["update:modelValue"]),setup(B,{expose:g,emit:w}){const C=B,D=t.useDefaults(C,"BFormFile"),E=e.useSlots(),N=w,S=e.useModel(B,"modelValue"),x=e.useAttrs(),V=e.computed(()=>{if(D.plain)return{rootAttrs:{},dropZoneAttrs:{},inputAttrs:x};const{class:e,style:l,title:t,...r}=x,a={},o={};return void 0!==e&&(a.class=e),void 0!==l&&(a.style=l),void 0!==t&&(o.title=t),{rootAttrs:a,dropZoneAttrs:o,inputAttrs:r}}),q=r.useId(()=>D.id),A=a.useStateClass(()=>D.state),R=e.useTemplateRef("rootRef"),T=e.useTemplateRef("dropZoneRef"),F=e.useTemplateRef("browseButtonRef"),$=e.useTemplateRef("plainInputRef"),_=e.useTemplateRef("customInputRef"),z=e.computed(()=>"string"==typeof D.accept?D.accept:D.accept.join(",")),{open:L,reset:j,onChange:P}=l.useFileDialog({accept:z.value,multiple:D.multiple||D.directory,directory:D.directory,input:_}),{isOverDropZone:Z}=l.useDropZone(T,{onDrop:e=>{e&&!D.noDrop&&le(e)},multiple:D.multiple||D.directory}),I=e.computed(()=>!o.isEmptySlot(E.label)),M=e.computed(()=>!o.isEmptySlot(E.placeholder)),O=e.computed(()=>[A.value,{[`form-control-${D.size}`]:void 0!==D.size}]),W=e.computed(()=>["form-control",A.value,{[`form-control-${D.size}`]:void 0!==D.size}]),G=e.ref([]),H=e.computed(()=>G.value),J=e.computed(()=>H.value.length>0),K=e.computed(()=>H.value.map(e=>e.name)),Q=e.computed(()=>{if(!J.value)return"";if(D.fileNameFormatter)return D.fileNameFormatter(H.value);const e=K.value;return 1===e.length?e[0]:`${e.length} files selected`}),U=e.computed(()=>!D.plain&&D.showFileNames&&(J.value||D.placeholder)),X=e.computed(()=>{if(!J.value)return"";const e=H.value.length;return 1===e?`File selected: ${H.value[0].name}`:`${e} files selected`}),Y=e.computed(()=>D.browseText??"Browse"),ee=e.computed(()=>D.dropPlaceholder??"Drop files here..."),le=(l,t)=>{let r=[];if(t){const e=t.target;r=e.files?Array.from(e.files):[]}else if(r=Array.from(l).filter(e=>(e=>!z.value||z.value.split(",").map(e=>e.trim()).some(l=>{if(l.startsWith("."))return e.name.toLowerCase().endsWith(l.toLowerCase());if(!l.includes("*"))return e.type===l;const t=l.indexOf("/");if(-1===t)return!1;const r=l.slice(0,t);return"*"===r||e.type.startsWith(`${r}/`)}))(e)),_.value&&"undefined"!=typeof DataTransfer)try{const e=new DataTransfer;r.forEach(l=>e.items.add(l)),_.value.files=e.files}catch{}if(G.value=r,0===r.length)S.value=null;else if(D.directory||D.multiple)S.value=r;else{const[e]=r;S.value=e}e.nextTick(()=>{if(t)N("change",t);else{const e=new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{files:r,target:{files:r}}});Object.defineProperty(e,"files",{value:r,enumerable:!0}),N("change",e)}})},te=()=>{D.disabled||L({accept:z.value,multiple:D.multiple||D.directory,directory:D.directory})},re=()=>{D.disabled||te()},ae=e=>{const l=e.target;l.files&&le(l.files,e)};P(e=>{e&&le(e)});const oe=()=>{D.plain?$.value?.focus():F.value?.focus()};return e.onMounted(()=>{D.autofocus&&e.nextTick(()=>{oe()})}),e.watch(()=>D.autofocus,e=>{e&&oe()}),e.watch(S,e=>{null===e?(G.value=[],$.value&&($.value.value="")):Array.isArray(e)?G.value=e:G.value=[e]}),g({blur:()=>{D.plain?$.value?.blur():F.value?.blur()},element:e.computed(()=>D.plain?$.value:F.value),focus:oe,reset:()=>{G.value=[],S.value=null,j(),$.value&&($.value.value="")}}),(l,t)=>(e.openBlock(),e.createElementBlock("div",e.mergeProps({ref_key:"rootRef",ref:R},V.value.rootAttrs,{class:"b-form-file-root"}),[I.value||e.unref(D).label?(e.openBlock(),e.createElementBlock("label",{key:0,class:e.normalizeClass(["form-label",e.unref(D).labelClass]),for:e.unref(q)},[e.renderSlot(l.$slots,"label",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(D).label),1)])],10,i)):e.createCommentVNode("",!0),e.unref(D).plain?(e.openBlock(),e.createElementBlock("input",e.mergeProps({key:2,id:e.unref(q),ref_key:"plainInputRef",ref:$},V.value.inputAttrs,{type:"file",class:W.value,form:e.unref(D).form,name:e.unref(D).name,multiple:e.unref(D).multiple||e.unref(D).directory,disabled:e.unref(D).disabled,capture:e.unref(D).capture,accept:z.value||void 0,required:e.unref(D).required||void 0,"aria-label":e.unref(D).ariaLabel,"aria-labelledby":e.unref(D).ariaLabelledby,"aria-required":e.unref(D).required||void 0,directory:e.unref(D).directory,webkitdirectory:e.unref(D).directory,onChange:ae}),null,16,v)):(e.openBlock(),e.createElementBlock("div",e.mergeProps({key:1,ref_key:"dropZoneRef",ref:T},V.value.dropZoneAttrs,{class:["b-form-file-wrapper",{"b-form-file-dragging":e.unref(Z)&&!e.unref(D).noDrop,"b-form-file-has-files":J.value}]}),[e.createElementVNode("div",{class:e.normalizeClass(["b-form-file-control",O.value]),"aria-disabled":e.unref(D).disabled,onClick:re},[e.unref(D).noButton?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("button",{key:0,id:e.unref(q),ref_key:"browseButtonRef",ref:F,type:"button",class:"b-form-file-button",disabled:e.unref(D).disabled,"aria-label":e.unref(D).ariaLabel,"aria-labelledby":e.unref(D).ariaLabelledby,onClick:e.withModifiers(te,["stop"])},e.toDisplayString(Y.value),9,n)),e.createElementVNode("div",d,[e.renderSlot(l.$slots,"file-name",{files:H.value,names:K.value},()=>[J.value?(e.openBlock(),e.createElementBlock("span",s,e.toDisplayString(Q.value),1)):M.value||e.unref(D).placeholder?(e.openBlock(),e.createElementBlock("span",c,[e.renderSlot(l.$slots,"placeholder",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(D).placeholder),1)])])):e.createCommentVNode("",!0)])])],10,u),e.unref(Z)&&!e.unref(D).noDrop?(e.openBlock(),e.createElementBlock("div",f,[e.renderSlot(l.$slots,"drop-placeholder",{},()=>[e.createElementVNode("div",p,e.toDisplayString(ee.value),1)])])):e.createCommentVNode("",!0),e.createElementVNode("input",e.mergeProps({ref_key:"customInputRef",ref:_},V.value.inputAttrs,{type:"file",name:e.unref(D).name,form:e.unref(D).form,multiple:e.unref(D).multiple||e.unref(D).directory,disabled:e.unref(D).disabled,required:e.unref(D).required,accept:z.value||void 0,capture:e.unref(D).capture,directory:e.unref(D).directory,webkitdirectory:e.unref(D).directory,tabindex:"-1","aria-hidden":"true",style:{position:"absolute","z-index":"-5",width:"0",height:"0",opacity:"0",overflow:"hidden","pointer-events":"none"}}),null,16,m)],16)),U.value?(e.openBlock(),e.createElementBlock("div",y,[e.renderSlot(l.$slots,"file-name",{files:H.value,names:K.value},()=>[J.value?(e.openBlock(),e.createElementBlock("div",b,e.toDisplayString(Q.value),1)):M.value||e.unref(D).placeholder?(e.openBlock(),e.createElementBlock("div",k,[e.renderSlot(l.$slots,"placeholder",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(D).placeholder),1)])])):e.createCommentVNode("",!0)])])):e.createCommentVNode("",!0),e.unref(D).plain?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",h,e.toDisplayString(X.value),1))],16))}});exports._sfc_main=B;
|
|
2
|
-
//# sourceMappingURL=BFormFile.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
"use strict";const e=require("vue"),l=require("./index-8Vu3L2de.js"),t=require("./useDefaults-DspAih6L.js"),r=require("./useId-owZCNodL.js"),a=require("./useStateClass-B3zxUwpk.js"),o=require("./dom-Cbel14Rh.js"),i=["for"],u=["aria-disabled"],n=["id","disabled","aria-label","aria-labelledby"],d={class:"b-form-file-text"},s={key:0},c={key:1,class:"text-muted"},f={key:0,class:"b-form-file-drag-overlay"},p={class:"b-form-file-drag-text"},m=["name","form","multiple","disabled","required","accept","capture","directory","webkitdirectory"],v=["id","form","name","multiple","disabled","capture","accept","required","aria-label","aria-labelledby","aria-required","directory","webkitdirectory"],y={key:3,class:"b-form-file-display mt-2"},b={key:0,class:"small text-muted"},k={key:1,class:"small text-muted"},h={key:4,class:"visually-hidden","aria-live":"polite","aria-atomic":"true"},B=e.defineComponent({inheritAttrs:!1,__name:"BFormFile",props:e.mergeModels({ariaLabel:{default:void 0},ariaLabelledby:{default:void 0},accept:{default:""},autofocus:{type:Boolean,default:!1},browseText:{default:void 0},capture:{default:void 0},directory:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},dropPlaceholder:{default:void 0},fileNameFormatter:{type:Function,default:void 0},form:{default:void 0},id:{default:void 0},label:{default:""},labelClass:{default:void 0},multiple:{type:Boolean,default:!1},name:{default:void 0},noButton:{type:Boolean,default:!1},noDrop:{type:Boolean,default:!1},plain:{type:Boolean,default:!1},placeholder:{default:"No file chosen"},required:{type:Boolean,default:!1},showFileNames:{type:Boolean,default:!1},size:{default:void 0},state:{type:[Boolean,null],default:null}},{modelValue:{default:null},modelModifiers:{}}),emits:e.mergeModels(["change"],["update:modelValue"]),setup(B,{expose:g,emit:w}){const C=B,D=t.useDefaults(C,"BFormFile"),E=e.useSlots(),N=w,S=e.useModel(B,"modelValue"),x=e.useAttrs(),V=e.computed(()=>{if(D.plain)return{rootAttrs:{},dropZoneAttrs:{},inputAttrs:x};const{class:e,style:l,title:t,...r}=x,a={},o={};return void 0!==e&&(a.class=e),void 0!==l&&(a.style=l),void 0!==t&&(o.title=t),{rootAttrs:a,dropZoneAttrs:o,inputAttrs:r}}),q=r.useId(()=>D.id),A=a.useStateClass(()=>D.state),R=e.useTemplateRef("rootRef"),T=e.useTemplateRef("dropZoneRef"),F=e.useTemplateRef("browseButtonRef"),$=e.useTemplateRef("plainInputRef"),_=e.useTemplateRef("customInputRef"),z=e.computed(()=>"string"==typeof D.accept?D.accept:D.accept.join(",")),{open:L,reset:j,onChange:P}=l.useFileDialog({accept:z.value,multiple:D.multiple||D.directory,directory:D.directory,input:_}),{isOverDropZone:Z}=l.useDropZone(T,{onDrop:e=>{e&&!D.noDrop&&le(e)},multiple:D.multiple||D.directory}),I=e.computed(()=>!o.isEmptySlot(E.label)),M=e.computed(()=>!o.isEmptySlot(E.placeholder)),O=e.computed(()=>[A.value,{[`form-control-${D.size}`]:void 0!==D.size}]),W=e.computed(()=>["form-control",A.value,{[`form-control-${D.size}`]:void 0!==D.size}]),G=e.ref([]),H=e.computed(()=>G.value),J=e.computed(()=>H.value.length>0),K=e.computed(()=>H.value.map(e=>e.name)),Q=e.computed(()=>{if(!J.value)return"";if(D.fileNameFormatter)return D.fileNameFormatter(H.value);const e=K.value;return 1===e.length?e[0]:`${e.length} files selected`}),U=e.computed(()=>!D.plain&&D.showFileNames&&(J.value||D.placeholder)),X=e.computed(()=>{if(!J.value)return"";const e=H.value.length;return 1===e?`File selected: ${H.value[0].name}`:`${e} files selected`}),Y=e.computed(()=>D.browseText??"Browse"),ee=e.computed(()=>D.dropPlaceholder??"Drop files here..."),le=(l,t)=>{let r=[];if(t){const e=t.target;r=e.files?Array.from(e.files):[]}else if(r=Array.from(l).filter(e=>(e=>!z.value||z.value.split(",").map(e=>e.trim()).some(l=>{if(l.startsWith("."))return e.name.toLowerCase().endsWith(l.toLowerCase());if(!l.includes("*"))return e.type===l;const t=l.indexOf("/");if(-1===t)return!1;const r=l.slice(0,t);return"*"===r||e.type.startsWith(`${r}/`)}))(e)),_.value&&"undefined"!=typeof DataTransfer)try{const e=new DataTransfer;r.forEach(l=>e.items.add(l)),_.value.files=e.files}catch{}if(G.value=r,0===r.length)S.value=null;else if(D.directory||D.multiple)S.value=r;else{const[e]=r;S.value=e}e.nextTick(()=>{if(t)N("change",t);else{const e=new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{files:r,target:{files:r}}});Object.defineProperty(e,"files",{value:r,enumerable:!0}),N("change",e)}})},te=()=>{D.disabled||L({accept:z.value,multiple:D.multiple||D.directory,directory:D.directory})},re=()=>{D.disabled||te()},ae=e=>{const l=e.target;l.files&&le(l.files,e)};P(e=>{e&&le(e)});const oe=()=>{D.plain?$.value?.focus():F.value?.focus()};return e.onMounted(()=>{D.autofocus&&e.nextTick(()=>{oe()})}),e.watch(()=>D.autofocus,e=>{e&&oe()}),e.watch(S,e=>{null===e?(G.value=[],$.value&&($.value.value="")):Array.isArray(e)?G.value=e:G.value=[e]}),g({blur:()=>{D.plain?$.value?.blur():F.value?.blur()},element:e.computed(()=>D.plain?$.value:F.value),focus:oe,reset:()=>{G.value=[],S.value=null,j(),$.value&&($.value.value="")}}),(l,t)=>(e.openBlock(),e.createElementBlock("div",e.mergeProps({ref_key:"rootRef",ref:R},V.value.rootAttrs,{class:"b-form-file-root"}),[I.value||e.unref(D).label?(e.openBlock(),e.createElementBlock("label",{key:0,class:e.normalizeClass(["form-label",e.unref(D).labelClass]),for:e.unref(q)},[e.renderSlot(l.$slots,"label",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(D).label),1)])],10,i)):e.createCommentVNode("",!0),e.unref(D).plain?(e.openBlock(),e.createElementBlock("input",e.mergeProps({key:2,id:e.unref(q),ref_key:"plainInputRef",ref:$},V.value.inputAttrs,{type:"file",class:W.value,form:e.unref(D).form,name:e.unref(D).name,multiple:e.unref(D).multiple||e.unref(D).directory,disabled:e.unref(D).disabled,capture:e.unref(D).capture,accept:z.value||void 0,required:e.unref(D).required||void 0,"aria-label":e.unref(D).ariaLabel,"aria-labelledby":e.unref(D).ariaLabelledby,"aria-required":e.unref(D).required||void 0,directory:e.unref(D).directory||void 0,webkitdirectory:e.unref(D).directory||void 0,onChange:ae}),null,16,v)):(e.openBlock(),e.createElementBlock("div",e.mergeProps({key:1,ref_key:"dropZoneRef",ref:T},V.value.dropZoneAttrs,{class:["b-form-file-wrapper",{"b-form-file-dragging":e.unref(Z)&&!e.unref(D).noDrop,"b-form-file-has-files":J.value}]}),[e.createElementVNode("div",{class:e.normalizeClass(["b-form-file-control",O.value]),"aria-disabled":e.unref(D).disabled,onClick:re},[e.unref(D).noButton?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("button",{key:0,id:e.unref(q),ref_key:"browseButtonRef",ref:F,type:"button",class:"b-form-file-button",disabled:e.unref(D).disabled,"aria-label":e.unref(D).ariaLabel,"aria-labelledby":e.unref(D).ariaLabelledby,onClick:e.withModifiers(te,["stop"])},e.toDisplayString(Y.value),9,n)),e.createElementVNode("div",d,[e.renderSlot(l.$slots,"file-name",{files:H.value,names:K.value},()=>[J.value?(e.openBlock(),e.createElementBlock("span",s,e.toDisplayString(Q.value),1)):M.value||e.unref(D).placeholder?(e.openBlock(),e.createElementBlock("span",c,[e.renderSlot(l.$slots,"placeholder",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(D).placeholder),1)])])):e.createCommentVNode("",!0)])])],10,u),e.unref(Z)&&!e.unref(D).noDrop?(e.openBlock(),e.createElementBlock("div",f,[e.renderSlot(l.$slots,"drop-placeholder",{},()=>[e.createElementVNode("div",p,e.toDisplayString(ee.value),1)])])):e.createCommentVNode("",!0),e.createElementVNode("input",e.mergeProps({ref_key:"customInputRef",ref:_},V.value.inputAttrs,{type:"file",name:e.unref(D).name,form:e.unref(D).form,multiple:e.unref(D).multiple||e.unref(D).directory,disabled:e.unref(D).disabled,required:e.unref(D).required,accept:z.value||void 0,capture:e.unref(D).capture,directory:e.unref(D).directory||void 0,webkitdirectory:e.unref(D).directory||void 0,tabindex:"-1","aria-hidden":"true",style:{position:"absolute","z-index":"-5",width:"0",height:"0",opacity:"0",overflow:"hidden","pointer-events":"none"}}),null,16,m)],16)),U.value?(e.openBlock(),e.createElementBlock("div",y,[e.renderSlot(l.$slots,"file-name",{files:H.value,names:K.value},()=>[J.value?(e.openBlock(),e.createElementBlock("div",b,e.toDisplayString(Q.value),1)):M.value||e.unref(D).placeholder?(e.openBlock(),e.createElementBlock("div",k,[e.renderSlot(l.$slots,"placeholder",{},()=>[e.createTextVNode(e.toDisplayString(e.unref(D).placeholder),1)])])):e.createCommentVNode("",!0)])])):e.createCommentVNode("",!0),e.unref(D).plain?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",h,e.toDisplayString(X.value),1))],16))}});exports._sfc_main=B;
|
|
2
|
+
//# sourceMappingURL=BFormFile.vue_vue_type_script_setup_true_lang-CA61Ck_m.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BFormFile.vue_vue_type_script_setup_true_lang-CA61Ck_m.js","sources":["../src/components/BFormFile/BFormFile.vue"],"sourcesContent":["<template>\n <div ref=\"rootRef\" v-bind=\"processedAttrs.rootAttrs\" class=\"b-form-file-root\">\n <!-- Optional label -->\n <label\n v-if=\"hasLabelSlot || props.label\"\n class=\"form-label\"\n :class=\"props.labelClass\"\n :for=\"computedId\"\n >\n <slot name=\"label\">\n {{ props.label }}\n </slot>\n </label>\n\n <!-- Drop zone wrapper -->\n <div\n v-if=\"!props.plain\"\n ref=\"dropZoneRef\"\n v-bind=\"processedAttrs.dropZoneAttrs\"\n class=\"b-form-file-wrapper\"\n :class=\"{\n 'b-form-file-dragging': isOverDropZone && !props.noDrop,\n 'b-form-file-has-files': hasFiles,\n }\"\n >\n <!-- Custom file control (mimics Bootstrap native input) -->\n <div\n class=\"b-form-file-control\"\n :class=\"computedClasses\"\n :aria-disabled=\"props.disabled\"\n @click=\"handleControlClick\"\n >\n <!-- Custom browse button (now on LEFT to match Bootstrap v5) -->\n <button\n v-if=\"!props.noButton\"\n :id=\"computedId\"\n ref=\"browseButtonRef\"\n type=\"button\"\n class=\"b-form-file-button\"\n :disabled=\"props.disabled\"\n :aria-label=\"props.ariaLabel\"\n :aria-labelledby=\"props.ariaLabelledby\"\n @click.stop=\"openFileDialog\"\n >\n {{ effectiveBrowseText }}\n </button>\n\n <!-- File name display -->\n <div class=\"b-form-file-text\">\n <slot name=\"file-name\" :files=\"selectedFiles\" :names=\"fileNames\">\n <span v-if=\"hasFiles\">{{ formattedFileNames }}</span>\n <span v-else-if=\"hasPlaceholderSlot || props.placeholder\" class=\"text-muted\">\n <slot name=\"placeholder\">{{ props.placeholder }}</slot>\n </span>\n </slot>\n </div>\n </div>\n\n <!-- Drag overlay (only shown when dragging) -->\n <div v-if=\"isOverDropZone && !props.noDrop\" class=\"b-form-file-drag-overlay\">\n <slot name=\"drop-placeholder\">\n <div class=\"b-form-file-drag-text\">\n {{ effectiveDropPlaceholder }}\n </div>\n </slot>\n </div>\n\n <!-- Hidden input for form submission (positioned behind UI with z-index) -->\n <input\n ref=\"customInputRef\"\n v-bind=\"processedAttrs.inputAttrs\"\n type=\"file\"\n :name=\"props.name\"\n :form=\"props.form\"\n :multiple=\"props.multiple || props.directory\"\n :disabled=\"props.disabled\"\n :required=\"props.required\"\n :accept=\"computedAccept || undefined\"\n :capture=\"props.capture\"\n :directory=\"props.directory || undefined\"\n :webkitdirectory=\"props.directory || undefined\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n style=\"\n position: absolute;\n z-index: -5;\n width: 0;\n height: 0;\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n \"\n />\n </div>\n\n <!-- Plain mode - simple native input -->\n <input\n v-else\n :id=\"computedId\"\n ref=\"plainInputRef\"\n v-bind=\"processedAttrs.inputAttrs\"\n type=\"file\"\n :class=\"computedPlainClasses\"\n :form=\"props.form\"\n :name=\"props.name\"\n :multiple=\"props.multiple || props.directory\"\n :disabled=\"props.disabled\"\n :capture=\"props.capture\"\n :accept=\"computedAccept || undefined\"\n :required=\"props.required || undefined\"\n :aria-label=\"props.ariaLabel\"\n :aria-labelledby=\"props.ariaLabelledby\"\n :aria-required=\"props.required || undefined\"\n :directory=\"props.directory || undefined\"\n :webkitdirectory=\"props.directory || undefined\"\n @change=\"onPlainChange\"\n />\n\n <!-- External file display (when showFileNames is true and not plain) -->\n <div v-if=\"showExternalDisplay\" class=\"b-form-file-display mt-2\">\n <slot name=\"file-name\" :files=\"selectedFiles\" :names=\"fileNames\">\n <div v-if=\"hasFiles\" class=\"small text-muted\">\n {{ formattedFileNames }}\n </div>\n <div v-else-if=\"hasPlaceholderSlot || props.placeholder\" class=\"small text-muted\">\n <slot name=\"placeholder\">\n {{ props.placeholder }}\n </slot>\n </div>\n </slot>\n </div>\n\n <!-- ARIA live region for screen reader announcements -->\n <div v-if=\"!props.plain\" class=\"visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ ariaLiveMessage }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {useDropZone, useFileDialog} from '@vueuse/core'\nimport {computed, nextTick, onMounted, ref, type Ref, useAttrs, useTemplateRef, watch} from 'vue'\nimport type {BFormFileProps} from '../../types/ComponentProps'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useStateClass} from '../../composables/useStateClass'\nimport {isEmptySlot} from '../../utils/dom'\nimport type {BFormFileSlots} from '../../types'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BFormFileProps, 'modelValue'>>(), {\n ariaLabel: undefined,\n ariaLabelledby: undefined,\n accept: '',\n autofocus: false,\n browseText: undefined,\n capture: undefined,\n directory: false,\n disabled: false,\n dropPlaceholder: undefined,\n fileNameFormatter: undefined,\n form: undefined,\n id: undefined,\n label: '',\n labelClass: undefined,\n multiple: false,\n name: undefined,\n noButton: false,\n noDrop: false,\n plain: false,\n placeholder: 'No file chosen',\n required: false,\n showFileNames: false,\n size: undefined,\n state: null,\n})\nconst props = useDefaults(_props, 'BFormFile')\nconst slots = defineSlots<BFormFileSlots>()\n\nconst emit = defineEmits<{\n change: [value: Event]\n}>()\n\nconst modelValue = defineModel<Exclude<BFormFileProps['modelValue'], undefined>>({\n default: null,\n})\n\nconst attrs = useAttrs()\n\nconst processedAttrs = computed(() => {\n // In plain mode, pass all attributes to the input element\n if (props.plain) {\n return {\n rootAttrs: {},\n dropZoneAttrs: {},\n inputAttrs: attrs,\n }\n }\n // In custom mode, split attributes:\n // - class/style go to root (for layout/positioning)\n // - title goes to drop zone (for tooltip on interactive element)\n // - everything else goes to hidden input (for form functionality)\n const {class: rootClass, style: rootStyle, title: dropZoneTitle, ...inputAttrs} = attrs\n const rootAttrs: Record<string, unknown> = {}\n const dropZoneAttrs: Record<string, unknown> = {}\n if (rootClass !== undefined) rootAttrs.class = rootClass\n if (rootStyle !== undefined) rootAttrs.style = rootStyle\n if (dropZoneTitle !== undefined) dropZoneAttrs.title = dropZoneTitle\n return {\n rootAttrs,\n dropZoneAttrs,\n inputAttrs,\n }\n})\n\nconst computedId = useId(() => props.id)\nconst stateClass = useStateClass(() => props.state)\n\n// Refs\nconst rootRef = useTemplateRef('rootRef')\nconst dropZoneRef = useTemplateRef('dropZoneRef')\nconst browseButtonRef = useTemplateRef('browseButtonRef')\nconst plainInputRef = useTemplateRef<HTMLInputElement>('plainInputRef')\nconst customInputRef = useTemplateRef<HTMLInputElement>('customInputRef')\n\n// Computed accept for file type validation\nconst computedAccept = computed(() =>\n typeof props.accept === 'string' ? props.accept : props.accept.join(',')\n)\n\n// VueUse file dialog (uses our hidden input element)\nconst {\n open,\n reset: resetDialog,\n onChange: onDialogChange,\n} = useFileDialog({\n accept: computedAccept.value,\n multiple: props.multiple || props.directory,\n directory: props.directory,\n input: customInputRef as unknown as Ref<HTMLInputElement>,\n})\n\n// VueUse drop zone (replaces manual drag/drop)\n// Note: We don't pass dataTypes because the accept attribute handles validation\n// and there is no reliable way to get MIME types from in all browsers\n// https://github.com/vueuse/vueuse/issues/4523\nconst {isOverDropZone} = useDropZone(dropZoneRef, {\n onDrop: (files) => {\n if (files && !props.noDrop) {\n handleFiles(files)\n }\n },\n multiple: props.multiple || props.directory,\n})\n\n// Computed properties\nconst hasLabelSlot = computed(() => !isEmptySlot(slots.label))\nconst hasPlaceholderSlot = computed(() => !isEmptySlot(slots.placeholder))\n\nconst computedClasses = computed(() => [\n stateClass.value,\n {\n [`form-control-${props.size}`]: props.size !== undefined,\n },\n])\n\nconst computedPlainClasses = computed(() => [\n 'form-control',\n stateClass.value,\n {\n [`form-control-${props.size}`]: props.size !== undefined,\n },\n])\n\n// Selected files (from dialog or managed state)\nconst internalFiles = ref<readonly File[]>([])\n\nconst selectedFiles = computed<readonly File[]>(() => internalFiles.value)\n\nconst hasFiles = computed(() => selectedFiles.value.length > 0)\n\nconst fileNames = computed(() => selectedFiles.value.map((file) => file.name))\n\nconst formattedFileNames = computed(() => {\n if (!hasFiles.value) return ''\n if (props.fileNameFormatter) {\n return props.fileNameFormatter(selectedFiles.value)\n }\n const names = fileNames.value\n if (names.length === 1) return names[0]\n return `${names.length} files selected`\n})\n\nconst showExternalDisplay = computed(\n () => !props.plain && props.showFileNames && (hasFiles.value || props.placeholder)\n)\n\n// ARIA live region message for accessibility\nconst ariaLiveMessage = computed(() => {\n if (!hasFiles.value) return ''\n const count = selectedFiles.value.length\n if (count === 1) {\n return `File selected: ${selectedFiles.value[0].name}`\n }\n return `${count} files selected`\n})\n\nconst effectiveBrowseText = computed(() => props.browseText ?? 'Browse')\nconst effectiveDropPlaceholder = computed(() => props.dropPlaceholder ?? 'Drop files here...')\n\n// Validate file against accept criteria\nconst isFileAccepted = (file: File): boolean => {\n if (!computedAccept.value) return true\n\n const acceptTypes = computedAccept.value.split(',').map((type) => type.trim())\n\n return acceptTypes.some((acceptType) => {\n // Extension match (e.g., .pdf)\n if (acceptType.startsWith('.')) {\n return file.name.toLowerCase().endsWith(acceptType.toLowerCase())\n }\n // Exact MIME type match (e.g., image/png)\n if (!acceptType.includes('*')) {\n return file.type === acceptType\n }\n // Wildcard MIME type match (e.g., image/* or */*)\n const slashIndex = acceptType.indexOf('/')\n if (slashIndex === -1) {\n // Malformed wildcard pattern (no '/'): do not match anything\n return false\n }\n const category = acceptType.slice(0, slashIndex)\n // */* should match any MIME type\n if (category === '*') {\n return true\n }\n return file.type.startsWith(`${category}/`)\n })\n}\n\n// File handling\nconst handleFiles = (files: File[] | FileList, nativeEvent?: Event) => {\n let fileArray: File[] = []\n\n if (nativeEvent) {\n // Plain mode: read from the event target (browser already filtered via accept)\n const input = nativeEvent.target as HTMLInputElement\n fileArray = input.files ? Array.from(input.files) : []\n } else {\n // Custom mode (drag & drop or file dialog): manually filter and set on hidden input\n fileArray = Array.from(files).filter((file) => isFileAccepted(file))\n if (customInputRef.value && typeof DataTransfer !== 'undefined') {\n try {\n const dataTransfer = new DataTransfer()\n fileArray.forEach((file) => dataTransfer.items.add(file))\n customInputRef.value.files = dataTransfer.files\n } catch {\n // In environments where DataTransfer is not fully supported, skip syncing files on the input\n }\n }\n }\n\n // Update internal state\n internalFiles.value = fileArray\n\n // Update model value\n if (fileArray.length === 0) {\n modelValue.value = null\n } else if (props.directory || props.multiple) {\n modelValue.value = fileArray\n } else {\n const [firstFile] = fileArray\n modelValue.value = firstFile\n }\n\n // Emit change event in nextTick to ensure DOM updates\n // In plain mode: forward the native event (has target.files)\n // In custom mode: create CustomEvent with files in detail\n nextTick(() => {\n if (nativeEvent) {\n // Plain mode: forward native event\n emit('change', nativeEvent)\n } else {\n // Custom mode: create CustomEvent with files\n const changeEvent = new CustomEvent('change', {\n bubbles: true,\n cancelable: false,\n detail: {\n files: fileArray,\n target: {files: fileArray},\n },\n })\n // Also attach files directly for easier access\n Object.defineProperty(changeEvent, 'files', {\n value: fileArray,\n enumerable: true,\n })\n emit('change', changeEvent)\n }\n })\n}\n\n// Open file dialog\nconst openFileDialog = () => {\n if (!props.disabled) {\n open({\n accept: computedAccept.value,\n multiple: props.multiple || props.directory,\n directory: props.directory,\n })\n }\n}\n\n// Handle click on control wrapper (make entire control clickable like Bootstrap v5)\nconst handleControlClick = () => {\n // Don't trigger if clicking the button itself (button has its own handler with .stop)\n // Don't trigger if disabled\n if (!props.disabled) {\n openFileDialog()\n }\n}\n\n// Plain mode change handler\nconst onPlainChange = (e: Event) => {\n const input = e.target as HTMLInputElement\n if (input.files) {\n handleFiles(input.files, e) // Pass native event\n }\n}\n\n// Watch dialog files from useFileDialog\nonDialogChange((files) => {\n if (files) {\n handleFiles(files)\n }\n})\n\n// Reset method\nconst reset = () => {\n internalFiles.value = []\n modelValue.value = null\n resetDialog() // This resets the hidden input in custom mode\n if (plainInputRef.value) {\n plainInputRef.value.value = ''\n }\n}\n\n// Focus management\nconst focus = () => {\n if (props.plain) {\n plainInputRef.value?.focus()\n } else {\n browseButtonRef.value?.focus()\n }\n}\n\nconst blur = () => {\n if (props.plain) {\n plainInputRef.value?.blur()\n } else {\n browseButtonRef.value?.blur()\n }\n}\n\n// Autofocus support - initial focus on mount\nonMounted(() => {\n if (props.autofocus) {\n nextTick(() => {\n focus()\n })\n }\n})\n\n// Autofocus support - runtime prop changes\nwatch(\n () => props.autofocus,\n (autofocus) => {\n if (autofocus) {\n focus()\n }\n }\n)\n\n// Watch modelValue changes from parent\nwatch(modelValue, (newValue) => {\n if (newValue === null) {\n internalFiles.value = []\n if (plainInputRef.value) {\n plainInputRef.value.value = ''\n }\n } else if (Array.isArray(newValue)) {\n internalFiles.value = newValue as readonly File[]\n } else {\n internalFiles.value = [newValue] as readonly File[]\n }\n})\n\ndefineExpose({\n blur,\n element: computed(() => (props.plain ? plainInputRef.value : browseButtonRef.value)),\n focus,\n reset,\n})\n</script>\n"],"names":["_props","__props","props","useDefaults","slots","_useSlots","emit","__emit","modelValue","_useModel","attrs","useAttrs","processedAttrs","computed","plain","rootAttrs","dropZoneAttrs","inputAttrs","class","rootClass","style","rootStyle","title","dropZoneTitle","computedId","useId","id","stateClass","useStateClass","state","rootRef","useTemplateRef","dropZoneRef","browseButtonRef","plainInputRef","customInputRef","computedAccept","accept","join","open","reset","resetDialog","onChange","onDialogChange","useFileDialog","value","multiple","directory","input","isOverDropZone","useDropZone","onDrop","files","noDrop","handleFiles","hasLabelSlot","isEmptySlot","label","hasPlaceholderSlot","placeholder","computedClasses","size","computedPlainClasses","internalFiles","ref","selectedFiles","hasFiles","length","fileNames","map","file","name","formattedFileNames","fileNameFormatter","names","showExternalDisplay","showFileNames","ariaLiveMessage","count","effectiveBrowseText","browseText","effectiveDropPlaceholder","dropPlaceholder","nativeEvent","fileArray","target","Array","from","filter","split","type","trim","some","acceptType","startsWith","toLowerCase","endsWith","includes","slashIndex","indexOf","category","slice","isFileAccepted","DataTransfer","dataTransfer","forEach","items","add","firstFile","nextTick","changeEvent","CustomEvent","bubbles","cancelable","detail","Object","defineProperty","enumerable","openFileDialog","disabled","handleControlClick","onPlainChange","e","focus","onMounted","autofocus","watch","newValue","isArray","__expose","blur","element","_openBlock","_createElementBlock","_mergeProps","_unref","_normalizeClass","labelClass","for","_renderSlot","_ctx","_createTextVNode","_toDisplayString","form","capture","required","ariaLabel","ariaLabelledby","webkitdirectory","_createElementVNode","onClick","noButton","_hoisted_3","_hoisted_4","$slots","_hoisted_6","_hoisted_7","_hoisted_8","tabindex","position","width","height","opacity","overflow","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineComponent as e,mergeModels as l,useSlots as a,useModel as t,useAttrs as r,computed as o,useTemplateRef as i,ref as u,onMounted as s,nextTick as d,watch as n,createElementBlock as f,openBlock as c,mergeProps as p,createCommentVNode as
|
|
2
|
-
//# sourceMappingURL=BFormFile.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import{defineComponent as e,mergeModels as l,useSlots as a,useModel as t,useAttrs as r,computed as o,useTemplateRef as i,ref as u,onMounted as s,nextTick as d,watch as n,createElementBlock as f,openBlock as c,mergeProps as p,createCommentVNode as v,unref as m,normalizeClass as b,renderSlot as y,createTextVNode as h,toDisplayString as k,createElementVNode as g,withModifiers as w}from"vue";import{u as B,b as A}from"./index-Ddq_OcxM.mjs";import{u as x}from"./useDefaults-C9d4iJX7.mjs";import{u as $}from"./useId-Dth2TyyG.mjs";import{u as F}from"./useStateClass-DW1fxL8J.mjs";import{i as q}from"./dom-BbjUGBm6.mjs";const C=["for"],D=["aria-disabled"],R=["id","disabled","aria-label","aria-labelledby"],L={class:"b-form-file-text"},_={key:0},j={key:1,class:"text-muted"},z={key:0,class:"b-form-file-drag-overlay"},N={class:"b-form-file-drag-text"},Z=["name","form","multiple","disabled","required","accept","capture","directory","webkitdirectory"],I=["id","form","name","multiple","disabled","capture","accept","required","aria-label","aria-labelledby","aria-required","directory","webkitdirectory"],T={key:3,class:"b-form-file-display mt-2"},O={key:0,class:"small text-muted"},P={key:1,class:"small text-muted"},V={key:4,class:"visually-hidden","aria-live":"polite","aria-atomic":"true"},W=/* @__PURE__ */e({inheritAttrs:!1,__name:"BFormFile",props:/* @__PURE__ */l({ariaLabel:{default:void 0},ariaLabelledby:{default:void 0},accept:{default:""},autofocus:{type:Boolean,default:!1},browseText:{default:void 0},capture:{default:void 0},directory:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},dropPlaceholder:{default:void 0},fileNameFormatter:{type:Function,default:void 0},form:{default:void 0},id:{default:void 0},label:{default:""},labelClass:{default:void 0},multiple:{type:Boolean,default:!1},name:{default:void 0},noButton:{type:Boolean,default:!1},noDrop:{type:Boolean,default:!1},plain:{type:Boolean,default:!1},placeholder:{default:"No file chosen"},required:{type:Boolean,default:!1},showFileNames:{type:Boolean,default:!1},size:{default:void 0},state:{type:[Boolean,null],default:null}},{modelValue:{default:null},modelModifiers:{}}),emits:/* @__PURE__ */l(["change"],["update:modelValue"]),setup(e,{expose:l,emit:W}){const E=x(e,"BFormFile"),M=a(),S=W,G=t(e,"modelValue"),H=r(),J=o(()=>{if(E.plain)return{rootAttrs:{},dropZoneAttrs:{},inputAttrs:H};const{class:e,style:l,title:a,...t}=H,r={},o={};return void 0!==e&&(r.class=e),void 0!==l&&(r.style=l),void 0!==a&&(o.title=a),{rootAttrs:r,dropZoneAttrs:o,inputAttrs:t}}),K=$(()=>E.id),Q=F(()=>E.state),U=i("rootRef"),X=i("dropZoneRef"),Y=i("browseButtonRef"),ee=i("plainInputRef"),le=i("customInputRef"),ae=o(()=>"string"==typeof E.accept?E.accept:E.accept.join(",")),{open:te,reset:re,onChange:oe}=B({accept:ae.value,multiple:E.multiple||E.directory,directory:E.directory,input:le}),{isOverDropZone:ie}=A(X,{onDrop:e=>{e&&!E.noDrop&&ge(e)},multiple:E.multiple||E.directory}),ue=o(()=>!q(M.label)),se=o(()=>!q(M.placeholder)),de=o(()=>[Q.value,{[`form-control-${E.size}`]:void 0!==E.size}]),ne=o(()=>["form-control",Q.value,{[`form-control-${E.size}`]:void 0!==E.size}]),fe=u([]),ce=o(()=>fe.value),pe=o(()=>ce.value.length>0),ve=o(()=>ce.value.map(e=>e.name)),me=o(()=>{if(!pe.value)return"";if(E.fileNameFormatter)return E.fileNameFormatter(ce.value);const e=ve.value;return 1===e.length?e[0]:`${e.length} files selected`}),be=o(()=>!E.plain&&E.showFileNames&&(pe.value||E.placeholder)),ye=o(()=>{if(!pe.value)return"";const e=ce.value.length;return 1===e?`File selected: ${ce.value[0].name}`:`${e} files selected`}),he=o(()=>E.browseText??"Browse"),ke=o(()=>E.dropPlaceholder??"Drop files here..."),ge=(e,l)=>{let a=[];if(l){const e=l.target;a=e.files?Array.from(e.files):[]}else if(a=Array.from(e).filter(e=>(e=>!ae.value||ae.value.split(",").map(e=>e.trim()).some(l=>{if(l.startsWith("."))return e.name.toLowerCase().endsWith(l.toLowerCase());if(!l.includes("*"))return e.type===l;const a=l.indexOf("/");if(-1===a)return!1;const t=l.slice(0,a);return"*"===t||e.type.startsWith(`${t}/`)}))(e)),le.value&&"undefined"!=typeof DataTransfer)try{const e=new DataTransfer;a.forEach(l=>e.items.add(l)),le.value.files=e.files}catch{}if(fe.value=a,0===a.length)G.value=null;else if(E.directory||E.multiple)G.value=a;else{const[e]=a;G.value=e}d(()=>{if(l)S("change",l);else{const e=new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{files:a,target:{files:a}}});Object.defineProperty(e,"files",{value:a,enumerable:!0}),S("change",e)}})},we=()=>{E.disabled||te({accept:ae.value,multiple:E.multiple||E.directory,directory:E.directory})},Be=()=>{E.disabled||we()},Ae=e=>{const l=e.target;l.files&&ge(l.files,e)};oe(e=>{e&&ge(e)});const xe=()=>{E.plain?ee.value?.focus():Y.value?.focus()};return s(()=>{E.autofocus&&d(()=>{xe()})}),n(()=>E.autofocus,e=>{e&&xe()}),n(G,e=>{null===e?(fe.value=[],ee.value&&(ee.value.value="")):Array.isArray(e)?fe.value=e:fe.value=[e]}),l({blur:()=>{E.plain?ee.value?.blur():Y.value?.blur()},element:o(()=>E.plain?ee.value:Y.value),focus:xe,reset:()=>{fe.value=[],G.value=null,re(),ee.value&&(ee.value.value="")}}),(e,l)=>(c(),f("div",p({ref_key:"rootRef",ref:U},J.value.rootAttrs,{class:"b-form-file-root"}),[ue.value||m(E).label?(c(),f("label",{key:0,class:b(["form-label",m(E).labelClass]),for:m(K)},[y(e.$slots,"label",{},()=>[h(k(m(E).label),1)])],10,C)):v("",!0),m(E).plain?(c(),f("input",p({key:2,id:m(K),ref_key:"plainInputRef",ref:ee},J.value.inputAttrs,{type:"file",class:ne.value,form:m(E).form,name:m(E).name,multiple:m(E).multiple||m(E).directory,disabled:m(E).disabled,capture:m(E).capture,accept:ae.value||void 0,required:m(E).required||void 0,"aria-label":m(E).ariaLabel,"aria-labelledby":m(E).ariaLabelledby,"aria-required":m(E).required||void 0,directory:m(E).directory||void 0,webkitdirectory:m(E).directory||void 0,onChange:Ae}),null,16,I)):(c(),f("div",p({key:1,ref_key:"dropZoneRef",ref:X},J.value.dropZoneAttrs,{class:["b-form-file-wrapper",{"b-form-file-dragging":m(ie)&&!m(E).noDrop,"b-form-file-has-files":pe.value}]}),[g("div",{class:b(["b-form-file-control",de.value]),"aria-disabled":m(E).disabled,onClick:Be},[m(E).noButton?v("",!0):(c(),f("button",{key:0,id:m(K),ref_key:"browseButtonRef",ref:Y,type:"button",class:"b-form-file-button",disabled:m(E).disabled,"aria-label":m(E).ariaLabel,"aria-labelledby":m(E).ariaLabelledby,onClick:w(we,["stop"])},k(he.value),9,R)),g("div",L,[y(e.$slots,"file-name",{files:ce.value,names:ve.value},()=>[pe.value?(c(),f("span",_,k(me.value),1)):se.value||m(E).placeholder?(c(),f("span",j,[y(e.$slots,"placeholder",{},()=>[h(k(m(E).placeholder),1)])])):v("",!0)])])],10,D),m(ie)&&!m(E).noDrop?(c(),f("div",z,[y(e.$slots,"drop-placeholder",{},()=>[g("div",N,k(ke.value),1)])])):v("",!0),g("input",p({ref_key:"customInputRef",ref:le},J.value.inputAttrs,{type:"file",name:m(E).name,form:m(E).form,multiple:m(E).multiple||m(E).directory,disabled:m(E).disabled,required:m(E).required,accept:ae.value||void 0,capture:m(E).capture,directory:m(E).directory||void 0,webkitdirectory:m(E).directory||void 0,tabindex:"-1","aria-hidden":"true",style:{position:"absolute","z-index":"-5",width:"0",height:"0",opacity:"0",overflow:"hidden","pointer-events":"none"}}),null,16,Z)],16)),be.value?(c(),f("div",T,[y(e.$slots,"file-name",{files:ce.value,names:ve.value},()=>[pe.value?(c(),f("div",O,k(me.value),1)):se.value||m(E).placeholder?(c(),f("div",P,[y(e.$slots,"placeholder",{},()=>[h(k(m(E).placeholder),1)])])):v("",!0)])])):v("",!0),m(E).plain?v("",!0):(c(),f("div",V,k(ye.value),1))],16))}});export{W as _};
|
|
2
|
+
//# sourceMappingURL=BFormFile.vue_vue_type_script_setup_true_lang-DRpf0N3X.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BFormFile.vue_vue_type_script_setup_true_lang-DRpf0N3X.mjs","sources":["../src/components/BFormFile/BFormFile.vue"],"sourcesContent":["<template>\n <div ref=\"rootRef\" v-bind=\"processedAttrs.rootAttrs\" class=\"b-form-file-root\">\n <!-- Optional label -->\n <label\n v-if=\"hasLabelSlot || props.label\"\n class=\"form-label\"\n :class=\"props.labelClass\"\n :for=\"computedId\"\n >\n <slot name=\"label\">\n {{ props.label }}\n </slot>\n </label>\n\n <!-- Drop zone wrapper -->\n <div\n v-if=\"!props.plain\"\n ref=\"dropZoneRef\"\n v-bind=\"processedAttrs.dropZoneAttrs\"\n class=\"b-form-file-wrapper\"\n :class=\"{\n 'b-form-file-dragging': isOverDropZone && !props.noDrop,\n 'b-form-file-has-files': hasFiles,\n }\"\n >\n <!-- Custom file control (mimics Bootstrap native input) -->\n <div\n class=\"b-form-file-control\"\n :class=\"computedClasses\"\n :aria-disabled=\"props.disabled\"\n @click=\"handleControlClick\"\n >\n <!-- Custom browse button (now on LEFT to match Bootstrap v5) -->\n <button\n v-if=\"!props.noButton\"\n :id=\"computedId\"\n ref=\"browseButtonRef\"\n type=\"button\"\n class=\"b-form-file-button\"\n :disabled=\"props.disabled\"\n :aria-label=\"props.ariaLabel\"\n :aria-labelledby=\"props.ariaLabelledby\"\n @click.stop=\"openFileDialog\"\n >\n {{ effectiveBrowseText }}\n </button>\n\n <!-- File name display -->\n <div class=\"b-form-file-text\">\n <slot name=\"file-name\" :files=\"selectedFiles\" :names=\"fileNames\">\n <span v-if=\"hasFiles\">{{ formattedFileNames }}</span>\n <span v-else-if=\"hasPlaceholderSlot || props.placeholder\" class=\"text-muted\">\n <slot name=\"placeholder\">{{ props.placeholder }}</slot>\n </span>\n </slot>\n </div>\n </div>\n\n <!-- Drag overlay (only shown when dragging) -->\n <div v-if=\"isOverDropZone && !props.noDrop\" class=\"b-form-file-drag-overlay\">\n <slot name=\"drop-placeholder\">\n <div class=\"b-form-file-drag-text\">\n {{ effectiveDropPlaceholder }}\n </div>\n </slot>\n </div>\n\n <!-- Hidden input for form submission (positioned behind UI with z-index) -->\n <input\n ref=\"customInputRef\"\n v-bind=\"processedAttrs.inputAttrs\"\n type=\"file\"\n :name=\"props.name\"\n :form=\"props.form\"\n :multiple=\"props.multiple || props.directory\"\n :disabled=\"props.disabled\"\n :required=\"props.required\"\n :accept=\"computedAccept || undefined\"\n :capture=\"props.capture\"\n :directory=\"props.directory || undefined\"\n :webkitdirectory=\"props.directory || undefined\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n style=\"\n position: absolute;\n z-index: -5;\n width: 0;\n height: 0;\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n \"\n />\n </div>\n\n <!-- Plain mode - simple native input -->\n <input\n v-else\n :id=\"computedId\"\n ref=\"plainInputRef\"\n v-bind=\"processedAttrs.inputAttrs\"\n type=\"file\"\n :class=\"computedPlainClasses\"\n :form=\"props.form\"\n :name=\"props.name\"\n :multiple=\"props.multiple || props.directory\"\n :disabled=\"props.disabled\"\n :capture=\"props.capture\"\n :accept=\"computedAccept || undefined\"\n :required=\"props.required || undefined\"\n :aria-label=\"props.ariaLabel\"\n :aria-labelledby=\"props.ariaLabelledby\"\n :aria-required=\"props.required || undefined\"\n :directory=\"props.directory || undefined\"\n :webkitdirectory=\"props.directory || undefined\"\n @change=\"onPlainChange\"\n />\n\n <!-- External file display (when showFileNames is true and not plain) -->\n <div v-if=\"showExternalDisplay\" class=\"b-form-file-display mt-2\">\n <slot name=\"file-name\" :files=\"selectedFiles\" :names=\"fileNames\">\n <div v-if=\"hasFiles\" class=\"small text-muted\">\n {{ formattedFileNames }}\n </div>\n <div v-else-if=\"hasPlaceholderSlot || props.placeholder\" class=\"small text-muted\">\n <slot name=\"placeholder\">\n {{ props.placeholder }}\n </slot>\n </div>\n </slot>\n </div>\n\n <!-- ARIA live region for screen reader announcements -->\n <div v-if=\"!props.plain\" class=\"visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ ariaLiveMessage }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {useDropZone, useFileDialog} from '@vueuse/core'\nimport {computed, nextTick, onMounted, ref, type Ref, useAttrs, useTemplateRef, watch} from 'vue'\nimport type {BFormFileProps} from '../../types/ComponentProps'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useStateClass} from '../../composables/useStateClass'\nimport {isEmptySlot} from '../../utils/dom'\nimport type {BFormFileSlots} from '../../types'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BFormFileProps, 'modelValue'>>(), {\n ariaLabel: undefined,\n ariaLabelledby: undefined,\n accept: '',\n autofocus: false,\n browseText: undefined,\n capture: undefined,\n directory: false,\n disabled: false,\n dropPlaceholder: undefined,\n fileNameFormatter: undefined,\n form: undefined,\n id: undefined,\n label: '',\n labelClass: undefined,\n multiple: false,\n name: undefined,\n noButton: false,\n noDrop: false,\n plain: false,\n placeholder: 'No file chosen',\n required: false,\n showFileNames: false,\n size: undefined,\n state: null,\n})\nconst props = useDefaults(_props, 'BFormFile')\nconst slots = defineSlots<BFormFileSlots>()\n\nconst emit = defineEmits<{\n change: [value: Event]\n}>()\n\nconst modelValue = defineModel<Exclude<BFormFileProps['modelValue'], undefined>>({\n default: null,\n})\n\nconst attrs = useAttrs()\n\nconst processedAttrs = computed(() => {\n // In plain mode, pass all attributes to the input element\n if (props.plain) {\n return {\n rootAttrs: {},\n dropZoneAttrs: {},\n inputAttrs: attrs,\n }\n }\n // In custom mode, split attributes:\n // - class/style go to root (for layout/positioning)\n // - title goes to drop zone (for tooltip on interactive element)\n // - everything else goes to hidden input (for form functionality)\n const {class: rootClass, style: rootStyle, title: dropZoneTitle, ...inputAttrs} = attrs\n const rootAttrs: Record<string, unknown> = {}\n const dropZoneAttrs: Record<string, unknown> = {}\n if (rootClass !== undefined) rootAttrs.class = rootClass\n if (rootStyle !== undefined) rootAttrs.style = rootStyle\n if (dropZoneTitle !== undefined) dropZoneAttrs.title = dropZoneTitle\n return {\n rootAttrs,\n dropZoneAttrs,\n inputAttrs,\n }\n})\n\nconst computedId = useId(() => props.id)\nconst stateClass = useStateClass(() => props.state)\n\n// Refs\nconst rootRef = useTemplateRef('rootRef')\nconst dropZoneRef = useTemplateRef('dropZoneRef')\nconst browseButtonRef = useTemplateRef('browseButtonRef')\nconst plainInputRef = useTemplateRef<HTMLInputElement>('plainInputRef')\nconst customInputRef = useTemplateRef<HTMLInputElement>('customInputRef')\n\n// Computed accept for file type validation\nconst computedAccept = computed(() =>\n typeof props.accept === 'string' ? props.accept : props.accept.join(',')\n)\n\n// VueUse file dialog (uses our hidden input element)\nconst {\n open,\n reset: resetDialog,\n onChange: onDialogChange,\n} = useFileDialog({\n accept: computedAccept.value,\n multiple: props.multiple || props.directory,\n directory: props.directory,\n input: customInputRef as unknown as Ref<HTMLInputElement>,\n})\n\n// VueUse drop zone (replaces manual drag/drop)\n// Note: We don't pass dataTypes because the accept attribute handles validation\n// and there is no reliable way to get MIME types from in all browsers\n// https://github.com/vueuse/vueuse/issues/4523\nconst {isOverDropZone} = useDropZone(dropZoneRef, {\n onDrop: (files) => {\n if (files && !props.noDrop) {\n handleFiles(files)\n }\n },\n multiple: props.multiple || props.directory,\n})\n\n// Computed properties\nconst hasLabelSlot = computed(() => !isEmptySlot(slots.label))\nconst hasPlaceholderSlot = computed(() => !isEmptySlot(slots.placeholder))\n\nconst computedClasses = computed(() => [\n stateClass.value,\n {\n [`form-control-${props.size}`]: props.size !== undefined,\n },\n])\n\nconst computedPlainClasses = computed(() => [\n 'form-control',\n stateClass.value,\n {\n [`form-control-${props.size}`]: props.size !== undefined,\n },\n])\n\n// Selected files (from dialog or managed state)\nconst internalFiles = ref<readonly File[]>([])\n\nconst selectedFiles = computed<readonly File[]>(() => internalFiles.value)\n\nconst hasFiles = computed(() => selectedFiles.value.length > 0)\n\nconst fileNames = computed(() => selectedFiles.value.map((file) => file.name))\n\nconst formattedFileNames = computed(() => {\n if (!hasFiles.value) return ''\n if (props.fileNameFormatter) {\n return props.fileNameFormatter(selectedFiles.value)\n }\n const names = fileNames.value\n if (names.length === 1) return names[0]\n return `${names.length} files selected`\n})\n\nconst showExternalDisplay = computed(\n () => !props.plain && props.showFileNames && (hasFiles.value || props.placeholder)\n)\n\n// ARIA live region message for accessibility\nconst ariaLiveMessage = computed(() => {\n if (!hasFiles.value) return ''\n const count = selectedFiles.value.length\n if (count === 1) {\n return `File selected: ${selectedFiles.value[0].name}`\n }\n return `${count} files selected`\n})\n\nconst effectiveBrowseText = computed(() => props.browseText ?? 'Browse')\nconst effectiveDropPlaceholder = computed(() => props.dropPlaceholder ?? 'Drop files here...')\n\n// Validate file against accept criteria\nconst isFileAccepted = (file: File): boolean => {\n if (!computedAccept.value) return true\n\n const acceptTypes = computedAccept.value.split(',').map((type) => type.trim())\n\n return acceptTypes.some((acceptType) => {\n // Extension match (e.g., .pdf)\n if (acceptType.startsWith('.')) {\n return file.name.toLowerCase().endsWith(acceptType.toLowerCase())\n }\n // Exact MIME type match (e.g., image/png)\n if (!acceptType.includes('*')) {\n return file.type === acceptType\n }\n // Wildcard MIME type match (e.g., image/* or */*)\n const slashIndex = acceptType.indexOf('/')\n if (slashIndex === -1) {\n // Malformed wildcard pattern (no '/'): do not match anything\n return false\n }\n const category = acceptType.slice(0, slashIndex)\n // */* should match any MIME type\n if (category === '*') {\n return true\n }\n return file.type.startsWith(`${category}/`)\n })\n}\n\n// File handling\nconst handleFiles = (files: File[] | FileList, nativeEvent?: Event) => {\n let fileArray: File[] = []\n\n if (nativeEvent) {\n // Plain mode: read from the event target (browser already filtered via accept)\n const input = nativeEvent.target as HTMLInputElement\n fileArray = input.files ? Array.from(input.files) : []\n } else {\n // Custom mode (drag & drop or file dialog): manually filter and set on hidden input\n fileArray = Array.from(files).filter((file) => isFileAccepted(file))\n if (customInputRef.value && typeof DataTransfer !== 'undefined') {\n try {\n const dataTransfer = new DataTransfer()\n fileArray.forEach((file) => dataTransfer.items.add(file))\n customInputRef.value.files = dataTransfer.files\n } catch {\n // In environments where DataTransfer is not fully supported, skip syncing files on the input\n }\n }\n }\n\n // Update internal state\n internalFiles.value = fileArray\n\n // Update model value\n if (fileArray.length === 0) {\n modelValue.value = null\n } else if (props.directory || props.multiple) {\n modelValue.value = fileArray\n } else {\n const [firstFile] = fileArray\n modelValue.value = firstFile\n }\n\n // Emit change event in nextTick to ensure DOM updates\n // In plain mode: forward the native event (has target.files)\n // In custom mode: create CustomEvent with files in detail\n nextTick(() => {\n if (nativeEvent) {\n // Plain mode: forward native event\n emit('change', nativeEvent)\n } else {\n // Custom mode: create CustomEvent with files\n const changeEvent = new CustomEvent('change', {\n bubbles: true,\n cancelable: false,\n detail: {\n files: fileArray,\n target: {files: fileArray},\n },\n })\n // Also attach files directly for easier access\n Object.defineProperty(changeEvent, 'files', {\n value: fileArray,\n enumerable: true,\n })\n emit('change', changeEvent)\n }\n })\n}\n\n// Open file dialog\nconst openFileDialog = () => {\n if (!props.disabled) {\n open({\n accept: computedAccept.value,\n multiple: props.multiple || props.directory,\n directory: props.directory,\n })\n }\n}\n\n// Handle click on control wrapper (make entire control clickable like Bootstrap v5)\nconst handleControlClick = () => {\n // Don't trigger if clicking the button itself (button has its own handler with .stop)\n // Don't trigger if disabled\n if (!props.disabled) {\n openFileDialog()\n }\n}\n\n// Plain mode change handler\nconst onPlainChange = (e: Event) => {\n const input = e.target as HTMLInputElement\n if (input.files) {\n handleFiles(input.files, e) // Pass native event\n }\n}\n\n// Watch dialog files from useFileDialog\nonDialogChange((files) => {\n if (files) {\n handleFiles(files)\n }\n})\n\n// Reset method\nconst reset = () => {\n internalFiles.value = []\n modelValue.value = null\n resetDialog() // This resets the hidden input in custom mode\n if (plainInputRef.value) {\n plainInputRef.value.value = ''\n }\n}\n\n// Focus management\nconst focus = () => {\n if (props.plain) {\n plainInputRef.value?.focus()\n } else {\n browseButtonRef.value?.focus()\n }\n}\n\nconst blur = () => {\n if (props.plain) {\n plainInputRef.value?.blur()\n } else {\n browseButtonRef.value?.blur()\n }\n}\n\n// Autofocus support - initial focus on mount\nonMounted(() => {\n if (props.autofocus) {\n nextTick(() => {\n focus()\n })\n }\n})\n\n// Autofocus support - runtime prop changes\nwatch(\n () => props.autofocus,\n (autofocus) => {\n if (autofocus) {\n focus()\n }\n }\n)\n\n// Watch modelValue changes from parent\nwatch(modelValue, (newValue) => {\n if (newValue === null) {\n internalFiles.value = []\n if (plainInputRef.value) {\n plainInputRef.value.value = ''\n }\n } else if (Array.isArray(newValue)) {\n internalFiles.value = newValue as readonly File[]\n } else {\n internalFiles.value = [newValue] as readonly File[]\n }\n})\n\ndefineExpose({\n blur,\n element: computed(() => (props.plain ? plainInputRef.value : browseButtonRef.value)),\n focus,\n reset,\n})\n</script>\n"],"names":["props","useDefaults","__props","slots","_useSlots","emit","__emit","modelValue","_useModel","attrs","useAttrs","processedAttrs","computed","plain","rootAttrs","dropZoneAttrs","inputAttrs","class","rootClass","style","rootStyle","title","dropZoneTitle","computedId","useId","id","stateClass","useStateClass","state","rootRef","useTemplateRef","dropZoneRef","browseButtonRef","plainInputRef","customInputRef","computedAccept","accept","join","open","reset","resetDialog","onChange","onDialogChange","useFileDialog","value","multiple","directory","input","isOverDropZone","useDropZone","onDrop","files","noDrop","handleFiles","hasLabelSlot","isEmptySlot","label","hasPlaceholderSlot","placeholder","computedClasses","size","computedPlainClasses","internalFiles","ref","selectedFiles","hasFiles","length","fileNames","map","file","name","formattedFileNames","fileNameFormatter","names","showExternalDisplay","showFileNames","ariaLiveMessage","count","effectiveBrowseText","browseText","effectiveDropPlaceholder","dropPlaceholder","nativeEvent","fileArray","target","Array","from","filter","split","type","trim","some","acceptType","startsWith","toLowerCase","endsWith","includes","slashIndex","indexOf","category","slice","isFileAccepted","DataTransfer","dataTransfer","forEach","items","add","firstFile","nextTick","changeEvent","CustomEvent","bubbles","cancelable","detail","Object","defineProperty","enumerable","openFileDialog","disabled","handleControlClick","onPlainChange","e","focus","onMounted","autofocus","watch","newValue","isArray","__expose","blur","element","_openBlock","_createElementBlock","_mergeProps","_unref","_normalizeClass","labelClass","for","_renderSlot","_ctx","_createTextVNode","_toDisplayString","form","capture","required","ariaLabel","ariaLabelledby","webkitdirectory","_createElementVNode","onClick","noButton","_hoisted_3","_hoisted_4","$slots","_hoisted_6","_hoisted_7","_hoisted_8","tabindex","position","width","height","opacity","overflow","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defineComponent as e,mergeModels as o,useModel as t,useTemplateRef as a,inject as l,computed as d,createElementBlock as i,openBlock as r,unref as u,normalizeClass as n}from"vue";import{u as p}from"./useDefaults-C9d4iJX7.mjs";import{n as m,u as s}from"./useFormInput-DUGAGnSR.mjs";import{i as f}from"./keys-DiEDpjjR.mjs";const v=["id","value","name","form","type","disabled","placeholder","required","autocomplete","readonly","min","max","step","list","aria-required","aria-invalid"],c=/* @__PURE__ */e({__name:"BFormInput",props:/* @__PURE__ */o({max:{default:void 0},min:{default:void 0},step:{default:void 0},type:{default:"text"},ariaInvalid:{type:[Boolean,String],default:void 0},autocomplete:{default:void 0},autofocus:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},form:{default:void 0},formatter:{type:Function,default:void 0},id:{default:void 0},lazyFormatter:{type:Boolean,default:!1},list:{default:void 0},name:{default:void 0},placeholder:{default:void 0},plaintext:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},required:{type:Boolean,default:!1},size:{default:void 0},state:{type:[Boolean,null],default:void 0},debounce:{default:0},debounceMaxWait:{default:Number.NaN}},{modelValue:{default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(e,{expose:o}){const c=p(e,"BFormInput"),[y,x]=t(e,"modelValue",{set:e=>m(e,x)}),B=a("_input"),b=l(f,!1),{computedId:I,computedAriaInvalid:q,onInput:g,onChange:h,onBlur:F,stateClass:_,focus:z,blur:j,isDisabled:C}=s(c,B,y,x),N=d(()=>{const e="range"===c.type,o="color"===c.type;return[_.value,{"form-range":e,"form-control":o||!c.plaintext&&!e||e&&b,"form-control-color":o,"form-control-plaintext":c.plaintext&&!e&&!o,[`form-control-${c.size}`]:!!c.size}]});return o({blur:j,element:B,focus:z}),(e,o)=>(r(),i("input",{id:u(I),ref:"_input",value:u(y),class:n(N.value),name:u(c).name||void 0,form:u(c).form||void 0,type:u(c).type,disabled:u(C),placeholder:u(c).placeholder,required:u(c).required||void 0,autocomplete:u(c).autocomplete||void 0,readonly:u(c).readonly||u(c).plaintext,min:u(c).min,max:u(c).max,step:u(c).step,list:"password"!==u(c).type?u(c).list:void 0,"aria-required":u(c).required||void 0,"aria-invalid":u(q),onInput:o[0]||(o[0]=(...e)=>u(g)&&u(g)(...e)),onChange:o[1]||(o[1]=(...e)=>u(h)&&u(h)(...e)),onBlur:o[2]||(o[2]=(...e)=>u(F)&&u(F)(...e))},null,42,v))}});export{c as _};
|
|
2
|
+
//# sourceMappingURL=BFormInput.vue_vue_type_script_setup_true_lang-D4gp11CP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BFormInput.vue_vue_type_script_setup_true_lang-D4gp11CP.mjs","sources":["../src/components/BFormInput/BFormInput.vue"],"sourcesContent":["<template>\n <input\n :id=\"computedId\"\n ref=\"_input\"\n :value=\"modelValue\"\n :class=\"computedClasses\"\n :name=\"props.name || undefined\"\n :form=\"props.form || undefined\"\n :type=\"props.type\"\n :disabled=\"isDisabled\"\n :placeholder=\"props.placeholder\"\n :required=\"props.required || undefined\"\n :autocomplete=\"props.autocomplete || undefined\"\n :readonly=\"props.readonly || props.plaintext\"\n :min=\"props.min\"\n :max=\"props.max\"\n :step=\"props.step\"\n :list=\"props.type !== 'password' ? props.list : undefined\"\n :aria-required=\"props.required || undefined\"\n :aria-invalid=\"computedAriaInvalid\"\n @input=\"onInput\"\n @change=\"onChange\"\n @blur=\"onBlur\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, inject, useTemplateRef} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {normalizeInput} from '../../utils/normalizeInput'\nimport type {BFormInputProps} from '../../types/ComponentProps'\nimport {useFormInput} from '../../composables/useFormInput'\nimport {inputGroupKey} from '../../utils/keys'\n\nconst _props = withDefaults(defineProps<Omit<BFormInputProps, 'modelValue'>>(), {\n max: undefined,\n min: undefined,\n step: undefined,\n type: 'text',\n // CommonInputProps\n ariaInvalid: undefined,\n autocomplete: undefined,\n autofocus: false,\n debounce: 0,\n debounceMaxWait: Number.NaN,\n disabled: false,\n form: undefined,\n formatter: undefined,\n id: undefined,\n lazyFormatter: false,\n list: undefined,\n modelValue: '',\n name: undefined,\n placeholder: undefined,\n plaintext: false,\n readonly: false,\n required: false,\n size: undefined,\n state: undefined,\n // End CommonInputProps\n})\nconst props = useDefaults(_props, 'BFormInput')\n\nconst [modelValue, modelModifiers] = defineModel<\n Exclude<BFormInputProps['modelValue'], undefined>,\n 'trim' | 'lazy' | 'number'\n>({\n default: '',\n set: (v) => normalizeInput(v, modelModifiers),\n})\n\nconst input = useTemplateRef('_input')\n\nconst inInputGroup = inject(inputGroupKey, false)\n\nconst {\n computedId,\n computedAriaInvalid,\n onInput,\n onChange,\n onBlur,\n stateClass,\n focus,\n blur,\n isDisabled,\n} = useFormInput(props, input, modelValue, modelModifiers)\n\nconst computedClasses = computed(() => {\n const isRange = props.type === 'range'\n const isColor = props.type === 'color'\n return [\n stateClass.value,\n {\n 'form-range': isRange,\n 'form-control': isColor || (!props.plaintext && !isRange) || (isRange && inInputGroup),\n 'form-control-color': isColor,\n 'form-control-plaintext': props.plaintext && !isRange && !isColor,\n [`form-control-${props.size}`]: !!props.size,\n },\n ]\n})\n\ndefineExpose({\n blur,\n element: input,\n focus,\n})\n</script>\n"],"names":["props","useDefaults","__props","modelValue","modelModifiers","_useModel","set","v","normalizeInput","input","useTemplateRef","inInputGroup","inject","inputGroupKey","computedId","computedAriaInvalid","onInput","onChange","onBlur","stateClass","focus","blur","isDisabled","useFormInput","computedClasses","computed","isRange","type","isColor","value","plaintext","size","__expose","element","_createElementBlock","id","_unref","ref","class","name","form","disabled","placeholder","required","autocomplete","readonly","min","max","step","list","_cache","args"],"mappings":"+xCAkCA,MA2BMA,EAAQC,EA3BCC,EA2BmB,eAE3BC,EAAYC,GAAkBC,EAGpCH,EAAA,aAAC,CAEAI,IAAMC,GAAMC,EAAeD,EAAGH,KAG1BK,EAAQC,EAAe,UAEvBC,EAAeC,EAAOC,GAAe,IAErCC,WACJA,EAAAC,oBACAA,EAAAC,QACAA,EAAAC,SACAA,EAAAC,OACAA,EAAAC,WACAA,EAAAC,MACAA,EAAAC,KACAA,EAAAC,WACAA,GACEC,EAAavB,EAAOS,EAAON,EAAYC,GAErCoB,EAAkBC,EAAS,KAC/B,MAAMC,EAAyB,UAAf1B,EAAM2B,KAChBC,EAAyB,UAAf5B,EAAM2B,KACtB,MAAO,CACLR,EAAWU,MACX,CACE,aAAcH,EACd,eAAgBE,IAAa5B,EAAM8B,YAAcJ,GAAaA,GAAWf,EACzE,qBAAsBiB,EACtB,yBAA0B5B,EAAM8B,YAAcJ,IAAYE,EAC1D,CAAC,gBAAgB5B,EAAM+B,UAAW/B,EAAM+B,gBAK9CC,EAAa,CACXX,OACAY,QAASxB,EACTW,sBAxGAc,EAsBE,QAAA,CArBCC,GAAIC,EAAAtB,GACLuB,IAAI,SACHR,MAAOO,EAAAjC,GACPmC,QAAOd,EAAAK,OACPU,KAAMH,EAAApC,GAAMuC,WAAQ,EACpBC,KAAMJ,EAAApC,GAAMwC,WAAQ,EACpBb,KAAMS,EAAApC,GAAM2B,KACZc,SAAUL,EAAAd,GACVoB,YAAaN,EAAApC,GAAM0C,YACnBC,SAAUP,EAAApC,GAAM2C,eAAY,EAC5BC,aAAcR,EAAApC,GAAM4C,mBAAgB,EACpCC,SAAUT,EAAApC,GAAM6C,UAAYT,EAAApC,GAAM8B,UAClCgB,IAAKV,EAAApC,GAAM8C,IACXC,IAAKX,EAAApC,GAAM+C,IACXC,KAAMZ,EAAApC,GAAMgD,KACZC,kBAAMb,KAAMT,KAAsBS,EAAApC,GAAMiD,UAAO,EAC/C,gBAAeb,EAAApC,GAAM2C,eAAY,EACjC,eAAcP,EAAArB,GACdC,QAAKkC,EAAA,KAAAA,EAAA,WAAEd,EAAApB,IAAAoB,EAAApB,EAAAoB,IAAAe,IACPlC,SAAMiC,EAAA,KAAAA,EAAA,WAAEd,EAAAnB,IAAAmB,EAAAnB,EAAAmB,IAAAe,IACRjC,OAAIgC,EAAA,KAAAA,EAAA,WAAEd,EAAAlB,IAAAkB,EAAAlB,EAAAkB,IAAAe"}
|