VWindowItem.mjs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { withDirectives as _withDirectives, createVNode as _createVNode, vShow as _vShow } from "vue";
  2. // Composables
  3. import { makeComponentProps } from "../../composables/component.mjs";
  4. import { makeGroupItemProps, useGroupItem } from "../../composables/group.mjs";
  5. import { makeLazyProps, useLazy } from "../../composables/lazy.mjs";
  6. import { useSsrBoot } from "../../composables/ssrBoot.mjs";
  7. import { MaybeTransition } from "../../composables/transition.mjs"; // Directives
  8. import Touch from "../../directives/touch/index.mjs"; // Utilities
  9. import { computed, inject, nextTick, shallowRef } from 'vue';
  10. import { convertToUnit, genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
  11. import { VWindowGroupSymbol, VWindowSymbol } from "./VWindow.mjs";
  12. export const makeVWindowItemProps = propsFactory({
  13. reverseTransition: {
  14. type: [Boolean, String],
  15. default: undefined
  16. },
  17. transition: {
  18. type: [Boolean, String],
  19. default: undefined
  20. },
  21. ...makeComponentProps(),
  22. ...makeGroupItemProps(),
  23. ...makeLazyProps()
  24. }, 'VWindowItem');
  25. export const VWindowItem = genericComponent()({
  26. name: 'VWindowItem',
  27. directives: {
  28. Touch
  29. },
  30. props: makeVWindowItemProps(),
  31. emits: {
  32. 'group:selected': val => true
  33. },
  34. setup(props, _ref) {
  35. let {
  36. slots
  37. } = _ref;
  38. const window = inject(VWindowSymbol);
  39. const groupItem = useGroupItem(props, VWindowGroupSymbol);
  40. const {
  41. isBooted
  42. } = useSsrBoot();
  43. if (!window || !groupItem) throw new Error('[Vuetify] VWindowItem must be used inside VWindow');
  44. const isTransitioning = shallowRef(false);
  45. const hasTransition = computed(() => isBooted.value && (window.isReversed.value ? props.reverseTransition !== false : props.transition !== false));
  46. function onAfterTransition() {
  47. if (!isTransitioning.value || !window) {
  48. return;
  49. }
  50. // Finalize transition state.
  51. isTransitioning.value = false;
  52. if (window.transitionCount.value > 0) {
  53. window.transitionCount.value -= 1;
  54. // Remove container height if we are out of transition.
  55. if (window.transitionCount.value === 0) {
  56. window.transitionHeight.value = undefined;
  57. }
  58. }
  59. }
  60. function onBeforeTransition() {
  61. if (isTransitioning.value || !window) {
  62. return;
  63. }
  64. // Initialize transition state here.
  65. isTransitioning.value = true;
  66. if (window.transitionCount.value === 0) {
  67. // Set initial height for height transition.
  68. window.transitionHeight.value = convertToUnit(window.rootRef.value?.clientHeight);
  69. }
  70. window.transitionCount.value += 1;
  71. }
  72. function onTransitionCancelled() {
  73. onAfterTransition(); // This should have the same path as normal transition end.
  74. }
  75. function onEnterTransition(el) {
  76. if (!isTransitioning.value) {
  77. return;
  78. }
  79. nextTick(() => {
  80. // Do not set height if no transition or cancelled.
  81. if (!hasTransition.value || !isTransitioning.value || !window) {
  82. return;
  83. }
  84. // Set transition target height.
  85. window.transitionHeight.value = convertToUnit(el.clientHeight);
  86. });
  87. }
  88. const transition = computed(() => {
  89. const name = window.isReversed.value ? props.reverseTransition : props.transition;
  90. return !hasTransition.value ? false : {
  91. name: typeof name !== 'string' ? window.transition.value : name,
  92. onBeforeEnter: onBeforeTransition,
  93. onAfterEnter: onAfterTransition,
  94. onEnterCancelled: onTransitionCancelled,
  95. onBeforeLeave: onBeforeTransition,
  96. onAfterLeave: onAfterTransition,
  97. onLeaveCancelled: onTransitionCancelled,
  98. onEnter: onEnterTransition
  99. };
  100. });
  101. const {
  102. hasContent
  103. } = useLazy(props, groupItem.isSelected);
  104. useRender(() => _createVNode(MaybeTransition, {
  105. "transition": transition.value,
  106. "disabled": !isBooted.value
  107. }, {
  108. default: () => [_withDirectives(_createVNode("div", {
  109. "class": ['v-window-item', groupItem.selectedClass.value, props.class],
  110. "style": props.style
  111. }, [hasContent.value && slots.default?.()]), [[_vShow, groupItem.isSelected.value]])]
  112. }));
  113. return {
  114. groupItem
  115. };
  116. }
  117. });
  118. //# sourceMappingURL=VWindowItem.mjs.map