3009 lines
138 KiB
HTML
3009 lines
138 KiB
HTML
<!doctype html>
|
||
<html dir="ltr" lang="en-US" prefix="og: https://ogp.me/ns#">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<link rel="profile" href="https://gmpg.org/xfn/11">
|
||
<title>Bare metal server details - DedicatedNodes</title>
|
||
|
||
<!-- All in One SEO 4.8.7.2 - aioseo.com -->
|
||
<meta name="robots" content="max-image-preview:large" />
|
||
<link rel="canonical" href="https://www.dedicatednodes.io/bare-metal-server-details/" />
|
||
<meta name="generator" content="All in One SEO (AIOSEO) 4.8.7.2" />
|
||
<meta property="og:locale" content="en_US" />
|
||
<meta property="og:site_name" content="DedicatedNodes - High performance bare metal servers for Solana" />
|
||
<meta property="og:type" content="article" />
|
||
<meta property="og:title" content="Bare metal server details - DedicatedNodes" />
|
||
<meta property="og:url" content="https://www.dedicatednodes.io/bare-metal-server-details/" />
|
||
<meta property="og:image" content="https://www.dedicatednodes.io/wp-content/uploads/2024/05/cropped-dedicatednodes_badge.png" />
|
||
<meta property="og:image:secure_url" content="https://www.dedicatednodes.io/wp-content/uploads/2024/05/cropped-dedicatednodes_badge.png" />
|
||
<meta property="og:image:width" content="512" />
|
||
<meta property="og:image:height" content="512" />
|
||
<meta property="article:published_time" content="2025-11-21T14:30:43+00:00" />
|
||
<meta property="article:modified_time" content="2025-11-21T14:30:43+00:00" />
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<meta name="twitter:site" content="@dedicatednodes" />
|
||
<meta name="twitter:title" content="Bare metal server details - DedicatedNodes" />
|
||
<meta name="twitter:creator" content="@dedicatednodes" />
|
||
<meta name="twitter:image" content="https://www.dedicatednodes.io/wp-content/uploads/2024/05/cropped-dedicatednodes_badge.png" />
|
||
<script type="application/ld+json" class="aioseo-schema">
|
||
{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.dedicatednodes.io#listItem","position":1,"name":"Home","item":"https:\/\/www.dedicatednodes.io","nextItem":{"@type":"ListItem","@id":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/#listItem","name":"Bare metal server details"}},{"@type":"ListItem","@id":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/#listItem","position":2,"name":"Bare metal server details","previousItem":{"@type":"ListItem","@id":"https:\/\/www.dedicatednodes.io#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/www.dedicatednodes.io\/#organization","name":"DedicatedNodes","description":"High performance bare metal servers for Solana","url":"https:\/\/www.dedicatednodes.io\/","logo":{"@type":"ImageObject","url":"https:\/\/www.dedicatednodes.io\/wp-content\/uploads\/2024\/05\/cropped-dedicatednodes_badge.png","@id":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/#organizationLogo","width":512,"height":512},"image":{"@id":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/#organizationLogo"},"sameAs":["https:\/\/www.x.com\/dedicatednodes"]},{"@type":"WebPage","@id":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/#webpage","url":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/","name":"Bare metal server details - DedicatedNodes","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.dedicatednodes.io\/#website"},"breadcrumb":{"@id":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/#breadcrumblist"},"datePublished":"2025-11-21T14:30:43+00:00","dateModified":"2025-11-21T14:30:43+00:00"},{"@type":"WebSite","@id":"https:\/\/www.dedicatednodes.io\/#website","url":"https:\/\/www.dedicatednodes.io\/","name":"DedicatedNodes","description":"High performance bare metal servers for Solana","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.dedicatednodes.io\/#organization"}}]}
|
||
</script>
|
||
<!-- All in One SEO -->
|
||
|
||
<link rel='dns-prefetch' href='//www.dedicatednodes.io' />
|
||
<link rel='dns-prefetch' href='//cdn.jsdelivr.net' />
|
||
<link rel="alternate" type="application/rss+xml" title="DedicatedNodes » Feed" href="https://www.dedicatednodes.io/feed/" />
|
||
<link rel="alternate" type="application/rss+xml" title="DedicatedNodes » Comments Feed" href="https://www.dedicatednodes.io/comments/feed/" />
|
||
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://www.dedicatednodes.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.dedicatednodes.io%2Fbare-metal-server-details%2F" />
|
||
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://www.dedicatednodes.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.dedicatednodes.io%2Fbare-metal-server-details%2F&format=xml" />
|
||
<!-- This site uses the Google Analytics by MonsterInsights plugin v9.10.0 - Using Analytics tracking - https://www.monsterinsights.com/ -->
|
||
<script src="//www.googletagmanager.com/gtag/js?id=G-7S9GL1MN5L" data-cfasync="false" data-wpfc-render="false" async></script>
|
||
<script data-cfasync="false" data-wpfc-render="false">
|
||
var mi_version = '9.10.0';
|
||
var mi_track_user = true;
|
||
var mi_no_track_reason = '';
|
||
var MonsterInsightsDefaultLocations = {"page_location":"https:\/\/www.dedicatednodes.io\/bare-metal-server-details\/"};
|
||
if ( typeof MonsterInsightsPrivacyGuardFilter === 'function' ) {
|
||
var MonsterInsightsLocations = (typeof MonsterInsightsExcludeQuery === 'object') ? MonsterInsightsPrivacyGuardFilter( MonsterInsightsExcludeQuery ) : MonsterInsightsPrivacyGuardFilter( MonsterInsightsDefaultLocations );
|
||
} else {
|
||
var MonsterInsightsLocations = (typeof MonsterInsightsExcludeQuery === 'object') ? MonsterInsightsExcludeQuery : MonsterInsightsDefaultLocations;
|
||
}
|
||
|
||
var disableStrs = [
|
||
'ga-disable-G-7S9GL1MN5L',
|
||
];
|
||
|
||
/* Function to detect opted out users */
|
||
function __gtagTrackerIsOptedOut() {
|
||
for (var index = 0; index < disableStrs.length; index++) {
|
||
if (document.cookie.indexOf(disableStrs[index] + '=true') > -1) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/* Disable tracking if the opt-out cookie exists. */
|
||
if (__gtagTrackerIsOptedOut()) {
|
||
for (var index = 0; index < disableStrs.length; index++) {
|
||
window[disableStrs[index]] = true;
|
||
}
|
||
}
|
||
|
||
/* Opt-out function */
|
||
function __gtagTrackerOptout() {
|
||
for (var index = 0; index < disableStrs.length; index++) {
|
||
document.cookie = disableStrs[index] + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
|
||
window[disableStrs[index]] = true;
|
||
}
|
||
}
|
||
|
||
if ('undefined' === typeof gaOptout) {
|
||
function gaOptout() {
|
||
__gtagTrackerOptout();
|
||
}
|
||
}
|
||
window.dataLayer = window.dataLayer || [];
|
||
|
||
window.MonsterInsightsDualTracker = {
|
||
helpers: {},
|
||
trackers: {},
|
||
};
|
||
if (mi_track_user) {
|
||
function __gtagDataLayer() {
|
||
dataLayer.push(arguments);
|
||
}
|
||
|
||
function __gtagTracker(type, name, parameters) {
|
||
if (!parameters) {
|
||
parameters = {};
|
||
}
|
||
|
||
if (parameters.send_to) {
|
||
__gtagDataLayer.apply(null, arguments);
|
||
return;
|
||
}
|
||
|
||
if (type === 'event') {
|
||
parameters.send_to = monsterinsights_frontend.v4_id;
|
||
var hookName = name;
|
||
if (typeof parameters['event_category'] !== 'undefined') {
|
||
hookName = parameters['event_category'] + ':' + name;
|
||
}
|
||
|
||
if (typeof MonsterInsightsDualTracker.trackers[hookName] !== 'undefined') {
|
||
MonsterInsightsDualTracker.trackers[hookName](parameters);
|
||
} else {
|
||
__gtagDataLayer('event', name, parameters);
|
||
}
|
||
|
||
} else {
|
||
__gtagDataLayer.apply(null, arguments);
|
||
}
|
||
}
|
||
|
||
__gtagTracker('js', new Date());
|
||
__gtagTracker('set', {
|
||
'developer_id.dZGIzZG': true,
|
||
});
|
||
if ( MonsterInsightsLocations.page_location ) {
|
||
__gtagTracker('set', MonsterInsightsLocations);
|
||
}
|
||
__gtagTracker('config', 'G-7S9GL1MN5L', {"forceSSL":"true","link_attribution":"true","page_path":location.pathname + location.search + location.hash} );
|
||
window.gtag = __gtagTracker; (function () {
|
||
/* https://developers.google.com/analytics/devguides/collection/analyticsjs/ */
|
||
/* ga and __gaTracker compatibility shim. */
|
||
var noopfn = function () {
|
||
return null;
|
||
};
|
||
var newtracker = function () {
|
||
return new Tracker();
|
||
};
|
||
var Tracker = function () {
|
||
return null;
|
||
};
|
||
var p = Tracker.prototype;
|
||
p.get = noopfn;
|
||
p.set = noopfn;
|
||
p.send = function () {
|
||
var args = Array.prototype.slice.call(arguments);
|
||
args.unshift('send');
|
||
__gaTracker.apply(null, args);
|
||
};
|
||
var __gaTracker = function () {
|
||
var len = arguments.length;
|
||
if (len === 0) {
|
||
return;
|
||
}
|
||
var f = arguments[len - 1];
|
||
if (typeof f !== 'object' || f === null || typeof f.hitCallback !== 'function') {
|
||
if ('send' === arguments[0]) {
|
||
var hitConverted, hitObject = false, action;
|
||
if ('event' === arguments[1]) {
|
||
if ('undefined' !== typeof arguments[3]) {
|
||
hitObject = {
|
||
'eventAction': arguments[3],
|
||
'eventCategory': arguments[2],
|
||
'eventLabel': arguments[4],
|
||
'value': arguments[5] ? arguments[5] : 1,
|
||
}
|
||
}
|
||
}
|
||
if ('pageview' === arguments[1]) {
|
||
if ('undefined' !== typeof arguments[2]) {
|
||
hitObject = {
|
||
'eventAction': 'page_view',
|
||
'page_path': arguments[2],
|
||
}
|
||
}
|
||
}
|
||
if (typeof arguments[2] === 'object') {
|
||
hitObject = arguments[2];
|
||
}
|
||
if (typeof arguments[5] === 'object') {
|
||
Object.assign(hitObject, arguments[5]);
|
||
}
|
||
if ('undefined' !== typeof arguments[1].hitType) {
|
||
hitObject = arguments[1];
|
||
if ('pageview' === hitObject.hitType) {
|
||
hitObject.eventAction = 'page_view';
|
||
}
|
||
}
|
||
if (hitObject) {
|
||
action = 'timing' === arguments[1].hitType ? 'timing_complete' : hitObject.eventAction;
|
||
hitConverted = mapArgs(hitObject);
|
||
__gtagTracker('event', action, hitConverted);
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
|
||
function mapArgs(args) {
|
||
var arg, hit = {};
|
||
var gaMap = {
|
||
'eventCategory': 'event_category',
|
||
'eventAction': 'event_action',
|
||
'eventLabel': 'event_label',
|
||
'eventValue': 'event_value',
|
||
'nonInteraction': 'non_interaction',
|
||
'timingCategory': 'event_category',
|
||
'timingVar': 'name',
|
||
'timingValue': 'value',
|
||
'timingLabel': 'event_label',
|
||
'page': 'page_path',
|
||
'location': 'page_location',
|
||
'title': 'page_title',
|
||
'referrer' : 'page_referrer',
|
||
};
|
||
for (arg in args) {
|
||
if (!(!args.hasOwnProperty(arg) || !gaMap.hasOwnProperty(arg))) {
|
||
hit[gaMap[arg]] = args[arg];
|
||
} else {
|
||
hit[arg] = args[arg];
|
||
}
|
||
}
|
||
return hit;
|
||
}
|
||
|
||
try {
|
||
f.hitCallback();
|
||
} catch (ex) {
|
||
}
|
||
};
|
||
__gaTracker.create = newtracker;
|
||
__gaTracker.getByName = newtracker;
|
||
__gaTracker.getAll = function () {
|
||
return [];
|
||
};
|
||
__gaTracker.remove = noopfn;
|
||
__gaTracker.loaded = true;
|
||
window['__gaTracker'] = __gaTracker;
|
||
})();
|
||
} else {
|
||
console.log("");
|
||
(function () {
|
||
function __gtagTracker() {
|
||
return null;
|
||
}
|
||
|
||
window['__gtagTracker'] = __gtagTracker;
|
||
window['gtag'] = __gtagTracker;
|
||
})();
|
||
}
|
||
</script>
|
||
<!-- / Google Analytics by MonsterInsights -->
|
||
<style id='wp-img-auto-sizes-contain-inline-css'>
|
||
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
|
||
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
|
||
</style>
|
||
<style id='wp-emoji-styles-inline-css'>
|
||
|
||
img.wp-smiley, img.emoji {
|
||
display: inline !important;
|
||
border: none !important;
|
||
box-shadow: none !important;
|
||
height: 1em !important;
|
||
width: 1em !important;
|
||
margin: 0 0.07em !important;
|
||
vertical-align: -0.1em !important;
|
||
background: none !important;
|
||
padding: 0 !important;
|
||
}
|
||
/*# sourceURL=wp-emoji-styles-inline-css */
|
||
</style>
|
||
<style id='wp-block-library-inline-css'>
|
||
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{clip:auto!important;background-color:#ddd;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}
|
||
|
||
/*# sourceURL=wp-block-library-inline-css */
|
||
</style><style id='global-styles-inline-css'>
|
||
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
|
||
/*# sourceURL=global-styles-inline-css */
|
||
</style>
|
||
|
||
<style id='classic-theme-styles-inline-css'>
|
||
/*! This file is auto-generated */
|
||
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
|
||
/*# sourceURL=/wp-includes/css/classic-themes.min.css */
|
||
</style>
|
||
<link rel='stylesheet' id='contact-form-7-css' href='https://www.dedicatednodes.io/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=6.1.2' media='all' />
|
||
<link rel='stylesheet' id='wpddn-bootstrap-css' href='https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/css/bootstrap.min.css?ver=1764837370' media='all' />
|
||
<link rel='stylesheet' id='wpddn-aos-css' href='https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/css/aos.css?ver=1764837370' media='all' />
|
||
<link rel='stylesheet' id='wpddn-public-css' href='https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/css/wpddn-public.css?ver=1764837370' media='all' />
|
||
<link rel='stylesheet' id='dedicatednodes-style-css' href='https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/style.css?ver=1764837370' media='all' />
|
||
<link rel='stylesheet' id='wpddn-font-awesome-css' href='https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/css/font-awesome.min.css?ver=1764837370' media='all' />
|
||
<link rel='stylesheet' id='wpddn-responsive-css' href='https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/css/responsive.css?ver=1764837370' media='all' />
|
||
<link rel='stylesheet' id='intl-tel-input-css' href='https://cdn.jsdelivr.net/npm/intl-tel-input@22.0.2/build/css/intlTelInput.css?ver=1764837370' media='all' />
|
||
<style id='imh-6310-head-css-inline-css'>
|
||
.imh-6310-point-icons{display: none}
|
||
/*# sourceURL=imh-6310-head-css-inline-css */
|
||
</style>
|
||
<script src="https://www.dedicatednodes.io/wp-content/plugins/google-analytics-for-wordpress/assets/js/frontend-gtag.min.js?ver=9.10.0" id="monsterinsights-frontend-script-js" async data-wp-strategy="async"></script>
|
||
<script data-cfasync="false" data-wpfc-render="false" id='monsterinsights-frontend-script-js-extra'>var monsterinsights_frontend = {"js_events_tracking":"true","download_extensions":"doc,pdf,ppt,zip,xls,docx,pptx,xlsx","inbound_paths":"[]","home_url":"https:\/\/www.dedicatednodes.io","hash_tracking":"true","v4_id":"G-7S9GL1MN5L"};</script>
|
||
<script src="https://www.dedicatednodes.io/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
|
||
<link rel="https://api.w.org/" href="https://www.dedicatednodes.io/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://www.dedicatednodes.io/wp-json/wp/v2/pages/2877" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.dedicatednodes.io/xmlrpc.php?rsd" />
|
||
<meta name="generator" content="WordPress 6.9" />
|
||
<link rel='shortlink' href='https://www.dedicatednodes.io/?p=2877' />
|
||
<style type="text/css">
|
||
.site-title,
|
||
.site-description {
|
||
position: absolute;
|
||
clip: rect(1px, 1px, 1px, 1px);
|
||
}
|
||
</style>
|
||
<link rel="icon" href="https://www.dedicatednodes.io/wp-content/uploads/2024/05/cropped-dedicatednodes_badge-32x32.png" sizes="32x32" />
|
||
<link rel="icon" href="https://www.dedicatednodes.io/wp-content/uploads/2024/05/cropped-dedicatednodes_badge-192x192.png" sizes="192x192" />
|
||
<link rel="apple-touch-icon" href="https://www.dedicatednodes.io/wp-content/uploads/2024/05/cropped-dedicatednodes_badge-180x180.png" />
|
||
<meta name="msapplication-TileImage" content="https://www.dedicatednodes.io/wp-content/uploads/2024/05/cropped-dedicatednodes_badge-270x270.png" />
|
||
<link rel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
|
||
</head>
|
||
<style>
|
||
:root {
|
||
--brand-primary: #2C79FF;
|
||
/* Updated Blue */
|
||
--brand-cyan: #00D4FF;
|
||
--brand-dark: #0A1628;
|
||
--text-primary: #1a1a2e;
|
||
--text-secondary: #6b7280;
|
||
--bg-light: #f8fafc;
|
||
--border-color: #e5e7eb;
|
||
--success: #22c55e;
|
||
--warning: #f59e0b;
|
||
--instant-color: #10b981;
|
||
--custom-color: #8b5cf6;
|
||
--lavender-badge: #d8b4fe;
|
||
--font-family-base: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||
}
|
||
|
||
body {
|
||
font-family: var(--font-family-base) !important;
|
||
-webkit-font-smoothing: antialiased;
|
||
-moz-osx-font-smoothing: grayscale;
|
||
padding-top: 80px; /* Account for fixed header */
|
||
}
|
||
|
||
/* --- UNIFIED FONT & BUTTON ECOSYSTEM --- */
|
||
/* Force Inter font on all interactive elements to fix "weird fonts" */
|
||
body, button, input, select, textarea, .btn, .navbar-brand, .nav-link, .h1, .h2, .h3, .h4, .h5, .h6 {
|
||
font-family: 'Inter', sans-serif !important;
|
||
}
|
||
|
||
/* Standardize all buttons */
|
||
.btn, .btn-primary, .btn-success, .btn-secondary, .btn-order, .btn-cta-white, .btn-cta-outline {
|
||
border-radius: 8px !important;
|
||
font-weight: 600 !important;
|
||
letter-spacing: 0.01em;
|
||
text-transform: none !important;
|
||
transition: all 0.2s ease-in-out;
|
||
padding: 0.75rem 1.5rem;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
/* Primary Action Buttons (Blue) */
|
||
.btn-primary, .btn-success, .btn-order {
|
||
background-color: var(--brand-primary) !important;
|
||
border: 1px solid var(--brand-primary) !important;
|
||
color: white !important;
|
||
}
|
||
|
||
.btn-primary:hover, .btn-success:hover, .btn-order:hover {
|
||
background-color: #1b66e6 !important;
|
||
border-color: #1b66e6 !important;
|
||
color: white !important;
|
||
transform: translateY(-1px);
|
||
box-shadow: 0 4px 12px rgba(44, 121, 255, 0.25);
|
||
}
|
||
|
||
/* Secondary Buttons (White/Light) */
|
||
.btn-secondary {
|
||
background-color: white !important;
|
||
border: 1px solid var(--border-color) !important;
|
||
color: var(--brand-dark) !important;
|
||
}
|
||
|
||
.btn-secondary:hover {
|
||
background-color: #f8fafc !important;
|
||
border-color: var(--brand-primary) !important;
|
||
color: var(--brand-primary) !important;
|
||
}
|
||
|
||
/* Outline Buttons */
|
||
.btn-outline, .btn-cta-outline {
|
||
background: transparent !important;
|
||
border: 1px solid currentColor !important;
|
||
}
|
||
|
||
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
|
||
font-family: var(--font-family-base) !important;
|
||
}
|
||
|
||
/* Header Styles - Overrides for Bootstrap Navbar */
|
||
#navbar_main {
|
||
background-color: white;
|
||
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
|
||
}
|
||
|
||
/* Hero Section - Light Mode */
|
||
.server-hero {
|
||
background-color: #f0f9ff;
|
||
background: linear-gradient(180deg, #f0f9ff 0%, #e0f2fe 100%);
|
||
color: var(--brand-dark);
|
||
padding: 8rem 0 6rem; /* Account for fixed header */
|
||
position: relative;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.hero-breadcrumb {
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.breadcrumb-list {
|
||
display: flex;
|
||
list-style: none;
|
||
padding: 0;
|
||
margin: 0;
|
||
gap: 0.5rem;
|
||
font-size: 0.85rem;
|
||
color: var(--text-secondary);
|
||
}
|
||
|
||
.breadcrumb-list a {
|
||
color: var(--text-secondary);
|
||
text-decoration: none;
|
||
}
|
||
|
||
.breadcrumb-list li::after {
|
||
content: "/";
|
||
margin-left: 0.5rem;
|
||
opacity: 0.5;
|
||
color: var(--text-secondary);
|
||
}
|
||
|
||
.breadcrumb-list li:last-child::after {
|
||
content: "";
|
||
}
|
||
|
||
.breadcrumb-list li.current {
|
||
color: var(--brand-dark);
|
||
font-weight: 600;
|
||
}
|
||
|
||
.hero-content {
|
||
max-width: 800px;
|
||
}
|
||
|
||
.hero-badge {
|
||
display: inline-block;
|
||
padding: 0.35rem 1rem;
|
||
background: rgba(44, 121, 255, 0.1);
|
||
color: var(--brand-primary);
|
||
border-radius: 50px;
|
||
font-size: 0.85rem;
|
||
font-weight: 600;
|
||
margin-bottom: 1.5rem;
|
||
border: 1px solid rgba(44, 121, 255, 0.2);
|
||
}
|
||
|
||
.hero-title {
|
||
font-size: 3rem;
|
||
font-weight: 800;
|
||
line-height: 1.1;
|
||
margin-bottom: 1rem;
|
||
color: var(--brand-dark);
|
||
}
|
||
|
||
.hero-subtitle {
|
||
font-size: 1.25rem;
|
||
color: var(--text-secondary);
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.hero-actions {
|
||
display: flex;
|
||
gap: 1rem;
|
||
margin-bottom: 3rem;
|
||
}
|
||
|
||
.btn-secondary {
|
||
background: white;
|
||
color: var(--brand-dark);
|
||
padding: 0.75rem 1.5rem;
|
||
border-radius: 6px;
|
||
font-weight: 600;
|
||
text-decoration: none;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
border: 1px solid var(--border-color);
|
||
transition: all 0.2s;
|
||
}
|
||
|
||
.btn-secondary:hover {
|
||
background: #f8fafc;
|
||
border-color: var(--brand-primary);
|
||
color: var(--brand-primary);
|
||
}
|
||
|
||
.btn-primary svg, .btn-secondary svg {
|
||
opacity: 0.8;
|
||
}
|
||
|
||
.hero-stats {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: 2rem;
|
||
border-top: 1px solid rgba(0,0,0,0.1);
|
||
padding-top: 2rem;
|
||
}
|
||
|
||
.stat-item {
|
||
display: flex;
|
||
flex-direction: column;
|
||
}
|
||
|
||
.stat-value {
|
||
font-size: 1.5rem;
|
||
font-weight: 700;
|
||
color: var(--brand-primary);
|
||
margin-bottom: 0.25rem;
|
||
}
|
||
|
||
.stat-label {
|
||
font-size: 0.85rem;
|
||
color: var(--text-secondary);
|
||
font-weight: 500;
|
||
}
|
||
|
||
/* Main Specs Styling */
|
||
.main-specs {
|
||
padding: 4rem 0;
|
||
background: #f8fafc;
|
||
}
|
||
|
||
.specs-header {
|
||
text-align: center;
|
||
max-width: 700px;
|
||
margin: 0 auto 3rem;
|
||
}
|
||
|
||
.specs-title {
|
||
font-size: 2rem;
|
||
font-weight: 800;
|
||
color: var(--brand-dark);
|
||
margin-bottom: 0.75rem;
|
||
}
|
||
|
||
.specs-subtitle {
|
||
color: var(--text-secondary);
|
||
font-size: 1.1rem;
|
||
}
|
||
|
||
.specs-layout {
|
||
display: grid;
|
||
grid-template-columns: 1fr 320px;
|
||
gap: 2rem;
|
||
}
|
||
|
||
.specs-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: 1.5rem;
|
||
}
|
||
|
||
.spec-card {
|
||
background: white;
|
||
border-radius: 12px;
|
||
padding: 1.5rem;
|
||
box-shadow: 0 2px 8px rgba(0,0,0,0.03);
|
||
border: 1px solid var(--border-color);
|
||
}
|
||
|
||
.spec-card-header {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.75rem;
|
||
margin-bottom: 1.25rem;
|
||
padding-bottom: 1rem;
|
||
border-bottom: 1px solid #f3f4f6;
|
||
}
|
||
|
||
.spec-icon {
|
||
font-size: 1.5rem;
|
||
}
|
||
|
||
.spec-card-title {
|
||
font-size: 1.1rem;
|
||
font-weight: 700;
|
||
color: var(--brand-dark);
|
||
margin: 0;
|
||
}
|
||
|
||
.spec-detail {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
font-size: 0.9rem;
|
||
margin-bottom: 0.75rem;
|
||
}
|
||
|
||
.spec-detail-label { color: var(--text-secondary); }
|
||
.spec-detail-value { font-weight: 600; color: var(--text-primary); }
|
||
.spec-detail-value.highlight { color: var(--brand-primary); }
|
||
|
||
.spec-options {
|
||
margin-top: 1rem;
|
||
padding-top: 1rem;
|
||
border-top: 1px dashed #e5e7eb;
|
||
}
|
||
|
||
.spec-option {
|
||
font-size: 0.85rem;
|
||
color: var(--text-secondary);
|
||
margin-bottom: 0.25rem;
|
||
padding-left: 1rem;
|
||
position: relative;
|
||
}
|
||
|
||
.spec-option::before {
|
||
content: "•";
|
||
position: absolute;
|
||
left: 0;
|
||
color: var(--brand-primary);
|
||
}
|
||
|
||
/* Sidebar Cards */
|
||
.pricing-card {
|
||
background: var(--brand-dark);
|
||
color: white;
|
||
border-radius: 12px;
|
||
padding: 2rem;
|
||
text-align: center;
|
||
margin-bottom: 1.5rem;
|
||
}
|
||
|
||
.pricing-label {
|
||
color: rgba(255,255,255,0.6);
|
||
font-size: 0.9rem;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.pricing-amount {
|
||
font-size: 2.5rem;
|
||
font-weight: 800;
|
||
color: white;
|
||
margin-bottom: 0.25rem;
|
||
}
|
||
|
||
.pricing-period {
|
||
color: rgba(255,255,255,0.6);
|
||
margin-bottom: 1.5rem;
|
||
}
|
||
|
||
.btn-order {
|
||
background: var(--brand-primary);
|
||
color: white;
|
||
display: block;
|
||
width: 100%;
|
||
padding: 1rem;
|
||
border-radius: 6px;
|
||
font-weight: 700;
|
||
text-decoration: none;
|
||
transition: background 0.2s;
|
||
}
|
||
|
||
.btn-order:hover {
|
||
background: #2260c4;
|
||
color: white;
|
||
}
|
||
|
||
.sidebar-card {
|
||
background: white;
|
||
border: 1px solid var(--border-color);
|
||
border-radius: 12px;
|
||
padding: 1.5rem;
|
||
}
|
||
|
||
.sidebar-card-title {
|
||
font-size: 1rem;
|
||
font-weight: 700;
|
||
margin-bottom: 1rem;
|
||
color: var(--brand-dark);
|
||
}
|
||
|
||
.quick-feature {
|
||
display: flex;
|
||
gap: 0.75rem;
|
||
margin-bottom: 0.75rem;
|
||
font-size: 0.9rem;
|
||
color: var(--text-secondary);
|
||
align-items: center;
|
||
}
|
||
|
||
/* Features Section */
|
||
.features-section {
|
||
padding: 4rem 0;
|
||
background: white;
|
||
}
|
||
|
||
.features-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: 2rem;
|
||
}
|
||
|
||
.feature-card {
|
||
text-align: center;
|
||
padding: 1.5rem;
|
||
border-radius: 12px;
|
||
background: #f8fafc;
|
||
transition: transform 0.2s;
|
||
}
|
||
|
||
.feature-card:hover {
|
||
transform: translateY(-5px);
|
||
}
|
||
|
||
.feature-emoji {
|
||
font-size: 2.5rem;
|
||
margin-bottom: 1rem;
|
||
display: block;
|
||
}
|
||
|
||
.feature-title {
|
||
font-size: 1.1rem;
|
||
font-weight: 700;
|
||
margin-bottom: 0.5rem;
|
||
color: var(--brand-dark);
|
||
}
|
||
|
||
.feature-description {
|
||
font-size: 0.9rem;
|
||
color: var(--text-secondary);
|
||
}
|
||
|
||
/* Stats Bar */
|
||
.stats-bar {
|
||
background: var(--brand-primary);
|
||
color: white;
|
||
padding: 2rem 0;
|
||
}
|
||
|
||
.stats-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(4, 1fr);
|
||
gap: 2rem;
|
||
text-align: center;
|
||
}
|
||
|
||
.stat .stat-value {
|
||
font-size: 2rem;
|
||
margin-bottom: 0.25rem;
|
||
}
|
||
|
||
.stat .stat-label {
|
||
color: rgba(255,255,255,0.8);
|
||
}
|
||
|
||
/* Map Container */
|
||
.map-container {
|
||
height: 500px;
|
||
background: #e5e7eb;
|
||
position: relative;
|
||
margin-bottom: 0;
|
||
overflow: hidden;
|
||
}
|
||
|
||
#world-map-canvas {
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
|
||
/* Locations Section Styles */
|
||
.locations {
|
||
padding: 4rem 0 0;
|
||
background: white;
|
||
}
|
||
|
||
.locations-header {
|
||
text-align: center;
|
||
margin-bottom: 1.5rem;
|
||
}
|
||
|
||
.locations-title {
|
||
font-size: 2rem;
|
||
font-weight: 800;
|
||
color: var(--brand-dark);
|
||
}
|
||
|
||
.locations-intro {
|
||
text-align: center;
|
||
max-width: 800px;
|
||
margin: 0 auto 2rem;
|
||
}
|
||
|
||
.locations-description {
|
||
color: var(--text-secondary);
|
||
font-size: 1.1rem;
|
||
}
|
||
|
||
.location-badges {
|
||
display: flex;
|
||
justify-content: center;
|
||
flex-wrap: wrap;
|
||
gap: 1rem;
|
||
margin-bottom: 3rem;
|
||
}
|
||
|
||
.loc-badge {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
padding: 0.5rem 1rem;
|
||
background: #f3f4f6;
|
||
border-radius: 50px;
|
||
font-size: 0.9rem;
|
||
font-weight: 600;
|
||
color: var(--brand-dark);
|
||
border: 1px solid var(--border-color);
|
||
}
|
||
|
||
.loc-badge .flag-icon {
|
||
font-size: 1.2rem;
|
||
}
|
||
|
||
.loc-badge-future {
|
||
background: rgba(245, 158, 11, 0.1);
|
||
color: #d97706;
|
||
border-color: rgba(245, 158, 11, 0.2);
|
||
}
|
||
|
||
/* Map Controls / Overlay */
|
||
.map-controls {
|
||
position: absolute;
|
||
bottom: 2rem;
|
||
left: 2rem;
|
||
background: rgba(255, 255, 255, 0.95);
|
||
backdrop-filter: blur(10px);
|
||
padding: 1.5rem;
|
||
border-radius: 12px;
|
||
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
|
||
width: 300px;
|
||
z-index: 10;
|
||
}
|
||
|
||
.controls-title {
|
||
font-size: 0.9rem;
|
||
font-weight: 700;
|
||
color: var(--brand-dark);
|
||
margin-bottom: 1rem;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
.pulse {
|
||
width: 8px;
|
||
height: 8px;
|
||
background: #22c55e;
|
||
border-radius: 50%;
|
||
box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7);
|
||
animation: pulse-green 2s infinite;
|
||
}
|
||
|
||
@keyframes pulse-green {
|
||
0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7); }
|
||
70% { transform: scale(1); box-shadow: 0 0 0 10px rgba(34, 197, 94, 0); }
|
||
100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); }
|
||
}
|
||
|
||
.activity-list {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 0.75rem;
|
||
}
|
||
|
||
.activity-row {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
font-size: 0.8rem;
|
||
padding-bottom: 0.5rem;
|
||
border-bottom: 1px solid #f3f4f6;
|
||
}
|
||
|
||
.activity-row:last-child {
|
||
border-bottom: none;
|
||
padding-bottom: 0;
|
||
}
|
||
|
||
.activity-route { color: var(--text-secondary); }
|
||
.activity-latency { font-weight: 600; color: var(--brand-primary); }
|
||
|
||
|
||
/* Final CTA */
|
||
.final-cta {
|
||
background: var(--brand-dark);
|
||
padding: 5rem 0;
|
||
text-align: center;
|
||
color: white;
|
||
}
|
||
|
||
.cta-title {
|
||
font-size: 2.5rem;
|
||
font-weight: 800;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.cta-subtitle {
|
||
font-size: 1.2rem;
|
||
color: rgba(255,255,255,0.7);
|
||
margin-bottom: 2.5rem;
|
||
}
|
||
|
||
.cta-actions {
|
||
display: flex;
|
||
justify-content: center;
|
||
gap: 1rem;
|
||
}
|
||
|
||
.btn-cta-white {
|
||
background: white;
|
||
color: var(--brand-dark);
|
||
padding: 1rem 2rem;
|
||
border-radius: 6px;
|
||
font-weight: 700;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.btn-cta-outline {
|
||
border: 1px solid rgba(255,255,255,0.3);
|
||
color: white;
|
||
padding: 1rem 2rem;
|
||
border-radius: 6px;
|
||
font-weight: 700;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.btn-cta-white:hover {
|
||
background: #f3f4f6;
|
||
}
|
||
|
||
.btn-cta-outline:hover {
|
||
background: rgba(255,255,255,0.1);
|
||
}
|
||
|
||
|
||
/* Tags */
|
||
.tag {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 0.25rem;
|
||
padding: 0.2rem 0.5rem;
|
||
border-radius: 4px;
|
||
font-size: 0.65rem;
|
||
font-weight: 700;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
}
|
||
|
||
.tag-instant {
|
||
background: rgba(16, 185, 129, 0.15);
|
||
color: #059669;
|
||
}
|
||
|
||
.tag-custom {
|
||
background: #E9D5FF;
|
||
/* Lavender */
|
||
color: #7e22ce;
|
||
}
|
||
|
||
/* Calculator Section */
|
||
.calculator-section {
|
||
padding: 2rem 0 4rem;
|
||
background-color: #fff;
|
||
}
|
||
|
||
.calculator-wrapper {
|
||
background: white;
|
||
border-radius: 12px;
|
||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.03);
|
||
overflow: hidden;
|
||
border: 1px solid var(--border-color);
|
||
}
|
||
|
||
.calculator-header {
|
||
display: none; /* Hidden in new design */
|
||
}
|
||
|
||
/* Custom Header bar for wrapper */
|
||
.calc-top-bar {
|
||
background: transparent;
|
||
color: var(--text-secondary);
|
||
padding: 0.75rem 0;
|
||
font-size: 0.85rem;
|
||
font-weight: 500;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.calculator-body {
|
||
display: grid;
|
||
grid-template-columns: 1fr 320px;
|
||
gap: 0;
|
||
}
|
||
|
||
.config-panel {
|
||
padding: 1.5rem;
|
||
border-right: 1px solid var(--border-color);
|
||
}
|
||
|
||
.summary-panel {
|
||
padding: 1.5rem;
|
||
background: white;
|
||
}
|
||
|
||
/* Tabs */
|
||
.config-tabs {
|
||
display: flex;
|
||
gap: 1rem;
|
||
margin-bottom: 2rem;
|
||
justify-content: center;
|
||
background: transparent;
|
||
padding: 0;
|
||
}
|
||
|
||
.config-tab {
|
||
padding: 0.75rem 2rem;
|
||
border: 1px solid var(--border-color);
|
||
background: white;
|
||
border-radius: 50px;
|
||
font-size: 0.95rem;
|
||
font-weight: 600;
|
||
cursor: pointer;
|
||
transition: all 0.2s;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
color: var(--text-secondary);
|
||
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
|
||
flex: initial;
|
||
}
|
||
|
||
.config-tab:hover {
|
||
background: #f9fafb;
|
||
}
|
||
|
||
.config-tab.active {
|
||
border-color: transparent;
|
||
color: var(--brand-primary);
|
||
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
|
||
}
|
||
|
||
.config-tab.active.instant {
|
||
color: var(--brand-primary);
|
||
}
|
||
|
||
.config-tab .badge-count {
|
||
background: #f3f4f6;
|
||
padding: 0.1rem 0.5rem;
|
||
border-radius: 10px;
|
||
font-size: 0.75rem;
|
||
color: var(--text-secondary);
|
||
}
|
||
|
||
/* Server Cards Grid */
|
||
.servers-section {
|
||
margin-bottom: 1.5rem;
|
||
}
|
||
|
||
.section-label {
|
||
font-size: 0.8rem;
|
||
font-weight: 700;
|
||
color: var(--text-secondary);
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
margin-bottom: 1rem;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.75rem;
|
||
}
|
||
|
||
.section-pill {
|
||
padding: 0.25rem 0.75rem;
|
||
border-radius: 20px;
|
||
font-size: 0.75rem;
|
||
font-weight: 700;
|
||
color: white;
|
||
}
|
||
|
||
.section-pill.instant { background: var(--instant-color); }
|
||
.section-pill.custom { background: var(--custom-color); }
|
||
|
||
.servers-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: 1rem;
|
||
}
|
||
|
||
.server-option {
|
||
background: white;
|
||
border: 1px solid var(--border-color);
|
||
border-radius: 12px;
|
||
padding: 1.25rem;
|
||
cursor: pointer;
|
||
transition: all 0.2s;
|
||
position: relative;
|
||
box-shadow: 0 2px 8px rgba(0,0,0,0.03);
|
||
}
|
||
|
||
.server-option:hover {
|
||
border-color: var(--brand-primary);
|
||
transform: translateY(-2px);
|
||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
|
||
}
|
||
|
||
.server-option.active {
|
||
border-color: var(--brand-primary);
|
||
box-shadow: 0 0 0 1px var(--brand-primary);
|
||
}
|
||
|
||
/* Internal Card Layout */
|
||
.server-top-row {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: flex-start;
|
||
margin-bottom: 0.75rem;
|
||
}
|
||
|
||
.server-badge {
|
||
font-size: 0.65rem;
|
||
font-weight: 700;
|
||
text-transform: uppercase;
|
||
padding: 0.2rem 0.6rem;
|
||
border-radius: 4px;
|
||
display: inline-block;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.server-badge.instant { background: rgba(16, 185, 129, 0.15); color: #059669; }
|
||
.server-badge.custom { background: #E9D5FF; color: #7e22ce; }
|
||
|
||
.server-title {
|
||
font-size: 0.95rem;
|
||
font-weight: 800;
|
||
color: var(--text-primary);
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.server-specs-row {
|
||
display: flex;
|
||
gap: 0.75rem;
|
||
font-size: 0.75rem;
|
||
color: var(--text-secondary);
|
||
flex-wrap: wrap;
|
||
margin-bottom: 0.75rem;
|
||
}
|
||
|
||
.spec-pill {
|
||
background: #f3f4f6;
|
||
padding: 0.15rem 0.5rem;
|
||
border-radius: 4px;
|
||
border: none;
|
||
}
|
||
|
||
.server-meta-row {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
font-size: 0.75rem;
|
||
color: var(--text-secondary);
|
||
border-top: 1px solid #f3f4f6;
|
||
padding-top: 0.75rem;
|
||
margin-top: 0.5rem;
|
||
}
|
||
|
||
.server-price-display {
|
||
font-size: 1rem;
|
||
font-weight: 700;
|
||
color: var(--brand-primary);
|
||
}
|
||
|
||
.server-price-display small {
|
||
font-size: 0.7rem;
|
||
font-weight: 400;
|
||
color: var(--text-secondary);
|
||
}
|
||
|
||
/* --- Config Options --- */
|
||
.config-section {
|
||
margin-top: 2rem;
|
||
animation: fadeIn 0.3s ease;
|
||
}
|
||
|
||
.config-header-bar {
|
||
background: #f8fafc;
|
||
padding: 0.75rem 1rem;
|
||
border-radius: 8px;
|
||
margin-bottom: 1.5rem;
|
||
font-weight: 600;
|
||
color: var(--text-primary);
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
.config-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
|
||
gap: 1rem;
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.config-grid.wide {
|
||
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
|
||
}
|
||
|
||
.config-card {
|
||
background: white;
|
||
border: 1px solid var(--border-color);
|
||
border-radius: 8px;
|
||
padding: 1rem;
|
||
cursor: pointer;
|
||
transition: all 0.2s;
|
||
text-align: center;
|
||
position: relative;
|
||
min-height: 80px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
|
||
.config-card:hover {
|
||
border-color: var(--brand-primary);
|
||
transform: translateY(-2px);
|
||
box-shadow: 0 4px 12px rgba(0,0,0,0.05);
|
||
}
|
||
|
||
.config-card.active {
|
||
border-color: var(--brand-primary);
|
||
box-shadow: 0 0 0 1px var(--brand-primary);
|
||
}
|
||
|
||
.config-card .option-name {
|
||
font-size: 0.85rem;
|
||
font-weight: 600;
|
||
color: var(--text-primary);
|
||
margin-bottom: 0.25rem;
|
||
}
|
||
|
||
.config-card .option-price {
|
||
font-size: 0.8rem;
|
||
color: var(--brand-primary);
|
||
font-weight: 600;
|
||
}
|
||
|
||
.config-card .option-price.included {
|
||
color: var(--brand-primary);
|
||
font-size: 0.75rem;
|
||
font-weight: 500;
|
||
}
|
||
|
||
/* Storage Slots Visualizer */
|
||
.storage-slots-container {
|
||
margin-top: 0.5rem;
|
||
margin-bottom: 1.5rem;
|
||
padding: 1rem;
|
||
background: #f8fafc;
|
||
border-radius: 8px;
|
||
border: 1px solid var(--border-color);
|
||
}
|
||
|
||
.slots-header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
font-size: 0.85rem;
|
||
color: var(--text-secondary);
|
||
margin-bottom: 0.75rem;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.slots-visual {
|
||
display: flex;
|
||
gap: 0.5rem;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
.drive-slot {
|
||
width: 40px;
|
||
height: 12px;
|
||
background: #e2e8f0;
|
||
border-radius: 2px;
|
||
position: relative;
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
.drive-slot.filled {
|
||
background: var(--brand-primary);
|
||
box-shadow: 0 0 8px rgba(44, 121, 255, 0.4);
|
||
}
|
||
|
||
.drive-slot.filled.gen5 {
|
||
background: var(--custom-color);
|
||
box-shadow: 0 0 8px rgba(139, 92, 246, 0.4);
|
||
}
|
||
|
||
.drive-slot.filled::after {
|
||
content: "";
|
||
position: absolute;
|
||
right: 2px;
|
||
top: 2px;
|
||
bottom: 2px;
|
||
width: 2px;
|
||
background: rgba(255,255,255,0.5);
|
||
border-radius: 1px;
|
||
animation: blink 2s infinite;
|
||
}
|
||
|
||
@keyframes blink {
|
||
0%, 100% { opacity: 0.3; }
|
||
50% { opacity: 1; }
|
||
}
|
||
|
||
/* Quantity Stepper */
|
||
.qty-stepper {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: 0.5rem;
|
||
margin-top: 0.5rem;
|
||
background: #f3f4f6;
|
||
border-radius: 6px;
|
||
padding: 0.25rem;
|
||
width: 100%;
|
||
}
|
||
|
||
.btn-qty {
|
||
width: 24px;
|
||
height: 24px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
border: none;
|
||
background: white;
|
||
border-radius: 4px;
|
||
cursor: pointer;
|
||
font-weight: 700;
|
||
color: var(--brand-primary);
|
||
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
|
||
transition: all 0.1s;
|
||
}
|
||
|
||
.btn-qty:hover {
|
||
background: var(--brand-primary);
|
||
color: white;
|
||
}
|
||
|
||
.qty-val {
|
||
font-size: 0.9rem;
|
||
font-weight: 700;
|
||
color: var(--brand-dark);
|
||
min-width: 20px;
|
||
text-align: center;
|
||
}
|
||
|
||
.config-card.has-stepper {
|
||
cursor: default; /* Don't click the whole card */
|
||
padding-bottom: 0.75rem;
|
||
}
|
||
|
||
.config-card.has-stepper.active {
|
||
border-color: var(--brand-primary);
|
||
background: #f0f9ff;
|
||
box-shadow: 0 0 0 1px var(--brand-primary);
|
||
}
|
||
|
||
/* Summary Panel */
|
||
.summary-header {
|
||
font-size: 0.7rem;
|
||
font-weight: 700;
|
||
color: var(--text-secondary);
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.summary-row {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
font-size: 0.8rem;
|
||
margin-bottom: 0.75rem;
|
||
padding-bottom: 0.75rem;
|
||
border-bottom: 1px solid #f3f4f6;
|
||
}
|
||
|
||
.summary-row .label { color: var(--text-secondary); }
|
||
.summary-row .val { font-weight: 500; text-align: right; max-width: 60%; }
|
||
|
||
.total-row {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
margin-top: 1rem;
|
||
margin-bottom: 1.5rem;
|
||
padding-top: 0.5rem;
|
||
}
|
||
|
||
.total-row .label { font-size: 0.9rem; color: var(--text-secondary); }
|
||
.total-row .amount { font-size: 1.75rem; font-weight: 800; color: var(--brand-primary); }
|
||
|
||
.btn-success {
|
||
background: var(--brand-primary);
|
||
color: white;
|
||
border: none;
|
||
width: 100%;
|
||
justify-content: center;
|
||
padding: 0.75rem;
|
||
}
|
||
|
||
.btn-success:hover {
|
||
background: #2260c4;
|
||
}
|
||
|
||
/* Tab Content */
|
||
.tab-content {
|
||
display: none;
|
||
}
|
||
|
||
.tab-content.active {
|
||
display: block;
|
||
}
|
||
|
||
/* Loading Spinner */
|
||
.loading-spinner {
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
padding: 2rem;
|
||
color: var(--brand-primary);
|
||
font-weight: 600;
|
||
gap: 0.5rem;
|
||
}
|
||
.loading-spinner::after {
|
||
content: "";
|
||
width: 20px;
|
||
height: 20px;
|
||
border: 2px solid var(--brand-primary);
|
||
border-top-color: transparent;
|
||
border-radius: 50%;
|
||
animation: spin 0.8s linear infinite;
|
||
}
|
||
@keyframes spin {
|
||
to { transform: rotate(360deg); }
|
||
}
|
||
|
||
/* ============ RESPONSIVE STYLES ============ */
|
||
@media (max-width: 1024px) {
|
||
.calculator-body {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
|
||
.config-panel {
|
||
border-right: none;
|
||
border-bottom: 1px solid var(--border-color);
|
||
}
|
||
|
||
.servers-grid {
|
||
grid-template-columns: repeat(2, 1fr);
|
||
}
|
||
}
|
||
|
||
@media (max-width: 640px) {
|
||
.container {
|
||
padding: 0 0.75rem;
|
||
}
|
||
|
||
.nav-links {
|
||
display: none;
|
||
}
|
||
|
||
.mobile-menu-btn {
|
||
display: block;
|
||
}
|
||
|
||
.hero h1 {
|
||
font-size: 1.75rem;
|
||
}
|
||
|
||
.calculator-header {
|
||
padding: 1rem;
|
||
}
|
||
|
||
.calculator-title h2 {
|
||
font-size: 1rem;
|
||
}
|
||
|
||
.config-panel,
|
||
.summary-panel {
|
||
padding: 1rem;
|
||
}
|
||
|
||
.servers-grid {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
|
||
.config-tabs {
|
||
flex-direction: column;
|
||
}
|
||
}
|
||
</style>
|
||
<body class="wp-singular page-template page-template-bare-metal-server-details page-template-bare-metal-server-details-php page page-id-2877 wp-custom-logo wp-theme-dedicatednodes">
|
||
|
||
<span class="screen-darken"></span>
|
||
|
||
<!-- Header -->
|
||
<nav class="navbar navbar-expand-lg navbar-light bg-white fixed-top" id="navbar_main" style="padding: 1rem 0; border-bottom: 1px solid #e5e7eb; z-index: 9999;">
|
||
<div class="container">
|
||
<div class="offcanvas-header d-lg-none">
|
||
<button class="btn-close float-end"></button>
|
||
</div>
|
||
<a class="navbar-brand" href="https://www.dedicatednodes.io/">
|
||
<img src="https://www.dedicatednodes.io/wp-content/uploads/2024/04/LOGO.svg" alt="DedicatedNodes" style="height: 36px;">
|
||
</a>
|
||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||
<span class="navbar-toggler-icon"></span>
|
||
</button>
|
||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||
<ul class="navbar-nav ms-lg-4 mb-2 mb-lg-0">
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="https://www.dedicatednodes.io/solana-nodes/" style="color: var(--brand-dark); font-weight: 600;">Solana dedicated nodes</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="https://www.dedicatednodes.io/performance-vps/" style="color: var(--brand-dark); font-weight: 600;">Performance VPS</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a class="nav-link" href="https://www.dedicatednodes.io/about-us/" style="color: var(--brand-dark); font-weight: 600;">About us</a>
|
||
</li>
|
||
</ul>
|
||
<ul class="navbar-nav ms-auto right d-flex flex-row align-items-center gap-3">
|
||
<li class="nav-item">
|
||
<a class="nav-link outline btn-outline" href="https://portal.dedicatednodes.io/contact.php" style="border: 1px solid var(--brand-dark); border-radius: 6px; padding: 0.5rem 1.5rem; font-weight: 600; color: var(--brand-dark);">Contact us</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a class="nav-link fill btn-primary" href="https://portal.dedicatednodes.io/login" style="background: var(--brand-primary); color: white; border-radius: 6px; padding: 0.5rem 1.5rem; font-weight: 600;">Control panel</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<main class="bare-metal-details">
|
||
|
||
<!-- Hero Section -->
|
||
<section class="server-hero">
|
||
<div class="container">
|
||
<nav class="hero-breadcrumb">
|
||
<ol class="breadcrumb-list">
|
||
<li><a href="https://www.dedicatednodes.io">Home</a></li>
|
||
<li><a href="https://www.dedicatednodes.io/bare-metal-servers">Bare Metal Servers</a></li>
|
||
<li class="current">AMD Ryzen Threadripper PRO 9975WX</li>
|
||
</ol>
|
||
</nav>
|
||
|
||
<div class="hero-content">
|
||
<span class="hero-badge">
|
||
⚡ Ultimate Performance Beast </span>
|
||
|
||
<h1 class="hero-title">AMD Ryzen Threadripper PRO 9975WX</h1>
|
||
<p class="hero-subtitle">
|
||
32 cores •
|
||
5.4 GHz boost •
|
||
384GB+ memory
|
||
</p>
|
||
|
||
<div class="hero-actions">
|
||
<a href="#calculator" class="btn-primary">
|
||
Configure server
|
||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<line x1="5" y1="12" x2="19" y2="12"></line>
|
||
<polyline points="12 5 19 12 12 19"></polyline>
|
||
</svg>
|
||
</a>
|
||
<a href="#specs" class="btn-secondary">
|
||
View specifications
|
||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<polyline points="7 13 12 18 17 13"></polyline>
|
||
<polyline points="7 6 12 11 17 6"></polyline>
|
||
</svg>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="hero-stats">
|
||
<div class="stat-item">
|
||
<span class="stat-value">32</span>
|
||
<span class="stat-label">CPU Cores</span>
|
||
</div>
|
||
<div class="stat-item">
|
||
<span class="stat-value">384GB+</span>
|
||
<span class="stat-label">Memory</span>
|
||
</div>
|
||
<div class="stat-item">
|
||
<span class="stat-value">2x 10Gbps</span>
|
||
<span class="stat-label">Network</span>
|
||
</div>
|
||
<div class="stat-item">
|
||
<span class="stat-value">Instant</span>
|
||
<span class="stat-label">Setup</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Calculator Section (New Builder) -->
|
||
<div class="calc-top-bar">
|
||
<div class="container">
|
||
Select a server configuration below
|
||
</div>
|
||
</div>
|
||
|
||
<section class="calculator-section" id="calculator">
|
||
<div class="container">
|
||
|
||
<!-- Tabs -->
|
||
<div class="config-tabs">
|
||
<button class="config-tab active instant" data-tab="instant">
|
||
⚡ Instant Deploy <span class="badge-count">9</span>
|
||
</button>
|
||
<button class="config-tab custom" data-tab="custom">
|
||
⚙️ Custom Build <span class="badge-count">4</span>
|
||
</button>
|
||
</div>
|
||
|
||
<div class="calculator-wrapper">
|
||
<div class="calculator-body">
|
||
|
||
<!-- Left Panel -->
|
||
<div class="config-panel">
|
||
|
||
<!-- Instant Servers Tab -->
|
||
<div class="tab-content active" id="instant-content">
|
||
<div class="section-label">
|
||
<span class="section-pill instant">INSTANT</span>
|
||
<span style="color:var(--text-secondary); font-weight:600;">READY IN 15 MINUTES</span>
|
||
</div>
|
||
<div class="servers-grid" id="instantServersGrid">
|
||
<!-- Populated by JS -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Custom Build Tab -->
|
||
<div class="tab-content" id="custom-content">
|
||
<div class="section-label">
|
||
<span class="section-pill custom">CUSTOM</span>
|
||
<span style="color:var(--text-secondary); font-weight:600;">CHOOSE YOUR BASE CPU</span>
|
||
</div>
|
||
<div class="servers-grid" id="customServersGrid">
|
||
<!-- Populated by JS -->
|
||
</div>
|
||
|
||
<!-- Custom Options Area -->
|
||
<div class="config-section" id="customOptions" style="display:none;">
|
||
<div class="config-header-bar">
|
||
⚙️ Configure Your Server
|
||
</div>
|
||
|
||
<div id="configLoader" style="display:none;" class="loading-spinner">
|
||
Loading real-time options...
|
||
</div>
|
||
|
||
<div id="dynamicConfigContainer">
|
||
<!-- Dynamic Options will be injected here -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Right Summary Panel -->
|
||
<div class="summary-panel">
|
||
<!-- Dynamic Header for Summary -->
|
||
<div id="summaryHeaderPill" class="section-pill instant" style="display:inline-block; margin-bottom:0.5rem; font-size:0.7rem;">
|
||
Instant Deploy
|
||
</div>
|
||
<div id="summarySubtext" style="font-size:0.75rem; color:var(--text-secondary); margin-bottom:1.5rem;">
|
||
Ready in 15 minutes
|
||
</div>
|
||
|
||
<div class="summary-header">CONFIGURATION SUMMARY</div>
|
||
|
||
<div class="summary-row">
|
||
<span class="label">CPU</span>
|
||
<span class="val" id="summaryCpu">-</span>
|
||
</div>
|
||
<div class="summary-row">
|
||
<span class="label">RAM</span>
|
||
<span class="val" id="summaryRam">-</span>
|
||
</div>
|
||
<div class="summary-row">
|
||
<span class="label">Storage</span>
|
||
<span class="val" id="summaryStorage">-</span>
|
||
</div>
|
||
<div class="summary-row">
|
||
<span class="label">Network</span>
|
||
<span class="val" id="summaryNetwork">-</span>
|
||
</div>
|
||
<div class="summary-row">
|
||
<span class="label">Location</span>
|
||
<span class="val" id="summaryLocation">-</span>
|
||
</div>
|
||
|
||
<div class="total-row">
|
||
<span class="label">Est. Monthly</span>
|
||
<span class="amount" id="totalPrice">€0</span>
|
||
</div>
|
||
|
||
<div class="action-buttons">
|
||
<a href="#" class="btn btn-success" id="orderBtn">Deploy Now →</a>
|
||
<a href="#" class="btn btn-primary" id="configureBtn" style="display:none;">Request Custom Build →</a>
|
||
<a href="https://portal.dedicatednodes.io/contact.php" class="btn btn-outline">Contact Sales</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Main Specifications -->
|
||
<section class="main-specs" id="specs">
|
||
<div class="container">
|
||
<div class="specs-header">
|
||
<h2 class="specs-title">Technical specifications</h2>
|
||
<p class="specs-subtitle">Enterprise-grade hardware configured for maximum performance</p>
|
||
</div>
|
||
|
||
<div class="specs-layout">
|
||
<div class="specs-grid">
|
||
<!-- Processor Card -->
|
||
<div class="spec-card">
|
||
<div class="spec-card-header">
|
||
<div class="spec-icon">🖥️</div>
|
||
<h3 class="spec-card-title">Processor</h3>
|
||
</div>
|
||
<div class="spec-details">
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Model</span>
|
||
<span class="spec-detail-value" id="spec-cpu-model">AMD Ryzen Threadripper PRO 9975WX</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Cores / Threads</span>
|
||
<span class="spec-detail-value highlight" id="spec-cpu-cores">32 / 64</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Base Clock</span>
|
||
<span class="spec-detail-value" id="spec-cpu-base">3.5 GHz</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Boost Clock</span>
|
||
<span class="spec-detail-value" id="spec-cpu-boost">5.4 GHz</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Cache</span>
|
||
<span class="spec-detail-value" id="spec-cpu-cache">128MB L3</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Architecture</span>
|
||
<span class="spec-detail-value" id="spec-cpu-arch">Zen 4</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Memory Card -->
|
||
<div class="spec-card">
|
||
<div class="spec-card-header">
|
||
<div class="spec-icon">💾</div>
|
||
<h3 class="spec-card-title">Memory</h3>
|
||
</div>
|
||
<div class="spec-details">
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Capacity</span>
|
||
<span class="spec-detail-value highlight" id="spec-ram-capacity">384GB - 2304GB DDR5</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Speed</span>
|
||
<span class="spec-detail-value" id="spec-ram-speed">6400 MT/s</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Channels</span>
|
||
<span class="spec-detail-value" id="spec-ram-channels">8-channel</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">ECC Support</span>
|
||
<span class="spec-detail-value">Yes</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Configuration</span>
|
||
<span class="spec-detail-value">Fully Customizable</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Upgradeable</span>
|
||
<span class="spec-detail-value">Yes</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Storage Card -->
|
||
<div class="spec-card">
|
||
<div class="spec-card-header">
|
||
<div class="spec-icon">💿</div>
|
||
<h3 class="spec-card-title">Storage</h3>
|
||
</div>
|
||
<div class="spec-details">
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Configuration</span>
|
||
<span class="spec-detail-value highlight" id="spec-storage-config">Configurable up to 12x NVMe Gen5</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Read Speed</span>
|
||
<span class="spec-detail-value">Up to 14,000 MB/s</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Write Speed</span>
|
||
<span class="spec-detail-value">Up to 12,000 MB/s</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Interface</span>
|
||
<span class="spec-detail-value">NVMe PCIe Gen5</span>
|
||
</div>
|
||
</div>
|
||
<div class="spec-options">
|
||
<div class="spec-option">Kioxia CM7-V (Enterprise Gen5)</div>
|
||
<div class="spec-option">Solidigm D7-PS1030 (Enterprise Gen5)</div>
|
||
<div class="spec-option">Crucial T705 (Consumer Gen5)</div>
|
||
<div class="spec-option">Up to 12x NVMe drives</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Network Card -->
|
||
<div class="spec-card">
|
||
<div class="spec-card-header">
|
||
<div class="spec-icon">🌐</div>
|
||
<h3 class="spec-card-title">Network</h3>
|
||
</div>
|
||
<div class="spec-details">
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Speed</span>
|
||
<span class="spec-detail-value highlight" id="spec-network-speed">2x 10Gbps</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Bandwidth</span>
|
||
<span class="spec-detail-value" id="spec-network-bandwidth">335TB</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">IPv4 addresses</span>
|
||
<span class="spec-detail-value">1-32 addresses</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">IPv6 Block</span>
|
||
<span class="spec-detail-value">/64 block</span>
|
||
</div>
|
||
<div class="spec-detail">
|
||
<span class="spec-detail-label">Uplink</span>
|
||
<span class="spec-detail-value">Redundant</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Sidebar -->
|
||
<div class="specs-sidebar">
|
||
<!-- Pricing Card -->
|
||
<div class="pricing-card">
|
||
<div class="pricing-label">Starting from</div>
|
||
<div class="pricing-amount">€1050</div>
|
||
<div class="pricing-period">per month</div>
|
||
|
||
<a href="#calculator" class="btn-order">
|
||
Configure server →
|
||
</a>
|
||
</div>
|
||
|
||
<!-- Quick Features -->
|
||
<div class="sidebar-card">
|
||
<h3 class="sidebar-card-title">Key features</h3>
|
||
<div class="quick-features">
|
||
<div class="quick-feature">
|
||
<span class="quick-feature-icon">🚀</span>
|
||
<span>Instant deployment</span>
|
||
</div>
|
||
<div class="quick-feature">
|
||
<span class="quick-feature-icon">🔧</span>
|
||
<span>IPMI 2.0 with KVM</span>
|
||
</div>
|
||
<div class="quick-feature">
|
||
<span class="quick-feature-icon">📊</span>
|
||
<span>100% uptime in 2025</span>
|
||
</div>
|
||
<div class="quick-feature">
|
||
<span class="quick-feature-icon">💬</span>
|
||
<span>24/7 expert support</span>
|
||
</div>
|
||
<div class="quick-feature">
|
||
<span class="quick-feature-icon">🔐</span>
|
||
<span>Full root access</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Features Section -->
|
||
<section class="features-section">
|
||
<div class="container">
|
||
<div class="specs-header">
|
||
<h2 class="specs-title">Everything you need</h2>
|
||
<p class="specs-subtitle">Complete infrastructure solution with enterprise support</p>
|
||
</div>
|
||
|
||
<div class="features-grid">
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">💿</span>
|
||
<h3 class="feature-title">Operating system</h3>
|
||
<p class="feature-description">Linux, Windows, custom images</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">💾</span>
|
||
<h3 class="feature-title">Backup storage</h3>
|
||
<p class="feature-description">Optional managed backups available</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">👥</span>
|
||
<h3 class="feature-title">24/7 support</h3>
|
||
<p class="feature-description">Expert human support, no chatbots</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">✅</span>
|
||
<h3 class="feature-title">SLA guarantee</h3>
|
||
<p class="feature-description">100% uptime in 2025</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">🔐</span>
|
||
<h3 class="feature-title">Secure infrastructure</h3>
|
||
<p class="feature-description">Enterprise-grade security</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">🔧</span>
|
||
<h3 class="feature-title">IPMI access</h3>
|
||
<p class="feature-description">Full remote management</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">⚡</span>
|
||
<h3 class="feature-title">Instant setup</h3>
|
||
<p class="feature-description">Deploy in minutes</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<span class="feature-emoji">🌍</span>
|
||
<h3 class="feature-title">Global network</h3>
|
||
<p class="feature-description">Multiple locations worldwide</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Locations -->
|
||
|
||
|
||
<!-- Strategic Locations Section with Network Map -->
|
||
<section class="locations" id="locations">
|
||
<div class="container">
|
||
<header class="locations-header">
|
||
<h2 class="locations-title">Strategic locations</h2>
|
||
</header>
|
||
<div class="locations-intro">
|
||
<p class="locations-description">
|
||
Optimized global presence with ultra-low latency connections directly to Jito and major blockchain networks. We operate our own network backbone to ensure consistent performance and reliability under AS214783.
|
||
</p>
|
||
</div>
|
||
|
||
<div class="location-badges">
|
||
<span class="loc-badge loc-badge-future" data-tooltip="Opening December 2025">
|
||
<span class="flag-icon">🇳🇱</span>
|
||
Amsterdam
|
||
<svg class="future-icon" width="14" height="14" viewBox="0 0 16 16" fill="currentColor" style="opacity: 0.5; margin-left: 4px; vertical-align: middle;">
|
||
<path d="M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71V3.5z"/>
|
||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm7-8A7 7 0 1 1 1 8a7 7 0 0 1 14 0z"/>
|
||
</svg>
|
||
</span>
|
||
<span class="loc-badge">
|
||
<span class="flag-icon">🇳🇱</span>
|
||
Rotterdam
|
||
</span>
|
||
<span class="loc-badge">
|
||
<span class="flag-icon">🇩🇪</span>
|
||
Frankfurt
|
||
</span>
|
||
<span class="loc-badge">
|
||
<span class="flag-icon">🇬🇧</span>
|
||
London
|
||
</span>
|
||
<span class="loc-badge">
|
||
<span class="flag-icon">🇺🇸</span>
|
||
New York
|
||
</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="map-container">
|
||
<div id="world-map-canvas" role="img" aria-label="Interactive world map showing our datacenter locations"></div>
|
||
|
||
<div class="map-controls">
|
||
<h3 class="controls-title">
|
||
<span class="pulse"></span>
|
||
Live latency
|
||
</h3>
|
||
<div class="activity-list">
|
||
<div class="activity-row activity-row-future" data-tooltip="Opening December 2025">
|
||
<span class="activity-route">Amsterdam → Jito</span>
|
||
<span class="activity-latency">0.1ms</span>
|
||
</div>
|
||
<div class="activity-row">
|
||
<span class="activity-route">Rotterdam → Jito</span>
|
||
<span class="activity-latency">1.6ms</span>
|
||
</div>
|
||
<div class="activity-row">
|
||
<span class="activity-route">Frankfurt → Jito</span>
|
||
<span class="activity-latency">0.6ms</span>
|
||
</div>
|
||
<div class="activity-row">
|
||
<span class="activity-route">London → Jito</span>
|
||
<span class="activity-latency">0.2ms</span>
|
||
</div>
|
||
<div class="activity-row">
|
||
<span class="activity-route">New York → Jito</span>
|
||
<span class="activity-latency">0.1ms</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="stats-bar">
|
||
<div class="container">
|
||
<div class="stats-grid">
|
||
<div class="stat">
|
||
<div class="stat-value">5</div>
|
||
<div class="stat-label">Global Locations</div>
|
||
</div>
|
||
<div class="stat">
|
||
<div class="stat-value">0.1ms</div>
|
||
<div class="stat-label">Lowest Latency</div>
|
||
</div>
|
||
<div class="stat">
|
||
<div class="stat-value">100%</div>
|
||
<div class="stat-label">Uptime in 2025</div>
|
||
</div>
|
||
<div class="stat">
|
||
<div class="stat-value">24/7</div>
|
||
<div class="stat-label">Support</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- MapLibre Script -->
|
||
<script src='https://unpkg.com/maplibre-gl@3.6.2/dist/maplibre-gl.js'></script>
|
||
<link href='https://unpkg.com/maplibre-gl@3.6.2/dist/maplibre-gl.css' rel='stylesheet' />
|
||
<script src="/wp-content/themes/dedicatednodes/assets/js/locations.js"></script>
|
||
|
||
|
||
<!-- Final CTA -->
|
||
<section class="final-cta">
|
||
<div class="container">
|
||
<div class="cta-content">
|
||
<h2 class="cta-title">Ready to deploy?</h2>
|
||
<p class="cta-subtitle">Get your AMD Ryzen Threadripper PRO 9975WX server running in minutes</p>
|
||
|
||
<div class="cta-actions">
|
||
<a href="https://portal.dedicatednodes.io/order/bareserver" class="btn-cta-white">
|
||
Start configuration
|
||
</a>
|
||
<a href="https://portal.dedicatednodes.io/contact" class="btn-cta-outline">
|
||
Talk to sales
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
</main>
|
||
|
||
<footer id="colophon" class="site-footer">
|
||
<div class="container pb-5">
|
||
<div class="row">
|
||
<div class="col-lg-4">
|
||
<a href="https://www.dedicatednodes.io">
|
||
<img src="https://www.dedicatednodes.io/wp-content/uploads/2024/04/LOGO-white.png">
|
||
</a>
|
||
<p>Engineer innovative solutions that go above and beyond the ordinary. </p>
|
||
<div class="d-flex gap-3">
|
||
<a href="https://www.x.com/dedicatednodes">
|
||
<img src="https://www.dedicatednodes.io/wp-content/uploads/2024/04/x.png">
|
||
</a>
|
||
<a href="https://discord.gg/tH8mhfpT8G">
|
||
<img src="https://www.dedicatednodes.io/wp-content/uploads/2024/08/8725815_discord_icon-1-1.png">
|
||
</a>
|
||
<a href="https://www.trustpilot.com/review/dedicatednodes.io">
|
||
<img src="https://www.dedicatednodes.io/wp-content/uploads/2025/11/trustpilot.png">
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-lg-8">
|
||
<div class="d-flex justify-content-between mt-lg-0 mt-5">
|
||
<div>
|
||
<div class="d-flex justify-content-lg-end justify-content-center">
|
||
<div class="footer-title">Technical support</div>
|
||
</div>
|
||
<div class="d-flex justify-content-lg-end justify-content-center">
|
||
<a href="https://portal.dedicatednodes.io/contact.php" class="btn outline">Support</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div>
|
||
<div class="d-flex justify-content-lg-end justify-content-center">
|
||
<div class="footer-title">We are here to help you</div>
|
||
</div>
|
||
<div class="d-flex justify-content-lg-end justify-content-center">
|
||
<a href="https://portal.dedicatednodes.io/contact.php" class="btn fill">Contact us</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<hr>
|
||
<div class="container">
|
||
<div class="footer-bottom">
|
||
<div class="d-flex justify-content-between flex-column flex-lg-row text-center">
|
||
<div>@2025 all right reserved</div>
|
||
<div class="site-info">
|
||
<a href="/privacy-policy/" target="">
|
||
Privacy Policy </a><span class="sep"> | </span>
|
||
<a href="/terms-of-condition/" target="">
|
||
Terms of condition </a><span class="sep"> | </span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
<script type="speculationrules">
|
||
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/dedicatednodes/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
|
||
</script>
|
||
<script src="https://www.dedicatednodes.io/wp-includes/js/dist/hooks.min.js?ver=dd5603f07f9220ed27f1" id="wp-hooks-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-includes/js/dist/i18n.min.js?ver=c26c3dc7bed366793375" id="wp-i18n-js"></script>
|
||
<script id="wp-i18n-js-after">
|
||
wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
|
||
//# sourceURL=wp-i18n-js-after
|
||
</script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.1.2" id="swv-js"></script>
|
||
<script id="contact-form-7-js-before">
|
||
var wpcf7 = {
|
||
"api": {
|
||
"root": "https:\/\/www.dedicatednodes.io\/wp-json\/",
|
||
"namespace": "contact-form-7\/v1"
|
||
}
|
||
};
|
||
//# sourceURL=contact-form-7-js-before
|
||
</script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.1.2" id="contact-form-7-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/bootstrap.min.js?ver=1764837370" id="wpddn-bootstrap-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/bootstrap.bundle.min.js?ver=1764837370" id="wpddn-bootstrap-bundle-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/slick.js?ver=1764837370" id="wpddn-slick-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/aos.js?ver=1764837370" id="wpddn-aos-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/tippy.min.js?ver=1764837370" id="wpddn-tippy-min-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/navigation.js?ver=1764837370" id="dedicatednodes-navigation-js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/intl-tel-input@22.0.2/build/js/intlTelInput.min.js?ver=1764837370" id="intl-tel-input-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/phone-form-utils.js?ver=1764837370" id="phone-form-utils-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/order-server.js?ver=1764837370" id="order-server-js"></script>
|
||
<script src="https://www.dedicatednodes.io/wp-content/themes/dedicatednodes/assets/js/wpddn-public.js?ver=1764837370" id="wpddn-public-js"></script>
|
||
<script id="wp-emoji-settings" type="application/json">
|
||
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://www.dedicatednodes.io/wp-includes/js/wp-emoji-release.min.js?ver=6.9"}}
|
||
</script>
|
||
<script>
|
||
// Server Data - Instant Servers (Matched to Image 2)
|
||
const instantServers = [
|
||
{ id: 'inst-1', cpu: 'AMD Threadripper PRO 9975WX', cores: 32, ghz: '5.4', baseClock: '3.6 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: '384GB DDR5', ramSpeed: '4800 MT/s', ramChannels: '8-channel', storage: '2x 2TB NVMe', network: '2x 10Gbps', bandwidth: 'Unmetered', location: 'London', price: 1050, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=50' },
|
||
{ id: 'inst-2', cpu: 'AMD Threadripper PRO 9975WX', cores: 32, ghz: '5.4', baseClock: '3.6 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: '768GB DDR5', ramSpeed: '4800 MT/s', ramChannels: '8-channel', storage: '4x 2TB NVMe', network: '2x 10Gbps', bandwidth: 'Unmetered', location: 'Frankfurt', price: 1450, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=50' },
|
||
{ id: 'inst-3', cpu: 'AMD Threadripper PRO 9975WX', cores: 32, ghz: '5.4', baseClock: '3.6 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: '1.5TB DDR5', ramSpeed: '4800 MT/s', ramChannels: '8-channel', storage: '4x 2TB NVMe', network: '2x 10Gbps', bandwidth: 'Unmetered', location: 'New York', price: 2150, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=50' },
|
||
{ id: 'inst-4', cpu: 'AMD Threadripper PRO 7965WX', cores: 24, ghz: '5.3', baseClock: '4.2 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: '768GB DDR5', ramSpeed: '4800 MT/s', ramChannels: '8-channel', storage: '2x 1TB + 4x 1.6TB NVMe', network: '10Gbps', bandwidth: 'Unmetered', location: 'Rotterdam', price: 1576, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=37' },
|
||
{ id: 'inst-5', cpu: 'AMD Threadripper PRO 7965WX', cores: 24, ghz: '5.3', baseClock: '4.2 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: '768GB DDR5', ramSpeed: '4800 MT/s', ramChannels: '8-channel', storage: '4x 2TB NVMe', network: '10Gbps', bandwidth: 'Unmetered', location: 'Rotterdam', price: 1520, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=37' },
|
||
{ id: 'inst-6', cpu: 'AMD Threadripper PRO 7965WX', cores: 24, ghz: '5.3', baseClock: '4.2 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: '768GB DDR5', ramSpeed: '4800 MT/s', ramChannels: '8-channel', storage: '1x 1TB + 4x 1.6TB NVMe', network: '10Gbps', bandwidth: 'Unmetered', location: 'Frankfurt', price: 1540, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=37' },
|
||
{ id: 'inst-7', cpu: 'AMD EPYC 9274F', cores: 24, ghz: '4.1', baseClock: '4.05 GHz', boostClock: '4.3', cache: '256MB L3', arch: 'Zen 4', ram: '384GB DDR5', ramSpeed: '4800 MT/s', ramChannels: '12-channel', storage: '2x 2TB NVMe', network: '10Gbps', bandwidth: 'Unmetered', location: 'Rotterdam', price: 650, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=50' },
|
||
{ id: 'inst-8', cpu: 'AMD EPYC 9174F', cores: 16, ghz: '4.1', baseClock: '4.1 GHz', boostClock: '4.4', cache: '256MB L3', arch: 'Zen 4', ram: '256GB DDR5', ramSpeed: '4800 MT/s', ramChannels: '12-channel', storage: '2x 2TB NVMe', network: '10Gbps', bandwidth: 'Unmetered', location: 'Rotterdam', price: 490, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=50' },
|
||
{ id: 'inst-9', cpu: 'AMD EPYC 7443P', cores: 24, ghz: '4.0', baseClock: '2.85 GHz', boostClock: '4.0', cache: '128MB L3', arch: 'Zen 3', ram: '256GB DDR4', ramSpeed: '3200 MT/s', ramChannels: '8-channel', storage: '2x 2TB NVMe', network: '10Gbps', bandwidth: 'Unmetered', location: 'Rotterdam', price: 420, currency: '€', orderUrl: 'https://portal.dedicatednodes.io/cart.php?a=add&pid=50' },
|
||
];
|
||
|
||
// Custom Servers (Matched to Image 3)
|
||
const customServers = [
|
||
{ id: 'custom-1', cpu: 'AMD Threadripper PRO 9975WX', cores: 32, ghz: '5.4', baseClock: '3.6 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: 'Base: 256GB', ramSpeed: '4800 MT/s', ramChannels: '8-channel', basePrice: 850, currency: '€', configUrl: 'https://portal.dedicatednodes.io/index.php?rp=/store/bare-metal-servers/amd-ryzen-threadripper-pro-9975wx', setupTime: 'Instant', limits: { gen4: 3, gen5: 8 } },
|
||
{ id: 'custom-2', cpu: 'AMD Threadripper PRO 7965WX', cores: 24, ghz: '5.3', baseClock: '4.2 GHz', boostClock: '5.3', cache: '128MB L3', arch: 'Zen 4', ram: 'Base: 256GB', ramSpeed: '4800 MT/s', ramChannels: '8-channel', basePrice: 650, currency: '€', configUrl: 'https://portal.dedicatednodes.io/index.php?rp=/store/bare-metal-servers/amd-ryzen-threadripper-pro-7965wx', setupTime: '1 Day', limits: { gen4: 3, gen5: 8 } },
|
||
{ id: 'custom-3', cpu: 'AMD EPYC 9274F', cores: 24, ghz: '4.1', baseClock: '4.05 GHz', boostClock: '4.3', cache: '256MB L3', arch: 'Zen 4', ram: 'Base: 256GB', ramSpeed: '4800 MT/s', ramChannels: '12-channel', basePrice: 450, currency: '€', configUrl: 'https://portal.dedicatednodes.io/index.php?rp=/store/bare-metal-servers/amd-epyc-9274f', setupTime: '1 Day', limits: { gen4: 3, gen5: 8 } },
|
||
{ id: 'custom-4', cpu: 'AMD EPYC 7443P', cores: 24, ghz: '4.0', baseClock: '2.85 GHz', boostClock: '4.0', cache: '128MB L3', arch: 'Zen 3', ram: 'Base: 128GB', ramSpeed: '3200 MT/s', ramChannels: '8-channel', basePrice: 350, currency: '€', configUrl: 'https://portal.dedicatednodes.io/index.php?rp=/store/bare-metal-servers/amd-epyc-7443p-1', setupTime: 'Instant', limits: { gen4: 4, gen5: 0 } },
|
||
];
|
||
|
||
// State
|
||
let selectedServer = null;
|
||
let currentTab = 'instant';
|
||
let configState = {};
|
||
let configIds = {};
|
||
let storageSelection = {}; // Track individual drive quantities
|
||
|
||
// --- WHMCS Scraper Class ---
|
||
class WHMCSScraper {
|
||
constructor() {
|
||
this.proxyUrl = 'https://corsproxy.io/?';
|
||
}
|
||
|
||
async getProductConfig(configUrl) {
|
||
try {
|
||
console.log(`Fetching ${configUrl}...`);
|
||
|
||
// Always fetch fresh for "constantly checking"
|
||
// const cacheKey = `whmcs_config_v10_${configUrl}`;
|
||
// ... caching removed for real-time requirement ...
|
||
|
||
const response = await fetch(this.proxyUrl + encodeURIComponent(configUrl));
|
||
const html = await response.text();
|
||
const doc = new DOMParser().parseFromString(html, 'text/html');
|
||
|
||
let cartUrl = configUrl;
|
||
// Check if we are already on a config page (inputs present)
|
||
if (doc.querySelector('input[name^="configoption"]') || doc.querySelector('select[name^="configoption"]')) {
|
||
console.log("Direct config page detected");
|
||
const options = this.parseConfigPage(doc, configUrl);
|
||
return { options, url: configUrl };
|
||
}
|
||
|
||
const configureBtn = doc.querySelector('a[href*="cart.php?a=add"]');
|
||
if (configureBtn) {
|
||
const href = configureBtn.getAttribute('href');
|
||
cartUrl = href.startsWith('http') ? href : 'https://portal.dedicatednodes.io/' + href;
|
||
console.log(`Found cart URL: ${cartUrl}`);
|
||
const cartResp = await fetch(this.proxyUrl + encodeURIComponent(cartUrl));
|
||
const cartHtml = await cartResp.text();
|
||
const cartDoc = new DOMParser().parseFromString(cartHtml, 'text/html');
|
||
const options = this.parseConfigPage(cartDoc, cartUrl);
|
||
return { options, url: cartUrl };
|
||
}
|
||
|
||
throw new Error("Could not find configuration form");
|
||
} catch (error) {
|
||
console.error("Scraping error:", error);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
parseConfigPage(doc, sourceUrl) {
|
||
const options = [];
|
||
|
||
// Parse Configurable Options
|
||
const selects = doc.querySelectorAll('select[name^="configoption"]');
|
||
selects.forEach(select => {
|
||
const name = select.getAttribute('name');
|
||
const idMatch = name.match(/\[(\d+)\]/);
|
||
const id = idMatch ? idMatch[1] : name;
|
||
|
||
let label = "Option";
|
||
// Try to find label: previous sibling or parent's label
|
||
const labelElem = select.previousElementSibling?.tagName === 'LABEL' ? select.previousElementSibling :
|
||
select.parentElement.querySelector('label');
|
||
|
||
if (labelElem) {
|
||
label = labelElem.innerText.trim().replace(':', '');
|
||
} else {
|
||
// Fallback: try to find text node before
|
||
let prev = select.previousSibling;
|
||
while(prev && prev.nodeType !== 3) prev = prev.previousSibling;
|
||
if(prev) label = prev.textContent.trim().replace(':', '');
|
||
}
|
||
|
||
const values = [];
|
||
select.querySelectorAll('option').forEach(opt => {
|
||
const valId = opt.value;
|
||
const text = opt.textContent;
|
||
|
||
let price = 0;
|
||
const priceMatch = text.match(/([+-]?)[€$£]?\s?([0-9.,]+)/);
|
||
if (text.includes('+') && priceMatch) {
|
||
price = parseFloat(priceMatch[2].replace(',', ''));
|
||
}
|
||
|
||
values.push({ id: valId, text: text, price: price, raw: text });
|
||
});
|
||
|
||
let type = 'other';
|
||
const lowerLabel = label.toLowerCase();
|
||
if (lowerLabel.includes('memory') || lowerLabel.includes('ram')) type = 'ram';
|
||
else if (lowerLabel.includes('nvme') || lowerLabel.includes('disk') || lowerLabel.includes('storage')) type = 'storage';
|
||
else if (lowerLabel.includes('location') || lowerLabel.includes('region')) type = 'location';
|
||
else if (lowerLabel.includes('network') || lowerLabel.includes('bandwidth') || lowerLabel.includes('uplink')) type = 'network';
|
||
|
||
options.push({ id, label, type, values, formName: name });
|
||
});
|
||
return options;
|
||
}
|
||
}
|
||
|
||
const scraper = new WHMCSScraper();
|
||
|
||
// Update Technical Specs Section
|
||
function updateSpecs(server) {
|
||
const set = (id, val) => {
|
||
const el = document.getElementById(id);
|
||
if(el) el.innerText = val;
|
||
};
|
||
|
||
set('spec-cpu-model', server.cpu);
|
||
set('spec-cpu-cores', `${server.cores} Cores / ${server.cores * 2} Threads`);
|
||
set('spec-cpu-base', server.baseClock || '-');
|
||
set('spec-cpu-boost', server.boostClock ? `${server.boostClock} GHz` : '-');
|
||
set('spec-cpu-cache', server.cache || '-');
|
||
set('spec-cpu-arch', server.arch || '-');
|
||
|
||
set('spec-ram-capacity', server.ram);
|
||
set('spec-ram-speed', server.ramSpeed || '4800 MT/s');
|
||
set('spec-ram-channels', server.ramChannels || '8-channel');
|
||
|
||
set('spec-storage-config', server.storage || 'Configurable');
|
||
|
||
set('spec-network-speed', server.network || '10Gbps');
|
||
set('spec-network-bandwidth', server.bandwidth || 'Unmetered');
|
||
}
|
||
|
||
// Render Instant Servers
|
||
function renderInstantServers() {
|
||
const grid = document.getElementById('instantServersGrid');
|
||
grid.innerHTML = instantServers.map(server => `
|
||
<div class="server-option instant ${selectedServer?.id === server.id ? 'active' : ''}" data-id="${server.id}" onclick="selectInstantServer('${server.id}')">
|
||
<div class="server-badge instant">⚡ INSTANT</div>
|
||
<div class="server-title">${server.cpu}</div>
|
||
<div class="server-specs-row">
|
||
<span class="spec-pill">${server.cores} cores</span>
|
||
<span class="spec-pill">${server.ghz} GHz</span>
|
||
<span class="spec-pill">${server.ram}</span>
|
||
<span class="spec-pill">${server.storage}</span>
|
||
</div>
|
||
<div class="server-meta-row">
|
||
<div class="server-location">📍 ${server.location}</div>
|
||
<div class="server-price-display">${server.currency}${server.price}<small>/mo</small></div>
|
||
</div>
|
||
</div>
|
||
`).join('');
|
||
}
|
||
|
||
// Render Custom Servers
|
||
function renderCustomServers() {
|
||
const grid = document.getElementById('customServersGrid');
|
||
grid.innerHTML = customServers.map(server => `
|
||
<div class="server-option custom ${selectedServer?.id === server.id ? 'active' : ''}" data-id="${server.id}" onclick="selectCustomServer('${server.id}')">
|
||
<div class="server-top-row">
|
||
<div class="server-badge custom">BUILD</div>
|
||
<div class="server-price-display" style="font-size:0.9rem;">From ${server.currency}${server.basePrice}<small>/mo</small></div>
|
||
</div>
|
||
<div class="server-title">${server.cpu}</div>
|
||
<div class="server-specs-row">
|
||
<span class="spec-pill">${server.cores} cores</span>
|
||
<span class="spec-pill">${server.ghz} GHz</span>
|
||
<span class="spec-pill">${server.ram}</span>
|
||
</div>
|
||
<div class="server-meta-row">
|
||
<div>⏱️ Setup: ${server.setupTime}</div>
|
||
</div>
|
||
</div>
|
||
`).join('');
|
||
}
|
||
|
||
// Select Instant Server
|
||
function selectInstantServer(id) {
|
||
selectedServer = instantServers.find(s => s.id === id);
|
||
renderInstantServers();
|
||
updateSummary();
|
||
updateSpecs(selectedServer);
|
||
}
|
||
|
||
// Select Custom Server
|
||
async function selectCustomServer(id) {
|
||
selectedServer = customServers.find(s => s.id === id);
|
||
renderCustomServers();
|
||
updateSpecs(selectedServer);
|
||
|
||
const optionsContainer = document.getElementById('customOptions');
|
||
optionsContainer.style.display = 'block';
|
||
|
||
const loader = document.getElementById('configLoader');
|
||
const dynamicContainer = document.getElementById('dynamicConfigContainer');
|
||
|
||
// Show loader, hide container
|
||
loader.style.display = 'flex';
|
||
dynamicContainer.innerHTML = '';
|
||
|
||
optionsContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
||
|
||
// Reset selections
|
||
configState = {};
|
||
storageSelection = {};
|
||
|
||
// Fetch real-time options
|
||
const optionsData = await scraper.getProductConfig(selectedServer.configUrl);
|
||
|
||
loader.style.display = 'none';
|
||
|
||
if (optionsData && optionsData.options.length > 0) {
|
||
renderDynamicOptions(optionsData.options);
|
||
} else {
|
||
// Fallback if scrape fails
|
||
console.warn("Scrape failed, using fallback");
|
||
renderFallbackOptions(dynamicContainer);
|
||
}
|
||
|
||
updateSummary();
|
||
}
|
||
|
||
function renderFallbackOptions(container) {
|
||
let html = '';
|
||
|
||
// 1. RAM Configuration
|
||
html += '<div class="section-label" style="margin-top:1rem;">💾 RAM Configuration</div>';
|
||
html += '<div class="config-grid wide">';
|
||
const ramOptions = [
|
||
{ name: '128 GB ECC', price: 0 },
|
||
{ name: '256 GB ECC', price: 100 },
|
||
{ name: '384 GB ECC', price: 200 },
|
||
{ name: '512 GB ECC', price: 400 },
|
||
{ name: '768 GB ECC', price: 600 },
|
||
{ name: '1.5 TB ECC', price: 1300 }
|
||
];
|
||
|
||
ramOptions.forEach((opt, idx) => {
|
||
const priceText = opt.price === 0 ? 'Included' : `+€${opt.price}`;
|
||
const priceClass = opt.price === 0 ? 'included' : '';
|
||
const activeClass = idx === 1 ? 'active' : '';
|
||
|
||
html += `
|
||
<div class="config-card ${activeClass}" onclick="selectFallbackOption(this, 'ram', '${opt.name}', ${opt.price})">
|
||
<div class="option-name">${opt.name}</div>
|
||
<div class="option-price ${priceClass}">${priceText}</div>
|
||
</div>`;
|
||
|
||
if(idx === 1) {
|
||
configState['RAM Configuration'] = opt.price;
|
||
setTimeout(() => { document.getElementById('summaryRam').textContent = opt.name; updateSummary(); }, 0);
|
||
}
|
||
});
|
||
html += '</div>';
|
||
|
||
// 2. Storage Configuration (Split by Gen4 / Gen5)
|
||
const limits = selectedServer.limits || { gen4: 3, gen5: 8 };
|
||
|
||
// --- Gen4 Section ---
|
||
if (limits.gen4 > 0) {
|
||
html += '<div class="section-label" style="margin-top:1rem;">💿 Gen4 NVMe Storage (Consumer)</div>';
|
||
html += `
|
||
<div class="storage-slots-container">
|
||
<div class="slots-header">
|
||
<span>Available Slots: <strong id="slotsCount-gen4">0/${limits.gen4}</strong></span>
|
||
<span id="slotsStatus-gen4" style="color:var(--success); font-size:0.75rem;">Select drives</span>
|
||
</div>
|
||
<div class="slots-visual" id="slotsVisual-gen4">
|
||
${Array(limits.gen4).fill('<div class="drive-slot"></div>').join('')}
|
||
</div>
|
||
</div>`;
|
||
|
||
html += '<div class="config-grid">';
|
||
const gen4Drives = [
|
||
{ id: 'nvme-1tb-g4', name: '1 TB NVMe Gen4', price: 40 },
|
||
{ id: 'nvme-2tb-g4', name: '2 TB NVMe Gen4', price: 75 },
|
||
{ id: 'nvme-4tb-g4', name: '4 TB NVMe Gen4', price: 140 }
|
||
];
|
||
|
||
gen4Drives.forEach((drive) => {
|
||
html += `
|
||
<div class="config-card has-stepper" id="card-${drive.id}">
|
||
<div class="option-name">${drive.name}</div>
|
||
<div class="option-price">+€${drive.price}</div>
|
||
<div class="qty-stepper">
|
||
<button class="btn-qty" onclick="event.stopPropagation(); updateStorageQty('${drive.id}', -1, ${drive.price}, '${drive.name}', 'gen4', ${limits.gen4})">-</button>
|
||
<span class="qty-val" id="qty-${drive.id}">0</span>
|
||
<button class="btn-qty" onclick="event.stopPropagation(); updateStorageQty('${drive.id}', 1, ${drive.price}, '${drive.name}', 'gen4', ${limits.gen4})">+</button>
|
||
</div>
|
||
</div>`;
|
||
});
|
||
html += '</div>';
|
||
}
|
||
|
||
// --- Gen5 Section ---
|
||
if (limits.gen5 > 0) {
|
||
html += '<div class="section-label" style="margin-top:1rem;">🚀 Gen5 NVMe Storage (Enterprise)</div>';
|
||
html += `
|
||
<div class="storage-slots-container">
|
||
<div class="slots-header">
|
||
<span>Available Slots: <strong id="slotsCount-gen5">0/${limits.gen5}</strong></span>
|
||
<span id="slotsStatus-gen5" style="color:var(--success); font-size:0.75rem;">Select drives</span>
|
||
</div>
|
||
<div class="slots-visual" id="slotsVisual-gen5">
|
||
${Array(limits.gen5).fill('<div class="drive-slot"></div>').join('')}
|
||
</div>
|
||
</div>`;
|
||
|
||
html += '<div class="config-grid">';
|
||
const gen5Drives = [
|
||
{ id: 'nvme-2tb-g5', name: '2 TB NVMe Gen5 Ent', price: 180 },
|
||
{ id: 'nvme-4tb-g5', name: '4 TB NVMe Gen5 Ent', price: 350 },
|
||
{ id: 'nvme-8tb-g5', name: '8 TB NVMe Gen5 Ent', price: 650 }
|
||
];
|
||
|
||
gen5Drives.forEach((drive) => {
|
||
html += `
|
||
<div class="config-card has-stepper" id="card-${drive.id}">
|
||
<div class="option-name">${drive.name}</div>
|
||
<div class="option-price">+€${drive.price}</div>
|
||
<div class="qty-stepper">
|
||
<button class="btn-qty" onclick="event.stopPropagation(); updateStorageQty('${drive.id}', -1, ${drive.price}, '${drive.name}', 'gen5', ${limits.gen5})">-</button>
|
||
<span class="qty-val" id="qty-${drive.id}">0</span>
|
||
<button class="btn-qty" onclick="event.stopPropagation(); updateStorageQty('${drive.id}', 1, ${drive.price}, '${drive.name}', 'gen5', ${limits.gen5})">+</button>
|
||
</div>
|
||
</div>`;
|
||
});
|
||
html += '</div>';
|
||
}
|
||
|
||
// 3. Location
|
||
html += '<div class="section-label" style="margin-top:1rem;">📍 Data Center Location</div>';
|
||
html += '<div class="config-grid">';
|
||
const locOptions = [
|
||
{ name: 'Rotterdam, NL', price: 0 },
|
||
{ name: 'Frankfurt, DE', price: 50 },
|
||
{ name: 'London, UK', price: 50 },
|
||
{ name: 'New York, US', price: 100 },
|
||
{ name: 'Amsterdam, NL', price: 20 }
|
||
];
|
||
|
||
locOptions.forEach((opt, idx) => {
|
||
const priceText = opt.price === 0 ? 'Included' : `+€${opt.price}`;
|
||
const priceClass = opt.price === 0 ? 'included' : '';
|
||
const activeClass = idx === 0 ? 'active' : '';
|
||
|
||
html += `
|
||
<div class="config-card ${activeClass}" onclick="selectFallbackOption(this, 'location', '${opt.name}', ${opt.price})">
|
||
<div class="option-name">${opt.name}</div>
|
||
<div class="option-price ${priceClass}">${priceText}</div>
|
||
</div>`;
|
||
|
||
if(idx === 0) {
|
||
configState['Location'] = opt.price;
|
||
setTimeout(() => { document.getElementById('summaryLocation').textContent = opt.name; updateSummary(); }, 0);
|
||
}
|
||
});
|
||
html += '</div>';
|
||
|
||
// 4. Network
|
||
html += '<div class="section-label" style="margin-top:1rem;">🌐 Network Uplink</div>';
|
||
html += '<div class="config-grid wide">';
|
||
const netOptions = [
|
||
{ name: '1 Gbps Unmetered', price: 0 },
|
||
{ name: '10 Gbps Dedicated', price: 50 },
|
||
{ name: '2× 10 Gbps LACP', price: 100 }
|
||
];
|
||
|
||
netOptions.forEach((opt, idx) => {
|
||
const priceText = opt.price === 0 ? 'Included' : `+€${opt.price}`;
|
||
const priceClass = opt.price === 0 ? 'included' : '';
|
||
const activeClass = idx === 0 ? 'active' : '';
|
||
|
||
html += `
|
||
<div class="config-card ${activeClass}" onclick="selectFallbackOption(this, 'network', '${opt.name}', ${opt.price})">
|
||
<div class="option-name">${opt.name}</div>
|
||
<div class="option-price ${priceClass}">${priceText}</div>
|
||
</div>`;
|
||
|
||
if(idx === 0) {
|
||
configState['Network'] = opt.price;
|
||
setTimeout(() => { document.getElementById('summaryNetwork').textContent = opt.name; updateSummary(); }, 0);
|
||
}
|
||
});
|
||
html += '</div>';
|
||
|
||
container.innerHTML = html;
|
||
|
||
// Initialize storage summary
|
||
calculateStorageTotal();
|
||
}
|
||
|
||
// Helper for fallback clicks
|
||
window.selectFallbackOption = function(card, type, name, price) {
|
||
const grid = card.parentElement;
|
||
grid.querySelectorAll('.config-card').forEach(c => c.classList.remove('active'));
|
||
card.classList.add('active');
|
||
|
||
if(type === 'ram') {
|
||
configState['RAM Configuration'] = price;
|
||
document.getElementById('summaryRam').textContent = name;
|
||
const specRam = document.getElementById('spec-ram-capacity');
|
||
if(specRam) specRam.innerText = name;
|
||
} else if(type === 'location') {
|
||
configState['Location'] = price;
|
||
document.getElementById('summaryLocation').textContent = name;
|
||
} else if(type === 'network') {
|
||
configState['Network'] = price;
|
||
document.getElementById('summaryNetwork').textContent = name;
|
||
const specNetwork = document.getElementById('spec-network-speed');
|
||
if(specNetwork) specNetwork.innerText = name;
|
||
}
|
||
|
||
updateSummary();
|
||
};
|
||
|
||
// Storage Logic (Updated for Categories)
|
||
window.updateStorageQty = function(id, change, price, name, category, maxLimit) {
|
||
if(!storageSelection[id]) storageSelection[id] = { qty: 0, price, name, category };
|
||
|
||
let newQty = storageSelection[id].qty + change;
|
||
if(newQty < 0) newQty = 0;
|
||
|
||
// Calculate current total for this category
|
||
const currentCategoryTotal = Object.values(storageSelection)
|
||
.filter(item => item.category === category)
|
||
.reduce((acc, curr) => acc + curr.qty, 0);
|
||
|
||
// Check if adding would exceed limit (only if increasing)
|
||
if(change > 0 && (currentCategoryTotal + change) > maxLimit) {
|
||
// Optionally show a small toast or just shake the UI
|
||
return;
|
||
}
|
||
|
||
storageSelection[id].qty = newQty;
|
||
|
||
// Update UI
|
||
document.getElementById(`qty-${id}`).innerText = newQty;
|
||
const card = document.getElementById(`card-${id}`);
|
||
if(newQty > 0) card.classList.add('active');
|
||
else card.classList.remove('active');
|
||
|
||
calculateStorageTotal();
|
||
updateSlotsVisual(category, maxLimit);
|
||
};
|
||
|
||
window.updateSlotsVisual = function(category, maxSlots) {
|
||
const currentTotal = Object.values(storageSelection)
|
||
.filter(item => item.category === category)
|
||
.reduce((acc, curr) => acc + curr.qty, 0);
|
||
|
||
const visualContainer = document.getElementById(`slotsVisual-${category}`);
|
||
const countLabel = document.getElementById(`slotsCount-${category}`);
|
||
const statusLabel = document.getElementById(`slotsStatus-${category}`);
|
||
|
||
if(!visualContainer) return;
|
||
|
||
// Update Count
|
||
countLabel.innerText = `${currentTotal}/${maxSlots}`;
|
||
|
||
// Update Visuals
|
||
const slots = visualContainer.getElementsByClassName('drive-slot');
|
||
for(let i = 0; i < maxSlots; i++) {
|
||
if(i < currentTotal) {
|
||
slots[i].classList.add('filled');
|
||
if(category === 'gen5') slots[i].classList.add('gen5');
|
||
} else {
|
||
slots[i].classList.remove('filled');
|
||
slots[i].classList.remove('gen5');
|
||
}
|
||
}
|
||
|
||
// Update Status Text
|
||
if(currentTotal === 0) {
|
||
statusLabel.innerText = "Select drives below";
|
||
statusLabel.style.color = "var(--text-secondary)";
|
||
} else if (currentTotal >= maxSlots) {
|
||
statusLabel.innerText = "Max capacity reached";
|
||
statusLabel.style.color = "var(--warning)";
|
||
} else {
|
||
statusLabel.innerText = `${maxSlots - currentTotal} slots remaining`;
|
||
statusLabel.style.color = "var(--success)";
|
||
}
|
||
};
|
||
|
||
window.calculateStorageTotal = function() {
|
||
let total = 0;
|
||
let summaryParts = [];
|
||
|
||
Object.values(storageSelection).forEach(item => {
|
||
if(item.qty > 0) {
|
||
total += item.qty * item.price;
|
||
summaryParts.push(`${item.qty}x ${item.name.replace('NVMe Gen4', '').replace('NVMe Gen5 Ent', '').trim()}`);
|
||
}
|
||
});
|
||
|
||
configState['Storage Configuration'] = total;
|
||
|
||
const summaryText = summaryParts.length > 0 ? summaryParts.join(', ') : 'None selected';
|
||
document.getElementById('summaryStorage').innerText = summaryText;
|
||
|
||
// Also update specs table if visible
|
||
const specStorage = document.getElementById('spec-storage-config');
|
||
if(specStorage) specStorage.innerText = summaryParts.length > 0 ? summaryParts.join(' + ') : 'Configurable';
|
||
|
||
updateSummary();
|
||
};
|
||
|
||
function renderDynamicOptions(options) {
|
||
const container = document.getElementById('dynamicConfigContainer');
|
||
container.innerHTML = '';
|
||
configState = {};
|
||
configIds = {};
|
||
|
||
// Reset storage selection for the visualizer
|
||
storageSelection = {};
|
||
|
||
const groups = { core: [], storage: [], network: [], other: [] };
|
||
|
||
options.forEach(opt => {
|
||
if (opt.type === 'ram' || opt.type === 'location') groups.core.push(opt);
|
||
else if (opt.type === 'storage') groups.storage.push(opt);
|
||
else if (opt.type === 'network') groups.network.push(opt);
|
||
else groups.other.push(opt);
|
||
});
|
||
|
||
// 1. Core (RAM, Location)
|
||
groups.core.forEach(opt => {
|
||
const label = document.createElement('div');
|
||
label.className = 'section-label';
|
||
label.style.marginTop = '1.5rem';
|
||
let icon = '⚙️';
|
||
if(opt.type === 'ram') icon = '💾 RAM CONFIGURATION';
|
||
else if(opt.type === 'location') icon = '📍 DATA CENTER LOCATION';
|
||
label.textContent = icon;
|
||
container.appendChild(label);
|
||
container.appendChild(createOptionGrid(opt, true));
|
||
});
|
||
|
||
// 2. Storage
|
||
if (groups.storage.length > 0) {
|
||
const label = document.createElement('div');
|
||
label.className = 'section-label';
|
||
label.style.marginTop = '1.5rem';
|
||
label.textContent = '💿 STORAGE CONFIGURATION';
|
||
container.appendChild(label);
|
||
|
||
// Dynamic Visualizer based on number of storage options (bays) found
|
||
const maxSlots = groups.storage.length;
|
||
if (maxSlots > 0) {
|
||
const visualContainer = document.createElement('div');
|
||
visualContainer.className = 'storage-slots-container';
|
||
visualContainer.innerHTML = `
|
||
<div class="slots-header">
|
||
<span>Drive Bays: <strong id="dynamic-slots-count">0/${maxSlots}</strong></span>
|
||
</div>
|
||
<div class="slots-visual" id="dynamic-slots-visual">
|
||
${Array(maxSlots).fill('<div class="drive-slot"></div>').join('')}
|
||
</div>
|
||
`;
|
||
container.appendChild(visualContainer);
|
||
}
|
||
|
||
groups.storage.forEach((opt, index) => {
|
||
const subLabel = document.createElement('div');
|
||
subLabel.className = 'section-label';
|
||
subLabel.style.fontSize = '0.85rem';
|
||
subLabel.style.marginTop = '1rem';
|
||
subLabel.style.color = 'var(--text-secondary)';
|
||
// If the label is just "Hard Drive", append a number
|
||
subLabel.textContent = opt.label === "Hard Drive" ? `Drive Bay ${index + 1}` : opt.label;
|
||
container.appendChild(subLabel);
|
||
|
||
// Pass the index to help with the visualizer
|
||
container.appendChild(createOptionGrid(opt, false, index));
|
||
});
|
||
}
|
||
|
||
// 3. Network & Other
|
||
const remaining = [...groups.network, ...groups.other];
|
||
if (remaining.length > 0) {
|
||
const label = document.createElement('div');
|
||
label.className = 'section-label';
|
||
label.style.marginTop = '1.5rem';
|
||
label.textContent = '🌐 NETWORK & EXTRAS';
|
||
container.appendChild(label);
|
||
remaining.forEach(opt => {
|
||
const sub = document.createElement('div');
|
||
sub.style.marginBottom = '0.5rem';
|
||
sub.style.fontWeight = '600';
|
||
sub.style.fontSize = '0.9rem';
|
||
sub.textContent = opt.label;
|
||
container.appendChild(sub);
|
||
container.appendChild(createOptionGrid(opt, true));
|
||
});
|
||
}
|
||
|
||
updateSummary();
|
||
}
|
||
|
||
function createOptionGrid(opt, isWide, storageIndex = -1) {
|
||
const grid = document.createElement('div');
|
||
grid.className = isWide ? 'config-grid wide' : 'config-grid';
|
||
|
||
opt.values.forEach((val, index) => {
|
||
const card = document.createElement('div');
|
||
card.className = 'config-card';
|
||
// Select first option by default
|
||
if (index === 0) {
|
||
card.classList.add('active');
|
||
// Set initial state
|
||
configState[opt.label] = val.price;
|
||
configIds[opt.id] = val.id;
|
||
|
||
// Update Summary Texts
|
||
if (opt.type === 'ram') document.getElementById('summaryRam').textContent = val.text.replace(/\s?\(.*?\)/, '');
|
||
if (opt.type === 'location') document.getElementById('summaryLocation').textContent = val.text;
|
||
if (opt.type === 'network') document.getElementById('summaryNetwork').textContent = val.text;
|
||
|
||
// For storage, we need to aggregate
|
||
if (opt.type === 'storage') {
|
||
// Store selection for this "bay" (opt.id)
|
||
storageSelection[opt.id] = { name: val.text, price: val.price };
|
||
updateDynamicStorageVisual(storageIndex, val.text);
|
||
}
|
||
}
|
||
|
||
let priceText = val.price === 0 ? 'Included' : `+€${val.price}`;
|
||
let priceClass = val.price === 0 ? 'included' : '';
|
||
let displayName = val.text.replace(/\s?\(.*?\)/, ''); // Clean text
|
||
|
||
card.innerHTML = `
|
||
<div class="option-name">${displayName}</div>
|
||
<div class="option-price ${priceClass}">${priceText}</div>
|
||
`;
|
||
|
||
card.addEventListener('click', () => {
|
||
grid.querySelectorAll('.config-card').forEach(c => c.classList.remove('active'));
|
||
card.classList.add('active');
|
||
|
||
configState[opt.label] = val.price;
|
||
configIds[opt.id] = val.id;
|
||
|
||
if (opt.type === 'ram') document.getElementById('summaryRam').textContent = displayName;
|
||
if (opt.type === 'location') document.getElementById('summaryLocation').textContent = displayName;
|
||
if (opt.type === 'network') document.getElementById('summaryNetwork').textContent = displayName;
|
||
|
||
if (opt.type === 'storage') {
|
||
storageSelection[opt.id] = { name: displayName, price: val.price };
|
||
// Recalculate total storage price
|
||
let totalStoragePrice = 0;
|
||
let storageNames = [];
|
||
Object.values(storageSelection).forEach(s => {
|
||
totalStoragePrice += s.price;
|
||
if(!s.name.toLowerCase().includes('none')) storageNames.push(s.name);
|
||
});
|
||
|
||
// Update visualizer
|
||
updateDynamicStorageVisual(storageIndex, displayName);
|
||
|
||
// Update summary text
|
||
document.getElementById('summaryStorage').textContent = storageNames.length > 0 ? storageNames.join(' + ') : 'None';
|
||
}
|
||
|
||
updateSummary();
|
||
});
|
||
|
||
grid.appendChild(card);
|
||
});
|
||
|
||
// Initial trigger for storage summary if this is a storage grid
|
||
if (opt.type === 'storage') {
|
||
// Debounce initial summary update
|
||
setTimeout(() => {
|
||
let totalStoragePrice = 0;
|
||
let storageNames = [];
|
||
Object.values(storageSelection).forEach(s => {
|
||
totalStoragePrice += s.price;
|
||
if(!s.name.toLowerCase().includes('none')) storageNames.push(s.name);
|
||
});
|
||
document.getElementById('summaryStorage').textContent = storageNames.length > 0 ? storageNames.join(' + ') : 'None';
|
||
updateSummary();
|
||
}, 100);
|
||
}
|
||
|
||
return grid;
|
||
}
|
||
|
||
function updateDynamicStorageVisual(index, selectedName) {
|
||
if(index === -1) return;
|
||
|
||
const slots = document.querySelectorAll('#dynamic-slots-visual .drive-slot');
|
||
const countEl = document.getElementById('dynamic-slots-count');
|
||
|
||
if(slots[index]) {
|
||
if(selectedName.toLowerCase().includes('none')) {
|
||
slots[index].classList.remove('filled');
|
||
slots[index].classList.remove('gen5');
|
||
} else {
|
||
slots[index].classList.add('filled');
|
||
// Try to detect Gen5
|
||
if(selectedName.toLowerCase().includes('gen5')) {
|
||
slots[index].classList.add('gen5');
|
||
} else {
|
||
slots[index].classList.remove('gen5');
|
||
}
|
||
}
|
||
}
|
||
|
||
// Count filled
|
||
const filled = document.querySelectorAll('#dynamic-slots-visual .filled').length;
|
||
if(countEl) countEl.textContent = `${filled}/${slots.length}`;
|
||
}
|
||
|
||
// Update Summary
|
||
function updateSummary() {
|
||
if (!selectedServer) return;
|
||
|
||
const isInstant = instantServers.some(s => s.id === selectedServer.id);
|
||
const pill = document.getElementById('summaryHeaderPill');
|
||
const subtext = document.getElementById('summarySubtext');
|
||
const orderBtn = document.getElementById('orderBtn');
|
||
const configureBtn = document.getElementById('configureBtn');
|
||
|
||
if (isInstant) {
|
||
pill.className = 'section-pill instant';
|
||
pill.textContent = 'Instant Deploy';
|
||
subtext.textContent = 'Ready in 15 minutes';
|
||
|
||
document.getElementById('totalPrice').textContent = selectedServer.currency + selectedServer.price;
|
||
document.getElementById('summaryCpu').textContent = selectedServer.cpu;
|
||
document.getElementById('summaryRam').textContent = selectedServer.ram;
|
||
document.getElementById('summaryStorage').textContent = selectedServer.storage;
|
||
document.getElementById('summaryNetwork').textContent = selectedServer.network;
|
||
document.getElementById('summaryLocation').textContent = selectedServer.location;
|
||
|
||
orderBtn.style.display = 'block';
|
||
orderBtn.href = selectedServer.orderUrl;
|
||
configureBtn.style.display = 'none';
|
||
} else {
|
||
pill.className = 'section-pill custom';
|
||
pill.textContent = 'Custom Build';
|
||
subtext.textContent = `Setup time: ${selectedServer.setupTime}`;
|
||
|
||
let addonPrice = 0;
|
||
Object.values(configState).forEach(p => addonPrice += p);
|
||
const totalPrice = selectedServer.basePrice + addonPrice;
|
||
|
||
document.getElementById('totalPrice').textContent = selectedServer.currency + totalPrice.toFixed(2);
|
||
document.getElementById('summaryCpu').textContent = selectedServer.cpu;
|
||
// Other fields updated by listeners
|
||
|
||
orderBtn.style.display = 'none';
|
||
configureBtn.style.display = 'block';
|
||
|
||
if (selectedServer.configUrl) {
|
||
let url = selectedServer.configUrl; // Base URL
|
||
// In real implementation, we would append config options to URL if WHMCS supported GET params for options easily
|
||
configureBtn.href = url;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Tab switching
|
||
document.querySelectorAll('.config-tab').forEach(tab => {
|
||
tab.addEventListener('click', () => {
|
||
document.querySelectorAll('.config-tab').forEach(t => t.classList.remove('active'));
|
||
tab.classList.add('active');
|
||
|
||
currentTab = tab.dataset.tab;
|
||
document.getElementById('instant-content').classList.toggle('active', currentTab === 'instant');
|
||
document.getElementById('custom-content').classList.toggle('active', currentTab === 'custom');
|
||
|
||
selectedServer = null;
|
||
document.getElementById('customOptions').style.display = 'none';
|
||
});
|
||
});
|
||
|
||
// Initialize
|
||
renderInstantServers();
|
||
renderCustomServers();
|
||
</script>
|
||
</body>
|
||
</html> |