component.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <script setup lang="ts">
  2. import { computed, ref } from 'vue'
  3. type SampleFile = {
  4. name: string
  5. type: string
  6. size: number
  7. }
  8. const files = ref<SampleFile[]>([
  9. { name: 'contract.pdf', type: 'pdf', size: 184320 },
  10. { name: 'invoice.ofd', type: 'ofd', size: 98304 },
  11. { name: 'drawing.dxf', type: 'dxf', size: 42752 }
  12. ])
  13. const selected = ref(files.value[0])
  14. const title = computed(() => {
  15. return `${selected.value.name} / ${selected.value.type.toUpperCase()}`
  16. })
  17. function selectFile(file: SampleFile) {
  18. selected.value = file
  19. }
  20. </script>
  21. <template>
  22. <section class="sample">
  23. <header>
  24. <span>Flyfish Viewer</span>
  25. <strong>{{ title }}</strong>
  26. </header>
  27. <button
  28. v-for="file in files"
  29. :key="file.name"
  30. type="button"
  31. :class="{ active: file.name === selected.name }"
  32. @click="selectFile(file)"
  33. >
  34. <span>{{ file.type }}</span>
  35. <strong>{{ file.name }}</strong>
  36. <em>{{ Math.round(file.size / 1024) }} KB</em>
  37. </button>
  38. </section>
  39. </template>
  40. <style scoped>
  41. .sample {
  42. display: grid;
  43. gap: 10px;
  44. padding: 16px;
  45. color: #21a366;
  46. }
  47. .sample button {
  48. display: grid;
  49. grid-template-columns: 42px minmax(0, 1fr) auto;
  50. gap: 8px;
  51. border: 1px solid #d8e3dc;
  52. border-radius: 8px;
  53. background: #fff;
  54. }
  55. .sample button.active {
  56. border-color: currentColor;
  57. }
  58. </style>