<template>
							 | 
						|
								  <view class="custom-tabbar" :class="{ 'tabbar-hidden': !showNavbar }">
							 | 
						|
								    <!-- 音频控制栏组件 -->
							 | 
						|
								    <AudioControls
							 | 
						|
								      :current-page="currentPage"
							 | 
						|
								      :course-id="courseId"
							 | 
						|
								      :voice-id="voiceId"
							 | 
						|
								      :book-pages="bookPages"
							 | 
						|
								      :is-text-page="isTextPage"
							 | 
						|
								      :should-load-audio="shouldLoadAudio"
							 | 
						|
								      :is-member="isMember"
							 | 
						|
								      :current-page-requires-member="currentPageRequiresMember"
							 | 
						|
								      :page-pay="pagePay"
							 | 
						|
								      :is-word-audio-playing="isWordAudioPlaying"
							 | 
						|
								      @previous-page="previousPage"
							 | 
						|
								      @next-page="nextPage"
							 | 
						|
								      @audio-state-change="onAudioStateChange"
							 | 
						|
								      @highlight-change="onHighlightChange"
							 | 
						|
								      @scroll-to-text="onScrollToText"
							 | 
						|
								      @voice-change-complete="onVoiceChangeComplete"
							 | 
						|
								      @voice-change-error="onVoiceChangeError"
							 | 
						|
								      @page-data-needed="onPageDataNeeded"
							 | 
						|
								      ref="audioControls"
							 | 
						|
								    />
							 | 
						|
								  
							 | 
						|
								    <view style="background-color: #fff;position: relative;z-index: 100">
							 | 
						|
								      <view class="tabbar-content">
							 | 
						|
								        <view class="tabbar-left">
							 | 
						|
								          <view class="tab-button" @click="toggleCoursePopup">
							 | 
						|
								            <image src="/static/course-icon.png" class="tab-icon" />
							 | 
						|
								            <text class="tab-text">课程</text>
							 | 
						|
								          </view>
							 | 
						|
								          <view class="tab-button" @click="toggleSound">
							 | 
						|
								            <image src="/static/voice-switch-icon.png" class="tab-icon" />
							 | 
						|
								            <text class="tab-text">音色切换</text>
							 | 
						|
								          </view>
							 | 
						|
								        </view>
							 | 
						|
								        
							 | 
						|
								        <view class="tabbar-right">
							 | 
						|
								          <view class="page-controls">
							 | 
						|
								            <view class="page-numbers">
							 | 
						|
								              <view 
							 | 
						|
								                v-for="(page, index) in bookPages" 
							 | 
						|
								                :key="index"
							 | 
						|
								                class="page-number"
							 | 
						|
								                :class="{ 'active': (index + 1) === currentPage }"
							 | 
						|
								                @click="goToPage(index + 1)"
							 | 
						|
								              >
							 | 
						|
								                {{ index + 1 }}
							 | 
						|
								              </view>
							 | 
						|
								            </view>
							 | 
						|
								          </view>
							 | 
						|
								        </view>
							 | 
						|
								      </view>
							 | 
						|
								      <uv-safe-bottom></uv-safe-bottom>
							 | 
						|
								    </view>
							 | 
						|
								  </view>
							 | 
						|
								</template>
							 | 
						|
								
							 | 
						|
								<script>
							 | 
						|
								import AudioControls from '../AudioControls.vue'
							 | 
						|
								
							 | 
						|
								export default {
							 | 
						|
								  name: 'CustomTabbar',
							 | 
						|
								  components: {
							 | 
						|
								    AudioControls
							 | 
						|
								  },
							 | 
						|
								  props: {
							 | 
						|
								    showNavbar: {
							 | 
						|
								      type: Boolean,
							 | 
						|
								      default: true
							 | 
						|
								    },
							 | 
						|
								    currentPage: {
							 | 
						|
								      type: Number,
							 | 
						|
								      default: 1
							 | 
						|
								    },
							 | 
						|
								    courseId: {
							 | 
						|
								      type: String,
							 | 
						|
								      default: ''
							 | 
						|
								    },
							 | 
						|
								    voiceId: {
							 | 
						|
								      type: Number,
							 | 
						|
								      default: null
							 | 
						|
								    },
							 | 
						|
								    bookPages: {
							 | 
						|
								      type: Array,
							 | 
						|
								      default: () => []
							 | 
						|
								    },
							 | 
						|
								    isTextPage: {
							 | 
						|
								      type: Boolean,
							 | 
						|
								      default: false
							 | 
						|
								    },
							 | 
						|
								    shouldLoadAudio: {
							 | 
						|
								      type: Boolean,
							 | 
						|
								      default: false
							 | 
						|
								    },
							 | 
						|
								    isMember: {
							 | 
						|
								      type: Boolean,
							 | 
						|
								      default: false
							 | 
						|
								    },
							 | 
						|
								    currentPageRequiresMember: {
							 | 
						|
								      type: Boolean,
							 | 
						|
								      default: false
							 | 
						|
								    },
							 | 
						|
								    pagePay: {
							 | 
						|
								      type: Array,
							 | 
						|
								      default: () => []
							 | 
						|
								    },
							 | 
						|
								    isWordAudioPlaying: {
							 | 
						|
								      type: Boolean,
							 | 
						|
								      default: false
							 | 
						|
								    }
							 | 
						|
								  },
							 | 
						|
								  methods: {
							 | 
						|
								    toggleCoursePopup() {
							 | 
						|
								      this.$emit('toggle-course-popup')
							 | 
						|
								    },
							 | 
						|
								    toggleSound() {
							 | 
						|
								      this.$emit('toggle-sound')
							 | 
						|
								    },
							 | 
						|
								    goToPage(pageNumber) {
							 | 
						|
								      this.$emit('go-to-page', pageNumber)
							 | 
						|
								    },
							 | 
						|
								    previousPage() {
							 | 
						|
								      this.$emit('previous-page')
							 | 
						|
								    },
							 | 
						|
								    nextPage() {
							 | 
						|
								      this.$emit('next-page')
							 | 
						|
								    },
							 | 
						|
								    onAudioStateChange(audioState) {
							 | 
						|
								      this.$emit('audio-state-change', audioState)
							 | 
						|
								    },
							 | 
						|
								    onHighlightChange(highlightData) {
							 | 
						|
								      this.$emit('highlight-change', highlightData)
							 | 
						|
								    },
							 | 
						|
								    onVoiceChangeComplete(data) {
							 | 
						|
								      this.$emit('voice-change-complete', data)
							 | 
						|
								    },
							 | 
						|
								    onVoiceChangeError(error) {
							 | 
						|
								      this.$emit('voice-change-error', error)
							 | 
						|
								    },
							 | 
						|
								    onPageDataNeeded(pageNumber) {
							 | 
						|
								      this.$emit('page-data-needed', pageNumber)
							 | 
						|
								    },
							 | 
						|
								    onScrollToText(scrollData) {
							 | 
						|
								      this.$emit('scroll-to-text', scrollData)
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								</script>
							 | 
						|
								
							 | 
						|
								<style lang="scss" scoped>
							 | 
						|
								.custom-tabbar {
							 | 
						|
								  position: fixed;
							 | 
						|
								  bottom: 0;
							 | 
						|
								  left: 0;
							 | 
						|
								  right: 0;
							 | 
						|
								  border-top: 1rpx solid #EEEEEE;
							 | 
						|
								  z-index: 1000;
							 | 
						|
								  transition: transform 0.3s ease;
							 | 
						|
								  
							 | 
						|
								  &.tabbar-hidden {
							 | 
						|
								    transform: translateY(100%);
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.tabbar-content {
							 | 
						|
								  display: flex;
							 | 
						|
								  align-items: center;
							 | 
						|
								  justify-content: space-between;
							 | 
						|
								  padding: 24rpx 62rpx;
							 | 
						|
								  height: 88rpx;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.tabbar-left {
							 | 
						|
								  display: flex;
							 | 
						|
								  align-items: center;
							 | 
						|
								  gap: 35rpx;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.tab-button {
							 | 
						|
								  display: flex;
							 | 
						|
								  align-items: center;
							 | 
						|
								  flex-direction: column;
							 | 
						|
								  gap: 8rpx;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.tab-icon {
							 | 
						|
								  width: 52rpx;
							 | 
						|
								  height: 52rpx;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.tab-text {
							 | 
						|
								  font-family: PingFang SC;
							 | 
						|
								  font-size: 22rpx;
							 | 
						|
								  color: #999;
							 | 
						|
								  line-height: 24rpx;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.tabbar-right {
							 | 
						|
								  flex: 1;
							 | 
						|
								  display: flex;
							 | 
						|
								  justify-content: flex-end;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.page-controls {
							 | 
						|
								  display: flex;
							 | 
						|
								  align-items: center;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.page-numbers {
							 | 
						|
								  display: flex;
							 | 
						|
								  align-items: center;
							 | 
						|
								  gap: 8rpx;
							 | 
						|
								  overflow-x: auto;
							 | 
						|
								  // max-width: 400rpx;
							 | 
						|
								  max-width: 50vw;
							 | 
						|
								  
							 | 
						|
								  &::-webkit-scrollbar {
							 | 
						|
								    display: none;
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								.page-number {
							 | 
						|
								  min-width: 84rpx;
							 | 
						|
								  height: 58rpx;
							 | 
						|
								  display: flex;
							 | 
						|
								  align-items: center;
							 | 
						|
								  justify-content: center;
							 | 
						|
								  border-radius: 100rpx;
							 | 
						|
								  font-family: PingFang SC;
							 | 
						|
								  font-size: 30rpx;
							 | 
						|
								  color: #3B3D3D;
							 | 
						|
								  background-color: transparent;
							 | 
						|
								  border: 1px solid #3B3D3D;
							 | 
						|
								  transition: all 0.3s ease;
							 | 
						|
								  
							 | 
						|
								  &.active {
							 | 
						|
								    border: 1px solid #06DADC;
							 | 
						|
								    color: #06DADC;
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								</style>
							 |