{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/ui/btn/index.ts"],"sourcesContent":["import { h, defineComponent, ref, computed, Transition, onBeforeUnmount, getCurrentInstance, ComponentPublicInstance } from 'vue'\nimport type { VNode } from 'vue'\nimport VcIcon from '../icon'\nimport { Spinner as VcSpinner } from '../spinner'\nimport { Ripple } from 'casc-cesium-directives'\nimport useBtn, { useBtnProps } from './use-btn'\nimport { hMergeSlot, hDir } from 'casc-cesium-utils/private/render'\nimport { stop, prevent, stopAndPrevent, listenOpts } from 'casc-cesium-utils/private/event'\nimport { getTouchTarget } from 'casc-cesium-utils/private/touch'\nimport { isKeyCode } from 'casc-cesium-utils/private/key-composition'\nimport { LooseDictionary } from 'casc-cesium-utils/types'\n\nconst { passiveCapture } = listenOpts\n\nlet touchTarget: HTMLElement | null, keyboardTarget: HTMLElement | null, mouseTarget: HTMLElement | null\nexport const btnProps = {\n  ...useBtnProps,\n\n  percentage: {\n    type: Number,\n    default: 0\n  },\n  darkPercentage: Boolean\n}\nexport default defineComponent({\n  name: 'VcBtn',\n\n  props: btnProps,\n\n  emits: ['click', 'keydown', 'touchstart', 'mousedown', 'keyup'],\n\n  setup(props, { slots, emit }) {\n    const proxy = getCurrentInstance()?.proxy\n\n    const { classes, style, innerClasses, attributes, isActionable } = useBtn(props)\n\n    const rootRef = ref<HTMLElement>(null)\n    const blurTargetRef = ref<HTMLElement>(null)\n\n    let localTouchTargetEl: HTMLElement = null,\n      avoidMouseRipple,\n      mouseTimer\n\n    const hasLabel = computed(() => props.label !== void 0 && props.label !== null && props.label !== '')\n\n    const ripple = computed(() =>\n      props.ripple === false\n        ? false\n        : {\n            // keyCodes: isLink.value === true ? [ 13, 32 ] : [ 13 ],\n            keyCodes: 13,\n            ...(props.ripple === true ? {} : props.ripple)\n          }\n    )\n\n    const percentageStyle = computed(() => {\n      const val = Math.max(0, Math.min(100, props.percentage))\n      return val > 0 ? { transition: 'transform 0.6s', transform: `translateX(${val - 100}%)` } : {}\n    })\n\n    const onEvents = computed(() => {\n      if (props.loading === true) {\n        return {\n          onMousedown: onLoadingEvt,\n          onTouchstart: onLoadingEvt,\n          onClick: onLoadingEvt,\n          onKeydown: onLoadingEvt,\n          onKeyup: onLoadingEvt\n        }\n      } else if (isActionable.value === true) {\n        return {\n          onClick,\n          onKeydown,\n          onMousedown,\n          onTouchstart\n        }\n      }\n\n      return {}\n    })\n\n    const directives = computed(() => {\n      // if props.disable !== true && props.ripple !== false\n      return [[Ripple, ripple.value, void 0, { center: props.round }]]\n    })\n\n    const nodeProps = computed(() => ({\n      ref: rootRef,\n      class: 'vc-btn vc-btn-item non-selectable no-outline ' + classes.value,\n      style: style.value,\n      ...attributes.value,\n      ...onEvents.value\n    }))\n\n    function onClick(e) {\n      if (e !== void 0) {\n        if (e.defaultPrevented === true) {\n          return\n        }\n\n        const el = document.activeElement\n        // focus button if it came from ENTER on form\n        // prevent the new submit (already done)\n        if (\n          props.type === 'submit' &&\n          el !== document.body &&\n          rootRef.value?.contains(el) === false &&\n          // required for iOS and desktop Safari\n          el?.contains(rootRef.value) === false\n        ) {\n          rootRef.value.focus()\n\n          const onClickCleanup = () => {\n            document.removeEventListener('keydown', stopAndPrevent, true)\n            document.removeEventListener('keyup', onClickCleanup, passiveCapture)\n            rootRef.value !== null && rootRef.value.removeEventListener('blur', onClickCleanup, passiveCapture)\n          }\n\n          document.addEventListener('keydown', stopAndPrevent, true)\n          document.addEventListener('keyup', onClickCleanup, passiveCapture)\n          rootRef.value.addEventListener('blur', onClickCleanup, passiveCapture)\n        }\n      }\n\n      const go = () => {\n        // navigateToLink(e)\n      }\n\n      emit('click', e, go)\n      // TODO vue3 - not accounting for e.navigate\n      // hasLink.value === true && e.navigate !== false && go()\n    }\n\n    function onKeydown(e) {\n      if (isKeyCode(e, [13, 32]) === true) {\n        stopAndPrevent(e)\n\n        if (keyboardTarget !== rootRef.value) {\n          keyboardTarget !== null && cleanup()\n\n          // focus external button if the focus helper was focused before\n          rootRef.value?.focus()\n\n          keyboardTarget = rootRef.value\n          rootRef.value?.classList.add('vc-btn--active')\n          document.addEventListener('keyup', onPressEnd, true)\n          rootRef.value?.addEventListener('blur', onPressEnd, passiveCapture)\n        }\n      }\n\n      emit('keydown', e)\n    }\n\n    function onTouchstart(e) {\n      if (touchTarget !== rootRef.value) {\n        touchTarget !== null && cleanup()\n        touchTarget = rootRef.value\n\n        localTouchTargetEl = getTouchTarget(e.target)\n        localTouchTargetEl?.addEventListener('touchcancel', onPressEnd, passiveCapture)\n        localTouchTargetEl?.addEventListener('touchend', onPressEnd, passiveCapture)\n      }\n\n      // avoid duplicated mousedown event\n      // triggering another early ripple\n      avoidMouseRipple = true\n      clearTimeout(mouseTimer)\n      mouseTimer = setTimeout(() => {\n        avoidMouseRipple = false\n      }, 200)\n\n      emit('touchstart', e)\n    }\n\n    function onMousedown(e) {\n      if (mouseTarget !== rootRef.value) {\n        mouseTarget !== null && cleanup()\n        mouseTarget = rootRef.value\n        rootRef.value?.classList.add('vc-btn--active')\n        document.addEventListener('mouseup', onPressEnd, passiveCapture)\n      }\n\n      e.qSkipRipple = avoidMouseRipple === true\n      emit('mousedown', e)\n    }\n\n    function onPressEnd(e) {\n      // needed for IE (because it emits blur when focusing button from focus helper)\n      if (e !== void 0 && e.type === 'blur' && document.activeElement === rootRef.value) {\n        return\n      }\n\n      if (e !== void 0 && e.type === 'keyup') {\n        if (keyboardTarget === rootRef.value && isKeyCode(e, [13, 32]) === true) {\n          // for click trigger\n          const evt = new MouseEvent('click', e)\n          ;(evt as any).qKeyEvent = true\n          e.defaultPrevented === true && prevent(evt)\n          e.cancelBubble === true && stop(evt)\n          rootRef.value?.dispatchEvent(evt)\n\n          stopAndPrevent(e)\n\n          // for ripple\n          e.qKeyEvent = true\n        }\n\n        emit('keyup', e)\n      }\n\n      cleanup()\n    }\n\n    function cleanup(destroying?) {\n      const blurTarget = blurTargetRef.value\n\n      if (\n        destroying !== true &&\n        (touchTarget === rootRef.value || mouseTarget === rootRef.value) &&\n        blurTarget !== null &&\n        blurTarget !== document.activeElement\n      ) {\n        blurTarget.setAttribute('tabindex', '-1')\n        blurTarget.focus()\n      }\n\n      if (touchTarget === rootRef.value) {\n        if (localTouchTargetEl !== null) {\n          localTouchTargetEl.removeEventListener('touchcancel', onPressEnd, passiveCapture)\n          localTouchTargetEl.removeEventListener('touchend', onPressEnd, passiveCapture)\n        }\n        touchTarget = localTouchTargetEl = null\n      }\n\n      if (mouseTarget === rootRef.value) {\n        document.removeEventListener('mouseup', onPressEnd, passiveCapture)\n        mouseTarget = null\n      }\n\n      if (keyboardTarget === rootRef.value) {\n        document.removeEventListener('keyup', onPressEnd, true)\n        rootRef.value !== null && rootRef.value.removeEventListener('blur', onPressEnd, passiveCapture)\n        keyboardTarget = null\n      }\n\n      rootRef.value !== null && rootRef.value.classList.remove('vc-btn--active')\n    }\n\n    function onLoadingEvt(evt) {\n      stopAndPrevent(evt)\n      evt.qSkipRipple = true\n    }\n\n    onBeforeUnmount(() => {\n      cleanup(true)\n    })\n\n    // expose public methods\n    Object.assign(proxy, {\n      click: onClick\n    })\n\n    return () => {\n      let inner: Array<VNode> = []\n\n      props.icon !== void 0 &&\n        inner.push(\n          h(VcIcon, {\n            name: props.icon,\n            left: props.stack === false && hasLabel.value === true,\n            role: 'img',\n            'aria-hidden': 'true'\n          })\n        )\n\n      hasLabel.value === true && inner.push(h('span', { class: 'block' }, [props.label]))\n\n      inner = hMergeSlot(slots.default, inner)\n\n      if (props.iconRight !== void 0 && props.round === false) {\n        inner.push(\n          h(VcIcon, {\n            name: props.iconRight,\n            right: props.stack === false && hasLabel.value === true,\n            role: 'img',\n            'aria-hidden': 'true'\n          })\n        )\n      }\n\n      const child = [\n        h('span', {\n          class: 'vc-focus-helper',\n          ref: blurTargetRef\n        })\n      ]\n\n      if (props.loading === true && props.percentage !== void 0) {\n        child.push(\n          h(\n            'span',\n            {\n              class: 'vc-btn__progress absolute-full overflow-hidden'\n            },\n            [\n              h('span', {\n                class: 'vc-btn__progress-indicator fit block' + (props.darkPercentage === true ? ' vc-btn__progress--dark' : ''),\n                style: percentageStyle.value\n              })\n            ]\n          )\n        )\n      }\n\n      child.push(\n        h(\n          'span',\n          {\n            class: 'vc-btn__content text-center col items-center vc-anchor--skip ' + innerClasses.value\n          },\n          inner\n        )\n      )\n\n      props.loading !== null &&\n        child.push(\n          h(\n            Transition,\n            {\n              name: 'vc-transition--fade'\n            },\n            () =>\n              props.loading === true\n                ? [\n                    h(\n                      'span',\n                      {\n                        key: 'loading',\n                        class: 'absolute-full flex flex-center'\n                      },\n                      slots.loading !== void 0 ? slots.loading() : [h(VcSpinner)]\n                    )\n                  ]\n                : null\n          )\n        )\n\n      return hDir('button', nodeProps.value, child, 'ripple', props.disable !== true && props.ripple !== false, () => directives.value)\n    }\n  }\n})\n\nexport interface VcBtnProps {\n  /**\n   * Size in CSS units, including unit name or standard size name (xs|sm|md|lg|xl).\n   */\n  size?: string | undefined\n  /**\n   * 1) Define the button native type attribute (submit, reset, button) or 2) render component with <a> tag so you can access events even if disable or 3) Use 'href' prop and specify 'type' as a media tag.\n   * Default value: button\n   */\n  type?: string | undefined\n  /**\n   * Equivalent to Vue Router <router-link> 'to' property; Superseeded by 'href' prop if used.\n   */\n  to?: string | any | undefined\n  /**\n   * Equivalent to Vue Router <router-link> 'replace' property; Superseeded by 'href' prop if used.\n   */\n  replace?: boolean | undefined\n  /**\n   * Native <a> link href attribute; Has priority over the 'to' and 'replace' props.\n   */\n  href?: string | undefined\n  /**\n   * Native <a> link target attribute; Use it only with 'to' or 'href' props.\n   */\n  target?: string | undefined\n  /**\n   * The text that will be shown on the button.\n   */\n  label?: string | number | undefined\n  /**\n   * Icon name following VueCesium convention; Make sure you have the icon library installed unless you are using 'img:' prefix.\n   */\n  icon?: string | undefined\n  /**\n   * Icon name following VueCesium convention; Make sure you have the icon library installed unless you are using 'img:' prefix.\n   */\n  iconRight?: string | undefined\n  /**\n   * Use 'outline' design.\n   */\n  outline?: boolean | undefined\n  /**\n   * Use 'flat' design.\n   */\n  flat?: boolean | undefined\n  /**\n   * Remove shadow.\n   */\n  unelevated?: boolean | undefined\n  /**\n   * Applies a more prominent border-radius for a squared shape button.\n   */\n  rounded?: boolean | undefined\n  /**\n   * Use 'push' design.\n   */\n  push?: boolean | undefined\n  /**\n   * Applies a glossy effect.\n   */\n  glossy?: boolean | undefined\n  /**\n   * Makes button size and shape to fit a Floating Action Button.\n   */\n  fab?: boolean | undefined\n  /**\n   * Makes button size and shape to fit a small Floating Action Button\n   */\n  fabMini?: boolean | undefined\n  /**\n   * Apply custom padding (vertical [horizontal]); Size in CSS units, including unit name or standard size name (none|xs|sm|md|lg|xl); Also removes the min width and height when set.\n   */\n  padding?: string | undefined\n  /**\n   * Color name for component from the css Color Palette.\n   */\n  color?: string | undefined\n  /**\n   * Overrides text color (if needed); Color name from the css Color Palette.\n   */\n  textColor?: string | undefined\n  /**\n   * Avoid turning label text into caps (which happens by default).\n   */\n  noCaps?: boolean | undefined\n  /**\n   * Avoid label text wrapping.\n   */\n  noWrap?: boolean | undefined\n  /**\n   * Dense mode; occupies less space.\n   */\n  dense?: boolean | undefined\n  /**\n   * Configure material ripple (disable it by setting it to 'false' or supply a config object).\n   * Default value: true\n   */\n  ripple?: boolean | any | undefined\n  /**\n   * Tabindex HTML attribute value.\n   */\n  tabindex?: number | string | undefined\n  /**\n   * Label or content alignment.\n   * Default value: center\n   */\n  align?: 'left' | 'right' | 'center' | 'around' | 'between' | 'evenly' | undefined\n  /**\n   * Stack icon and label vertically instead of on same line (like it is by default).\n   */\n  stack?: boolean | undefined\n  /**\n   * When used on flexbox parent, button will stretch to parent's height.\n   */\n  stretch?: boolean | undefined\n  /**\n   * Put button into loading state (displays a QSpinner -- can be overridden by using a 'loading' slot).\n   */\n  loading?: boolean | undefined\n  /**\n   * Put component in disabled mode.\n   */\n  disable?: boolean | undefined\n  /**\n   * Makes a circle shaped button.\n   */\n  round?: boolean | undefined\n  /**\n   * Percentage (0.0 < x < 100.0); To be used along 'loading' prop; Display a progress bar on the background.\n   */\n  percentage?: number | undefined\n  /**\n   * Progress bar on the background should have dark color; To be used along with 'percentage' and 'loading' props.\n   */\n  darkPercentage?: boolean | undefined\n  background?: string | undefined\n  /**\n   * Emitted when component is clicked (activated)\n   * @param evt JS event object; If you want to cancel navigation set synchronously 'evt.navigate' to false\n   * @param navigateFn When you need to control the time at which the button should trigger the route navigation then set 'evt.navigate' to false and call this function; Useful if you have async work to be done before the actual route navigation\n   */\n  onClick?: (evt: LooseDictionary, navigateFn: () => void) => void\n}\n\nexport interface VcBtnSlots {\n  /**\n   * Use for custom content, instead of relying on 'icon' and 'label' props\n   */\n  default: () => VNode[]\n  /**\n   * Override the default VcSpinner when in 'loading' state\n   */\n  loading: () => VNode[]\n}\n\nexport interface VcBtnRef extends ComponentPublicInstance<VcBtnProps> {\n  /**\n   * Emulate click on VcBtn\n   * @param evt JS event object\n   */\n  click: (evt?: LooseDictionary) => void\n}\n"],"names":["VcIcon","VcSpinner"],"mappings":"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"}