File: /var/www/html/wp-content/mu-plugins/ethnic-cloud-migration-services-page.php
<?php
/**
* Plugin Name: Ethnic Cloud Migration Services Page
* Description: Creates and renders the Cloud Migration Services sub-service page under DevOps Services.
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! function_exists( 'ethnic_cloud_migration_page_parent_id' ) ) {
function ethnic_cloud_migration_page_parent_id() {
static $parent_id = null;
if ( null !== $parent_id ) {
return $parent_id;
}
$page = function_exists( 'ethnic_devops_services_page_get_target_page' )
? ethnic_devops_services_page_get_target_page()
: get_page_by_path( 'services/devops-services' );
if ( $page instanceof WP_Post ) {
$parent_id = (int) $page->ID;
} else {
$fallback = get_page_by_path( 'devops-services' );
$parent_id = $fallback instanceof WP_Post ? (int) $fallback->ID : 0;
}
return $parent_id;
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_get_target_page' ) ) {
function ethnic_cloud_migration_page_get_target_page() {
static $page = false;
if ( false !== $page ) {
return $page instanceof WP_Post ? $page : null;
}
$page = get_page_by_path( 'services/devops-services/cloud-migration-services' );
if ( ! ( $page instanceof WP_Post ) ) {
$fallback = get_page_by_path( 'cloud-migration-services' );
if ( $fallback instanceof WP_Post && (int) $fallback->post_parent === ethnic_cloud_migration_page_parent_id() ) {
$page = $fallback;
}
}
return $page instanceof WP_Post ? $page : null;
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_ensure_page' ) ) {
function ethnic_cloud_migration_page_ensure_page() {
static $did_run = false;
if ( $did_run ) {
return;
}
$did_run = true;
$parent_id = ethnic_cloud_migration_page_parent_id();
if ( ! $parent_id ) {
return;
}
$postarr = array(
'post_type' => 'page',
'post_title' => 'Cloud Migration Services',
'post_name' => 'cloud-migration-services',
'post_parent' => $parent_id,
'post_status' => 'publish',
'post_content' => '',
'comment_status' => 'closed',
'ping_status' => 'closed',
);
$page = get_page_by_path( 'services/devops-services/cloud-migration-services' );
if ( $page instanceof WP_Post ) {
$needs_update = 'Cloud Migration Services' !== $page->post_title
|| (int) $page->post_parent !== $parent_id
|| 'publish' !== $page->post_status;
if ( $needs_update ) {
wp_update_post(
array_merge(
$postarr,
array(
'ID' => (int) $page->ID,
)
)
);
clean_post_cache( (int) $page->ID );
}
return;
}
$fallback = get_page_by_path( 'cloud-migration-services' );
if ( $fallback instanceof WP_Post ) {
wp_update_post(
array_merge(
$postarr,
array(
'ID' => (int) $fallback->ID,
)
)
);
clean_post_cache( (int) $fallback->ID );
return;
}
wp_insert_post( $postarr );
}
add_action( 'init', 'ethnic_cloud_migration_page_ensure_page', 5 );
}
if ( ! function_exists( 'ethnic_cloud_migration_page_is_target' ) ) {
function ethnic_cloud_migration_page_is_target() {
if ( is_admin() ) {
return false;
}
$page = ethnic_cloud_migration_page_get_target_page();
if ( ! ( $page instanceof WP_Post ) ) {
return false;
}
return (int) get_queried_object_id() === (int) $page->ID || is_page( (int) $page->ID );
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_url' ) ) {
function ethnic_cloud_migration_page_url( $path ) {
return home_url( '/' . ltrim( (string) $path, '/' ) . '/' );
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_contact_url' ) ) {
function ethnic_cloud_migration_page_contact_url( $args = array() ) {
return ethnic_consultation_route_contact_url( $args, ethnic_cloud_migration_page_url( 'contact-us' ) );
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_parent_url' ) ) {
function ethnic_cloud_migration_page_parent_url() {
$parent_id = ethnic_cloud_migration_page_parent_id();
if ( $parent_id ) {
$permalink = get_permalink( $parent_id );
if ( $permalink ) {
return $permalink;
}
}
return ethnic_cloud_migration_page_url( 'services/devops-services' );
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_data' ) ) {
function ethnic_cloud_migration_page_data() {
static $data = null;
if ( null !== $data ) {
return $data;
}
$data = array(
'metaTitle' => 'Cloud Migration Services | Migration Planning, Rehosting, Refactoring & Optimization',
'metaDescription' => 'Looking for cloud migration services? We help businesses plan migrations, manage rehosting or refactoring, reduce downtime, improve security and cost control, and optimize cloud environments after migration.',
'heroTitle' => 'Cloud Migration Services',
'heroText' => 'We help businesses move applications, infrastructure, and workloads to the cloud with structured planning, controlled execution, and long-term operational improvement shaped around scalability, stability, and clearer cloud operations.',
'heroPoints' => array(
'Structured migration planning and execution',
'Rehosting and refactoring support',
'Security, cost control, and post-migration optimization',
),
'overviewParagraphs' => array(
'Our cloud migration services support startups, SMBs, and enterprise teams moving applications, workloads, and environments from legacy hosting, on-premise systems, or older cloud setups into infrastructure that is easier to scale, manage, and evolve.',
'That includes practical support across migration planning, technical execution, risk management, environment readiness, and post-migration improvement so the move is not just completed, but operationally worthwhile.',
'We focus on reducing disruption while improving scalability, operational clarity, and future flexibility with migration planning that runs from assessment and roadmap definition through execution and optimization.',
),
'overviewFeatures' => array(
array(
'icon' => 'roadmap',
'title' => 'Structured Migration Planning',
'copy' => 'Assess current-state infrastructure, dependencies, sequencing, and environment goals before moving critical workloads.',
),
array(
'icon' => 'deploy',
'title' => 'Risk-Aware Execution',
'copy' => 'Carry out cloud migration services with validation, rollback awareness, and transition controls built around business continuity.',
),
array(
'icon' => 'shield',
'title' => 'Secure Cloud Transition',
'copy' => 'Move workloads with stronger attention to access control, visibility, and sound environment design during the migration process.',
),
array(
'icon' => 'optimize',
'title' => 'Post-Migration Optimization',
'copy' => 'Improve performance, monitoring, cost control, and delivery workflows after the cloud cutover is complete.',
),
),
'overviewRoadmap' => array(
array(
'label' => 'Phase 01',
'title' => 'Assess',
'copy' => 'Current estate, workloads, dependencies, and constraints.',
),
array(
'label' => 'Phase 02',
'title' => 'Design',
'copy' => 'Target cloud environment, controls, and sequencing.',
),
array(
'label' => 'Phase 03',
'title' => 'Move',
'copy' => 'Controlled migration execution with validation and cutover readiness.',
),
array(
'label' => 'Phase 04',
'title' => 'Optimize',
'copy' => 'Performance, cost, monitoring, and operational improvement.',
),
),
'planningParagraphs' => array(
'Successful cloud migration starts with understanding the current environment, workload dependencies, business priorities, and the risks that could introduce disruption later in the project.',
'Migration planning should cover workload assessment, sequencing, target environment design, rollback considerations, and stakeholder alignment because not every system should follow the same path or timeline.',
'The right migration planning approach balances speed, stability, cost, and future scalability so the business gets a migration path that fits operational reality rather than a generic playbook.',
),
'planningTimeline' => array( 'Discovery', 'Assessment', 'Roadmap', 'Execution', 'Validation' ),
'planningAreas' => array(
array(
'icon' => 'server',
'title' => 'Current Environment Assessment',
'copy' => 'Review infrastructure layout, hosting constraints, application behavior, and the current operational baseline before migration begins.',
),
array(
'icon' => 'layers',
'title' => 'Dependency Mapping',
'copy' => 'Identify application, database, API, storage, and integration dependencies so sequencing decisions are better informed.',
),
array(
'icon' => 'roadmap',
'title' => 'Migration Roadmap Creation',
'copy' => 'Build a phased migration planning path that aligns workload order, delivery checkpoints, and business priorities.',
),
array(
'icon' => 'cloud',
'title' => 'Target Cloud Environment Planning',
'copy' => 'Define the cloud architecture, services, access model, and operational structure the migration should move toward.',
),
array(
'icon' => 'refresh',
'title' => 'Risk and Rollback Considerations',
'copy' => 'Prepare for validation failure, cutover issues, and transition risk with clearer rollback and recovery planning.',
),
array(
'icon' => 'continuity',
'title' => 'Business Continuity Alignment',
'copy' => 'Sequence migration work around service sensitivity, stakeholder expectations, and acceptable levels of disruption.',
),
),
'approachParagraphs' => array(
'Some workloads are best moved through rehosting when the business needs a faster transition path with lower immediate change to the application itself.',
'Others benefit from refactoring when cloud fit, maintainability, scalability, or broader modernization needs justify a deeper architecture change. The right path depends on the application, urgency, technical debt, and long-term operating goals.',
),
'rehostingPoints' => array(
'Faster transition path',
'Suitable for some legacy or existing workloads',
'Lower immediate change',
'Useful when speed is a priority',
),
'refactoringPoints' => array(
'More cloud-aligned architecture improvements',
'Better long-term scalability and maintainability',
'Useful when modernization is already needed',
'Supports cleaner future operations',
),
'downtimeParagraphs' => array(
'Downtime and operational disruption are usually among the biggest migration concerns. Cloud migration services need to be planned around business continuity requirements instead of assuming every workload can tolerate the same transition risk.',
'Release sequencing, testing before cutover, rollback planning, and environment readiness all contribute to downtime management that supports smoother transitions and more controlled migration events.',
),
'downtimeHighlights' => array(
array(
'icon' => 'workflow',
'title' => 'Transition Planning',
'copy' => 'Sequence migration tasks and cutover decisions around operational impact and service sensitivity.',
),
array(
'icon' => 'chart',
'title' => 'Testing Before Cutover',
'copy' => 'Validate infrastructure, workloads, and behavior before the final migration step goes live.',
),
array(
'icon' => 'refresh',
'title' => 'Rollback Readiness',
'copy' => 'Prepare fallback actions in case validation, stability, or performance signals suggest elevated risk.',
),
array(
'icon' => 'terminal',
'title' => 'Release Sequencing',
'copy' => 'Break migration execution into manageable stages rather than treating cutover as a single blind event.',
),
array(
'icon' => 'cloud',
'title' => 'Environment Validation',
'copy' => 'Check readiness across networking, access, configuration, and service connectivity before transition decisions.',
),
array(
'icon' => 'continuity',
'title' => 'Business Continuity Awareness',
'copy' => 'Align migration timing and controls with the business windows and service expectations that matter most.',
),
),
'securityParagraphs' => array(
'Migration is not just about moving workloads. It also needs proper access control, infrastructure visibility, governance readiness, and cost awareness so the destination cloud environment remains secure and sustainable after the move.',
'Infrastructure decisions should balance scalability, resilience, and budget instead of creating an oversized environment that increases operating cost without improving business outcomes.',
),
'securityAreas' => array(
array(
'icon' => 'lock',
'title' => 'Access and Environment Controls',
'copy' => 'Shape permissions, secrets handling, and environment boundaries with operational control in mind.',
),
array(
'icon' => 'shield',
'title' => 'Secure Migration Practices',
'copy' => 'Apply practical safeguards to data movement, infrastructure changes, and migration workflows.',
),
array(
'icon' => 'chart',
'title' => 'Infrastructure Visibility',
'copy' => 'Improve metrics, alerting, and runtime awareness so issues are easier to spot during and after migration.',
),
array(
'icon' => 'cost',
'title' => 'Cost-Aware Cloud Design',
'copy' => 'Avoid treating scale as an excuse for waste by aligning environment decisions with expected usage and priorities.',
),
array(
'icon' => 'server',
'title' => 'Resource Right-Sizing Considerations',
'copy' => 'Review compute, storage, and service sizing so the target environment is neither constrained nor unnecessarily inflated.',
),
array(
'icon' => 'support',
'title' => 'Governance and Monitoring Readiness',
'copy' => 'Prepare the cloud environment for clearer oversight, monitoring, and long-term operational ownership.',
),
),
'dashboardTiles' => array(
array(
'label' => 'Cost Monitoring',
'value' => 'Tracked',
),
array(
'label' => 'Security Posture',
'value' => 'Reviewed',
),
array(
'label' => 'Access Controls',
'value' => 'Scoped',
),
array(
'label' => 'Resource Allocation',
'value' => 'Right-Sized',
),
array(
'label' => 'Alerting',
'value' => 'Enabled',
),
array(
'label' => 'Governance',
'value' => 'Prepared',
),
),
'optimizationParagraphs' => array(
'Successful cloud migration continues after cutover. Post-migration optimization may include performance tuning, infrastructure cleanup, cost optimization, monitoring improvements, environment standardization, and delivery workflow refinement.',
'The goal is to create a better operating foundation, not just a new hosting location. We support post-migration optimization so businesses can keep improving the value of the move after workloads land in the cloud.',
),
'optimizationThemes' => array(
array(
'icon' => 'chart',
'title' => 'Performance Tuning',
'copy' => 'Refine infrastructure and service behavior so the new cloud environment performs more predictably under real usage.',
),
array(
'icon' => 'support',
'title' => 'Monitoring and Visibility Improvement',
'copy' => 'Strengthen logs, metrics, dashboards, and alerts so teams operate the cloud environment with more confidence.',
),
array(
'icon' => 'cost',
'title' => 'Cost Optimization Review',
'copy' => 'Review usage patterns, service choices, and sizing decisions to improve cloud efficiency over time.',
),
array(
'icon' => 'layers',
'title' => 'Environment Cleanup and Standardization',
'copy' => 'Reduce leftovers, drift, and unclear configuration patterns that often follow rushed migration work.',
),
array(
'icon' => 'workflow',
'title' => 'Delivery Workflow Refinement',
'copy' => 'Improve pipelines, deployment structure, and release practices so cloud operations become more repeatable.',
),
array(
'icon' => 'optimize',
'title' => 'Long-Term Cloud Support',
'copy' => 'Continue refining the environment as scale, usage, and operational maturity evolve after migration.',
),
),
'optimizationLoop' => array( 'Monitor', 'Improve', 'Optimize', 'Scale' ),
'ctaTitle' => 'Looking for Cloud Migration Services with a Structured Approach?',
'ctaText' => 'Discuss migration planning, rehosting or refactoring decisions, downtime concerns, cloud security, cost control, or post-migration optimization needs with a team focused on controlled cloud transitions and dependable operations.',
'ctaHighlights' => array(
'Cloud migration services planned around business continuity, risk awareness, and long-term cloud operations',
'Support for migration planning, rehosting and refactoring, downtime management, and post-migration optimization',
'Practical guidance from assessment and roadmap planning through execution, validation, and ongoing improvement',
),
'ctaSteps' => array(
array(
'title' => 'Assess the migration scope',
'copy' => 'Share the workloads, environments, constraints, and business drivers shaping the move to the cloud.',
),
array(
'title' => 'Choose the right migration path',
'copy' => 'Define whether rehosting, refactoring, phased transition, or deeper modernization makes the most sense.',
),
array(
'title' => 'Plan execution and optimization',
'copy' => 'Leave with clearer next steps for secure migration, cutover control, cloud cost awareness, and post-migration improvement.',
),
),
);
return $data;
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_heading' ) ) {
function ethnic_cloud_migration_page_heading( $eyebrow, $title, $copy = '' ) {
if ( function_exists( 'ethnic_devops_services_page_heading' ) ) {
return ethnic_devops_services_page_heading( $eyebrow, $title, $copy );
}
ob_start();
?>
<div class="ethnic-devops-heading">
<?php if ( $eyebrow ) : ?>
<p class="ethnic-devops-heading__eyebrow"><?php echo esc_html( $eyebrow ); ?></p>
<?php endif; ?>
<h2 class="ethnic-devops-heading__title"><?php echo esc_html( $title ); ?></h2>
<?php if ( $copy ) : ?>
<p class="ethnic-devops-heading__copy"><?php echo esc_html( $copy ); ?></p>
<?php endif; ?>
</div>
<?php
return ob_get_clean();
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_icon' ) ) {
function ethnic_cloud_migration_page_icon( $icon ) {
ob_start();
switch ( $icon ) {
case 'roadmap':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M4.5 18.5h15" />
<circle cx="6.5" cy="12" r="1.9" />
<circle cx="12" cy="8.4" r="1.9" />
<circle cx="17.5" cy="12.8" r="1.9" />
<path d="M8.1 10.8 10.4 9.4" />
<path d="m13.5 9.6 2.5 1.9" />
</svg>
<?php
break;
case 'continuity':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M4.4 12h3.1l1.9-3.1 2.6 6.2 2.1-4.2h5.5" />
<path d="M19.2 6.6a7.5 7.5 0 1 1-12.4 8.1" />
</svg>
<?php
break;
case 'rehost':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="4.2" y="7" width="6.6" height="9.2" rx="1.4" />
<path d="M11.6 11.6h6.2" />
<path d="m15.8 8.8 2.8 2.8-2.8 2.8" />
<path d="M5.9 10h3.2" />
<path d="M5.9 13.2h3.2" />
</svg>
<?php
break;
case 'refactor':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="4.2" y="5.5" width="5.2" height="5.2" rx="1.2" />
<rect x="14.6" y="5.5" width="5.2" height="5.2" rx="1.2" />
<rect x="9.4" y="13.4" width="5.2" height="5.2" rx="1.2" />
<path d="M9.4 8.1h5.2" />
<path d="M12 10.7v2.7" />
</svg>
<?php
break;
case 'cost':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M12 5.2v13.6" />
<path d="M15.4 8.3c0-1.2-1.5-2.2-3.4-2.2s-3.4 1-3.4 2.2 1 1.9 3.4 2.4 3.4 1.2 3.4 2.4-1.5 2.2-3.4 2.2-3.4-1-3.4-2.2" />
<path d="M5.4 18.2h13.2" />
</svg>
<?php
break;
case 'optimize':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M12 4.8a7.2 7.2 0 1 0 7.2 7.2" />
<path d="M12 4.8v7.2l4.8 2.6" />
<path d="M16.6 4.8h2.6v2.6" />
</svg>
<?php
break;
default:
if ( function_exists( 'ethnic_devops_services_page_icon' ) ) {
ob_end_clean();
return ethnic_devops_services_page_icon( $icon );
}
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<circle cx="12" cy="12" r="8.5" />
<path d="M8.6 12.3 10.8 14.5 15.4 9.9" />
</svg>
<?php
break;
}
return ob_get_clean();
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_render' ) ) {
function ethnic_cloud_migration_page_render() {
$data = ethnic_cloud_migration_page_data();
$consultation_url = ethnic_cloud_migration_page_contact_url(
array(
'intent' => 'consultation',
'service' => 'cloud-migration-services',
)
);
$team_url = ethnic_cloud_migration_page_contact_url(
array(
'intent' => 'team',
'service' => 'cloud-migration-services',
)
);
$quote_url = ethnic_cloud_migration_page_contact_url(
array(
'intent' => 'quote',
'service' => 'cloud-migration-services',
)
);
$parent_url = ethnic_cloud_migration_page_parent_url();
ob_start();
?>
<div class="ethnic-devops-page ethnic-cloud-migration-page">
<section class="ethnic-devops-section ethnic-devops-section--hero">
<div class="ethnic-devops-shell">
<div class="ethnic-devops-hero">
<div class="ethnic-devops-hero__copy">
<p class="ethnic-cloud-migration-breadcrumb">
<a href="<?php echo esc_url( $parent_url ); ?>">DevOps Services</a>
<span>/</span>
<span>Cloud Migration Services</span>
</p>
<p class="ethnic-devops-kicker">Cloud Transition Delivery</p>
<h1 class="ethnic-devops-hero__title"><?php echo esc_html( $data['heroTitle'] ); ?></h1>
<p class="ethnic-devops-hero__lead"><?php echo esc_html( $data['heroText'] ); ?></p>
<div class="ethnic-devops-actions">
<a class="ethnic-devops-button ethnic-devops-button--primary" href="<?php echo esc_url( $consultation_url ); ?>">Book a Free Consultation</a>
<a class="ethnic-devops-button ethnic-devops-button--secondary" href="<?php echo esc_url( $team_url ); ?>">Talk to Our Team</a>
</div>
<ul class="ethnic-devops-hero__points" aria-label="Cloud migration services highlights">
<?php foreach ( (array) $data['heroPoints'] as $point ) : ?>
<li><?php echo esc_html( $point ); ?></li>
<?php endforeach; ?>
</ul>
</div>
<div class="ethnic-devops-hero__visual" aria-hidden="true">
<div class="ethnic-devops-visual">
<div class="ethnic-devops-visual__window">
<div class="ethnic-devops-visual__window-bar">
<span></span>
<span></span>
<span></span>
</div>
<div class="ethnic-devops-visual__window-body">
<div class="ethnic-devops-visual__nav">
<span>Current Environment</span>
<span>Migration Flow</span>
<span>Cloud Environment</span>
</div>
<div class="ethnic-devops-visual__hero-card">
<div class="ethnic-devops-visual__product-shot ethnic-cloud-migration-architecture-shot">
<div class="ethnic-cloud-migration-architecture">
<div class="ethnic-cloud-migration-architecture__cluster ethnic-cloud-migration-architecture__cluster--source">
<p class="ethnic-cloud-migration-architecture__title">Current Environment</p>
<div class="ethnic-cloud-migration-architecture__grid">
<div class="ethnic-cloud-migration-architecture__node"><span>App</span><small>VM stack</small></div>
<div class="ethnic-cloud-migration-architecture__node"><span>DB</span><small>Legacy DB</small></div>
<div class="ethnic-cloud-migration-architecture__node"><span>API</span><small>Internal services</small></div>
<div class="ethnic-cloud-migration-architecture__node"><span>Storage</span><small>File systems</small></div>
</div>
</div>
<div class="ethnic-cloud-migration-architecture__transition">
<div class="ethnic-cloud-migration-architecture__arrow">
<span>Assess</span>
<span>Move</span>
<span>Validate</span>
</div>
</div>
<div class="ethnic-cloud-migration-architecture__cluster ethnic-cloud-migration-architecture__cluster--target">
<p class="ethnic-cloud-migration-architecture__title">Cloud Environment</p>
<div class="ethnic-cloud-migration-architecture__grid">
<div class="ethnic-cloud-migration-architecture__node"><span>Compute</span><small>Scalable runtime</small></div>
<div class="ethnic-cloud-migration-architecture__node"><span>Managed DB</span><small>Cloud data layer</small></div>
<div class="ethnic-cloud-migration-architecture__node"><span>Storage</span><small>Object storage</small></div>
<div class="ethnic-cloud-migration-architecture__node"><span>Monitoring</span><small>Ops visibility</small></div>
</div>
</div>
</div>
</div>
<div class="ethnic-devops-visual__product-copy">
<span class="ethnic-devops-visual__eyebrow">Cloud migration architecture illustration</span>
<strong>Move applications, infrastructure, and supporting workloads through a structured migration path with clearer operational control.</strong>
<p>Placeholder visual blocks represent environment transition planning, application movement, cloud target design, and post-cutover visibility.</p>
<div class="ethnic-devops-visual__tags">
<span>Apps</span>
<span>Databases</span>
<span>APIs</span>
<span>Monitoring</span>
</div>
</div>
</div>
<div class="ethnic-devops-visual__catalog">
<div class="ethnic-devops-visual__catalog-item">
<small>Migration lane</small>
<strong>Environment assessment, sequencing, and phased transition controls</strong>
</div>
<div class="ethnic-devops-visual__catalog-item">
<small>Operations lane</small>
<strong>Cloud architecture, runtime visibility, security controls, and post-migration optimization</strong>
</div>
</div>
</div>
</div>
<div class="ethnic-devops-visual__floating ethnic-devops-visual__floating--ops ethnic-cloud-migration-floating">
<p class="ethnic-devops-visual__floating-label">Migration controls</p>
<strong>Cutover decisions supported by validation, rollback awareness, and post-launch monitoring.</strong>
<div class="ethnic-cloud-migration-floating__tags">
<span>Rollback ready</span>
<span>Dependency aware</span>
<span>Cost visible</span>
</div>
</div>
<div class="ethnic-devops-visual__floating ethnic-devops-visual__floating--checkout">
<p class="ethnic-devops-visual__floating-label">Scope view</p>
<strong>Migration planning shaped around applications, databases, APIs, storage, access, and operational visibility.</strong>
<ul>
<li>Environment readiness</li>
<li>Secure transition flow</li>
<li>Optimized cloud landing zone</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-devops-section" id="overview">
<div class="ethnic-devops-shell">
<?php echo ethnic_cloud_migration_page_heading( 'Service Overview', 'Cloud migration services built around planning, execution control, and long-term operational improvement.', 'We help businesses move to the cloud in a practical way that reduces disruption while creating better foundations for scale, visibility, and infrastructure flexibility.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-cloud-migration-overview">
<div class="ethnic-cloud-migration-overview__content">
<div class="ethnic-devops-prose">
<?php foreach ( (array) $data['overviewParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-devops-card-grid ethnic-cloud-migration-card-grid--overview">
<?php foreach ( (array) $data['overviewFeatures'] as $feature ) : ?>
<article class="ethnic-devops-card">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( $feature['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $feature['title'] ); ?></h3>
<p><?php echo esc_html( $feature['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
<aside class="ethnic-cloud-migration-roadmap" aria-label="Migration roadmap summary">
<div class="ethnic-cloud-migration-roadmap__header">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( 'roadmap' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<div>
<p class="ethnic-cloud-migration-roadmap__eyebrow">Migration roadmap panel</p>
<h3>Structured cloud transition from assessment to optimized operations.</h3>
</div>
</div>
<ol class="ethnic-cloud-migration-roadmap__steps">
<?php foreach ( (array) $data['overviewRoadmap'] as $step ) : ?>
<li class="ethnic-cloud-migration-roadmap__step">
<span class="ethnic-cloud-migration-roadmap__label"><?php echo esc_html( $step['label'] ); ?></span>
<div class="ethnic-cloud-migration-roadmap__copy">
<strong><?php echo esc_html( $step['title'] ); ?></strong>
<p><?php echo esc_html( $step['copy'] ); ?></p>
</div>
</li>
<?php endforeach; ?>
</ol>
<div class="ethnic-cloud-migration-roadmap__footer">Visual summary of phased migration planning, execution, and post-migration optimization.</div>
</aside>
</div>
</div>
</section>
<section class="ethnic-devops-section ethnic-devops-section--soft" id="migration-planning">
<div class="ethnic-devops-shell">
<?php echo ethnic_cloud_migration_page_heading( 'Migration Planning', 'Cloud migration planning reduces surprises by shaping the right path before workloads move.', 'Every migration should reflect the current environment, dependency structure, business priorities, and the level of change the organization can absorb confidently.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-cloud-migration-planning">
<div class="ethnic-cloud-migration-planning__intro">
<div class="ethnic-devops-prose">
<?php foreach ( (array) $data['planningParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-cloud-migration-plan-map" aria-label="Migration planning timeline">
<p class="ethnic-cloud-migration-plan-map__eyebrow">Migration planning timeline</p>
<div class="ethnic-cloud-migration-plan-map__steps">
<?php foreach ( (array) $data['planningTimeline'] as $index => $step ) : ?>
<div class="ethnic-cloud-migration-plan-map__step">
<span><?php echo esc_html( sprintf( '%02d', $index + 1 ) ); ?></span>
<strong><?php echo esc_html( $step ); ?></strong>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<div class="ethnic-devops-card-grid ethnic-cloud-migration-card-grid--planning">
<?php foreach ( (array) $data['planningAreas'] as $area ) : ?>
<article class="ethnic-devops-card ethnic-cloud-migration-card">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( $area['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $area['title'] ); ?></h3>
<p><?php echo esc_html( $area['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
</div>
</section>
<section class="ethnic-devops-section" id="rehosting-refactoring">
<div class="ethnic-devops-shell">
<?php echo ethnic_cloud_migration_page_heading( 'Rehosting and Refactoring', 'The right migration approach depends on the workload, urgency, architecture, and long-term cloud goals.', 'We help determine where a faster lift-and-shift path is enough and where deeper rehosting and refactoring decisions should support broader modernization.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-cloud-migration-approaches">
<div class="ethnic-devops-prose ethnic-cloud-migration-approaches__intro">
<?php foreach ( (array) $data['approachParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-cloud-migration-approach-grid">
<article class="ethnic-cloud-migration-approach-card ethnic-cloud-migration-approach-card--rehost">
<div class="ethnic-cloud-migration-approach-card__top">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( 'rehost' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<p class="ethnic-cloud-migration-approach-card__eyebrow">Rehosting</p>
</div>
<div class="ethnic-cloud-migration-approach-card__diagram ethnic-cloud-migration-approach-card__diagram--rehost">
<div class="ethnic-cloud-migration-approach-card__server">
<span>Existing workload</span>
</div>
<div class="ethnic-cloud-migration-approach-card__arrow"></div>
<div class="ethnic-cloud-migration-approach-card__cloud">
<span>Cloud runtime</span>
</div>
</div>
<h3>Faster transition with lower immediate architectural change.</h3>
<ul>
<?php foreach ( (array) $data['rehostingPoints'] as $point ) : ?>
<li><?php echo esc_html( $point ); ?></li>
<?php endforeach; ?>
</ul>
</article>
<article class="ethnic-cloud-migration-approach-card ethnic-cloud-migration-approach-card--refactor">
<div class="ethnic-cloud-migration-approach-card__top">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( 'refactor' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<p class="ethnic-cloud-migration-approach-card__eyebrow">Refactoring</p>
</div>
<div class="ethnic-cloud-migration-approach-card__diagram ethnic-cloud-migration-approach-card__diagram--refactor">
<div class="ethnic-cloud-migration-approach-card__modules">
<span>App layer</span>
<span>Service layer</span>
<span>Data layer</span>
</div>
<div class="ethnic-cloud-migration-approach-card__module-cloud">
<span>Cloud-native service blocks</span>
</div>
</div>
<h3>Cloud-aligned improvement for maintainability and long-term scale.</h3>
<ul>
<?php foreach ( (array) $data['refactoringPoints'] as $point ) : ?>
<li><?php echo esc_html( $point ); ?></li>
<?php endforeach; ?>
</ul>
</article>
</div>
</div>
</div>
</section>
<section class="ethnic-devops-section ethnic-devops-section--soft" id="downtime-management">
<div class="ethnic-devops-shell">
<?php echo ethnic_cloud_migration_page_heading( 'Downtime Management', 'Controlled migration matters because operational disruption can turn a technical move into a business problem.', 'We shape downtime management around transition planning, validation, rollback readiness, and business continuity so migrations can move with less avoidable risk.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-cloud-migration-downtime">
<div class="ethnic-cloud-migration-downtime__intro">
<div class="ethnic-devops-prose">
<?php foreach ( (array) $data['downtimeParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-cloud-migration-cutover" aria-label="Cutover and rollback flow">
<p class="ethnic-cloud-migration-cutover__eyebrow">Cutover / rollback flow</p>
<div class="ethnic-cloud-migration-cutover__stages">
<div class="ethnic-cloud-migration-cutover__stage">
<strong>Pre-Migration Validation</strong>
<small>Readiness and testing checks</small>
</div>
<div class="ethnic-cloud-migration-cutover__stage ethnic-cloud-migration-cutover__stage--checkpoint">
<strong>Cutover Checkpoint</strong>
<small>Decision gate before final transition</small>
</div>
<div class="ethnic-cloud-migration-cutover__stage">
<strong>Post-Launch Monitoring</strong>
<small>Health signals after go-live</small>
</div>
</div>
<div class="ethnic-cloud-migration-cutover__rollback">
<span>Rollback path stays ready if validation or launch signals show elevated risk.</span>
</div>
</div>
</div>
<div class="ethnic-devops-card-grid ethnic-cloud-migration-card-grid--downtime">
<?php foreach ( (array) $data['downtimeHighlights'] as $highlight ) : ?>
<article class="ethnic-devops-card ethnic-cloud-migration-card">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( $highlight['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $highlight['title'] ); ?></h3>
<p><?php echo esc_html( $highlight['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
</div>
</section>
<section class="ethnic-devops-section" id="security-cost-control">
<div class="ethnic-devops-shell">
<?php echo ethnic_cloud_migration_page_heading( 'Security and Cost Control', 'Secure and sustainable cloud migration requires more than a successful move.', 'Access, visibility, governance, and cost control should shape the destination environment so the cloud migration supports both operational resilience and budget discipline.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-cloud-migration-security">
<div class="ethnic-cloud-migration-security__content">
<div class="ethnic-devops-prose">
<?php foreach ( (array) $data['securityParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-devops-card-grid ethnic-cloud-migration-card-grid--security">
<?php foreach ( (array) $data['securityAreas'] as $area ) : ?>
<article class="ethnic-devops-card ethnic-cloud-migration-card">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( $area['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $area['title'] ); ?></h3>
<p><?php echo esc_html( $area['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-cloud-migration-dashboard" aria-label="Cloud operations dashboard preview">
<div class="ethnic-cloud-migration-dashboard__header">
<p class="ethnic-cloud-migration-dashboard__eyebrow">Cloud operations dashboard</p>
<h3>Visibility across cost, access, security posture, and resource allocation.</h3>
</div>
<div class="ethnic-cloud-migration-dashboard__grid">
<?php foreach ( (array) $data['dashboardTiles'] as $tile ) : ?>
<div class="ethnic-cloud-migration-dashboard__tile">
<small><?php echo esc_html( $tile['label'] ); ?></small>
<strong><?php echo esc_html( $tile['value'] ); ?></strong>
</div>
<?php endforeach; ?>
</div>
<div class="ethnic-cloud-migration-dashboard__alerts">
<span>Alerts visible</span>
<span>Usage tracked</span>
<span>Controls reviewed</span>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-devops-section ethnic-devops-section--soft" id="post-migration-optimization">
<div class="ethnic-devops-shell">
<?php echo ethnic_cloud_migration_page_heading( 'Post-Migration Optimization', 'Post-migration optimization turns the cloud move into a stronger long-term operating model.', 'Cloud migration services should continue after cutover with performance, visibility, cost, and delivery improvements that help the business get more value from the new environment.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-cloud-migration-optimization">
<div class="ethnic-cloud-migration-optimization__content">
<div class="ethnic-devops-prose">
<?php foreach ( (array) $data['optimizationParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-devops-card-grid ethnic-cloud-migration-card-grid--optimization">
<?php foreach ( (array) $data['optimizationThemes'] as $theme ) : ?>
<article class="ethnic-devops-card ethnic-cloud-migration-card">
<div class="ethnic-devops-card__icon">
<?php echo ethnic_cloud_migration_page_icon( $theme['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $theme['title'] ); ?></h3>
<p><?php echo esc_html( $theme['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-cloud-migration-loop" aria-label="Continuous optimization visual">
<div class="ethnic-cloud-migration-loop__compare">
<div class="ethnic-cloud-migration-loop__state ethnic-cloud-migration-loop__state--before">
<p>Before Migration</p>
<strong>Fragmented hosting, drift, and limited visibility</strong>
</div>
<div class="ethnic-cloud-migration-loop__arrow"></div>
<div class="ethnic-cloud-migration-loop__state ethnic-cloud-migration-loop__state--after">
<p>Optimized Cloud State</p>
<strong>Cleaner operations, improved monitoring, and better cost control</strong>
</div>
</div>
<div class="ethnic-cloud-migration-loop__wheel">
<div class="ethnic-cloud-migration-loop__center">Optimized Cloud</div>
<?php foreach ( (array) $data['optimizationLoop'] as $item ) : ?>
<span><?php echo esc_html( $item ); ?></span>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-devops-section ethnic-devops-section--cta" id="cta">
<div class="ethnic-devops-shell">
<div class="ethnic-devops-cta ethnic-cloud-migration-cta">
<div class="ethnic-devops-cta__copy">
<div class="ethnic-devops-cta__intro">
<p class="ethnic-devops-kicker ethnic-devops-kicker--light">Ready to Talk</p>
<p class="ethnic-devops-cta__note">Planning for migration planning, rehosting and refactoring, downtime management, and post-migration optimization.</p>
</div>
<h2><?php echo esc_html( $data['ctaTitle'] ); ?></h2>
<p class="ethnic-devops-cta__lead"><?php echo esc_html( $data['ctaText'] ); ?></p>
<div class="ethnic-devops-actions">
<a class="ethnic-devops-button ethnic-devops-button--primary" href="<?php echo esc_url( $team_url ); ?>">Talk to Our Team</a>
<a class="ethnic-devops-button ethnic-devops-button--secondary" href="<?php echo esc_url( $quote_url ); ?>">Get a Free Quote</a>
</div>
<ul class="ethnic-devops-cta__highlights" aria-label="Cloud migration CTA highlights">
<?php foreach ( (array) $data['ctaHighlights'] as $highlight ) : ?>
<li><?php echo esc_html( $highlight ); ?></li>
<?php endforeach; ?>
</ul>
</div>
<aside class="ethnic-devops-cta__panel ethnic-cloud-migration-cta__panel" aria-label="What happens next">
<div class="ethnic-cloud-migration-cta__visual">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="ethnic-devops-cta__panel-header">
<p class="ethnic-devops-cta__panel-eyebrow">What Happens Next</p>
<h3 class="ethnic-devops-cta__panel-title">Plan a cloud migration path with clearer controls, lower disruption, and better long-term cloud operations.</h3>
</div>
<ol class="ethnic-devops-cta__steps">
<?php foreach ( (array) $data['ctaSteps'] as $index => $step ) : ?>
<li class="ethnic-devops-cta__step">
<span class="ethnic-devops-cta__step-number"><?php echo esc_html( sprintf( '%02d', $index + 1 ) ); ?></span>
<div class="ethnic-devops-cta__step-copy">
<strong><?php echo esc_html( $step['title'] ); ?></strong>
<p><?php echo esc_html( $step['copy'] ); ?></p>
</div>
</li>
<?php endforeach; ?>
</ol>
<div class="ethnic-devops-cta__panel-note"><strong>Focus:</strong> migration planning, secure cloud transition, downtime management, cost visibility, and post-migration optimization.</div>
</aside>
</div>
</div>
</section>
</div>
<?php
return ob_get_clean();
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_styles' ) ) {
function ethnic_cloud_migration_page_styles() {
$base_styles = function_exists( 'ethnic_devops_services_page_styles' ) ? ethnic_devops_services_page_styles() : '';
return $base_styles . <<<'CSS'
.ethnic-cloud-migration-page {
--ethnic-devops-accent: #60a5fa;
--ethnic-devops-accent-dark: #1d4ed8;
--ethnic-devops-cyan: #93c5fd;
--ethnic-devops-lime: #dbeafe;
}
.ethnic-cloud-migration-page .ethnic-devops-section--hero {
background:
radial-gradient(circle at 18% 18%, rgba(96, 165, 250, 0.22), transparent 24%),
radial-gradient(circle at 84% 18%, rgba(14, 165, 233, 0.14), transparent 18%),
linear-gradient(180deg, #081321, #0d253a 56%, #12354f);
}
.ethnic-cloud-migration-page .ethnic-devops-hero__title {
max-width: 8ch;
}
.ethnic-cloud-migration-page .ethnic-devops-hero__lead {
max-width: 60ch;
}
.ethnic-cloud-migration-breadcrumb {
display: inline-flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
margin: 0 0 18px;
color: rgba(255, 255, 255, 0.72);
font-size: 12px;
font-weight: 700;
letter-spacing: 0.12em;
line-height: 1.4;
text-transform: uppercase;
}
.ethnic-cloud-migration-breadcrumb a {
color: #ffffff;
text-decoration: none;
}
.ethnic-cloud-migration-breadcrumb a:hover,
.ethnic-cloud-migration-breadcrumb a:focus-visible {
color: rgba(255, 255, 255, 0.82);
}
.ethnic-cloud-migration-page .ethnic-devops-visual__window-body {
background:
radial-gradient(circle at top right, rgba(96, 165, 250, 0.16), transparent 28%),
linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(241, 247, 253, 0.98));
}
.ethnic-cloud-migration-page .ethnic-devops-visual__nav span,
.ethnic-cloud-migration-page .ethnic-devops-visual__tags span {
background: rgba(96, 165, 250, 0.08);
color: #1d4ed8;
}
.ethnic-cloud-migration-page .ethnic-devops-visual__product-shot {
background:
radial-gradient(circle at 28% 28%, rgba(255, 255, 255, 0.92), transparent 22%),
linear-gradient(150deg, rgba(96, 165, 250, 0.14), rgba(191, 219, 254, 0.14)),
linear-gradient(180deg, #eff6ff, #dbeafe);
}
.ethnic-cloud-migration-page .ethnic-devops-visual__product-shot::before {
background: linear-gradient(180deg, #ffffff, #eff7ff);
border: 1px solid rgba(96, 165, 250, 0.14);
}
.ethnic-cloud-migration-page .ethnic-devops-visual__product-shot::after {
background: rgba(96, 165, 250, 0.12);
}
.ethnic-cloud-migration-architecture-shot {
display: grid;
place-items: center;
overflow: hidden;
}
.ethnic-cloud-migration-architecture {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: minmax(0, 1fr) 84px minmax(0, 1fr);
gap: 10px;
width: min(100%, 320px);
align-items: center;
}
.ethnic-cloud-migration-architecture__cluster {
padding: 12px;
border-radius: 18px;
background: rgba(255, 255, 255, 0.82);
border: 1px solid rgba(96, 165, 250, 0.12);
box-shadow: 0 12px 26px rgba(15, 23, 42, 0.08);
}
.ethnic-cloud-migration-architecture__title {
margin: 0 0 10px;
color: #0f172a;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.1em;
line-height: 1.3;
text-transform: uppercase;
}
.ethnic-cloud-migration-architecture__grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
}
.ethnic-cloud-migration-architecture__node {
display: grid;
gap: 4px;
padding: 10px 8px;
border-radius: 14px;
background: rgba(255, 255, 255, 0.86);
border: 1px solid rgba(96, 165, 250, 0.12);
}
.ethnic-cloud-migration-architecture__node span {
color: #0f172a;
font-size: 12px;
font-weight: 700;
line-height: 1.2;
}
.ethnic-cloud-migration-architecture__node small {
color: #1d4ed8;
font-size: 10px;
font-weight: 700;
line-height: 1.3;
}
.ethnic-cloud-migration-architecture__arrow {
display: grid;
gap: 8px;
}
.ethnic-cloud-migration-architecture__arrow span {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 28px;
padding: 0 10px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.76);
border: 1px solid rgba(96, 165, 250, 0.12);
color: #1d4ed8;
font-size: 10px;
font-weight: 800;
letter-spacing: 0.06em;
line-height: 1;
text-transform: uppercase;
}
.ethnic-cloud-migration-architecture__arrow span::after {
content: "";
position: absolute;
right: -14px;
top: 50%;
width: 14px;
height: 1px;
background: rgba(29, 78, 216, 0.28);
}
.ethnic-cloud-migration-architecture__arrow span:last-child::after {
display: none;
}
.ethnic-cloud-migration-floating__tags {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 18px;
}
.ethnic-cloud-migration-floating__tags span {
display: inline-flex;
align-items: center;
min-height: 30px;
padding: 0 12px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.12);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #ffffff;
font-size: 12px;
font-weight: 700;
line-height: 1;
}
.ethnic-cloud-migration-page .ethnic-devops-visual__floating li::before,
.ethnic-cloud-migration-page .ethnic-devops-checklist li::before,
.ethnic-cloud-migration-page .ethnic-devops-cta__highlights li::before,
.ethnic-cloud-migration-approach-card li::before {
background: var(--ethnic-devops-accent);
box-shadow: 0 0 0 5px rgba(96, 165, 250, 0.14);
}
.ethnic-cloud-migration-page .ethnic-devops-visual__floating--ops {
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.04)),
linear-gradient(180deg, #12344a, #0d2433);
}
.ethnic-cloud-migration-page .ethnic-devops-card__icon {
background: rgba(96, 165, 250, 0.08);
color: #1d4ed8;
}
.ethnic-cloud-migration-page .ethnic-devops-cta::before {
background:
linear-gradient(90deg, rgba(96, 165, 250, 0.05) 1px, transparent 1px),
linear-gradient(0deg, rgba(96, 165, 250, 0.05) 1px, transparent 1px);
}
.ethnic-cloud-migration-page .ethnic-devops-kicker--light,
.ethnic-cloud-migration-page .ethnic-devops-heading__eyebrow {
border-color: rgba(96, 165, 250, 0.18);
color: #1d4ed8 !important;
-webkit-text-fill-color: #1d4ed8;
}
.ethnic-cloud-migration-page .ethnic-devops-kicker--light {
box-shadow: 0 14px 36px rgba(96, 165, 250, 0.14);
}
.ethnic-cloud-migration-overview,
.ethnic-cloud-migration-security,
.ethnic-cloud-migration-optimization {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(360px, 0.9fr);
gap: clamp(28px, 4vw, 44px);
align-items: start;
}
.ethnic-cloud-migration-overview__content,
.ethnic-cloud-migration-security__content,
.ethnic-cloud-migration-optimization__content,
.ethnic-cloud-migration-planning,
.ethnic-cloud-migration-downtime {
display: grid;
gap: 24px;
}
.ethnic-cloud-migration-card-grid--overview,
.ethnic-cloud-migration-card-grid--planning,
.ethnic-cloud-migration-card-grid--downtime,
.ethnic-cloud-migration-card-grid--security,
.ethnic-cloud-migration-card-grid--optimization {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ethnic-cloud-migration-roadmap,
.ethnic-cloud-migration-plan-map,
.ethnic-cloud-migration-approach-card,
.ethnic-cloud-migration-cutover,
.ethnic-cloud-migration-dashboard,
.ethnic-cloud-migration-loop {
border-radius: 28px;
border: 1px solid var(--ethnic-devops-border);
box-shadow: var(--ethnic-devops-shadow);
}
.ethnic-cloud-migration-roadmap,
.ethnic-cloud-migration-plan-map,
.ethnic-cloud-migration-cutover,
.ethnic-cloud-migration-dashboard,
.ethnic-cloud-migration-loop,
.ethnic-cloud-migration-approach-card {
padding: 24px;
background:
radial-gradient(circle at top right, rgba(96, 165, 250, 0.08), transparent 26%),
linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(243, 248, 252, 0.98));
}
.ethnic-cloud-migration-roadmap__header,
.ethnic-cloud-migration-dashboard__header {
display: grid;
grid-template-columns: 52px 1fr;
gap: 16px;
align-items: start;
}
.ethnic-cloud-migration-roadmap__eyebrow,
.ethnic-cloud-migration-plan-map__eyebrow,
.ethnic-cloud-migration-approach-card__eyebrow,
.ethnic-cloud-migration-cutover__eyebrow,
.ethnic-cloud-migration-dashboard__eyebrow {
display: inline-flex;
align-items: center;
width: fit-content;
min-height: 32px;
margin: 0 0 10px;
padding: 8px 14px;
border-radius: 999px;
background: rgba(96, 165, 250, 0.08);
border: 1px solid rgba(96, 165, 250, 0.12);
color: #1d4ed8;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.12em;
line-height: 1;
text-transform: uppercase;
}
.ethnic-cloud-migration-roadmap h3,
.ethnic-cloud-migration-dashboard h3,
.ethnic-cloud-migration-approach-card h3,
.ethnic-cloud-migration-loop__state strong,
.ethnic-cloud-migration-loop__center {
margin: 0;
color: var(--ethnic-devops-text);
font-family: "Plus Jakarta Sans", "Figtree", sans-serif;
font-weight: 700;
letter-spacing: -0.04em;
}
.ethnic-cloud-migration-roadmap h3,
.ethnic-cloud-migration-dashboard h3,
.ethnic-cloud-migration-loop__state strong {
font-size: 24px;
line-height: 1.25;
}
.ethnic-cloud-migration-roadmap__steps {
display: grid;
gap: 0;
padding: 0;
margin: 22px 0 0;
list-style: none;
}
.ethnic-cloud-migration-roadmap__step {
display: grid;
grid-template-columns: 82px 1fr;
gap: 14px;
padding: 16px 0;
align-items: start;
}
.ethnic-cloud-migration-roadmap__step + .ethnic-cloud-migration-roadmap__step {
border-top: 1px solid rgba(15, 23, 42, 0.08);
}
.ethnic-cloud-migration-roadmap__label {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 30px;
padding: 0 12px;
border-radius: 999px;
background: rgba(15, 23, 42, 0.04);
color: var(--ethnic-devops-text);
font-size: 11px;
font-weight: 800;
letter-spacing: 0.08em;
line-height: 1;
text-transform: uppercase;
}
.ethnic-cloud-migration-roadmap__copy strong {
display: block;
color: var(--ethnic-devops-text);
font-size: 15px;
font-weight: 700;
line-height: 1.4;
}
.ethnic-cloud-migration-roadmap__copy p,
.ethnic-cloud-migration-roadmap__footer,
.ethnic-cloud-migration-dashboard__alerts {
margin: 8px 0 0;
}
.ethnic-cloud-migration-planning__intro,
.ethnic-cloud-migration-downtime__intro {
display: grid;
grid-template-columns: minmax(0, 0.95fr) minmax(340px, 0.85fr);
gap: 24px 28px;
align-items: start;
}
.ethnic-cloud-migration-plan-map__steps {
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 10px;
}
.ethnic-cloud-migration-plan-map__step {
position: relative;
display: grid;
gap: 10px;
padding-top: 22px;
}
.ethnic-cloud-migration-plan-map__step::before {
content: "";
position: absolute;
left: 0;
top: 10px;
right: 0;
height: 2px;
background: rgba(96, 165, 250, 0.2);
}
.ethnic-cloud-migration-plan-map__step span {
position: relative;
z-index: 1;
display: inline-grid;
place-items: center;
width: 42px;
height: 42px;
border-radius: 14px;
background: rgba(96, 165, 250, 0.12);
color: #1d4ed8;
font-size: 12px;
font-weight: 800;
letter-spacing: 0.1em;
line-height: 1;
}
.ethnic-cloud-migration-plan-map__step strong {
color: var(--ethnic-devops-text);
font-size: 13px;
font-weight: 700;
line-height: 1.4;
}
.ethnic-cloud-migration-approaches {
display: grid;
gap: 24px;
}
.ethnic-cloud-migration-approach-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
}
.ethnic-cloud-migration-approach-card {
height: 100%;
}
.ethnic-cloud-migration-approach-card__top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
}
.ethnic-cloud-migration-approach-card__diagram {
display: grid;
gap: 14px;
margin-top: 20px;
padding: 18px;
border-radius: 22px;
background: rgba(255, 255, 255, 0.82);
border: 1px solid rgba(96, 165, 250, 0.12);
}
.ethnic-cloud-migration-approach-card__diagram--rehost {
grid-template-columns: minmax(0, 0.88fr) 52px minmax(0, 1fr);
align-items: center;
}
.ethnic-cloud-migration-approach-card__server,
.ethnic-cloud-migration-approach-card__cloud,
.ethnic-cloud-migration-approach-card__module-cloud {
display: grid;
place-items: center;
min-height: 80px;
padding: 12px;
border-radius: 18px;
background: rgba(96, 165, 250, 0.08);
border: 1px solid rgba(96, 165, 250, 0.12);
color: var(--ethnic-devops-text);
font-size: 13px;
font-weight: 700;
line-height: 1.4;
text-align: center;
}
.ethnic-cloud-migration-approach-card__arrow {
position: relative;
height: 2px;
background: rgba(29, 78, 216, 0.24);
}
.ethnic-cloud-migration-approach-card__arrow::after {
content: "";
position: absolute;
right: 0;
top: 50%;
width: 10px;
height: 10px;
border-top: 2px solid rgba(29, 78, 216, 0.42);
border-right: 2px solid rgba(29, 78, 216, 0.42);
transform: translateY(-50%) rotate(45deg);
}
.ethnic-cloud-migration-approach-card__diagram--refactor {
grid-template-columns: minmax(0, 0.9fr) minmax(0, 1fr);
align-items: center;
}
.ethnic-cloud-migration-approach-card__modules {
display: grid;
gap: 8px;
}
.ethnic-cloud-migration-approach-card__modules span {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 42px;
padding: 0 12px;
border-radius: 14px;
background: rgba(255, 255, 255, 0.9);
border: 1px solid rgba(96, 165, 250, 0.12);
color: var(--ethnic-devops-text);
font-size: 12px;
font-weight: 700;
line-height: 1.2;
}
.ethnic-cloud-migration-approach-card h3 {
margin-top: 20px;
font-size: 24px;
line-height: 1.25;
}
.ethnic-cloud-migration-approach-card ul {
display: grid;
gap: 12px;
padding: 0;
margin: 18px 0 0;
list-style: none;
}
.ethnic-cloud-migration-approach-card li {
position: relative;
padding-left: 22px;
color: var(--ethnic-devops-text);
font-size: 14px;
font-weight: 600;
line-height: 1.6;
}
.ethnic-cloud-migration-approach-card li::before {
content: "";
position: absolute;
left: 0;
top: 0.38em;
width: 10px;
height: 10px;
border-radius: 50%;
}
.ethnic-cloud-migration-cutover__stages {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin-top: 8px;
}
.ethnic-cloud-migration-cutover__stage {
position: relative;
display: grid;
gap: 6px;
padding: 18px 16px;
border-radius: 18px;
background: rgba(255, 255, 255, 0.84);
border: 1px solid rgba(96, 165, 250, 0.12);
}
.ethnic-cloud-migration-cutover__stage strong {
color: var(--ethnic-devops-text);
font-size: 14px;
font-weight: 700;
line-height: 1.4;
}
.ethnic-cloud-migration-cutover__stage small {
color: #1d4ed8;
font-size: 11px;
font-weight: 700;
line-height: 1.4;
}
.ethnic-cloud-migration-cutover__stage--checkpoint {
background:
radial-gradient(circle at top right, rgba(96, 165, 250, 0.12), transparent 26%),
linear-gradient(180deg, rgba(255, 255, 255, 0.9), rgba(241, 247, 253, 0.98));
}
.ethnic-cloud-migration-cutover__rollback {
position: relative;
margin-top: 18px;
padding-top: 18px;
}
.ethnic-cloud-migration-cutover__rollback::before {
content: "";
position: absolute;
left: 12%;
top: 0;
width: 36%;
height: 12px;
border-left: 2px dashed rgba(239, 68, 68, 0.35);
border-bottom: 2px dashed rgba(239, 68, 68, 0.35);
border-bottom-left-radius: 16px;
}
.ethnic-cloud-migration-cutover__rollback span {
display: inline-flex;
align-items: center;
padding: 10px 14px;
border-radius: 999px;
background: rgba(239, 68, 68, 0.07);
border: 1px solid rgba(239, 68, 68, 0.12);
color: #991b1b;
font-size: 12px;
font-weight: 700;
line-height: 1.4;
}
.ethnic-cloud-migration-dashboard__grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
margin-top: 22px;
}
.ethnic-cloud-migration-dashboard__tile {
padding: 16px;
border-radius: 18px;
background: rgba(255, 255, 255, 0.84);
border: 1px solid rgba(96, 165, 250, 0.12);
}
.ethnic-cloud-migration-dashboard__tile small {
display: block;
color: #1d4ed8;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.08em;
line-height: 1.3;
text-transform: uppercase;
}
.ethnic-cloud-migration-dashboard__tile strong {
display: block;
margin-top: 10px;
color: var(--ethnic-devops-text);
font-family: "Plus Jakarta Sans", "Figtree", sans-serif;
font-size: 22px;
font-weight: 700;
line-height: 1.1;
}
.ethnic-cloud-migration-dashboard__alerts {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.ethnic-cloud-migration-dashboard__alerts span {
display: inline-flex;
align-items: center;
min-height: 30px;
padding: 0 12px;
border-radius: 999px;
background: rgba(96, 165, 250, 0.08);
border: 1px solid rgba(96, 165, 250, 0.12);
color: #1d4ed8;
font-size: 12px;
font-weight: 700;
line-height: 1;
}
.ethnic-cloud-migration-loop {
display: grid;
gap: 20px;
}
.ethnic-cloud-migration-loop__compare {
display: grid;
grid-template-columns: minmax(0, 1fr) 48px minmax(0, 1fr);
gap: 14px;
align-items: center;
}
.ethnic-cloud-migration-loop__state {
display: grid;
gap: 10px;
padding: 18px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.84);
border: 1px solid rgba(96, 165, 250, 0.12);
}
.ethnic-cloud-migration-loop__state p {
margin: 0;
color: #1d4ed8;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.08em;
line-height: 1.3;
text-transform: uppercase;
}
.ethnic-cloud-migration-loop__arrow {
position: relative;
height: 2px;
background: rgba(29, 78, 216, 0.24);
}
.ethnic-cloud-migration-loop__arrow::after {
content: "";
position: absolute;
right: 0;
top: 50%;
width: 10px;
height: 10px;
border-top: 2px solid rgba(29, 78, 216, 0.42);
border-right: 2px solid rgba(29, 78, 216, 0.42);
transform: translateY(-50%) rotate(45deg);
}
.ethnic-cloud-migration-loop__wheel {
position: relative;
display: grid;
place-items: center;
min-height: 280px;
}
.ethnic-cloud-migration-loop__center {
position: relative;
z-index: 1;
display: inline-grid;
place-items: center;
width: 150px;
height: 150px;
border-radius: 50%;
background:
radial-gradient(circle at top left, rgba(96, 165, 250, 0.18), transparent 34%),
linear-gradient(180deg, #ffffff, #edf4ff);
border: 1px solid rgba(96, 165, 250, 0.14);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.08);
font-size: 20px;
line-height: 1.1;
text-align: center;
}
.ethnic-cloud-migration-loop__wheel span {
position: absolute;
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 102px;
min-height: 38px;
padding: 0 14px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.9);
border: 1px solid rgba(96, 165, 250, 0.12);
color: #1d4ed8;
font-size: 12px;
font-weight: 800;
letter-spacing: 0.06em;
line-height: 1;
text-transform: uppercase;
box-shadow: 0 12px 28px rgba(15, 23, 42, 0.08);
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(1) {
top: 8px;
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(2) {
right: 6px;
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(3) {
bottom: 8px;
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(4) {
left: 6px;
}
.ethnic-cloud-migration-cta__panel {
overflow: hidden;
}
.ethnic-cloud-migration-cta__visual {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 12px;
margin-bottom: 18px;
}
.ethnic-cloud-migration-cta__visual span {
position: relative;
display: block;
height: 18px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.12);
border: 1px solid rgba(255, 255, 255, 0.08);
}
.ethnic-cloud-migration-cta__visual span::after {
content: "";
position: absolute;
right: -12px;
top: 50%;
width: 12px;
height: 1px;
background: rgba(255, 255, 255, 0.16);
}
.ethnic-cloud-migration-cta__visual span:last-child::after {
display: none;
}
@media (max-width: 1200px) {
.ethnic-cloud-migration-overview,
.ethnic-cloud-migration-security,
.ethnic-cloud-migration-optimization,
.ethnic-cloud-migration-planning__intro,
.ethnic-cloud-migration-downtime__intro {
grid-template-columns: 1fr;
}
}
@media (max-width: 1024px) {
.ethnic-cloud-migration-card-grid--overview,
.ethnic-cloud-migration-card-grid--planning,
.ethnic-cloud-migration-card-grid--downtime,
.ethnic-cloud-migration-card-grid--security,
.ethnic-cloud-migration-card-grid--optimization,
.ethnic-cloud-migration-approach-grid,
.ethnic-cloud-migration-cutover__stages,
.ethnic-cloud-migration-plan-map__steps,
.ethnic-cloud-migration-loop__compare {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ethnic-cloud-migration-roadmap,
.ethnic-cloud-migration-dashboard,
.ethnic-cloud-migration-loop {
order: -1;
}
.ethnic-cloud-migration-loop__arrow {
display: none;
}
}
@media (max-width: 767px) {
.ethnic-cloud-migration-breadcrumb {
gap: 6px;
font-size: 11px;
}
.ethnic-cloud-migration-architecture,
.ethnic-cloud-migration-roadmap__step,
.ethnic-cloud-migration-approach-card__diagram--rehost,
.ethnic-cloud-migration-approach-card__diagram--refactor,
.ethnic-cloud-migration-dashboard__header,
.ethnic-cloud-migration-loop__compare,
.ethnic-cloud-migration-plan-map__steps,
.ethnic-cloud-migration-cutover__stages,
.ethnic-cloud-migration-dashboard__grid,
.ethnic-cloud-migration-card-grid--overview,
.ethnic-cloud-migration-card-grid--planning,
.ethnic-cloud-migration-card-grid--downtime,
.ethnic-cloud-migration-card-grid--security,
.ethnic-cloud-migration-card-grid--optimization,
.ethnic-cloud-migration-approach-grid {
grid-template-columns: 1fr;
}
.ethnic-cloud-migration-architecture__arrow span::after,
.ethnic-cloud-migration-cutover__rollback::before,
.ethnic-cloud-migration-cta__visual span::after {
display: none;
}
.ethnic-cloud-migration-floating__tags,
.ethnic-cloud-migration-dashboard__alerts {
display: grid;
}
.ethnic-cloud-migration-loop__wheel {
min-height: 420px;
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(1) {
top: 12px;
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(2) {
right: 50%;
top: 88px;
transform: translateX(50%);
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(3) {
bottom: 12px;
}
.ethnic-cloud-migration-loop__wheel span:nth-of-type(4) {
left: 50%;
bottom: 88px;
transform: translateX(-50%);
}
}
CSS;
}
}
if ( ! function_exists( 'ethnic_cloud_migration_page_body_class' ) ) {
function ethnic_cloud_migration_page_body_class( $classes ) {
if ( ethnic_cloud_migration_page_is_target() ) {
$classes[] = 'ethnic-devops-development-target';
$classes[] = 'ethnic-devops-services-target';
$classes[] = 'ethnic-cloud-migration-target';
}
return $classes;
}
add_filter( 'body_class', 'ethnic_cloud_migration_page_body_class' );
}
if ( ! function_exists( 'ethnic_cloud_migration_page_print_head_assets' ) ) {
function ethnic_cloud_migration_page_print_head_assets() {
if ( ! ethnic_cloud_migration_page_is_target() ) {
return;
}
$data = ethnic_cloud_migration_page_data();
?>
<style id="ethnic-cloud-migration-page-inline-css" type="text/css">
<?php echo ethnic_cloud_migration_page_styles(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</style>
<meta name="description" content="<?php echo esc_attr( $data['metaDescription'] ); ?>" />
<?php
}
add_action( 'wp_head', 'ethnic_cloud_migration_page_print_head_assets', 120 );
}
if ( ! function_exists( 'ethnic_cloud_migration_page_document_title' ) ) {
function ethnic_cloud_migration_page_document_title( $title ) {
if ( ethnic_cloud_migration_page_is_target() ) {
$data = ethnic_cloud_migration_page_data();
return $data['metaTitle'];
}
return $title;
}
add_filter( 'pre_get_document_title', 'ethnic_cloud_migration_page_document_title', 50 );
}
if ( ! function_exists( 'ethnic_cloud_migration_page_replace_content' ) ) {
function ethnic_cloud_migration_page_replace_content( $content ) {
if ( ! ethnic_cloud_migration_page_is_target() || ! in_the_loop() || ! is_main_query() ) {
return $content;
}
static $rendered = false;
if ( $rendered ) {
return $content;
}
$rendered = true;
return ethnic_cloud_migration_page_render();
}
add_filter( 'the_content', 'ethnic_cloud_migration_page_replace_content', 1000 );
}