bootstrap-vue-next 0.45.3 → 0.45.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/{BAutocomplete-BCOfyy8g.js → BAutocomplete-D8Qkcqcy.js} +2 -2
  2. package/dist/{BAutocomplete-BCOfyy8g.js.map → BAutocomplete-D8Qkcqcy.js.map} +1 -1
  3. package/dist/{BAutocomplete-j3KJbBFs.mjs → BAutocomplete-DRzLhACU.mjs} +2 -2
  4. package/dist/{BAutocomplete-j3KJbBFs.mjs.map → BAutocomplete-DRzLhACU.mjs.map} +1 -1
  5. package/dist/{BForm-CriVh5cC.js → BForm-B0bPQ4kx.js} +2 -2
  6. package/dist/{BForm-CriVh5cC.js.map → BForm-B0bPQ4kx.js.map} +1 -1
  7. package/dist/{BForm-__5Chigr.mjs → BForm-CoQKIJzv.mjs} +2 -2
  8. package/dist/{BForm-__5Chigr.mjs.map → BForm-CoQKIJzv.mjs.map} +1 -1
  9. package/dist/{BFormSelect-CUkyKBNN.js → BFormSelect-CtcsnTlz.js} +2 -2
  10. package/dist/{BFormSelect-CUkyKBNN.js.map → BFormSelect-CtcsnTlz.js.map} +1 -1
  11. package/dist/{BFormSelect-Co-ZU8yY.mjs → BFormSelect-eS-C3M0J.mjs} +2 -2
  12. package/dist/{BFormSelect-Co-ZU8yY.mjs.map → BFormSelect-eS-C3M0J.mjs.map} +1 -1
  13. package/dist/{BOffcanvas-Dw-tsRFl.mjs → BOffcanvas-CwH0DqSG.mjs} +2 -1
  14. package/dist/BOffcanvas-CwH0DqSG.mjs.map +1 -0
  15. package/dist/{BOffcanvas-Dg2rwKlf.js → BOffcanvas-DdiP19Xz.js} +2 -1
  16. package/dist/BOffcanvas-DdiP19Xz.js.map +1 -0
  17. package/dist/bootstrap-vue-next.mjs +4 -4
  18. package/dist/bootstrap-vue-next.umd.js +4 -4
  19. package/dist/directives/utils.d.mts +2 -2
  20. package/dist/directives/utils.d.ts +2 -2
  21. package/dist/src/components/BAutocomplete/index.mjs +1 -1
  22. package/dist/src/components/BAutocomplete/index.umd.js +1 -1
  23. package/dist/src/components/BForm/index.mjs +1 -1
  24. package/dist/src/components/BForm/index.umd.js +1 -1
  25. package/dist/src/components/BFormSelect/index.mjs +1 -1
  26. package/dist/src/components/BFormSelect/index.umd.js +1 -1
  27. package/dist/src/components/BOffcanvas/index.mjs +1 -1
  28. package/dist/src/components/BOffcanvas/index.umd.js +1 -1
  29. package/dist/src/components/index.mjs +4 -4
  30. package/dist/src/components/index.umd.js +4 -4
  31. package/dist/src/directives/BPopover/index.mjs +1 -1
  32. package/dist/src/directives/BPopover/index.umd.js +1 -1
  33. package/dist/src/directives/BScrollspy/index.mjs +1 -1
  34. package/dist/src/directives/BScrollspy/index.umd.js +1 -1
  35. package/dist/src/directives/BToggle/index.mjs +2 -2
  36. package/dist/src/directives/BToggle/index.mjs.map +1 -1
  37. package/dist/src/directives/BToggle/index.umd.js +2 -2
  38. package/dist/src/directives/BToggle/index.umd.js.map +1 -1
  39. package/dist/src/directives/BTooltip/index.mjs +1 -1
  40. package/dist/src/directives/BTooltip/index.umd.js +1 -1
  41. package/dist/{useFormSelect-C0nvno12.mjs → useFormSelect-BM0rsjni.mjs} +9 -2
  42. package/dist/useFormSelect-BM0rsjni.mjs.map +1 -0
  43. package/dist/{useFormSelect-CjAziZpu.js → useFormSelect-ClmzGzOy.js} +9 -2
  44. package/dist/useFormSelect-ClmzGzOy.js.map +1 -0
  45. package/dist/{utils-Dgz9Trtl.mjs → utils-BbYwYPyP.mjs} +5 -5
  46. package/dist/utils-BbYwYPyP.mjs.map +1 -0
  47. package/dist/{utils-BTPjS0XS.js → utils-ePxMJ7rd.js} +5 -5
  48. package/dist/utils-ePxMJ7rd.js.map +1 -0
  49. package/package.json +1 -1
  50. package/dist/BOffcanvas-Dg2rwKlf.js.map +0 -1
  51. package/dist/BOffcanvas-Dw-tsRFl.mjs.map +0 -1
  52. package/dist/useFormSelect-C0nvno12.mjs.map +0 -1
  53. package/dist/useFormSelect-CjAziZpu.js.map +0 -1
  54. package/dist/utils-BTPjS0XS.js.map +0 -1
  55. package/dist/utils-Dgz9Trtl.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-BbYwYPyP.mjs","names":[],"sources":["../src/directives/utils.ts"],"sourcesContent":["import type {ComponentInternalInstance, Directive, DirectiveBinding, Ref, VNode} from 'vue'\nimport type {BPopoverProps} from '../types/ComponentProps'\nimport {\n bind,\n type ElementWithPopper,\n resolveActiveStatus,\n resolveContent,\n resolveDirectiveProps,\n unbind,\n updateBind,\n} from '../utils/floatingUi'\nimport {defaultsKey} from '../utils/keys'\n\ninterface _ComponentInternalInstance extends ComponentInternalInstance {\n provides?: Record<string, unknown>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setupState?: any\n}\n\ninterface _VNode extends VNode {\n ctx?: _ComponentInternalInstance | null\n ssContent?: VNode | null\n}\n\n/**\n * Represents per-instance state for directives using UID namespacing\n */\nexport interface DirectiveInstanceState {\n binding: string // JSON.stringify cache for change detection\n destroying: boolean // Flag to prevent race conditions during cleanup\n}\n\n/**\n * Gets the component instance UID from a directive binding\n * @throws Error if binding.instance is not available\n */\nexport function getDirectiveUid(binding: DirectiveBinding): number {\n if (!binding.instance) {\n throw new Error('[Bootstrap-Vue-Next] Directive binding.instance is not available')\n }\n return binding.instance.$.uid\n}\n\n/**\n * Initializes UID-namespaced storage on an element for a directive\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @param binding - The directive binding value to cache\n * @returns The initialized instance state\n */\nexport function initDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number,\n binding: DirectiveBinding\n): DirectiveInstanceState {\n // Initialize UID namespace for this directive\n const elWithProps = el as Record<string, unknown>\n elWithProps[propertyName] = elWithProps[propertyName] ?? Object.create(null)\n\n // Store per-instance state with JSON cache for change detection\n const state: DirectiveInstanceState = {\n binding: JSON.stringify([binding.modifiers, binding.value]),\n destroying: false,\n }\n\n ;(elWithProps[propertyName] as Record<string, unknown>)[uid] = state\n return state\n}\n\n/**\n * Gets the instance state for a directive, if it exists\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @returns The instance state or undefined if not found\n */\nexport function getDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): DirectiveInstanceState | undefined {\n const elWithProps = el as Record<string, unknown>\n return (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n}\n\n/**\n * Checks if the directive binding has changed for this instance\n * @param instance - The directive instance state\n * @param binding - The current directive binding\n * @returns true if the binding has changed, false otherwise\n */\nexport function hasBindingChanged(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): boolean {\n const newBinding = JSON.stringify([binding.modifiers, binding.value])\n return instance.binding !== newBinding\n}\n\n/**\n * Updates the cached binding value for a directive instance\n * @param instance - The directive instance state\n * @param binding - The new directive binding\n */\nexport function updateBindingCache(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): void {\n instance.binding = JSON.stringify([binding.modifiers, binding.value])\n}\n\n/**\n * Cleans up a directive instance\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n */\nexport function cleanupDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): void {\n const elWithProps = el as Record<string, unknown>\n const instance = (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n if (instance) {\n instance.destroying = true\n delete (elWithProps[propertyName] as Record<string, unknown>)[uid]\n }\n}\n\n// taken from vuetify https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/composables/directiveComponent.ts\n\nexport function findProvides(\n binding: DirectiveBinding,\n vnode: _VNode,\n suppressParentNotFoundError = false\n): Record<string, unknown> {\n const provides =\n (vnode.ctx === binding.instance!.$\n ? findComponentParent(vnode, binding.instance!.$, suppressParentNotFoundError)?.provides\n : vnode.ctx?.provides) ?? binding.instance!.$.provides\n\n return provides\n}\n\nexport function findComponentParent(\n vnode: VNode,\n root: ComponentInternalInstance,\n suppressNotFoundError = false\n): _ComponentInternalInstance | null {\n // Walk the tree from root until we find the child vnode\n const stack = new Set<VNode>()\n const walk = (children: _VNode[]): boolean => {\n for (const child of children) {\n if (!child) continue\n\n if (child === vnode || (child.el && vnode.el && child.el === vnode.el)) {\n return true\n }\n\n stack.add(child)\n let result\n if (child.suspense) {\n result = walk([child.ssContent!])\n } else if (Array.isArray(child.children)) {\n result = walk(child.children as VNode[])\n } else if (child.component?.vnode) {\n result = walk([child.component?.subTree])\n }\n if (result) {\n return result\n }\n stack.delete(child)\n }\n\n return false\n }\n if (!walk([root.subTree])) {\n if (!suppressNotFoundError) {\n console.error('Could not find original vnode, will not inherit provides')\n }\n return root\n }\n\n // Return the first component parent\n const result = Array.from(stack).reverse()\n for (const child of result) {\n if (child.component) {\n return child.component\n }\n }\n return root\n}\n\n/**\n * Creates a floating UI directive (tooltip or popover) with UID-namespaced state management\n * @param propertyName - The property name for storing state (e.g., '$__tooltip', '$__popover')\n * @param componentDefaultsKey - The key for accessing component defaults (e.g., 'BTooltip', 'BPopover')\n * @param buildProps - Optional function to customize the props passed to bind()\n * @returns A Vue directive object\n */\nexport function createFloatingDirective(\n propertyName: string,\n componentDefaultsKey: string,\n buildProps?: (\n text: {title?: string; body?: string},\n defaults: unknown,\n binding: Readonly<DirectiveBinding>,\n el: Readonly<HTMLElement>\n ) => BPopoverProps\n): Directive<ElementWithPopper> {\n return {\n mounted(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n const isActive = resolveActiveStatus(binding.value)\n if (!isActive) return\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) return\n\n // Initialize per-instance state with UID namespacing\n initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n },\n\n updated(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n let instance = getDirectiveInstance(el, propertyName, uid)\n\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n\n const isActive = resolveActiveStatus(binding.value)\n\n // If inactive, clean up existing instance if present\n if (!isActive) {\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) {\n // Clean up if no content\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n // If instance doesn't exist, this is a transition from inactive/no-content to active\n // Initialize the instance now (similar to mounted)\n if (!instance) {\n instance = initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n return\n }\n\n // Check if binding changed for THIS instance\n if (!hasBindingChanged(instance, binding)) return\n\n // Prevent race conditions during update\n if (instance.destroying) return\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n // Update props in-place so the tooltip stays visible if it was open\n updateBind(el, binding, props)\n\n // Update THIS instance's cache\n updateBindingCache(instance, binding)\n },\n\n beforeUnmount(el, binding) {\n const uid = getDirectiveUid(binding)\n const instance = getDirectiveInstance(el, propertyName, uid)\n\n if (!instance) return\n\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n },\n }\n}\n"],"mappings":";;;;;;;AAoCA,SAAgB,gBAAgB,SAAmC;AACjE,KAAI,CAAC,QAAQ,SACX,OAAM,IAAI,MAAM,mEAAmE;AAErF,QAAO,QAAQ,SAAS,EAAE;;;;;;;;;;AAW5B,SAAgB,sBACd,IACA,cACA,KACA,SACwB;CAExB,MAAM,cAAc;AACpB,aAAY,gBAAgB,YAAY,iBAAiB,OAAO,OAAO,KAAK;CAG5E,MAAM,QAAgC;EACpC,SAAS,KAAK,UAAU,CAAC,QAAQ,WAAW,QAAQ,MAAM,CAAC;EAC3D,YAAY;EACb;AAEC,aAAY,cAA0C,OAAO;AAC/D,QAAO;;;;;;;;;AAUT,SAAgB,qBACd,IACA,cACA,KACoC;AAEpC,QADoB,GACA,gBAAwD;;;;;;;;AAW9E,SAAgB,kBACd,UACA,SACS;CACT,MAAM,aAAa,KAAK,UAAU,CAAC,QAAQ,WAAW,QAAQ,MAAM,CAAC;AACrE,QAAO,SAAS,YAAY;;;;;;;AAQ9B,SAAgB,mBACd,UACA,SACM;AACN,UAAS,UAAU,KAAK,UAAU,CAAC,QAAQ,WAAW,QAAQ,MAAM,CAAC;;;;;;;;AASvE,SAAgB,yBACd,IACA,cACA,KACM;CACN,MAAM,cAAc;CACpB,MAAM,WAAY,YAAY,gBAAwD;AAGtF,KAAI,UAAU;AACZ,WAAS,aAAa;AACtB,SAAQ,YAAY,cAA0C;;;AAMlE,SAAgB,aACd,SACA,OACA,8BAA8B,OACL;AAMzB,SAJG,MAAM,QAAQ,QAAQ,SAAU,IAC7B,oBAAoB,OAAO,QAAQ,SAAU,GAAG,4BAA4B,EAAE,WAC9E,MAAM,KAAK,aAAa,QAAQ,SAAU,EAAE;;AAKpD,SAAgB,oBACd,OACA,MACA,wBAAwB,OACW;CAEnC,MAAM,wBAAQ,IAAI,KAAY;CAC9B,MAAM,QAAQ,aAAgC;AAC5C,OAAK,MAAM,SAAS,UAAU;AAC5B,OAAI,CAAC,MAAO;AAEZ,OAAI,UAAU,SAAU,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM,GACjE,QAAO;AAGT,SAAM,IAAI,MAAM;GAChB,IAAI;AACJ,OAAI,MAAM,SACR,UAAS,KAAK,CAAC,MAAM,UAAW,CAAC;YACxB,MAAM,QAAQ,MAAM,SAAS,CACtC,UAAS,KAAK,MAAM,SAAoB;YAC/B,MAAM,WAAW,MAC1B,UAAS,KAAK,CAAC,MAAM,WAAW,QAAQ,CAAC;AAE3C,OAAI,OACF,QAAO;AAET,SAAM,OAAO,MAAM;;AAGrB,SAAO;;AAET,KAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,EAAE;AACzB,MAAI,CAAC,sBACH,SAAQ,MAAM,2DAA2D;AAE3E,SAAO;;CAIT,MAAM,SAAS,MAAM,KAAK,MAAM,CAAC,SAAS;AAC1C,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,UACR,QAAO,MAAM;AAGjB,QAAO;;;;;;;;;AAUT,SAAgB,wBACd,cACA,sBACA,YAM8B;AAC9B,QAAO;EACL,QAAQ,IAAI,SAAS,OAAO;GAC1B,MAAM,MAAM,gBAAgB,QAAQ;GACpC,MAAM,cAAe,aAAa,SAAS,MAAM,CAAyB,cACtE;AAEJ,OAAI,CADa,oBAAoB,QAAQ,MAAM,CACpC;GAEf,MAAM,OAAO,eAAe,QAAQ,OAAO,GAAG;AAE9C,OAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAO;AAG/B,yBAAsB,IAAI,cAAc,KAAK,QAAQ;AAUrD,QAAK,IAAI,SARK,aACV,WAAW,MAAM,cAAc,uBAAuB,SAAS,GAAG,GAClE;IACE,GAAI,cAAc,yBAAyB,KAAA;IAC3C,GAAG,sBAAsB,SAAS,GAAG;IACrC,GAAG;IACJ,CAEmB;;EAG1B,QAAQ,IAAI,SAAS,OAAO;GAC1B,MAAM,MAAM,gBAAgB,QAAQ;GACpC,IAAI,WAAW,qBAAqB,IAAI,cAAc,IAAI;GAE1D,MAAM,cAAe,aAAa,SAAS,MAAM,CAAyB,cACtE;AAKJ,OAAI,CAHa,oBAAoB,QAAQ,MAAM,EAGpC;AACb,QAAI,YAAY,GAAG,YAAY;AAC7B,YAAO,GAAG;AACV,8BAAyB,IAAI,cAAc,IAAI;;AAEjD;;GAGF,MAAM,OAAO,eAAe,QAAQ,OAAO,GAAG;AAE9C,OAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAO;AAE7B,QAAI,YAAY,GAAG,YAAY;AAC7B,YAAO,GAAG;AACV,8BAAyB,IAAI,cAAc,IAAI;;AAEjD;;AAKF,OAAI,CAAC,UAAU;AACb,eAAW,sBAAsB,IAAI,cAAc,KAAK,QAAQ;AAUhE,SAAK,IAAI,SARK,aACV,WAAW,MAAM,cAAc,uBAAuB,SAAS,GAAG,GAClE;KACE,GAAI,cAAc,yBAAyB,KAAA;KAC3C,GAAG,sBAAsB,SAAS,GAAG;KACrC,GAAG;KACJ,CAEmB;AACxB;;AAIF,OAAI,CAAC,kBAAkB,UAAU,QAAQ,CAAE;AAG3C,OAAI,SAAS,WAAY;AAWzB,cAAW,IAAI,SATD,aACV,WAAW,MAAM,cAAc,uBAAuB,SAAS,GAAG,GAClE;IACE,GAAI,cAAc,yBAAyB,KAAA;IAC3C,GAAG,sBAAsB,SAAS,GAAG;IACrC,GAAG;IACJ,CAGyB;AAG9B,sBAAmB,UAAU,QAAQ;;EAGvC,cAAc,IAAI,SAAS;GACzB,MAAM,MAAM,gBAAgB,QAAQ;AAGpC,OAAI,CAFa,qBAAqB,IAAI,cAAc,IAAI,CAE7C;AAEf,UAAO,GAAG;AACV,4BAAyB,IAAI,cAAc,IAAI;;EAElD"}
@@ -69,10 +69,10 @@ function cleanupDirectiveInstance(el, propertyName, uid) {
69
69
  delete elWithProps[propertyName][uid];
70
70
  }
71
71
  }
72
- function findProvides(binding, vnode) {
73
- return (vnode.ctx === binding.instance.$ ? findComponentParent(vnode, binding.instance.$)?.provides : vnode.ctx?.provides) ?? binding.instance.$.provides;
72
+ function findProvides(binding, vnode, suppressParentNotFoundError = false) {
73
+ return (vnode.ctx === binding.instance.$ ? findComponentParent(vnode, binding.instance.$, suppressParentNotFoundError)?.provides : vnode.ctx?.provides) ?? binding.instance.$.provides;
74
74
  }
75
- function findComponentParent(vnode, root) {
75
+ function findComponentParent(vnode, root, suppressNotFoundError = false) {
76
76
  const stack = /* @__PURE__ */ new Set();
77
77
  const walk = (children) => {
78
78
  for (const child of children) {
@@ -89,7 +89,7 @@ function findComponentParent(vnode, root) {
89
89
  return false;
90
90
  };
91
91
  if (!walk([root.subTree])) {
92
- console.error("Could not find original vnode, will not inherit provides");
92
+ if (!suppressNotFoundError) console.error("Could not find original vnode, will not inherit provides");
93
93
  return root;
94
94
  }
95
95
  const result = Array.from(stack).reverse();
@@ -183,4 +183,4 @@ Object.defineProperty(exports, "getDirectiveUid", {
183
183
  }
184
184
  });
185
185
 
186
- //# sourceMappingURL=utils-BTPjS0XS.js.map
186
+ //# sourceMappingURL=utils-ePxMJ7rd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-ePxMJ7rd.js","names":[],"sources":["../src/directives/utils.ts"],"sourcesContent":["import type {ComponentInternalInstance, Directive, DirectiveBinding, Ref, VNode} from 'vue'\nimport type {BPopoverProps} from '../types/ComponentProps'\nimport {\n bind,\n type ElementWithPopper,\n resolveActiveStatus,\n resolveContent,\n resolveDirectiveProps,\n unbind,\n updateBind,\n} from '../utils/floatingUi'\nimport {defaultsKey} from '../utils/keys'\n\ninterface _ComponentInternalInstance extends ComponentInternalInstance {\n provides?: Record<string, unknown>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setupState?: any\n}\n\ninterface _VNode extends VNode {\n ctx?: _ComponentInternalInstance | null\n ssContent?: VNode | null\n}\n\n/**\n * Represents per-instance state for directives using UID namespacing\n */\nexport interface DirectiveInstanceState {\n binding: string // JSON.stringify cache for change detection\n destroying: boolean // Flag to prevent race conditions during cleanup\n}\n\n/**\n * Gets the component instance UID from a directive binding\n * @throws Error if binding.instance is not available\n */\nexport function getDirectiveUid(binding: DirectiveBinding): number {\n if (!binding.instance) {\n throw new Error('[Bootstrap-Vue-Next] Directive binding.instance is not available')\n }\n return binding.instance.$.uid\n}\n\n/**\n * Initializes UID-namespaced storage on an element for a directive\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @param binding - The directive binding value to cache\n * @returns The initialized instance state\n */\nexport function initDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number,\n binding: DirectiveBinding\n): DirectiveInstanceState {\n // Initialize UID namespace for this directive\n const elWithProps = el as Record<string, unknown>\n elWithProps[propertyName] = elWithProps[propertyName] ?? Object.create(null)\n\n // Store per-instance state with JSON cache for change detection\n const state: DirectiveInstanceState = {\n binding: JSON.stringify([binding.modifiers, binding.value]),\n destroying: false,\n }\n\n ;(elWithProps[propertyName] as Record<string, unknown>)[uid] = state\n return state\n}\n\n/**\n * Gets the instance state for a directive, if it exists\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @returns The instance state or undefined if not found\n */\nexport function getDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): DirectiveInstanceState | undefined {\n const elWithProps = el as Record<string, unknown>\n return (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n}\n\n/**\n * Checks if the directive binding has changed for this instance\n * @param instance - The directive instance state\n * @param binding - The current directive binding\n * @returns true if the binding has changed, false otherwise\n */\nexport function hasBindingChanged(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): boolean {\n const newBinding = JSON.stringify([binding.modifiers, binding.value])\n return instance.binding !== newBinding\n}\n\n/**\n * Updates the cached binding value for a directive instance\n * @param instance - The directive instance state\n * @param binding - The new directive binding\n */\nexport function updateBindingCache(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): void {\n instance.binding = JSON.stringify([binding.modifiers, binding.value])\n}\n\n/**\n * Cleans up a directive instance\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n */\nexport function cleanupDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): void {\n const elWithProps = el as Record<string, unknown>\n const instance = (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n if (instance) {\n instance.destroying = true\n delete (elWithProps[propertyName] as Record<string, unknown>)[uid]\n }\n}\n\n// taken from vuetify https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/composables/directiveComponent.ts\n\nexport function findProvides(\n binding: DirectiveBinding,\n vnode: _VNode,\n suppressParentNotFoundError = false\n): Record<string, unknown> {\n const provides =\n (vnode.ctx === binding.instance!.$\n ? findComponentParent(vnode, binding.instance!.$, suppressParentNotFoundError)?.provides\n : vnode.ctx?.provides) ?? binding.instance!.$.provides\n\n return provides\n}\n\nexport function findComponentParent(\n vnode: VNode,\n root: ComponentInternalInstance,\n suppressNotFoundError = false\n): _ComponentInternalInstance | null {\n // Walk the tree from root until we find the child vnode\n const stack = new Set<VNode>()\n const walk = (children: _VNode[]): boolean => {\n for (const child of children) {\n if (!child) continue\n\n if (child === vnode || (child.el && vnode.el && child.el === vnode.el)) {\n return true\n }\n\n stack.add(child)\n let result\n if (child.suspense) {\n result = walk([child.ssContent!])\n } else if (Array.isArray(child.children)) {\n result = walk(child.children as VNode[])\n } else if (child.component?.vnode) {\n result = walk([child.component?.subTree])\n }\n if (result) {\n return result\n }\n stack.delete(child)\n }\n\n return false\n }\n if (!walk([root.subTree])) {\n if (!suppressNotFoundError) {\n console.error('Could not find original vnode, will not inherit provides')\n }\n return root\n }\n\n // Return the first component parent\n const result = Array.from(stack).reverse()\n for (const child of result) {\n if (child.component) {\n return child.component\n }\n }\n return root\n}\n\n/**\n * Creates a floating UI directive (tooltip or popover) with UID-namespaced state management\n * @param propertyName - The property name for storing state (e.g., '$__tooltip', '$__popover')\n * @param componentDefaultsKey - The key for accessing component defaults (e.g., 'BTooltip', 'BPopover')\n * @param buildProps - Optional function to customize the props passed to bind()\n * @returns A Vue directive object\n */\nexport function createFloatingDirective(\n propertyName: string,\n componentDefaultsKey: string,\n buildProps?: (\n text: {title?: string; body?: string},\n defaults: unknown,\n binding: Readonly<DirectiveBinding>,\n el: Readonly<HTMLElement>\n ) => BPopoverProps\n): Directive<ElementWithPopper> {\n return {\n mounted(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n const isActive = resolveActiveStatus(binding.value)\n if (!isActive) return\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) return\n\n // Initialize per-instance state with UID namespacing\n initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n },\n\n updated(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n let instance = getDirectiveInstance(el, propertyName, uid)\n\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n\n const isActive = resolveActiveStatus(binding.value)\n\n // If inactive, clean up existing instance if present\n if (!isActive) {\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) {\n // Clean up if no content\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n // If instance doesn't exist, this is a transition from inactive/no-content to active\n // Initialize the instance now (similar to mounted)\n if (!instance) {\n instance = initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n return\n }\n\n // Check if binding changed for THIS instance\n if (!hasBindingChanged(instance, binding)) return\n\n // Prevent race conditions during update\n if (instance.destroying) return\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n // Update props in-place so the tooltip stays visible if it was open\n updateBind(el, binding, props)\n\n // Update THIS instance's cache\n updateBindingCache(instance, binding)\n },\n\n beforeUnmount(el, binding) {\n const uid = getDirectiveUid(binding)\n const instance = getDirectiveInstance(el, propertyName, uid)\n\n if (!instance) return\n\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n },\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "bootstrap-vue-next",
3
3
  "displayName": "BootstrapVueNext",
4
4
  "description": "Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development",
5
- "version": "0.45.3",
5
+ "version": "0.45.5",
6
6
  "license": "MIT",
7
7
  "main": "./dist/bootstrap-vue-next.umd.js",
8
8
  "module": "./dist/bootstrap-vue-next.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"file":"BOffcanvas-Dg2rwKlf.js","names":["$attrs"],"sources":["../src/components/BOffcanvas/BOffcanvas.vue","../src/components/BOffcanvas/BOffcanvas.vue"],"sourcesContent":["<template>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"props.teleportDisabled || isOpenByBreakpoint\"\n >\n <Transition\n v-if=\"renderRef || contentShowing || isOpenByBreakpoint\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <div\n v-show=\"\n (showRef && ((backdropReady && props.backdropFirst) || !props.backdropFirst)) ||\n isOpenByBreakpoint\n \"\n :id=\"computedId\"\n ref=\"_element\"\n aria-modal=\"true\"\n role=\"dialog\"\n :class=\"computedClasses\"\n :style=\"computedStyles\"\n tabindex=\"-1\"\n :aria-labelledby=\"`${computedId}-offcanvas-label`\"\n data-bs-backdrop=\"false\"\n v-bind=\"$attrs\"\n >\n <template v-if=\"contentShowing || isOpenByBreakpoint\">\n <div\n v-if=\"!props.noHeader\"\n class=\"offcanvas-header\"\n :class=\"props.headerClass\"\n v-bind=\"props.headerAttrs\"\n >\n <slot name=\"header\" v-bind=\"sharedSlots\">\n <h5 :id=\"`${computedId}-offcanvas-label`\" class=\"offcanvas-title\">\n <slot name=\"title\" v-bind=\"sharedSlots\">\n {{ props.title }}\n </slot>\n </h5>\n <template v-if=\"!props.noHeaderClose\">\n <BButton\n v-if=\"hasHeaderCloseSlot\"\n ref=\"_close\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n >\n <slot name=\"header-close\" v-bind=\"sharedSlots\" />\n </BButton>\n <BCloseButton\n v-else\n ref=\"_close\"\n :aria-label=\"props.headerCloseLabel\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n />\n </template>\n </slot>\n </div>\n <div class=\"offcanvas-body\" :class=\"props.bodyClass\" v-bind=\"props.bodyAttrs\">\n <slot v-bind=\"sharedSlots\" />\n </div>\n <div v-if=\"hasFooterSlot\" :class=\"props.footerClass\">\n <slot name=\"footer\" v-bind=\"sharedSlots\" />\n </div>\n </template>\n <div\n v-if=\"needsFallback\"\n ref=\"_fallbackFocusElement\"\n :class=\"fallbackClassSelector\"\n tabindex=\"0\"\n style=\"width: 0; height: 0; overflow: hidden\"\n />\n </div>\n </Transition>\n <slot v-if=\"!props.noBackdrop\" name=\"backdrop\" v-bind=\"sharedSlots\">\n <Transition v-if=\"renderBackdropRef\" v-bind=\"backdropTransitionProps\">\n <div\n v-show=\"showBackdrop\"\n class=\"offcanvas-backdrop\"\n :class=\"{\n fade: !computedNoAnimation,\n show: backdropVisible || computedNoAnimation,\n }\"\n @click=\"hide('backdrop')\"\n />\n </Transition>\n </slot>\n </ConditionalTeleport>\n</template>\n\n<script setup lang=\"ts\">\nimport {breakpointsBootstrapV5, onKeyStroke, unrefElement, useBreakpoints} from '@vueuse/core'\nimport {useActivatedFocusTrap} from '../../composables/useActivatedFocusTrap'\nimport {computed, type EmitFn, nextTick, onMounted, ref, useTemplateRef, watch} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {\n BOffcanvasEmits,\n BOffcanvasProps,\n BOffcanvasSlots,\n BOffcanvasSlotsData,\n} from '../../types'\nimport BButton from '../BButton/BButton.vue'\nimport BCloseButton from '../BButton/BCloseButton.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {useSafeScrollLock} from '../../composables/useSafeScrollLock'\nimport {isEmptySlot} from '../../utils/dom'\nimport {useShowHide} from '../../composables/useShowHide'\nimport {getElement} from '../../utils/getElement'\n\n// TODO once the responsive stuff may be implemented correctly,\n// What needs to occur is a fixing of the \"body scrolling\".\n// If the offcanvas is on the screen on a large screen, body scrolling is not disabled\n// Even though the modelValue is true\n// When it's a small screen and close, it works, as normal,\n// But then when it opens up on a small screen, it must disable again\n// This is implemented on Layout.vue, but is not officially supported.\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BOffcanvasProps, 'modelValue'>>(), {\n backdropFirst: false,\n bodyAttrs: undefined,\n bodyClass: undefined,\n bodyScrolling: false,\n focus: undefined,\n footerClass: undefined,\n headerAttrs: undefined,\n headerClass: undefined,\n headerCloseClass: undefined,\n headerCloseLabel: 'Close',\n headerCloseVariant: 'secondary',\n id: undefined,\n initialAnimation: false,\n lazy: false,\n noAnimation: false,\n noBackdrop: false,\n noCloseOnBackdrop: false,\n noCloseOnEsc: false,\n noTrap: false,\n noHeader: false,\n noHeaderClose: false,\n unmountLazy: false,\n placement: 'start',\n shadow: false,\n teleportDisabled: false,\n teleportTo: 'body',\n title: undefined,\n show: false,\n width: undefined,\n visible: false,\n})\nconst props = useDefaults(_props, 'BOffcanvas')\nconst emit = defineEmits<BOffcanvasEmits>()\nconst slots = defineSlots<BOffcanvasSlots>()\n\nconst modelValue = defineModel<Exclude<BOffcanvasProps['modelValue'], undefined>>({\n default: false,\n})\n\nconst computedId = useId(() => props.id, 'offcanvas')\n\nconst element = useTemplateRef<HTMLElement | null>('_element')\nconst fallbackFocusElement = useTemplateRef<HTMLElement | null>('_fallbackFocusElement')\nconst closeButton = useTemplateRef<HTMLElement | null>('_close')\n\nconst pickFocusItem = () => {\n if (props.focus && typeof props.focus !== 'boolean') {\n if (props.focus === 'close') {\n return closeButton\n }\n return getElement(props.focus, element.value ?? undefined)\n }\n return element\n}\n\nconst onAfterEnter = () => {\n nextTick(() => {\n if (props.focus !== false && !isOpenByBreakpoint.value && props.noTrap) {\n const focusElement = unrefElement(pickFocusItem())\n focusElement?.focus()\n }\n })\n}\n\nconst {\n showRef,\n renderRef,\n renderBackdropRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n contentShowing,\n transitionProps,\n backdropReady,\n backdropTransitionProps,\n backdropVisible,\n isVisible,\n buildTriggerableEvent,\n isLeaving,\n trapActive,\n setLocalNoAnimation,\n} = useShowHide(modelValue, props, emit as EmitFn, element, computedId, {\n transitionProps: {\n onAfterEnter,\n enterToClass: 'showing',\n leaveToClass: 'hiding',\n enterActiveClass: '',\n leaveActiveClass: '',\n enterFromClass: '',\n leaveFromClass: '',\n },\n})\n\nconst breakpoints = useBreakpoints(breakpointsBootstrapV5)\nconst smallerOrEqualToBreakpoint = breakpoints.smallerOrEqual(() => props.responsive ?? 'xs')\n// Initialize with SSR-safe default value to prevent hydration mismatches\n// The actual breakpoint evaluation is deferred to onMounted (client-side only)\nconst isOpenByBreakpoint = ref(false)\n\nonMounted(() => {\n if (props.responsive !== undefined) {\n // Update the breakpoint state after mounting (client-side only)\n isOpenByBreakpoint.value = !smallerOrEqualToBreakpoint.value\n emit('breakpoint', buildTriggerableEvent('breakpoint'), isOpenByBreakpoint.value)\n }\n})\n\nuseSafeScrollLock(showRef, () => props.bodyScrolling || isOpenByBreakpoint.value)\n\nonKeyStroke(\n 'Escape',\n () => {\n hide('esc')\n },\n {target: element, passive: true}\n)\n\nconst fallbackClassSelector = 'offcanvas-fallback-focus'\n\nconst {needsFallback} = useActivatedFocusTrap({\n element,\n isActive: trapActive,\n noTrap: () => props.noTrap || isOpenByBreakpoint.value,\n fallbackFocus: {\n classSelector: fallbackClassSelector,\n ref: fallbackFocusElement,\n },\n focus: () =>\n props.focus === false || isOpenByBreakpoint.value\n ? false\n : (unrefElement(pickFocusItem()) ?? undefined),\n})\n\nconst showBackdrop = computed(\n () =>\n (props.responsive === undefined || !isOpenByBreakpoint.value) &&\n !props.noBackdrop &&\n (showRef.value === true ||\n (isLeaving.value && props.backdropFirst && !computedNoAnimation.value))\n)\n\nconst hasHeaderCloseSlot = computed(() => !isEmptySlot(slots['header-close']))\nconst headerCloseClasses = computed(() => [\n {'text-reset': !hasHeaderCloseSlot.value},\n props.headerCloseClass,\n])\nconst headerCloseAttrs = computed(() => ({\n variant: hasHeaderCloseSlot.value ? props.headerCloseVariant : undefined,\n class: headerCloseClasses.value,\n}))\n\nconst hasFooterSlot = computed(() => !isEmptySlot(slots.footer))\nconst computedClasses = computed(() => [\n props.responsive === undefined ? 'offcanvas' : `offcanvas-${props.responsive}`,\n `offcanvas-${props.placement}`,\n {\n 'show': isVisible.value,\n [`shadow-${props.shadow}`]: !!props.shadow,\n 'no-transition': computedNoAnimation.value,\n },\n])\n\nconst computedStyles = computed(() => ({\n width: props.width,\n}))\n\nconst sharedSlots = computed<BOffcanvasSlotsData>(() => ({\n visible: isVisible.value,\n placement: props.placement,\n hide,\n show,\n toggle,\n id: computedId.value,\n active: trapActive.value,\n}))\n\nwatch(smallerOrEqualToBreakpoint, (newValue) => {\n if (props.responsive === undefined) return\n if (newValue === true) {\n const opened = false\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('hide', buildTriggerableEvent('hide'))\n } else {\n const opened = true\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('show', buildTriggerableEvent('show'))\n }\n})\n\nwatch(\n () => props.responsive,\n (newValue) => {\n if (newValue === undefined) {\n isOpenByBreakpoint.value = false\n return\n }\n const opened = !smallerOrEqualToBreakpoint.value\n if (opened === isOpenByBreakpoint.value) return\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n if (opened) {\n emit('show', buildTriggerableEvent('show'))\n } else {\n emit('hide', buildTriggerableEvent('hide'))\n }\n }\n)\n\ndefineExpose({\n hide,\n show,\n toggle,\n isOpenByBreakpoint,\n})\n</script>\n","<template>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"props.teleportDisabled || isOpenByBreakpoint\"\n >\n <Transition\n v-if=\"renderRef || contentShowing || isOpenByBreakpoint\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <div\n v-show=\"\n (showRef && ((backdropReady && props.backdropFirst) || !props.backdropFirst)) ||\n isOpenByBreakpoint\n \"\n :id=\"computedId\"\n ref=\"_element\"\n aria-modal=\"true\"\n role=\"dialog\"\n :class=\"computedClasses\"\n :style=\"computedStyles\"\n tabindex=\"-1\"\n :aria-labelledby=\"`${computedId}-offcanvas-label`\"\n data-bs-backdrop=\"false\"\n v-bind=\"$attrs\"\n >\n <template v-if=\"contentShowing || isOpenByBreakpoint\">\n <div\n v-if=\"!props.noHeader\"\n class=\"offcanvas-header\"\n :class=\"props.headerClass\"\n v-bind=\"props.headerAttrs\"\n >\n <slot name=\"header\" v-bind=\"sharedSlots\">\n <h5 :id=\"`${computedId}-offcanvas-label`\" class=\"offcanvas-title\">\n <slot name=\"title\" v-bind=\"sharedSlots\">\n {{ props.title }}\n </slot>\n </h5>\n <template v-if=\"!props.noHeaderClose\">\n <BButton\n v-if=\"hasHeaderCloseSlot\"\n ref=\"_close\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n >\n <slot name=\"header-close\" v-bind=\"sharedSlots\" />\n </BButton>\n <BCloseButton\n v-else\n ref=\"_close\"\n :aria-label=\"props.headerCloseLabel\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n />\n </template>\n </slot>\n </div>\n <div class=\"offcanvas-body\" :class=\"props.bodyClass\" v-bind=\"props.bodyAttrs\">\n <slot v-bind=\"sharedSlots\" />\n </div>\n <div v-if=\"hasFooterSlot\" :class=\"props.footerClass\">\n <slot name=\"footer\" v-bind=\"sharedSlots\" />\n </div>\n </template>\n <div\n v-if=\"needsFallback\"\n ref=\"_fallbackFocusElement\"\n :class=\"fallbackClassSelector\"\n tabindex=\"0\"\n style=\"width: 0; height: 0; overflow: hidden\"\n />\n </div>\n </Transition>\n <slot v-if=\"!props.noBackdrop\" name=\"backdrop\" v-bind=\"sharedSlots\">\n <Transition v-if=\"renderBackdropRef\" v-bind=\"backdropTransitionProps\">\n <div\n v-show=\"showBackdrop\"\n class=\"offcanvas-backdrop\"\n :class=\"{\n fade: !computedNoAnimation,\n show: backdropVisible || computedNoAnimation,\n }\"\n @click=\"hide('backdrop')\"\n />\n </Transition>\n </slot>\n </ConditionalTeleport>\n</template>\n\n<script setup lang=\"ts\">\nimport {breakpointsBootstrapV5, onKeyStroke, unrefElement, useBreakpoints} from '@vueuse/core'\nimport {useActivatedFocusTrap} from '../../composables/useActivatedFocusTrap'\nimport {computed, type EmitFn, nextTick, onMounted, ref, useTemplateRef, watch} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {\n BOffcanvasEmits,\n BOffcanvasProps,\n BOffcanvasSlots,\n BOffcanvasSlotsData,\n} from '../../types'\nimport BButton from '../BButton/BButton.vue'\nimport BCloseButton from '../BButton/BCloseButton.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {useSafeScrollLock} from '../../composables/useSafeScrollLock'\nimport {isEmptySlot} from '../../utils/dom'\nimport {useShowHide} from '../../composables/useShowHide'\nimport {getElement} from '../../utils/getElement'\n\n// TODO once the responsive stuff may be implemented correctly,\n// What needs to occur is a fixing of the \"body scrolling\".\n// If the offcanvas is on the screen on a large screen, body scrolling is not disabled\n// Even though the modelValue is true\n// When it's a small screen and close, it works, as normal,\n// But then when it opens up on a small screen, it must disable again\n// This is implemented on Layout.vue, but is not officially supported.\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BOffcanvasProps, 'modelValue'>>(), {\n backdropFirst: false,\n bodyAttrs: undefined,\n bodyClass: undefined,\n bodyScrolling: false,\n focus: undefined,\n footerClass: undefined,\n headerAttrs: undefined,\n headerClass: undefined,\n headerCloseClass: undefined,\n headerCloseLabel: 'Close',\n headerCloseVariant: 'secondary',\n id: undefined,\n initialAnimation: false,\n lazy: false,\n noAnimation: false,\n noBackdrop: false,\n noCloseOnBackdrop: false,\n noCloseOnEsc: false,\n noTrap: false,\n noHeader: false,\n noHeaderClose: false,\n unmountLazy: false,\n placement: 'start',\n shadow: false,\n teleportDisabled: false,\n teleportTo: 'body',\n title: undefined,\n show: false,\n width: undefined,\n visible: false,\n})\nconst props = useDefaults(_props, 'BOffcanvas')\nconst emit = defineEmits<BOffcanvasEmits>()\nconst slots = defineSlots<BOffcanvasSlots>()\n\nconst modelValue = defineModel<Exclude<BOffcanvasProps['modelValue'], undefined>>({\n default: false,\n})\n\nconst computedId = useId(() => props.id, 'offcanvas')\n\nconst element = useTemplateRef<HTMLElement | null>('_element')\nconst fallbackFocusElement = useTemplateRef<HTMLElement | null>('_fallbackFocusElement')\nconst closeButton = useTemplateRef<HTMLElement | null>('_close')\n\nconst pickFocusItem = () => {\n if (props.focus && typeof props.focus !== 'boolean') {\n if (props.focus === 'close') {\n return closeButton\n }\n return getElement(props.focus, element.value ?? undefined)\n }\n return element\n}\n\nconst onAfterEnter = () => {\n nextTick(() => {\n if (props.focus !== false && !isOpenByBreakpoint.value && props.noTrap) {\n const focusElement = unrefElement(pickFocusItem())\n focusElement?.focus()\n }\n })\n}\n\nconst {\n showRef,\n renderRef,\n renderBackdropRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n contentShowing,\n transitionProps,\n backdropReady,\n backdropTransitionProps,\n backdropVisible,\n isVisible,\n buildTriggerableEvent,\n isLeaving,\n trapActive,\n setLocalNoAnimation,\n} = useShowHide(modelValue, props, emit as EmitFn, element, computedId, {\n transitionProps: {\n onAfterEnter,\n enterToClass: 'showing',\n leaveToClass: 'hiding',\n enterActiveClass: '',\n leaveActiveClass: '',\n enterFromClass: '',\n leaveFromClass: '',\n },\n})\n\nconst breakpoints = useBreakpoints(breakpointsBootstrapV5)\nconst smallerOrEqualToBreakpoint = breakpoints.smallerOrEqual(() => props.responsive ?? 'xs')\n// Initialize with SSR-safe default value to prevent hydration mismatches\n// The actual breakpoint evaluation is deferred to onMounted (client-side only)\nconst isOpenByBreakpoint = ref(false)\n\nonMounted(() => {\n if (props.responsive !== undefined) {\n // Update the breakpoint state after mounting (client-side only)\n isOpenByBreakpoint.value = !smallerOrEqualToBreakpoint.value\n emit('breakpoint', buildTriggerableEvent('breakpoint'), isOpenByBreakpoint.value)\n }\n})\n\nuseSafeScrollLock(showRef, () => props.bodyScrolling || isOpenByBreakpoint.value)\n\nonKeyStroke(\n 'Escape',\n () => {\n hide('esc')\n },\n {target: element, passive: true}\n)\n\nconst fallbackClassSelector = 'offcanvas-fallback-focus'\n\nconst {needsFallback} = useActivatedFocusTrap({\n element,\n isActive: trapActive,\n noTrap: () => props.noTrap || isOpenByBreakpoint.value,\n fallbackFocus: {\n classSelector: fallbackClassSelector,\n ref: fallbackFocusElement,\n },\n focus: () =>\n props.focus === false || isOpenByBreakpoint.value\n ? false\n : (unrefElement(pickFocusItem()) ?? undefined),\n})\n\nconst showBackdrop = computed(\n () =>\n (props.responsive === undefined || !isOpenByBreakpoint.value) &&\n !props.noBackdrop &&\n (showRef.value === true ||\n (isLeaving.value && props.backdropFirst && !computedNoAnimation.value))\n)\n\nconst hasHeaderCloseSlot = computed(() => !isEmptySlot(slots['header-close']))\nconst headerCloseClasses = computed(() => [\n {'text-reset': !hasHeaderCloseSlot.value},\n props.headerCloseClass,\n])\nconst headerCloseAttrs = computed(() => ({\n variant: hasHeaderCloseSlot.value ? props.headerCloseVariant : undefined,\n class: headerCloseClasses.value,\n}))\n\nconst hasFooterSlot = computed(() => !isEmptySlot(slots.footer))\nconst computedClasses = computed(() => [\n props.responsive === undefined ? 'offcanvas' : `offcanvas-${props.responsive}`,\n `offcanvas-${props.placement}`,\n {\n 'show': isVisible.value,\n [`shadow-${props.shadow}`]: !!props.shadow,\n 'no-transition': computedNoAnimation.value,\n },\n])\n\nconst computedStyles = computed(() => ({\n width: props.width,\n}))\n\nconst sharedSlots = computed<BOffcanvasSlotsData>(() => ({\n visible: isVisible.value,\n placement: props.placement,\n hide,\n show,\n toggle,\n id: computedId.value,\n active: trapActive.value,\n}))\n\nwatch(smallerOrEqualToBreakpoint, (newValue) => {\n if (props.responsive === undefined) return\n if (newValue === true) {\n const opened = false\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('hide', buildTriggerableEvent('hide'))\n } else {\n const opened = true\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('show', buildTriggerableEvent('show'))\n }\n})\n\nwatch(\n () => props.responsive,\n (newValue) => {\n if (newValue === undefined) {\n isOpenByBreakpoint.value = false\n return\n }\n const opened = !smallerOrEqualToBreakpoint.value\n if (opened === isOpenByBreakpoint.value) return\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n if (opened) {\n emit('show', buildTriggerableEvent('show'))\n } else {\n emit('hide', buildTriggerableEvent('hide'))\n }\n }\n)\n\ndefineExpose({\n hide,\n show,\n toggle,\n isOpenByBreakpoint,\n})\n</script>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BOffcanvas-Dw-tsRFl.mjs","names":["$attrs"],"sources":["../src/components/BOffcanvas/BOffcanvas.vue","../src/components/BOffcanvas/BOffcanvas.vue"],"sourcesContent":["<template>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"props.teleportDisabled || isOpenByBreakpoint\"\n >\n <Transition\n v-if=\"renderRef || contentShowing || isOpenByBreakpoint\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <div\n v-show=\"\n (showRef && ((backdropReady && props.backdropFirst) || !props.backdropFirst)) ||\n isOpenByBreakpoint\n \"\n :id=\"computedId\"\n ref=\"_element\"\n aria-modal=\"true\"\n role=\"dialog\"\n :class=\"computedClasses\"\n :style=\"computedStyles\"\n tabindex=\"-1\"\n :aria-labelledby=\"`${computedId}-offcanvas-label`\"\n data-bs-backdrop=\"false\"\n v-bind=\"$attrs\"\n >\n <template v-if=\"contentShowing || isOpenByBreakpoint\">\n <div\n v-if=\"!props.noHeader\"\n class=\"offcanvas-header\"\n :class=\"props.headerClass\"\n v-bind=\"props.headerAttrs\"\n >\n <slot name=\"header\" v-bind=\"sharedSlots\">\n <h5 :id=\"`${computedId}-offcanvas-label`\" class=\"offcanvas-title\">\n <slot name=\"title\" v-bind=\"sharedSlots\">\n {{ props.title }}\n </slot>\n </h5>\n <template v-if=\"!props.noHeaderClose\">\n <BButton\n v-if=\"hasHeaderCloseSlot\"\n ref=\"_close\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n >\n <slot name=\"header-close\" v-bind=\"sharedSlots\" />\n </BButton>\n <BCloseButton\n v-else\n ref=\"_close\"\n :aria-label=\"props.headerCloseLabel\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n />\n </template>\n </slot>\n </div>\n <div class=\"offcanvas-body\" :class=\"props.bodyClass\" v-bind=\"props.bodyAttrs\">\n <slot v-bind=\"sharedSlots\" />\n </div>\n <div v-if=\"hasFooterSlot\" :class=\"props.footerClass\">\n <slot name=\"footer\" v-bind=\"sharedSlots\" />\n </div>\n </template>\n <div\n v-if=\"needsFallback\"\n ref=\"_fallbackFocusElement\"\n :class=\"fallbackClassSelector\"\n tabindex=\"0\"\n style=\"width: 0; height: 0; overflow: hidden\"\n />\n </div>\n </Transition>\n <slot v-if=\"!props.noBackdrop\" name=\"backdrop\" v-bind=\"sharedSlots\">\n <Transition v-if=\"renderBackdropRef\" v-bind=\"backdropTransitionProps\">\n <div\n v-show=\"showBackdrop\"\n class=\"offcanvas-backdrop\"\n :class=\"{\n fade: !computedNoAnimation,\n show: backdropVisible || computedNoAnimation,\n }\"\n @click=\"hide('backdrop')\"\n />\n </Transition>\n </slot>\n </ConditionalTeleport>\n</template>\n\n<script setup lang=\"ts\">\nimport {breakpointsBootstrapV5, onKeyStroke, unrefElement, useBreakpoints} from '@vueuse/core'\nimport {useActivatedFocusTrap} from '../../composables/useActivatedFocusTrap'\nimport {computed, type EmitFn, nextTick, onMounted, ref, useTemplateRef, watch} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {\n BOffcanvasEmits,\n BOffcanvasProps,\n BOffcanvasSlots,\n BOffcanvasSlotsData,\n} from '../../types'\nimport BButton from '../BButton/BButton.vue'\nimport BCloseButton from '../BButton/BCloseButton.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {useSafeScrollLock} from '../../composables/useSafeScrollLock'\nimport {isEmptySlot} from '../../utils/dom'\nimport {useShowHide} from '../../composables/useShowHide'\nimport {getElement} from '../../utils/getElement'\n\n// TODO once the responsive stuff may be implemented correctly,\n// What needs to occur is a fixing of the \"body scrolling\".\n// If the offcanvas is on the screen on a large screen, body scrolling is not disabled\n// Even though the modelValue is true\n// When it's a small screen and close, it works, as normal,\n// But then when it opens up on a small screen, it must disable again\n// This is implemented on Layout.vue, but is not officially supported.\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BOffcanvasProps, 'modelValue'>>(), {\n backdropFirst: false,\n bodyAttrs: undefined,\n bodyClass: undefined,\n bodyScrolling: false,\n focus: undefined,\n footerClass: undefined,\n headerAttrs: undefined,\n headerClass: undefined,\n headerCloseClass: undefined,\n headerCloseLabel: 'Close',\n headerCloseVariant: 'secondary',\n id: undefined,\n initialAnimation: false,\n lazy: false,\n noAnimation: false,\n noBackdrop: false,\n noCloseOnBackdrop: false,\n noCloseOnEsc: false,\n noTrap: false,\n noHeader: false,\n noHeaderClose: false,\n unmountLazy: false,\n placement: 'start',\n shadow: false,\n teleportDisabled: false,\n teleportTo: 'body',\n title: undefined,\n show: false,\n width: undefined,\n visible: false,\n})\nconst props = useDefaults(_props, 'BOffcanvas')\nconst emit = defineEmits<BOffcanvasEmits>()\nconst slots = defineSlots<BOffcanvasSlots>()\n\nconst modelValue = defineModel<Exclude<BOffcanvasProps['modelValue'], undefined>>({\n default: false,\n})\n\nconst computedId = useId(() => props.id, 'offcanvas')\n\nconst element = useTemplateRef<HTMLElement | null>('_element')\nconst fallbackFocusElement = useTemplateRef<HTMLElement | null>('_fallbackFocusElement')\nconst closeButton = useTemplateRef<HTMLElement | null>('_close')\n\nconst pickFocusItem = () => {\n if (props.focus && typeof props.focus !== 'boolean') {\n if (props.focus === 'close') {\n return closeButton\n }\n return getElement(props.focus, element.value ?? undefined)\n }\n return element\n}\n\nconst onAfterEnter = () => {\n nextTick(() => {\n if (props.focus !== false && !isOpenByBreakpoint.value && props.noTrap) {\n const focusElement = unrefElement(pickFocusItem())\n focusElement?.focus()\n }\n })\n}\n\nconst {\n showRef,\n renderRef,\n renderBackdropRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n contentShowing,\n transitionProps,\n backdropReady,\n backdropTransitionProps,\n backdropVisible,\n isVisible,\n buildTriggerableEvent,\n isLeaving,\n trapActive,\n setLocalNoAnimation,\n} = useShowHide(modelValue, props, emit as EmitFn, element, computedId, {\n transitionProps: {\n onAfterEnter,\n enterToClass: 'showing',\n leaveToClass: 'hiding',\n enterActiveClass: '',\n leaveActiveClass: '',\n enterFromClass: '',\n leaveFromClass: '',\n },\n})\n\nconst breakpoints = useBreakpoints(breakpointsBootstrapV5)\nconst smallerOrEqualToBreakpoint = breakpoints.smallerOrEqual(() => props.responsive ?? 'xs')\n// Initialize with SSR-safe default value to prevent hydration mismatches\n// The actual breakpoint evaluation is deferred to onMounted (client-side only)\nconst isOpenByBreakpoint = ref(false)\n\nonMounted(() => {\n if (props.responsive !== undefined) {\n // Update the breakpoint state after mounting (client-side only)\n isOpenByBreakpoint.value = !smallerOrEqualToBreakpoint.value\n emit('breakpoint', buildTriggerableEvent('breakpoint'), isOpenByBreakpoint.value)\n }\n})\n\nuseSafeScrollLock(showRef, () => props.bodyScrolling || isOpenByBreakpoint.value)\n\nonKeyStroke(\n 'Escape',\n () => {\n hide('esc')\n },\n {target: element, passive: true}\n)\n\nconst fallbackClassSelector = 'offcanvas-fallback-focus'\n\nconst {needsFallback} = useActivatedFocusTrap({\n element,\n isActive: trapActive,\n noTrap: () => props.noTrap || isOpenByBreakpoint.value,\n fallbackFocus: {\n classSelector: fallbackClassSelector,\n ref: fallbackFocusElement,\n },\n focus: () =>\n props.focus === false || isOpenByBreakpoint.value\n ? false\n : (unrefElement(pickFocusItem()) ?? undefined),\n})\n\nconst showBackdrop = computed(\n () =>\n (props.responsive === undefined || !isOpenByBreakpoint.value) &&\n !props.noBackdrop &&\n (showRef.value === true ||\n (isLeaving.value && props.backdropFirst && !computedNoAnimation.value))\n)\n\nconst hasHeaderCloseSlot = computed(() => !isEmptySlot(slots['header-close']))\nconst headerCloseClasses = computed(() => [\n {'text-reset': !hasHeaderCloseSlot.value},\n props.headerCloseClass,\n])\nconst headerCloseAttrs = computed(() => ({\n variant: hasHeaderCloseSlot.value ? props.headerCloseVariant : undefined,\n class: headerCloseClasses.value,\n}))\n\nconst hasFooterSlot = computed(() => !isEmptySlot(slots.footer))\nconst computedClasses = computed(() => [\n props.responsive === undefined ? 'offcanvas' : `offcanvas-${props.responsive}`,\n `offcanvas-${props.placement}`,\n {\n 'show': isVisible.value,\n [`shadow-${props.shadow}`]: !!props.shadow,\n 'no-transition': computedNoAnimation.value,\n },\n])\n\nconst computedStyles = computed(() => ({\n width: props.width,\n}))\n\nconst sharedSlots = computed<BOffcanvasSlotsData>(() => ({\n visible: isVisible.value,\n placement: props.placement,\n hide,\n show,\n toggle,\n id: computedId.value,\n active: trapActive.value,\n}))\n\nwatch(smallerOrEqualToBreakpoint, (newValue) => {\n if (props.responsive === undefined) return\n if (newValue === true) {\n const opened = false\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('hide', buildTriggerableEvent('hide'))\n } else {\n const opened = true\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('show', buildTriggerableEvent('show'))\n }\n})\n\nwatch(\n () => props.responsive,\n (newValue) => {\n if (newValue === undefined) {\n isOpenByBreakpoint.value = false\n return\n }\n const opened = !smallerOrEqualToBreakpoint.value\n if (opened === isOpenByBreakpoint.value) return\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n if (opened) {\n emit('show', buildTriggerableEvent('show'))\n } else {\n emit('hide', buildTriggerableEvent('hide'))\n }\n }\n)\n\ndefineExpose({\n hide,\n show,\n toggle,\n isOpenByBreakpoint,\n})\n</script>\n","<template>\n <ConditionalTeleport\n :to=\"props.teleportTo\"\n :disabled=\"props.teleportDisabled || isOpenByBreakpoint\"\n >\n <Transition\n v-if=\"renderRef || contentShowing || isOpenByBreakpoint\"\n v-bind=\"transitionProps\"\n :appear=\"modelValue || props.visible\"\n >\n <div\n v-show=\"\n (showRef && ((backdropReady && props.backdropFirst) || !props.backdropFirst)) ||\n isOpenByBreakpoint\n \"\n :id=\"computedId\"\n ref=\"_element\"\n aria-modal=\"true\"\n role=\"dialog\"\n :class=\"computedClasses\"\n :style=\"computedStyles\"\n tabindex=\"-1\"\n :aria-labelledby=\"`${computedId}-offcanvas-label`\"\n data-bs-backdrop=\"false\"\n v-bind=\"$attrs\"\n >\n <template v-if=\"contentShowing || isOpenByBreakpoint\">\n <div\n v-if=\"!props.noHeader\"\n class=\"offcanvas-header\"\n :class=\"props.headerClass\"\n v-bind=\"props.headerAttrs\"\n >\n <slot name=\"header\" v-bind=\"sharedSlots\">\n <h5 :id=\"`${computedId}-offcanvas-label`\" class=\"offcanvas-title\">\n <slot name=\"title\" v-bind=\"sharedSlots\">\n {{ props.title }}\n </slot>\n </h5>\n <template v-if=\"!props.noHeaderClose\">\n <BButton\n v-if=\"hasHeaderCloseSlot\"\n ref=\"_close\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n >\n <slot name=\"header-close\" v-bind=\"sharedSlots\" />\n </BButton>\n <BCloseButton\n v-else\n ref=\"_close\"\n :aria-label=\"props.headerCloseLabel\"\n v-bind=\"headerCloseAttrs\"\n @click=\"hide('close')\"\n />\n </template>\n </slot>\n </div>\n <div class=\"offcanvas-body\" :class=\"props.bodyClass\" v-bind=\"props.bodyAttrs\">\n <slot v-bind=\"sharedSlots\" />\n </div>\n <div v-if=\"hasFooterSlot\" :class=\"props.footerClass\">\n <slot name=\"footer\" v-bind=\"sharedSlots\" />\n </div>\n </template>\n <div\n v-if=\"needsFallback\"\n ref=\"_fallbackFocusElement\"\n :class=\"fallbackClassSelector\"\n tabindex=\"0\"\n style=\"width: 0; height: 0; overflow: hidden\"\n />\n </div>\n </Transition>\n <slot v-if=\"!props.noBackdrop\" name=\"backdrop\" v-bind=\"sharedSlots\">\n <Transition v-if=\"renderBackdropRef\" v-bind=\"backdropTransitionProps\">\n <div\n v-show=\"showBackdrop\"\n class=\"offcanvas-backdrop\"\n :class=\"{\n fade: !computedNoAnimation,\n show: backdropVisible || computedNoAnimation,\n }\"\n @click=\"hide('backdrop')\"\n />\n </Transition>\n </slot>\n </ConditionalTeleport>\n</template>\n\n<script setup lang=\"ts\">\nimport {breakpointsBootstrapV5, onKeyStroke, unrefElement, useBreakpoints} from '@vueuse/core'\nimport {useActivatedFocusTrap} from '../../composables/useActivatedFocusTrap'\nimport {computed, type EmitFn, nextTick, onMounted, ref, useTemplateRef, watch} from 'vue'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport type {\n BOffcanvasEmits,\n BOffcanvasProps,\n BOffcanvasSlots,\n BOffcanvasSlotsData,\n} from '../../types'\nimport BButton from '../BButton/BButton.vue'\nimport BCloseButton from '../BButton/BCloseButton.vue'\nimport ConditionalTeleport from '../ConditionalTeleport.vue'\nimport {useSafeScrollLock} from '../../composables/useSafeScrollLock'\nimport {isEmptySlot} from '../../utils/dom'\nimport {useShowHide} from '../../composables/useShowHide'\nimport {getElement} from '../../utils/getElement'\n\n// TODO once the responsive stuff may be implemented correctly,\n// What needs to occur is a fixing of the \"body scrolling\".\n// If the offcanvas is on the screen on a large screen, body scrolling is not disabled\n// Even though the modelValue is true\n// When it's a small screen and close, it works, as normal,\n// But then when it opens up on a small screen, it must disable again\n// This is implemented on Layout.vue, but is not officially supported.\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BOffcanvasProps, 'modelValue'>>(), {\n backdropFirst: false,\n bodyAttrs: undefined,\n bodyClass: undefined,\n bodyScrolling: false,\n focus: undefined,\n footerClass: undefined,\n headerAttrs: undefined,\n headerClass: undefined,\n headerCloseClass: undefined,\n headerCloseLabel: 'Close',\n headerCloseVariant: 'secondary',\n id: undefined,\n initialAnimation: false,\n lazy: false,\n noAnimation: false,\n noBackdrop: false,\n noCloseOnBackdrop: false,\n noCloseOnEsc: false,\n noTrap: false,\n noHeader: false,\n noHeaderClose: false,\n unmountLazy: false,\n placement: 'start',\n shadow: false,\n teleportDisabled: false,\n teleportTo: 'body',\n title: undefined,\n show: false,\n width: undefined,\n visible: false,\n})\nconst props = useDefaults(_props, 'BOffcanvas')\nconst emit = defineEmits<BOffcanvasEmits>()\nconst slots = defineSlots<BOffcanvasSlots>()\n\nconst modelValue = defineModel<Exclude<BOffcanvasProps['modelValue'], undefined>>({\n default: false,\n})\n\nconst computedId = useId(() => props.id, 'offcanvas')\n\nconst element = useTemplateRef<HTMLElement | null>('_element')\nconst fallbackFocusElement = useTemplateRef<HTMLElement | null>('_fallbackFocusElement')\nconst closeButton = useTemplateRef<HTMLElement | null>('_close')\n\nconst pickFocusItem = () => {\n if (props.focus && typeof props.focus !== 'boolean') {\n if (props.focus === 'close') {\n return closeButton\n }\n return getElement(props.focus, element.value ?? undefined)\n }\n return element\n}\n\nconst onAfterEnter = () => {\n nextTick(() => {\n if (props.focus !== false && !isOpenByBreakpoint.value && props.noTrap) {\n const focusElement = unrefElement(pickFocusItem())\n focusElement?.focus()\n }\n })\n}\n\nconst {\n showRef,\n renderRef,\n renderBackdropRef,\n hide,\n show,\n toggle,\n computedNoAnimation,\n contentShowing,\n transitionProps,\n backdropReady,\n backdropTransitionProps,\n backdropVisible,\n isVisible,\n buildTriggerableEvent,\n isLeaving,\n trapActive,\n setLocalNoAnimation,\n} = useShowHide(modelValue, props, emit as EmitFn, element, computedId, {\n transitionProps: {\n onAfterEnter,\n enterToClass: 'showing',\n leaveToClass: 'hiding',\n enterActiveClass: '',\n leaveActiveClass: '',\n enterFromClass: '',\n leaveFromClass: '',\n },\n})\n\nconst breakpoints = useBreakpoints(breakpointsBootstrapV5)\nconst smallerOrEqualToBreakpoint = breakpoints.smallerOrEqual(() => props.responsive ?? 'xs')\n// Initialize with SSR-safe default value to prevent hydration mismatches\n// The actual breakpoint evaluation is deferred to onMounted (client-side only)\nconst isOpenByBreakpoint = ref(false)\n\nonMounted(() => {\n if (props.responsive !== undefined) {\n // Update the breakpoint state after mounting (client-side only)\n isOpenByBreakpoint.value = !smallerOrEqualToBreakpoint.value\n emit('breakpoint', buildTriggerableEvent('breakpoint'), isOpenByBreakpoint.value)\n }\n})\n\nuseSafeScrollLock(showRef, () => props.bodyScrolling || isOpenByBreakpoint.value)\n\nonKeyStroke(\n 'Escape',\n () => {\n hide('esc')\n },\n {target: element, passive: true}\n)\n\nconst fallbackClassSelector = 'offcanvas-fallback-focus'\n\nconst {needsFallback} = useActivatedFocusTrap({\n element,\n isActive: trapActive,\n noTrap: () => props.noTrap || isOpenByBreakpoint.value,\n fallbackFocus: {\n classSelector: fallbackClassSelector,\n ref: fallbackFocusElement,\n },\n focus: () =>\n props.focus === false || isOpenByBreakpoint.value\n ? false\n : (unrefElement(pickFocusItem()) ?? undefined),\n})\n\nconst showBackdrop = computed(\n () =>\n (props.responsive === undefined || !isOpenByBreakpoint.value) &&\n !props.noBackdrop &&\n (showRef.value === true ||\n (isLeaving.value && props.backdropFirst && !computedNoAnimation.value))\n)\n\nconst hasHeaderCloseSlot = computed(() => !isEmptySlot(slots['header-close']))\nconst headerCloseClasses = computed(() => [\n {'text-reset': !hasHeaderCloseSlot.value},\n props.headerCloseClass,\n])\nconst headerCloseAttrs = computed(() => ({\n variant: hasHeaderCloseSlot.value ? props.headerCloseVariant : undefined,\n class: headerCloseClasses.value,\n}))\n\nconst hasFooterSlot = computed(() => !isEmptySlot(slots.footer))\nconst computedClasses = computed(() => [\n props.responsive === undefined ? 'offcanvas' : `offcanvas-${props.responsive}`,\n `offcanvas-${props.placement}`,\n {\n 'show': isVisible.value,\n [`shadow-${props.shadow}`]: !!props.shadow,\n 'no-transition': computedNoAnimation.value,\n },\n])\n\nconst computedStyles = computed(() => ({\n width: props.width,\n}))\n\nconst sharedSlots = computed<BOffcanvasSlotsData>(() => ({\n visible: isVisible.value,\n placement: props.placement,\n hide,\n show,\n toggle,\n id: computedId.value,\n active: trapActive.value,\n}))\n\nwatch(smallerOrEqualToBreakpoint, (newValue) => {\n if (props.responsive === undefined) return\n if (newValue === true) {\n const opened = false\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('hide', buildTriggerableEvent('hide'))\n } else {\n const opened = true\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n emit('show', buildTriggerableEvent('show'))\n }\n})\n\nwatch(\n () => props.responsive,\n (newValue) => {\n if (newValue === undefined) {\n isOpenByBreakpoint.value = false\n return\n }\n const opened = !smallerOrEqualToBreakpoint.value\n if (opened === isOpenByBreakpoint.value) return\n setLocalNoAnimation(true)\n requestAnimationFrame(() => {\n isOpenByBreakpoint.value = opened\n })\n emit('breakpoint', buildTriggerableEvent('breakpoint'), opened)\n if (opened) {\n emit('show', buildTriggerableEvent('show'))\n } else {\n emit('hide', buildTriggerableEvent('hide'))\n }\n }\n)\n\ndefineExpose({\n hide,\n show,\n toggle,\n isOpenByBreakpoint,\n})\n</script>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFormSelect-C0nvno12.mjs","names":[],"sources":["../src/composables/useFormSelect.ts"],"sourcesContent":["import {computed, type MaybeRefOrGetter, toValue} from 'vue'\nimport {get} from '../utils/object'\nimport type {ComplexSelectOptionRaw, SelectOption} from '../types'\n\nexport const useFormSelect = (\n options: MaybeRefOrGetter<ReadonlyArray<unknown>>,\n props: MaybeRefOrGetter<{\n valueField: string\n textField: string\n disabledField: string\n optionsField?: string\n labelField?: string\n }>\n) => {\n const isComplex = (option: unknown): option is ComplexSelectOptionRaw =>\n typeof option === 'object' &&\n option !== null &&\n 'options' in option &&\n Array.isArray((option as Record<string, unknown>).options)\n\n const normalizeOption = (option: unknown): ComplexSelectOptionRaw | SelectOption => {\n const propsValue = toValue(props)\n\n if (typeof option === 'string') {\n return {value: option, text: option} satisfies SelectOption\n }\n if (typeof option === 'number' || typeof option === 'boolean') {\n return {value: option, text: `${option}`} satisfies SelectOption\n }\n if (option instanceof Date) {\n return {value: option, text: option.toLocaleString()} satisfies SelectOption\n }\n\n const value: unknown = get(option, propsValue.valueField)\n const text: string = get(option, propsValue.textField)\n const disabled: boolean = get(option, propsValue.disabledField)\n\n const opts: undefined | unknown[] = propsValue.optionsField\n ? get(option, propsValue.optionsField)\n : undefined\n const label: string | undefined =\n (propsValue.labelField ? get(option, propsValue.labelField) : undefined) || text\n\n if (opts !== undefined && Array.isArray(opts)) {\n return {\n label,\n options: opts,\n } as ComplexSelectOptionRaw\n }\n\n return {\n ...(typeof option === 'object' ? option : undefined),\n value,\n text,\n disabled,\n } satisfies SelectOption\n }\n\n const normalizeOptions = (\n opts: ReadonlyArray<unknown>\n ): (ComplexSelectOptionRaw | SelectOption)[] => opts.map((option) => normalizeOption(option))\n\n const normalizedOptions = computed(() => normalizeOptions(toValue(options)))\n\n return {normalizedOptions, isComplex}\n}\n"],"mappings":";;;AAIA,IAAa,iBACX,SACA,UAOG;CACH,MAAM,aAAa,WACjB,OAAO,WAAW,YAClB,WAAW,QACX,aAAa,UACb,MAAM,QAAS,OAAmC,QAAQ;CAE5D,MAAM,mBAAmB,WAA2D;EAClF,MAAM,aAAa,QAAQ,MAAM;AAEjC,MAAI,OAAO,WAAW,SACpB,QAAO;GAAC,OAAO;GAAQ,MAAM;GAAO;AAEtC,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAClD,QAAO;GAAC,OAAO;GAAQ,MAAM,GAAG;GAAS;AAE3C,MAAI,kBAAkB,KACpB,QAAO;GAAC,OAAO;GAAQ,MAAM,OAAO,gBAAgB;GAAC;EAGvD,MAAM,QAAiB,IAAI,QAAQ,WAAW,WAAW;EACzD,MAAM,OAAe,IAAI,QAAQ,WAAW,UAAU;EACtD,MAAM,WAAoB,IAAI,QAAQ,WAAW,cAAc;EAE/D,MAAM,OAA8B,WAAW,eAC3C,IAAI,QAAQ,WAAW,aAAa,GACpC,KAAA;EACJ,MAAM,SACH,WAAW,aAAa,IAAI,QAAQ,WAAW,WAAW,GAAG,KAAA,MAAc;AAE9E,MAAI,SAAS,KAAA,KAAa,MAAM,QAAQ,KAAK,CAC3C,QAAO;GACL;GACA,SAAS;GACV;AAGH,SAAO;GACL,GAAI,OAAO,WAAW,WAAW,SAAS,KAAA;GAC1C;GACA;GACA;GACD;;CAGH,MAAM,oBACJ,SAC8C,KAAK,KAAK,WAAW,gBAAgB,OAAO,CAAC;AAI7F,QAAO;EAAC,mBAFkB,eAAe,iBAAiB,QAAQ,QAAQ,CAAC,CAAC;EAEjD;EAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFormSelect-CjAziZpu.js","names":[],"sources":["../src/composables/useFormSelect.ts"],"sourcesContent":["import {computed, type MaybeRefOrGetter, toValue} from 'vue'\nimport {get} from '../utils/object'\nimport type {ComplexSelectOptionRaw, SelectOption} from '../types'\n\nexport const useFormSelect = (\n options: MaybeRefOrGetter<ReadonlyArray<unknown>>,\n props: MaybeRefOrGetter<{\n valueField: string\n textField: string\n disabledField: string\n optionsField?: string\n labelField?: string\n }>\n) => {\n const isComplex = (option: unknown): option is ComplexSelectOptionRaw =>\n typeof option === 'object' &&\n option !== null &&\n 'options' in option &&\n Array.isArray((option as Record<string, unknown>).options)\n\n const normalizeOption = (option: unknown): ComplexSelectOptionRaw | SelectOption => {\n const propsValue = toValue(props)\n\n if (typeof option === 'string') {\n return {value: option, text: option} satisfies SelectOption\n }\n if (typeof option === 'number' || typeof option === 'boolean') {\n return {value: option, text: `${option}`} satisfies SelectOption\n }\n if (option instanceof Date) {\n return {value: option, text: option.toLocaleString()} satisfies SelectOption\n }\n\n const value: unknown = get(option, propsValue.valueField)\n const text: string = get(option, propsValue.textField)\n const disabled: boolean = get(option, propsValue.disabledField)\n\n const opts: undefined | unknown[] = propsValue.optionsField\n ? get(option, propsValue.optionsField)\n : undefined\n const label: string | undefined =\n (propsValue.labelField ? get(option, propsValue.labelField) : undefined) || text\n\n if (opts !== undefined && Array.isArray(opts)) {\n return {\n label,\n options: opts,\n } as ComplexSelectOptionRaw\n }\n\n return {\n ...(typeof option === 'object' ? option : undefined),\n value,\n text,\n disabled,\n } satisfies SelectOption\n }\n\n const normalizeOptions = (\n opts: ReadonlyArray<unknown>\n ): (ComplexSelectOptionRaw | SelectOption)[] => opts.map((option) => normalizeOption(option))\n\n const normalizedOptions = computed(() => normalizeOptions(toValue(options)))\n\n return {normalizedOptions, isComplex}\n}\n"],"mappings":";;;;AAIA,IAAa,iBACX,SACA,UAOG;CACH,MAAM,aAAa,WACjB,OAAO,WAAW,YAClB,WAAW,QACX,aAAa,UACb,MAAM,QAAS,OAAmC,QAAQ;CAE5D,MAAM,mBAAmB,WAA2D;EAClF,MAAM,cAAA,GAAA,IAAA,SAAqB,MAAM;AAEjC,MAAI,OAAO,WAAW,SACpB,QAAO;GAAC,OAAO;GAAQ,MAAM;GAAO;AAEtC,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAClD,QAAO;GAAC,OAAO;GAAQ,MAAM,GAAG;GAAS;AAE3C,MAAI,kBAAkB,KACpB,QAAO;GAAC,OAAO;GAAQ,MAAM,OAAO,gBAAgB;GAAC;EAGvD,MAAM,QAAiB,eAAA,IAAI,QAAQ,WAAW,WAAW;EACzD,MAAM,OAAe,eAAA,IAAI,QAAQ,WAAW,UAAU;EACtD,MAAM,WAAoB,eAAA,IAAI,QAAQ,WAAW,cAAc;EAE/D,MAAM,OAA8B,WAAW,eAC3C,eAAA,IAAI,QAAQ,WAAW,aAAa,GACpC,KAAA;EACJ,MAAM,SACH,WAAW,aAAa,eAAA,IAAI,QAAQ,WAAW,WAAW,GAAG,KAAA,MAAc;AAE9E,MAAI,SAAS,KAAA,KAAa,MAAM,QAAQ,KAAK,CAC3C,QAAO;GACL;GACA,SAAS;GACV;AAGH,SAAO;GACL,GAAI,OAAO,WAAW,WAAW,SAAS,KAAA;GAC1C;GACA;GACA;GACD;;CAGH,MAAM,oBACJ,SAC8C,KAAK,KAAK,WAAW,gBAAgB,OAAO,CAAC;AAI7F,QAAO;EAAC,oBAAA,GAAA,IAAA,gBAFiC,kBAAA,GAAA,IAAA,SAAyB,QAAQ,CAAC,CAAC;EAEjD;EAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-BTPjS0XS.js","names":[],"sources":["../src/directives/utils.ts"],"sourcesContent":["import type {ComponentInternalInstance, Directive, DirectiveBinding, Ref, VNode} from 'vue'\nimport type {BPopoverProps} from '../types/ComponentProps'\nimport {\n bind,\n type ElementWithPopper,\n resolveActiveStatus,\n resolveContent,\n resolveDirectiveProps,\n unbind,\n updateBind,\n} from '../utils/floatingUi'\nimport {defaultsKey} from '../utils/keys'\n\ninterface _ComponentInternalInstance extends ComponentInternalInstance {\n provides?: Record<string, unknown>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setupState?: any\n}\n\ninterface _VNode extends VNode {\n ctx?: _ComponentInternalInstance | null\n ssContent?: VNode | null\n}\n\n/**\n * Represents per-instance state for directives using UID namespacing\n */\nexport interface DirectiveInstanceState {\n binding: string // JSON.stringify cache for change detection\n destroying: boolean // Flag to prevent race conditions during cleanup\n}\n\n/**\n * Gets the component instance UID from a directive binding\n * @throws Error if binding.instance is not available\n */\nexport function getDirectiveUid(binding: DirectiveBinding): number {\n if (!binding.instance) {\n throw new Error('[Bootstrap-Vue-Next] Directive binding.instance is not available')\n }\n return binding.instance.$.uid\n}\n\n/**\n * Initializes UID-namespaced storage on an element for a directive\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @param binding - The directive binding value to cache\n * @returns The initialized instance state\n */\nexport function initDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number,\n binding: DirectiveBinding\n): DirectiveInstanceState {\n // Initialize UID namespace for this directive\n const elWithProps = el as Record<string, unknown>\n elWithProps[propertyName] = elWithProps[propertyName] ?? Object.create(null)\n\n // Store per-instance state with JSON cache for change detection\n const state: DirectiveInstanceState = {\n binding: JSON.stringify([binding.modifiers, binding.value]),\n destroying: false,\n }\n\n ;(elWithProps[propertyName] as Record<string, unknown>)[uid] = state\n return state\n}\n\n/**\n * Gets the instance state for a directive, if it exists\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @returns The instance state or undefined if not found\n */\nexport function getDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): DirectiveInstanceState | undefined {\n const elWithProps = el as Record<string, unknown>\n return (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n}\n\n/**\n * Checks if the directive binding has changed for this instance\n * @param instance - The directive instance state\n * @param binding - The current directive binding\n * @returns true if the binding has changed, false otherwise\n */\nexport function hasBindingChanged(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): boolean {\n const newBinding = JSON.stringify([binding.modifiers, binding.value])\n return instance.binding !== newBinding\n}\n\n/**\n * Updates the cached binding value for a directive instance\n * @param instance - The directive instance state\n * @param binding - The new directive binding\n */\nexport function updateBindingCache(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): void {\n instance.binding = JSON.stringify([binding.modifiers, binding.value])\n}\n\n/**\n * Cleans up a directive instance\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n */\nexport function cleanupDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): void {\n const elWithProps = el as Record<string, unknown>\n const instance = (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n if (instance) {\n instance.destroying = true\n delete (elWithProps[propertyName] as Record<string, unknown>)[uid]\n }\n}\n\n// taken from vuetify https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/composables/directiveComponent.ts\n\nexport function findProvides(binding: DirectiveBinding, vnode: _VNode): Record<string, unknown> {\n const provides =\n (vnode.ctx === binding.instance!.$\n ? findComponentParent(vnode, binding.instance!.$)?.provides\n : vnode.ctx?.provides) ?? binding.instance!.$.provides\n\n return provides\n}\n\nexport function findComponentParent(\n vnode: VNode,\n root: ComponentInternalInstance\n): _ComponentInternalInstance | null {\n // Walk the tree from root until we find the child vnode\n const stack = new Set<VNode>()\n const walk = (children: _VNode[]): boolean => {\n for (const child of children) {\n if (!child) continue\n\n if (child === vnode || (child.el && vnode.el && child.el === vnode.el)) {\n return true\n }\n\n stack.add(child)\n let result\n if (child.suspense) {\n result = walk([child.ssContent!])\n } else if (Array.isArray(child.children)) {\n result = walk(child.children as VNode[])\n } else if (child.component?.vnode) {\n result = walk([child.component?.subTree])\n }\n if (result) {\n return result\n }\n stack.delete(child)\n }\n\n return false\n }\n if (!walk([root.subTree])) {\n console.error('Could not find original vnode, will not inherit provides')\n return root\n }\n\n // Return the first component parent\n const result = Array.from(stack).reverse()\n for (const child of result) {\n if (child.component) {\n return child.component\n }\n }\n return root\n}\n\n/**\n * Creates a floating UI directive (tooltip or popover) with UID-namespaced state management\n * @param propertyName - The property name for storing state (e.g., '$__tooltip', '$__popover')\n * @param componentDefaultsKey - The key for accessing component defaults (e.g., 'BTooltip', 'BPopover')\n * @param buildProps - Optional function to customize the props passed to bind()\n * @returns A Vue directive object\n */\nexport function createFloatingDirective(\n propertyName: string,\n componentDefaultsKey: string,\n buildProps?: (\n text: {title?: string; body?: string},\n defaults: unknown,\n binding: Readonly<DirectiveBinding>,\n el: Readonly<HTMLElement>\n ) => BPopoverProps\n): Directive<ElementWithPopper> {\n return {\n mounted(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n const isActive = resolveActiveStatus(binding.value)\n if (!isActive) return\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) return\n\n // Initialize per-instance state with UID namespacing\n initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n },\n\n updated(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n let instance = getDirectiveInstance(el, propertyName, uid)\n\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n\n const isActive = resolveActiveStatus(binding.value)\n\n // If inactive, clean up existing instance if present\n if (!isActive) {\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) {\n // Clean up if no content\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n // If instance doesn't exist, this is a transition from inactive/no-content to active\n // Initialize the instance now (similar to mounted)\n if (!instance) {\n instance = initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n return\n }\n\n // Check if binding changed for THIS instance\n if (!hasBindingChanged(instance, binding)) return\n\n // Prevent race conditions during update\n if (instance.destroying) return\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n // Update props in-place so the tooltip stays visible if it was open\n updateBind(el, binding, props)\n\n // Update THIS instance's cache\n updateBindingCache(instance, binding)\n },\n\n beforeUnmount(el, binding) {\n const uid = getDirectiveUid(binding)\n const instance = getDirectiveInstance(el, propertyName, uid)\n\n if (!instance) return\n\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n },\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-Dgz9Trtl.mjs","names":[],"sources":["../src/directives/utils.ts"],"sourcesContent":["import type {ComponentInternalInstance, Directive, DirectiveBinding, Ref, VNode} from 'vue'\nimport type {BPopoverProps} from '../types/ComponentProps'\nimport {\n bind,\n type ElementWithPopper,\n resolveActiveStatus,\n resolveContent,\n resolveDirectiveProps,\n unbind,\n updateBind,\n} from '../utils/floatingUi'\nimport {defaultsKey} from '../utils/keys'\n\ninterface _ComponentInternalInstance extends ComponentInternalInstance {\n provides?: Record<string, unknown>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setupState?: any\n}\n\ninterface _VNode extends VNode {\n ctx?: _ComponentInternalInstance | null\n ssContent?: VNode | null\n}\n\n/**\n * Represents per-instance state for directives using UID namespacing\n */\nexport interface DirectiveInstanceState {\n binding: string // JSON.stringify cache for change detection\n destroying: boolean // Flag to prevent race conditions during cleanup\n}\n\n/**\n * Gets the component instance UID from a directive binding\n * @throws Error if binding.instance is not available\n */\nexport function getDirectiveUid(binding: DirectiveBinding): number {\n if (!binding.instance) {\n throw new Error('[Bootstrap-Vue-Next] Directive binding.instance is not available')\n }\n return binding.instance.$.uid\n}\n\n/**\n * Initializes UID-namespaced storage on an element for a directive\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @param binding - The directive binding value to cache\n * @returns The initialized instance state\n */\nexport function initDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number,\n binding: DirectiveBinding\n): DirectiveInstanceState {\n // Initialize UID namespace for this directive\n const elWithProps = el as Record<string, unknown>\n elWithProps[propertyName] = elWithProps[propertyName] ?? Object.create(null)\n\n // Store per-instance state with JSON cache for change detection\n const state: DirectiveInstanceState = {\n binding: JSON.stringify([binding.modifiers, binding.value]),\n destroying: false,\n }\n\n ;(elWithProps[propertyName] as Record<string, unknown>)[uid] = state\n return state\n}\n\n/**\n * Gets the instance state for a directive, if it exists\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n * @returns The instance state or undefined if not found\n */\nexport function getDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): DirectiveInstanceState | undefined {\n const elWithProps = el as Record<string, unknown>\n return (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n}\n\n/**\n * Checks if the directive binding has changed for this instance\n * @param instance - The directive instance state\n * @param binding - The current directive binding\n * @returns true if the binding has changed, false otherwise\n */\nexport function hasBindingChanged(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): boolean {\n const newBinding = JSON.stringify([binding.modifiers, binding.value])\n return instance.binding !== newBinding\n}\n\n/**\n * Updates the cached binding value for a directive instance\n * @param instance - The directive instance state\n * @param binding - The new directive binding\n */\nexport function updateBindingCache(\n instance: DirectiveInstanceState,\n binding: DirectiveBinding\n): void {\n instance.binding = JSON.stringify([binding.modifiers, binding.value])\n}\n\n/**\n * Cleans up a directive instance\n * @param el - The HTML element\n * @param propertyName - The property name (e.g., '$__tooltip', '$__popover')\n * @param uid - The component instance UID\n */\nexport function cleanupDirectiveInstance(\n el: HTMLElement & Record<string, unknown>,\n propertyName: string,\n uid: number\n): void {\n const elWithProps = el as Record<string, unknown>\n const instance = (elWithProps[propertyName] as Record<string, unknown> | undefined)?.[uid] as\n | DirectiveInstanceState\n | undefined\n if (instance) {\n instance.destroying = true\n delete (elWithProps[propertyName] as Record<string, unknown>)[uid]\n }\n}\n\n// taken from vuetify https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/composables/directiveComponent.ts\n\nexport function findProvides(binding: DirectiveBinding, vnode: _VNode): Record<string, unknown> {\n const provides =\n (vnode.ctx === binding.instance!.$\n ? findComponentParent(vnode, binding.instance!.$)?.provides\n : vnode.ctx?.provides) ?? binding.instance!.$.provides\n\n return provides\n}\n\nexport function findComponentParent(\n vnode: VNode,\n root: ComponentInternalInstance\n): _ComponentInternalInstance | null {\n // Walk the tree from root until we find the child vnode\n const stack = new Set<VNode>()\n const walk = (children: _VNode[]): boolean => {\n for (const child of children) {\n if (!child) continue\n\n if (child === vnode || (child.el && vnode.el && child.el === vnode.el)) {\n return true\n }\n\n stack.add(child)\n let result\n if (child.suspense) {\n result = walk([child.ssContent!])\n } else if (Array.isArray(child.children)) {\n result = walk(child.children as VNode[])\n } else if (child.component?.vnode) {\n result = walk([child.component?.subTree])\n }\n if (result) {\n return result\n }\n stack.delete(child)\n }\n\n return false\n }\n if (!walk([root.subTree])) {\n console.error('Could not find original vnode, will not inherit provides')\n return root\n }\n\n // Return the first component parent\n const result = Array.from(stack).reverse()\n for (const child of result) {\n if (child.component) {\n return child.component\n }\n }\n return root\n}\n\n/**\n * Creates a floating UI directive (tooltip or popover) with UID-namespaced state management\n * @param propertyName - The property name for storing state (e.g., '$__tooltip', '$__popover')\n * @param componentDefaultsKey - The key for accessing component defaults (e.g., 'BTooltip', 'BPopover')\n * @param buildProps - Optional function to customize the props passed to bind()\n * @returns A Vue directive object\n */\nexport function createFloatingDirective(\n propertyName: string,\n componentDefaultsKey: string,\n buildProps?: (\n text: {title?: string; body?: string},\n defaults: unknown,\n binding: Readonly<DirectiveBinding>,\n el: Readonly<HTMLElement>\n ) => BPopoverProps\n): Directive<ElementWithPopper> {\n return {\n mounted(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n const isActive = resolveActiveStatus(binding.value)\n if (!isActive) return\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) return\n\n // Initialize per-instance state with UID namespacing\n initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n },\n\n updated(el, binding, vnode) {\n const uid = getDirectiveUid(binding)\n let instance = getDirectiveInstance(el, propertyName, uid)\n\n const defaultsMap = (findProvides(binding, vnode) as Record<symbol, Ref>)[defaultsKey]\n ?.value as Record<string, unknown> | undefined\n\n const isActive = resolveActiveStatus(binding.value)\n\n // If inactive, clean up existing instance if present\n if (!isActive) {\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n const text = resolveContent(binding.value, el)\n\n if (!text.body && !text.title) {\n // Clean up if no content\n if (instance && el.$__element) {\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n }\n return\n }\n\n // If instance doesn't exist, this is a transition from inactive/no-content to active\n // Initialize the instance now (similar to mounted)\n if (!instance) {\n instance = initDirectiveInstance(el, propertyName, uid, binding)\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n bind(el, binding, props)\n return\n }\n\n // Check if binding changed for THIS instance\n if (!hasBindingChanged(instance, binding)) return\n\n // Prevent race conditions during update\n if (instance.destroying) return\n\n const props = buildProps\n ? buildProps(text, defaultsMap?.[componentDefaultsKey], binding, el)\n : {\n ...(defaultsMap?.[componentDefaultsKey] || undefined),\n ...resolveDirectiveProps(binding, el),\n ...text,\n }\n\n // Update props in-place so the tooltip stays visible if it was open\n updateBind(el, binding, props)\n\n // Update THIS instance's cache\n updateBindingCache(instance, binding)\n },\n\n beforeUnmount(el, binding) {\n const uid = getDirectiveUid(binding)\n const instance = getDirectiveInstance(el, propertyName, uid)\n\n if (!instance) return\n\n unbind(el)\n cleanupDirectiveInstance(el, propertyName, uid)\n },\n }\n}\n"],"mappings":"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"}