Files
website/website/resources/ts/Pages/Marketing/DedicatedServers.vue
Claude Dev 66bb180f8f Migrate marketing pages to new design system heroes and components (#5)
- Replace gradient hero sections with HeroSection + animated SVG components
  (NetworkHero, VpsHero, DedicatedHero, WebHostingHero, GameServerHero)
- Add ScrollReveal wrappers for scroll animations on Home.vue sections
- Replace AppTextField/AppSelect/AppTextarea with VTextField/VSelect/VTextarea in Contact.vue
- Merge BattlefieldAcp content into GameServers.vue as a featured section
- Delete redundant Products.vue and BattlefieldAcp.vue pages
- Add 301 redirects in routes for /products -> / and /battlefield-acp -> /game-servers

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:06:51 -04:00

249 lines
9.8 KiB
Vue

<script lang="ts" setup>
import { usePage } from '@inertiajs/vue3'
import { computed } from 'vue'
import MarketingLayout from '@/Layouts/MarketingLayout.vue'
import SectionHeader from '@/Components/Marketing/SectionHeader.vue'
import HeroSection from '@/Components/Marketing/HeroSection.vue'
import DedicatedHero from '@/Components/Marketing/DedicatedHero.vue'
import ScrollReveal from '@/Components/Marketing/ScrollReveal.vue'
defineOptions({ layout: MarketingLayout })
interface Plan {
id: number
name: string
slug: string
price: string
features: Record<string, string | number> | null
stock_quantity: number | null
}
interface PageProps {
plans: Plan[]
domains: { marketing: string; account: string; admin: string }
}
const page = usePage()
const props = computed(() => page.props as unknown as PageProps)
const accountUrl = computed(() => `https://${props.value.domains?.account}`)
const plans = computed(() => props.value.plans || [])
const features = [
{ icon: 'tabler-cpu', title: 'Dedicated Hardware', description: 'No shared resources — all CPU, RAM, and storage are exclusively yours.' },
{ icon: 'tabler-dashboard', title: 'SynergyCP Access', description: 'Full server management with SynergyCP panel including IPMI, rDNS, and OS reload.' },
{ icon: 'tabler-network', title: '1Gbps Network', description: '1 Gbps port with 10 TB bandwidth included on every server.' },
{ icon: 'tabler-lock', title: 'RAID Support', description: 'Enterprise RAID controllers available for data redundancy and performance.' },
{ icon: 'tabler-clock', title: 'Same-Day Setup', description: 'Most in-stock servers deployed same-day, subject to availability.' },
{ icon: 'tabler-headset', title: '24/7 Support', description: 'Expert engineers available around the clock for hardware and network issues.' },
]
const included = [
{ icon: 'tabler-world', label: '10 TB Bandwidth' },
{ icon: 'tabler-network', label: '1 Gbps Port' },
{ icon: 'tabler-map-pin', label: 'Atlanta, GA Datacenter' },
{ icon: 'tabler-address-book', label: '1 IPv4 Address' },
{ icon: 'tabler-hexagons', label: '1x /64 IPv6 Subnet' },
{ icon: 'tabler-dashboard', label: 'SynergyCP Panel' },
]
function isInStock(plan: Plan): boolean {
return plan.stock_quantity === null || plan.stock_quantity > 0
}
function getFeature(plan: Plan, key: string): string {
return String(plan.features?.[key] ?? '-')
}
function formatPrice(plan: Plan): string {
const price = parseFloat(plan.price) || 0
return price % 1 === 0 ? `$${price}` : `$${price.toFixed(2)}`
}
</script>
<template>
<div>
<!-- Hero -->
<HeroSection>
<template #content>
<VChip color="success" variant="tonal" class="mb-4">Dedicated Servers</VChip>
<h1 class="text-h2 font-weight-bold mb-3">
Bare Metal <span class="hero-gradient-text">Power</span>
</h1>
<p class="text-h6 text-medium-emphasis font-weight-regular mb-8" style="max-width: 600px;">
Enterprise-grade Dell PowerEdge servers with full root access, SynergyCP management, and same-day deployment from our Atlanta datacenter.
</p>
<a :href="plans.length ? accountUrl + '/checkout/' + plans[0].id : '/pricing'" class="text-decoration-none">
<VBtn color="success" size="x-large" rounded="lg">
Configure Server
<VIcon icon="tabler-arrow-right" end />
</VBtn>
</a>
</template>
<template #visual>
<DedicatedHero />
</template>
</HeroSection>
<!-- Features -->
<VContainer class="marketing-section">
<SectionHeader
label="Features"
label-color="success"
title="Enterprise Hardware"
highlight-word="Hardware"
subtitle="Every dedicated server comes with these features included."
/>
<VRow>
<VCol v-for="(feature, index) in features" :key="feature.title" cols="12" sm="6" md="4">
<div :class="['d-flex ga-3 mb-4 feature-card-hover pa-3 rounded-lg', `fade-in-up stagger-delay-${index + 1}`]">
<VAvatar color="success" variant="tonal" size="44">
<VIcon :icon="feature.icon" size="22" />
</VAvatar>
<div>
<h3 class="text-subtitle-1 font-weight-bold">{{ feature.title }}</h3>
<p class="text-body-2 text-medium-emphasis mb-0">{{ feature.description }}</p>
</div>
</div>
</VCol>
</VRow>
</VContainer>
<!-- Server Configurations -->
<div class="section-alt-bg marketing-section">
<VContainer>
<SectionHeader
label="Servers"
label-color="success"
title="Server Configurations"
highlight-word="Configurations"
subtitle="Real Dell PowerEdge servers. Storage sold separately -- configure your drives at checkout."
/>
<VRow>
<VCol v-for="(plan, index) in plans" :key="plan.id" cols="12" sm="6" lg="3">
<VCard
variant="outlined"
:class="['h-100 feature-card-hover', `fade-in-up stagger-delay-${Math.min(index + 1, 8)}`, { 'server-card-unavailable': !isInStock(plan) }]"
>
<VCardText class="pa-5">
<!-- Header with model and stock status -->
<div class="d-flex align-center justify-space-between mb-1">
<h3 class="text-subtitle-1 font-weight-bold">{{ plan.name }}</h3>
<VChip
:color="isInStock(plan) ? 'success' : 'error'"
size="small"
variant="tonal"
>
{{ isInStock(plan) ? 'In Stock' : 'Sold Out' }}
</VChip>
</div>
<p class="text-caption text-medium-emphasis mb-3">{{ getFeature(plan, 'storage_bays') }}</p>
<!-- Price -->
<div class="mb-4">
<span class="text-h4 font-weight-bold" :class="isInStock(plan) ? 'text-success' : 'text-medium-emphasis'">{{ formatPrice(plan) }}</span>
<span class="text-body-2 text-medium-emphasis">/mo</span>
</div>
<VDivider class="mb-4" />
<!-- Specs -->
<div class="mb-4">
<div class="d-flex align-center ga-2 py-1">
<VIcon icon="tabler-cpu" size="16" color="medium-emphasis" />
<span class="text-body-2">{{ getFeature(plan, 'cpu') }}</span>
</div>
<div class="d-flex align-center ga-2 py-1">
<VIcon icon="tabler-topology-star-3" size="16" color="medium-emphasis" />
<span class="text-body-2">{{ getFeature(plan, 'cores') }}</span>
</div>
<div class="d-flex align-center ga-2 py-1">
<VIcon icon="tabler-database" size="16" color="medium-emphasis" />
<span class="text-body-2">{{ getFeature(plan, 'ram') }} RAM</span>
</div>
<div class="d-flex align-center ga-2 py-1">
<VIcon icon="tabler-server" size="16" color="medium-emphasis" />
<span class="text-body-2">{{ getFeature(plan, 'storage_bays') }}</span>
</div>
</div>
<!-- Order Button -->
<a
v-if="isInStock(plan)"
:href="accountUrl + '/checkout/' + plan.id"
class="text-decoration-none d-block"
>
<VBtn color="success" variant="tonal" block>
Order Now
</VBtn>
</a>
<VBtn
v-else
color="default"
variant="tonal"
block
disabled
>
Unavailable
</VBtn>
</VCardText>
</VCard>
</VCol>
</VRow>
</VContainer>
</div>
<!-- Included With Every Server -->
<VContainer class="marketing-section">
<SectionHeader
label="Included"
label-color="success"
title="Included With Every Server"
highlight-word="Every"
subtitle="No hidden fees. All servers come with these essentials."
/>
<VRow justify="center">
<VCol v-for="item in included" :key="item.label" cols="6" sm="4" md="2">
<div class="text-center">
<VAvatar color="success" variant="tonal" size="48" class="mb-3">
<VIcon :icon="item.icon" size="24" />
</VAvatar>
<p class="text-body-2 font-weight-medium mb-0">{{ item.label }}</p>
</div>
</VCol>
</VRow>
</VContainer>
<!-- CTA -->
<div class="marketing-section" style="background: linear-gradient(135deg, rgb(var(--v-theme-success), 0.08), rgb(var(--v-theme-surface)));">
<VContainer class="text-center">
<h2 class="text-h4 font-weight-bold mb-3">Need a Custom Configuration?</h2>
<p class="text-body-1 text-medium-emphasis mb-6">
Contact us for custom builds, bulk orders, or servers with specific hardware requirements.
</p>
<div class="d-flex ga-3 justify-center flex-wrap">
<a :href="plans.length ? accountUrl + '/checkout/' + plans[0].id : '/pricing'" class="text-decoration-none">
<VBtn color="success" size="large" rounded="lg">
Get Started
<VIcon icon="tabler-arrow-right" end />
</VBtn>
</a>
<a href="/contact" class="text-decoration-none">
<VBtn color="success" variant="outlined" size="large" rounded="lg">
Contact Sales
</VBtn>
</a>
</div>
</VContainer>
</div>
</div>
</template>
<style lang="scss" scoped>
.server-card-unavailable {
opacity: 0.7;
}
</style>