VFooter.mjs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { createVNode as _createVNode, resolveDirective as _resolveDirective } from "vue";
  2. // Styles
  3. import "./VFooter.css";
  4. // Composables
  5. import { makeBorderProps, useBorder } from "../../composables/border.mjs";
  6. import { useBackgroundColor } from "../../composables/color.mjs";
  7. import { makeComponentProps } from "../../composables/component.mjs";
  8. import { makeElevationProps, useElevation } from "../../composables/elevation.mjs";
  9. import { makeLayoutItemProps, useLayoutItem } from "../../composables/layout.mjs";
  10. import { useResizeObserver } from "../../composables/resizeObserver.mjs";
  11. import { makeRoundedProps, useRounded } from "../../composables/rounded.mjs";
  12. import { makeTagProps } from "../../composables/tag.mjs";
  13. import { makeThemeProps, provideTheme } from "../../composables/theme.mjs";
  14. import { useToggleScope } from "../../composables/toggleScope.mjs"; // Utilities
  15. import { computed, ref, shallowRef, toRef, watchEffect } from 'vue';
  16. import { convertToUnit, genericComponent, propsFactory, useRender } from "../../util/index.mjs";
  17. export const makeVFooterProps = propsFactory({
  18. app: Boolean,
  19. color: String,
  20. height: {
  21. type: [Number, String],
  22. default: 'auto'
  23. },
  24. ...makeBorderProps(),
  25. ...makeComponentProps(),
  26. ...makeElevationProps(),
  27. ...makeLayoutItemProps(),
  28. ...makeRoundedProps(),
  29. ...makeTagProps({
  30. tag: 'footer'
  31. }),
  32. ...makeThemeProps()
  33. }, 'VFooter');
  34. export const VFooter = genericComponent()({
  35. name: 'VFooter',
  36. props: makeVFooterProps(),
  37. setup(props, _ref) {
  38. let {
  39. slots
  40. } = _ref;
  41. const layoutItemStyles = ref();
  42. const {
  43. themeClasses
  44. } = provideTheme(props);
  45. const {
  46. backgroundColorClasses,
  47. backgroundColorStyles
  48. } = useBackgroundColor(toRef(props, 'color'));
  49. const {
  50. borderClasses
  51. } = useBorder(props);
  52. const {
  53. elevationClasses
  54. } = useElevation(props);
  55. const {
  56. roundedClasses
  57. } = useRounded(props);
  58. const autoHeight = shallowRef(32);
  59. const {
  60. resizeRef
  61. } = useResizeObserver(entries => {
  62. if (!entries.length) return;
  63. autoHeight.value = entries[0].target.clientHeight;
  64. });
  65. const height = computed(() => props.height === 'auto' ? autoHeight.value : parseInt(props.height, 10));
  66. useToggleScope(() => props.app, () => {
  67. const layout = useLayoutItem({
  68. id: props.name,
  69. order: computed(() => parseInt(props.order, 10)),
  70. position: computed(() => 'bottom'),
  71. layoutSize: height,
  72. elementSize: computed(() => props.height === 'auto' ? undefined : height.value),
  73. active: computed(() => props.app),
  74. absolute: toRef(props, 'absolute')
  75. });
  76. watchEffect(() => {
  77. layoutItemStyles.value = layout.layoutItemStyles.value;
  78. });
  79. });
  80. useRender(() => _createVNode(props.tag, {
  81. "ref": resizeRef,
  82. "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class],
  83. "style": [backgroundColorStyles.value, props.app ? layoutItemStyles.value : {
  84. height: convertToUnit(props.height)
  85. }, props.style]
  86. }, slots));
  87. return {};
  88. }
  89. });
  90. //# sourceMappingURL=VFooter.mjs.map