{"version":3,"file":"fab-action.mjs","sources":["../../../../../../packages/components/ui/fab/fab-action.ts"],"sourcesContent":["/*\n * @Author: zouyaoji@https://github.com/zouyaoji\n * @Date: 2021-09-16 09:28:13\n * @LastEditTime: 2022-03-05 22:43:51\n * @LastEditors: zouyaoji\n * @Description:\n * @FilePath: \\vue-cesium@next\\packages\\components\\ui\\fab\\fab-action.ts\n */\nimport { h, defineComponent, computed, inject, getCurrentInstance, ComponentPublicInstance } from 'vue'\nimport type { VNode, ExtractPropTypes } from 'vue'\nimport { fabKey } from '@vue-cesium/utils/config'\nimport { hMergeSlot } from '@vue-cesium/utils/private/render'\n\nimport VcBtn from '../btn'\nimport VcIcon from '../icon'\nimport useFab from './use-fab'\nimport defaultPropsAction, { anchorMap } from './defaultPropsAction'\nimport { LooseDictionary } from '@vue-cesium/utils/types'\n\ninterface FabData {\n  showing?: {\n    value: boolean\n  }\n  onChildClick?(...args: any[]): any\n}\n\nexport const fabActionProps = defaultPropsAction\nexport default defineComponent({\n  name: 'VcFabAction',\n\n  props: fabActionProps,\n\n  emits: ['click'],\n\n  setup(props, { slots, emit }) {\n    const $fab = inject<FabData>(fabKey)\n\n    const { formClass, labelProps } = useFab(props, $fab?.showing)\n\n    const classes = computed(() => {\n      let align = undefined\n      if (props.anchor) {\n        align = anchorMap[props.anchor]\n      }\n      return formClass.value + (align !== void 0 ? ` ${align}` : '')\n    })\n\n    const isDisabled = computed(() => props.disable === true || $fab?.showing?.value !== true)\n\n    function click(e) {\n      $fab?.onChildClick?.(e)\n      emit('click', e)\n    }\n\n    function getContent() {\n      const child: Array<VNode> = []\n\n      props.icon !== '' && child.push(h(VcIcon, { name: props.icon }))\n\n      props.label !== '' && child[labelProps.value.action](h('div', labelProps.value.data, [props.label]))\n\n      return hMergeSlot(slots.default, child)\n    }\n\n    // expose public methods\n    const vm = getCurrentInstance()\n    Object.assign(vm?.proxy, { click })\n\n    return () =>\n      h(\n        VcBtn,\n        {\n          class: classes.value,\n          ...props,\n          noWrap: true,\n          stack: props.stacked,\n          icon: void 0,\n          label: void 0,\n          noCaps: true,\n          fabMini: true,\n          disable: isDisabled.value,\n          size: props.size,\n          onClick: click\n        },\n        getContent\n      )\n  }\n})\n\n// export type VcFabActionProps = ExtractPropTypes<typeof fabActionProps>\n\nexport interface VcFabActionProps {\n  /**\n   * Define the button HTML DOM type.\n   * Default value: a\n   */\n  type?: 'a' | 'submit' | 'button' | 'reset' | undefined\n  /**\n   * Use 'outline' design for Fab button.\n   */\n  outline?: boolean | undefined\n  /**\n   * Use 'push' design for Fab button.\n   */\n  push?: boolean | undefined\n  /**\n   * Use 'flat' design for Fab button.\n   */\n  flat?: boolean | undefined\n  /**\n   * Remove shadow\n   */\n  unelevated?: 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   * Apply the glossy effect over the button.\n   */\n  glossy?: boolean | undefined\n  /**\n   * Display label besides the FABs, as external content.\n   */\n  externalLabel?: boolean | undefined\n  /**\n   * The label that will be shown when Fab is extended.\n   */\n  label?: string | number | undefined\n  /**\n   * Position of the label around the icon.\n   */\n  labelPosition?: 'top' | 'right' | 'bottom' | 'left' | undefined\n  /**\n   * Hide the label; Useful for animation purposes where you toggle the visibility of the label.\n   */\n  hideLabel?: boolean | undefined\n  /**\n   * Class definitions to be attributed to the label container.\n   */\n  labelClass?: any[] | string | any | undefined\n  /**\n   * Style definitions to be attributed to the label container.\n   */\n  labelStyle?: any[] | string | any | undefined\n  /**\n   * Apply a rectangle aspect to the FAB.\n   */\n  square?: boolean | undefined\n  /**\n   * Put component in disabled mode.\n   */\n  disable?: boolean | undefined\n  /**\n   * Tabindex HTML attribute value.\n   */\n  tabindex?: number | 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  icon?: string | undefined\n  /**\n   * How to align the Fab Action relative to Fab expand side; By default it uses the align specified in QFab.\n   */\n  anchor?: 'start' | 'center' | 'end' | undefined\n  /**\n   * Equivalent to Vue Router <router-link> 'to' property.\n   */\n  to?: string | any | undefined\n  /**\n   * Equivalent to Vue Router <router-link> 'replace' property.\n   */\n  replace?: boolean | undefined\n  /**\n   * Emitted when user clicks/taps on the component.\n   * @param evt JS event object\n   */\n  onClick?: (evt: any) => void\n}\n\nexport interface VcFabActionSlots {\n  /**\n   * Suggestion for this slot: VcTooltip\n   */\n  default: () => VNode[]\n  /**\n   * Slot for icon; Suggestion: VcIcon\n   */\n  icon: () => VNode[]\n  /**\n   * Slot for label\n   */\n  label: () => VNode[]\n}\n\nexport interface VcFabActionRef extends ComponentPublicInstance<VcFabActionProps> {\n  /**\n   * Emulate click on VcFabAction\n   * @param evt JS event object\n   */\n  click: (evt?: LooseDictionary) => void\n}\n"],"names":["defaultPropsAction","VcIcon","VcBtn"],"mappings":"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"}