app-safe-header.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <template>
  2. <view class="app-safe-header" :style="headerStyle">
  3. <view class="app-safe-header__safe" />
  4. <view class="app-safe-header__nav">
  5. <view class="app-safe-header__left">
  6. <slot name="left" />
  7. </view>
  8. <view class="app-safe-header__title-wrap">
  9. <slot>
  10. <text class="app-safe-header__title">{{ title }}</text>
  11. </slot>
  12. </view>
  13. <view class="app-safe-header__right" />
  14. </view>
  15. </view>
  16. </template>
  17. <script setup>
  18. import { computed } from 'vue'
  19. import { getGlobalSafeArea } from '@/utils/safeArea'
  20. const props = defineProps({
  21. title: {
  22. type: String,
  23. default: '',
  24. },
  25. background: {
  26. type: String,
  27. default: 'transparent',
  28. },
  29. })
  30. const safeArea = getGlobalSafeArea()
  31. const headerStyle = computed(() => ({
  32. '--sq-safe-top': `${safeArea.topSafeHeight}px`,
  33. '--sq-nav-height': `${safeArea.navContentHeight}px`,
  34. '--sq-capsule-right-safe': `${safeArea.capsuleRightSafeWidth}px`,
  35. '--sq-header-background': props.background,
  36. }))
  37. </script>
  38. <style scoped lang="scss">
  39. .app-safe-header {
  40. background: var(--sq-header-background);
  41. }
  42. .app-safe-header__safe {
  43. height: var(--sq-safe-top, 20px);
  44. }
  45. .app-safe-header__nav {
  46. height: var(--sq-nav-height, 44px);
  47. display: grid;
  48. grid-template-columns: auto minmax(0, 1fr) var(--sq-capsule-right-safe, 96px);
  49. align-items: center;
  50. box-sizing: border-box;
  51. }
  52. .app-safe-header__left {
  53. min-width: 0;
  54. }
  55. .app-safe-header__title-wrap {
  56. min-width: 0;
  57. }
  58. .app-safe-header__title {
  59. display: block;
  60. overflow: hidden;
  61. text-overflow: ellipsis;
  62. white-space: nowrap;
  63. }
  64. </style>