layout-content.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <script setup lang="ts">
  2. import type { CSSProperties } from 'vue';
  3. import type { ContentCompactType } from '@vben-core/typings';
  4. import { computed } from 'vue';
  5. import { useLayoutContentStyle } from '@vben-core/composables';
  6. import { Slot } from '@vben-core/shadcn-ui';
  7. interface Props {
  8. /**
  9. * 内容区域定宽
  10. */
  11. contentCompact: ContentCompactType;
  12. /**
  13. * 定宽布局宽度
  14. */
  15. contentCompactWidth: number;
  16. padding: number;
  17. paddingBottom: number;
  18. paddingLeft: number;
  19. paddingRight: number;
  20. paddingTop: number;
  21. }
  22. const props = withDefaults(defineProps<Props>(), {});
  23. // @ts-expect-error - unused
  24. const { contentElement, overlayStyle } = useLayoutContentStyle();
  25. const style = computed((): CSSProperties => {
  26. const {
  27. contentCompact,
  28. padding,
  29. paddingBottom,
  30. paddingLeft,
  31. paddingRight,
  32. paddingTop,
  33. } = props;
  34. const compactStyle: CSSProperties =
  35. contentCompact === 'compact'
  36. ? { margin: '0 auto', width: `${props.contentCompactWidth}px` }
  37. : {};
  38. return {
  39. ...compactStyle,
  40. flex: 1,
  41. padding: `${padding}px`,
  42. paddingBottom: `${paddingBottom}px`,
  43. paddingLeft: `${paddingLeft}px`,
  44. paddingRight: `${paddingRight}px`,
  45. paddingTop: `${paddingTop}px`,
  46. };
  47. });
  48. </script>
  49. <template>
  50. <main ref="contentElement" :style="style" class="relative bg-background-deep">
  51. <Slot :style="overlayStyle">
  52. <slot name="overlay"></slot>
  53. </Slot>
  54. <slot></slot>
  55. </main>
  56. </template>