@vue-interface/btn-dropdown 4.1.0 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ import { DropdownMenu as R } from "@vue-interface/dropdown-menu";
3
3
  import { offset as Q, flip as U } from "@floating-ui/dom";
4
4
  import { useFloating as W } from "@floating-ui/vue";
5
5
  function j(t, k) {
6
- const g = D(), p = D(), s = D(!1), u = x(() => t.align ?? "start"), c = x(() => t.dropup ? "top" : t.dropleft ? "left" : t.dropright ? "right" : "bottom"), a = x(() => `${c.value}-${u.value}`), i = x(() => ({
6
+ const p = D(), g = D(), s = D(!1), u = x(() => t.align ?? "start"), c = x(() => t.dropup ? "top" : t.dropleft ? "left" : t.dropright ? "right" : "bottom"), a = x(() => `${c.value}-${u.value}`), i = x(() => ({
7
7
  dropdown: t.dropup && t.dropright && t.dropleft,
8
8
  dropup: t.dropup,
9
9
  dropright: t.dropright,
@@ -24,7 +24,7 @@ function j(t, k) {
24
24
  l[E] = !0;
25
25
  else t.buttonClass && Object.assign(l, t.buttonClass);
26
26
  return l;
27
- }), { floatingStyles: T, update: B } = W(g, p, {
27
+ }), { floatingStyles: T, update: B } = W(p, g, {
28
28
  placement: a,
29
29
  middleware: t.middleware ?? [
30
30
  Q(t.offset ?? 5),
@@ -32,16 +32,16 @@ function j(t, k) {
32
32
  ]
33
33
  });
34
34
  function w() {
35
- s.value = !0, !(!g.value || !p.value) && (B(), k("show"));
35
+ s.value = !0, !(!p.value || !g.value) && (B(), k("show"));
36
36
  }
37
37
  function b() {
38
- s.value = !1, g.value?.blur(), k("hide");
38
+ s.value = !1, p.value?.blur(), k("hide");
39
39
  }
40
40
  function r() {
41
41
  s.value ? b() : w();
42
42
  }
43
43
  function m(l) {
44
- const E = Array.from(p.value?.$el.querySelectorAll("label, input, select, textarea") ?? []);
44
+ const E = Array.from(g.value?.$el.querySelectorAll("label, input, select, textarea") ?? []);
45
45
  for (const q in E)
46
46
  if (l === E[q])
47
47
  return !0;
@@ -52,7 +52,7 @@ function j(t, k) {
52
52
  b();
53
53
  return;
54
54
  }
55
- (p.value && !p.value?.$el.contains(l.relatedTarget) || !g.value?.contains(l.relatedTarget)) && b();
55
+ (g.value && !g.value?.$el.contains(l.relatedTarget) || !p.value?.contains(l.relatedTarget)) && b();
56
56
  }
57
57
  function f(l) {
58
58
  k("click", l);
@@ -70,8 +70,8 @@ function j(t, k) {
70
70
  return O(() => {
71
71
  s.value ? window.addEventListener("resize", B) : window.removeEventListener("resize", B);
72
72
  }), {
73
- target: g,
74
- menu: p,
73
+ target: p,
74
+ menu: g,
75
75
  alignment: u,
76
76
  expanded: s,
77
77
  floatingStyles: T,
@@ -107,8 +107,8 @@ const X = ["aria-expanded"], Y = /* @__PURE__ */ A({
107
107
  variant: { default: "btn-primary" }
108
108
  },
109
109
  emits: ["click", "clickToggle", "show", "hide"],
110
- setup(t, { expose: k, emit: g }) {
111
- const p = t, s = g, {
110
+ setup(t, { expose: k, emit: p }) {
111
+ const g = t, s = p, {
112
112
  target: u,
113
113
  menu: c,
114
114
  buttonClasses: a,
@@ -121,7 +121,7 @@ const X = ["aria-expanded"], Y = /* @__PURE__ */ A({
121
121
  onBlur: r,
122
122
  onClickToggle: m,
123
123
  onClickItem: $
124
- } = j(p, s);
124
+ } = j(g, s);
125
125
  return k({
126
126
  show: B,
127
127
  hide: w,
@@ -181,8 +181,8 @@ const X = ["aria-expanded"], Y = /* @__PURE__ */ A({
181
181
  variant: { default: "btn-primary" }
182
182
  },
183
183
  emits: ["click", "clickToggle", "show", "hide"],
184
- setup(t, { expose: k, emit: g }) {
185
- const p = t, s = g, {
184
+ setup(t, { expose: k, emit: p }) {
185
+ const g = t, s = p, {
186
186
  target: u,
187
187
  menu: c,
188
188
  buttonClasses: a,
@@ -195,7 +195,7 @@ const X = ["aria-expanded"], Y = /* @__PURE__ */ A({
195
195
  onBlur: r,
196
196
  onClickToggle: m,
197
197
  onClickItem: $
198
- } = j(p, s);
198
+ } = j(g, s);
199
199
  return k({
200
200
  show: B,
201
201
  hide: w,
@@ -281,16 +281,16 @@ const X = ["aria-expanded"], Y = /* @__PURE__ */ A({
281
281
  variant: {}
282
282
  },
283
283
  emits: ["click", "clickToggle", "show", "hide"],
284
- setup(t, { expose: k, emit: g }) {
285
- const p = t, s = g, u = G("el");
284
+ setup(t, { expose: k, emit: p }) {
285
+ const g = t, s = p, u = G("el");
286
286
  return k({
287
- show: () => u.value?.show(),
288
287
  hide: () => u.value?.hide(),
289
- toggle: () => u.value?.hide()
288
+ show: () => u.value?.show(),
289
+ toggle: () => u.value?.toggle()
290
290
  }), (c, a) => (H(), J(K(t.split ? oe : Y), P({
291
291
  ref_key: "el",
292
292
  ref: u
293
- }, p, {
293
+ }, g, {
294
294
  onClick: a[0] || (a[0] = (i) => s("click", i)),
295
295
  onClickToggle: a[1] || (a[1] = (i) => s("clickToggle", i)),
296
296
  onShow: a[2] || (a[2] = () => s("show")),
@@ -1 +1 @@
1
- {"version":3,"file":"btn-dropdown.js","sources":["../src/useDropdownHandler.ts","../src/BtnDropdownSingle.vue","../src/BtnDropdownSplit.vue","../src/BtnDropdown.vue"],"sourcesContent":["import { flip, offset, Placement, type Alignment, type Middleware, type OffsetOptions, type Side } from '@floating-ui/dom';\nimport { useFloating } from '@floating-ui/vue';\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { computed, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';\n\ntype LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);\n\nexport type BtnGroupSizes = 'btn-group-xs'\n | 'btn-group-sm' \n | 'btn-group-md'\n | 'btn-group-lg'\n | 'btn-group-xl'\n | 'btn-group-2xl'\n | 'btn-group-3xl'\n | 'btn-group-4xl';\n\nexport type BtnDropdownProps = {\n align?: Alignment;\n block?: boolean;\n buttonClass?: HTMLAttributes['class'],\n caret?: boolean;\n dropup?: boolean;\n dropright?: boolean;\n dropleft?: boolean;\n label?: string;\n offset?: OffsetOptions,\n middleware?: Middleware[],\n side?: Side;\n size?: LiteralUnion<BtnGroupSizes>;\n split?: boolean;\n variant?: string;\n}\n\nexport type BtnDropdownEvents = {\n click: [event: MouseEvent];\n clickToggle: [event: MouseEvent];\n show: [],\n hide: []\n}\n\nexport function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>) {\n const target = ref<HTMLElement>();\n const menu = ref<InstanceType<typeof DropdownMenu>>();\n const expanded = ref(false);\n\n\n const alignment = computed<Alignment>(() => props.align ?? 'start');\n\n const side = computed<Side>(() => {\n if(props.dropup) {\n return 'top';\n }\n\n if(props.dropleft) {\n return 'left';\n }\n\n if(props.dropright) {\n return 'right';\n }\n\n return 'bottom';\n });\n\n const placement = computed<Placement>(() => `${side.value}-${alignment.value}`);\n\n const classes = computed(() => ({\n 'dropdown': props.dropup && props.dropright && props.dropleft,\n 'dropup': props.dropup,\n 'dropright': props.dropright,\n 'dropleft': props.dropleft,\n 'expanded': expanded.value,\n [props.size ?? '']: !!props.size,\n }));\n \n const buttonClasses = computed(() => {\n const classes = {\n btn: true,\n [props.variant ?? '']: !!props.variant,\n 'btn-block': !!props.block,\n 'no-caret': !props.caret\n };\n \n if(typeof props.buttonClass === 'string') {\n classes[props.buttonClass] = true;\n }\n else if(Array.isArray(props.buttonClass)) {\n for(const value of props.buttonClass) {\n classes[value] = true;\n }\n }\n else if(props.buttonClass) {\n Object.assign(classes, props.buttonClass);\n }\n\n return classes;\n });\n\n const { floatingStyles, update } = useFloating(target, menu, {\n placement: placement,\n middleware: props.middleware ?? [\n offset(props.offset ?? 5),\n flip()\n ]\n });\n\n function show() {\n expanded.value = true;\n\n if(!target.value || !menu.value) {\n return;\n }\n\n update();\n\n emit('show');\n }\n\n function hide() {\n expanded.value = false;\n\n target.value?.blur();\n\n emit('hide');\n }\n\n function toggle() {\n if(!expanded.value) {\n show();\n }\n else {\n hide();\n }\n }\n\n function isFocusable(element: HTMLElement) {\n const nodes = Array.from(menu.value?.$el.querySelectorAll('label, input, select, textarea') ?? []);\n\n for(const i in nodes) {\n if(element === nodes[i]) {\n return true;\n }\n }\n\n return false;\n }\n \n function onBlur(e: FocusEvent) {\n if(!(e.relatedTarget instanceof HTMLElement)) {\n hide();\n \n return;\n }\n \n if(menu.value && !menu.value?.$el.contains(e.relatedTarget) || !target.value?.contains(e.relatedTarget)) {\n hide();\n }\n }\n\n function onClick(e: MouseEvent) {\n emit('click', e);\n }\n\n function onClickToggle(e: MouseEvent) {\n e.target?.dispatchEvent(new Event('focus', e));\n \n emit('clickToggle', e);\n\n if(!e.defaultPrevented) {\n toggle();\n }\n }\n\n function onClickItem(e: PointerEvent) {\n if(!(e.target instanceof HTMLElement)) {\n hide();\n\n return;\n }\n\n if(!isFocusable(e.target) && !e.defaultPrevented) {\n hide();\n }\n }\n\n watchEffect(() => {\n if(expanded.value) {\n window.addEventListener('resize', update);\n }\n else {\n window.removeEventListener('resize', update);\n }\n });\n\n return {\n target,\n menu,\n alignment,\n expanded,\n floatingStyles,\n placement,\n side,\n classes,\n buttonClasses,\n show,\n hide,\n toggle,\n onBlur,\n onClick,\n onClickToggle,\n onClickItem\n };\n}","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group\"\n :class=\"classes\">\n <slot\n name=\"button\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n :class=\"{...buttonClasses, ['dropdown-toggle']: true}\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\">\n {{ label }}\n </button>\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group btn-dropdown-split\"\n :class=\"classes\">\n <slot\n v-if=\"!dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n <div class=\"btn-group\">\n <slot\n name=\"toggle\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n :class=\"{...buttonClasses, 'dropdown-toggle': true, 'dropdown-toggle-split': split}\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\" />\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n <slot\n v-if=\"dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { useTemplateRef } from 'vue';\nimport { ComponentExposed } from 'vue-component-type-helpers';\nimport BtnDropdownSingle from './BtnDropdownSingle.vue';\nimport BtnDropdownSplit from './BtnDropdownSplit.vue';\nimport { BtnDropdownEvents, BtnDropdownProps } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<{\n split?: boolean\n} & BtnDropdownProps>(), {\n split: false,\n caret: true\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\nconst el = useTemplateRef<ComponentExposed<typeof BtnDropdownSingle | typeof BtnDropdownSplit>>('el');\n\ndefineExpose({\n show: () => el.value?.show(),\n hide: () => el.value?.hide(),\n toggle: () => el.value?.hide(),\n});\n</script>\n\n<template>\n <Component\n ref=\"el\"\n :is=\"!split ? BtnDropdownSingle : BtnDropdownSplit\"\n v-bind=\"props\"\n @click=\"(e: MouseEvent) => emit('click', e)\"\n @click-toggle=\"(e: MouseEvent) => emit('clickToggle', e)\"\n @show=\"() => emit('show')\"\n @hide=\"() => emit('hide')\">\n <template #button=\"slot\">\n <slot\n name=\"button\"\n v-bind=\"slot\" />\n </template>\n <template #toggle=\"slot\">\n <slot\n name=\"toggle\"\n v-bind=\"slot\" />\n </template>\n <template #split=\"slot\">\n <slot\n name=\"split\"\n v-bind=\"slot\" />\n </template>\n <slot />\n </Component>\n</template>"],"names":["useDropdownHandler","props","emit","target","ref","menu","expanded","alignment","computed","side","placement","classes","buttonClasses","value","floatingStyles","update","useFloating","offset","flip","show","hide","toggle","isFocusable","element","nodes","i","onBlur","e","onClick","onClickToggle","onClickItem","watchEffect","__props","__emit","__expose","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_normalizeProps","_guardReactiveProps","el","_createElementVNode","_cache","args","_hoisted_1","_createVNode","DropdownMenu","_hoisted_2","_hoisted_4","useTemplateRef","_openBlock","_createBlock","_resolveDynamicComponent","BtnDropdownSplit","BtnDropdownSingle","_mergeProps","_withCtx","slot"],"mappings":"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"}
1
+ {"version":3,"file":"btn-dropdown.js","sources":["../src/useDropdownHandler.ts","../src/BtnDropdownSingle.vue","../src/BtnDropdownSplit.vue","../src/BtnDropdown.vue"],"sourcesContent":["import { flip, offset, Placement, type Alignment, type Middleware, type OffsetOptions, type Side } from '@floating-ui/dom';\nimport { useFloating, UseFloatingReturn } from '@floating-ui/vue';\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { computed, ComputedRef, Ref, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';\n\ntype LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);\n\nexport type BtnGroupSizes = 'btn-group-xs'\n | 'btn-group-sm' \n | 'btn-group-md'\n | 'btn-group-lg'\n | 'btn-group-xl'\n | 'btn-group-2xl'\n | 'btn-group-3xl'\n | 'btn-group-4xl';\n\nexport type BtnDropdownProps = {\n align?: Alignment;\n block?: boolean;\n buttonClass?: HTMLAttributes['class'],\n caret?: boolean;\n dropup?: boolean;\n dropright?: boolean;\n dropleft?: boolean;\n label?: string;\n offset?: OffsetOptions,\n middleware?: Middleware[],\n side?: Side;\n size?: LiteralUnion<BtnGroupSizes>;\n split?: boolean;\n variant?: string;\n}\n\nexport type BtnDropdownEvents = {\n click: [event: MouseEvent];\n clickToggle: [event: MouseEvent];\n show: [],\n hide: []\n}\n\nexport type UseDropdownHandler = {\n target: Ref<HTMLElement|undefined>;\n menu: Ref<InstanceType<typeof DropdownMenu>|undefined>;\n alignment: ComputedRef<Alignment>;\n expanded: Ref<boolean>;\n floatingStyles: UseFloatingReturn['floatingStyles'];\n placement: ComputedRef<Placement>;\n side: ComputedRef<Side>;\n classes: ComputedRef<Record<string, boolean|undefined>>;\n buttonClasses: ComputedRef<Record<string, boolean>>;\n show: () => void;\n hide: () => void;\n toggle: () => void;\n onBlur: (e: FocusEvent) => void;\n onClick: (e: MouseEvent) => void;\n onClickToggle: (e: MouseEvent) => void;\n onClickItem: (e: PointerEvent) => void;\n}\n\nexport function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>): UseDropdownHandler {\n const target = ref<HTMLElement>();\n const menu = ref<InstanceType<typeof DropdownMenu>>();\n const expanded = ref(false);\n\n const alignment = computed<Alignment>(() => props.align ?? 'start');\n\n const side = computed<Side>(() => {\n if(props.dropup) {\n return 'top';\n }\n\n if(props.dropleft) {\n return 'left';\n }\n\n if(props.dropright) {\n return 'right';\n }\n\n return 'bottom';\n });\n\n const placement = computed<Placement>(() => `${side.value}-${alignment.value}`);\n\n const classes = computed<Record<string,boolean|undefined>>(() => ({\n 'dropdown': props.dropup && props.dropright && props.dropleft,\n 'dropup': props.dropup,\n 'dropright': props.dropright,\n 'dropleft': props.dropleft,\n 'expanded': expanded.value,\n [props.size ?? '']: !!props.size,\n }));\n \n const buttonClasses = computed(() => {\n const classes = {\n btn: true,\n [props.variant ?? '']: !!props.variant,\n 'btn-block': !!props.block,\n 'no-caret': !props.caret\n };\n \n if(typeof props.buttonClass === 'string') {\n classes[props.buttonClass] = true;\n }\n else if(Array.isArray(props.buttonClass)) {\n for(const value of props.buttonClass) {\n classes[value] = true;\n }\n }\n else if(props.buttonClass) {\n Object.assign(classes, props.buttonClass);\n }\n\n return classes;\n });\n\n const { floatingStyles, update } = useFloating(target, menu, {\n placement: placement,\n middleware: props.middleware ?? [\n offset(props.offset ?? 5),\n flip()\n ]\n });\n\n function show() {\n expanded.value = true;\n\n if(!target.value || !menu.value) {\n return;\n }\n\n update();\n\n emit('show');\n }\n\n function hide() {\n expanded.value = false;\n\n target.value?.blur();\n\n emit('hide');\n }\n\n function toggle() {\n if(!expanded.value) {\n show();\n }\n else {\n hide();\n }\n }\n\n function isFocusable(element: HTMLElement) {\n const nodes = Array.from(menu.value?.$el.querySelectorAll('label, input, select, textarea') ?? []);\n\n for(const i in nodes) {\n if(element === nodes[i]) {\n return true;\n }\n }\n\n return false;\n }\n \n function onBlur(e: FocusEvent) {\n if(!(e.relatedTarget instanceof HTMLElement)) {\n hide();\n \n return;\n }\n \n if(menu.value && !menu.value?.$el.contains(e.relatedTarget) || !target.value?.contains(e.relatedTarget)) {\n hide();\n }\n }\n\n function onClick(e: MouseEvent) {\n emit('click', e);\n }\n\n function onClickToggle(e: MouseEvent) {\n e.target?.dispatchEvent(new Event('focus', e));\n \n emit('clickToggle', e);\n\n if(!e.defaultPrevented) {\n toggle();\n }\n }\n\n function onClickItem(e: PointerEvent) {\n if(!(e.target instanceof HTMLElement)) {\n hide();\n\n return;\n }\n\n if(!isFocusable(e.target) && !e.defaultPrevented) {\n hide();\n }\n }\n\n watchEffect(() => {\n if(expanded.value) {\n window.addEventListener('resize', update);\n }\n else {\n window.removeEventListener('resize', update);\n }\n });\n\n return {\n target,\n menu,\n alignment,\n expanded,\n floatingStyles,\n placement,\n side,\n classes,\n buttonClasses,\n show,\n hide,\n toggle,\n onBlur,\n onClick,\n onClickToggle,\n onClickItem\n };\n}","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group\"\n :class=\"classes\">\n <slot\n name=\"button\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n :class=\"{...buttonClasses, ['dropdown-toggle']: true}\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\">\n {{ label }}\n </button>\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group btn-dropdown-split\"\n :class=\"classes\">\n <slot\n v-if=\"!dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n <div class=\"btn-group\">\n <slot\n name=\"toggle\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n :class=\"{...buttonClasses, 'dropdown-toggle': true, 'dropdown-toggle-split': split}\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\" />\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n <slot\n v-if=\"dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { useTemplateRef } from 'vue';\nimport { type ComponentExposed } from 'vue-component-type-helpers';\nimport BtnDropdownSingle from './BtnDropdownSingle.vue';\nimport BtnDropdownSplit from './BtnDropdownSplit.vue';\nimport { BtnDropdownEvents, BtnDropdownProps } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<{\n split?: boolean\n} & BtnDropdownProps>(), {\n split: false,\n caret: true\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst el = useTemplateRef<ComponentExposed<typeof BtnDropdownSingle | typeof BtnDropdownSplit>>('el');\n\ndefineExpose({\n hide: () => el.value?.hide(),\n show: () => el.value?.show(),\n toggle: () => el.value?.toggle(),\n});\n</script>\n\n<template>\n <Component\n ref=\"el\"\n :is=\"!split ? BtnDropdownSingle : BtnDropdownSplit\"\n v-bind=\"props\"\n @click=\"(e: MouseEvent) => emit('click', e)\"\n @click-toggle=\"(e: MouseEvent) => emit('clickToggle', e)\"\n @show=\"() => emit('show')\"\n @hide=\"() => emit('hide')\">\n <template #button=\"slot\">\n <slot\n name=\"button\"\n v-bind=\"slot\" />\n </template>\n <template #toggle=\"slot\">\n <slot\n name=\"toggle\"\n v-bind=\"slot\" />\n </template>\n <template #split=\"slot\">\n <slot\n name=\"split\"\n v-bind=\"slot\" />\n </template>\n <slot />\n </Component>\n</template>"],"names":["useDropdownHandler","props","emit","target","ref","menu","expanded","alignment","computed","side","placement","classes","buttonClasses","value","floatingStyles","update","useFloating","offset","flip","show","hide","toggle","isFocusable","element","nodes","i","onBlur","e","onClick","onClickToggle","onClickItem","watchEffect","__props","__emit","__expose","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_normalizeProps","_guardReactiveProps","el","_createElementVNode","_cache","args","_hoisted_1","_createVNode","DropdownMenu","_hoisted_2","_hoisted_4","useTemplateRef","_openBlock","_createBlock","_resolveDynamicComponent","BtnDropdownSplit","BtnDropdownSingle","_mergeProps","_withCtx","slot"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(C,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vue-interface/dropdown-menu"),require("@floating-ui/dom"),require("@floating-ui/vue")):typeof define=="function"&&define.amd?define(["exports","vue","@vue-interface/dropdown-menu","@floating-ui/dom","@floating-ui/vue"],e):(C=typeof globalThis<"u"?globalThis:C||self,e(C.BtnDropdown={},C.Vue,C.VueInterfaceDropdownMenu,C.FloatingUiDom,C.FloatingUiVue))})(this,(function(C,e,S,T,x){"use strict";function P(t,k){const c=e.ref(),p=e.ref(),a=e.ref(!1),d=e.computed(()=>t.align??"start"),g=e.computed(()=>t.dropup?"top":t.dropleft?"left":t.dropright?"right":"bottom"),i=e.computed(()=>`${g.value}-${d.value}`),s=e.computed(()=>({dropdown:t.dropup&&t.dropright&&t.dropleft,dropup:t.dropup,dropright:t.dropright,dropleft:t.dropleft,expanded:a.value,[t.size??""]:!!t.size})),f=e.computed(()=>{const r={btn:!0,[t.variant??""]:!!t.variant,"btn-block":!!t.block,"no-caret":!t.caret};if(typeof t.buttonClass=="string")r[t.buttonClass]=!0;else if(Array.isArray(t.buttonClass))for(const z of t.buttonClass)r[z]=!0;else t.buttonClass&&Object.assign(r,t.buttonClass);return r}),{floatingStyles:B,update:w}=x.useFloating(c,p,{placement:i,middleware:t.middleware??[T.offset(t.offset??5),T.flip()]});function b(){a.value=!0,!(!c.value||!p.value)&&(w(),k("show"))}function y(){a.value=!1,c.value?.blur(),k("hide")}function l(){a.value?y():b()}function m(r){const z=Array.from(p.value?.$el.querySelectorAll("label, input, select, textarea")??[]);for(const A in z)if(r===z[A])return!0;return!1}function h(r){if(!(r.relatedTarget instanceof HTMLElement)){y();return}(p.value&&!p.value?.$el.contains(r.relatedTarget)||!c.value?.contains(r.relatedTarget))&&y()}function u(r){k("click",r)}function n(r){r.target?.dispatchEvent(new Event("focus",r)),k("clickToggle",r),r.defaultPrevented||l()}function o(r){if(!(r.target instanceof HTMLElement)){y();return}!m(r.target)&&!r.defaultPrevented&&y()}return e.watchEffect(()=>{a.value?window.addEventListener("resize",w):window.removeEventListener("resize",w)}),{target:c,menu:p,alignment:d,expanded:a,floatingStyles:B,placement:i,side:g,classes:s,buttonClasses:f,show:b,hide:y,toggle:l,onBlur:h,onClick:u,onClickToggle:n,onClickItem:o}}const $=["aria-expanded"],D=e.defineComponent({__name:"BtnDropdownSingle",props:{align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},split:{type:Boolean},variant:{default:"btn-primary"}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:c}){const p=t,a=c,{target:d,menu:g,buttonClasses:i,classes:s,expanded:f,floatingStyles:B,show:w,hide:b,toggle:y,onBlur:l,onClickToggle:m,onClickItem:h}=P(p,a);return k({show:w,hide:b,toggle:y}),(u,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["btn-group",e.unref(s)])},[e.renderSlot(u.$slots,"button",e.normalizeProps(e.guardReactiveProps({target:o=>d.value=o,expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{ref_key:"target",ref:d,type:"button",class:e.normalizeClass({...e.unref(i),"dropdown-toggle":!0}),"aria-haspopup":"true","aria-expanded":e.unref(f),onBlur:n[0]||(n[0]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[1]||(n[1]=(...o)=>e.unref(m)&&e.unref(m)(...o))},e.toDisplayString(t.label),43,$)]),e.createVNode(e.unref(S.DropdownMenu),{ref_key:"menu",ref:g,class:e.normalizeClass({show:e.unref(f)}),style:e.normalizeStyle(e.unref(B)),onBlur:e.unref(l),onClick:e.unref(h),onMousedown:n[2]||(n[2]=e.withModifiers(()=>{},["prevent"]))},{default:e.withCtx(()=>[e.renderSlot(u.$slots,"default")]),_:3},8,["class","style","onBlur","onClick"])],2))}}),E=["aria-expanded"],V={class:"btn-group"},M=["aria-expanded"],N=["aria-expanded"],R=e.defineComponent({__name:"BtnDropdownSplit",props:{align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},split:{type:Boolean},variant:{default:"btn-primary"}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:c}){const p=t,a=c,{target:d,menu:g,buttonClasses:i,classes:s,expanded:f,floatingStyles:B,show:w,hide:b,toggle:y,onBlur:l,onClickToggle:m,onClickItem:h}=P(p,a);return k({show:w,hide:b,toggle:y}),(u,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["btn-group btn-dropdown-split",e.unref(s)])},[t.dropleft?e.createCommentVNode("",!0):e.renderSlot(u.$slots,"button",e.normalizeProps(e.mergeProps({key:0},{expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(i)),"aria-haspopup":"true","aria-expanded":e.unref(f),onBlur:n[0]||(n[0]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[1]||(n[1]=(...o)=>u.onClick&&u.onClick(...o))},e.toDisplayString(t.label),43,E)]),e.createElementVNode("div",V,[e.renderSlot(u.$slots,"toggle",e.normalizeProps(e.guardReactiveProps({target:o=>d.value=o,expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{ref_key:"target",ref:d,type:"button","aria-haspopup":"true","aria-expanded":e.unref(f),class:e.normalizeClass({...e.unref(i),"dropdown-toggle":!0,"dropdown-toggle-split":t.split}),onBlur:n[2]||(n[2]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[3]||(n[3]=(...o)=>e.unref(m)&&e.unref(m)(...o))},null,42,M)]),e.createVNode(e.unref(S.DropdownMenu),{ref_key:"menu",ref:g,class:e.normalizeClass({show:e.unref(f)}),style:e.normalizeStyle(e.unref(B)),onBlur:e.unref(l),onClick:e.unref(h),onMousedown:n[4]||(n[4]=e.withModifiers(()=>{},["prevent"]))},{default:e.withCtx(()=>[e.renderSlot(u.$slots,"default")]),_:3},8,["class","style","onBlur","onClick"])]),t.dropleft?e.renderSlot(u.$slots,"button",e.normalizeProps(e.mergeProps({key:1},{expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(i)),"aria-haspopup":"true","aria-expanded":e.unref(f),onBlur:n[5]||(n[5]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[6]||(n[6]=(...o)=>u.onClick&&u.onClick(...o))},e.toDisplayString(t.label),43,N)]):e.createCommentVNode("",!0)],2))}}),q=e.defineComponent({__name:"BtnDropdown",props:{split:{type:Boolean,default:!1},align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},variant:{}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:c}){const p=t,a=c,d=e.useTemplateRef("el");return k({show:()=>d.value?.show(),hide:()=>d.value?.hide(),toggle:()=>d.value?.hide()}),(g,i)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.split?R:D),e.mergeProps({ref_key:"el",ref:d},p,{onClick:i[0]||(i[0]=s=>a("click",s)),onClickToggle:i[1]||(i[1]=s=>a("clickToggle",s)),onShow:i[2]||(i[2]=()=>a("show")),onHide:i[3]||(i[3]=()=>a("hide"))}),{button:e.withCtx(s=>[e.renderSlot(g.$slots,"button",e.normalizeProps(e.guardReactiveProps(s)))]),toggle:e.withCtx(s=>[e.renderSlot(g.$slots,"toggle",e.normalizeProps(e.guardReactiveProps(s)))]),split:e.withCtx(s=>[e.renderSlot(g.$slots,"split",e.normalizeProps(e.guardReactiveProps(s)))]),default:e.withCtx(()=>[e.renderSlot(g.$slots,"default")]),_:3},16))}});C.BtnDropdown=q,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(C,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vue-interface/dropdown-menu"),require("@floating-ui/dom"),require("@floating-ui/vue")):typeof define=="function"&&define.amd?define(["exports","vue","@vue-interface/dropdown-menu","@floating-ui/dom","@floating-ui/vue"],e):(C=typeof globalThis<"u"?globalThis:C||self,e(C.BtnDropdown={},C.Vue,C.VueInterfaceDropdownMenu,C.FloatingUiDom,C.FloatingUiVue))})(this,(function(C,e,S,T,x){"use strict";function P(t,k){const c=e.ref(),p=e.ref(),a=e.ref(!1),d=e.computed(()=>t.align??"start"),g=e.computed(()=>t.dropup?"top":t.dropleft?"left":t.dropright?"right":"bottom"),i=e.computed(()=>`${g.value}-${d.value}`),s=e.computed(()=>({dropdown:t.dropup&&t.dropright&&t.dropleft,dropup:t.dropup,dropright:t.dropright,dropleft:t.dropleft,expanded:a.value,[t.size??""]:!!t.size})),f=e.computed(()=>{const r={btn:!0,[t.variant??""]:!!t.variant,"btn-block":!!t.block,"no-caret":!t.caret};if(typeof t.buttonClass=="string")r[t.buttonClass]=!0;else if(Array.isArray(t.buttonClass))for(const z of t.buttonClass)r[z]=!0;else t.buttonClass&&Object.assign(r,t.buttonClass);return r}),{floatingStyles:B,update:w}=x.useFloating(c,p,{placement:i,middleware:t.middleware??[T.offset(t.offset??5),T.flip()]});function b(){a.value=!0,!(!c.value||!p.value)&&(w(),k("show"))}function y(){a.value=!1,c.value?.blur(),k("hide")}function l(){a.value?y():b()}function m(r){const z=Array.from(p.value?.$el.querySelectorAll("label, input, select, textarea")??[]);for(const A in z)if(r===z[A])return!0;return!1}function h(r){if(!(r.relatedTarget instanceof HTMLElement)){y();return}(p.value&&!p.value?.$el.contains(r.relatedTarget)||!c.value?.contains(r.relatedTarget))&&y()}function u(r){k("click",r)}function n(r){r.target?.dispatchEvent(new Event("focus",r)),k("clickToggle",r),r.defaultPrevented||l()}function o(r){if(!(r.target instanceof HTMLElement)){y();return}!m(r.target)&&!r.defaultPrevented&&y()}return e.watchEffect(()=>{a.value?window.addEventListener("resize",w):window.removeEventListener("resize",w)}),{target:c,menu:p,alignment:d,expanded:a,floatingStyles:B,placement:i,side:g,classes:s,buttonClasses:f,show:b,hide:y,toggle:l,onBlur:h,onClick:u,onClickToggle:n,onClickItem:o}}const $=["aria-expanded"],D=e.defineComponent({__name:"BtnDropdownSingle",props:{align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},split:{type:Boolean},variant:{default:"btn-primary"}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:c}){const p=t,a=c,{target:d,menu:g,buttonClasses:i,classes:s,expanded:f,floatingStyles:B,show:w,hide:b,toggle:y,onBlur:l,onClickToggle:m,onClickItem:h}=P(p,a);return k({show:w,hide:b,toggle:y}),(u,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["btn-group",e.unref(s)])},[e.renderSlot(u.$slots,"button",e.normalizeProps(e.guardReactiveProps({target:o=>d.value=o,expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{ref_key:"target",ref:d,type:"button",class:e.normalizeClass({...e.unref(i),"dropdown-toggle":!0}),"aria-haspopup":"true","aria-expanded":e.unref(f),onBlur:n[0]||(n[0]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[1]||(n[1]=(...o)=>e.unref(m)&&e.unref(m)(...o))},e.toDisplayString(t.label),43,$)]),e.createVNode(e.unref(S.DropdownMenu),{ref_key:"menu",ref:g,class:e.normalizeClass({show:e.unref(f)}),style:e.normalizeStyle(e.unref(B)),onBlur:e.unref(l),onClick:e.unref(h),onMousedown:n[2]||(n[2]=e.withModifiers(()=>{},["prevent"]))},{default:e.withCtx(()=>[e.renderSlot(u.$slots,"default")]),_:3},8,["class","style","onBlur","onClick"])],2))}}),E=["aria-expanded"],V={class:"btn-group"},M=["aria-expanded"],N=["aria-expanded"],R=e.defineComponent({__name:"BtnDropdownSplit",props:{align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},split:{type:Boolean},variant:{default:"btn-primary"}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:c}){const p=t,a=c,{target:d,menu:g,buttonClasses:i,classes:s,expanded:f,floatingStyles:B,show:w,hide:b,toggle:y,onBlur:l,onClickToggle:m,onClickItem:h}=P(p,a);return k({show:w,hide:b,toggle:y}),(u,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["btn-group btn-dropdown-split",e.unref(s)])},[t.dropleft?e.createCommentVNode("",!0):e.renderSlot(u.$slots,"button",e.normalizeProps(e.mergeProps({key:0},{expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(i)),"aria-haspopup":"true","aria-expanded":e.unref(f),onBlur:n[0]||(n[0]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[1]||(n[1]=(...o)=>u.onClick&&u.onClick(...o))},e.toDisplayString(t.label),43,E)]),e.createElementVNode("div",V,[e.renderSlot(u.$slots,"toggle",e.normalizeProps(e.guardReactiveProps({target:o=>d.value=o,expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{ref_key:"target",ref:d,type:"button","aria-haspopup":"true","aria-expanded":e.unref(f),class:e.normalizeClass({...e.unref(i),"dropdown-toggle":!0,"dropdown-toggle-split":t.split}),onBlur:n[2]||(n[2]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[3]||(n[3]=(...o)=>e.unref(m)&&e.unref(m)(...o))},null,42,M)]),e.createVNode(e.unref(S.DropdownMenu),{ref_key:"menu",ref:g,class:e.normalizeClass({show:e.unref(f)}),style:e.normalizeStyle(e.unref(B)),onBlur:e.unref(l),onClick:e.unref(h),onMousedown:n[4]||(n[4]=e.withModifiers(()=>{},["prevent"]))},{default:e.withCtx(()=>[e.renderSlot(u.$slots,"default")]),_:3},8,["class","style","onBlur","onClick"])]),t.dropleft?e.renderSlot(u.$slots,"button",e.normalizeProps(e.mergeProps({key:1},{expanded:e.unref(f),onBlur:e.unref(l),onClickToggle:e.unref(m)})),()=>[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(i)),"aria-haspopup":"true","aria-expanded":e.unref(f),onBlur:n[5]||(n[5]=(...o)=>e.unref(l)&&e.unref(l)(...o)),onClick:n[6]||(n[6]=(...o)=>u.onClick&&u.onClick(...o))},e.toDisplayString(t.label),43,N)]):e.createCommentVNode("",!0)],2))}}),q=e.defineComponent({__name:"BtnDropdown",props:{split:{type:Boolean,default:!1},align:{},block:{type:Boolean},buttonClass:{},caret:{type:Boolean,default:!0},dropup:{type:Boolean},dropright:{type:Boolean},dropleft:{type:Boolean},label:{},offset:{},middleware:{},side:{},size:{},variant:{}},emits:["click","clickToggle","show","hide"],setup(t,{expose:k,emit:c}){const p=t,a=c,d=e.useTemplateRef("el");return k({hide:()=>d.value?.hide(),show:()=>d.value?.show(),toggle:()=>d.value?.toggle()}),(g,i)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.split?R:D),e.mergeProps({ref_key:"el",ref:d},p,{onClick:i[0]||(i[0]=s=>a("click",s)),onClickToggle:i[1]||(i[1]=s=>a("clickToggle",s)),onShow:i[2]||(i[2]=()=>a("show")),onHide:i[3]||(i[3]=()=>a("hide"))}),{button:e.withCtx(s=>[e.renderSlot(g.$slots,"button",e.normalizeProps(e.guardReactiveProps(s)))]),toggle:e.withCtx(s=>[e.renderSlot(g.$slots,"toggle",e.normalizeProps(e.guardReactiveProps(s)))]),split:e.withCtx(s=>[e.renderSlot(g.$slots,"split",e.normalizeProps(e.guardReactiveProps(s)))]),default:e.withCtx(()=>[e.renderSlot(g.$slots,"default")]),_:3},16))}});C.BtnDropdown=q,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=btn-dropdown.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"btn-dropdown.umd.cjs","sources":["../src/useDropdownHandler.ts","../src/BtnDropdownSingle.vue","../src/BtnDropdownSplit.vue","../src/BtnDropdown.vue"],"sourcesContent":["import { flip, offset, Placement, type Alignment, type Middleware, type OffsetOptions, type Side } from '@floating-ui/dom';\nimport { useFloating } from '@floating-ui/vue';\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { computed, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';\n\ntype LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);\n\nexport type BtnGroupSizes = 'btn-group-xs'\n | 'btn-group-sm' \n | 'btn-group-md'\n | 'btn-group-lg'\n | 'btn-group-xl'\n | 'btn-group-2xl'\n | 'btn-group-3xl'\n | 'btn-group-4xl';\n\nexport type BtnDropdownProps = {\n align?: Alignment;\n block?: boolean;\n buttonClass?: HTMLAttributes['class'],\n caret?: boolean;\n dropup?: boolean;\n dropright?: boolean;\n dropleft?: boolean;\n label?: string;\n offset?: OffsetOptions,\n middleware?: Middleware[],\n side?: Side;\n size?: LiteralUnion<BtnGroupSizes>;\n split?: boolean;\n variant?: string;\n}\n\nexport type BtnDropdownEvents = {\n click: [event: MouseEvent];\n clickToggle: [event: MouseEvent];\n show: [],\n hide: []\n}\n\nexport function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>) {\n const target = ref<HTMLElement>();\n const menu = ref<InstanceType<typeof DropdownMenu>>();\n const expanded = ref(false);\n\n\n const alignment = computed<Alignment>(() => props.align ?? 'start');\n\n const side = computed<Side>(() => {\n if(props.dropup) {\n return 'top';\n }\n\n if(props.dropleft) {\n return 'left';\n }\n\n if(props.dropright) {\n return 'right';\n }\n\n return 'bottom';\n });\n\n const placement = computed<Placement>(() => `${side.value}-${alignment.value}`);\n\n const classes = computed(() => ({\n 'dropdown': props.dropup && props.dropright && props.dropleft,\n 'dropup': props.dropup,\n 'dropright': props.dropright,\n 'dropleft': props.dropleft,\n 'expanded': expanded.value,\n [props.size ?? '']: !!props.size,\n }));\n \n const buttonClasses = computed(() => {\n const classes = {\n btn: true,\n [props.variant ?? '']: !!props.variant,\n 'btn-block': !!props.block,\n 'no-caret': !props.caret\n };\n \n if(typeof props.buttonClass === 'string') {\n classes[props.buttonClass] = true;\n }\n else if(Array.isArray(props.buttonClass)) {\n for(const value of props.buttonClass) {\n classes[value] = true;\n }\n }\n else if(props.buttonClass) {\n Object.assign(classes, props.buttonClass);\n }\n\n return classes;\n });\n\n const { floatingStyles, update } = useFloating(target, menu, {\n placement: placement,\n middleware: props.middleware ?? [\n offset(props.offset ?? 5),\n flip()\n ]\n });\n\n function show() {\n expanded.value = true;\n\n if(!target.value || !menu.value) {\n return;\n }\n\n update();\n\n emit('show');\n }\n\n function hide() {\n expanded.value = false;\n\n target.value?.blur();\n\n emit('hide');\n }\n\n function toggle() {\n if(!expanded.value) {\n show();\n }\n else {\n hide();\n }\n }\n\n function isFocusable(element: HTMLElement) {\n const nodes = Array.from(menu.value?.$el.querySelectorAll('label, input, select, textarea') ?? []);\n\n for(const i in nodes) {\n if(element === nodes[i]) {\n return true;\n }\n }\n\n return false;\n }\n \n function onBlur(e: FocusEvent) {\n if(!(e.relatedTarget instanceof HTMLElement)) {\n hide();\n \n return;\n }\n \n if(menu.value && !menu.value?.$el.contains(e.relatedTarget) || !target.value?.contains(e.relatedTarget)) {\n hide();\n }\n }\n\n function onClick(e: MouseEvent) {\n emit('click', e);\n }\n\n function onClickToggle(e: MouseEvent) {\n e.target?.dispatchEvent(new Event('focus', e));\n \n emit('clickToggle', e);\n\n if(!e.defaultPrevented) {\n toggle();\n }\n }\n\n function onClickItem(e: PointerEvent) {\n if(!(e.target instanceof HTMLElement)) {\n hide();\n\n return;\n }\n\n if(!isFocusable(e.target) && !e.defaultPrevented) {\n hide();\n }\n }\n\n watchEffect(() => {\n if(expanded.value) {\n window.addEventListener('resize', update);\n }\n else {\n window.removeEventListener('resize', update);\n }\n });\n\n return {\n target,\n menu,\n alignment,\n expanded,\n floatingStyles,\n placement,\n side,\n classes,\n buttonClasses,\n show,\n hide,\n toggle,\n onBlur,\n onClick,\n onClickToggle,\n onClickItem\n };\n}","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group\"\n :class=\"classes\">\n <slot\n name=\"button\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n :class=\"{...buttonClasses, ['dropdown-toggle']: true}\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\">\n {{ label }}\n </button>\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group btn-dropdown-split\"\n :class=\"classes\">\n <slot\n v-if=\"!dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n <div class=\"btn-group\">\n <slot\n name=\"toggle\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n :class=\"{...buttonClasses, 'dropdown-toggle': true, 'dropdown-toggle-split': split}\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\" />\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n <slot\n v-if=\"dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { useTemplateRef } from 'vue';\nimport { ComponentExposed } from 'vue-component-type-helpers';\nimport BtnDropdownSingle from './BtnDropdownSingle.vue';\nimport BtnDropdownSplit from './BtnDropdownSplit.vue';\nimport { BtnDropdownEvents, BtnDropdownProps } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<{\n split?: boolean\n} & BtnDropdownProps>(), {\n split: false,\n caret: true\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\nconst el = useTemplateRef<ComponentExposed<typeof BtnDropdownSingle | typeof BtnDropdownSplit>>('el');\n\ndefineExpose({\n show: () => el.value?.show(),\n hide: () => el.value?.hide(),\n toggle: () => el.value?.hide(),\n});\n</script>\n\n<template>\n <Component\n ref=\"el\"\n :is=\"!split ? BtnDropdownSingle : BtnDropdownSplit\"\n v-bind=\"props\"\n @click=\"(e: MouseEvent) => emit('click', e)\"\n @click-toggle=\"(e: MouseEvent) => emit('clickToggle', e)\"\n @show=\"() => emit('show')\"\n @hide=\"() => emit('hide')\">\n <template #button=\"slot\">\n <slot\n name=\"button\"\n v-bind=\"slot\" />\n </template>\n <template #toggle=\"slot\">\n <slot\n name=\"toggle\"\n v-bind=\"slot\" />\n </template>\n <template #split=\"slot\">\n <slot\n name=\"split\"\n v-bind=\"slot\" />\n </template>\n <slot />\n </Component>\n</template>"],"names":["useDropdownHandler","props","emit","target","ref","menu","expanded","alignment","computed","side","placement","classes","buttonClasses","value","floatingStyles","update","useFloating","offset","flip","show","hide","toggle","isFocusable","element","nodes","i","onBlur","e","onClick","onClickToggle","onClickItem","watchEffect","__props","__emit","__expose","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_normalizeProps","_guardReactiveProps","el","_createElementVNode","_cache","args","_hoisted_1","_createVNode","DropdownMenu","_hoisted_2","_hoisted_4","useTemplateRef","_openBlock","_createBlock","_resolveDynamicComponent","BtnDropdownSplit","BtnDropdownSingle","_mergeProps","_withCtx","slot"],"mappings":"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"}
1
+ {"version":3,"file":"btn-dropdown.umd.cjs","sources":["../src/useDropdownHandler.ts","../src/BtnDropdownSingle.vue","../src/BtnDropdownSplit.vue","../src/BtnDropdown.vue"],"sourcesContent":["import { flip, offset, Placement, type Alignment, type Middleware, type OffsetOptions, type Side } from '@floating-ui/dom';\nimport { useFloating, UseFloatingReturn } from '@floating-ui/vue';\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { computed, ComputedRef, Ref, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';\n\ntype LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);\n\nexport type BtnGroupSizes = 'btn-group-xs'\n | 'btn-group-sm' \n | 'btn-group-md'\n | 'btn-group-lg'\n | 'btn-group-xl'\n | 'btn-group-2xl'\n | 'btn-group-3xl'\n | 'btn-group-4xl';\n\nexport type BtnDropdownProps = {\n align?: Alignment;\n block?: boolean;\n buttonClass?: HTMLAttributes['class'],\n caret?: boolean;\n dropup?: boolean;\n dropright?: boolean;\n dropleft?: boolean;\n label?: string;\n offset?: OffsetOptions,\n middleware?: Middleware[],\n side?: Side;\n size?: LiteralUnion<BtnGroupSizes>;\n split?: boolean;\n variant?: string;\n}\n\nexport type BtnDropdownEvents = {\n click: [event: MouseEvent];\n clickToggle: [event: MouseEvent];\n show: [],\n hide: []\n}\n\nexport type UseDropdownHandler = {\n target: Ref<HTMLElement|undefined>;\n menu: Ref<InstanceType<typeof DropdownMenu>|undefined>;\n alignment: ComputedRef<Alignment>;\n expanded: Ref<boolean>;\n floatingStyles: UseFloatingReturn['floatingStyles'];\n placement: ComputedRef<Placement>;\n side: ComputedRef<Side>;\n classes: ComputedRef<Record<string, boolean|undefined>>;\n buttonClasses: ComputedRef<Record<string, boolean>>;\n show: () => void;\n hide: () => void;\n toggle: () => void;\n onBlur: (e: FocusEvent) => void;\n onClick: (e: MouseEvent) => void;\n onClickToggle: (e: MouseEvent) => void;\n onClickItem: (e: PointerEvent) => void;\n}\n\nexport function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>): UseDropdownHandler {\n const target = ref<HTMLElement>();\n const menu = ref<InstanceType<typeof DropdownMenu>>();\n const expanded = ref(false);\n\n const alignment = computed<Alignment>(() => props.align ?? 'start');\n\n const side = computed<Side>(() => {\n if(props.dropup) {\n return 'top';\n }\n\n if(props.dropleft) {\n return 'left';\n }\n\n if(props.dropright) {\n return 'right';\n }\n\n return 'bottom';\n });\n\n const placement = computed<Placement>(() => `${side.value}-${alignment.value}`);\n\n const classes = computed<Record<string,boolean|undefined>>(() => ({\n 'dropdown': props.dropup && props.dropright && props.dropleft,\n 'dropup': props.dropup,\n 'dropright': props.dropright,\n 'dropleft': props.dropleft,\n 'expanded': expanded.value,\n [props.size ?? '']: !!props.size,\n }));\n \n const buttonClasses = computed(() => {\n const classes = {\n btn: true,\n [props.variant ?? '']: !!props.variant,\n 'btn-block': !!props.block,\n 'no-caret': !props.caret\n };\n \n if(typeof props.buttonClass === 'string') {\n classes[props.buttonClass] = true;\n }\n else if(Array.isArray(props.buttonClass)) {\n for(const value of props.buttonClass) {\n classes[value] = true;\n }\n }\n else if(props.buttonClass) {\n Object.assign(classes, props.buttonClass);\n }\n\n return classes;\n });\n\n const { floatingStyles, update } = useFloating(target, menu, {\n placement: placement,\n middleware: props.middleware ?? [\n offset(props.offset ?? 5),\n flip()\n ]\n });\n\n function show() {\n expanded.value = true;\n\n if(!target.value || !menu.value) {\n return;\n }\n\n update();\n\n emit('show');\n }\n\n function hide() {\n expanded.value = false;\n\n target.value?.blur();\n\n emit('hide');\n }\n\n function toggle() {\n if(!expanded.value) {\n show();\n }\n else {\n hide();\n }\n }\n\n function isFocusable(element: HTMLElement) {\n const nodes = Array.from(menu.value?.$el.querySelectorAll('label, input, select, textarea') ?? []);\n\n for(const i in nodes) {\n if(element === nodes[i]) {\n return true;\n }\n }\n\n return false;\n }\n \n function onBlur(e: FocusEvent) {\n if(!(e.relatedTarget instanceof HTMLElement)) {\n hide();\n \n return;\n }\n \n if(menu.value && !menu.value?.$el.contains(e.relatedTarget) || !target.value?.contains(e.relatedTarget)) {\n hide();\n }\n }\n\n function onClick(e: MouseEvent) {\n emit('click', e);\n }\n\n function onClickToggle(e: MouseEvent) {\n e.target?.dispatchEvent(new Event('focus', e));\n \n emit('clickToggle', e);\n\n if(!e.defaultPrevented) {\n toggle();\n }\n }\n\n function onClickItem(e: PointerEvent) {\n if(!(e.target instanceof HTMLElement)) {\n hide();\n\n return;\n }\n\n if(!isFocusable(e.target) && !e.defaultPrevented) {\n hide();\n }\n }\n\n watchEffect(() => {\n if(expanded.value) {\n window.addEventListener('resize', update);\n }\n else {\n window.removeEventListener('resize', update);\n }\n });\n\n return {\n target,\n menu,\n alignment,\n expanded,\n floatingStyles,\n placement,\n side,\n classes,\n buttonClasses,\n show,\n hide,\n toggle,\n onBlur,\n onClick,\n onClickToggle,\n onClickItem\n };\n}","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group\"\n :class=\"classes\">\n <slot\n name=\"button\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n :class=\"{...buttonClasses, ['dropdown-toggle']: true}\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\">\n {{ label }}\n </button>\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { DropdownMenu } from '@vue-interface/dropdown-menu';\nimport { BtnDropdownEvents, BtnDropdownProps, useDropdownHandler } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<BtnDropdownProps>(), {\n caret: true,\n variant: 'btn-primary'\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst {\n target,\n menu,\n buttonClasses,\n classes,\n expanded,\n floatingStyles,\n show,\n hide,\n toggle,\n onBlur,\n onClickToggle,\n onClickItem\n} = useDropdownHandler(props, emit);\n\ndefineExpose({\n show,\n hide,\n toggle,\n});\n</script>\n\n<template>\n <div\n class=\"btn-group btn-dropdown-split\"\n :class=\"classes\">\n <slot\n v-if=\"!dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n <div class=\"btn-group\">\n <slot\n name=\"toggle\"\n v-bind=\"{ target: (el: HTMLElement) => target = el, expanded, onBlur, onClickToggle }\">\n <button\n ref=\"target\"\n type=\"button\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n :class=\"{...buttonClasses, 'dropdown-toggle': true, 'dropdown-toggle-split': split}\"\n @blur=\"onBlur\"\n @click=\"onClickToggle\" />\n </slot>\n <DropdownMenu\n ref=\"menu\"\n :class=\"{\n 'show': expanded\n }\"\n :style=\"floatingStyles\"\n @blur=\"onBlur\"\n @click=\"onClickItem\"\n @mousedown.prevent>\n <slot />\n </DropdownMenu>\n </div>\n <slot\n v-if=\"dropleft\"\n name=\"button\"\n v-bind=\"{ expanded, onBlur, onClickToggle }\">\n <button\n type=\"button\"\n :class=\"buttonClasses\"\n aria-haspopup=\"true\"\n :aria-expanded=\"expanded\"\n @blur=\"onBlur\"\n @click=\"onClick\">\n {{ label }}\n </button>\n </slot>\n </div>\n</template>","<script setup lang=\"ts\">\nimport { useTemplateRef } from 'vue';\nimport { type ComponentExposed } from 'vue-component-type-helpers';\nimport BtnDropdownSingle from './BtnDropdownSingle.vue';\nimport BtnDropdownSplit from './BtnDropdownSplit.vue';\nimport { BtnDropdownEvents, BtnDropdownProps } from './useDropdownHandler';\n\nconst props = withDefaults(defineProps<{\n split?: boolean\n} & BtnDropdownProps>(), {\n split: false,\n caret: true\n});\n\nconst emit = defineEmits<BtnDropdownEvents>();\n\nconst el = useTemplateRef<ComponentExposed<typeof BtnDropdownSingle | typeof BtnDropdownSplit>>('el');\n\ndefineExpose({\n hide: () => el.value?.hide(),\n show: () => el.value?.show(),\n toggle: () => el.value?.toggle(),\n});\n</script>\n\n<template>\n <Component\n ref=\"el\"\n :is=\"!split ? BtnDropdownSingle : BtnDropdownSplit\"\n v-bind=\"props\"\n @click=\"(e: MouseEvent) => emit('click', e)\"\n @click-toggle=\"(e: MouseEvent) => emit('clickToggle', e)\"\n @show=\"() => emit('show')\"\n @hide=\"() => emit('hide')\">\n <template #button=\"slot\">\n <slot\n name=\"button\"\n v-bind=\"slot\" />\n </template>\n <template #toggle=\"slot\">\n <slot\n name=\"toggle\"\n v-bind=\"slot\" />\n </template>\n <template #split=\"slot\">\n <slot\n name=\"split\"\n v-bind=\"slot\" />\n </template>\n <slot />\n </Component>\n</template>"],"names":["useDropdownHandler","props","emit","target","ref","menu","expanded","alignment","computed","side","placement","classes","buttonClasses","value","floatingStyles","update","useFloating","offset","flip","show","hide","toggle","isFocusable","element","nodes","i","onBlur","e","onClick","onClickToggle","onClickItem","watchEffect","__props","__emit","__expose","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_normalizeProps","_guardReactiveProps","el","_createElementVNode","_cache","args","_hoisted_1","_createVNode","DropdownMenu","_hoisted_2","_hoisted_4","useTemplateRef","_openBlock","_createBlock","_resolveDynamicComponent","BtnDropdownSplit","BtnDropdownSingle","_mergeProps","_withCtx","slot"],"mappings":"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"}
@@ -0,0 +1,358 @@
1
+ import { BtnDropdownProps } from './useDropdownHandler';
2
+ type __VLS_Props = {
3
+ split?: boolean;
4
+ } & BtnDropdownProps;
5
+ declare function __VLS_template(): {
6
+ attrs: Partial<{}>;
7
+ slots: {
8
+ button?(_: {
9
+ target: (el: HTMLElement) => HTMLElement;
10
+ expanded: boolean;
11
+ onBlur: (e: FocusEvent) => void;
12
+ onClickToggle: (e: MouseEvent) => void;
13
+ }): any;
14
+ toggle?(_: any): any;
15
+ split?(_: any): any;
16
+ default?(_: {}): any;
17
+ };
18
+ refs: {
19
+ el: ({
20
+ $: import('vue').ComponentInternalInstance;
21
+ $data: {};
22
+ $props: {
23
+ readonly align?: import('@floating-ui/dom').Alignment | undefined;
24
+ readonly block?: boolean | undefined;
25
+ readonly buttonClass?: import('vue').HTMLAttributes["class"];
26
+ readonly caret?: boolean | undefined;
27
+ readonly dropup?: boolean | undefined;
28
+ readonly dropright?: boolean | undefined;
29
+ readonly dropleft?: boolean | undefined;
30
+ readonly label?: string | undefined;
31
+ readonly offset?: import('@floating-ui/dom').OffsetOptions | undefined;
32
+ readonly middleware?: import('@floating-ui/dom').Middleware[] | undefined;
33
+ readonly side?: import('@floating-ui/dom').Side | undefined;
34
+ readonly size?: (import('./useDropdownHandler').BtnGroupSizes | (string & Record<never, never>)) | undefined;
35
+ readonly split?: boolean | undefined;
36
+ readonly variant?: string | undefined;
37
+ readonly onShow?: (() => any) | undefined;
38
+ readonly onClick?: ((event: MouseEvent) => any) | undefined;
39
+ readonly onClickToggle?: ((event: MouseEvent) => any) | undefined;
40
+ readonly onHide?: (() => any) | undefined;
41
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
42
+ $attrs: {
43
+ [x: string]: unknown;
44
+ };
45
+ $refs: {
46
+ [x: string]: unknown;
47
+ } & {
48
+ target: HTMLButtonElement;
49
+ menu: ({
50
+ $: import('vue').ComponentInternalInstance;
51
+ $data: {};
52
+ $props: {
53
+ readonly align?: "left" | "right" | undefined;
54
+ readonly show?: boolean | undefined;
55
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
56
+ $attrs: {
57
+ [x: string]: unknown;
58
+ };
59
+ $refs: {
60
+ [x: string]: unknown;
61
+ };
62
+ $slots: Readonly<{
63
+ [name: string]: import('vue').Slot<any> | undefined;
64
+ }>;
65
+ $root: import('vue').ComponentPublicInstance | null;
66
+ $parent: import('vue').ComponentPublicInstance | null;
67
+ $host: Element | null;
68
+ $emit: (event: string, ...args: any[]) => void;
69
+ $el: HTMLDivElement;
70
+ $options: import('vue').ComponentOptionsBase<Readonly<{
71
+ align?: "left" | "right";
72
+ show?: boolean;
73
+ }> & Readonly<{}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {
74
+ align: "left" | "right";
75
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
76
+ beforeCreate?: (() => void) | (() => void)[];
77
+ created?: (() => void) | (() => void)[];
78
+ beforeMount?: (() => void) | (() => void)[];
79
+ mounted?: (() => void) | (() => void)[];
80
+ beforeUpdate?: (() => void) | (() => void)[];
81
+ updated?: (() => void) | (() => void)[];
82
+ activated?: (() => void) | (() => void)[];
83
+ deactivated?: (() => void) | (() => void)[];
84
+ beforeDestroy?: (() => void) | (() => void)[];
85
+ beforeUnmount?: (() => void) | (() => void)[];
86
+ destroyed?: (() => void) | (() => void)[];
87
+ unmounted?: (() => void) | (() => void)[];
88
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
89
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
90
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
91
+ };
92
+ $forceUpdate: () => void;
93
+ $nextTick: typeof import('vue').nextTick;
94
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
95
+ } & Readonly<{
96
+ align: "left" | "right";
97
+ }> & Omit<Readonly<{
98
+ align?: "left" | "right";
99
+ show?: boolean;
100
+ }> & Readonly<{}>, "align"> & import('vue').ShallowUnwrapRef<{}> & {} & import('vue').ComponentCustomProperties & {} & {
101
+ $slots: {
102
+ default?(_: {}): any;
103
+ };
104
+ }) | null;
105
+ };
106
+ $slots: Readonly<{
107
+ [name: string]: import('vue').Slot<any> | undefined;
108
+ }>;
109
+ $root: import('vue').ComponentPublicInstance | null;
110
+ $parent: import('vue').ComponentPublicInstance | null;
111
+ $host: Element | null;
112
+ $emit: ((event: "show") => void) & ((event: "click", event: MouseEvent) => void) & ((event: "clickToggle", event: MouseEvent) => void) & ((event: "hide") => void);
113
+ $el: HTMLDivElement;
114
+ $options: import('vue').ComponentOptionsBase<Readonly<BtnDropdownProps> & Readonly<{
115
+ onShow?: (() => any) | undefined;
116
+ onClick?: ((event: MouseEvent) => any) | undefined;
117
+ onClickToggle?: ((event: MouseEvent) => any) | undefined;
118
+ onHide?: (() => any) | undefined;
119
+ }>, {
120
+ show: () => void;
121
+ hide: () => void;
122
+ toggle: () => void;
123
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
124
+ show: () => any;
125
+ click: (event: MouseEvent) => any;
126
+ clickToggle: (event: MouseEvent) => any;
127
+ hide: () => any;
128
+ }, string, {
129
+ caret: boolean;
130
+ variant: string;
131
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
132
+ beforeCreate?: (() => void) | (() => void)[];
133
+ created?: (() => void) | (() => void)[];
134
+ beforeMount?: (() => void) | (() => void)[];
135
+ mounted?: (() => void) | (() => void)[];
136
+ beforeUpdate?: (() => void) | (() => void)[];
137
+ updated?: (() => void) | (() => void)[];
138
+ activated?: (() => void) | (() => void)[];
139
+ deactivated?: (() => void) | (() => void)[];
140
+ beforeDestroy?: (() => void) | (() => void)[];
141
+ beforeUnmount?: (() => void) | (() => void)[];
142
+ destroyed?: (() => void) | (() => void)[];
143
+ unmounted?: (() => void) | (() => void)[];
144
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
145
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
146
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
147
+ };
148
+ $forceUpdate: () => void;
149
+ $nextTick: typeof import('vue').nextTick;
150
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
151
+ } & Readonly<{
152
+ caret: boolean;
153
+ variant: string;
154
+ }> & Omit<Readonly<BtnDropdownProps> & Readonly<{
155
+ onShow?: (() => any) | undefined;
156
+ onClick?: ((event: MouseEvent) => any) | undefined;
157
+ onClickToggle?: ((event: MouseEvent) => any) | undefined;
158
+ onHide?: (() => any) | undefined;
159
+ }>, "show" | "hide" | "toggle" | ("caret" | "variant")> & import('vue').ShallowUnwrapRef<{
160
+ show: () => void;
161
+ hide: () => void;
162
+ toggle: () => void;
163
+ }> & {} & import('vue').ComponentCustomProperties & {} & {
164
+ $slots: {
165
+ button?(_: {
166
+ target: (el: HTMLElement) => HTMLElement;
167
+ expanded: boolean;
168
+ onBlur: (e: FocusEvent) => void;
169
+ onClickToggle: (e: MouseEvent) => void;
170
+ }): any;
171
+ default?(_: {}): any;
172
+ };
173
+ }) | null;
174
+ };
175
+ rootEl: HTMLDivElement;
176
+ };
177
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
178
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
179
+ hide: () => void | undefined;
180
+ show: () => void | undefined;
181
+ toggle: () => void | undefined;
182
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
183
+ show: () => any;
184
+ click: (event: MouseEvent) => any;
185
+ clickToggle: (event: MouseEvent) => any;
186
+ hide: () => any;
187
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
188
+ onShow?: (() => any) | undefined;
189
+ onClick?: ((event: MouseEvent) => any) | undefined;
190
+ onClickToggle?: ((event: MouseEvent) => any) | undefined;
191
+ onHide?: (() => any) | undefined;
192
+ }>, {
193
+ split: boolean;
194
+ caret: boolean;
195
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
196
+ el: ({
197
+ $: import('vue').ComponentInternalInstance;
198
+ $data: {};
199
+ $props: {
200
+ readonly align?: import('@floating-ui/dom').Alignment | undefined;
201
+ readonly block?: boolean | undefined;
202
+ readonly buttonClass?: import('vue').HTMLAttributes["class"];
203
+ readonly caret?: boolean | undefined;
204
+ readonly dropup?: boolean | undefined;
205
+ readonly dropright?: boolean | undefined;
206
+ readonly dropleft?: boolean | undefined;
207
+ readonly label?: string | undefined;
208
+ readonly offset?: import('@floating-ui/dom').OffsetOptions | undefined;
209
+ readonly middleware?: import('@floating-ui/dom').Middleware[] | undefined;
210
+ readonly side?: import('@floating-ui/dom').Side | undefined;
211
+ readonly size?: (import('./useDropdownHandler').BtnGroupSizes | (string & Record<never, never>)) | undefined;
212
+ readonly split?: boolean | undefined;
213
+ readonly variant?: string | undefined;
214
+ readonly onShow?: (() => any) | undefined;
215
+ readonly onClick?: ((event: MouseEvent) => any) | undefined;
216
+ readonly onClickToggle?: ((event: MouseEvent) => any) | undefined;
217
+ readonly onHide?: (() => any) | undefined;
218
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
219
+ $attrs: {
220
+ [x: string]: unknown;
221
+ };
222
+ $refs: {
223
+ [x: string]: unknown;
224
+ } & {
225
+ target: HTMLButtonElement;
226
+ menu: ({
227
+ $: import('vue').ComponentInternalInstance;
228
+ $data: {};
229
+ $props: {
230
+ readonly align?: "left" | "right" | undefined;
231
+ readonly show?: boolean | undefined;
232
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
233
+ $attrs: {
234
+ [x: string]: unknown;
235
+ };
236
+ $refs: {
237
+ [x: string]: unknown;
238
+ };
239
+ $slots: Readonly<{
240
+ [name: string]: import('vue').Slot<any> | undefined;
241
+ }>;
242
+ $root: import('vue').ComponentPublicInstance | null;
243
+ $parent: import('vue').ComponentPublicInstance | null;
244
+ $host: Element | null;
245
+ $emit: (event: string, ...args: any[]) => void;
246
+ $el: HTMLDivElement;
247
+ $options: import('vue').ComponentOptionsBase<Readonly<{
248
+ align?: "left" | "right";
249
+ show?: boolean;
250
+ }> & Readonly<{}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {
251
+ align: "left" | "right";
252
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
253
+ beforeCreate?: (() => void) | (() => void)[];
254
+ created?: (() => void) | (() => void)[];
255
+ beforeMount?: (() => void) | (() => void)[];
256
+ mounted?: (() => void) | (() => void)[];
257
+ beforeUpdate?: (() => void) | (() => void)[];
258
+ updated?: (() => void) | (() => void)[];
259
+ activated?: (() => void) | (() => void)[];
260
+ deactivated?: (() => void) | (() => void)[];
261
+ beforeDestroy?: (() => void) | (() => void)[];
262
+ beforeUnmount?: (() => void) | (() => void)[];
263
+ destroyed?: (() => void) | (() => void)[];
264
+ unmounted?: (() => void) | (() => void)[];
265
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
266
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
267
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
268
+ };
269
+ $forceUpdate: () => void;
270
+ $nextTick: typeof import('vue').nextTick;
271
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
272
+ } & Readonly<{
273
+ align: "left" | "right";
274
+ }> & Omit<Readonly<{
275
+ align?: "left" | "right";
276
+ show?: boolean;
277
+ }> & Readonly<{}>, "align"> & import('vue').ShallowUnwrapRef<{}> & {} & import('vue').ComponentCustomProperties & {} & {
278
+ $slots: {
279
+ default?(_: {}): any;
280
+ };
281
+ }) | null;
282
+ };
283
+ $slots: Readonly<{
284
+ [name: string]: import('vue').Slot<any> | undefined;
285
+ }>;
286
+ $root: import('vue').ComponentPublicInstance | null;
287
+ $parent: import('vue').ComponentPublicInstance | null;
288
+ $host: Element | null;
289
+ $emit: ((event: "show") => void) & ((event: "click", event: MouseEvent) => void) & ((event: "clickToggle", event: MouseEvent) => void) & ((event: "hide") => void);
290
+ $el: HTMLDivElement;
291
+ $options: import('vue').ComponentOptionsBase<Readonly<BtnDropdownProps> & Readonly<{
292
+ onShow?: (() => any) | undefined;
293
+ onClick?: ((event: MouseEvent) => any) | undefined;
294
+ onClickToggle?: ((event: MouseEvent) => any) | undefined;
295
+ onHide?: (() => any) | undefined;
296
+ }>, {
297
+ show: () => void;
298
+ hide: () => void;
299
+ toggle: () => void;
300
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
301
+ show: () => any;
302
+ click: (event: MouseEvent) => any;
303
+ clickToggle: (event: MouseEvent) => any;
304
+ hide: () => any;
305
+ }, string, {
306
+ caret: boolean;
307
+ variant: string;
308
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
309
+ beforeCreate?: (() => void) | (() => void)[];
310
+ created?: (() => void) | (() => void)[];
311
+ beforeMount?: (() => void) | (() => void)[];
312
+ mounted?: (() => void) | (() => void)[];
313
+ beforeUpdate?: (() => void) | (() => void)[];
314
+ updated?: (() => void) | (() => void)[];
315
+ activated?: (() => void) | (() => void)[];
316
+ deactivated?: (() => void) | (() => void)[];
317
+ beforeDestroy?: (() => void) | (() => void)[];
318
+ beforeUnmount?: (() => void) | (() => void)[];
319
+ destroyed?: (() => void) | (() => void)[];
320
+ unmounted?: (() => void) | (() => void)[];
321
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
322
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
323
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
324
+ };
325
+ $forceUpdate: () => void;
326
+ $nextTick: typeof import('vue').nextTick;
327
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
328
+ } & Readonly<{
329
+ caret: boolean;
330
+ variant: string;
331
+ }> & Omit<Readonly<BtnDropdownProps> & Readonly<{
332
+ onShow?: (() => any) | undefined;
333
+ onClick?: ((event: MouseEvent) => any) | undefined;
334
+ onClickToggle?: ((event: MouseEvent) => any) | undefined;
335
+ onHide?: (() => any) | undefined;
336
+ }>, "show" | "hide" | "toggle" | ("caret" | "variant")> & import('vue').ShallowUnwrapRef<{
337
+ show: () => void;
338
+ hide: () => void;
339
+ toggle: () => void;
340
+ }> & {} & import('vue').ComponentCustomProperties & {} & {
341
+ $slots: {
342
+ button?(_: {
343
+ target: (el: HTMLElement) => HTMLElement;
344
+ expanded: boolean;
345
+ onBlur: (e: FocusEvent) => void;
346
+ onClickToggle: (e: MouseEvent) => void;
347
+ }): any;
348
+ default?(_: {}): any;
349
+ };
350
+ }) | null;
351
+ }, HTMLDivElement>;
352
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
353
+ export default _default;
354
+ type __VLS_WithTemplateSlots<T, S> = T & {
355
+ new (): {
356
+ $slots: S;
357
+ };
358
+ };
@@ -0,0 +1,157 @@
1
+ import { BtnDropdownProps } from './useDropdownHandler';
2
+ declare function __VLS_template(): {
3
+ attrs: Partial<{}>;
4
+ slots: {
5
+ button?(_: {
6
+ target: (el: HTMLElement) => HTMLElement;
7
+ expanded: boolean;
8
+ onBlur: (e: FocusEvent) => void;
9
+ onClickToggle: (e: MouseEvent) => void;
10
+ }): any;
11
+ default?(_: {}): any;
12
+ };
13
+ refs: {
14
+ target: HTMLButtonElement;
15
+ menu: ({
16
+ $: import('vue').ComponentInternalInstance;
17
+ $data: {};
18
+ $props: {
19
+ readonly align?: "left" | "right" | undefined;
20
+ readonly show?: boolean | undefined;
21
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
22
+ $attrs: {
23
+ [x: string]: unknown;
24
+ };
25
+ $refs: {
26
+ [x: string]: unknown;
27
+ };
28
+ $slots: Readonly<{
29
+ [name: string]: import('vue').Slot<any> | undefined;
30
+ }>;
31
+ $root: import('vue').ComponentPublicInstance | null;
32
+ $parent: import('vue').ComponentPublicInstance | null;
33
+ $host: Element | null;
34
+ $emit: (event: string, ...args: any[]) => void;
35
+ $el: HTMLDivElement;
36
+ $options: import('vue').ComponentOptionsBase<Readonly<{
37
+ align?: "left" | "right";
38
+ show?: boolean;
39
+ }> & Readonly<{}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {
40
+ align: "left" | "right";
41
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
42
+ beforeCreate?: (() => void) | (() => void)[];
43
+ created?: (() => void) | (() => void)[];
44
+ beforeMount?: (() => void) | (() => void)[];
45
+ mounted?: (() => void) | (() => void)[];
46
+ beforeUpdate?: (() => void) | (() => void)[];
47
+ updated?: (() => void) | (() => void)[];
48
+ activated?: (() => void) | (() => void)[];
49
+ deactivated?: (() => void) | (() => void)[];
50
+ beforeDestroy?: (() => void) | (() => void)[];
51
+ beforeUnmount?: (() => void) | (() => void)[];
52
+ destroyed?: (() => void) | (() => void)[];
53
+ unmounted?: (() => void) | (() => void)[];
54
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
55
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
56
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
57
+ };
58
+ $forceUpdate: () => void;
59
+ $nextTick: typeof import('vue').nextTick;
60
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
61
+ } & Readonly<{
62
+ align: "left" | "right";
63
+ }> & Omit<Readonly<{
64
+ align?: "left" | "right";
65
+ show?: boolean;
66
+ }> & Readonly<{}>, "align"> & import('vue').ShallowUnwrapRef<{}> & {} & import('vue').ComponentCustomProperties & {} & {
67
+ $slots: {
68
+ default?(_: {}): any;
69
+ };
70
+ }) | null;
71
+ };
72
+ rootEl: HTMLDivElement;
73
+ };
74
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
75
+ declare const __VLS_component: import('vue').DefineComponent<BtnDropdownProps, {
76
+ show: () => void;
77
+ hide: () => void;
78
+ toggle: () => void;
79
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
80
+ show: () => any;
81
+ click: (event: MouseEvent) => any;
82
+ clickToggle: (event: MouseEvent) => any;
83
+ hide: () => any;
84
+ }, string, import('vue').PublicProps, Readonly<BtnDropdownProps> & Readonly<{
85
+ onShow?: (() => any) | undefined;
86
+ onClick?: ((event: MouseEvent) => any) | undefined;
87
+ onClickToggle?: ((event: MouseEvent) => any) | undefined;
88
+ onHide?: (() => any) | undefined;
89
+ }>, {
90
+ caret: boolean;
91
+ variant: string;
92
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
93
+ target: HTMLButtonElement;
94
+ menu: ({
95
+ $: import('vue').ComponentInternalInstance;
96
+ $data: {};
97
+ $props: {
98
+ readonly align?: "left" | "right" | undefined;
99
+ readonly show?: boolean | undefined;
100
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
101
+ $attrs: {
102
+ [x: string]: unknown;
103
+ };
104
+ $refs: {
105
+ [x: string]: unknown;
106
+ };
107
+ $slots: Readonly<{
108
+ [name: string]: import('vue').Slot<any> | undefined;
109
+ }>;
110
+ $root: import('vue').ComponentPublicInstance | null;
111
+ $parent: import('vue').ComponentPublicInstance | null;
112
+ $host: Element | null;
113
+ $emit: (event: string, ...args: any[]) => void;
114
+ $el: HTMLDivElement;
115
+ $options: import('vue').ComponentOptionsBase<Readonly<{
116
+ align?: "left" | "right";
117
+ show?: boolean;
118
+ }> & Readonly<{}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {
119
+ align: "left" | "right";
120
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
121
+ beforeCreate?: (() => void) | (() => void)[];
122
+ created?: (() => void) | (() => void)[];
123
+ beforeMount?: (() => void) | (() => void)[];
124
+ mounted?: (() => void) | (() => void)[];
125
+ beforeUpdate?: (() => void) | (() => void)[];
126
+ updated?: (() => void) | (() => void)[];
127
+ activated?: (() => void) | (() => void)[];
128
+ deactivated?: (() => void) | (() => void)[];
129
+ beforeDestroy?: (() => void) | (() => void)[];
130
+ beforeUnmount?: (() => void) | (() => void)[];
131
+ destroyed?: (() => void) | (() => void)[];
132
+ unmounted?: (() => void) | (() => void)[];
133
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
134
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
135
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
136
+ };
137
+ $forceUpdate: () => void;
138
+ $nextTick: typeof import('vue').nextTick;
139
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
140
+ } & Readonly<{
141
+ align: "left" | "right";
142
+ }> & Omit<Readonly<{
143
+ align?: "left" | "right";
144
+ show?: boolean;
145
+ }> & Readonly<{}>, "align"> & import('vue').ShallowUnwrapRef<{}> & {} & import('vue').ComponentCustomProperties & {} & {
146
+ $slots: {
147
+ default?(_: {}): any;
148
+ };
149
+ }) | null;
150
+ }, HTMLDivElement>;
151
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
152
+ export default _default;
153
+ type __VLS_WithTemplateSlots<T, S> = T & {
154
+ new (): {
155
+ $slots: S;
156
+ };
157
+ };
@@ -0,0 +1,167 @@
1
+ import { BtnDropdownProps } from './useDropdownHandler';
2
+ declare function __VLS_template(): {
3
+ attrs: Partial<{}>;
4
+ slots: {
5
+ button?(_: {
6
+ expanded: boolean;
7
+ onBlur: (e: FocusEvent) => void;
8
+ onClickToggle: (e: MouseEvent) => void;
9
+ }): any;
10
+ button?(_: {
11
+ expanded: boolean;
12
+ onBlur: (e: FocusEvent) => void;
13
+ onClickToggle: (e: MouseEvent) => void;
14
+ }): any;
15
+ toggle?(_: {
16
+ target: (el: HTMLElement) => HTMLElement;
17
+ expanded: boolean;
18
+ onBlur: (e: FocusEvent) => void;
19
+ onClickToggle: (e: MouseEvent) => void;
20
+ }): any;
21
+ default?(_: {}): any;
22
+ };
23
+ refs: {
24
+ target: HTMLButtonElement;
25
+ menu: ({
26
+ $: import('vue').ComponentInternalInstance;
27
+ $data: {};
28
+ $props: {
29
+ readonly align?: "left" | "right" | undefined;
30
+ readonly show?: boolean | undefined;
31
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
32
+ $attrs: {
33
+ [x: string]: unknown;
34
+ };
35
+ $refs: {
36
+ [x: string]: unknown;
37
+ };
38
+ $slots: Readonly<{
39
+ [name: string]: import('vue').Slot<any> | undefined;
40
+ }>;
41
+ $root: import('vue').ComponentPublicInstance | null;
42
+ $parent: import('vue').ComponentPublicInstance | null;
43
+ $host: Element | null;
44
+ $emit: (event: string, ...args: any[]) => void;
45
+ $el: HTMLDivElement;
46
+ $options: import('vue').ComponentOptionsBase<Readonly<{
47
+ align?: "left" | "right";
48
+ show?: boolean;
49
+ }> & Readonly<{}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {
50
+ align: "left" | "right";
51
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
52
+ beforeCreate?: (() => void) | (() => void)[];
53
+ created?: (() => void) | (() => void)[];
54
+ beforeMount?: (() => void) | (() => void)[];
55
+ mounted?: (() => void) | (() => void)[];
56
+ beforeUpdate?: (() => void) | (() => void)[];
57
+ updated?: (() => void) | (() => void)[];
58
+ activated?: (() => void) | (() => void)[];
59
+ deactivated?: (() => void) | (() => void)[];
60
+ beforeDestroy?: (() => void) | (() => void)[];
61
+ beforeUnmount?: (() => void) | (() => void)[];
62
+ destroyed?: (() => void) | (() => void)[];
63
+ unmounted?: (() => void) | (() => void)[];
64
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
65
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
66
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
67
+ };
68
+ $forceUpdate: () => void;
69
+ $nextTick: typeof import('vue').nextTick;
70
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
71
+ } & Readonly<{
72
+ align: "left" | "right";
73
+ }> & Omit<Readonly<{
74
+ align?: "left" | "right";
75
+ show?: boolean;
76
+ }> & Readonly<{}>, "align"> & import('vue').ShallowUnwrapRef<{}> & {} & import('vue').ComponentCustomProperties & {} & {
77
+ $slots: {
78
+ default?(_: {}): any;
79
+ };
80
+ }) | null;
81
+ };
82
+ rootEl: HTMLDivElement;
83
+ };
84
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
85
+ declare const __VLS_component: import('vue').DefineComponent<BtnDropdownProps, {
86
+ show: () => void;
87
+ hide: () => void;
88
+ toggle: () => void;
89
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
90
+ show: () => any;
91
+ click: (event: MouseEvent) => any;
92
+ clickToggle: (event: MouseEvent) => any;
93
+ hide: () => any;
94
+ }, string, import('vue').PublicProps, Readonly<BtnDropdownProps> & Readonly<{
95
+ onShow?: (() => any) | undefined;
96
+ onClick?: ((event: MouseEvent) => any) | undefined;
97
+ onClickToggle?: ((event: MouseEvent) => any) | undefined;
98
+ onHide?: (() => any) | undefined;
99
+ }>, {
100
+ caret: boolean;
101
+ variant: string;
102
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
103
+ target: HTMLButtonElement;
104
+ menu: ({
105
+ $: import('vue').ComponentInternalInstance;
106
+ $data: {};
107
+ $props: {
108
+ readonly align?: "left" | "right" | undefined;
109
+ readonly show?: boolean | undefined;
110
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
111
+ $attrs: {
112
+ [x: string]: unknown;
113
+ };
114
+ $refs: {
115
+ [x: string]: unknown;
116
+ };
117
+ $slots: Readonly<{
118
+ [name: string]: import('vue').Slot<any> | undefined;
119
+ }>;
120
+ $root: import('vue').ComponentPublicInstance | null;
121
+ $parent: import('vue').ComponentPublicInstance | null;
122
+ $host: Element | null;
123
+ $emit: (event: string, ...args: any[]) => void;
124
+ $el: HTMLDivElement;
125
+ $options: import('vue').ComponentOptionsBase<Readonly<{
126
+ align?: "left" | "right";
127
+ show?: boolean;
128
+ }> & Readonly<{}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, {
129
+ align: "left" | "right";
130
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
131
+ beforeCreate?: (() => void) | (() => void)[];
132
+ created?: (() => void) | (() => void)[];
133
+ beforeMount?: (() => void) | (() => void)[];
134
+ mounted?: (() => void) | (() => void)[];
135
+ beforeUpdate?: (() => void) | (() => void)[];
136
+ updated?: (() => void) | (() => void)[];
137
+ activated?: (() => void) | (() => void)[];
138
+ deactivated?: (() => void) | (() => void)[];
139
+ beforeDestroy?: (() => void) | (() => void)[];
140
+ beforeUnmount?: (() => void) | (() => void)[];
141
+ destroyed?: (() => void) | (() => void)[];
142
+ unmounted?: (() => void) | (() => void)[];
143
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
144
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
145
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
146
+ };
147
+ $forceUpdate: () => void;
148
+ $nextTick: typeof import('vue').nextTick;
149
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
150
+ } & Readonly<{
151
+ align: "left" | "right";
152
+ }> & Omit<Readonly<{
153
+ align?: "left" | "right";
154
+ show?: boolean;
155
+ }> & Readonly<{}>, "align"> & import('vue').ShallowUnwrapRef<{}> & {} & import('vue').ComponentCustomProperties & {} & {
156
+ $slots: {
157
+ default?(_: {}): any;
158
+ };
159
+ }) | null;
160
+ }, HTMLDivElement>;
161
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
162
+ export default _default;
163
+ type __VLS_WithTemplateSlots<T, S> = T & {
164
+ new (): {
165
+ $slots: S;
166
+ };
167
+ };
@@ -0,0 +1,48 @@
1
+ import { Placement, Alignment, Middleware, OffsetOptions, Side } from '@floating-ui/dom';
2
+ import { UseFloatingReturn } from '@floating-ui/vue';
3
+ import { DropdownMenu } from '@vue-interface/dropdown-menu';
4
+ import { ComputedRef, Ref, EmitFn, HTMLAttributes } from 'vue';
5
+ type LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);
6
+ export type BtnGroupSizes = 'btn-group-xs' | 'btn-group-sm' | 'btn-group-md' | 'btn-group-lg' | 'btn-group-xl' | 'btn-group-2xl' | 'btn-group-3xl' | 'btn-group-4xl';
7
+ export type BtnDropdownProps = {
8
+ align?: Alignment;
9
+ block?: boolean;
10
+ buttonClass?: HTMLAttributes['class'];
11
+ caret?: boolean;
12
+ dropup?: boolean;
13
+ dropright?: boolean;
14
+ dropleft?: boolean;
15
+ label?: string;
16
+ offset?: OffsetOptions;
17
+ middleware?: Middleware[];
18
+ side?: Side;
19
+ size?: LiteralUnion<BtnGroupSizes>;
20
+ split?: boolean;
21
+ variant?: string;
22
+ };
23
+ export type BtnDropdownEvents = {
24
+ click: [event: MouseEvent];
25
+ clickToggle: [event: MouseEvent];
26
+ show: [];
27
+ hide: [];
28
+ };
29
+ export type UseDropdownHandler = {
30
+ target: Ref<HTMLElement | undefined>;
31
+ menu: Ref<InstanceType<typeof DropdownMenu> | undefined>;
32
+ alignment: ComputedRef<Alignment>;
33
+ expanded: Ref<boolean>;
34
+ floatingStyles: UseFloatingReturn['floatingStyles'];
35
+ placement: ComputedRef<Placement>;
36
+ side: ComputedRef<Side>;
37
+ classes: ComputedRef<Record<string, boolean | undefined>>;
38
+ buttonClasses: ComputedRef<Record<string, boolean>>;
39
+ show: () => void;
40
+ hide: () => void;
41
+ toggle: () => void;
42
+ onBlur: (e: FocusEvent) => void;
43
+ onClick: (e: MouseEvent) => void;
44
+ onClickToggle: (e: MouseEvent) => void;
45
+ onClickItem: (e: PointerEvent) => void;
46
+ };
47
+ export declare function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>): UseDropdownHandler;
48
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue-interface/btn-dropdown",
3
- "version": "4.1.0",
3
+ "version": "4.1.2",
4
4
  "description": "A Vue button dropdown component.",
5
5
  "type": "module",
6
6
  "main": "./dist/btn-dropdown.umd.cjs",
@@ -49,9 +49,9 @@
49
49
  "@floating-ui/vue": "^1.1.6",
50
50
  "vue": "^3.3.4",
51
51
  "@vue-interface/btn": "5.0.5",
52
- "@vue-interface/dropdown-menu": "3.0.6"
52
+ "@vue-interface/dropdown-menu": "3.0.7"
53
53
  },
54
- "dependencies": {
54
+ "devDependencies": {
55
55
  "vue-component-type-helpers": "^3.2.2"
56
56
  },
57
57
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { useTemplateRef } from 'vue';
3
- import { ComponentExposed } from 'vue-component-type-helpers';
3
+ import { type ComponentExposed } from 'vue-component-type-helpers';
4
4
  import BtnDropdownSingle from './BtnDropdownSingle.vue';
5
5
  import BtnDropdownSplit from './BtnDropdownSplit.vue';
6
6
  import { BtnDropdownEvents, BtnDropdownProps } from './useDropdownHandler';
@@ -13,12 +13,13 @@ const props = withDefaults(defineProps<{
13
13
  });
14
14
 
15
15
  const emit = defineEmits<BtnDropdownEvents>();
16
+
16
17
  const el = useTemplateRef<ComponentExposed<typeof BtnDropdownSingle | typeof BtnDropdownSplit>>('el');
17
18
 
18
19
  defineExpose({
19
- show: () => el.value?.show(),
20
20
  hide: () => el.value?.hide(),
21
- toggle: () => el.value?.hide(),
21
+ show: () => el.value?.show(),
22
+ toggle: () => el.value?.toggle(),
22
23
  });
23
24
  </script>
24
25
 
@@ -1,7 +1,7 @@
1
1
  import { flip, offset, Placement, type Alignment, type Middleware, type OffsetOptions, type Side } from '@floating-ui/dom';
2
- import { useFloating } from '@floating-ui/vue';
2
+ import { useFloating, UseFloatingReturn } from '@floating-ui/vue';
3
3
  import { DropdownMenu } from '@vue-interface/dropdown-menu';
4
- import { computed, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';
4
+ import { computed, ComputedRef, Ref, ref, watchEffect, type EmitFn, type HTMLAttributes } from 'vue';
5
5
 
6
6
  type LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);
7
7
 
@@ -38,12 +38,30 @@ export type BtnDropdownEvents = {
38
38
  hide: []
39
39
  }
40
40
 
41
- export function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>) {
41
+ export type UseDropdownHandler = {
42
+ target: Ref<HTMLElement|undefined>;
43
+ menu: Ref<InstanceType<typeof DropdownMenu>|undefined>;
44
+ alignment: ComputedRef<Alignment>;
45
+ expanded: Ref<boolean>;
46
+ floatingStyles: UseFloatingReturn['floatingStyles'];
47
+ placement: ComputedRef<Placement>;
48
+ side: ComputedRef<Side>;
49
+ classes: ComputedRef<Record<string, boolean|undefined>>;
50
+ buttonClasses: ComputedRef<Record<string, boolean>>;
51
+ show: () => void;
52
+ hide: () => void;
53
+ toggle: () => void;
54
+ onBlur: (e: FocusEvent) => void;
55
+ onClick: (e: MouseEvent) => void;
56
+ onClickToggle: (e: MouseEvent) => void;
57
+ onClickItem: (e: PointerEvent) => void;
58
+ }
59
+
60
+ export function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDropdownEvents>): UseDropdownHandler {
42
61
  const target = ref<HTMLElement>();
43
62
  const menu = ref<InstanceType<typeof DropdownMenu>>();
44
63
  const expanded = ref(false);
45
64
 
46
-
47
65
  const alignment = computed<Alignment>(() => props.align ?? 'start');
48
66
 
49
67
  const side = computed<Side>(() => {
@@ -64,7 +82,7 @@ export function useDropdownHandler(props: BtnDropdownProps, emit: EmitFn<BtnDrop
64
82
 
65
83
  const placement = computed<Placement>(() => `${side.value}-${alignment.value}`);
66
84
 
67
- const classes = computed(() => ({
85
+ const classes = computed<Record<string,boolean|undefined>>(() => ({
68
86
  'dropdown': props.dropup && props.dropright && props.dropleft,
69
87
  'dropup': props.dropup,
70
88
  'dropright': props.dropright,