CrawlerPlatformStrip.vue 1.78 KB
<script setup lang="ts">
import type { CrawlerPlatformState } from '@/types'
import { statusTone } from '@/utils/format'

defineProps<{
  platforms: CrawlerPlatformState[]
  selectedPlatform: string
}>()

defineEmits<{
  select: [platform: string]
}>()
</script>

<template>
  <div class="platform-strip">
    <button
      v-for="platform in platforms"
      :key="platform.platform"
      class="platform-tab"
      :class="{ 'platform-tab--active': selectedPlatform === platform.platform }"
      type="button"
      @click="$emit('select', platform.platform)"
    >
      <strong>{{ platform.label }}</strong>
      <small>{{ platform.logged_in ? 'Logged In' : 'Awaiting Login' }}</small>
      <span :data-tone="statusTone(platform.status)">
        {{ platform.message || platform.status }}
      </span>
    </button>
  </div>
</template>

<style scoped>
.platform-strip {
  display: flex;
  gap: 10px;
  overflow-x: auto;
  padding-bottom: 2px;
}

.platform-tab {
  min-width: 188px;
  display: grid;
  gap: 6px;
  padding: 14px 16px;
  border: 1px solid rgba(24, 35, 31, 0.08);
  border-radius: 20px;
  background: rgba(255, 255, 255, 0.72);
  text-align: left;
  cursor: pointer;
}

.platform-tab--active {
  border-color: rgba(141, 103, 56, 0.24);
  background: linear-gradient(135deg, rgba(255, 255, 255, 0.94), rgba(248, 241, 232, 0.92));
}

.platform-tab strong {
  color: var(--primary);
}

.platform-tab small,
.platform-tab span {
  color: var(--text-soft);
}

.platform-tab small {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.platform-tab span[data-tone='success'] {
  color: var(--success);
}

.platform-tab span[data-tone='running'] {
  color: var(--warning);
}

.platform-tab span[data-tone='danger'] {
  color: var(--danger);
}
</style>