Vibration.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. <script setup lang="ts">
  2. /**
  3. * 振动融合分析(vibration)——对应重构前 `app.js` 的 `vibration()`。
  4. *
  5. * 该页签内部有 **5 个子视图**(旧 `FUS.sub`):matrix(判级矩阵,默认)/ loop / units / events / cms。
  6. * 本版只迁 **matrix**,其余如实标"迁移中";5 个子视图全过对拍后才列入 DONE。
  7. */
  8. import { computed } from 'vue'
  9. import { t } from '../i18n/zh'
  10. import { FUS_SUBS, cmsHtml, eventsHtml, loopHtml, matrixHtml, unitsHtml } from '../lib/vib'
  11. const props = defineProps<{ d: any; sub?: string | null; cms?: any }>()
  12. const emit = defineEmits<{ (e: 'sub', id: string): void }>()
  13. const sub = computed(() => props.sub || 'matrix')
  14. const F = computed<any>(() => props.d?.fus)
  15. const bodyHtml = computed(() => {
  16. const f = F.value
  17. if (!f || f.err) return `<section><div class="panel"><p>${t('fus.unavailable', { e: String((f && f.err) || '') })}</p></div></section>`
  18. if (sub.value === 'matrix') return matrixHtml(f)
  19. if (sub.value === 'loop') return loopHtml(f)
  20. if (sub.value === 'units') return unitsHtml(f, null)
  21. if (sub.value === 'events') return eventsHtml(f, props.d)
  22. if (sub.value === 'cms') return cmsHtml(props.cms ?? null)
  23. return `<div class="panel mb"><p class="small muted">子视图「${t('fus.sub.' + sub.value)}」尚未迁移到 Vue(迁移中)。</p></div>`
  24. })
  25. </script>
  26. <template>
  27. <section>
  28. <div class="eyebrow">{{ t('fus.eyebrow') }}</div>
  29. <div style="display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap">
  30. <button v-for="s in FUS_SUBS" :key="s" class="pill" :class="{ on: s === sub }" :data-fsub="s"
  31. @click="emit('sub', s)">{{ t('fus.sub.' + s) }}</button>
  32. </div>
  33. <div v-html="bodyHtml"></div>
  34. </section>
  35. </template>