/* ==========================================================================
   IBS Design System — carried across every route

   The tokens and rules here are the same world DESIGN.md specifies for the
   homepage. Nothing structural is changed: the theme's DOM, WooCommerce's
   markup and every form stay exactly as they are, so nothing that worked
   before stops working. Only tokens, type and surface colour move.

   Everything is scoped to html.ibs-ds, which is only present when a visitor
   has explicitly asked for the preview.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Tokens.

   Two palettes, one source. The --ds-* layer is what changes between light and
   dark; every component reads the unprefixed names, so no component rule has
   to know which mode it is in.

   Three states, per the usual contract: an explicit choice stamps
   data-theme on <html>, and with nothing stamped the visitor's OS setting
   decides. Light is the default because the use scene is a lit office with a
   tender document open in the next tab — but a lab that runs its screens dark
   at 2am gets dark without asking.
   -------------------------------------------------------------------------- */
html.ibs-ds {
	--ds-ground:     #f1f4f7;
	--ds-frame:      #ffffff;
	--ds-hairline:   #d5dce4;
	--ds-ink:        #10192a;
	--ds-ink-2:      #46536a;
	--ds-ink-3:      #5c6980;   /* 5.02:1 on ground, 5.54:1 on frame */
	--ds-assay:      #0b4fd1;   /* 6.88:1 on frame */
	--ds-assay-deep: #072f7d;
	--ds-assay-wash: #e4ecfb;
	--ds-on-deep:    #ffffff;

	/* The footer is a deliberately dark object in BOTH modes — it is the base
	   of the page, and in light mode it is what stops the ground running off
	   the bottom of the screen. */
	--ds-floor:      #0a1020;
	--ds-floor-ink:  #aeb9cc;
	--ds-floor-rule: rgba(255, 255, 255, 0.10);
	--ds-floor-key:  #8ab0ff;   /* accent family, not a second hue */
	--ds-floor-label:#8494ad;   /* 6.15:1 on the floor, measured */
}

/* System preference, only when the visitor has not chosen for themselves. */
@media (prefers-color-scheme: dark) {
	html.ibs-ds:not([data-theme="light"]) {
		--ds-ground:     #0d1420;
		--ds-frame:      #141d2c;
		--ds-hairline:   #26324a;
		--ds-ink:        #eef2f8;
		--ds-ink-2:      #b3bfd2;   /* 8.9:1 on ground */
		--ds-ink-3:      #8695ae;   /* 5.4:1 on ground */
		--ds-assay:      #6fa3ff;   /* 7.1:1 on ground — the light-mode blue is
		                               only 2.6:1 here, so the accent lifts */
		--ds-assay-deep: #0c1a3a;
		--ds-assay-wash: #172742;
		--ds-on-deep:    #eef2f8;
		--ds-floor:      #070c16;
		--ds-floor-rule: rgba(255, 255, 255, 0.08);
	}
}

/* An explicit choice wins in both directions. */
html.ibs-ds[data-theme="dark"] {
	--ds-ground:     #0d1420;
	--ds-frame:      #141d2c;
	--ds-hairline:   #26324a;
	--ds-ink:        #eef2f8;
	--ds-ink-2:      #b3bfd2;
	--ds-ink-3:      #8695ae;
	--ds-assay:      #6fa3ff;
	--ds-assay-deep: #0c1a3a;
	--ds-assay-wash: #172742;
	--ds-on-deep:    #eef2f8;
	--ds-floor:      #070c16;
	--ds-floor-rule: rgba(255, 255, 255, 0.08);
}

html.ibs-ds {
	--ground:      var(--ds-ground);
	--frame:       var(--ds-frame);
	--hairline:    var(--ds-hairline);
	--ink:         var(--ds-ink);
	--ink-2:       var(--ds-ink-2);
	--ink-3:       var(--ds-ink-3);
	--assay:       var(--ds-assay);
	--assay-deep:  var(--ds-assay-deep);
	--assay-wash:  var(--ds-assay-wash);

	--r:    2px;
	--rule: 1px solid var(--hairline);
	--ease: cubic-bezier(0.16, 1, 0.3, 1);

	--sans: 'Archivo', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
	--mono: 'Spline Sans Mono', ui-monospace, SFMono-Regular, Menlo, monospace;

	color-scheme: light dark;
}

/* --------------------------------------------------------------------------
   Type.

   The theme sets font-family directly on elements, and inheritance always
   loses to a matching element rule — so the elements have to be named. This
   was learned the hard way on the homepage, where the headings kept rendering
   in halyard-display while everything else had already changed.
   -------------------------------------------------------------------------- */
html.ibs-ds body,
html.ibs-ds p, html.ibs-ds li, html.ibs-ds td, html.ibs-ds th,
html.ibs-ds a, html.ibs-ds span, html.ibs-ds div,
html.ibs-ds label, html.ibs-ds figcaption, html.ibs-ds blockquote,
html.ibs-ds h1, html.ibs-ds h2, html.ibs-ds h3,
html.ibs-ds h4, html.ibs-ds h5, html.ibs-ds h6,
html.ibs-ds .sc_item_title, html.ibs-ds .sc_layouts_title_caption,
html.ibs-ds input, html.ibs-ds select, html.ibs-ds textarea, html.ibs-ds button {
	font-family: var(--sans);
}

/* :where() carries ZERO specificity, and that is the entire point.
   These were written as html.ibs-ds h1 (0,1,1), which outranks any component
   class at (0,1,0) — so every element that needs its own colour lost to the
   page default. It painted the footer headings dark on a near-black floor, the
   close panel's headline dark on navy, and the footer's links accent-blue
   instead of white. Three separate "bugs", one cause.
   As a default it should lose to anything more deliberate. Now it does. */
:where(html.ibs-ds) :where(h1, h2, h3, h4, h5, h6, .sc_item_title, .sc_layouts_title_caption) {
	color: var(--ink);
	letter-spacing: -0.026em;
	font-weight: 600;
	text-wrap: balance;
}

/* The theme's display sizes were set for halyard-display and run large in
   Archivo. Pulled back to the homepage's scale so the two worlds match. */
html.ibs-ds h1, html.ibs-ds .sc_layouts_title_caption {
	font-size: clamp(2rem, 3.4vw, 3rem);
	line-height: 1.08;
	letter-spacing: -0.03em;
}
html.ibs-ds h2, html.ibs-ds .sc_item_title {
	font-size: clamp(1.625rem, 2.6vw, 2.25rem);
	line-height: 1.14;
}
html.ibs-ds h3 { font-size: clamp(1.25rem, 1.7vw, 1.5rem); line-height: 1.2; }
html.ibs-ds h4 { font-size: 1.0625rem; line-height: 1.3; letter-spacing: -0.012em; }

:where(html.ibs-ds) :where(body, p, li) {
	color: var(--ink-2);
	line-height: 1.62;
}

/* Figures are tabular wherever they carry meaning. */
html.ibs-ds .price, html.ibs-ds .woocommerce-Price-amount,
html.ibs-ds time, html.ibs-ds .post_date, html.ibs-ds .sku {
	font-family: var(--mono);
	font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   Ground and surfaces
   -------------------------------------------------------------------------- */
/* Only the two wrappers that genuinely own the page ground. .content_wrap is
   just a measure container, and the theme reuses it INSIDE the single-post
   header that floats over the featured image — painting it opaque covered the
   photo and left the white headline on a light panel at 1.1:1. */
html.ibs-ds body,
html.ibs-ds .page_content_wrap {
	background-color: var(--ground);
}

/* .post_item matches BOTH a listing card and the single-article wrapper. On a
   single post the theme lays its header over the featured image with white
   type, so painting that wrapper white put white text on a white panel and the
   headline vanished. Listing cards only. */
html.ibs-ds .post_item:not(.post_item_single):not(.post_item_featured),
html.ibs-ds .sc_services_item,
html.ibs-ds .sc_blogger_item,
html.ibs-ds .products li.product,
html.ibs-ds .woocommerce ul.products li.product,
html.ibs-ds .widget,
html.ibs-ds .sidebar .widget {
	background-color: var(--frame);
	border: var(--rule);
	border-radius: var(--r);
	box-shadow: none;
}

/* --------------------------------------------------------------------------
   The page-title banner.

   The theme ships it as a navy gradient with a photographic overlay. In this
   world the header bar is flat assay-deep, and the banner is a continuation of
   that bar rather than a second, differently-shaded slab beneath it.
   -------------------------------------------------------------------------- */
/* The banner's colour lives on the Elementor top-section that wraps the title,
   not on .sc_layouts_title — that is a 1100x46 inner block, and painting it
   produced a bright blue rectangle floating inside the theme's darker band.
   Measured on /supports-infiniti/: section 1265x166 carries the gradient,
   .sc_layouts_title inside it carries nothing. */
html.ibs-ds .elementor-top-section:has(.sc_layouts_title),
html.ibs-ds .elementor-top-section:has(.sc_layouts_title_caption) {
	background-image: none !important;
	background-color: var(--assay-deep) !important;
}
html.ibs-ds .sc_layouts_title,
html.ibs-ds .top_panel_title {
	background-color: transparent !important;
	background-image: none !important;
}
html.ibs-ds .sc_layouts_title .sc_layouts_title_caption,
html.ibs-ds .sc_layouts_title h1,
html.ibs-ds .sc_layouts_title a,
html.ibs-ds .sc_layouts_title .breadcrumbs,
html.ibs-ds .sc_layouts_title .breadcrumbs * {
	color: #fff !important;
}
html.ibs-ds .sc_layouts_title .breadcrumbs,
html.ibs-ds .sc_layouts_title .breadcrumbs * {
	font-family: var(--mono);
	font-size: 0.75rem;
	letter-spacing: 0.04em;
	opacity: 0.72;
}

/* --------------------------------------------------------------------------
   Actions.

   One shape, one accent, everywhere: theme buttons, Elementor buttons,
   WooCommerce buttons and bare <button> all resolve to the same object.
   -------------------------------------------------------------------------- */
html.ibs-ds .sc_button,
html.ibs-ds .elementor-button,
html.ibs-ds .woocommerce a.button,
html.ibs-ds .woocommerce button.button,
html.ibs-ds .woocommerce input.button,
html.ibs-ds input[type="submit"],
html.ibs-ds button[type="submit"] {
	background-color: var(--assay);
	color: #fff;
	border: 1px solid transparent;
	border-radius: var(--r);
	font-family: var(--sans);
	font-weight: 500;
	letter-spacing: -0.006em;
	min-height: 46px;
	box-shadow: none;
	text-transform: none;
	transition: background-color 160ms var(--ease), transform 120ms var(--ease);
}
html.ibs-ds .sc_button:hover,
html.ibs-ds .elementor-button:hover,
html.ibs-ds .woocommerce a.button:hover,
html.ibs-ds .woocommerce button.button:hover,
html.ibs-ds input[type="submit"]:hover,
html.ibs-ds button[type="submit"]:hover {
	background-color: var(--assay-deep);
	color: #fff;
}
html.ibs-ds .sc_button:active,
html.ibs-ds .elementor-button:active,
html.ibs-ds .woocommerce a.button:active { transform: scale(0.985); }

/* Links take the accent — but a button is not a link wearing a colour. This
   rule is (0,1,1) and beat .ibs-btn--primary at (0,1,0), which painted the
   homepage's primary CTA text assay-on-assay: measured 1:1, the label was
   invisible. Anything that presents as a button is excluded by name. */
/* The :not() list has to live INSIDE :where() too. Left outside it, each
   :not([class*="btn"]) contributes its own (0,1,0) and the rule totalled
   (0,4,0) — which is why the footer's links stayed accent-blue on the dark
   floor at 2.76:1 even after the rest of the blanket was neutralised. */
:where(html.ibs-ds) :where(a:not([class*="btn"]):not([class*="button"]):not(.sc_button):not(.wp-block-button__link)) {
	color: var(--assay);
}
html.ibs-ds .post_content a:not(.sc_button):not(.elementor-button):not(.button) {
	text-underline-offset: 0.18em;
}

/* --------------------------------------------------------------------------
   Forms. Contact Form 7 and WooCommerce inputs share one field.
   -------------------------------------------------------------------------- */
html.ibs-ds input[type="text"],
html.ibs-ds input[type="email"],
html.ibs-ds input[type="tel"],
html.ibs-ds input[type="search"],
html.ibs-ds input[type="number"],
html.ibs-ds select,
html.ibs-ds textarea {
	background-color: var(--frame);
	border: var(--rule);
	border-radius: var(--r);
	color: var(--ink);
	font-family: var(--sans);
	min-height: 46px;
	padding: 10px 14px;
	box-shadow: none;
}
html.ibs-ds textarea { min-height: 120px; }
html.ibs-ds input::placeholder,
html.ibs-ds textarea::placeholder { color: var(--ink-3); opacity: 1; }

html.ibs-ds input:focus-visible,
html.ibs-ds select:focus-visible,
html.ibs-ds textarea:focus-visible,
html.ibs-ds a:focus-visible,
html.ibs-ds button:focus-visible {
	outline: 2px solid var(--assay);
	outline-offset: 2px;
	border-radius: var(--r);
}

/* --------------------------------------------------------------------------
   Catalogue.

   The product grid is the most-visited surface on the site after the
   homepage. It keeps every WooCommerce class and behaviour; only the frame,
   the type and the accent change.
   -------------------------------------------------------------------------- */
html.ibs-ds .woocommerce ul.products li.product .woocommerce-loop-product__title,
html.ibs-ds .woocommerce ul.products li.product h2 {
	color: var(--ink);
	font-size: 1rem;
	line-height: 1.34;
	letter-spacing: -0.012em;
	font-weight: 600;
}
html.ibs-ds .woocommerce ul.products li.product .post_meta,
html.ibs-ds .woocommerce ul.products li.product .brand {
	font-family: var(--mono);
	font-size: 0.6875rem;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: var(--ink-3);
}
html.ibs-ds .woocommerce ul.products li.product img { border-radius: 0; }

/* Category filter rail */
html.ibs-ds .widget_product_categories a,
html.ibs-ds .widget_categories a { color: var(--ink-2); }
html.ibs-ds .widget_product_categories .current-cat > a,
html.ibs-ds .widget_product_categories a:hover { color: var(--assay); }

/* --------------------------------------------------------------------------
   Editorial. Article body measure, so long posts stay readable.
   -------------------------------------------------------------------------- */
html.ibs-ds .post_item_single .post_content > p,
html.ibs-ds .post_item_single .post_content > ul,
html.ibs-ds .post_item_single .post_content > ol {
	max-width: 68ch;
}

/* --------------------------------------------------------------------------
   The preview marker
   -------------------------------------------------------------------------- */
.ibs-preview-flag {
	position: fixed; left: 16px; bottom: 16px; z-index: 9999;
	display: flex; align-items: center; gap: 10px;
	padding: 9px 14px;
	background: #072f7d; color: #fff;
	border: 1px solid rgba(255,255,255,.22); border-radius: 2px;
	font: 500 13px/1.2 'Archivo', system-ui, sans-serif;
	box-shadow: 0 6px 20px rgba(7,47,125,.28);
	max-width: calc(100vw - 32px);
}
.ibs-preview-flag strong { font-weight: 600; }
.ibs-preview-flag__dot { width: 8px; height: 8px; border-radius: 50%; background: #4ade80; flex: 0 0 auto; }
.ibs-preview-flag a {
	color: #fff; text-decoration: none; white-space: nowrap;
	padding-left: 10px; margin-left: 2px;
	border-left: 1px solid rgba(255,255,255,.28); opacity: .85;
}
.ibs-preview-flag a:hover { opacity: 1; text-decoration: underline; }
@media (max-width: 600px) {
	.ibs-preview-flag { left: 10px; right: 10px; bottom: 10px; font-size: 12px; justify-content: center; }
}
@media print { .ibs-preview-flag { display: none; } }

/* --------------------------------------------------------------------------
   Motion respects the visitor's setting, as the homepage does.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
	html.ibs-ds *,
	html.ibs-ds *::before,
	html.ibs-ds *::after {
		animation-duration: 1ms !important;
		transition-duration: 1ms !important;
	}
}

/* --------------------------------------------------------------------------
   Single article header. Left as the theme built it — type over the featured
   image — because that is a composition, not a card.
   -------------------------------------------------------------------------- */
html.ibs-ds .post_header_wrap .content_wrap,
html.ibs-ds .post_item_single > .post_header,
html.ibs-ds .post_item_single .post_featured {
	background-color: transparent;
	border: 0;
}

/* ==========================================================================
   Sub-menus.

   The previous version of this block only half landed. Measured on the live
   preview: background, border, radius and min-width were mine, but padding came
   back 10px 0, the shadow 0 18px 44px, and the link colour #f8f7f9 — the
   theme's values, not the ones written here. (The font size was a misread on the
   way in: the root font here is 15px, not 16px, so 0.9375rem resolves to 14.06px
   and was ours all along. Padding, shadow and colour genuinely were not.)
   Half a design system is worse than none: the panel ended up a near-black slate, loosely spaced, floating under a
   44px shadow, which is exactly the borrowed-component look this block claims
   to have fixed.

   Three things are corrected.

   1. It belongs to the bar. The header is #072f7d; the panel was #101a33, a
      different hue entirely, so it read as a separate object that happened to
      appear nearby. It is now a deeper shade of the bar's own blue, which is
      what makes a dropdown feel like the bar unfolding rather than a slab
      landing on top of the page.

   2. It is attached to the bar. The theme positions it at a hardcoded 78px
      under a bar that measures 81px, so a strip of hero photograph showed
      through the seam. top:100% pins it to the bottom of the item whatever the
      bar's height turns out to be.

   3. Depth comes from the hairline, not from a 44px shadow — the rule this
      system states everywhere else and broke here.

   Every declaration the theme was winning is now taken with a matching
   !important. That is not shouting for its own sake: ibs-mobile-optimization.php
   pins this panel at (0,2,3) with !important of its own, and it is loaded on
   the live site where it must keep working untouched.
   ========================================================================== */
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul.sub-menu {
	top: 100% !important;
	background-color: #051f5c !important;
	border: 1px solid rgba(255, 255, 255, 0.14) !important;
	border-radius: var(--r) !important;
	box-shadow: 0 8px 22px rgba(2, 8, 24, 0.30) !important;
	padding: 6px !important;
	min-width: 208px !important;
}

/* Text-to-text alignment. The top-level link carries 13.6px of padding, and the
   panel insets its rows by 6px of its own padding plus 14px on the row — so the
   panel starts 6px to the left of the label it belongs to, and the two read as
   one column instead of two things that nearly line up.

   VERTIKAL: panel menggantung dari tepi bawah BILAH, bukan dari tepi bawah item
   menunya.

   `top: 100%` sendirian menempelkan panel ke dasar <li>, dan <li> itu bukan
   setinggi bilah: pada 1280px bilahnya 125px sementara baris menunya berakhir
   di 94px. Selisih 31px itulah yang terlihat — panel gelap menembus 31px
   terakhir bilah biru, seolah dijatuhkan menembusnya.

   Selisih itu tidak bisa dihitung CSS: ia berubah saat viewport berubah dan
   sekali lagi saat bilah menyusut karena di-scroll. Jadi ia diukur di
   ibs-design-system.php dan dipasang sebagai --ibs-sub-top pada tiap <li>
   tepat sebelum panelnya muncul. Tanpa JavaScript, nilai cadangannya 0 dan
   perilakunya kembali persis seperti sebelum baris ini ada.

   Selektornya ditulis dua kali, dan yang kedua menyebut .sub-menu, karena blok
   di atas menyebutnya juga: `... .sc_layouts_menu_nav ul.sub-menu` membawa
   empat kelas dan mengalahkan `... > li > ul` yang hanya membawa tiga.
   !important di kedua sisi tidak memutuskan apa pun ketika yang menentukan
   adalah kekhususan — versi pertama perbaikan ini kalah persis di situ. */
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li > ul,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li > ul.sub-menu {
	left: -6px !important;
	top: calc(100% + var(--ibs-sub-top, 0px)) !important;

	/* Panel muncul dan hilang seketika, tidak memudar.
	 *
	 * superfish memunculkannya dengan animasi opacity jQuery. Selama fade itu
	 * berlangsung panel setengah tembus pandang — foto hero terbaca menembus
	 * tulisannya — dan karena panel lama masih dalam masa tunda sementara yang
	 * baru mulai muncul, sempat ada dua panel separuh tampak menimpa satu sama
	 * lain di atas hero.
	 *
	 * opacity dikunci 1, jadi yang tersisa dari animasi itu hanya display:
	 * ada atau tidak ada. Menu dropdown bukan tempat untuk transisi 400 ms;
	 * yang dibutuhkan pembaca adalah panel yang sudah terbaca pada saat
	 * matanya sampai ke sana. */
	opacity: 1 !important;
}

/* The theme colours the <span> inside the link, not the link, which is why the
   earlier colour never took. Both are set. */
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a > span {
	color: rgba(255, 255, 255, 0.86) !important;
	font-family: var(--sans) !important;
	font-size: 0.9375rem !important;
	font-weight: 500 !important;
	letter-spacing: -0.008em !important;
}
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a {
	display: block !important;
	padding: 9px 14px !important;
	border-radius: var(--r) !important;
	border-bottom: 0 !important;
	transition: background-color 140ms var(--ease), color 140ms var(--ease);
}
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a:hover,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a:focus-visible,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li.current-menu-item > a {
	background-color: rgba(255, 255, 255, 0.10) !important;
}
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a:hover > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a:focus-visible > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li.current-menu-item > a > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a:hover,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li.current-menu-item > a {
	color: #fff !important;
}

/* The theme underlines these on hover; the tint already carries the state.
 *
 * Garis itu ternyata digambar di <span> di dalam <a>, bukan di <a>-nya —
 * span::after setinggi 1px yang lebarnya beranimasi 0 → 100%. Aturan lama hanya
 * menyebut a::before/a::after, jadi garisnya tetap muncul: satu setrip putih
 * menggantung di bawah baris yang sedang di-hover, di dalam panel yang sudah
 * menandai dirinya dengan bidang bertinta. Dua penanda untuk satu keadaan. */
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a::before,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a::after,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a > span::before,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav ul > li > a > span::after {
	display: none !important;
}

/* --------------------------------------------------------------------------
   Item tingkat atas: keadaan hover dan halaman-sekarang.

   Tema mewarnai keduanya dengan --theme-color-text_link, yang di instalasi ini
   bernilai #0984E3 — biru menengah, dan bilahnya sendiri biru tua. Hasilnya
   sekitar 2:1: labelnya praktis hilang begitu tetikus menyentuhnya, persis pada
   saat pembaca paling butuh membacanya.

   Di dunia ini bilah adalah objek gelap dan tintanya putih, jadi keadaan tidak
   dibawa oleh perubahan hue sama sekali — putih penuh, dengan garis bawah milik
   tema tetap dibiarkan sebagai penandanya. Tema memasang !important, jadi ini
   menang lewat kekhususan: empat kelas melawan dua.
   -------------------------------------------------------------------------- */
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li > a:hover,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li > a:focus-visible,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.sfHover > a,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.current-menu-item > a,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.current-menu-parent > a,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.current-menu-ancestor > a,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li > a:hover > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li > a:focus-visible > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.sfHover > a > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.current-menu-item > a > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.current-menu-parent > a > span,
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li.current-menu-ancestor > a > span {
	color: #fff !important;
}

/* Garis bawah penanda itu sendiri diwarnai putih juga: tema menggambarnya
   dengan background-color, bukan currentColor, jadi ia tidak ikut berubah
   ketika tintanya berubah. */
html body.ibs-ds-on .top_panel .sc_layouts_menu_nav > li > a > span::after {
	background-color: #fff !important;
}

/* --------------------------------------------------------------------------
   Panel samping tema (tombol titik-tiga di kanan header).

   Isinya, apa adanya: empat tautan sosial yang menuju facebook.com/,
   twitter.com/, dribbble.com/ dan instagram.com/ — halaman depan situs-situs
   itu, bukan akun IBS, dan IBS tidak punya Dribbble sama sekali — ditambah
   nomor telepon "(021)205870361-63" yang tidak dipakai bagian lain situs ini.
   Semuanya bawaan demo tema.

   Yang benar dari isinya hanya alamat surel, dan itu sudah ada di footer,
   di halaman kontak, dan di setiap halaman produk. Jadi pemicunya ikut
   disembunyikan: sebuah panel yang setiap isinya salah lebih buruk daripada
   tidak ada panel.

   Ini penyembunyian tampilan, bukan penghapusan. Panelnya tetap ada di
   pengaturan tema, dan situs langsung tetap menyajikannya seperti biasa.
   -------------------------------------------------------------------------- */
html.ibs-ds .trx_addons_panel_link,
html.ibs-ds .sc_layouts_panel,
html.ibs-ds .sc_layouts_panel_wrap { display: none !important; }

/* ==========================================================================
   Sticky header vs. the WP admin toolbar.

   The bar is `position: fixed; top: 0` (set inline, sticky-header behaviour),
   pinned to the literal top of the viewport. WordPress's own admin-bar CSS
   pushes everything else down with `html { margin-top: 32px }` for a logged-in
   visitor, which the bar — fixed, so it isn't in that flow — does not follow.
   Normally invisible: the bar and the hero directly under it are the same
   navy, so a few pixels of one showing through the other goes unnoticed. Only
   once logged in does the gap read as a visible pale strip between the bar
   and the hero, the body's own background colour showing through where the
   bar used to be. 46px matches the admin toolbar's own mobile height (WP
   core switches at the same 782px breakpoint).
   ========================================================================== */
html body.ibs-ds-on.admin-bar .top_panel {
	top: 32px !important;
}
@media screen and (max-width: 782px) {
	html body.ibs-ds-on.admin-bar .top_panel {
		top: 46px !important;
	}
}

/* ==========================================================================
   Footer.

   The theme's own footer is hidden rather than restyled: it is assembled at
   runtime by JavaScript in ibs-mobile-optimization.php, so there is no stable
   markup to target. The replacement below is rendered server-side.
   ========================================================================== */
html.ibs-ds .footer_wrap { display: none !important; }

.ibs-f {
	background: var(--ds-floor);
	color: var(--ds-floor-ink);
	font-family: var(--sans);
	padding: clamp(48px, 6vw, 80px) 0 0;
}

/* Lebar diukur dengan rumus yang sama seperti .ibs-wrap di halaman, bukan
   max-width ditambah padding.

   Versi sebelumnya berbunyi width:100% + max-width:1280px + padding-inline.
   Tanpa border-box, padding itu DITAMBAHKAN ke 1280 — kotaknya jadi 1366px dan
   setiap halaman pratinjau punya 86px scroll mendatar, di ponsel maupun di
   desktop. Rumus di bawah tidak bisa melebar melewati viewport, dan sebagai
   bonus isi footer kini sejajar tepat dengan isi halaman di atasnya. */
.ibs-f__wrap {
	box-sizing: border-box;
	width: min(1280px, 100% - (clamp(20px, 4vw, 64px) * 2));
	margin-inline: auto;
	padding-inline: 0;
}

.ibs-f__grid {
	display: grid;
	grid-template-columns: minmax(0, 5fr) minmax(0, 3fr) minmax(0, 4fr);
	gap: clamp(32px, 4vw, 64px);
	padding-bottom: clamp(36px, 4vw, 56px);
}

.ibs-f__logo {
	display: block;
	width: auto;
	height: auto;
	max-width: 190px;
	max-height: 58px;
	object-fit: contain;
	object-position: left center;
	margin-bottom: 22px;
}

.ibs-f__blurb {
	margin: 0 0 14px;
	max-width: 46ch;
	font-size: 0.9375rem;
	line-height: 1.65;
	color: var(--ds-floor-ink);
}

.ibs-f__agency {
	margin: 0;
	font-size: 0.875rem;
	color: #fff;
	font-weight: 500;
}

/* The one place a tracked uppercase label earns its keep: three of them, once,
   naming the columns of a directory. */
/* This was mono, 0.14em tracked, in bright cyan. Three things shouting at once
   for a label whose whole job is to sit still and name a column — and the cyan
   was a second accent hue in a system that has one. Now it is the page's own
   face, barely tracked, and quiet enough to read as a label rather than a
   headline. */
.ibs-f .ibs-f__head {
	font-family: var(--sans);
	font-size: 0.6875rem;
	font-weight: 600;
	letter-spacing: 0.055em;   /* the theme tracks h2 wider and won at (0,1,2) */
	text-transform: uppercase;
	color: var(--ds-floor-label);
	margin: 0 0 18px;
}

.ibs-f__list { list-style: none; margin: 0; padding: 0; }
.ibs-f__list li { margin-bottom: 12px; }
.ibs-f__list li:last-child { margin-bottom: 0; }

.ibs-f a {
	color: #fff;
	text-decoration: none;
	font-size: 0.9375rem;
	border-bottom: 1px solid transparent;
	transition: border-color 140ms var(--ease), color 140ms var(--ease);
}
/* Garis bawahnya harus selebar tulisannya, bukan selebar kolomnya.
   Daftar kontak adalah grid dua kolom — ikon lalu isi — dan sebuah <a> di
   dalamnya adalah item grid yang meregang penuh. Garis bawah yang muncul saat
   hover ikut meregang: satu setrip menyeberangi seluruh kolom, dari ujung nomor
   telepon sampai tepi kanan footer. */
.ibs-f a {
	justify-self: start;
	width: fit-content;
	max-width: 100%;
}
.ibs-f a:hover { border-bottom-color: currentColor; }

/* A two-column grid, not a flex row: the icon column is a fixed track, so all
   three icons share one left edge and all three labels share another —
   whatever length the address wraps to.

   The icon is centred on the FIRST line by arithmetic rather than by a guessed
   nudge. It previously carried margin-top:2px, which was eyeballed at desktop
   and drifted the moment the text reflowed on a phone. Half the difference
   between the line box and the icon puts it on the optical centre of that line
   at any font size. */
.ibs-f__list--contact {
	--ico: 17px;
	--lh: 1.55;
	font-size: 0.9375rem;
	line-height: var(--lh);
}
.ibs-f__list--contact li {
	display: grid;
	grid-template-columns: var(--ico) minmax(0, 1fr);
	column-gap: 12px;
	align-items: start;
	margin-bottom: 14px;
}
.ibs-f__list--contact .ibs-f__ico {
	width: var(--ico);
	height: var(--ico);
	margin: calc((1em * var(--lh) - var(--ico)) / 2) 0 0;
	color: var(--ds-floor-key);
}
.ibs-f__list--contact a,
.ibs-f__addr span {
	font-size: inherit;
	line-height: inherit;
}
.ibs-f__addr span { color: var(--ds-floor-ink); }

.ibs-f__base {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 16px 28px;
	padding: 22px 0 26px;
	border-top: 1px solid var(--ds-floor-rule);
}
.ibs-f__copy {
	margin: 0;
	font-size: 0.8125rem;
	color: var(--ds-floor-ink);
	opacity: 0.85;
}
/* Sits under the address, parted from it by a hairline: reaching IBS on social
   is the same errand as phoning them, not a legal footnote for the base bar. */
.ibs-f__social {
	list-style: none;
	display: flex;
	flex-wrap: wrap;
	gap: 8px 18px;
	margin: 22px 0 0;
	padding: 18px 0 0;
	border-top: 1px solid var(--ds-floor-rule);
}
.ibs-f__social a {
	font-size: 0.8125rem;
	color: var(--ds-floor-ink);
	border-bottom: 1px solid transparent;
}
.ibs-f__social a:hover { color: #fff; border-bottom-color: currentColor; }

/* Theme toggle */
.ibs-f__theme {
	display: inline-flex;
	align-items: center;
	gap: 9px;
	min-height: 36px;
	padding: 0 14px;
	background: transparent;
	border: 1px solid var(--ds-floor-rule);
	border-radius: var(--r);
	color: #fff;
	font-family: var(--sans);
	font-size: 0.8125rem;
	font-weight: 500;
	cursor: pointer;
	transition: border-color 140ms var(--ease), background-color 140ms var(--ease);
}
.ibs-f__theme:hover { border-color: rgba(255,255,255,.34); background: rgba(255,255,255,.05); }
.ibs-f__theme:active { transform: scale(0.985); }
.ibs-f__theme-ico {
	width: 14px; height: 14px;
	border-radius: 50%;
	background: var(--ds-floor-key);
	box-shadow: inset -4px -1px 0 0 var(--ds-floor);
	transition: box-shadow 200ms var(--ease), background-color 200ms var(--ease);
}
/* Pressed means dark is on: the crescent fills to a full disc, a sun. */
.ibs-f__theme[aria-pressed="true"] .ibs-f__theme-ico {
	box-shadow: inset 0 0 0 0 var(--ds-floor);
	background: #ffd479;
}

.ibs-f :focus-visible { outline: 2px solid var(--ds-floor-key); outline-offset: 3px; }

@media (max-width: 900px) {
	.ibs-f__grid { grid-template-columns: 1fr 1fr; }
	.ibs-f__brand { grid-column: 1 / -1; }
}
@media (max-width: 560px) {
	.ibs-f__grid { grid-template-columns: 1fr; gap: 34px; }
	.ibs-f__base { flex-direction: column; align-items: flex-start; }
}

/* ==========================================================================
   Mobile menu.

   Rewritten once, after measuring, rather than patched twice.

   What the theme shipped: an aubergine panel (rgb 15,3,38 — a hue in no other
   part of this system), warm-grey type, three destinations hidden behind a
   disclosure arrow, no call to action at all, and a row of social icons
   pointing at facebook.com/, twitter.com/, dribbble.com/ and instagram.com/ —
   its own demo placeholders. IBS has no Dribbble.

   What the first attempt got wrong, measured on a 390x844 phone: padding piled
   on top of the theme's own, so the content column grew to 1077px against an
   844px screen; the social row is class socials_mobile, not socials_wrap, so
   the rule meant to hide it never matched; and the action block was appended
   after that row, which put it below the fold.

   Everything below is sized so the whole menu fits one screen without
   scrolling.
   ========================================================================== */
html.ibs-ds .menu_mobile_inner,
html.ibs-ds .menu_mobile_overlay {
	background-color: var(--assay-deep) !important;
}

/* Inset kiri-kanan panel, dinyatakan sendiri.
 *
 * Sebelumnya inset itu dipinjam: pembungkus panel memakai kelas .content_wrap
 * yang sama dengan badan halaman, dan pada ponsel tema memberinya jarak lewat
 * width + margin auto, bukan lewat padding. Begitu template beranda dan
 * halaman menetralkan .content_wrap — memang itu tugasnya, halaman-halaman itu
 * full-bleed — menu ponsel ikut kehilangan jaraknya dan seluruh isinya
 * menempel ke tepi layar: judul terpotong di kiri, tombol WhatsApp melebar
 * sampai keluar bingkai.
 *
 * Sekarang jaraknya milik panel ini sendiri, dinyatakan sebagai padding dengan
 * lebar dikunci 100% supaya tidak bisa ditumpuk di atas inset berbasis width
 * milik tema. Nilainya sama dengan selokan halaman, jadi menu dan halaman
 * berbagi satu tepi kiri.
 *
 * Padding hanya di pembungkus luar; yang di dalam dinolkan, karena keduanya
 * mendapat inset akan menggandakannya — kesalahan yang tercatat di kepala blok
 * ini dan pernah membuat kolomnya 1077px di layar 844px. */
html.ibs-ds .menu_mobile .menu_mobile_content_wrap {
	box-sizing: border-box !important;
	width: 100% !important;
	max-width: none !important;
	margin-inline: 0 !important;
	padding-inline: clamp(20px, 4vw, 32px) !important;
}
html.ibs-ds .menu_mobile .menu_mobile_content_wrap_inner {
	width: 100% !important;
	max-width: none !important;
	margin-inline: 0 !important;
	padding-inline: 0 !important;
}

html.ibs-ds .menu_mobile_close,
html.ibs-ds .menu_mobile_close::before,
html.ibs-ds .menu_mobile_close::after { color: #fff !important; }

/* The placeholder social row. Correct class this time. */
html.ibs-ds .menu_mobile .socials_mobile,
html.ibs-ds .menu_mobile .socials_wrap { display: none !important; }

/* Children stay open — six parents and six children is twelve lines, and
   twelve lines fit. Gating them behind a tap buys nothing here. */
html.ibs-ds .menu_mobile_nav > li > ul {
	display: block !important;
	height: auto !important;
	max-height: none !important;
	opacity: 1 !important;
	visibility: visible !important;
	overflow: visible !important;
	margin: 0 0 4px !important;
	padding: 0 !important;
}
html.ibs-ds .menu_mobile_nav .open_child_menu { display: none !important; }

html.ibs-ds .menu_mobile_nav > li { border: 0 !important; margin: 0 !important; }

html.ibs-ds .menu_mobile_nav > li > a {
	color: #fff !important;
	font-family: var(--sans);
	font-size: 1.0625rem !important;
	font-weight: 600;
	letter-spacing: -0.016em;
	line-height: 1.25 !important;
	padding: 7px 0 !important;
}

html.ibs-ds .menu_mobile_nav > li > ul > li > a {
	color: rgba(255, 255, 255, 0.60) !important;
	font-size: 0.875rem !important;
	font-weight: 400;
	line-height: 1.3 !important;
	padding: 4px 0 4px 15px !important;
	position: relative;
}
html.ibs-ds .menu_mobile_nav > li > ul > li > a::before {
	content: '';
	position: absolute;
	inset-inline-start: 0;
	inset-block-start: 50%;
	width: 8px;
	height: 1px;
	background: currentColor;
	opacity: 0.55;
}

/* --------------------------------------------------------------------------
   The closing block: the actions the theme's menu never carried.
   -------------------------------------------------------------------------- */
.ibs-mm-extra {
	margin-top: 14px;
	padding-top: 14px;
	border-top: 1px solid rgba(255, 255, 255, 0.14);
}

.ibs-mm-extra__actions { display: grid; gap: 8px; }

.ibs-mm-extra__wa,
.ibs-mm-extra__cta {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 9px;
	min-height: 48px;
	padding: 0 20px;
	border-radius: var(--r);
	font-family: var(--sans);
	font-size: 0.9375rem;
	font-weight: 600;
	letter-spacing: -0.006em;
	text-decoration: none;
}
/* WhatsApp keeps its own green: it is a channel with an identity, and painting
   it brand blue would make it read as one more site button. */
.ibs-mm-extra__wa { background: #25d366; color: #06301a; }
.ibs-mm-extra__wa svg { width: 18px; height: 18px; }

.ibs-mm-extra__cta {
	background: transparent;
	color: #fff;
	border: 1px solid rgba(255, 255, 255, 0.42);
}

.ibs-mm-extra__foot {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	margin-top: 12px;
}

.ibs-mm-extra__meta {
	margin: 0;
	font-size: 0.8125rem;
	line-height: 1.6;
	color: rgba(255, 255, 255, 0.66);
}
.ibs-mm-extra__meta a { color: #fff; text-decoration: none; }

.ibs-mm-extra__lang {
	display: flex;
	gap: 2px;
	padding: 3px;
	border: 1px solid rgba(255, 255, 255, 0.18);
	border-radius: var(--r);
}
.ibs-mm-extra__lang a {
	display: inline-flex;
	align-items: center;
	min-height: 32px;
	padding: 0 13px;
	border-radius: var(--r);
	font-family: var(--mono);
	font-size: 0.75rem;
	letter-spacing: 0.06em;
	color: rgba(255, 255, 255, 0.60);
	text-decoration: none;
}
.ibs-mm-extra__lang a[aria-current="true"] { background: rgba(255,255,255,.15); color: #fff; }

.ibs-mm-extra__social {
	display: flex;
	flex-wrap: wrap;
	gap: 4px 16px;
	list-style: none;
	margin: 10px 0 0;
	padding: 0;
}
.ibs-mm-extra__social a {
	display: inline-flex;
	align-items: center;
	min-height: 30px;
	color: rgba(255, 255, 255, 0.60);
	font-family: var(--sans);
	font-size: 0.75rem;
	text-decoration: none;
}

/* --------------------------------------------------------------------------
   Warna tulisan di blok ini, dinyatakan ulang dengan kekhususan yang cukup.

   Seluruh warna di atas ditulis sebagai satu kelas — .ibs-mm-extra__wa dan
   sejenisnya, (0,1,0). Tema menulis `.menu_mobile .menu_mobile_inner a` di
   (0,2,1), dan setiap <a> di blok ini adalah <a> di dalam .menu_mobile_inner.
   Jadi tema yang menang, dan seluruh blok mewarisi abu #bdbac2 miliknya.

   Yang paling parah tombol WhatsApp: abu itu di atas hijau #25d366 terukur
   1.04:1 — tulisannya praktis tidak ada, di tombol yang paling sering ditekan
   orang di pasar ini. Tinta gelapnya sendiri memberi 8.1:1.

   Empat kelas melawan dua; tidak ada !important yang diperlukan.
   -------------------------------------------------------------------------- */
html.ibs-ds .menu_mobile .menu_mobile_inner .ibs-mm-extra__wa {
	color: #06301a;
}
html.ibs-ds .menu_mobile .menu_mobile_inner .ibs-mm-extra__cta,
html.ibs-ds .menu_mobile .menu_mobile_inner .ibs-mm-extra__meta a {
	color: #fff;
}
html.ibs-ds .menu_mobile .menu_mobile_inner .ibs-mm-extra__lang a,
html.ibs-ds .menu_mobile .menu_mobile_inner .ibs-mm-extra__social a {
	color: rgba(255, 255, 255, 0.72);   /* 8.6:1 di atas bidang panel */
}
html.ibs-ds .menu_mobile .menu_mobile_inner .ibs-mm-extra__lang a[aria-current="true"],
html.ibs-ds .menu_mobile .menu_mobile_inner .ibs-mm-extra__social a:hover {
	color: #fff;
}

/* ==========================================================================
   The "Subscribe for the Updates!" panel.

   The left half of that popup is a column whose background is
   /wp-content/uploads/2020/06/l-img-copyright-25.jpg — a demo file that shipped
   with the theme, watermark included, sitting across the middle of the frame.

   The popup itself is an Elementor layout stored in the database (id 7074) and
   is served to the live site too, so it is not edited here. What is done here
   is preview-scoped: the demo file is taken out of the composition and the
   column becomes a plain navy field, which is what the panel would have looked
   like if it had been designed rather than assembled from a demo.

   When IBS's own photograph arrives, swap the background-image below for it and
   delete the gradient — and change it in Elementor for the live site, which is
   the only place the watermark can actually be removed for real visitors.
   ========================================================================== */
html body.ibs-ds-on .elementor-7074 .elementor-element.elementor-element-91a3141:not(.elementor-motion-effects-element-type-background) > .elementor-widget-wrap,
html body.ibs-ds-on .elementor-7074 .elementor-element.elementor-element-91a3141 > .elementor-widget-wrap > .elementor-motion-effects-container > .elementor-motion-effects-layer {
	background-image: linear-gradient(155deg, #0d2559 0%, #0a1020 100%);
}
