{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/directives/BToggle/index.ts"],"sourcesContent":["import {RX_HASH, RX_HASH_ID, RX_SPACE_SPLIT} from '../../utils/constants'\nimport {type Directive, type DirectiveBinding, type VNode} from 'vue'\nimport {findProvides} from '../utils'\nimport {type RegisterShowHideValue, showHideRegistryKey} from '../../utils/keys'\nimport {getActiveShowHide} from '../../utils/registryAccess'\n\nconst getTargets = (\n  binding: DirectiveBinding<string | readonly string[] | undefined>,\n  el: Readonly<Element>\n) => {\n  const {modifiers, arg, value} = binding\n  // Any modifiers are considered target Ids\n  const targets = Object.keys(modifiers || {})\n\n  // If value is a string, split out individual targets (if space delimited)\n  const localValue = typeof value === 'string' ? value.split(RX_SPACE_SPLIT) : value\n\n  // Support target Id as link href (`href=\"#id\"`)\n  if (el.tagName.toLowerCase() === 'a') {\n    const href = el.getAttribute('href') || ''\n    if (RX_HASH_ID.test(href)) {\n      targets.push(href.replace(RX_HASH, ''))\n    }\n  }\n\n  // Add Id from `arg` (if provided), and support value\n  // as a single string Id or an array of string Ids\n  // If `value` is not an array or string, then it gets filtered out\n  Array.prototype.concat\n    .apply([], [arg, localValue])\n    .forEach((t) => typeof t === 'string' && targets.push(t))\n\n  // Return only unique and truthy target Ids\n  return targets.filter((t, index, arr) => t && arr.indexOf(t) === index)\n}\n\nconst handleUpdate = (\n  el: Element,\n  binding: DirectiveBinding<string | readonly string[] | undefined>,\n  vnode: VNode\n) => {\n  // Determine targets\n  const targets = getTargets(binding, el)\n  if (targets.length === 0) return\n\n  const provides = findProvides(binding, vnode)\n  const showHideMap =\n    (provides as Record<symbol, RegisterShowHideValue>)[showHideRegistryKey]?.values ?? null\n  if ((el as HTMLElement).dataset.bvtoggle) {\n    const oldTargets = ((el as HTMLElement).dataset.bvtoggle || '').split(' ')\n    if (oldTargets.length === 0) return\n    for (const targetId of oldTargets) {\n      const showHide = getActiveShowHide(showHideMap, targetId)\n      if (!showHide) {\n        continue\n      }\n      if (!targets.includes(targetId)) {\n        showHide.unregisterTrigger('click', el, false)\n      }\n    }\n  }\n  ;(el as HTMLElement).dataset.bvtoggle = targets.join(' ')\n\n  targets.forEach(async (targetId) => {\n    let count = 0\n    const maxAttempts = 5\n    const delayMs = 100\n\n    // Keep looking until showHide is found, giving up after 500ms or directive is unmounted\n    while (count < maxAttempts) {\n      // Check if element is still mounted before each iteration\n      if (!(el as HTMLElement).dataset.bvtoggle) {\n        // Element was unmounted, stop trying\n        return\n      }\n\n      const showHide = getActiveShowHide(showHideMap, targetId)\n      if (!showHide) {\n        count++\n        if (count < maxAttempts) {\n          await new Promise((resolve) => setTimeout(resolve, delayMs))\n          continue\n        }\n        // Only warn if element is still mounted after all attempts\n        if ((el as HTMLElement).dataset.bvtoggle) {\n          console.warn(\n            `[v-b-toggle] Target with ID ${targetId} not found after ${maxAttempts * delayMs}ms`\n          )\n        }\n        break\n      }\n\n      // Final check before registration\n      if (!(el as HTMLElement).dataset.bvtoggle) return\n\n      // Register the trigger element\n      showHide.unregisterTrigger('click', el, false)\n      showHide.registerTrigger('click', el)\n      break\n    }\n  })\n\n  el.setAttribute('aria-controls', targets.join(' '))\n}\nconst handleUnmount = (\n  el: Element,\n  binding: DirectiveBinding<string | readonly string[] | undefined>,\n  vnode: VNode\n) => {\n  // Determine targets\n  const targets = getTargets(binding, el)\n  if (targets.length === 0) return\n  const provides = findProvides(binding, vnode)\n  const showHideMap =\n    (provides as Record<symbol, RegisterShowHideValue>)[showHideRegistryKey]?.values ?? null\n\n  targets.forEach((targetId) => {\n    const showHide = getActiveShowHide(showHideMap, targetId)\n    if (!showHide) {\n      return\n    }\n    // Pass clean=true to let the composable handle cleanup of aria-expanded and classes\n    showHide.unregisterTrigger('click', el, true)\n  })\n\n  // Only remove what the directive manages (aria-controls)\n  // aria-expanded and classes are managed by useShowHide composable\n  el.removeAttribute('aria-controls')\n  delete (el as HTMLElement).dataset.bvtoggle\n}\n\nexport const vBToggle: Directive<Element> = {\n  mounted: handleUpdate,\n  updated: handleUpdate,\n  unmounted: handleUnmount,\n}\n"],"mappings":";;;;;;AAMA,IAAM,cACJ,SACA,OACG;CACH,MAAM,EAAC,WAAW,KAAK,UAAS;CAEhC,MAAM,UAAU,OAAO,KAAK,aAAa,EAAE,CAAC;CAG5C,MAAM,aAAa,OAAO,UAAU,WAAW,MAAM,MAAM,eAAe,GAAG;AAG7E,KAAI,GAAG,QAAQ,aAAa,KAAK,KAAK;EACpC,MAAM,OAAO,GAAG,aAAa,OAAO,IAAI;AACxC,MAAI,WAAW,KAAK,KAAK,CACvB,SAAQ,KAAK,KAAK,QAAQ,SAAS,GAAG,CAAC;;AAO3C,OAAM,UAAU,OACb,MAAM,EAAE,EAAE,CAAC,KAAK,WAAW,CAAC,CAC5B,SAAS,MAAM,OAAO,MAAM,YAAY,QAAQ,KAAK,EAAE,CAAC;AAG3D,QAAO,QAAQ,QAAQ,GAAG,OAAO,QAAQ,KAAK,IAAI,QAAQ,EAAE,KAAK,MAAM;;AAGzE,IAAM,gBACJ,IACA,SACA,UACG;CAEH,MAAM,UAAU,WAAW,SAAS,GAAG;AACvC,KAAI,QAAQ,WAAW,EAAG;CAG1B,MAAM,cADW,aAAa,SAAS,MAAM,CAES,sBAAsB,UAAU;AACtF,KAAK,GAAmB,QAAQ,UAAU;EACxC,MAAM,cAAe,GAAmB,QAAQ,YAAY,IAAI,MAAM,IAAI;AAC1E,MAAI,WAAW,WAAW,EAAG;AAC7B,OAAK,MAAM,YAAY,YAAY;GACjC,MAAM,WAAW,kBAAkB,aAAa,SAAS;AACzD,OAAI,CAAC,SACH;AAEF,OAAI,CAAC,QAAQ,SAAS,SAAS,CAC7B,UAAS,kBAAkB,SAAS,IAAI,MAAM;;;AAIlD,IAAmB,QAAQ,WAAW,QAAQ,KAAK,IAAI;AAEzD,SAAQ,QAAQ,OAAO,aAAa;EAClC,IAAI,QAAQ;EACZ,MAAM,cAAc;EACpB,MAAM,UAAU;AAGhB,SAAO,QAAQ,aAAa;AAE1B,OAAI,CAAE,GAAmB,QAAQ,SAE/B;GAGF,MAAM,WAAW,kBAAkB,aAAa,SAAS;AACzD,OAAI,CAAC,UAAU;AACb;AACA,QAAI,QAAQ,aAAa;AACvB,WAAM,IAAI,SAAS,YAAY,WAAW,SAAS,QAAQ,CAAC;AAC5D;;AAGF,QAAK,GAAmB,QAAQ,SAC9B,SAAQ,KACN,+BAA+B,SAAS,mBAAmB,cAAc,QAAQ,IAClF;AAEH;;AAIF,OAAI,CAAE,GAAmB,QAAQ,SAAU;AAG3C,YAAS,kBAAkB,SAAS,IAAI,MAAM;AAC9C,YAAS,gBAAgB,SAAS,GAAG;AACrC;;GAEF;AAEF,IAAG,aAAa,iBAAiB,QAAQ,KAAK,IAAI,CAAC;;AAErD,IAAM,iBACJ,IACA,SACA,UACG;CAEH,MAAM,UAAU,WAAW,SAAS,GAAG;AACvC,KAAI,QAAQ,WAAW,EAAG;CAE1B,MAAM,cADW,aAAa,SAAS,MAAM,CAES,sBAAsB,UAAU;AAEtF,SAAQ,SAAS,aAAa;EAC5B,MAAM,WAAW,kBAAkB,aAAa,SAAS;AACzD,MAAI,CAAC,SACH;AAGF,WAAS,kBAAkB,SAAS,IAAI,KAAK;GAC7C;AAIF,IAAG,gBAAgB,gBAAgB;AACnC,QAAQ,GAAmB,QAAQ;;AAGrC,IAAa,WAA+B;CAC1C,SAAS;CACT,SAAS;CACT,WAAW;CACZ"}