vuetify
Version:
Vue Material Component Framework
111 lines (110 loc) • 3.96 kB
JavaScript
import { vShow as _vShow, mergeProps as _mergeProps, createVNode as _createVNode, withDirectives as _withDirectives, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from "vue";
// Styles
import "./VFab.css";
// Components
import { makeVBtnProps, VBtn } from "../VBtn/VBtn.js"; // Composables
import { makeLayoutItemProps, useLayoutItem } from "../../composables/layout.js";
import { makeLocationProps } from "../../composables/location.js";
import { useProxiedModel } from "../../composables/proxiedModel.js";
import { useResizeObserver } from "../../composables/resizeObserver.js";
import { useToggleScope } from "../../composables/toggleScope.js";
import { makeTransitionProps, MaybeTransition } from "../../composables/transition.js"; // Utilities
import { computed, ref, shallowRef, toRef, watchEffect } from 'vue';
import { genericComponent, omit, propsFactory, useRender } from "../../util/index.js"; // Types
export const makeVFabProps = propsFactory({
app: Boolean,
appear: Boolean,
extended: Boolean,
layout: Boolean,
offset: Boolean,
modelValue: {
type: Boolean,
default: true
},
...omit(makeVBtnProps({
active: true
}), ['location']),
...makeLayoutItemProps(),
...makeLocationProps(),
...makeTransitionProps({
transition: 'fab-transition'
})
}, 'VFab');
export const VFab = genericComponent()({
name: 'VFab',
props: makeVFabProps(),
emits: {
'update:modelValue': value => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const model = useProxiedModel(props, 'modelValue');
const height = shallowRef(56);
const layoutItemStyles = ref();
const {
resizeRef
} = useResizeObserver(entries => {
if (!entries.length) return;
height.value = entries[0].target.clientHeight;
});
const hasPosition = toRef(() => props.app || props.absolute);
const position = computed(() => {
if (!hasPosition.value) return false;
return props.location?.split(' ').shift() ?? 'bottom';
});
const orientation = computed(() => {
if (!hasPosition.value) return false;
return props.location?.split(' ')[1] ?? 'end';
});
useToggleScope(() => props.app, () => {
const layout = useLayoutItem({
id: props.name,
order: computed(() => parseInt(props.order, 10)),
position,
layoutSize: computed(() => props.layout ? height.value + 24 : 0),
elementSize: computed(() => height.value + 24),
active: computed(() => props.app && model.value),
absolute: toRef(() => props.absolute)
});
watchEffect(() => {
layoutItemStyles.value = layout.layoutItemStyles.value;
});
});
const vFabRef = ref();
useRender(() => {
const btnProps = VBtn.filterProps(props);
return _createElementVNode("div", {
"ref": vFabRef,
"class": _normalizeClass(['v-fab', {
'v-fab--absolute': props.absolute,
'v-fab--app': !!props.app,
'v-fab--extended': props.extended,
'v-fab--offset': props.offset,
[`v-fab--${position.value}`]: hasPosition.value,
[`v-fab--${orientation.value}`]: hasPosition.value
}, props.class]),
"style": _normalizeStyle([props.app ? {
...layoutItemStyles.value
} : {
height: props.absolute ? '100%' : 'inherit'
}, props.style])
}, [_createElementVNode("div", {
"class": "v-fab__container"
}, [_createVNode(MaybeTransition, {
"appear": props.appear,
"transition": props.transition
}, {
default: () => [_withDirectives(_createVNode(VBtn, _mergeProps({
"ref": resizeRef
}, btnProps, {
"active": undefined,
"location": undefined
}), slots), [[_vShow, props.active]])]
})])]);
});
return {};
}
});
//# sourceMappingURL=VFab.js.map