bootstrap-vue-next
Version:
BootstrapVueNext is an early and lovely component library for Vue 3 & Nuxt 3 based on Bootstrap 5 and Typescript.
1 lines • 5.63 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../src/directives/BToggle/index.ts"],"sourcesContent":["import {RX_HASH, RX_HASH_ID, RX_SPACE_SPLIT} from '../../utils/constants'\nimport type {Directive, DirectiveBinding, VNode} from 'vue'\nimport {findProvides} from '../utils'\nimport {globalShowHideStorageInjectionKey, type RegisterShowHideValue} from '../../utils/keys'\n\nconst getTargets = (\n binding: DirectiveBinding<string | readonly string[] | undefined>,\n el: Readonly<HTMLElement>\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 toggle = (\n targetIds: readonly string[],\n el: Readonly<HTMLElement>,\n binding: DirectiveBinding,\n vnode: VNode\n) => {\n const provides = findProvides(binding, vnode)\n const showHide = (provides as Record<symbol, RegisterShowHideValue>)[\n globalShowHideStorageInjectionKey\n ]?.map\n\n targetIds.forEach((targetId) => {\n if (showHide?.[targetId]) {\n showHide[targetId].toggle()\n return\n }\n const target = document.getElementById(targetId)\n\n if (target !== null) {\n target.dispatchEvent(new Event('bv-toggle'))\n }\n })\n setTimeout(() => checkVisibility(targetIds, el), 50)\n}\n\nconst checkVisibility = (targetIds: readonly string[], el: Readonly<HTMLElement>) => {\n let visible = false\n targetIds.forEach((targetId) => {\n const target = document.getElementById(targetId)\n\n if (target?.classList.contains('show')) {\n visible = true\n }\n if (target?.classList.contains('closing')) {\n visible = false\n }\n })\n el.setAttribute('aria-expanded', visible ? 'true' : 'false')\n el.classList.remove(visible ? 'collapsed' : 'not-collapsed')\n el.classList.add(visible ? 'not-collapsed' : 'collapsed')\n}\n\nconst handleUpdate = (\n el: WithToggle,\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 // Set up click handler\n if (el.__toggle) {\n setTimeout(() => {\n el.removeEventListener('click', el.__toggle)\n el.__toggle = () => toggle(targets, el, binding, vnode)\n el.addEventListener('click', el.__toggle)\n }, 0)\n } else {\n el.__toggle = () => toggle(targets, el, binding, vnode)\n el.addEventListener('click', el.__toggle)\n }\n\n // Update attributes\n el.setAttribute('aria-controls', targets.join(' '))\n checkVisibility(targets, el)\n}\n\nexport interface WithToggle extends HTMLElement {\n __toggle: () => void\n}\n\nexport const vBToggle: Directive<WithToggle> = {\n mounted: handleUpdate,\n updated: handleUpdate,\n unmounted(el: WithToggle): void {\n el.removeEventListener('click', el.__toggle)\n el.removeAttribute('aria-controls')\n el.removeAttribute('aria-expanded')\n },\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,aAAa,CACjB,SACA,OACG;AACH,QAAM,EAAC,WAAW,KAAK,MAAS,IAAA;AAEhC,QAAM,UAAU,OAAO,KAAK,aAAa,CAAA,CAAE;AAG3C,QAAM,aAAa,OAAO,UAAU,WAAW,MAAM,MAAM,cAAc,IAAI;AAG7E,MAAI,GAAG,QAAQ,YAAY,MAAM,KAAK;AACpC,UAAM,OAAO,GAAG,aAAa,MAAM,KAAK;AACpC,QAAA,WAAW,KAAK,IAAI,GAAG;AACzB,cAAQ,KAAK,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,IAAA;AAAA,EACxC;AAMF,QAAM,UAAU,OACb,MAAM,CAAA,GAAI,CAAC,KAAK,UAAU,CAAC,EAC3B,QAAQ,CAAC,MAAM,OAAO,MAAM,YAAY,QAAQ,KAAK,CAAC,CAAC;AAGnD,SAAA,QAAQ,OAAO,CAAC,GAAG,OAAO,QAAQ,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK;AACxE;AAEA,MAAM,SAAS,CACb,WACA,IACA,SACA,UACG;;AACG,QAAA,WAAW,aAAa,SAAS,KAAK;AACtC,QAAA,YAAY,cAChB,iCACF,MAFkB,mBAEf;AAEO,YAAA,QAAQ,CAAC,aAAa;AAC1B,QAAA,qCAAW,WAAW;AACf,eAAA,QAAQ,EAAE,OAAO;AAC1B;AAAA,IAAA;AAEI,UAAA,SAAS,SAAS,eAAe,QAAQ;AAE/C,QAAI,WAAW,MAAM;AACnB,aAAO,cAAc,IAAI,MAAM,WAAW,CAAC;AAAA,IAAA;AAAA,EAC7C,CACD;AACD,aAAW,MAAM,gBAAgB,WAAW,EAAE,GAAG,EAAE;AACrD;AAEA,MAAM,kBAAkB,CAAC,WAA8B,OAA8B;AACnF,MAAI,UAAU;AACJ,YAAA,QAAQ,CAAC,aAAa;AACxB,UAAA,SAAS,SAAS,eAAe,QAAQ;AAE/C,QAAI,iCAAQ,UAAU,SAAS,SAAS;AAC5B,gBAAA;AAAA,IAAA;AAEZ,QAAI,iCAAQ,UAAU,SAAS,YAAY;AAC/B,gBAAA;AAAA,IAAA;AAAA,EACZ,CACD;AACD,KAAG,aAAa,iBAAiB,UAAU,SAAS,OAAO;AAC3D,KAAG,UAAU,OAAO,UAAU,cAAc,eAAe;AAC3D,KAAG,UAAU,IAAI,UAAU,kBAAkB,WAAW;AAC1D;AAEA,MAAM,eAAe,CACnB,IACA,SACA,UACG;AAEG,QAAA,UAAU,WAAW,SAAS,EAAE;AAClC,MAAA,QAAQ,WAAW,EAAG;AAG1B,MAAI,GAAG,UAAU;AACf,eAAW,MAAM;AACZ,SAAA,oBAAoB,SAAS,GAAG,QAAQ;AAC3C,SAAG,WAAW,MAAM,OAAO,SAAS,IAAI,SAAS,KAAK;AACnD,SAAA,iBAAiB,SAAS,GAAG,QAAQ;AAAA,OACvC,CAAC;AAAA,EAAA,OACC;AACL,OAAG,WAAW,MAAM,OAAO,SAAS,IAAI,SAAS,KAAK;AACnD,OAAA,iBAAiB,SAAS,GAAG,QAAQ;AAAA,EAAA;AAI1C,KAAG,aAAa,iBAAiB,QAAQ,KAAK,GAAG,CAAC;AAClD,kBAAgB,SAAS,EAAE;AAC7B;AAMO,MAAM,WAAkC;AAAA,EAC7C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU,IAAsB;AAC3B,OAAA,oBAAoB,SAAS,GAAG,QAAQ;AAC3C,OAAG,gBAAgB,eAAe;AAClC,OAAG,gBAAgB,eAAe;AAAA,EAAA;AAEtC;"}