createTransition.mjs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Utilities
  2. import { h, Transition, TransitionGroup } from 'vue';
  3. import { genericComponent, propsFactory } from "../../util/index.mjs"; // Types
  4. export const makeTransitionProps = propsFactory({
  5. disabled: Boolean,
  6. group: Boolean,
  7. hideOnLeave: Boolean,
  8. leaveAbsolute: Boolean,
  9. mode: String,
  10. origin: String
  11. }, 'transition');
  12. export function createCssTransition(name, origin, mode) {
  13. return genericComponent()({
  14. name,
  15. props: makeTransitionProps({
  16. mode,
  17. origin
  18. }),
  19. setup(props, _ref) {
  20. let {
  21. slots
  22. } = _ref;
  23. const functions = {
  24. onBeforeEnter(el) {
  25. if (props.origin) {
  26. el.style.transformOrigin = props.origin;
  27. }
  28. },
  29. onLeave(el) {
  30. if (props.leaveAbsolute) {
  31. const {
  32. offsetTop,
  33. offsetLeft,
  34. offsetWidth,
  35. offsetHeight
  36. } = el;
  37. el._transitionInitialStyles = {
  38. position: el.style.position,
  39. top: el.style.top,
  40. left: el.style.left,
  41. width: el.style.width,
  42. height: el.style.height
  43. };
  44. el.style.position = 'absolute';
  45. el.style.top = `${offsetTop}px`;
  46. el.style.left = `${offsetLeft}px`;
  47. el.style.width = `${offsetWidth}px`;
  48. el.style.height = `${offsetHeight}px`;
  49. }
  50. if (props.hideOnLeave) {
  51. el.style.setProperty('display', 'none', 'important');
  52. }
  53. },
  54. onAfterLeave(el) {
  55. if (props.leaveAbsolute && el?._transitionInitialStyles) {
  56. const {
  57. position,
  58. top,
  59. left,
  60. width,
  61. height
  62. } = el._transitionInitialStyles;
  63. delete el._transitionInitialStyles;
  64. el.style.position = position || '';
  65. el.style.top = top || '';
  66. el.style.left = left || '';
  67. el.style.width = width || '';
  68. el.style.height = height || '';
  69. }
  70. }
  71. };
  72. return () => {
  73. const tag = props.group ? TransitionGroup : Transition;
  74. return h(tag, {
  75. name: props.disabled ? '' : name,
  76. css: !props.disabled,
  77. ...(props.group ? undefined : {
  78. mode: props.mode
  79. }),
  80. ...(props.disabled ? {} : functions)
  81. }, slots.default);
  82. };
  83. }
  84. });
  85. }
  86. export function createJavascriptTransition(name, functions) {
  87. let mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'in-out';
  88. return genericComponent()({
  89. name,
  90. props: {
  91. mode: {
  92. type: String,
  93. default: mode
  94. },
  95. disabled: Boolean,
  96. group: Boolean
  97. },
  98. setup(props, _ref2) {
  99. let {
  100. slots
  101. } = _ref2;
  102. const tag = props.group ? TransitionGroup : Transition;
  103. return () => {
  104. return h(tag, {
  105. name: props.disabled ? '' : name,
  106. css: !props.disabled,
  107. // mode: props.mode, // TODO: vuejs/vue-next#3104
  108. ...(props.disabled ? {} : functions)
  109. }, slots.default);
  110. };
  111. }
  112. });
  113. }
  114. //# sourceMappingURL=createTransition.mjs.map