/* ================================
   GLOBAL
================================ */

* {
    box-sizing: border-box;
}

/*
   The public CMS modules hide a section and its navigation
   entries with the hidden attribute when nothing is published.
   Several classes below set display explicitly, which outranks
   the browser's own [hidden] rule and would leave a link
   pointing at a section that is no longer on the page, so the
   attribute is given the last word here.
*/

[hidden] {
    display: none !important;
}

html {
    scroll-behavior: smooth;
}

body {
    font-family:
        -apple-system,
        BlinkMacSystemFont,
        "SF Pro Text",
        "Segoe UI",
        Roboto,
        Helvetica,
        Arial,
        sans-serif;
    margin: 0;
    color: #1d1d1f;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

section {
    padding: 100px 10%;
}



/* =========================================
   FLOATING EXPANDING NAVBAR
========================================= */

.portfolio-nav {
    width: min(880px, calc(100% - 40px));

    position: sticky;
    top: 14px;

    z-index: 1000;

    margin:
        14px auto
        -70px;

    padding: 0;

    background-color:
        rgba(255, 255, 255, 0.8);

    border:
        1px solid
        rgba(210, 210, 215, 0.8);

    border-radius: 980px;

    backdrop-filter: saturate(180%) blur(20px);
    -webkit-backdrop-filter: saturate(180%) blur(20px);

    box-shadow: none;

    transition:
        width 0.55s
            cubic-bezier(0.22, 1, 0.36, 1),
        top 0.45s
            cubic-bezier(0.22, 1, 0.36, 1),
        margin 0.45s ease,
        border-radius 0.45s ease,
        box-shadow 0.45s ease,
        background-color 0.45s ease;

    overflow: hidden;
}


/* =========================================
   INNER
========================================= */

.portfolio-nav-inner {
    width: 100%;

    min-height: 58px;

    display: grid;

    grid-template-columns:
        auto minmax(0, 1fr) auto auto;

    align-items: center;

    gap: 18px;

    padding: 7px 10px 7px 20px;

    transition:
        min-height 0.45s ease,
        padding 0.45s ease;
}


/* =========================================
   LOGO
========================================= */

.portfolio-nav-logo {
    white-space: nowrap;

    text-decoration: none;

    font-size: 14px;
    font-weight: 700;

    color: #1d1d1f;

    transition:
        color 0.3s ease;
}


.portfolio-nav-logo:hover {
    color: #0071e3;
}


/* =========================================
   LINKS
========================================= */

.portfolio-nav-links {
    /* Without this, the grid track under it (1fr) refuses to shrink below
       the flex row's natural content width and the whole navbar overflows
       its fixed pill width — invisibly, since .portfolio-nav clips with
       overflow:hidden instead of visibly wrapping. */
    min-width: 0;

    display: flex;

    justify-content: center;
    align-items: center;

    gap: 22px;
}


.portfolio-nav-links a {
    position: relative;

    padding: 8px 0;

    text-decoration: none;

    font-size: 12px;
    font-weight: 500;

    color: #6e6e73;

    transition:
        color 0.3s ease,
        transform 0.3s ease;
}


/* underline */

.portfolio-nav-links a::after {
    content: "";

    width: 0;
    height: 2px;

    position: absolute;

    left: 50%;
    bottom: 1px;

    transform:
        translateX(-50%);

    border-radius: 20px;

    background-color: #0071e3;

    transition:
        width 0.3s ease;
}


.portfolio-nav-links a:hover,
.portfolio-nav-links a.active {
    color: #0071e3;
}


.portfolio-nav-links a:hover {
    transform:
        translateY(-1px);
}


.portfolio-nav-links a:hover::after,
.portfolio-nav-links a.active::after {
    width: 100%;
}


/* =========================================
   CONTACT BUTTON
========================================= */

.portfolio-nav-contact {
    min-height: 43px;

    display: inline-flex;

    justify-content: center;
    align-items: center;

    gap: 8px;

    padding: 0 18px;

    border-radius: 30px;

    background-color: #1d1d1f;

    text-decoration: none;

    white-space: nowrap;

    font-size: 12px;
    font-weight: 600;

    color: #ffffff;

    transition:
        transform 0.3s
            cubic-bezier(0.22, 1, 0.36, 1),
        background-color 0.3s ease,
        box-shadow 0.3s ease;
}


.portfolio-nav-contact .nav-arrow {
    transition:
        transform 0.3s ease;
}


.portfolio-nav-contact:hover {
    background-color: #0071e3;

    transform:
        translateY(-2px);

    box-shadow:
        0 10px 25px
        rgba(0, 113, 227, 0.20);
}


.portfolio-nav-contact:hover .nav-arrow {
    transform:
        translate(
            2px,
            -2px
        );
}


/* =========================================
   LANGUAGE SWITCH (EN | ID)
   Compact, text-only control — no card, no pill, no extra navbar
   height. Sits between the desktop links and the mobile toggle;
   a second instance (same markup, via createLanguageSwitch) lives
   inside the mobile menu.
========================================= */

.nav-lang-slot {
    display: flex;
    align-items: center;
}

.lang-switch {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    padding: 3px;
    border: 1px solid rgba(29, 29, 31, 0.12);
    border-radius: 999px;
    background: rgba(29, 29, 31, 0.03);
}

.lang-switch-option {
    min-width: 30px;
    padding: 4px 9px;
    border: 0;
    border-radius: 999px;
    background: transparent;
    color: #6e6e73;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.03em;
    line-height: 1;
    cursor: pointer;
    transition: background-color 0.2s ease, color 0.2s ease;
}

.lang-switch-option:hover {
    color: #1d1d1f;
}

.lang-switch-option.is-active {
    background: #1d1d1f;
    color: #ffffff;
}

.lang-switch-option:focus-visible {
    outline: 2px solid #0071e3;
    outline-offset: 2px;
}

.nav-lang-slot-mobile {
    justify-content: center;
    margin-top: 12px;
}


/* =========================================
   AFTER SCROLL
   NAVBAR MELEBAR
========================================= */

.portfolio-nav.is-expanded {
    width: 100%;

    top: 0;

    margin:
        0 auto
        -70px;

    border-radius: 0;

    border-left: none;
    border-right: none;
    border-top: none;

    background-color:
        rgba(255, 255, 255, 0.98);

    box-shadow:
        0 7px 25px
        rgba(29, 29, 31, 0.07);
}


/* INNER SAAT EXPANDED */

.portfolio-nav.is-expanded
.portfolio-nav-inner {

    min-height: 68px;

    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;

    padding:
        8px 0;
}


/* =========================================
   MOBILE
========================================= */

@media (max-width: 900px) {

    .portfolio-nav {
        width:
            calc(100% - 24px);
    }


    .portfolio-nav-inner {
        grid-template-columns:
            auto 1fr;

        gap: 15px;
    }


    .portfolio-nav-links {
        display: none;
    }


    .portfolio-nav-contact {
        justify-self: end;
    }


    .portfolio-nav.is-expanded
    .portfolio-nav-inner {

        width: 90%;
    }

}
/* ================================
   NAVBAR EFFECT (scroll state)
================================ */

nav {
    transition:
        box-shadow 0.35s ease,
        background-color 0.35s ease;
}
/* =========================================
   ABOUT FULL WIDTH
========================================= */

.about-full {
    width: 100%;

    padding: 0;

    position: relative;

    overflow: hidden;

    background-color: #ffffff;
}


/* =========================================
   MAIN SLIDER
========================================= */

.about-full-slider {
    width: 100%;

    position: relative;

    overflow: hidden;
}


.about-full-track {
    width: 100%;

    display: flex;

    transition:
        transform 0.7s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );

    will-change: transform;
}


/* =========================================
   EACH FULL SLIDE
========================================= */

.about-full-slide {
    width: 100%;
    min-width: 100%;

    min-height: 760px;

    position: relative;

    display: flex;

    align-items: center;

    padding: 100px 0 115px;
}


/*
    Sekarang yang berbeda warnanya
    adalah SATU SLIDE PENUH,
    bukan card di dalam section.
*/

.about-slide-one {
    background-color: #f5f5f7;
}


.about-slide-two {
    background-color: #ffffff;
}


.about-slide-three {
    background-color: #f5f5f7;
}


/* =========================================
   INNER CONTENT WIDTH
========================================= */

.about-full-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;

    display: grid;

    grid-template-columns:
        43% 57%;

    align-items: center;

    gap: 70px;
}


/* =========================================
   COMMON LABEL
========================================= */

.about-section-label {
    display: flex;

    align-items: center;

    gap: 13px;

    margin-bottom: 18px;
}


.about-section-label > span {
    width: 35px;
    height: 2px;

    background-color: #0071e3;

    border-radius: 20px;
}


.about-section-label p {
    margin: 0;

    font-size: 12px;
    font-weight: 700;

    letter-spacing: 2.5px;

    color: #0071e3;
}


/* =========================================
   COMMON TITLE
========================================= */

.about-profile-content h2,
.about-org-content h2,
.about-stack-heading h2 {
    margin:
        0 0 24px;

    font-size: 43px;

    line-height: 1.15;

    color: #1d1d1f;
}


.about-profile-content h2 span,
.about-org-content h2 span,
.about-stack-heading h2 span {
    color: #0071e3;
}


/* =========================================
   DESCRIPTION
========================================= */

.about-description {
    max-width: 720px;

    margin:
        0 0 17px;

    font-size: 15px;

    line-height: 1.9;

    color: #424245;
}


/* =========================================
   SLIDE 1
   PROFILE PHOTO
========================================= */

.about-profile-side {
    min-height: 530px;

    position: relative;

    display: flex;

    justify-content: center;
    align-items: flex-end;
}


/* SOFT PURPLE SHAPE */

.about-profile-decoration {
    width: 400px;
    height: 400px;

    position: absolute;

    left: 50%;
    bottom: 20px;

    transform:
        translateX(-50%);

    background:
        radial-gradient(
            circle,
            rgba(0, 113, 227, 0.14),
            rgba(0, 113, 227, 0.04) 55%,
            transparent 72%
        );

    border-radius:
        48% 52% 43% 57%
        / 59% 44% 56% 41%;
}


/* PHOTO */

.about-profile-photo {
    width: 440px;

    position: relative;

    z-index: 2;
}


.about-profile-photo img {
    width: 100%;
    height: auto;

    display: block;

    object-fit: contain;

    filter:
        drop-shadow(
            0 22px 28px
            rgba(29, 29, 31, 0.12)
        );
}


/* BADGE */

.about-profile-badge {
    position: absolute;

    left: 15px;
    bottom: 35px;

    z-index: 4;

    display: flex;

    align-items: center;

    gap: 9px;

    padding:
        10px 14px;

    background-color: #ffffff;

    border:
        1px solid #d2d2d7;

    border-radius: 30px;

    font-size: 10px;
    font-weight: 700;

    letter-spacing: 1.5px;

    color: #424245;
}


.about-profile-badge span {
    color: #0071e3;
}


/* =========================================
   AREA OF INTEREST
========================================= */

.about-expertise {
    margin-top: 32px;
}


.about-small-title {
    margin:
        0 0 14px;

    font-size: 10px;
    font-weight: 700;

    letter-spacing: 2px;

    color: #86868b;
}


.about-expertise-list {
    display: flex;

    flex-wrap: wrap;

    gap: 9px;
}


.about-expertise-list span {
    padding:
        8px 13px;

    background-color: #ffffff;

    border:
        1px solid #d2d2d7;

    border-radius: 25px;

    font-size: 11px;

    color: #424245;

    transition:
        color 0.3s ease,
        border-color 0.3s ease,
        transform 0.3s ease;
}


.about-expertise-list span:hover {
    color: #0071e3;

    border-color:
        rgba(0, 113, 227, 0.30);

    transform:
        translateY(-2px);
}


/* =========================================
   SLIDE 2
========================================= */

.about-organization-layout {
    grid-template-columns:
        50% 50%;

    gap: 75px;
}


/* =========================================
   ORGANIZATION PHOTO AREA
========================================= */

.about-org-visual {
    position: relative;
}


.about-org-number {
    margin-bottom: 15px;

    font-size: 11px;
    font-weight: 700;

    letter-spacing: 2px;

    color: #0071e3;
}


.about-org-gallery {
    width: 100%;

    overflow: hidden;

    border-radius: 24px;
}


.about-org-track {
    width: 100%;

    display: flex;

    transition:
        transform 0.55s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


.about-org-photo {
    min-width: 100%;
}


.about-org-photo img {
    width: 100%;
    height: 500px;

    display: block;

    object-fit: cover;

    border-radius: 24px;
}


/* INNER CONTROLS */

.about-org-controls {
    margin-top: 18px;

    display: flex;

    align-items: center;

    gap: 10px;
}


.about-org-button {
    width: 42px;
    height: 42px;

    display: flex;

    justify-content: center;
    align-items: center;

    border:
        1px solid #d2d2d7;

    border-radius: 50%;

    background-color: #ffffff;

    color: #1d1d1f;

    cursor: pointer;

    transition:
        color 0.3s ease,
        background-color 0.3s ease,
        border-color 0.3s ease;
}


.about-org-button:hover {
    color: #ffffff;

    background-color: #0071e3;

    border-color: #0071e3;
}


/* INNER DOTS */

.about-org-dots {
    margin-left: 5px;

    display: flex;

    gap: 7px;

    align-items: center;
}


.about-org-dot {
    width: 8px;
    height: 8px;

    padding: 0;

    border: 0;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.3s ease,
        background-color 0.3s ease;
}


.about-org-dot.active {
    width: 25px;

    background-color: #0071e3;
}


/* =========================================
   ORGANIZATION SKILLS
========================================= */

.about-org-skills {
    margin-top: 30px;

    display: grid;

    gap: 13px;
}


.about-org-skills > div {
    padding:
        14px 17px;

    display: flex;

    flex-direction: column;

    gap: 4px;

    border-left:
        2px solid #d2d2d7;

    transition:
        border-color 0.3s ease,
        transform 0.3s ease;
}


.about-org-skills > div:hover {
    border-color: #0071e3;

    transform:
        translateX(4px);
}


.about-org-skills strong {
    font-size: 13px;

    color: #1d1d1f;
}


.about-org-skills span {
    font-size: 12px;

    color: #6e6e73;
}

/* =========================================
   ABOUT
   SLIDE 03 - TECH STACK
========================================= */

.about-slide-three {
    background-color: #f5f5f7;
}


/* =========================================
   CONTAINER
========================================= */

.about-tech-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;
}


/* =========================================
   HEADING
========================================= */

.about-tech-heading {
    max-width: 760px;

    margin-bottom: 50px;
}


.about-tech-heading h2 {
    margin: 0 0 18px;

    font-size: 43px;
    font-weight: 700;

    line-height: 1.15;

    color: #1d1d1f;
}


.about-tech-heading h2 span {
    color: #0071e3;
}


.about-tech-description {
    max-width: 680px;

    margin: 0;

    font-size: 15px;

    line-height: 1.8;

    color: #6e6e73;
}


/* =========================================
   CATEGORY
========================================= */

.tech-category {
    width: 100%;

    padding: 25px 0;

    border-top:
        1px solid #d2d2d7;
}


/*
   Tidak perlu border di bawah kategori
   terakhir karena terlalu ramai.
*/

.tech-category:last-child {
    padding-bottom: 0;
}


/* =========================================
   CATEGORY HEADING
========================================= */

.tech-category-heading {
    margin-bottom: 20px;

    display: flex;

    align-items: center;

    gap: 12px;
}


.tech-category-number {
    font-size: 10px;

    font-weight: 700;

    color: #2997ff;
}


.tech-category-heading h3 {
    margin: 0;

    font-size: 11px;

    font-weight: 700;

    letter-spacing: 2px;

    color: #6e6e73;
}


/* =========================================
   TECH LIST
========================================= */

.tech-list {
    display: flex;

    flex-wrap: wrap;

    align-items: center;

    gap:
        17px 22px;
}


/* =========================================
   TECH ITEM
========================================= */

.tech-item {
    min-width: 130px;

    position: relative;

    display: flex;

    align-items: center;

    gap: 11px;

    padding:
        9px 13px;

    border-radius: 12px;

    cursor: default;

    transition:
        transform 0.3s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        ),

        background-color 0.3s ease;
}


/* =========================================
   ICON
========================================= */

.tech-item > i {
    width: 33px;

    flex-shrink: 0;

    font-size: 31px;

    text-align: center;

    transition:
        transform 0.35s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


/* =========================================
   NAME
========================================= */

.tech-item > span {
    font-size: 13px;

    font-weight: 600;

    color: #424245;

    transition:
        color 0.3s ease;
}


/* =========================================
   HOVER
========================================= */

.tech-item:hover {
    transform:
        translateY(-3px);

    background-color:
        #ffffff;
}


.tech-item:hover > i {
    transform:
        scale(1.12)
        rotate(-3deg);
}


.tech-item:hover > span {
    color: #0071e3;
}


/* =========================================
   CUSTOM ICON

   Untuk teknologi yang icon Devicon-nya
   tidak kita gunakan.
========================================= */

.tech-custom-icon {
    width: 33px;
    height: 33px;

    flex-shrink: 0;

    display: flex;

    justify-content: center;
    align-items: center;

    border-radius: 8px;

    background-color: #f5f5f7;

    font-size: 8px;
    font-weight: 800;

    letter-spacing: 0.5px;

    color: #0071e3;

    transition:
        transform 0.35s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        ),

        background-color 0.3s ease,
        color 0.3s ease;
}


/* CANVA */

.tech-canva-icon {
    background:
        linear-gradient(
            135deg,
            #00c4cc,
            #7d2ae8
        );

    color: #ffffff;

    font-size: 16px;

    font-style: italic;
}


/* CUSTOM ICON HOVER */

.tech-item:hover
.tech-custom-icon {

    transform:
        scale(1.12)
        rotate(-3deg);
}


/* =========================================
   OPTIONAL LITTLE UNDERLINE
========================================= */

.tech-item::after {
    content: "";

    position: absolute;

    left: 13px;
    right: 13px;
    bottom: 3px;

    height: 2px;

    background-color: #0071e3;

    border-radius: 10px;

    transform:
        scaleX(0);

    transform-origin:
        left center;

    transition:
        transform 0.3s ease;
}


.tech-item:hover::after {
    transform:
        scaleX(1);
}


/* =========================================
   TABLET
========================================= */

@media (max-width: 1000px) {

    .about-tech-container {
        width: 86%;
    }


    .tech-list {
        display: grid;

        grid-template-columns:
            repeat(3, 1fr);

        gap: 15px;
    }


    .tech-item {
        min-width: 0;
    }

}


/* =========================================
   MOBILE
========================================= */

@media (max-width: 650px) {

    .about-tech-container {
        width: 88%;
    }


    .about-tech-heading {
        margin-bottom: 35px;
    }


    .about-tech-heading h2 {
        font-size: 32px;
    }


    .about-tech-description {
        font-size: 14px;
    }


    .tech-category {
        padding: 22px 0;
    }


    /*
       2 column mobile.
    */

    .tech-list {
        grid-template-columns:
            repeat(2, 1fr);

        gap:
            12px 8px;
    }


    .tech-item {
        padding:
            8px 6px;

        gap: 9px;
    }


    .tech-item > i {
        width: 28px;

        font-size: 27px;
    }


    .tech-custom-icon {
        width: 28px;
        height: 28px;
    }


    .tech-item > span {
        font-size: 12px;
    }

}


/* =========================================
   VERY SMALL MOBILE
========================================= */

@media (max-width: 380px) {

    .tech-list {
        grid-template-columns:
            1fr 1fr;
    }


    .tech-item > span {
        font-size: 11px;
    }

}


/* =========================================
   REDUCED MOTION
========================================= */

@media (prefers-reduced-motion: reduce) {

    .tech-item,
    .tech-item > i,
    .tech-custom-icon,
    .tech-item::after {

        transition:
            none !important;
    }

}

/* =========================================
   MAIN NAVIGATION ARROWS
========================================= */

.about-navigation {
    width: 48px;
    height: 48px;

    position: absolute;

    top: 50%;

    z-index: 20;

    display: flex;

    justify-content: center;
    align-items: center;

    transform:
        translateY(-50%);

    border:
        1px solid #d2d2d7;

    border-radius: 50%;

    background-color:
        rgba(255, 255, 255, 0.92);

    color: #1d1d1f;

    cursor: pointer;

    transition:
        background-color 0.3s ease,
        color 0.3s ease,
        border-color 0.3s ease,
        transform 0.3s ease;
}


.about-navigation:hover {
    background-color: #0071e3;

    color: #ffffff;

    border-color: #0071e3;

    transform:
        translateY(-50%)
        scale(1.06);
}


.about-navigation-prev {
    left: 3%;
}


.about-navigation-next {
    right: 3%;
}


/* =========================================
   MAIN DOTS
========================================= */

.about-navigation-dots {
    position: absolute;

    left: 50%;
    bottom: 38px;

    z-index: 20;

    display: flex;

    align-items: center;

    gap: 8px;

    transform:
        translateX(-50%);
}


.about-navigation-dot {
    width: 8px;
    height: 8px;

    padding: 0;

    border: 0;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.35s ease,
        background-color 0.35s ease;
}


.about-navigation-dot.active {
    width: 30px;

    background-color: #0071e3;
}


/* =========================================
   TABLET
========================================= */

@media (max-width: 1000px) {

    .about-full-slide {
        min-height: auto;

        padding:
            90px 0 110px;
    }


    .about-full-container,
    .about-organization-layout {
        width: 86%;

        grid-template-columns:
            1fr;

        gap: 45px;
    }


    .about-profile-side {
        min-height: 470px;
    }


    .about-profile-photo {
        width: 380px;
    }


    .about-profile-content,
    .about-org-content {
        max-width: 760px;

        margin: 0 auto;
    }


    .about-org-gallery {
        max-width: 650px;

        margin: 0 auto;
    }


    .about-org-controls {
        justify-content: center;
    }


    .about-stack-container {
        width: 86%;
    }


    .about-navigation-prev {
        left: 20px;
    }


    .about-navigation-next {
        right: 20px;
    }

}


/* =========================================
   MOBILE
========================================= */

@media (max-width: 650px) {

    .about-full-slide {
        padding:
            70px 0 100px;
    }


    .about-full-container,
    .about-stack-container {
        width: 88%;
    }


    .about-profile-side {
        min-height: 380px;
    }


    .about-profile-photo {
        width: 300px;
    }


    .about-profile-decoration {
        width: 300px;
        height: 300px;
    }


    .about-profile-content h2,
    .about-org-content h2,
    .about-stack-heading h2 {
        font-size: 32px;
    }


    .about-description {
        font-size: 14px;
    }


    .about-org-photo img {
        height: 360px;
    }


    .about-stack-grid {
        grid-template-columns:
            1fr;
    }


    /*
        Arrow dipindahkan mendekati bawah
        agar tidak menutup isi.
    */

    .about-navigation {
        top: auto;
        bottom: 23px;

        width: 40px;
        height: 40px;

        transform: none;
    }


    .about-navigation:hover {
        transform:
            scale(1.05);
    }


    .about-navigation-prev {
        left: 7%;
    }


    .about-navigation-next {
        right: 7%;
    }


    .about-navigation-dots {
        bottom: 39px;
    }

}
/* =========================================
   ABOUT DRAG / SWIPE
========================================= */

.about-full-slider {
    cursor: grab;

    /*
        Tetap mengizinkan scroll vertikal
        di HP, tetapi kita bisa swipe horizontal.
    */
    touch-action: pan-y;

    user-select: none;
}


.about-full-slider.is-dragging {
    cursor: grabbing;
}


/*
   Saat sedang ditarik,
   transition dimatikan sementara
   agar slide benar-benar mengikuti cursor.
*/

.about-full-slider.is-dragging
.about-full-track {

    transition: none;
}


/*
   Mencegah browser mencoba menyeret
   file gambar secara native.
*/

.about-full-slider img {
    user-select: none;

    -webkit-user-drag: none;

    pointer-events: none;
}
/* ================================
   JUDUL PORTFOLIO
================================ */

.portfolio-heading {
    max-width: 700px;
    margin-bottom: 50px;
}


.portfolio-label {
    margin: 0 0 10px;

    font-size: 14px;
    font-weight: 700;

    letter-spacing: 2px;

    color: #0071e3;
}


.portfolio-heading h2 {
    margin: 0 0 15px;

    font-size: 42px;
    font-weight: 700;

    line-height: 1.2;

    color: #1d1d1f;
}


.portfolio-description {
    margin: 0;

    max-width: 600px;

    font-size: 16px;
    line-height: 1.7;

    color: #6e6e73;
}


/* =========================================
   CARD SNAP
========================================= */

.project-card {
    min-width: 0;

    scroll-snap-align: start;

    scroll-snap-stop: always;
}


/* =========================================
   PREVENT IMAGE DRAG
========================================= */

.project-card img {
    user-select: none;

    -webkit-user-drag: none;

    pointer-events: none;
}

/* ================================
   PROJECT CARD

   Satu kartu = satu project. Wadah luar inilah yang bikin
   tiap project terbaca sebagai unit yang sama, bukan
   tumpukan gambar + teks yang tingginya beda-beda.

   Kuncinya ada tiga:
   - kartu jadi flex column, isinya .project-content
     ikut memanjang (flex: 1)
   - judul & deskripsi diberi min-height tetap
   - blok tech + link didorong ke bawah (margin-top: auto)
   sehingga posisi tiap bagian SEJAJAR di semua kartu,
   berapa pun panjang teksnya.

   Catatan: sengaja TANPA backdrop-filter. Carousel ini
   auto-scroll terus-menerus dengan 12 kartu (6 asli + 6
   klon); blur backdrop per frame di 12 elemen sebesar ini
   mahal, terutama di HP. Di atas background section yang
   rata, isian semi-transparan memberi tampilan yang sama
   tanpa biaya itu.
================================ */

.project-card {
    display: flex;

    flex-direction: column;

    padding: 14px 14px 22px;

    border-radius: 24px;

    border: 1px solid rgba(0, 0, 0, 0.09);

    background-color: rgba(244, 244, 247, 0.92);

    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 1px 2px rgba(0, 0, 0, 0.04),
        0 10px 30px rgba(0, 0, 0, 0.05);

    overflow: hidden;

    transition:
        transform 0.4s cubic-bezier(0.22, 1, 0.36, 1),
        box-shadow 0.4s ease,
        border-color 0.4s ease;
}


.project-card:hover {
    transform: translateY(-5px);

    border-color: rgba(0, 0, 0, 0.10);

    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.9),
        0 2px 4px rgba(0, 0, 0, 0.05),
        0 18px 44px rgba(0, 0, 0, 0.10);
}


/* ================================
   PROJECT IMAGE

   aspect-ratio, bukan tinggi px mati — supaya proporsinya
   tetap sama persis di semua lebar kartu / breakpoint.
================================ */

.project-image {
    width: 100%;

    aspect-ratio: 3 / 2;

    flex-shrink: 0;

    overflow: hidden;

    border-radius: 14px;

    background-color: #e8e8ed;
}


.project-image img {
    width: 100%;
    height: 100%;

    object-fit: cover;

    display: block;

    transition: transform 0.4s ease;
}


.project-card:hover .project-image img {
    transform: scale(1.05);
}


/* ================================
   PROJECT CONTENT
================================ */

.project-content {
    /* Memanjang mengisi sisa kartu — inilah yang memberi
       ruang bagi margin-top: auto di .project-tech. */
    flex: 1;

    display: flex;

    flex-direction: column;

    padding: 20px 6px 0;
}


.project-category {
    margin: 0 0 10px;

    font-size: 11px;
    font-weight: 600;

    letter-spacing: 1.5px;
    text-transform: uppercase;

    color: #86868b;
}


/* min-height 2 baris: judul 1 baris dan 2 baris sama-sama
   memakai ruang yang sama, jadi deskripsi di semua kartu
   mulai pada garis yang sama.

   align-items: flex-end menempelkan judul ke dasar kotak
   itu — sisa ruangnya jatuh di ATAS judul, bukan di antara
   judul dan deskripsi. Efeknya baris terakhir judul selalu
   duduk di garis yang sama, dan judul tetap rapat dengan
   deskripsinya. */
.project-content h3 {
    margin: 0 0 12px;

    min-height: 2.6em;

    display: flex;

    align-items: flex-end;

    font-size: 22px;
    font-weight: 600;

    line-height: 1.3;

    letter-spacing: -0.3px;

    color: #1d1d1f;
}


/* min-height 4 baris, TANPA line-clamp — deskripsi pendek
   tetap menyisakan ruang yang sama, deskripsi panjang tidak
   terpotong diam-diam. */
.project-text {
    margin: 0 0 18px;

    min-height: 6.6em;

    font-size: 14px;
    line-height: 1.65;

    color: #6e6e73;
}


/* ================================
   TECH STACK BADGE
================================ */

/* margin-top: auto mendorong blok ini (dan link di bawahnya)
   ke dasar kartu — jadi baris tech dan tombol "Lihat Project"
   berada di ketinggian yang sama persis di semua kartu. */
.project-tech {
    display: flex;

    flex-wrap: wrap;

    gap: 0;

    margin-top: auto;
    margin-bottom: 16px;

    border-top: 1px solid rgba(0, 0, 0, 0.10);

    padding-top: 14px;
}


.project-tech span {
    padding: 0 12px 0 0;

    margin-right: 12px;

    border-right: 1px solid rgba(0, 0, 0, 0.14);

    font-size: 11px;
    font-weight: 500;

    letter-spacing: 0.6px;
    text-transform: uppercase;

    color: #6e6e73;
}

.project-tech span:last-child {
    padding-right: 0;
    margin-right: 0;
    border-right: none;
}
.tech-local-icon {
    width: 33px;
    height: 33px;

    object-fit: contain;
    flex-shrink: 0;

    display: block;

    transition:
        transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
}

.tech-item:hover .tech-local-icon {
    transform: scale(1.12) rotate(-3deg);
}

/* ================================
   PROJECT LINK
================================ */

.project-link {
    /* align-self: flex-start supaya lebarnya ikut teks, bukan
       selebar kartu — kalau tidak, area kliknya melebar
       sampai ke tepi kartu. */
    align-self: flex-start;

    display: inline-block;

    text-decoration: none;

    color: #0071e3;

    font-size: 14px;
    font-weight: 600;

    transition: transform 0.2s ease;
}


.project-link:hover {
    transform: translateX(5px);
}


.project-link:focus-visible {
    outline: 2px solid #0071e3;

    outline-offset: 3px;

    border-radius: 4px;
}


/* ================================
   RESPONSIVE
================================ */

@media (max-width: 992px) {

    .project-grid {
        grid-template-columns: 1fr 1fr;
    }

}


@media (max-width: 650px) {

    .portfolio {
        padding: 70px 6%;
    }

    .project-grid {
        grid-template-columns: 1fr;
    }

    .portfolio-heading h2 {
        font-size: 32px;
    }

}/* =========================================
   PROJECT CASE STUDY
========================================= */

.case-study {
    max-width: 1200px;
    margin: 0 auto;
    padding: 80px 8% 120px;
}


/* BACK */

.case-back {
    display: inline-block;
    margin-bottom: 70px;

    color: #0071e3;

    font-size: 14px;
    font-weight: 600;

    text-decoration: none;
}


.case-back:hover {
    text-decoration: underline;
}


/* =========================================
   HERO
========================================= */

.case-hero {
    max-width: 900px;
    margin-bottom: 60px;
}


.case-label {
    margin: 0 0 12px;

    color: #0071e3;

    font-size: 14px;
    font-weight: 700;

    letter-spacing: 2px;
}


.case-hero h1 {
    margin: 0 0 20px;

    font-size: 60px;
    line-height: 1.1;

    color: #1d1d1f;
}


.case-subtitle {
    max-width: 750px;

    margin: 0;

    font-size: 18px;
    line-height: 1.8;

    color: #6e6e73;
}


/* TAG */

.case-tags {
    display: flex;
    flex-wrap: wrap;

    gap: 10px;

    margin-top: 25px;
}


.case-tags span {
    padding: 7px 14px;

    background-color: #f5f5f7;

    border-radius: 30px;

    color: #424245;

    font-size: 13px;
    font-weight: 500;
}


/* BUTTON */

.case-buttons {
    margin-top: 30px;
}


.case-primary-button {
    display: inline-block;

    padding: 12px 22px;

    background-color: #0071e3;

    color: white;

    border-radius: 8px;

    font-size: 14px;
    font-weight: 600;

    text-decoration: none;

    transition: 0.3s ease;
}


.case-primary-button:hover {
    background-color: #0066cc;
    transform: translateY(-2px);
}


/* =========================================
   COVER IMAGE
========================================= */

.case-cover {
    margin-bottom: 100px;

    border-radius: 20px;

    overflow: hidden;

    background-color: #f5f5f7;
}


.case-cover img {
    width: 100%;
    height: auto;

    display: block;
}


/* =========================================
   SECTION
========================================= */

.case-section {
    margin-bottom: 100px;
}


.case-section-title {
    display: grid;

    grid-template-columns: 70px 1fr;

    margin-bottom: 30px;
}


.case-section-title p {
    margin: 8px 0 0;

    color: #0071e3;

    font-size: 14px;
    font-weight: 700;
}


.case-section-title h2 {
    margin: 0;

    font-size: 36px;

    color: #1d1d1f;
}


.case-section-content {
    max-width: 780px;

    margin-left: 70px;
}


.case-section-content p {
    font-size: 16px;
    line-height: 1.8;

    color: #6e6e73;

    margin-top: 0;
    margin-bottom: 18px;
}


/* =========================================
   INFORMATION
========================================= */

.case-info-grid {
    display: grid;

    grid-template-columns: repeat(4, 1fr);

    gap: 20px;

    margin-bottom: 100px;
}


.case-info {
    padding: 24px;

    background-color: #f5f5f7;

    border-radius: 14px;
}


.case-info p {
    margin: 0 0 8px;

    font-size: 11px;
    font-weight: 700;

    letter-spacing: 1.5px;

    color: #0071e3;
}


.case-info h3 {
    margin: 0;

    font-size: 17px;

    color: #1d1d1f;
}


/* =========================================
   FEATURE
========================================= */

.feature-grid {
    display: grid;

    grid-template-columns: repeat(2, 1fr);

    gap: 20px;

    margin-left: 70px;
}


.feature-card {
    padding: 25px;

    border: 1px solid #d2d2d7;

    border-radius: 14px;
}


.feature-card h3 {
    margin: 0 0 10px;

    color: #1d1d1f;
}


.feature-card p {
    margin: 0;

    font-size: 14px;
    line-height: 1.7;

    color: #6e6e73;
}


/* =========================================
   GALLERY
========================================= */

.case-gallery {
    display: grid;

    grid-template-columns: 1fr 1fr;

    gap: 20px;

    margin-left: 70px;
}


.case-gallery img {
    width: 100%;

    border-radius: 14px;

    display: block;
}


/* =========================================
   BOTTOM
========================================= */

.case-bottom {
    text-align: center;

    padding-top: 30px;
}


/* =========================================
   RESPONSIVE
========================================= */

@media (max-width: 768px) {

    .case-study {
        padding: 60px 6% 100px;
    }


    .case-hero h1 {
        font-size: 40px;
    }


    .case-info-grid {
        grid-template-columns: 1fr 1fr;
    }


    .feature-grid,
    .case-gallery {
        grid-template-columns: 1fr;

        margin-left: 0;
    }


    .case-section-title {
        grid-template-columns: 1fr;
    }


    .case-section-content {
        margin-left: 0;
    }

}
/* =========================================
   EDUCATION MODERN
========================================= */

.education-modern {
    width: 100%;

    position: relative;

    padding: 100px 0;

    background-color: #1d1d1f;

    overflow: hidden;
}


/* =========================================
   BACKGROUND GEDUNG
========================================= */

.education-modern::before {
    content: "";

    position: absolute;

    inset: 0;

    background-image:
        url("../assets/images/backgrounds/background.png");

    background-repeat: no-repeat;

    background-position:
        center bottom;

    background-size:
        100% auto;

    opacity: 0.70;

    filter:
        grayscale(100%)
        contrast(115%);

    pointer-events: none;

    z-index: 0;
}


@media (max-width: 650px) {

    .education-modern::before {
        background-image:
            url("../assets/images/backgrounds/background-mobile.webp");
    }

}


/* =========================================
   PURPLE OVERLAY

   Membuat gambar gedung menyatu
   dengan background ungu.
========================================= */

.education-modern::after {
    content: "";

    position: absolute;

    inset: 0;

    background:
        linear-gradient(
            to bottom,

            rgba(29, 29, 31, 0.90) 0%,

            rgba(29, 29, 31, 0.82) 55%,

            rgba(29, 29, 31, 0.88) 100%
        );

    pointer-events: none;

    z-index: 1;
}


/* =========================================
   CONTAINER
========================================= */

.education-modern-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;

    position: relative;

    z-index: 2;
}


/* =========================================
   HEADING
========================================= */

.education-modern-heading {
    max-width: 700px;

    margin:
        0 auto 60px;

    text-align: center;
}


/* LABEL */
.education-modern-label {
    margin:
        0 0 12px;

    font-size: 14px;

    font-weight: 700;

    letter-spacing: 3px;

    color: #2997ff;
}


/* TITLE */
.education-modern-heading h2 {
    margin:
        0 0 14px;

    font-size: 42px;

    font-weight: 700;

    line-height: 1.2;

    color: #ffffff;
}


/* DESCRIPTION */
.education-modern-description {
    margin: 0;

    font-size: 15px;

    line-height: 1.7;

    color:
        rgba(255, 255, 255, 0.68);
}


/* =========================================
   EDUCATION LIST
========================================= */

.education-modern-list {
    display: flex;

    justify-content: center;

    align-items: flex-start;

    gap: 130px;
}


/* =========================================
   EDUCATION ITEM
========================================= */

.education-modern-item {
    width: 300px;

    padding:
        20px 20px 22px;

    display: flex;

    flex-direction: column;

    align-items: center;

    text-align: center;

    border:
        1px solid transparent;

    border-radius: 18px;

    transition:
        transform 0.35s ease,
        background-color 0.35s ease,
        border-color 0.35s ease,
        box-shadow 0.35s ease;
}


/* HOVER ITEM */
.education-modern-item:hover {
    transform:
        translateY(-8px);

    background-color:
        rgba(255, 255, 255, 0.04);

    border-color:
        rgba(255, 255, 255, 0.08);

    box-shadow:
        0 20px 40px
        rgba(0, 0, 0, 0.10);
}


/* =========================================
   LOGO WRAPPER

   Kedua logo menggunakan kotak
   dengan ukuran yang SAMA.
========================================= */

.education-logo-wrapper {
    width: 160px;
    height: 160px;

    margin:
        0 auto 22px;

    display: flex;

    justify-content: center;

    align-items: center;

    position: relative;

    border-radius: 50%;

    background-color:
        rgba(255, 255, 255, 0.025);

    transition:
        transform 0.35s ease,
        background-color 0.35s ease;
}


/* HOVER WRAPPER */
.education-modern-item:hover
.education-logo-wrapper {

    transform:
        translateY(-3px);

    background-color:
        rgba(255, 255, 255, 0.05);
}


/* =========================================
   BASE LOGO
========================================= */

.education-logo {
    display: block;

    width: auto;
    height: auto;

    object-fit: contain;

    filter:
        grayscale(100%)
        brightness(1.05);

    opacity: 0.82;

    transition:
        transform 0.35s ease,
        filter 0.35s ease,
        opacity 0.35s ease;
}


/* =========================================
   SMA LOGO

   Ukuran visual normal.
========================================= */

.logo-sma {
    max-width: 118px;
    max-height: 118px;

    transform:
        scale(1);
}


/* =========================================
   TELKOM LOGO

   Dibuat lebih besar karena file logo
   Telkom memiliki transparent space
   lebih banyak.
========================================= */

.logo-telkom {
    max-width: 118px;
    max-height: 118px;

    transform:
        scale(1.48);
}


/* =========================================
   LOGO HOVER
========================================= */

.education-modern-item:hover
.logo-sma {

    transform:
        scale(1.07);

    filter:
        grayscale(0%)
        brightness(1.08);

    opacity: 1;
}


.education-modern-item:hover
.logo-telkom {

    transform:
        scale(1.56);

    filter:
        grayscale(0%)
        brightness(1.08);

    opacity: 1;
}


/* =========================================
   EDUCATION INFO
========================================= */

.education-modern-info {
    width: 100%;
}


/* SCHOOL NAME */
.education-modern-info h3 {
    margin:
        0 0 7px;

    font-size: 17px;

    font-weight: 700;

    line-height: 1.4;

    color: #ffffff;
}


/* YEAR / MAJOR */
.education-modern-info p {
    margin: 0;

    font-size: 13px;

    line-height: 1.6;

    color:
        rgba(255, 255, 255, 0.67);
}


/* =========================================
   SMALL DECORATIVE LINE
========================================= */

.education-modern-item::after {
    content: "";

    width: 0;
    height: 2px;

    margin-top: 17px;

    background-color: #2997ff;

    border-radius: 20px;

    transition:
        width 0.4s ease;
}


.education-modern-item:hover::after {
    width: 55px;
}


/* =========================================
   ENTRANCE ANIMATION
========================================= */

.education-modern-heading {
    animation:
        educationHeadingEnter
        0.8s ease both;
}


.education-modern-item {
    animation:
        educationItemEnter
        0.8s ease both;
}


.education-modern-item:nth-child(2) {
    animation-delay: 0.12s;
}


/* =========================================
   KEYFRAMES
========================================= */

@keyframes educationHeadingEnter {

    from {
        opacity: 0;

        transform:
            translateY(25px);
    }

    to {
        opacity: 1;

        transform:
            translateY(0);
    }

}


@keyframes educationItemEnter {

    from {
        opacity: 0;

        transform:
            translateY(30px);
    }

    to {
        opacity: 1;

        transform:
            translateY(0);
    }

}


/* =========================================
   TABLET
========================================= */

@media (max-width: 900px) {

    .education-modern {
        padding:
            80px 0;
    }


    .education-modern-container {
        width: 88%;
    }


    .education-modern-list {
        gap: 60px;
    }


    .education-modern-heading h2 {
        font-size: 38px;
    }


    .education-modern::before {
        background-size:
            auto 100%;
    }

}


/* =========================================
   MOBILE
========================================= */

@media (max-width: 650px) {

    .education-modern {
        padding:
            70px 0;
    }


    .education-modern-heading {
        margin-bottom:
            45px;
    }


    .education-modern-heading h2 {
        font-size: 32px;
    }


    .education-modern-description {
        font-size: 14px;
    }


    .education-modern-list {
        flex-direction: column;

        align-items: center;

        gap: 35px;
    }


    .education-modern-item {
        width: 100%;

        max-width: 320px;
    }


    .education-logo-wrapper {
        width: 145px;
        height: 145px;
    }


    .logo-sma {
        max-width: 105px;
        max-height: 105px;
    }


    .logo-telkom {
        max-width: 105px;
        max-height: 105px;

        transform:
            scale(1.48);
    }


    .education-modern-item:hover
    .logo-telkom {

        transform:
            scale(1.54);
    }


    .education-modern::before {
        background-size:
            auto 100%;

        background-position:
            center bottom;
    }

}


/* =========================================
   REDUCED MOTION
========================================= */

@media (prefers-reduced-motion: reduce) {

    .education-modern *,
    .education-modern *::before,
    .education-modern *::after {

        animation-duration:
            0.01ms !important;

        animation-iteration-count:
            1 !important;

        transition-duration:
            0.01ms !important;
    }

}
/* =========================================
   GLOBAL CONTENT ALIGNMENT
   Menyamakan garis kiri & kanan website
========================================= */

:root {
    --page-width: 80%;
    --page-max-width: 1600px;
}


/* ================================
   HERO ALIGNMENT
================================ */

.hero {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin-left: auto;
    margin-right: auto;

    padding-left: 0;
    padding-right: 0;
}


/* ================================
   ABOUT
================================ */

.about {
    width: 100%;

    padding-left: 0;
    padding-right: 0;
}

.about-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin-left: auto;
    margin-right: auto;
}


/* ================================
   PORTFOLIO
================================ */

.portfolio {
    width: 100%;

    padding-left: 0;
    padding-right: 0;
}

.portfolio-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin-left: auto;
    margin-right: auto;
}
/* =========================================
   EDUCATION SIMPLE
========================================= */

.education-simple {
    width: 100%;
    background-color: #1d1d1f;
    padding: 70px 0;
}


/* CONTAINER */
.education-simple-container {
    width: var(--page-width);
    max-width: var(--page-max-width);
    margin: 0 auto;
}


/* =========================================
   HEADING
========================================= */

.education-simple-heading {
    text-align: center;
    margin-bottom: 55px;
}

.education-simple-label {
    margin: 0 0 10px;

    font-size: 14px;
    font-weight: 700;
    letter-spacing: 2px;

    color: #2997ff;
}

.education-simple-heading h2 {
    margin: 0 0 12px;

    font-size: 42px;
    font-weight: 700;

    color: #ffffff;
}

.education-simple-heading > p:not(.education-simple-label) {
    margin: 0;

    font-size: 15px;
    color: #b6b3c2;
}


/* =========================================
   LOGO WRAPPER
========================================= */

.education-logo-grid {
    display: flex;

    flex-direction: row;

    justify-content: center;
    align-items: flex-start;

    gap: 120px;
}


/* =========================================
   EACH EDUCATION ITEM
========================================= */

.education-logo-item {
    min-width: 230px;

    display: flex;
    flex-direction: column;

    align-items: center;

    text-align: center;
}


/* =========================================
   LOGO BOX
========================================= */

.education-logo-box {
    width: 150px;
    height: 150px;

    display: flex;
    justify-content: center;
    align-items: center;

    margin-bottom: 18px;
}


/* SEMUA LOGO */
.education-logo-box img {
    display: block;

    width: auto;
    height: auto;

    max-width: 100%;
    max-height: 100%;

    object-fit: contain;

    filter: grayscale(100%);
    opacity: 0.8;

    transition:
        transform 0.3s ease,
        filter 0.3s ease,
        opacity 0.3s ease;
}


/* =========================================
   LOGO KHUSUS
========================================= */

/* Logo Pasundan */
.logo-pasundan {
    transform: scale(0.95);
}


/* Logo Telkom */
.logo-telkom {
    transform: scale(1.35);
}


/* =========================================
   HOVER
========================================= */

.education-logo-item:hover .logo-pasundan {
    transform: scale(1.02) translateY(-5px);
    filter: grayscale(0%);
    opacity: 1;
}

.education-logo-item:hover .logo-telkom {
    transform: scale(1.42) translateY(-5px);
    filter: grayscale(0%);
    opacity: 1;
}


/* =========================================
   TEXT INFO
========================================= */

.education-logo-info {
    text-align: center;
}

.education-logo-info h3 {
    margin: 0 0 6px;

    font-size: 16px;
    font-weight: 600;

    color: #ffffff;
}

.education-logo-info p {
    margin: 0;

    font-size: 13px;

    color: #b6b3c2;
}


/* =========================================
   RESPONSIVE
========================================= */

@media (max-width: 768px) {

    .education-simple {
        padding: 60px 0;
    }

    .education-simple-container {
        width: 88%;
    }

    .education-simple-heading h2 {
        font-size: 32px;
    }

    .education-logo-grid {
        flex-direction: column;

        align-items: center;

        gap: 45px;
    }

    .education-logo-item {
        min-width: 100%;
    }

    .education-logo-box {
        width: 130px;
        height: 130px;
    }

}
/* =========================================
   EXPERIENCE
========================================= */

.experience {
    width: 100%;

    background-color: #f5f5f7;

    padding: 100px 0;
}


/* =========================================
   CONTAINER
========================================= */

.experience-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;
}


/* =========================================
   LAYOUT — sticky intro (left) + card stack
   (right). Native CSS position:sticky, no
   scroll-hijacking JS.
========================================= */

.experience-layout {
    display: grid;

    grid-template-columns: minmax(0, 0.72fr) minmax(0, 1fr);

    gap: 60px;

    align-items: start;
}


/* =========================================
   INTRO (left, stays in view while the
   stack progresses on the right)
========================================= */

.experience-intro {
    position: sticky;
    top: 120px;

    max-width: 420px;
}


.experience-label {
    margin: 0 0 10px;

    font-size: 14px;
    font-weight: 700;

    letter-spacing: 2px;

    color: #0071e3;
}


.experience-intro h2 {
    margin: 0 0 15px;

    font-size: 38px;
    font-weight: 700;

    line-height: 1.2;

    color: #1d1d1f;
}


.experience-description {
    margin: 0;

    font-size: 16px;

    line-height: 1.7;

    color: #6e6e73;
}


/* =========================================
   STACK COLUMN (right)
========================================= */

.experience-stack-col {
    position: relative;
}


/* =========================================
   CARD WRAPPER
   Each wrapper is position:sticky with a top
   offset that increases per card (set inline
   by js/experience-stack.js, tuned to the
   actual navbar height / breakpoint). Earlier
   cards keep peeking above later ones as the
   page scrolls — no min-height:400vh hacks,
   the wrapper's own height + this padding is
   the only scroll "runway" a card needs.
========================================= */

.experience-card-wrap {
    position: sticky;
    top: 100px;

    padding-bottom: 28px;
}

.experience-card-wrap:last-child {
    padding-bottom: 0;
}


/* =========================================
   CARD — glass surface
========================================= */

.experience-card {
    width: 100%;

    padding: 36px 38px;

    background: rgba(255, 255, 255, 0.68);
    border: 1px solid rgba(255, 255, 255, 0.6);
    border-radius: 22px;

    backdrop-filter: saturate(180%) blur(20px);
    -webkit-backdrop-filter: saturate(180%) blur(20px);

    box-shadow:
        0 24px 48px rgba(29, 29, 31, 0.12),
        0 2px 10px rgba(29, 29, 31, 0.06);

    transform: scale(0.97);
    opacity: 0.7;

    transition:
        transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
        opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1),
        box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1);
}

@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {

    .experience-card {
        background: #fbfbfc;
    }

}

/* Settled = the wrapper has reached its sticky position (driven by
   IntersectionObserver, see JS) — card eases in to full scale/opacity. */
.experience-card-wrap.is-settled .experience-card {
    transform: scale(1);
    opacity: 1;
}

.experience-card-wrap:hover .experience-card,
.experience-card-wrap:focus-within .experience-card {
    box-shadow:
        0 28px 56px rgba(29, 29, 31, 0.15),
        0 4px 14px rgba(29, 29, 31, 0.08);
}


/* =========================================
   CARD CONTENT
========================================= */

.experience-top {
    display: flex;

    justify-content: space-between;
    align-items: center;

    margin-bottom: 22px;
}


.experience-number {
    font-size: 13px;
    font-weight: 700;

    color: #86868b;
}


.experience-type {
    font-size: 11px;
    font-weight: 700;

    letter-spacing: 1.5px;

    color: #0071e3;
}


.experience-card h3 {
    margin: 0 0 6px;

    font-size: 23px;
    font-weight: 700;

    color: #1d1d1f;
}


.experience-card h4 {
    margin: 0 0 5px;

    font-size: 15px;
    font-weight: 600;

    color: #424245;
}


.experience-location {
    margin: 0 0 18px;

    font-size: 13px;

    color: #86868b;
}


.experience-text {
    margin: 0 0 20px;

    font-size: 14px;

    line-height: 1.75;

    color: #6e6e73;
}


.experience-tags {
    display: flex;

    flex-wrap: wrap;

    gap: 0;
}


.experience-tags span {
    padding: 0 12px 0 0;

    margin-right: 12px;

    border-right: 1px solid rgba(29, 29, 31, 0.14);

    font-size: 11px;
    font-weight: 500;

    letter-spacing: 0.6px;
    text-transform: uppercase;

    color: #6e6e73;
}

.experience-tags span:last-child {
    padding-right: 0;
    margin-right: 0;
    border-right: none;
}


/* =========================================
   RESPONSIVE
========================================= */

@media (max-width: 1024px) {

    .experience-layout {
        grid-template-columns: minmax(0, 0.85fr) minmax(0, 1fr);
        gap: 36px;
    }

    .experience-intro {
        top: 96px;
    }

}

@media (max-width: 900px) {

    /* iPad portrait / narrow tablet: stop the two-column composition,
       intro sits at the top and the card stack still sticks/stacks
       below it — same stacked visual language, no separate design. */
    .experience-layout {
        display: block;
    }

    .experience-intro {
        position: static;
        max-width: none;
        margin-bottom: 40px;
    }

}

@media (max-width: 768px) {

    .experience {
        padding: 70px 0;
    }

    .experience-container {
        width: 88%;
    }

    .experience-intro h2 {
        font-size: 30px;
    }

    .experience-card {
        padding: 28px 24px;
    }

}

@media (prefers-reduced-motion: reduce) {

    .experience-card {
        transform: none;
        opacity: 1;
        transition: box-shadow 0.2s ease;
    }

}

/* =========================================
   CONTACT
========================================= */

.contact-section {
    width: 100%;

    position: relative;

    padding: 110px 0;

    overflow: hidden;

    background-color: #ffffff;
}


/* =========================================
   CONTAINER
========================================= */

.contact-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;
}


/* =========================================
   HEADING
========================================= */

.contact-heading {
    max-width: 760px;

    margin: 0 auto 55px;

    text-align: center;
}


.contact-label {
    margin: 0 0 12px;

    font-size: 13px;
    font-weight: 700;

    letter-spacing: 3px;

    color: #0071e3;
}


.contact-heading h2 {
    margin: 0 0 18px;

    font-size: 52px;
    font-weight: 700;

    line-height: 1.1;

    color: #1d1d1f;
}


.contact-heading h2 span {
    color: #0071e3;
}


.contact-description {
    max-width: 680px;

    margin: 0 auto;

    font-size: 15px;

    line-height: 1.8;

    color: #6e6e73;
}


/* =========================================
   SOCIAL PANEL
========================================= */

.contact-social-panel {
    width: 100%;
    max-width: 920px;

    min-height: 225px;

    margin: 0 auto;

    padding: 42px 55px;

    display: grid;

    grid-template-columns:
        repeat(4, 1fr);

    align-items: center;

    gap: 25px;

    background-color: #f5f5f7;

    border:
        1px solid #d2d2d7;

    border-radius: 28px;

    /*
        Hanya bayangan panel sangat tipis.
        TIDAK ada glow warna di belakang icon.
    */

    box-shadow:
        0 18px 50px
        rgba(29, 29, 31, 0.05);

    transition:
        transform 0.35s ease,
        box-shadow 0.35s ease;
}


/* PANEL HOVER */

.contact-social-panel:hover {
    transform:
        translateY(-2px);

    box-shadow:
        0 22px 55px
        rgba(29, 29, 31, 0.07);
}


/* =========================================
   SOCIAL ITEM
========================================= */

.contact-social-item {
    display: flex;

    flex-direction: column;

    justify-content: center;
    align-items: center;

    gap: 16px;

    padding: 10px;

    text-decoration: none;

    transform:
        translateY(0);

    transition:
        transform 0.4s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


/* =========================================
   ICON CIRCLE
========================================= */

.contact-icon-circle {
    width: 84px;
    height: 84px;

    display: flex;

    justify-content: center;
    align-items: center;

    position: relative;

    background-color: #ffffff;

    border:
        1px solid #d2d2d7;

    border-radius: 50%;

    /*
        Tidak menggunakan glow.
    */

    box-shadow: none;

    transform:
        scale(1);

    transition:
        transform 0.4s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        ),

        background-color 0.3s ease,

        border-color 0.3s ease;
}


/* =========================================
   ICON
========================================= */

.contact-icon-circle img {
    width: 32px;
    height: 32px;

    display: block;

    object-fit: contain;

    opacity: 0.85;

    filter: none;

    transform:
        rotate(0deg);

    transform-origin:
        50% 20%;

    transition:
        opacity 0.3s ease,
        transform 0.3s ease;
}


/* =========================================
   LABEL
========================================= */

.contact-social-item > span {
    font-size: 14px;
    font-weight: 600;

    color: #6e6e73;

    transition:
        color 0.3s ease,
        transform 0.3s ease;
}


/* =========================================
   ACTIVE SOCIAL ITEM
========================================= */

.contact-social-item.is-active {
    transform:
        translateY(-7px);
}


/* =========================================
   ACTIVE CIRCLE

   SOLID COLOR.
   Tidak ada glow.
   Tidak ada box-shadow.
========================================= */

.contact-social-item.is-active
.contact-icon-circle {

    background-color:
        var(--brand-bg);

    border-color:
        var(--brand-border);

    transform:
        scale(1.14);

    box-shadow:
        none;
}


/* =========================================
   ACTIVE ICON

   PENTING:
   Icon tetap menggunakan warna/file asli.
========================================= */

.contact-social-item.is-active
.contact-icon-circle img {

    opacity: 1;

    filter: none;
}


/* =========================================
   ACTIVE LABEL
========================================= */

.contact-social-item.is-active > span {

    color:
        var(--brand-color);

    transform:
        translateY(2px);
}


/* =========================================
   SMALL RING

   Hanya outline.
   Bukan glow.
========================================= */

.contact-icon-circle::before {
    content: "";

    position: absolute;

    inset: -1px;

    border:
        1px solid transparent;

    border-radius: 50%;

    opacity: 0;

    transform:
        scale(1);

    transition:
        transform 0.4s ease,
        opacity 0.3s ease,
        border-color 0.3s ease;
}


.contact-social-item.is-active
.contact-icon-circle::before {

    opacity: 1;

    transform:
        scale(1.22);

    border-color:
        var(--brand-border);
}


/* =========================================
   BELL SHAKE
========================================= */

.contact-icon-circle img.icon-shake {
    animation:
        contactIconBell
        0.52s ease;
}


@keyframes contactIconBell {

    0% {
        transform:
            rotate(0deg);
    }


    15% {
        transform:
            rotate(-12deg);
    }


    30% {
        transform:
            rotate(10deg);
    }


    45% {
        transform:
            rotate(-8deg);
    }


    60% {
        transform:
            rotate(6deg);
    }


    75% {
        transform:
            rotate(-3deg);
    }


    100% {
        transform:
            rotate(0deg);
    }

}


/* =========================================
   STATUS
========================================= */

.contact-status {
    margin-top: 30px;

    display: flex;

    justify-content: center;
    align-items: center;

    gap: 10px;
}


.contact-status p {
    margin: 0;

    font-size: 12px;

    color: #6e6e73;
}


.contact-status-dot {
    width: 8px;
    height: 8px;

    flex-shrink: 0;

    background-color: #0071e3;

    border-radius: 50%;

    animation:
        contactDotPulse
        2s ease-in-out infinite;
}


@keyframes contactDotPulse {

    0%,
    100% {
        opacity: 0.4;

        transform:
            scale(1);
    }


    50% {
        opacity: 1;

        transform:
            scale(1.25);
    }

}


/* =========================================
   TABLET
========================================= */

@media (max-width: 900px) {

    .contact-section {
        padding:
            90px 0;
    }


    .contact-container {
        width: 88%;
    }


    .contact-heading h2 {
        font-size: 43px;
    }


    .contact-social-panel {
        padding:
            38px 30px;

        gap: 15px;
    }


    .contact-icon-circle {
        width: 74px;
        height: 74px;
    }


    .contact-icon-circle img {
        width: 29px;
        height: 29px;
    }

}


/* =========================================
   MOBILE
========================================= */

@media (max-width: 600px) {

    .contact-section {
        padding:
            75px 0;
    }


    .contact-container {
        width: 88%;
    }


    .contact-heading {
        margin-bottom:
            40px;
    }


    .contact-label {
        font-size: 11px;

        letter-spacing: 2.5px;
    }


    .contact-heading h2 {
        font-size: 34px;
    }


    .contact-description {
        font-size: 14px;
    }


    /*
        Desktop 4 horizontal
        menjadi 2 x 2.
    */

    .contact-social-panel {
        min-height: auto;

        grid-template-columns:
            repeat(2, 1fr);

        gap:
            32px 15px;

        padding:
            38px 20px;

        border-radius: 22px;
    }


    .contact-icon-circle {
        width: 70px;
        height: 70px;
    }


    .contact-icon-circle img {
        width: 27px;
        height: 27px;
    }


    .contact-social-item {
        gap: 12px;
    }


    .contact-social-item > span {
        font-size: 13px;
    }


    .contact-social-item.is-active {
        transform:
            translateY(-5px);
    }


    .contact-status {
        margin-top: 25px;

        text-align: center;
    }


    .contact-status p {
        font-size: 11px;
    }

}


/* =========================================
   VERY SMALL MOBILE
========================================= */

@media (max-width: 380px) {

    .contact-heading h2 {
        font-size: 30px;
    }


    .contact-social-panel {
        padding:
            32px 12px;
    }


    .contact-icon-circle {
        width: 64px;
        height: 64px;
    }


    .contact-icon-circle img {
        width: 25px;
        height: 25px;
    }

}


/* =========================================
   REDUCED MOTION
========================================= */

@media (prefers-reduced-motion: reduce) {

    .contact-social-panel,
    .contact-social-item,
    .contact-icon-circle,
    .contact-icon-circle::before,
    .contact-icon-circle img {

        transition:
            none !important;
    }


    .contact-icon-circle img.icon-shake {

        animation:
            none !important;
    }


    .contact-status-dot {

        animation:
            none !important;
    }

}
/* =========================================
   FOOTER
========================================= */

.footer {
    width: 100%;

    background-color: #1d1d1f;

    padding: 55px 0 25px;
}


.footer-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;
}


/* =========================================
   MAIN
========================================= */

.footer-main {
    display: flex;

    justify-content: space-between;
    align-items: flex-start;

    gap: 60px;

    padding-bottom: 35px;
}


/* =========================================
   BRAND
========================================= */

.footer-brand h2 {
    margin: 0 0 8px;

    font-size: 24px;
    font-weight: 700;

    color: #ffffff;
}


.footer-brand p {
    margin: 0;

    font-size: 14px;

    color: #86868b;
}


/* =========================================
   NAVIGATION
========================================= */

.footer-nav {
    max-width: 430px;

    display: flex;

    justify-content: flex-end;

    flex-wrap: wrap;

    gap: 12px 25px;
}


.footer-nav a {
    font-size: 13px;

    color: #d2d2d7;

    text-decoration: none;

    transition: color 0.3s ease;
}


.footer-nav a:hover {
    color: #0071e3;
}


/* =========================================
   DIVIDER
========================================= */

.footer-divider {
    width: 100%;
    height: 1px;

    background-color: #424245;

    margin-bottom: 22px;
}


/* =========================================
   BOTTOM
========================================= */

.footer-bottom {
    display: flex;

    justify-content: space-between;
    align-items: center;
}


.footer-bottom p {
    margin: 0;

    font-size: 12px;

    color: #6e6e73;
}


/* =========================================
   SOCIAL MEDIA
========================================= */

.footer-social {
    display: flex;

    align-items: center;

    gap: 10px;
}


.footer-social a {
    width: 34px;
    height: 34px;

    display: flex;

    justify-content: center;
    align-items: center;

    border: 1px solid #424245;

    border-radius: 50%;

    transition:
        transform 0.3s ease,
        border-color 0.3s ease;
}


.footer-social img {
    width: 17px;
    height: 17px;

    object-fit: contain;
}


.footer-social a:hover {
    transform: translateY(-3px);

    border-color: #0071e3;
}


/* =========================================
   RESPONSIVE
========================================= */

@media (max-width: 768px) {

    .footer {
        padding: 45px 0 25px;
    }


    .footer-container {
        width: 88%;
    }


    .footer-main {
        flex-direction: column;

        gap: 30px;
    }


    .footer-nav {
        justify-content: flex-start;
    }


    .footer-bottom {
        flex-direction: column;

        align-items: flex-start;

        gap: 20px;
    }

}
/* =========================================
   NAVBAR SCROLLED STATE (nav-scrolled)
========================================= */

nav.nav-scrolled {
    box-shadow:
        0 8px 30px
        rgba(29, 29, 31, 0.08);

    background-color:
        rgba(255, 255, 255, 0.96);

    backdrop-filter:
        blur(12px);
}
/* =========================================
   SCROLL REVEAL
========================================= */

.reveal {
    opacity: 0;

    transform:
        translateY(45px);

    transition:
        opacity 0.8s ease,
        transform 0.8s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


.reveal.reveal-active {
    opacity: 1;

    /* "none" (not translateY(0)) — a non-none transform value
       establishes a new containing block on this ancestor, which
       breaks position:sticky for any descendant (e.g. the Experience
       stack). Visually identical, but sticky-safe. */
    transform: none;
}
@media (prefers-reduced-motion: reduce) {

    .reveal {
        opacity: 1 !important;

        transform: none !important;

        transition: none !important;
    }

}


.about-org-dots {
    max-width: 180px;

    display: flex;

    align-items: center;

    gap: 6px;

    overflow-x: auto;

    scrollbar-width: none;
}


.about-org-dots::-webkit-scrollbar {
    display: none;
}
.about-org-dot {
    width: 7px;
    height: 7px;

    flex-shrink: 0;

    padding: 0;

    border: 0;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.3s ease,
        background-color 0.3s ease;
}


.about-org-dot.active {
    width: 24px;

    background-color: #0071e3;
}

/* =========================================
   ICONIFY TECH ICON
========================================= */

.tech-iconify {
    width: 33px;
    height: 33px;

    flex-shrink: 0;

    font-size: 31px;

    display: inline-flex;

    justify-content: center;
    align-items: center;

    transition:
        transform 0.35s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


/* YOLO / ULTRALYTICS */

.tech-yolo {
    color: #0071e3;
}


/* COMPUTER VISION */

.tech-vision {
    color: #2563eb;
}


/* HOVER */

.tech-item:hover
.tech-iconify {

    transform:
        scale(1.12)
        rotate(-3deg);
}
.tech-stm-icon {
    background-color: #03234b;

    color: #ffffff;

    font-size: 8px;
    font-weight: 800;

    letter-spacing: 0.5px;
}
.tech-iot-icon {
    background-color: #f5f5f7;

    color: #0071e3;

    font-size: 9px;
    font-weight: 800;
}

/* =========================================
   ABOUT ORGANIZATION SLIDER - INTERACTION FIX
========================================= */

.about-org-gallery {
    cursor: grab;
    touch-action: pan-y;
    user-select: none;
}

.about-org-gallery.is-dragging {
    cursor: grabbing;
}

.about-org-gallery.is-dragging .about-org-track {
    transition: none !important;
}

.about-org-photo img {
    pointer-events: none;
    user-select: none;
    -webkit-user-drag: none;
}

.about-org-controls {
    position: relative;
    z-index: 30;
}

.about-org-button,
.about-org-dot {
    position: relative;
    z-index: 31;
    pointer-events: auto;
}

/* =========================================
   SIMPLE HERO
========================================= */

.simple-hero {
    width: 100%;

    min-height: clamp(680px, 86vh, 860px);

    position: relative;

    padding: 0;

    overflow: hidden;

    background-color: #f5f5f7;
}


/* =========================================
   HERO CONTAINER
========================================= */

.simple-hero-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    min-height: clamp(680px, 86vh, 860px);

    margin: 0 auto;

    display: grid;

    grid-template-columns:
        55% 45%;

    align-items: center;

    position: relative;
}


/* =========================================
   HERO LEFT
========================================= */

.simple-hero-content {
    max-width: 720px;

    position: relative;

    z-index: 5;

    padding-bottom: 30px;
}


/* HERO TEXT REVEAL */

.simple-hero-content.hero-is-animating .simple-hero-label,
.simple-hero-content.hero-is-animating h2,
.simple-hero-content.hero-is-animating .simple-hero-description,
.simple-hero-content.hero-is-animating .simple-hero-buttons {
    opacity: 0;
}


.simple-hero-content.hero-is-animating .simple-hero-label {
    animation: heroLabelReveal 0.45s ease 0.15s forwards;
}


.simple-hero-content.hero-is-animating h1 {
    width: max-content;
    max-width: 100%;
    position: relative;
    opacity: 1;
}


.hero-type-cursor {
    display: inline-block;
    width: 3px;
    height: 0.8em;
    margin-left: 0.12em;
    vertical-align: baseline;
    background-color: #0071e3;
    animation: heroCursorBlink 0.75s steps(2, end) infinite;
}


.simple-hero-content h1 .hero-type-cursor {
    display: inline-block;
}


.hero-name-highlight {
    display: inline-block;
    white-space: nowrap;
}


.simple-hero-content h1 span.hero-name-highlight {
    display: inline-block;
    white-space: nowrap;
}


.simple-hero-content.hero-is-animating h2 {
    animation: heroContentReveal 0.65s ease var(--hero-content-delay, 2.15s) forwards;
}


.simple-hero-content.hero-is-animating .simple-hero-description {
    animation: heroContentReveal 0.65s ease calc(var(--hero-content-delay, 2.15s) + 0.4s) forwards;
}


.simple-hero-content.hero-is-animating .simple-hero-buttons {
    animation: heroContentReveal 0.65s ease calc(var(--hero-content-delay, 2.15s) + 0.75s) forwards;
}


@keyframes heroLabelReveal {
    from {
        opacity: 0;
        transform: translateY(8px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}


@keyframes heroContentReveal {
    from {
        opacity: 0;
        transform: translateY(12px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}


@keyframes heroCursorBlink {
    0% {
        opacity: 1;
    }

    50% {
        opacity: 0;
    }

    100% {
        opacity: 0;
    }
}


@media (prefers-reduced-motion: reduce) {

    .simple-hero-content.hero-is-animating .simple-hero-label,
    .simple-hero-content.hero-is-animating h1,
    .simple-hero-content.hero-is-animating h2,
    .simple-hero-content.hero-is-animating .simple-hero-description,
    .simple-hero-content.hero-is-animating .simple-hero-buttons {
        opacity: 1;
        animation: none;
        transform: none;
    }

    .hero-type-cursor {
        animation: none;
    }

}


.hero-photo-card-placeholder {
    visibility: hidden;
    pointer-events: none;
}


/* LABEL */

.simple-hero-label {
    display: flex;

    align-items: center;

    gap: 12px;

    margin-bottom: 18px;
}


.simple-hero-label span {
    width: 32px;
    height: 2px;

    display: block;

    background-color: #0071e3;
}


.simple-hero-label p {
    margin: 0;

    font-size: 11px;
    font-weight: 700;

    letter-spacing: 3px;

    color: #0071e3;
}


/* =========================================
   NAME
========================================= */

.simple-hero-content h1 {
    max-width: 720px;

    margin: 0 0 17px;

    font-size: clamp(
        56px,
        5vw,
        78px
    );

    line-height: 1;

    font-weight: 800;

    letter-spacing: -2.5px;

    color: #1d1d1f;
}


.simple-hero-content h1 span {
    color: #0071e3;
}


/* =========================================
   ROLE
========================================= */

.simple-hero-content h2 {
    margin: 0 0 23px;

    font-size: 19px;
    font-weight: 600;

    letter-spacing: 0.5px;

    color: #424245;
}


/* =========================================
   DESCRIPTION
========================================= */

.simple-hero-description {
    max-width: 580px;

    margin: 0;

    font-size: 15px;

    line-height: 1.8;

    color: #6e6e73;
}


/* =========================================
   BUTTONS
========================================= */

.simple-hero-buttons {
    margin-top: 31px;

    display: flex;

    align-items: center;

    gap: 12px;
}


.simple-hero-button {
    min-height: 48px;

    display: inline-flex;

    justify-content: center;
    align-items: center;

    gap: 10px;

    padding: 0 26px;

    border-radius: 980px;

    font-size: 14px;
    font-weight: 500;
    letter-spacing: 0;

    text-decoration: none;

    transition:
        transform 0.3s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        ),
        background-color 0.3s ease,
        color 0.3s ease,
        border-color 0.3s ease,
        box-shadow 0.3s ease;
}


.simple-hero-button span {
    font-size: 17px;

    transition:
        transform 0.3s ease;
}


/* PROJECT BUTTON */

.simple-project-button {
    color: #0071e3;

    background-color: transparent;

    border: 1px solid transparent;

    padding: 0 4px;
}


.simple-project-button:hover {
    color: #0066cc;

    text-decoration: underline;
}


.simple-project-button:hover span {
    transform: translateX(4px);
}


/* CV BUTTON */

.simple-cv-button {
    color: #ffffff;

    background-color: #0071e3;

    border: 1px solid #0071e3;
}


.simple-cv-button:hover {
    background-color: #0066cc;

    border-color: #0066cc;
}


.simple-cv-button:hover span {
    transform: translateY(3px);
}


/* =========================================
   RIGHT VISUAL
========================================= */

.simple-hero-visual {
    width: 100%;
    height: 100%;

    position: relative;

    display: flex;

    justify-content: center;
    align-items: flex-end;
}


/* PHOTO */

.simple-hero-photo {
    width: min(
        500px,
        100%
    );

    position: relative;

    z-index: 2;

    margin-bottom: -10px;

    display: flex;

    justify-content: center;

    transition:
        transform 0.45s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


/* Aturan .simple-hero-photo img dihapus (dulu di sini).

   .simple-hero-photo hanya berisi hero photo stack, jadi selector
   itu tidak pernah kena gambar lain — hanya <img> di dalam
   .hero-photo-card. Isinya (object-fit: contain, max-height:
   640px) bertentangan dengan cara kartu mengisi gambarnya, dan
   max-height-nya tidak pernah ditimpa aturan kartu.

   Semua styling gambar hero sekarang milik satu blok:
   ".hero-photo-stack .hero-photo-card picture, ... img" di bawah. */


.simple-hero-photo:hover {
    transform: translateY(-7px);
}


/* =========================================
   HERO PHOTO STACK (interactive feature)
========================================= */

.hero-photo-stage {
    width: 100%;
    height: 100%;

    display: flex;
    align-items: flex-end;
    justify-content: center;
}

.hero-photo-stack {
    width: 100%;
    aspect-ratio: 3 / 4;
    max-height: 640px;

    position: relative;
}

.hero-photo-card {
    position: absolute;
    inset: 0;

    display: block;

    padding: 0;
    margin: 0;
    border: none;
    border-radius: 14px;

    overflow: hidden;
    cursor: pointer;

    background-color: #f5f5f7;

    box-shadow:
        0 10px 24px rgba(29, 29, 31, 0.10),
        0 2px 6px rgba(29, 29, 31, 0.06);

    transition:
        transform 0.4s cubic-bezier(0.16, 1, 0.3, 1),
        box-shadow 0.4s cubic-bezier(0.16, 1, 0.3, 1);
}

/* ---- ISI KARTU: <picture> + <img> ----

   Kartu adalah <button>. Anak sebuah <button> dibungkus kotak
   anonim oleh browser, dan WebKit tidak selalu meregangkan kotak
   itu setinggi tombolnya — di situ height:100% bisa jatuh ke
   auto, gambar memakai tinggi aslinya, lalu latar kartu (#f5f5f7)
   terlihat sebagai pita putih. Karena itu picture DAN img
   dikeluarkan dari alur normal: keduanya position:absolute
   inset:0, sehingga kotak pembatasnya adalah KARTU itu sendiri
   (satu-satunya leluhur ber-position di rantai ini), bukan kotak
   anonim tombol. Perilakunya jadi sama di semua mesin render.

   max-width/max-height sengaja di-none-kan: aturan lama
   .simple-hero-photo img pernah memasang batas 340px/420px/430px
   yang tidak pernah ditimpa aturan ini, dan itulah penyebab asli
   pita putih di HP lebar dan di tablet. Aturan-aturan tersebut
   sudah dihapus, reset ini menahan kalau ada yang kembali.

   Selector menyebut .hero-photo-stack supaya spesifisitasnya
   (0,2,1) selalu di atas .simple-hero-photo img / picture
   (0,1,1) — menang karena spesifisitas, bukan karena urutan. */

.hero-photo-stack .hero-photo-card picture,
.hero-photo-stack .hero-photo-card img {
    position: absolute;
    inset: 0;

    width: 100%;
    height: 100%;

    max-width: none;
    max-height: none;

    display: block;
}

.hero-photo-stack .hero-photo-card img {
    object-fit: cover;
    object-position: center top;

    user-select: none;
    -webkit-user-drag: none;
}

.hero-photo-card-placeholder {
    display: flex;
    align-items: center;
    justify-content: center;

    background: repeating-linear-gradient(
        135deg,
        #f5f5f7,
        #f5f5f7 10px,
        #e8e8ed 10px,
        #e8e8ed 20px
    );
}

.hero-photo-card-placeholder span {
    font-size: 28px;
    font-weight: 700;

    color: #86868b;
}

/* IDLE / COLLAPSED positions, keyed by stack order (0 = front) */

.hero-photo-card[data-position="0"] {
    transform: translate(0, 0) rotate(0deg) scale(1);
    z-index: 3;
}

.hero-photo-card[data-position="1"] {
    transform: translate(-32px, 16px) rotate(-7deg) scale(0.94);
    z-index: 2;
}

.hero-photo-card[data-position="2"] {
    transform: translate(32px, 16px) rotate(7deg) scale(0.92);
    z-index: 1;
}

/* SPREAD state */

.hero-photo-stack.is-spread .hero-photo-card[data-position="0"] {
    transform: translate(0, 0) rotate(0deg) scale(1.02);
}

.hero-photo-stack.is-spread .hero-photo-card[data-position="1"] {
    transform: translate(-34%, 4%) rotate(-6deg) scale(0.95);
}

.hero-photo-stack.is-spread .hero-photo-card[data-position="2"] {
    transform: translate(34%, 4%) rotate(6deg) scale(0.95);
}

.hero-photo-stack.is-spread .hero-photo-card {
    box-shadow:
        0 18px 34px rgba(29, 29, 31, 0.14),
        0 4px 10px rgba(29, 29, 31, 0.08);
}

/* Individual hover/focus lift while spread.
   No rotation/translate change on hover, only scale — keeps rapid
   cursor movement between cards from fighting multiple animated
   axes at once, and stays on the same transition timing as the
   base card rule so nothing feels out of sync. */

.hero-photo-stack.is-spread .hero-photo-card:hover,
.hero-photo-stack.is-spread .hero-photo-card:focus-visible {
    z-index: 4;
    box-shadow:
        0 22px 40px rgba(29, 29, 31, 0.18),
        0 6px 14px rgba(29, 29, 31, 0.1);
}

.hero-photo-stack.is-spread .hero-photo-card[data-position="0"]:hover,
.hero-photo-stack.is-spread .hero-photo-card[data-position="0"]:focus-visible {
    transform: translate(0, 0) rotate(0deg) scale(1.06);
}

.hero-photo-stack.is-spread .hero-photo-card[data-position="1"]:hover,
.hero-photo-stack.is-spread .hero-photo-card[data-position="1"]:focus-visible {
    transform: translate(-34%, 4%) rotate(-6deg) scale(1);
}

.hero-photo-stack.is-spread .hero-photo-card[data-position="2"]:hover,
.hero-photo-stack.is-spread .hero-photo-card[data-position="2"]:focus-visible {
    transform: translate(34%, 4%) rotate(6deg) scale(1);
}

.hero-photo-card:focus-visible {
    outline: 2px solid #0071e3;
    outline-offset: 3px;
}

/* SELECTING (short premium flourish before settling as front card) */

.hero-photo-card.is-selecting {
    transition:
        transform 0.6s cubic-bezier(0.22, 1.06, 0.36, 1),
        box-shadow 0.6s cubic-bezier(0.22, 1.06, 0.36, 1);
    z-index: 5;
}

/* Tablet / mobile: tighter, compact spread to avoid overflow */

@media (max-width: 900px) {

    .hero-photo-stack.is-spread .hero-photo-card[data-position="1"],
    .hero-photo-stack.is-spread .hero-photo-card[data-position="1"]:hover,
    .hero-photo-stack.is-spread .hero-photo-card[data-position="1"]:focus-visible {
        transform: translate(-22%, 4%) rotate(-5deg) scale(0.95);
    }

    .hero-photo-stack.is-spread .hero-photo-card[data-position="2"],
    .hero-photo-stack.is-spread .hero-photo-card[data-position="2"]:hover,
    .hero-photo-stack.is-spread .hero-photo-card[data-position="2"]:focus-visible {
        transform: translate(22%, 4%) rotate(5deg) scale(0.95);
    }

}

@media (max-width: 650px) {

    .hero-photo-stack {
        aspect-ratio: 3 / 4;
        max-height: 420px;
    }

    .hero-photo-stack.is-spread .hero-photo-card[data-position="1"],
    .hero-photo-stack.is-spread .hero-photo-card[data-position="1"]:hover,
    .hero-photo-stack.is-spread .hero-photo-card[data-position="1"]:focus-visible {
        transform: translate(-13%, 3%) rotate(-4deg) scale(0.95);
    }

    .hero-photo-stack.is-spread .hero-photo-card[data-position="2"],
    .hero-photo-stack.is-spread .hero-photo-card[data-position="2"]:hover,
    .hero-photo-stack.is-spread .hero-photo-card[data-position="2"]:focus-visible {
        transform: translate(13%, 3%) rotate(4deg) scale(0.95);
    }

}

@media (prefers-reduced-motion: reduce) {

    .hero-photo-card,
    .hero-photo-card.is-selecting {
        transition: transform 0.2s ease, box-shadow 0.2s ease;
    }

    .hero-photo-card[data-position="1"],
    .hero-photo-stack.is-spread .hero-photo-card[data-position="1"] {
        transform: translate(-16px, 0) rotate(0deg) scale(0.96);
    }

    .hero-photo-card[data-position="2"],
    .hero-photo-stack.is-spread .hero-photo-card[data-position="2"] {
        transform: translate(16px, 0) rotate(0deg) scale(0.94);
    }

}


/* =========================================
   HERO PHOTO STACK — JUMLAH KARTU ADAPTIF

   Foto 2 dan 3 bisa disembunyikan dari Admin. Kalau disembunyikan,
   kartunya benar-benar dihapus dari DOM (bukan disembunyikan pakai
   CSS), jadi stack bisa berisi 1, 2, atau 3 kartu.

   js/hero-photo-stack.js menulis data-count dari JUMLAH KARTU YANG
   BENAR-BENAR ADA di DOM, bukan dari data CMS, sehingga geometri di
   bawah ini tidak mungkin berbeda dengan isi stack-nya.

   Semua aturan di atas adalah kasus TIGA KARTU dan sengaja tidak
   diubah sedikit pun — tampilan itu sudah disetujui. Blok ini hanya
   MENAMBAH kasus 2 dan 1 kartu, dengan spesifisitas yang lebih
   tinggi ([data-count] menambah satu attribute selector), jadi
   menang tanpa bergantung urutan file.
========================================= */


/* -----------------------------------------
   DUA KARTU

   Geometri tiga kartu tidak bisa dipakai apa adanya: posisi 1 di
   sana digeser ke KIRI dengan asumsi ada kartu ketiga yang
   mengimbangi di kanan. Dengan dua kartu, asumsi itu hilang dan
   komposisinya jadi berat sebelah.

   Diam: kartu belakang duduk di tengah, sedikit turun dan diputar
   kecil — sudutnya mengintip di KEDUA sisi, jadi terbaca sebagai
   tumpukan yang seimbang, bukan satu kartu yang melenceng.

   Terbuka: keduanya bergerak menjauh sama besar dari sumbu tengah,
   sehingga titik berat komposisinya tetap di tengah panggung.
----------------------------------------- */

.hero-photo-stack[data-count="2"] .hero-photo-card[data-position="1"] {
    transform: translate(0, 18px) rotate(-4deg) scale(0.94);
    z-index: 2;
}

.hero-photo-stack[data-count="2"].is-spread
.hero-photo-card[data-position="0"] {
    transform: translate(-19%, 0) rotate(-4deg) scale(1);
}

.hero-photo-stack[data-count="2"].is-spread
.hero-photo-card[data-position="1"] {
    transform: translate(19%, 2%) rotate(4deg) scale(0.97);
}

.hero-photo-stack[data-count="2"].is-spread
.hero-photo-card[data-position="0"]:hover,
.hero-photo-stack[data-count="2"].is-spread
.hero-photo-card[data-position="0"]:focus-visible {
    transform: translate(-19%, 0) rotate(-4deg) scale(1.04);
}

.hero-photo-stack[data-count="2"].is-spread
.hero-photo-card[data-position="1"]:hover,
.hero-photo-stack[data-count="2"].is-spread
.hero-photo-card[data-position="1"]:focus-visible {
    transform: translate(19%, 2%) rotate(4deg) scale(1.01);
}


/* -----------------------------------------
   SATU KARTU

   Bukan tumpukan, jadi jangan berpura-pura jadi tumpukan: tidak ada
   offset, tidak ada rotasi, tidak ada spread. Kartunya juga sudah
   di-disable di JS sehingga keluar dari tab order — di sini tinggal
   menghapus isyarat visual bahwa ia bisa diklik.
----------------------------------------- */

.hero-photo-stack[data-count="1"] .hero-photo-card,
.hero-photo-stack[data-count="1"].is-spread .hero-photo-card,
.hero-photo-stack[data-count="1"] .hero-photo-card:hover,
.hero-photo-stack[data-count="1"] .hero-photo-card[data-position="0"] {
    transform: none;
    cursor: default;
}

/* Bayangannya tetap ada supaya kartunya tidak terlihat "datar",
   tapi tidak ikut menguat seperti saat stack terbuka. */
.hero-photo-stack[data-count="1"].is-spread .hero-photo-card {
    box-shadow:
        0 10px 24px rgba(29, 29, 31, 0.10),
        0 2px 6px rgba(29, 29, 31, 0.06);
}


/* -----------------------------------------
   TABLET / MOBILE — DUA KARTU

   Sejalan dengan kasus tiga kartu: makin sempit layarnya, makin
   rapat rentangnya supaya kartu tidak menyentuh tepi panggung.
----------------------------------------- */

@media (max-width: 900px) {

    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"],
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"]:hover,
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"]:focus-visible {
        transform: translate(-14%, 0) rotate(-3deg) scale(1);
    }

    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"],
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"]:hover,
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"]:focus-visible {
        transform: translate(14%, 2%) rotate(3deg) scale(0.97);
    }

}


@media (max-width: 650px) {

    .hero-photo-stack[data-count="2"] .hero-photo-card[data-position="1"] {
        transform: translate(0, 13px) rotate(-3deg) scale(0.95);
    }

    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"],
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"]:hover,
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"]:focus-visible {
        transform: translate(-9%, 0) rotate(-3deg) scale(1);
    }

    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"],
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"]:hover,
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"]:focus-visible {
        transform: translate(9%, 2%) rotate(3deg) scale(0.96);
    }

}


/* -----------------------------------------
   GERAK MINIMAL

   Aturan reduced-motion di atas menyebut [data-position] saja, jadi
   spesifisitasnya kalah dari blok dua-kartu ini. Kasus 2 kartu
   diulang di sini supaya preferensi pengguna tetap yang menang.
----------------------------------------- */

@media (prefers-reduced-motion: reduce) {

    .hero-photo-stack[data-count="2"] .hero-photo-card[data-position="1"],
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"],
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"]:hover,
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="1"]:focus-visible {
        transform: translate(0, 10px) rotate(0deg) scale(0.96);
    }

    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"],
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"]:hover,
    .hero-photo-stack[data-count="2"].is-spread
    .hero-photo-card[data-position="0"]:focus-visible {
        transform: none;
    }

}


/* =========================================
   SCROLL INDICATOR
========================================= */

.simple-hero-scroll {
    position: absolute;

    left: 10%;
    bottom: 27px;

    display: flex;

    align-items: center;

    gap: 12px;

    color: #86868b;

    text-decoration: none;
}


.simple-hero-scroll span {
    font-size: 8px;

    font-weight: 700;

    letter-spacing: 2px;
}


.simple-hero-scroll div {
    width: 42px;
    height: 1px;

    background-color: #d2d2d7;

    position: relative;

    overflow: hidden;
}


.simple-hero-scroll div::after {
    content: "";

    width: 40%;
    height: 100%;

    position: absolute;

    left: -40%;
    top: 0;

    background-color: #0071e3;

    animation:
        simpleHeroScroll
        2s ease infinite;
}


@keyframes simpleHeroScroll {

    from {
        left: -40%;
    }

    to {
        left: 110%;
    }

}
/* =========================================
   SIMPLE ABOUT
   ONLY SLIDE 01
========================================= */

.about-slide-one {
    background-color: #ffffff;

    padding:
        80px 0
        95px;
}


/* =========================================
   CONTAINER
========================================= */

.simple-about-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    min-height: 590px;

    margin: 0 auto;

    display: grid;

    grid-template-columns:
        46% 54%;

    align-items: center;

    gap: 80px;
}


/* =========================================
   LEFT VISUAL
========================================= */

.simple-about-visual {
    width: 100%;

    min-height: 590px;

    position: relative;

    display: flex;

    justify-content: center;
    align-items: flex-end;

    overflow: hidden;
}


/* NUMBER */

.simple-about-number {
    position: absolute;

    left: 5px;
    top: 10px;

    z-index: 5;

    font-size: 11px;

    font-weight: 700;

    letter-spacing: 2px;

    color: #2997ff;
}


/* =========================================
   PHOTO
========================================= */

.simple-about-photo {
    width: min(
        450px,
        90%
    );

    position: relative;

    z-index: 3;

    margin-bottom: -5px;

    transition:
        transform 0.45s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


.simple-about-photo img {
    width: 100%;

    max-height: 570px;

    display: block;

    object-fit: contain;

    object-position: center bottom;
}


.simple-about-photo:hover {
    transform:
        translateY(-7px)
        scale(1.015);
}


/* =========================================
   PHOTO DECORATION
========================================= */

.simple-about-decoration {
    position: absolute;

    pointer-events: none;
}


/* BACK CIRCLE */

.simple-about-decoration-one {
    width: 330px;
    height: 330px;

    left: 50%;
    bottom: 35px;

    transform:
        translateX(-50%);

    border-radius: 50%;

    background-color:
        rgba(
            0, 113, 227,
            0.07
        );
}


/* SMALL GRID */

.simple-about-decoration-two {
    width: 80px;
    height: 80px;

    left: 25px;
    bottom: 45px;

    opacity: 0.3;

    background-image:
        radial-gradient(
            #0071e3 1.5px,
            transparent 1.5px
        );

    background-size:
        12px 12px;
}


/* =========================================
   RIGHT CONTENT
========================================= */

.simple-about-content {
    max-width: 720px;
}


/* TITLE */

.simple-about-content h2 {
    max-width: 680px;

    margin:
        0 0
        23px;

    font-size:
        clamp(
            36px,
            3.2vw,
            49px
        );

    line-height: 1.12;

    font-weight: 700;

    letter-spacing: -1px;

    color: #1d1d1f;
}


.simple-about-content h2 span {
    color: #0071e3;
}


/* =========================================
   LEAD DESCRIPTION
========================================= */

.simple-about-lead {
    max-width: 650px;

    margin:
        0 0
        18px;

    font-size: 16px;

    line-height: 1.75;

    color: #424245;
}


/* =========================================
   DESCRIPTION
========================================= */

.simple-about-description {
    max-width: 650px;

    margin: 0;

    font-size: 14px;

    line-height: 1.85;

    color: #6e6e73;
}


/* =========================================
   INTEREST
========================================= */

.simple-about-interest {
    margin-top: 31px;

    padding-top: 25px;

    border-top:
        1px solid
        #d2d2d7;
}


.simple-about-small-title {
    margin:
        0 0
        13px;

    font-size: 9px;

    font-weight: 700;

    letter-spacing: 2px;

    color: #86868b;
}


.simple-about-interest-list {
    display: flex;

    flex-wrap: wrap;

    gap: 8px;
}


.simple-about-interest-list span {
    padding:
        7px 11px;

    border:
        1px solid
        #d2d2d7;

    border-radius: 20px;

    background-color: #f5f5f7;

    font-size: 10px;

    font-weight: 500;

    color: #6e6e73;

    transition:
        transform 0.3s ease,
        color 0.3s ease,
        border-color 0.3s ease,
        background-color 0.3s ease;
}


.simple-about-interest-list span:hover {
    color: #0071e3;

    border-color:
        rgba(
            0, 113, 227,
            0.25
        );

    background-color: #f5f5f7;

    transform:
        translateY(-2px);
}
/* =========================================
   SIMPLE HERO + ABOUT RESPONSIVE
========================================= */

@media (max-width: 1050px) {

    /* HERO */

    .simple-hero-container {
        width: 86%;

        grid-template-columns:
            54% 46%;
    }


    .simple-hero-content h1 {
        font-size: 57px;
    }


    .simple-hero-photo {
        width: 430px;
    }



    /* ABOUT */

    .simple-about-container {
        width: 86%;

        grid-template-columns:
            43% 57%;

        gap: 45px;
    }


    .simple-about-photo {
        width: 390px;
    }

}



@media (max-width: 800px) {

    /* =====================================
       HERO TABLET
    ===================================== */

    .simple-hero {
        min-height: auto;

        padding-top: 65px;
    }


    .simple-hero-container {
        width: 86%;

        min-height: auto;

        grid-template-columns: 1fr;

        gap: 40px;
    }


    .simple-hero-content {
        padding-bottom: 0;
    }


    .simple-hero-content h1 {
        max-width: 600px;

        font-size:
            clamp(
                48px,
                10vw,
                66px
            );
    }


    .simple-hero-content.hero-is-animating h1 {
        width: 100%;
    }


    .simple-hero-visual {
        min-height: 450px;
    }


    .simple-hero-photo {
        width: 400px;
    }


    .simple-hero-scroll {
        display: none;
    }



    /* =====================================
       ABOUT TABLET
    ===================================== */

    .about-slide-one {
        padding:
            70px 0
            100px;
    }


    .simple-about-container {
        width: 86%;

        min-height: auto;

        grid-template-columns:
            1fr;

        gap: 50px;
    }


    .simple-about-visual {
        min-height: 500px;
    }


    .simple-about-photo {
        width: 400px;
    }


    .simple-about-content {
        max-width: 680px;
    }

}



@media (max-width: 550px) {

    /* =====================================
       HERO MOBILE
    ===================================== */

    .simple-hero {
        padding-top: 50px;
    }


    .simple-hero-container {
        width: 88%;
    }


    .simple-hero-label {
        margin-bottom: 15px;
    }


    .simple-hero-content h1 {
        margin-bottom: 15px;

        font-size:
            clamp(
                43px,
                13vw,
                57px
            );

        letter-spacing: -1.5px;
    }


    .simple-hero-content.hero-is-animating h1 {
        width: 100%;
    }


    .simple-hero-content h2 {
        font-size: 16px;

        line-height: 1.5;
    }


    .simple-hero-description {
        font-size: 14px;
    }


    .simple-hero-buttons {
        align-items: stretch;

        flex-direction: column;
    }


    .simple-hero-button {
        width: 100%;
    }


    .simple-hero-visual {
        min-height: 400px;
    }


    .simple-hero-photo {
        width: 340px;
    }



    /* =====================================
       ABOUT MOBILE
    ===================================== */

    .about-slide-one {
        padding:
            55px 0
            100px;
    }


    .simple-about-container {
        width: 88%;

        gap: 40px;
    }


    .simple-about-visual {
        min-height: 420px;
    }


    .simple-about-photo {
        width: 330px;
    }


    .simple-about-decoration-one {
        width: 280px;
        height: 280px;
    }


    .simple-about-content h2 {
        font-size: 32px;
    }


    .simple-about-lead {
        font-size: 14px;
    }


    .simple-about-description {
        font-size: 13px;
    }

}
/* =========================================
   EMPTY PROJECT IMAGE
========================================= */

.project-placeholder-image {
    display: flex;
    justify-content: center;
    align-items: center;

    background:
        linear-gradient(
            135deg,
            #26262a 0%,
            #1d1d1f 100%
        );
}


.project-placeholder-image span {
    font-size: 46px;
    font-weight: 700;

    color: rgba(255, 255, 255, 0.16);
}
/* =========================================
   PROJECT HORIZONTAL CAROUSEL - FINAL
========================================= */

.project-scroll-wrapper {
    width: 100%;

    position: relative;

    overflow: hidden;

    cursor: grab;

    user-select: none;

    -webkit-user-select: none;

    touch-action: pan-y;
}


.project-scroll-wrapper.is-dragging {
    cursor: grabbing;
}


/* =========================================
   SCROLL AREA
========================================= */

#projectGrid.project-grid {
    width: 100%;

    /*
        PENTING:
        Matikan sistem grid lama.
    */

    display: flex !important;

    grid-template-columns: none !important;

    grid-auto-columns: unset !important;

    grid-auto-flow: unset !important;

    flex-wrap: nowrap !important;

    align-items: stretch;

    gap: 25px;

    overflow-x: auto !important;
    overflow-y: hidden;

    /* Ruang atas/bawah untuk shadow kartu + angkatan hover
       supaya tidak terpotong area scroll. */
    padding:
        10px 2px
        34px;

    scroll-behavior: smooth;

    scroll-snap-type: x mandatory;

    overscroll-behavior-x: contain;

    scrollbar-width: none;

    cursor: grab;
}


#projectGrid.project-grid::-webkit-scrollbar {
    display: none;
}


#projectGrid.project-grid.is-dragging {
    cursor: grabbing;

    scroll-behavior: auto;

    scroll-snap-type: none;
}


/* =========================================
   3 CARD TERLIHAT DI DESKTOP
========================================= */

#projectGrid .project-card {
    /*
        100% lebar area
        dikurangi 2 gap = 50px
        lalu dibagi 3.
    */

    flex:
        0 0
        calc(
            (100% - 50px) / 3
        );

    width:
        calc(
            (100% - 50px) / 3
        );

    min-width: 0;

    scroll-snap-align: start;

    scroll-snap-stop: always;
}


/* =========================================
   IMAGE
========================================= */

#projectGrid .project-card img {
    pointer-events: none;

    user-select: none;

    -webkit-user-select: none;

    -webkit-user-drag: none;
}


/* =========================================
   TABLET
========================================= */

@media (max-width: 1000px) {

    #projectGrid.project-grid {
        gap: 20px;
    }


    #projectGrid .project-card {
        flex:
            0 0
            calc(
                (100% - 20px) / 2
            );

        width:
            calc(
                (100% - 20px) / 2
            );
    }

}


/* =========================================
   MOBILE
========================================= */

@media (max-width: 650px) {

    #projectGrid.project-grid {
        gap: 14px;
    }


    #projectGrid .project-card {
        /*
            Sedikit card berikutnya
            masih terlihat.
        */

        flex:
            0 0
            88%;

        width:
            88%;
    }

}
/* =========================================
   PROJECT SCROLL BAR INDICATOR
========================================= */

.project-scroll-indicator {
    width: 100%;

    margin-top: 18px;

    display: flex;
    justify-content: center;
    align-items: center;

    gap: 8px;
}


/* BAR */

.project-scroll-bar {
    width: 16px;
    height: 5px;

    padding: 0;

    border: none;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.35s cubic-bezier(0.22, 1, 0.36, 1),
        background-color 0.3s ease,
        transform 0.3s ease;
}


/* ACTIVE */

.project-scroll-bar.is-active {
    width: 32px;

    background-color: #0071e3;
}


/* HOVER */

.project-scroll-bar:hover {
    transform: scaleY(1.3);
}


/* MOBILE */

@media (max-width: 650px) {

    .project-scroll-indicator {
        margin-top: 14px;
    }

    .project-scroll-bar {
        width: 13px;
        height: 4px;
    }

    .project-scroll-bar.is-active {
        width: 27px;
    }

}
/* =========================================
   PROJECT SCROLL INDICATOR
========================================= */

.project-scroll-indicator {
    margin-top: 18px;

    display: flex;
    justify-content: center;
    align-items: center;

    gap: 7px;
}


.project-scroll-bar {
    width: 18px;
    height: 4px;

    padding: 0;

    border: none;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.3s ease,
        background-color 0.3s ease,
        transform 0.3s ease;
}


.project-scroll-bar.is-active {
    width: 34px;

    background-color: #0071e3;
}


.project-scroll-bar:hover {
    transform: scaleY(1.25);
}
/* =========================================
   HORIZONTAL SLIDE HINT
========================================= */

.horizontal-slide-hint {
    margin-top: 12px;

    display: flex;
    flex-direction: column;
    align-items: center;

    gap: 7px;

    pointer-events: none;
}


.horizontal-slide-hint > span {
    font-size: 8px;
    font-weight: 700;

    letter-spacing: 2px;

    color: #86868b;
}


.hint-mobile {
    display: none;
}


/* LINE */

.horizontal-slide-hint-line {
    width: 46px;
    height: 1px;

    position: relative;

    overflow: hidden;

    background-color: #d2d2d7;
}


/* PURPLE MOVING LINE */

.horizontal-slide-hint-line span {
    width: 18px;
    height: 1px;

    position: absolute;

    left: -18px;
    top: 0;

    background-color: #0071e3;

    animation:
        horizontalHintMove
        1.8s ease-in-out infinite;
}


@keyframes horizontalHintMove {

    0% {
        left: -18px;
    }

    100% {
        left: 48px;
    }

}


@media (max-width: 650px) {

    .hint-desktop {
        display: none;
    }


    .hint-mobile {
        display: block;
    }

}
/* =========================================
   PROJECT SCROLL INDICATOR
========================================= */

.project-scroll-indicator {
    margin-top: 16px;

    display: flex;
    justify-content: center;
    align-items: center;

    gap: 7px;
}


.project-scroll-bar {
    width: 18px;
    height: 4px;

    padding: 0;

    border: none;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.3s ease,
        background-color 0.3s ease,
        transform 0.3s ease;
}


.project-scroll-bar.is-active {
    width: 34px;

    background-color: #0071e3;
}


.project-scroll-bar:hover {
    transform: scaleY(1.25);
}
/* =========================================
   ABOUT SLIDER INDICATOR - BAR STYLE
========================================= */

.about-navigation-dots {
    display: flex;
    justify-content: center;
    align-items: center;

    gap: 7px;
}


/* SEMUA INDICATOR JADI BAR */

.about-navigation-dot {
    width: 18px !important;
    height: 4px !important;

    padding: 0;

    border: none;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.35s cubic-bezier(0.22, 1, 0.36, 1),
        background-color 0.3s ease,
        transform 0.3s ease;
}


/* ACTIVE */

.about-navigation-dot.active {
    width: 34px !important;

    background-color: #0071e3;
}


/* HOVER */

.about-navigation-dot:hover {
    transform: scaleY(1.25);
}
/* =========================================
   PROJECT CONTINUOUS MOTION
========================================= */

#projectGrid.project-grid {
    scroll-snap-type: none !important;

    scroll-behavior: auto !important;
}


#projectGrid .project-card {
    scroll-snap-align: none !important;
}

/* =========================================================
   GUESTBOOK V2
   NEW LAYOUT - ISOLATED FROM OLD GUESTBOOK STYLE
========================================================= */

.guestbook-v2 {
    width: 100%;

    padding:
        110px 0
        105px;

    background-color: #f5f5f7;

    overflow: hidden;
}


/* =========================================================
   CONTAINER
========================================================= */

.guestbook-v2-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;
}


/* =========================================================
   HEADING
========================================================= */

.guestbook-v2-heading {
    max-width: 680px;

    margin:
        0 auto
        52px;

    text-align: center;
}


/* PURPLE ACCENT */

.guestbook-v2-accent {
    width: 54px;
    height: 4px;

    display: block;

    margin:
        0 auto
        18px;

    border-radius: 999px;

    background-color: #0071e3;
}


/* LABEL */

.guestbook-v2-label {
    margin:
        0 0
        13px;

    font-size: 11px;
    font-weight: 700;

    letter-spacing: 2.6px;

    color: #0071e3;
}


/* TITLE */

.guestbook-v2-heading h2 {
    margin:
        0 0
        17px;

    font-size:
        clamp(
            38px,
            4vw,
            58px
        );

    font-weight: 700;

    line-height: 1.08;

    letter-spacing: -1.5px;

    color: #1d1d1f;
}


/* DESCRIPTION */

.guestbook-v2-description {
    max-width: 570px;

    margin: 0 auto;

    font-size: 14px;

    line-height: 1.8;

    color: #6e6e73;
}


/* =========================================================
   FORM WRAPPER
========================================================= */

.guestbook-v2-form-wrapper {
    width:
        min(
            100%,
            720px
        );

    margin:
        0 auto
        90px;
}


/* =========================================================
   FORM CARD
========================================================= */

.guestbook-v2-form {
    width: 100%;

    padding: 20px;

    background-color: #ffffff;

    border:
        1px solid
        #d2d2d7;

    border-radius: 18px;

    box-shadow: none;
}


/* =========================================================
   NAME + BUTTON ROW
========================================================= */

.guestbook-v2-form-top {
    display: grid;

    grid-template-columns:
        minmax(0, 1fr)
        auto;

    gap: 10px;

    margin-bottom: 10px;
}


/* =========================================================
   INPUT
========================================================= */

.guestbook-v2-form-top input {
    width: 100%;
    height: 48px;

    padding:
        0 16px;

    border:
        1px solid
        #d2d2d7;

    border-radius: 10px;

    outline: none;

    background-color: #f5f5f7;

    font-family: inherit;

    font-size: 13px;

    color: #1d1d1f;

    transition:
        border-color 0.25s ease,
        background-color 0.25s ease,
        box-shadow 0.25s ease;
}


.guestbook-v2-form-top input::placeholder {
    color: #86868b;
}


.guestbook-v2-form-top input:focus {
    border-color: #0071e3;

    background-color: #ffffff;

    box-shadow:
        0 0 0 4px
        rgba(
            0, 113, 227,
            0.07
        );
}


/* =========================================================
   SUBMIT
========================================================= */

.guestbook-v2-submit {
    height: 48px;

    min-width: 112px;

    display: inline-flex;

    justify-content: center;
    align-items: center;

    gap: 7px;

    padding:
        0 20px;

    border: none;

    border-radius: 10px;

    background-color: #0071e3;

    font-family: inherit;

    font-size: 12px;
    font-weight: 600;

    color: #ffffff;

    cursor: pointer;

    transition:
        background-color 0.25s ease,
        transform 0.25s ease,
        box-shadow 0.25s ease;
}


.guestbook-v2-submit span {
    font-size: 15px;

    transition:
        transform 0.25s ease;
}


.guestbook-v2-submit:hover {
    background-color: #0066cc;

    transform:
        translateY(-1px);

    box-shadow:
        0 10px 22px
        rgba(
            0, 113, 227,
            0.18
        );
}


.guestbook-v2-submit:hover span {
    transform:
        translateX(3px);
}


.guestbook-v2-submit:disabled {
    opacity: 0.6;

    cursor: not-allowed;

    transform: none;

    box-shadow: none;
}


/* =========================================================
   MESSAGE
========================================================= */

.guestbook-v2-message-wrapper {
    position: relative;
}


.guestbook-v2-message-wrapper textarea {
    width: 100%;

    min-height: 125px;

    display: block;

    padding:
        15px 16px
        32px;

    border:
        1px solid
        #d2d2d7;

    border-radius: 10px;

    outline: none;

    resize: vertical;

    background-color: #f5f5f7;

    font-family: inherit;

    font-size: 13px;

    line-height: 1.7;

    color: #1d1d1f;

    transition:
        border-color 0.25s ease,
        background-color 0.25s ease,
        box-shadow 0.25s ease;
}


.guestbook-v2-message-wrapper
textarea::placeholder {

    color: #86868b;
}


.guestbook-v2-message-wrapper
textarea:focus {

    border-color: #0071e3;

    background-color: #ffffff;

    box-shadow:
        0 0 0 4px
        rgba(
            0, 113, 227,
            0.07
        );
}


/* CHARACTER COUNTER */

.guestbook-v2-counter {
    position: absolute;

    right: 13px;
    bottom: 10px;

    font-size: 10px;
    font-weight: 500;

    color: #86868b;

    pointer-events: none;
}


/* =========================================================
   TURNSTILE
========================================================= */

.guestbook-v2-turnstile {
    margin-top: 14px;
}


/* =========================================================
   STATUS
========================================================= */

.guestbook-v2-status {
    min-height: 0;

    margin:
        12px 0
        0;

    font-size: 12px;

    line-height: 1.6;

    color: #6e6e73;
}


.guestbook-v2-status:empty {
    display: none;
}


/* =========================================================
   COMMUNITY SECTION
========================================================= */

.guestbook-v2-community {
    width: 100%;
}


/* HEADER */

.guestbook-v2-community-head {
    display: flex;

    justify-content: space-between;
    align-items: flex-end;

    gap: 30px;

    margin-bottom: 26px;
}


/* LABEL */

.guestbook-v2-community-label {
    margin:
        0 0
        7px;

    font-size: 10px;
    font-weight: 700;

    letter-spacing: 2px;

    color: #0071e3;
}


/* TITLE */

.guestbook-v2-community-head h3 {
    margin: 0;

    font-size: 27px;
    font-weight: 700;

    color: #1d1d1f;
}


/* COUNT */

.guestbook-v2-count {
    display: inline-flex;

    align-items: center;

    min-height: 31px;

    padding:
        0 13px;

    border:
        1px solid
        #f5f5f7;

    border-radius: 999px;

    background-color: #f5f5f7;

    font-size: 10px;
    font-weight: 600;

    color: #0071e3;
}


/* =========================================================
   COMMENT GRID
========================================================= */

.guestbook-v2-grid {
    width: 100%;

    display: grid;

    grid-template-columns:
        repeat(
            3,
            minmax(0, 1fr)
        );

    gap: 16px;
}


/* =========================================================
   COMMENT CARD
   THIS WILL BE GENERATED BY JAVASCRIPT LATER
========================================================= */

.guestbook-v2-comment {
    min-width: 0;

    padding: 20px;

    background-color: #ffffff;

    border:
        1px solid
        #d2d2d7;

    border-radius: 15px;

    transition:
        transform 0.25s ease,
        border-color 0.25s ease,
        box-shadow 0.25s ease;
}


.guestbook-v2-comment:hover {
    transform:
        translateY(-3px);

    border-color: #f5f5f7;

    box-shadow:
        0 14px 30px
        rgba(
            29, 29, 31,
            0.055
        );
}


/* COMMENT HEADER */

.guestbook-v2-comment-head {
    display: flex;

    align-items: center;

    gap: 10px;

    margin-bottom: 14px;
}


/* AVATAR */

.guestbook-v2-avatar {
    width: 34px;
    height: 34px;

    flex-shrink: 0;

    display: flex;

    justify-content: center;
    align-items: center;

    border-radius: 50%;

    background-color: #f5f5f7;

    font-size: 12px;
    font-weight: 700;

    text-transform: uppercase;

    color: #0071e3;
}


/* NAME */

.guestbook-v2-comment-name {
    min-width: 0;

    margin: 0;

    overflow: hidden;

    text-overflow: ellipsis;

    white-space: nowrap;

    font-size: 12px;
    font-weight: 700;

    color: #1d1d1f;
}


/* DATE */

.guestbook-v2-comment-date {
    display: block;

    margin-top: 3px;

    font-size: 9px;

    color: #86868b;
}


/* MESSAGE */

.guestbook-v2-comment-message {
    margin: 0;

    overflow-wrap: anywhere;

    white-space: pre-wrap;

    font-size: 12px;

    line-height: 1.75;

    color: #424245;
}


/* =========================================================
   EMPTY STATE
========================================================= */

.guestbook-v2-empty {
    grid-column:
        1 / -1;

    width: 100%;

    padding:
        46px 20px;

    text-align: center;

    border:
        1px dashed
        #d2d2d7;

    border-radius: 16px;

    background-color:
        rgba(
            255,
            255,
            255,
            0.6
        );
}


.guestbook-v2-empty-icon {
    width: 38px;
    height: 38px;

    display: flex;

    justify-content: center;
    align-items: center;

    margin:
        0 auto
        14px;

    border-radius: 50%;

    background-color: #f5f5f7;

    font-size: 14px;

    color: #0071e3;
}


.guestbook-v2-empty h4 {
    margin:
        0 0
        7px;

    font-size: 14px;
    font-weight: 700;

    color: #1d1d1f;
}


.guestbook-v2-empty p {
    margin: 0;

    font-size: 11px;

    color: #86868b;
}


/* =========================================================
   TABLET
========================================================= */

@media (max-width: 900px) {

    .guestbook-v2 {
        padding:
            90px 0;
    }


    .guestbook-v2-container {
        width: 88%;
    }


    .guestbook-v2-grid {
        grid-template-columns:
            repeat(
                2,
                minmax(0, 1fr)
            );
    }

}


/* =========================================================
   MOBILE
========================================================= */

@media (max-width: 650px) {

    .guestbook-v2 {
        padding:
            75px 0;
    }


    .guestbook-v2-container {
        width: 90%;
    }


    .guestbook-v2-heading {
        margin-bottom: 38px;
    }


    .guestbook-v2-heading h2 {
        font-size: 37px;

        letter-spacing: -1px;
    }


    .guestbook-v2-description {
        font-size: 13px;
    }


    /* FORM */

    .guestbook-v2-form-wrapper {
        margin-bottom: 65px;
    }


    .guestbook-v2-form {
        padding: 15px;

        border-radius: 16px;
    }


    .guestbook-v2-form-top {
        grid-template-columns:
            minmax(0, 1fr)
            92px;

        gap: 8px;
    }


    .guestbook-v2-submit {
        min-width: 92px;

        padding:
            0 12px;
    }


    .guestbook-v2-message-wrapper
    textarea {

        min-height: 115px;
    }


    /* COMMUNITY */

    .guestbook-v2-community-head {
        align-items: flex-start;

        gap: 15px;
    }


    .guestbook-v2-community-head h3 {
        font-size: 22px;
    }


    /* COMMENTS */

    .guestbook-v2-grid {
        grid-template-columns: 1fr;

        gap: 12px;
    }


    .guestbook-v2-comment {
        padding: 18px;
    }

}


/* =========================================================
   VERY SMALL MOBILE
========================================================= */

@media (max-width: 400px) {

    .guestbook-v2-form-top {
        grid-template-columns: 1fr;
    }


    .guestbook-v2-submit {
        width: 100%;
    }


    .guestbook-v2-community-head {
        flex-direction: column;

        align-items: flex-start;
    }

}
/* =========================================
   PREMIUM FOOTER
========================================= */

.main-footer {
    width: 100%;

    padding:
        90px 0
        35px;

    background:
        #14120e;

    color:
        #ffffff;

    position: relative;

    overflow: hidden;
}


/* SUBTLE PURPLE LIGHT */

.main-footer::before {
    content: "";

    width: 500px;
    height: 500px;

    position: absolute;

    left: -220px;
    top: -280px;

    border-radius: 50%;

    background:
        radial-gradient(
            circle,
            rgba(0, 113, 227, 0.12),
            transparent 68%
        );

    pointer-events: none;
}


.footer-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;

    position: relative;
    z-index: 2;
}



/* =========================================
   MAIN GRID
========================================= */

.footer-main {
    display: grid;

    grid-template-columns:
        minmax(0, 1.8fr)
        minmax(180px, 0.75fr)
        minmax(180px, 0.75fr);

    gap: 80px;

    align-items: start;
}



/* =========================================
   PROFILE
========================================= */

.footer-profile {
    max-width: 560px;
}


.footer-name {
    display: inline-block;

    margin-bottom: 16px;

    font-size: clamp(
        25px,
        2.2vw,
        34px
    );

    font-weight: 700;

    line-height: 1.1;

    letter-spacing: -1px;

    color: #ffffff;

    text-decoration: none;
}


.footer-name span {
    color: #2997ff;
}


.footer-description {
    max-width: 520px;

    margin:
        0 0
        28px;

    font-size: 14px;

    line-height: 1.8;

    color: #86868b;
}



/* =========================================
   CONTACT INFO
========================================= */

.footer-contact-list {
    display: flex;
    flex-direction: column;

    gap: 13px;

    margin-bottom: 30px;
}


.footer-contact-item {
    width: fit-content;

    display: flex;
    align-items: center;

    gap: 12px;

    color: #d2d2d7;

    font-size: 13px;

    line-height: 1.5;

    text-decoration: none;

    transition:
        color 0.3s ease,
        transform 0.3s ease;
}


a.footer-contact-item:hover {
    color: #ffffff;

    transform:
        translateX(3px);
}


.footer-contact-item iconify-icon {
    flex-shrink: 0;

    font-size: 19px;

    color: #6e6e73;
}



/* =========================================
   SOCIAL
========================================= */

.footer-social-block {
    margin-top: 4px;
}


.footer-social-block > p {
    margin:
        0 0
        13px;

    font-size: 12px;

    font-weight: 600;

    color: #d2d2d7;
}


.footer-socials {
    display: flex;
    align-items: center;

    gap: 9px;
}


.footer-socials a {
    width: 38px;
    height: 38px;

    display: flex;
    align-items: center;
    justify-content: center;

    border:
        1px solid
        rgba(148, 163, 184, 0.16);

    border-radius: 50%;

    color: #86868b;

    text-decoration: none;

    transition:
        color 0.3s ease,
        border-color 0.3s ease,
        background-color 0.3s ease,
        transform 0.3s ease;
}


.footer-socials a:hover {
    color: #ffffff;

    border-color:
        rgba(139, 92, 246, 0.6);

    background:
        rgba(0, 113, 227, 0.14);

    transform:
        translateY(-3px);
}


.footer-socials iconify-icon {
    font-size: 19px;
}



/* =========================================
   BUTTONS
========================================= */

.footer-actions {
    margin-top: 28px;

    display: flex;
    align-items: center;

    flex-wrap: wrap;

    gap: 11px;
}


.footer-main-button,
.footer-secondary-button {
    min-height: 44px;

    display: inline-flex;
    align-items: center;
    justify-content: center;

    gap: 9px;

    padding:
        0 18px;

    border-radius: 980px;

    font-size: 12px;
    font-weight: 600;

    text-decoration: none;

    transition:
        background-color 0.3s ease,
        color 0.3s ease,
        border-color 0.3s ease;
}



/* PRIMARY */

.footer-main-button {
    background: #ffffff;

    color: #1d1d1f;

    border:
        1px solid #ffffff;
}


.footer-main-button span {
    font-size: 16px;

    transition:
        transform 0.3s ease;
}


.footer-main-button:hover {
    background: #2997ff;

    border-color: #2997ff;

    color: #ffffff;

    transform:
        translateY(-2px);
}


.footer-main-button:hover span {
    transform:
        translateX(3px);
}



/* SECONDARY */

.footer-secondary-button {
    background: transparent;

    color: #ffffff;

    border:
        1px solid
        rgba(148, 163, 184, 0.28);
}


.footer-secondary-button:hover {
    border-color: #2997ff;

    background:
        rgba(0, 113, 227, 0.10);

    transform:
        translateY(-2px);
}


.footer-secondary-button iconify-icon {
    font-size: 16px;
}



/* =========================================
   COLUMNS
========================================= */

.footer-column-title {
    margin:
        3px 0
        27px;

    font-size: 13px;

    font-weight: 700;

    color: #ffffff;
}


.footer-links {
    display: flex;
    flex-direction: column;

    align-items: flex-start;

    gap: 20px;
}


.footer-links a {
    position: relative;

    color: #86868b;

    font-size: 13px;

    text-decoration: none;

    transition:
        color 0.3s ease,
        transform 0.3s ease;
}


.footer-links a::after {
    content: "";

    width: 0;
    height: 1px;

    position: absolute;

    left: 0;
    bottom: -5px;

    background: #2997ff;

    transition:
        width 0.3s ease;
}


.footer-links a:hover {
    color: #ffffff;

    transform:
        translateX(3px);
}


.footer-links a:hover::after {
    width: 100%;
}



/* =========================================
   DIVIDER
========================================= */

.footer-divider {
    width: 100%;
    height: 1px;

    margin:
        58px 0
        28px;

    background:
        rgba(148, 163, 184, 0.12);
}



/* =========================================
   BOTTOM
========================================= */

.footer-bottom {
    display: flex;

    align-items: flex-end;
    justify-content: space-between;

    gap: 30px;
}


.footer-copyright {
    display: flex;
    flex-direction: column;

    gap: 7px;
}


.footer-copyright p {
    margin: 0;

    font-size: 10px;

    line-height: 1.6;

    color: #6e6e73;
}


.footer-bottom-links {
    display: flex;
    align-items: center;

    gap: 25px;
}


.footer-bottom-links a {
    font-size: 10px;

    color: #6e6e73;

    text-decoration: none;

    transition:
        color 0.3s ease;
}


.footer-bottom-links a:hover {
    color: #2997ff;
}



/* =========================================
   RESPONSIVE
========================================= */

@media (max-width: 1000px) {

    .footer-main {
        grid-template-columns:
            1.5fr 1fr 1fr;

        gap: 45px;
    }

}



@media (max-width: 780px) {

    .main-footer {
        padding:
            70px 0
            30px;
    }


    .footer-main {
        grid-template-columns:
            1fr 1fr;

        gap:
            55px 35px;
    }


    .footer-profile {
        grid-column:
            1 / -1;
    }

}



@media (max-width: 550px) {

    .footer-main {
        grid-template-columns:
            1fr;

        gap: 45px;
    }


    .footer-profile {
        grid-column: auto;
    }


    .footer-description {
        font-size: 13px;
    }


    .footer-contact-item {
        font-size: 12px;
    }


    .footer-actions {
        align-items: stretch;
        flex-direction: column;
    }


    .footer-main-button,
    .footer-secondary-button {
        width: 100%;
    }


    .footer-bottom {
        align-items: flex-start;
        flex-direction: column;
    }


    .footer-divider {
        margin-top: 45px;
    }

}
/* =========================================
   PROJECT CURSOR FIX
========================================= */

#projectGrid {
    cursor: grab;
}


#projectGrid.is-dragging {
    cursor: grabbing;
}


#projectGrid .project-card {
    cursor: grab;
}


/* LINK TETAP BISA DIKLIK */

#projectGrid .project-link {
    position: relative;

    z-index: 20;

    cursor: pointer !important;

    pointer-events: auto !important;
}


#projectGrid .project-link:hover {
    cursor: pointer !important;
}
/* =========================================
   PREFERS REDUCED MOTION
   Mengurangi motion dekoratif/berkelanjutan
   untuk user yang mengaktifkan setting ini.
   Navigasi & slider manual tetap berfungsi.
========================================= */

@media (prefers-reduced-motion: reduce) {

    html {
        scroll-behavior: auto;
    }

    *,
    *::before,
    *::after {
        animation-duration: 0.001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.001ms !important;
        scroll-behavior: auto !important;
    }
}
/* =========================================
   MOBILE NAV TOGGLE
========================================= */

.mobile-nav-toggle {
    display: none;
}


/* =========================================
   MOBILE HERO
   CENTERED PROFILE LAYOUT
========================================= */

@media (max-width: 650px) {

    /* =====================================
       NAVBAR
    ===================================== */

    .portfolio-nav {
        width: calc(100% - 24px);

        top: 10px;

        margin:
            10px auto
            -68px;

        border-radius: 18px;
    }


    .portfolio-nav.is-expanded {
        width: calc(100% - 24px);

        top: 10px;

        margin:
            10px auto
            -68px;

        border-radius: 18px;

        border:
            1px solid
            rgba(210, 210, 215, 0.9);
    }


    .portfolio-nav-inner,
    .portfolio-nav.is-expanded
    .portfolio-nav-inner {

        width: 100%;

        min-height: 54px;

        margin: 0;

        padding:
            6px 8px
            6px 16px;

        display: grid;

        grid-template-columns:
            1fr auto;

        align-items: center;

        gap: 12px;
    }


    /* DESKTOP MENU HIDE */

    .portfolio-nav-links {
        display: none;
    }


    .portfolio-nav-contact {
        display: none;
    }


    /* LOGO */

    .portfolio-nav-logo {
        font-size: 13px;

        font-weight: 700;

        white-space: nowrap;
    }



    /* =====================================
       HAMBURGER
    ===================================== */

    .mobile-nav-toggle {
        width: 36px;
        height: 36px;

        padding: 0;

        display: flex;

        flex-direction: column;

        align-items: center;
        justify-content: center;

        gap: 4px;

        border:
            1px solid
            #d2d2d7;

        border-radius: 10px;

        background:
            #ffffff;

        cursor: pointer;
    }


    .mobile-nav-toggle span {
        width: 15px;
        height: 1.5px;

        display: block;

        border-radius: 10px;

        background:
            #424245;
    }



    /* =====================================
       HERO
    ===================================== */

    .simple-hero {
        min-height: auto;

        padding:
            105px 0
            55px;

        overflow: hidden;
    }


    .simple-hero-container {
        width:
            calc(
                100% - 40px
            );

        max-width:
            430px;

        margin:
            0 auto;

        display: flex;

        flex-direction: column;

        align-items: center;

        gap: 0;
    }



    /* =====================================
       PHOTO FIRST
    ===================================== */

    .simple-hero-visual {
        order: 1;

        width: 100%;

        margin:
            15px 0
            0;

        display: flex;

        justify-content: center;
        align-items: center;
    }


    .simple-hero-photo {
        width: min(88vw, 360px);

        margin: 0 auto;

        position: relative;

        display: flex;

        align-items: flex-end;
        justify-content: center;

        transform: none;
    }



    .simple-hero-photo::before,
    .simple-hero-photo::after {
        display: none;
    }


    /* Aturan .simple-hero-photo img dihapus (dulu di sini).

       max-width: 340px adalah penyebab utama pita putih di HP
       lebar: kartu selebar min(88vw, 360px) — 343px di layar
       390px, 360px di layar 430px — sementara gambarnya dipatok
       340px. Aturan kartu tidak pernah menyetel max-width, jadi
       batas ini lolos dan gambar jadi lebih sempit dari kartunya.

       mask-image/transform di sini hanya reset defensif untuk
       aturan yang tidak pernah ada (tidak ada satu pun mask di
       stylesheet ini selain reset tersebut). */



    /* =====================================
       CONTENT SECOND
    ===================================== */

    .simple-hero-content {
        order: 2;

        width: 100%;

        max-width: none;

        padding: 0;

        text-align: center;

        display: flex;

        flex-direction: column;

        align-items: center;
    }



    /* =====================================
       SMALL PURPLE INDICATOR
    ===================================== */

    .simple-hero-label {
        width: auto;

        margin:
            14px 0
            16px;

        display: flex;

        justify-content: center;
        align-items: center;
    }


    /*
        Kita pakai garis ungu seperti
        referensi mobile.
    */

    .simple-hero-label span {
        width: 55px;
        height: 5px;

        display: block;

        border-radius: 20px;

        background:
            #2997ff;
    }


    /*
        HELLO I'M disembunyikan di mobile,
        indikator garis menggantikannya.
    */

    .simple-hero-label p {
        display: none;
    }



    /* =====================================
       NAME
    ===================================== */

    .simple-hero-content h1 {
        width: 100%;

        max-width:
            390px;

        margin:
            0 0
            14px;

        font-size:
            clamp(
                40px,
                11vw,
                50px
            );

        line-height: 0.98;

        letter-spacing:
            -2.5px;

        text-align: center;
    }


    .simple-hero-content h1 > span {
        display: inline;

        color:
            #0071e3;
    }



    /* =====================================
       JOB TITLE
    ===================================== */

    .simple-hero-content h2 {
        width: 100%;

        max-width:
            330px;

        margin:
            0 auto
            20px;

        font-size:
            15px;

        line-height:
            1.45;

        text-align:
            center;
    }



    /* =====================================
       DESCRIPTION
    ===================================== */

    .simple-hero-description {
        width: 100%;

        max-width:
            350px;

        margin:
            0 auto
            27px;

        font-size:
            13px;

        line-height:
            1.7;

        text-align:
            center;
    }



    /* =====================================
       BUTTONS
    ===================================== */

    .simple-hero-buttons {
        width: 100%;

        display: grid;

        grid-template-columns:
            1fr 1fr;

        gap: 8px;
    }


    .simple-hero-button {
        width: 100%;

        min-height: 46px;

        padding:
            0 10px;

        display: flex;

        justify-content: center;
        align-items: center;

        gap: 8px;

        border-radius: 8px;

        font-size: 10px;

        white-space: nowrap;
    }


    .simple-hero-button span {
        font-size: 14px;
    }



    /* =====================================
       SCROLL INDICATOR
    ===================================== */

    .simple-hero-scroll {
        display: none;
    }

}
@media (max-width: 650px) {

    /* =========================
       HERO MOBILE
    ========================= */
    .simple-hero {
        min-height: auto;
        padding: 96px 0 42px;
        overflow: hidden;
    }

    .simple-hero-container {
        width: calc(100% - 28px);
        max-width: 430px;
        margin: 0 auto;
        display: flex;
        flex-direction: column;
        align-items: center;
    }

    /* =========================
       NAVBAR MOBILE
    ========================= */
    .portfolio-nav {
        width: calc(100% - 24px);
        top: 10px;
        margin: 10px auto -62px;
        border-radius: 18px;
    }

    .portfolio-nav-inner,
    .portfolio-nav.is-expanded .portfolio-nav-inner {
        width: 100%;
        min-height: 54px;
        margin: 0;
        padding: 6px 8px 6px 16px;
        display: grid;
        grid-template-columns: 1fr auto;
        align-items: center;
        gap: 12px;
    }

    .portfolio-nav-links,
    .portfolio-nav-inner > .nav-lang-slot,
    .portfolio-nav-contact {
        display: none;
    }

    .portfolio-nav-logo {
        font-size: 13px;
        font-weight: 700;
        white-space: nowrap;
    }

    .mobile-nav-toggle {
        width: 36px;
        height: 36px;
        padding: 0;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 4px;
        border: 1px solid #d2d2d7;
        border-radius: 10px;
        background: #ffffff;
        cursor: pointer;
    }

    .mobile-nav-toggle span {
        width: 15px;
        height: 1.5px;
        display: block;
        border-radius: 10px;
        background: #424245;
    }

    /* =========================
       FOTO MOBILE
    ========================= */
    .simple-hero-visual {
        order: 1;
        width: 100%;
        margin: 10px 0 14px;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .simple-hero-photo {
        width: min(88vw, 360px);
        margin: 0 auto;
        display: flex;
        justify-content: center;
        align-items: flex-end;
        position: relative;
    }

    .simple-hero-photo::before,
    .simple-hero-photo::after {
        display: none;
    }

    /* Aturan .simple-hero-photo img dihapus (dulu di sini) —
       duplikat dari blok 650px sebelumnya, dengan max-width
       340px yang sama. Lihat catatan di blok itu. */

    /* =========================
       CONTENT MOBILE
    ========================= */
    .simple-hero-content {
        order: 2;
        width: 100%;
        text-align: center;
        display: flex;
        flex-direction: column;
        align-items: center;
    }

    .simple-hero-label {
        margin: 0 0 12px;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .simple-hero-label p {
        display: none;
    }

    .simple-hero-label span {
        width: 54px;
        height: 5px;
        display: block;
        border-radius: 999px;
        background: #0071e3;
    }

    .simple-hero-content h1 {
        width: 100%;
        max-width: 360px;
        margin: 0 0 12px;
        font-size: clamp(40px, 10.5vw, 56px);
        line-height: 0.98;
        letter-spacing: -1.8px;
        text-align: center;
    }

    .simple-hero-content h1 > span {
        display: block;
        margin-top: 6px;
        color: #0071e3;
    }

    .simple-hero-content h2 {
        max-width: 330px;
        margin: 0 auto 14px;
        font-size: 15px;
        line-height: 1.45;
        text-align: center;
    }

    .simple-hero-description {
        max-width: 340px;
        margin: 0 auto 18px;
        font-size: 13px;
        line-height: 1.7;
        text-align: center;
    }

    .simple-hero-buttons {
        width: 100%;
        margin-top: 0;
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: 10px;
    }

    .simple-hero-button {
        width: 100%;
        min-height: 46px;
        padding: 0 12px;
        display: flex;
        justify-content: center;
        align-items: center;
        gap: 8px;
        border-radius: 10px;
        font-size: 12px;
        white-space: nowrap;
    }

    .simple-hero-scroll {
        display: none;
    }
}
/* ==========================================================
   TABLET ONLY — 768px s/d 1024px
   (iPad Mini 768 & iPad Air 820)

   HAPUS DULU blok "TABLET ONLY — iPad Mini ... iPad Air"
   yang lama di bawah file CSS kamu, lalu tempel yang ini
   di posisi PALING BAWAH.

   Desktop (>1024px) dan mobile (<768px) tidak tersentuh.
   ========================================================== */

@media (min-width: 768px) and (max-width: 1024px) {

    /* ======================================================
       CONTAINER
    ====================================================== */

    :root {
        --page-width: 88%;
    }


    /* ======================================================
       NAVBAR
       Di 768–900 link sudah disembunyikan tapi hamburger
       belum muncul. Ini yang bikin menu hilang total.
    ====================================================== */

    .portfolio-nav-inner,
    .portfolio-nav.is-expanded .portfolio-nav-inner {
        grid-template-columns: 1fr auto;
        gap: 16px;
    }

}


/*
  Batas bawahnya 651px, bukan 768px.

  Aturan hamburger yang satunya berhenti di max-width:650px, sementara
  .portfolio-nav-links sudah disembunyikan sejak max-width:900px. Dulu
  itu meninggalkan celah 651-767px: menu desktop sudah hilang, tapi
  tombol hamburger belum muncul — jadi di lebar itu navigasi tidak bisa
  diakses sama sekali (dan sejak switch EN|ID ikut tinggal di dalam
  .portfolio-nav-links, pemilih bahasa ikut hilang di sana juga).
*/
@media (min-width: 651px) and (max-width: 1024px) {

    .portfolio-nav-links,
    .portfolio-nav-inner > .nav-lang-slot,
    .portfolio-nav-contact {
        display: none;
    }

    .mobile-nav-toggle {
        width: 38px;
        height: 38px;

        padding: 0;

        display: flex;
        flex-direction: column;

        justify-content: center;
        align-items: center;

        gap: 4px;

        border: 1px solid #d2d2d7;
        border-radius: 10px;

        background: #ffffff;

        cursor: pointer;

        justify-self: end;
    }

    .mobile-nav-toggle span {
        width: 16px;
        height: 1.5px;

        display: block;

        border-radius: 10px;

        background: #424245;
    }

}


/* ======================================================
   TABLET NAV — HAMBURGER → X + DROPDOWN

   Same behavior as the mobile hamburger menu above, just
   scoped to 768–1024px so the toggle button added by the
   block above (currently limited to 768–900px) actually
   opens something. Without this, iPad Pro 12.9" / iPad
   Air 13" (both 1024px wide in portrait) show a hamburger
   icon that does nothing when tapped.
====================================================== */

@media (min-width: 768px) and (max-width: 1024px) {

    .portfolio-nav.is-mobile-open .mobile-nav-toggle span:nth-child(1) {
        transform: translateY(5.5px) rotate(45deg);
    }

    .portfolio-nav.is-mobile-open .mobile-nav-toggle span:nth-child(2) {
        opacity: 0;
    }

    .portfolio-nav.is-mobile-open .mobile-nav-toggle span:nth-child(3) {
        transform: translateY(-5.5px) rotate(-45deg);
    }

    .mobile-nav-menu {
        width: 100%;
        max-height: 0;
        padding: 0 16px;
        display: flex;
        flex-direction: column;
        gap: 0;
        opacity: 0;
        visibility: hidden;
        overflow: hidden;
        border-top: 1px solid transparent;
        transition:
            max-height 0.45s cubic-bezier(0.22, 1, 0.36, 1),
            opacity 0.3s ease,
            padding 0.4s ease,
            border-color 0.3s ease,
            visibility 0.3s ease;
    }

    .portfolio-nav.is-mobile-open .mobile-nav-menu {
        max-height: 500px;
        padding: 10px 16px 17px;
        opacity: 1;
        visibility: visible;
        border-top-color: #f5f5f7;
    }

    .mobile-nav-menu > a {
        width: 100%;
        min-height: 48px;
        display: flex;
        align-items: center;
        gap: 14px;
        padding: 0 6px;
        border-bottom: 1px solid #f5f5f7;
        color: #424245;
        font-size: 12px;
        font-weight: 600;
        text-decoration: none;
        transition: color 0.25s ease, padding-left 0.25s ease;
    }

    .mobile-nav-menu > a > .nav-index {
        min-width: 20px;
        font-size: 8px;
        font-weight: 700;
        letter-spacing: 1px;
        color: #2997ff;
    }

    .mobile-nav-menu > a:hover {
        padding-left: 10px;
        color: #0071e3;
    }

    .mobile-nav-menu .mobile-nav-contact {
        min-height: 46px;
        margin-top: 12px;
        padding: 0 16px;
        justify-content: space-between;
        border: none;
        border-radius: 12px;
        background: #1d1d1f;
        color: #ffffff;
    }

    .mobile-nav-menu .mobile-nav-contact:hover {
        padding-left: 16px;
        background: #0071e3;
        color: #ffffff;
    }

    .mobile-nav-menu .mobile-nav-contact .nav-arrow {
        min-width: auto;
        font-size: 14px;
        color: #ffffff;
    }

}


@media (min-width: 768px) and (max-width: 1024px) {

    /* ======================================================
       HERO
       Tetap 2 kolom — 768px masih cukup lebar.
       Aturan max-width:800 kamu menumpuknya jadi 1 kolom,
       itu yang bikin foto membesar sampai memenuhi layar.
    ====================================================== */

    .simple-hero {
        min-height: auto;

        /* navbar sticky + margin -70px, butuh ruang aman */
        padding: 118px 0 60px;
    }

    .simple-hero-container {
        width: var(--page-width);

        min-height: auto;

        display: grid;
        grid-template-columns: 56% 44%;

        align-items: center;

        gap: 24px;
    }

    .simple-hero-content {
        max-width: none;

        padding-bottom: 0;
    }

    /* Ukuran asli clamp(56px, 5vw, 78px) terlalu besar
       untuk kolom selebar ~370px */
    .simple-hero-content h1 {
        max-width: none;

        margin-bottom: 14px;

        font-size: clamp(34px, 5.4vw, 48px);

        line-height: 1.02;

        letter-spacing: -1.5px;
    }

    .simple-hero-content h2 {
        margin-bottom: 16px;

        font-size: 16px;
    }

    .simple-hero-description {
        max-width: 420px;

        font-size: 13.5px;

        line-height: 1.7;
    }

    .simple-hero-buttons {
        margin-top: 24px;

        flex-direction: row;
        flex-wrap: wrap;

        gap: 10px;
    }

    .simple-hero-button {
        width: auto;

        min-height: 44px;

        padding: 0 17px;

        font-size: 12px;
    }


    /* ---------- VISUAL / FOTO ---------- */

    .simple-hero-visual {
        min-height: auto;

        align-items: flex-end;
    }

    .simple-hero-photo {
        width: 100%;
        max-width: 330px;

        margin-bottom: 0;
    }

    /* Aturan .simple-hero-photo img dihapus (dulu di sini).

       max-height: 430px memotong gambar di tablet: kartu selebar
       330px dengan aspect-ratio 3/4 tingginya 440px, jadi
       gambarnya 10px lebih pendek dari kartunya dan menyisakan
       pita putih di bawah. */

    .simple-hero-scroll {
        display: none;
    }


    /* ======================================================
       ABOUT — SLIDE 01
       Di 820px kolom teks cuma ~300px, terlalu sempit.
       Jadikan 1 kolom, foto di atas.
    ====================================================== */

    .about-full-slide {
        min-height: auto;
    }

    .about-slide-one {
        padding: 80px 0 110px;
    }

    .simple-about-container {
        width: var(--page-width);

        min-height: auto;

        grid-template-columns: 1fr;

        gap: 36px;
    }

    .simple-about-visual {
        min-height: auto;

        order: -1;

        overflow: visible;
    }

    .simple-about-photo {
        width: 100%;
        max-width: 320px;

        margin: 0 auto -5px;
    }

    .simple-about-photo img {
        max-height: 400px;
    }

    .simple-about-decoration-one {
        width: 270px;
        height: 270px;

        bottom: 25px;
    }

    .simple-about-decoration-two {
        left: 8%;
        bottom: 35px;
    }

    .simple-about-number {
        left: 0;
        top: 0;
    }

    .simple-about-content {
        max-width: 680px;

        margin: 0 auto;
    }

    .simple-about-content h2 {
        font-size: 34px;
    }

    .simple-about-lead {
        font-size: 15px;
    }

    .simple-about-description {
        font-size: 13.5px;
    }


    /* ======================================================
       ABOUT — SLIDE 02 & 03
       Samakan supaya seluruh rentang tablet konsisten.
    ====================================================== */

    .about-full-container,
    .about-organization-layout {
        width: var(--page-width);

        grid-template-columns: 1fr;

        gap: 42px;
    }

    .about-profile-content,
    .about-org-content {
        max-width: 720px;

        margin: 0 auto;
    }

    .about-org-gallery {
        max-width: 620px;

        margin: 0 auto;
    }

    .about-org-photo img {
        height: 400px;
    }

    .about-org-controls {
        justify-content: center;
    }

    .about-tech-container {
        width: var(--page-width);
    }


    /* ======================================================
       PANAH SLIDER
       Sekarang menimpa foto. Turunkan ke bawah slide.
    ====================================================== */

    .about-navigation {
        width: 42px;
        height: 42px;

        top: auto;
        bottom: 24px;

        transform: none;
    }

    .about-navigation:hover {
        transform: scale(1.05);
    }

    .about-navigation-prev {
        left: 6%;
    }

    .about-navigation-next {
        right: 6%;
    }

    .about-navigation-dots {
        bottom: 36px;
    }

}
/* =========================================
   MOBILE NAV MENU
========================================= */

.mobile-nav-menu {
    display: none;
}


@media (max-width: 650px) {

    /* =====================================
       NAVBAR
    ===================================== */

    .portfolio-nav {
        overflow: hidden;

        transition:
            width 0.45s cubic-bezier(0.22, 1, 0.36, 1),
            border-radius 0.35s ease,
            box-shadow 0.35s ease,
            background-color 0.35s ease;
    }


    /* =====================================
       HAMBURGER
    ===================================== */

    .mobile-nav-toggle {
        width: 36px;
        height: 36px;

        padding: 0;

        display: flex;

        flex-direction: column;

        align-items: center;
        justify-content: center;

        gap: 4px;

        border:
            1px solid
            #d2d2d7;

        border-radius: 10px;

        background: #ffffff;

        cursor: pointer;

        position: relative;

        z-index: 10;
    }


    .mobile-nav-toggle span {
        width: 15px;
        height: 1.5px;

        display: block;

        border-radius: 20px;

        background: #424245;

        transform-origin: center;

        transition:
            transform 0.3s ease,
            opacity 0.2s ease;
    }


    /* =====================================
       HAMBURGER → X
    ===================================== */

    .portfolio-nav.is-mobile-open
    .mobile-nav-toggle span:nth-child(1) {

        transform:
            translateY(5.5px)
            rotate(45deg);
    }


    .portfolio-nav.is-mobile-open
    .mobile-nav-toggle span:nth-child(2) {

        opacity: 0;
    }


    .portfolio-nav.is-mobile-open
    .mobile-nav-toggle span:nth-child(3) {

        transform:
            translateY(-5.5px)
            rotate(-45deg);
    }



    /* =====================================
       MOBILE DROPDOWN
    ===================================== */

    .mobile-nav-menu {
        width: 100%;

        max-height: 0;

        padding:
            0 16px;

        display: flex;

        flex-direction: column;

        gap: 0;

        opacity: 0;

        visibility: hidden;

        overflow: hidden;

        border-top:
            1px solid
            transparent;

        transition:
            max-height 0.45s
                cubic-bezier(
                    0.22,
                    1,
                    0.36,
                    1
                ),
            opacity 0.3s ease,
            padding 0.4s ease,
            border-color 0.3s ease,
            visibility 0.3s ease;
    }


    /* OPEN */

    .portfolio-nav.is-mobile-open
    .mobile-nav-menu {

        max-height: 500px;

        padding:
            10px 16px
            17px;

        opacity: 1;

        visibility: visible;

        border-top-color:
            #f5f5f7;
    }



    /* =====================================
       LINKS
    ===================================== */

    .mobile-nav-menu > a {
        width: 100%;

        min-height: 48px;

        display: flex;

        align-items: center;

        gap: 14px;

        padding:
            0 6px;

        border-bottom:
            1px solid
            #f5f5f7;

        color: #424245;

        font-size: 12px;
        font-weight: 600;

        text-decoration: none;

        transition:
            color 0.25s ease,
            padding-left 0.25s ease;
    }


    .mobile-nav-menu > a > .nav-index {
        min-width: 20px;

        font-size: 8px;

        font-weight: 700;

        letter-spacing: 1px;

        color: #2997ff;
    }


    .mobile-nav-menu > a:hover {
        padding-left: 10px;

        color: #0071e3;
    }



    /* =====================================
       CONTACT
    ===================================== */

    .mobile-nav-menu
    .mobile-nav-contact {

        min-height: 46px;

        margin-top: 12px;

        padding:
            0 16px;

        justify-content: space-between;

        border: none;

        border-radius: 12px;

        background: #1d1d1f;

        color: #ffffff;
    }


    .mobile-nav-menu
    .mobile-nav-contact:hover {

        padding-left: 16px;

        background: #0071e3;

        color: #ffffff;
    }


    .mobile-nav-menu
    .mobile-nav-contact .nav-arrow {

        min-width: auto;

        font-size: 14px;

        color: #ffffff;
    }

}
/* =========================================
   FINAL PROJECT IMAGE SIZE FIX
========================================= */

#projectGrid .project-card {
    overflow: hidden;
}


/* AREA GAMBAR CARD

   Dulu tingginya dipatok px dan berbeda-beda tiap breakpoint
   (230 / 210 / 220px) — itu salah satu sumber kartu terlihat
   tidak konsisten. Sekarang satu aspect-ratio untuk semua
   ukuran layar, jadi proporsi gambar selalu sama.
   height/min/max di-reset ke auto karena aturan lama memakai
   !important. */

#projectGrid .project-image {
    width: 100% !important;

    aspect-ratio: 3 / 2;

    height: auto !important;

    min-height: 0 !important;
    max-height: none !important;

    flex-shrink: 0;

    overflow: hidden;

    background-color: #e8e8ed;
}


/* GAMBAR */

#projectGrid .project-image img {
    width: 100% !important;
    height: 100% !important;

    max-width: 100% !important;
    max-height: 100% !important;

    display: block;

    object-fit: cover !important;
    object-position: center !important;

    pointer-events: none;

    user-select: none;
    -webkit-user-drag: none;
}
/* Tidak ada override tinggi gambar per breakpoint lagi —
   aspect-ratio di atas sudah menangani semua ukuran layar. */


/* =========================================
   RESPONSIVE IMAGE <picture> WRAPPERS

   img elements above were wrapped in <picture>
   for mobile WebP sources. display:contents makes
   the picture element itself invisible to layout,
   so the img inside participates directly in the
   parent's flex/sizing exactly as it did before
   being wrapped (needed for flex-centered photos
   like the hero, whose mobile CSS centers the img
   itself via justify-content).
========================================= */

.simple-hero-photo picture,
.simple-about-photo picture,
.about-org-photo picture,
.project-image picture {
    display: contents;
}

/* Pengecualian: <picture> di dalam hero photo stack TIDAK memakai
   display: contents. Kartunya adalah <button>, dan display:
   contents di dalam <button> termasuk sudut yang penanganannya
   berbeda-beda antar mesin render. Di sana picture dijadikan
   kotak absolut yang mengisi kartu — lihat
   ".hero-photo-stack .hero-photo-card picture" di blok HERO PHOTO
   STACK. Spesifisitasnya (0,2,1) lebih tinggi dari aturan di
   atas (0,1,1), jadi override-nya tidak bergantung urutan. */
/* =========================================================
   GUESTBOOK V2 - SIGNATURE REVEAL ANIMATION
========================================================= */

/* initial state */

.guestbook-v2-heading,
.guestbook-v2-form-wrapper,
.guestbook-v2-community {
    opacity: 0;

    transform:
        translateY(28px);
}


/* =========================================================
   HEADING REVEAL
========================================================= */

.guestbook-v2.is-visible
.guestbook-v2-heading {
    animation:
        guestbookFadeUp
        0.75s
        cubic-bezier(0.22, 1, 0.36, 1)
        forwards;
}


/* PURPLE ACCENT */

.guestbook-v2-accent {
    position: relative;

    transform:
        scaleX(0);

    transform-origin:
        center;
}


.guestbook-v2.is-visible
.guestbook-v2-accent {
    animation:
        guestbookAccentReveal
        0.8s
        cubic-bezier(0.22, 1, 0.36, 1)
        0.15s
        forwards;
}


/* SMALL PULSE */

.guestbook-v2-accent::after {
    content: "";

    position: absolute;

    inset: -6px;

    border-radius: inherit;

    background-color:
        rgba(0, 113, 227, 0.20);

    opacity: 0;

    transform:
        scale(0.8);

    pointer-events: none;
}


.guestbook-v2.is-visible
.guestbook-v2-accent::after {
    animation:
        guestbookAccentPulse
        1.6s
        ease
        0.7s
        1;
}


/* =========================================================
   FORM REVEAL
========================================================= */

.guestbook-v2.is-visible
.guestbook-v2-form-wrapper {
    animation:
        guestbookFadeUp
        0.8s
        cubic-bezier(0.22, 1, 0.36, 1)
        0.18s
        forwards;
}


/* FORM SPOTLIGHT */

.guestbook-v2-form {
    position: relative;

    overflow: hidden;
}


.guestbook-v2-form::after {
    content: "";

    width: 180px;
    height: 180%;

    position: absolute;

    top: -40%;
    left: -220px;

    background:
        linear-gradient(
            90deg,
            transparent,
            rgba(0, 113, 227, 0.08),
            rgba(0, 113, 227, 0.16),
            rgba(0, 113, 227, 0.08),
            transparent
        );

    transform:
        rotate(15deg);

    pointer-events: none;

    opacity: 0;
}


.guestbook-v2.is-visible
.guestbook-v2-form::after {
    animation:
        guestbookSpotlight
        1.15s
        cubic-bezier(0.22, 1, 0.36, 1)
        0.7s
        forwards;
}


/* =========================================================
   COMMUNITY REVEAL
========================================================= */

.guestbook-v2.is-visible
.guestbook-v2-community {
    animation:
        guestbookFadeUp
        0.8s
        cubic-bezier(0.22, 1, 0.36, 1)
        0.35s
        forwards;
}


/* =========================================================
   COMMENT CARDS STAGGER
========================================================= */

.guestbook-v2.is-visible
.guestbook-v2-comment {
    animation:
        guestbookCardReveal
        0.65s
        cubic-bezier(0.22, 1, 0.36, 1)
        both;
}


.guestbook-v2.is-visible
.guestbook-v2-comment:nth-child(1) {
    animation-delay: 0.45s;
}


.guestbook-v2.is-visible
.guestbook-v2-comment:nth-child(2) {
    animation-delay: 0.55s;
}


.guestbook-v2.is-visible
.guestbook-v2-comment:nth-child(3) {
    animation-delay: 0.65s;
}


.guestbook-v2.is-visible
.guestbook-v2-comment:nth-child(4) {
    animation-delay: 0.75s;
}


.guestbook-v2.is-visible
.guestbook-v2-comment:nth-child(5) {
    animation-delay: 0.85s;
}


.guestbook-v2.is-visible
.guestbook-v2-comment:nth-child(6) {
    animation-delay: 0.95s;
}


/* =========================================================
   EMPTY STATE
========================================================= */

.guestbook-v2.is-visible
.guestbook-v2-empty {
    animation:
        guestbookCardReveal
        0.7s
        cubic-bezier(0.22, 1, 0.36, 1)
        0.48s
        both;
}


/* =========================================================
   KEYFRAMES
========================================================= */

@keyframes guestbookFadeUp {

    from {
        opacity: 0;

        transform:
            translateY(28px);
    }

    to {
        opacity: 1;

        transform:
            translateY(0);
    }

}


@keyframes guestbookAccentReveal {

    from {
        transform:
            scaleX(0);
    }

    to {
        transform:
            scaleX(1);
    }

}


@keyframes guestbookAccentPulse {

    0% {
        opacity: 0;

        transform:
            scale(0.8);
    }

    35% {
        opacity: 1;
    }

    100% {
        opacity: 0;

        transform:
            scale(1.8);
    }

}


@keyframes guestbookSpotlight {

    0% {
        left: -220px;

        opacity: 0;
    }

    15% {
        opacity: 1;
    }

    75% {
        opacity: 1;
    }

    100% {
        left:
            calc(100% + 220px);

        opacity: 0;
    }

}


@keyframes guestbookCardReveal {

    from {
        opacity: 0;

        transform:
            translateY(20px)
            scale(0.97);
    }

    to {
        opacity: 1;

        transform:
            translateY(0)
            scale(1);
    }

}


/* =========================================================
   ACCESSIBILITY
========================================================= */

@media (prefers-reduced-motion: reduce) {

    .guestbook-v2-heading,
    .guestbook-v2-form-wrapper,
    .guestbook-v2-community,
    .guestbook-v2-comment,
    .guestbook-v2-empty,
    .guestbook-v2-accent {

        opacity: 1;

        transform: none;

        animation: none !important;
    }


    .guestbook-v2-form::after,
    .guestbook-v2-accent::after {

        display: none;
    }

}
/* =========================================================
   GUESTBOOK INTERACTIVE PARTICLES
   TABLET + DESKTOP ONLY
========================================================= */

.guestbook-v2 {
    position: relative;
    overflow: hidden;
}

.guestbook-v2-container {
    position: relative;
    z-index: 2;
}

.guestbook-v2-particle {
    position: absolute;

    left: var(--particle-x);
    top: var(--particle-y);

    display: flex;
    justify-content: center;
    align-items: center;

    font-size: var(--particle-size);

    color:
        rgba(
            0, 113, 227,
            var(--particle-opacity)
        );

    line-height: 1;

    user-select: none;
    pointer-events: none;

    filter:
        drop-shadow(
            0 5px 10px
            rgba(0, 113, 227, 0.12)
        );

    will-change: transform;
}


/* jangan tampilkan di HP */

@media (max-width: 767px) {

    .guestbook-v2-particles {
        display: none;
    }

}


/* accessibility */

@media (prefers-reduced-motion: reduce) {

    .guestbook-v2-particles {
        display: none;
    }

}
/* =========================================================
   GUESTBOOK PLANE CURSOR
   DESKTOP / POINTER DEVICE ONLY
========================================================= */

.guestbook-plane-cursor {
    width: 34px;
    height: 34px;

    position: fixed;

    left: 0;
    top: 0;

    z-index: 99999;

    display: none;

    justify-content: center;
    align-items: center;

    pointer-events: none;

    font-size: 27px;

    color: #0071e3;

    opacity: 0;

    transform:
        translate(-50%, -50%)
        rotate(-8deg);

    filter:
        drop-shadow(
            0 5px 8px
            rgba(0, 113, 227, 0.22)
        );

    will-change:
        left,
        top,
        transform,
        opacity;
}


/* saat cursor berada di area tombol */

.guestbook-plane-cursor.is-active {
    display: flex;

    opacity: 1;
}


/* sembunyikan cursor asli */

.guestbook-v2-submit.plane-hover {
    cursor: none;
}


/* =========================================================
   SMALL TRAIL
========================================================= */

.guestbook-plane-cursor::after {
    content: "";

    width: 25px;
    height: 2px;

    position: absolute;

    right: 25px;
    top: 17px;

    border-radius: 999px;

    background:
        linear-gradient(
            90deg,
            transparent,
            rgba(0, 113, 227, 0.28)
        );

    opacity: 0;

    transform:
        scaleX(0);

    transform-origin: right;
}


.guestbook-plane-cursor.is-active::after {
    opacity: 1;

    transform:
        scaleX(1);

    transition:
        transform 0.25s ease,
        opacity 0.25s ease;
}


/* =========================================================
   TAKE OFF
========================================================= */

.guestbook-plane-cursor.is-flying {
    display: flex;

    opacity: 1;

    transition:
        left 1.05s
            cubic-bezier(0.22, 0.75, 0.25, 1),
        top 1.05s
            cubic-bezier(0.22, 0.75, 0.25, 1),
        transform 1.05s
            cubic-bezier(0.22, 0.75, 0.25, 1),
        opacity 0.25s ease 0.8s;
}


.guestbook-plane-cursor.is-flying::after {
    width: 70px;

    opacity: 1;
}


/* =========================================================
   ONLY REAL POINTER DEVICES
========================================================= */

@media (hover: none), (pointer: coarse) {

    .guestbook-plane-cursor {
        display: none !important;
    }


    .guestbook-v2-submit {
        cursor: pointer !important;
    }

}


/* ACCESSIBILITY */

@media (prefers-reduced-motion: reduce) {

    .guestbook-plane-cursor {
        display: none !important;
    }

}
/* =========================================
   GUESTBOOK STATUS
========================================= */

.guestbook-v2-status.is-error {
    color: #dc2626;
}

.guestbook-v2-status.is-success {
    color: #16a34a;
}
/* =========================================================
   CONTACT + GUESTBOOK
   COMBINED SECTION
========================================================= */

.contact-guestbook {
    position: relative;

    width: 100%;

    padding:
        105px 0
        110px;

    background-color: #f5f5f7;

    overflow: hidden;
}


/* =========================================================
   CONTAINER
========================================================= */

.contact-guestbook-container {
    position: relative;

    z-index: 2;

    width: var(--page-width);

    max-width: var(--page-max-width);

    margin: 0 auto;
}


/* =========================================================
   MAIN GRID
========================================================= */

.contact-guestbook-grid {
    display: grid;

    grid-template-columns:
        minmax(0, 0.82fr)
        minmax(0, 1.18fr);

    gap: clamp(
        55px,
        6vw,
        100px
    );

    align-items: start;
}


/* =========================================================
   LEFT SIDE
   CONTACT
========================================================= */

.contact-guestbook-left {
    min-width: 0;
}


/* =========================================================
   CONTACT HEADING
========================================================= */

.contact-guestbook-heading {
    max-width: 500px;

    margin-bottom: 42px;
}


.contact-guestbook-accent {
    display: block;

    width: 52px;
    height: 4px;

    margin-bottom: 18px;

    border-radius: 999px;

    background-color: #0071e3;
}


.contact-guestbook-label {
    margin:
        0 0
        12px;

    font-size: 10px;
    font-weight: 700;

    letter-spacing: 2.4px;

    color: #0071e3;
}


.contact-guestbook-heading h2 {
    margin:
        0 0
        17px;

    font-size:
        clamp(
            38px,
            4.5vw,
            58px
        );

    line-height: 1.05;

    letter-spacing: -1.5px;

    color: #1d1d1f;
}


.contact-guestbook-description {
    max-width: 450px;

    margin: 0;

    font-size: 14px;

    line-height: 1.8;

    color: #6e6e73;
}


/* =========================================================
   CONTACT LINKS
========================================================= */

.contact-guestbook-links {
    display: flex;

    flex-direction: column;

    gap: 11px;
}


/* CONTACT CARD */

.contact-guestbook-link {
    position: relative;

    width: 100%;

    min-height: 78px;

    display: flex;

    align-items: center;

    gap: 14px;

    padding:
        14px 17px;

    border:
        1px solid
        #d2d2d7;

    border-radius: 15px;

    background-color: #ffffff;

    text-decoration: none;

    overflow: hidden;

    transition:
        transform 0.25s ease,
        border-color 0.25s ease,
        box-shadow 0.25s ease,
        background-color 0.25s ease;
}


.contact-guestbook-link:hover {
    transform:
        translateY(-3px);

    border-color: #f5f5f7;

    background-color: #ffffff;

    box-shadow:
        0 13px 30px
        rgba(29, 29, 31, 0.055);
}


/* ICON */

.contact-guestbook-link-icon {
    width: 43px;
    height: 43px;

    flex-shrink: 0;

    display: flex;

    justify-content: center;
    align-items: center;

    border-radius: 12px;

    background-color: #f5f5f7;

    color: #0071e3;

    transition:
        transform 0.25s ease,
        background-color 0.25s ease,
        color 0.25s ease;
}


.contact-guestbook-link-icon iconify-icon {
    font-size: 21px;
}


.contact-guestbook-link:hover
.contact-guestbook-link-icon {
    transform:
        scale(1.05);

    background-color: #0071e3;

    color: #ffffff;
}


/* INFO */

.contact-guestbook-link-info {
    min-width: 0;

    display: flex;

    flex-direction: column;

    gap: 3px;
}


.contact-guestbook-link-label {
    font-size: 9px;
    font-weight: 700;

    letter-spacing: 1.3px;

    color: #86868b;
}


.contact-guestbook-link-value {
    overflow: hidden;

    text-overflow: ellipsis;

    white-space: nowrap;

    font-size: 12px;
    font-weight: 600;

    color: #1d1d1f;
}


/* ARROW */

.contact-guestbook-link-arrow {
    margin-left: auto;

    flex-shrink: 0;

    font-size: 17px;

    color: #86868b;

    transition:
        transform 0.25s ease,
        color 0.25s ease;
}


.contact-guestbook-link:hover
.contact-guestbook-link-arrow {
    transform:
        translate(
            2px,
            -2px
        );

    color: #0071e3;
}


/* =========================================================
   CONTACT NOTE
========================================================= */

.contact-guestbook-note {
    display: flex;

    align-items: center;

    gap: 9px;

    margin-top: 23px;
}


.contact-guestbook-note-dot {
    width: 7px;
    height: 7px;

    flex-shrink: 0;

    border-radius: 50%;

    background-color: #0071e3;

    box-shadow:
        0 0 0 5px
        rgba(0, 113, 227, 0.08);
}


.contact-guestbook-note p {
    margin: 0;

    font-size: 10px;

    line-height: 1.6;

    color: #86868b;
}


/* =========================================================
   RIGHT SIDE
   GUESTBOOK
========================================================= */

.contact-guestbook-right {
    min-width: 0;
}


/* =========================================================
   GUESTBOOK HEADING
========================================================= */

.contact-guestbook-right-heading {
    max-width: 590px;

    margin-bottom: 28px;
}


.contact-guestbook-right-heading h2 {
    margin:
        0 0
        12px;

    font-size:
        clamp(
            31px,
            3vw,
            44px
        );

    line-height: 1.1;

    letter-spacing: -1px;

    color: #1d1d1f;
}


.contact-guestbook-right-heading > p:last-child {
    max-width: 520px;

    margin: 0;

    font-size: 13px;

    line-height: 1.75;

    color: #6e6e73;
}


/* =========================================================
   GUESTBOOK FORM OVERRIDE
========================================================= */

.contact-guestbook
.guestbook-v2-form-wrapper {
    width: 100%;

    max-width: none;

    margin:
        0 0
        42px;
}


.contact-guestbook
.guestbook-v2-form {
    width: 100%;

    padding: 17px;

    border:
        1px solid
        #d2d2d7;

    border-radius: 17px;

    background-color: #ffffff;

    box-shadow:
        0 16px 38px
        rgba(29, 29, 31, 0.045);
}


/* NAME + BUTTON */

.contact-guestbook
.guestbook-v2-form-top {
    display: grid;

    grid-template-columns:
        minmax(0, 1fr)
        auto;

    gap: 9px;

    margin-bottom: 9px;
}


/* NAME INPUT */

.contact-guestbook
.guestbook-v2-form-top input {
    width: 100%;

    height: 47px;

    padding:
        0 15px;

    border:
        1px solid
        #d2d2d7;

    border-radius: 10px;

    outline: none;

    background-color: #f5f5f7;

    font-family: inherit;

    font-size: 12px;

    color: #1d1d1f;

    transition:
        border-color 0.25s ease,
        box-shadow 0.25s ease,
        background-color 0.25s ease;
}


.contact-guestbook
.guestbook-v2-form-top input::placeholder {
    color: #86868b;
}


.contact-guestbook
.guestbook-v2-form-top input:focus {
    border-color: #0071e3;

    background-color: #ffffff;

    box-shadow:
        0 0 0 4px
        rgba(0, 113, 227, 0.07);
}


/* SUBMIT */

.contact-guestbook
.guestbook-v2-submit {
    min-width: 105px;

    height: 47px;

    display: inline-flex;

    justify-content: center;
    align-items: center;

    gap: 7px;

    padding:
        0 18px;

    border: none;

    border-radius: 10px;

    background-color: #0071e3;

    font-family: inherit;

    font-size: 11px;
    font-weight: 600;

    color: #ffffff;

    cursor: pointer;

    transition:
        background-color 0.25s ease,
        transform 0.25s ease,
        box-shadow 0.25s ease;
}


.contact-guestbook
.guestbook-v2-submit:hover {
    background-color: #0066cc;

    transform:
        translateY(-1px);

    box-shadow:
        0 9px 20px
        rgba(0, 113, 227, 0.18);
}


/* MESSAGE */

.contact-guestbook
.guestbook-v2-message-wrapper {
    position: relative;
}


.contact-guestbook
.guestbook-v2-message-wrapper textarea {
    width: 100%;

    min-height: 118px;

    display: block;

    padding:
        14px 15px
        31px;

    border:
        1px solid
        #d2d2d7;

    border-radius: 10px;

    outline: none;

    resize: vertical;

    background-color: #f5f5f7;

    font-family: inherit;

    font-size: 12px;

    line-height: 1.7;

    color: #1d1d1f;

    transition:
        border-color 0.25s ease,
        box-shadow 0.25s ease,
        background-color 0.25s ease;
}


.contact-guestbook
.guestbook-v2-message-wrapper textarea::placeholder {
    color: #86868b;
}


.contact-guestbook
.guestbook-v2-message-wrapper textarea:focus {
    border-color: #0071e3;

    background-color: #ffffff;

    box-shadow:
        0 0 0 4px
        rgba(0, 113, 227, 0.07);
}


/* COUNTER */

.contact-guestbook
.guestbook-v2-counter {
    position: absolute;

    right: 12px;
    bottom: 9px;

    font-size: 9px;

    color: #86868b;

    pointer-events: none;
}


/* STATUS */

.contact-guestbook
.guestbook-v2-status {
    min-height: 0;

    margin:
        10px 0
        0;

    font-size: 11px;

    line-height: 1.6;
}


/* =========================================================
   COMMUNITY HEADER
========================================================= */

.contact-guestbook
.guestbook-v2-community {
    width: 100%;

    min-width: 0;
}


.contact-guestbook
.guestbook-v2-community-head {
    display: flex;

    justify-content: space-between;
    align-items: flex-end;

    gap: 20px;

    margin-bottom: 18px;
}


.contact-guestbook
.guestbook-v2-community-label {
    margin:
        0 0
        6px;

    font-size: 9px;
    font-weight: 700;

    letter-spacing: 1.8px;

    color: #0071e3;
}


.contact-guestbook
.guestbook-v2-community-head h3 {
    margin: 0;

    font-size: 22px;

    line-height: 1.2;

    color: #1d1d1f;
}


/* =========================================================
   SLIDER HEADER RIGHT
========================================================= */

.guestbook-slider-header-right {
    display: flex;

    align-items: center;

    gap: 10px;
}


/* COUNT */

.contact-guestbook
.guestbook-v2-count {
    min-height: 30px;

    display: inline-flex;

    align-items: center;

    padding:
        0 11px;

    border:
        1px solid
        #f5f5f7;

    border-radius: 999px;

    background-color: #f5f5f7;

    white-space: nowrap;

    font-size: 9px;
    font-weight: 600;

    color: #0071e3;
}


/* =========================================================
   SLIDER CONTROLS
========================================================= */

.guestbook-slider-controls {
    display: flex;

    align-items: center;

    gap: 6px;
}


.guestbook-slider-button {
    width: 31px;
    height: 31px;

    display: flex;

    justify-content: center;
    align-items: center;

    padding: 0;

    border:
        1px solid
        #d2d2d7;

    border-radius: 50%;

    background-color: #ffffff;

    font-family: inherit;

    font-size: 13px;

    color: #424245;

    cursor: pointer;

    transition:
        background-color 0.25s ease,
        border-color 0.25s ease,
        color 0.25s ease,
        transform 0.25s ease;
}


.guestbook-slider-button:hover {
    border-color: #0071e3;

    background-color: #0071e3;

    color: #ffffff;

    transform:
        translateY(-1px);
}


/* =========================================================
   COMMENT SLIDER
========================================================= */

.contact-guestbook
.guestbook-v2-grid {
    width: 100%;

    min-width: 0;

    display: flex;

    gap: 12px;

    overflow-x: auto;
    overflow-y: hidden;

    padding:
        2px 2px
        7px;

    scroll-snap-type:
        x mandatory;

    scroll-behavior:
        smooth;

    overscroll-behavior-x:
        contain;

    -webkit-overflow-scrolling:
        touch;

    scrollbar-width:
        none;

    cursor: grab;
}


.contact-guestbook
.guestbook-v2-grid::-webkit-scrollbar {
    display: none;
}


.contact-guestbook
.guestbook-v2-grid:active {
    cursor: grabbing;
}


.contact-guestbook
.guestbook-v2-grid.is-dragging {
    cursor: grabbing;

    scroll-behavior: auto;

    scroll-snap-type: none;

    user-select: none;
}


/* =========================================================
   COMMENT CARD
========================================================= */

.contact-guestbook
.guestbook-v2-comment {
    flex:
        0 0
        calc(
            (100% - 12px) / 2
        );

    min-width: 0;

    padding: 16px;

    scroll-snap-align: start;

    background-color: #ffffff;

    border:
        1px solid
        #d2d2d7;

    border-radius: 14px;

    transition:
        transform 0.25s ease,
        border-color 0.25s ease,
        box-shadow 0.25s ease;
}


.contact-guestbook
.guestbook-v2-comment:hover {
    transform:
        translateY(-2px);

    border-color: #f5f5f7;

    box-shadow:
        0 10px 24px
        rgba(29, 29, 31, 0.05);
}


/* COMMENT HEADER */

.contact-guestbook
.guestbook-v2-comment-head {
    display: flex;

    align-items: center;

    gap: 9px;

    margin-bottom: 11px;
}


/* AVATAR */

.contact-guestbook
.guestbook-v2-avatar {
    width: 30px;
    height: 30px;

    flex-shrink: 0;

    display: flex;

    justify-content: center;
    align-items: center;

    border-radius: 50%;

    background-color: #f5f5f7;

    font-size: 10px;
    font-weight: 700;

    color: #0071e3;
}


/* NAME */

.contact-guestbook
.guestbook-v2-comment-name {
    max-width: 170px;

    margin: 0;

    overflow: hidden;

    text-overflow: ellipsis;

    white-space: nowrap;

    font-size: 11px;
    font-weight: 700;

    color: #1d1d1f;
}


/* DATE */

.contact-guestbook
.guestbook-v2-comment-date {
    display: block;

    margin-top: 2px;

    font-size: 8px;

    color: #86868b;
}


/* MESSAGE */

.contact-guestbook
.guestbook-v2-comment-message {
    margin: 0;

    max-height: 130px;

    overflow-y: auto;

    overscroll-behavior-y: contain;

    -webkit-overflow-scrolling: touch;

    overflow-wrap: anywhere;

    white-space: pre-wrap;

    font-size: 11px;

    line-height: 1.7;

    color: #424245;

    scrollbar-width: thin;
    scrollbar-color: #f5f5f7 transparent;
}


.contact-guestbook
.guestbook-v2-comment-message::-webkit-scrollbar {
    width: 4px;
}


.contact-guestbook
.guestbook-v2-comment-message::-webkit-scrollbar-track {
    background: transparent;
}


.contact-guestbook
.guestbook-v2-comment-message::-webkit-scrollbar-thumb {
    background-color: #f5f5f7;
    border-radius: 999px;
}


/* PIN BUTTON */

.contact-guestbook
.guestbook-v2-comment-pin {
    flex-shrink: 0;

    margin-left: auto;

    width: 26px;
    height: 26px;

    display: flex;

    align-items: center;
    justify-content: center;

    padding: 0;

    border: none;

    border-radius: 50%;

    background-color: transparent;

    font-size: 12px;
    line-height: 1;

    cursor: pointer;

    opacity: 0.35;

    transition:
        opacity 0.2s ease,
        background-color 0.2s ease,
        transform 0.2s ease;
}


.contact-guestbook
.guestbook-v2-comment-pin:hover {
    opacity: 0.8;

    background-color: #f5f5f7;
}


.contact-guestbook
.guestbook-v2-comment-pin.is-active {
    opacity: 1;

    background-color: #f5f5f7;

    transform: rotate(-20deg);
}


/* PINNED CARD */

.contact-guestbook
.guestbook-v2-comment.is-pinned {
    border-color: #f5f5f7;

    background-color: #f5f5f7;
}


/* =========================================================
   EMPTY STATE
========================================================= */

.contact-guestbook
.guestbook-v2-empty {
    flex: 0 0 100%;

    width: 100%;

    padding:
        35px 20px;

    text-align: center;

    border:
        1px dashed
        #d2d2d7;

    border-radius: 14px;

    background-color:
        rgba(255, 255, 255, 0.65);
}


.contact-guestbook
.guestbook-v2-empty-icon {
    width: 35px;
    height: 35px;

    display: flex;

    justify-content: center;
    align-items: center;

    margin:
        0 auto
        12px;

    border-radius: 50%;

    background-color: #f5f5f7;

    font-size: 13px;

    color: #0071e3;
}


.contact-guestbook
.guestbook-v2-empty h4 {
    margin:
        0 0
        6px;

    font-size: 13px;

    color: #1d1d1f;
}


.contact-guestbook
.guestbook-v2-empty p {
    margin: 0;

    font-size: 10px;

    color: #86868b;
}


/* =========================================================
   LARGE TABLET / SMALL LAPTOP
========================================================= */

@media (max-width: 1100px) {

    .contact-guestbook-grid {
        grid-template-columns:
            minmax(0, 0.8fr)
            minmax(0, 1.2fr);

        gap: 45px;
    }


    .contact-guestbook-link {
        padding:
            13px 14px;
    }


    .contact-guestbook-link-icon {
        width: 39px;
        height: 39px;
    }


    .contact-guestbook-link-value {
        font-size: 11px;
    }


    .contact-guestbook
    .guestbook-v2-comment {

        flex:
            0 0
            76%;
    }

}


/* =========================================================
   TABLET PORTRAIT
========================================================= */

@media (max-width: 900px) {

    .contact-guestbook {
        padding:
            90px 0;
    }


    .contact-guestbook-container {
        width: 88%;
    }


    .contact-guestbook-grid {
        grid-template-columns: 1fr;

        gap: 80px;
    }


    .contact-guestbook-left {
        max-width: 680px;

        margin: 0 auto;

        width: 100%;
    }


    .contact-guestbook-right {
        width: 100%;

        max-width: 760px;

        margin: 0 auto;
    }


    .contact-guestbook-heading {
        max-width: 600px;
    }


    .contact-guestbook
    .guestbook-v2-comment {

        flex:
            0 0
            calc(
                (100% - 12px) / 2
            );
    }

}


/* =========================================================
   MOBILE
========================================================= */

@media (max-width: 650px) {

    .contact-guestbook {
        padding:
            75px 0;
    }


    .contact-guestbook-container {
        width: 90%;
    }


    .contact-guestbook-grid {
        gap: 65px;
    }


    /* CONTACT */

    .contact-guestbook-heading {
        margin-bottom: 32px;
    }


    .contact-guestbook-heading h2 {
        font-size: 38px;

        letter-spacing: -1px;
    }


    .contact-guestbook-description {
        font-size: 13px;
    }


    .contact-guestbook-link {
        min-height: 71px;

        padding:
            12px 13px;

        border-radius: 13px;
    }


    .contact-guestbook-link-icon {
        width: 38px;
        height: 38px;

        border-radius: 10px;
    }


    .contact-guestbook-link-icon
    iconify-icon {

        font-size: 19px;
    }


    .contact-guestbook-link-label {
        font-size: 8px;
    }


    .contact-guestbook-link-value {
        max-width: 220px;

        font-size: 10px;
    }


    /* GUESTBOOK */

    .contact-guestbook-right-heading h2 {
        font-size: 32px;
    }


    .contact-guestbook
    .guestbook-v2-form {

        padding: 14px;

        border-radius: 15px;
    }


    .contact-guestbook
    .guestbook-v2-form-top {

        grid-template-columns:
            minmax(0, 1fr)
            90px;

        gap: 7px;
    }


    .contact-guestbook
    .guestbook-v2-submit {

        min-width: 90px;

        padding:
            0 11px;
    }


    /* COMMUNITY HEADER */

    .contact-guestbook
    .guestbook-v2-community-head {

        align-items: flex-end;

        gap: 10px;
    }


    .guestbook-slider-header-right {
        gap: 7px;
    }


    .contact-guestbook
    .guestbook-v2-count {

        display: none;
    }


    /* COMMENT SLIDER */

    .contact-guestbook
    .guestbook-v2-comment {

        /*
            Card berikutnya sengaja
            sedikit terlihat agar user
            tahu slider bisa digeser.
        */

        flex:
            0 0
            88%;
    }


    .contact-guestbook
    .guestbook-v2-grid {

        gap: 10px;

        margin-right: -5%;
    }

}


/* =========================================================
   VERY SMALL MOBILE
========================================================= */

@media (max-width: 400px) {

    .contact-guestbook-heading h2 {
        font-size: 34px;
    }


    .contact-guestbook
    .guestbook-v2-form-top {

        grid-template-columns: 1fr;
    }


    .contact-guestbook
    .guestbook-v2-submit {

        width: 100%;
    }


    .contact-guestbook-link-value {
        max-width: 175px;
    }


    .contact-guestbook
    .guestbook-v2-community-head {

        align-items: flex-start;
    }

}


/* =========================================================
   REDUCED MOTION
========================================================= */

@media (prefers-reduced-motion: reduce) {

    .contact-guestbook *,
    .contact-guestbook *::before,
    .contact-guestbook *::after {

        scroll-behavior: auto !important;
    }

}
/* =========================================================
   CONTACT SOCIAL - SIMPLE BRAND STYLE
========================================================= */

.contact-social-link {
    width: 100%;

    min-height: 66px;

    display: flex;

    align-items: center;

    gap: 11px;

    padding:
        12px 16px;

    border:
        1px solid #d2d2d7;

    border-radius: 14px;

    background-color: #ffffff;

    text-decoration: none;

    color: #1d1d1f;

    transition:
        transform 0.25s ease,
        color 0.25s ease,
        background-color 0.25s ease,
        border-color 0.25s ease,
        box-shadow 0.25s ease;
}


/* =========================================================
   ICON
========================================================= */

.contact-social-icon {
    width: 36px;
    height: 36px;

    display: flex;

    justify-content: center;
    align-items: center;

    flex-shrink: 0;

    border-radius: 10px;

    background-color: #f5f5f7;

    color: #0071e3;

    transition:
        color 0.25s ease,
        background-color 0.25s ease,
        transform 0.25s ease;
}


.contact-social-icon iconify-icon {
    font-size: 21px;
}


.contact-social-divider {
    font-size: 13px;

    color: #d2d2d7;
}


.contact-social-name {
    font-size: 13px;

    font-weight: 600;

    color: inherit;
}


/* =========================================================
   BRAND COLORS
========================================================= */


/* INSTAGRAM */

.contact-social-instagram:hover {
    color: #e1306c;

    border-color:
        rgba(225, 48, 108, 0.25);

    background-color:
        rgba(225, 48, 108, 0.035);

    box-shadow:
        0 12px 28px
        rgba(225, 48, 108, 0.08);
}


.contact-social-instagram:hover
.contact-social-icon {

    color: #ffffff;

    background:
        linear-gradient(
            135deg,
            #833ab4,
            #fd1d1d,
            #fcb045
        );
}


/* WHATSAPP */

.contact-social-whatsapp:hover {
    color: #16a34a;

    border-color:
        rgba(37, 211, 102, 0.30);

    background-color:
        rgba(37, 211, 102, 0.04);

    box-shadow:
        0 12px 28px
        rgba(37, 211, 102, 0.08);
}


.contact-social-whatsapp:hover
.contact-social-icon {

    color: #ffffff;

    background-color: #25d366;
}


/* EMAIL */

.contact-social-email:hover {
    color: #ea4335;

    border-color:
        rgba(234, 67, 53, 0.25);

    background-color:
        rgba(234, 67, 53, 0.035);

    box-shadow:
        0 12px 28px
        rgba(234, 67, 53, 0.07);
}


.contact-social-email:hover
.contact-social-icon {

    color: #ffffff;

    background-color: #ea4335;
}


/* LINKEDIN */

.contact-social-linkedin:hover {
    color: #0a66c2;

    border-color:
        rgba(10, 102, 194, 0.25);

    background-color:
        rgba(10, 102, 194, 0.035);

    box-shadow:
        0 12px 28px
        rgba(10, 102, 194, 0.08);
}


.contact-social-linkedin:hover
.contact-social-icon {

    color: #ffffff;

    background-color: #0a66c2;
}


/* =========================================================
   HOVER LIFT
========================================================= */

.contact-social-link:hover {
    transform:
        translateY(-2px);
}


/* =========================================================
   ICON SHAKE
   seperti getaran bell
========================================================= */

.contact-social-link:hover
.contact-social-icon {

    animation:
        contactIconShake
        0.55s
        ease;
}


@keyframes contactIconShake {

    0% {
        transform:
            rotate(0deg);
    }

    15% {
        transform:
            rotate(-10deg)
            scale(1.05);
    }

    30% {
        transform:
            rotate(9deg)
            scale(1.05);
    }

    45% {
        transform:
            rotate(-7deg)
            scale(1.05);
    }

    60% {
        transform:
            rotate(5deg)
            scale(1.05);
    }

    75% {
        transform:
            rotate(-3deg);
    }

    100% {
        transform:
            rotate(0deg);
    }

}


/* =========================================================
   COMMENT AREA WITHOUT HEADING
========================================================= */

.contact-guestbook
.guestbook-v2-community {

    margin-top: 34px;

    width: 100%;

    min-width: 0;
}


/* =========================================================
   COMMENT SLIDER
========================================================= */

.contact-guestbook
.guestbook-v2-grid {

    width: 100%;

    display: flex;

    gap: 12px;

    overflow-x: auto;
    overflow-y: hidden;

    padding:
        3px 2px
        8px;

    scroll-snap-type:
        x mandatory;

    scroll-behavior:
        smooth;

    overscroll-behavior-x:
        contain;

    scrollbar-width:
        none;

    -webkit-overflow-scrolling:
        touch;

    cursor: grab;
}


.contact-guestbook
.guestbook-v2-grid::-webkit-scrollbar {

    display: none;
}


.contact-guestbook
.guestbook-v2-grid:active {

    cursor: grabbing;
}


/* =========================================================
   COMMENT CARDS
========================================================= */

.contact-guestbook
.guestbook-v2-comment {

    flex:
        0 0
        calc(
            (100% - 12px) / 2
        );

    scroll-snap-align:
        start;
}


/* =========================================================
   SLIDER DOT / NAVBAR
========================================================= */

.guestbook-slider-dots {

    min-height: 18px;

    display: flex;

    justify-content: center;
    align-items: center;

    flex-wrap: wrap;

    gap: 7px;

    margin-top: 16px;
}


/* inactive */

.guestbook-slider-dot {

    width: 7px;
    height: 7px;

    padding: 0;

    border: none;

    border-radius: 999px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.3s ease,
        background-color 0.3s ease,
        transform 0.3s ease;
}


/* hover */

.guestbook-slider-dot:hover {

    transform:
        scale(1.25);

    background-color: #2997ff;
}


/* active becomes small rectangle */

.guestbook-slider-dot.is-active {

    width: 24px;

    background-color: #0071e3;
}


/* =========================================================
   MOBILE
========================================================= */

@media (max-width: 650px) {

    .contact-social-link {
        min-height: 62px;

        padding:
            11px 13px;
    }


    .contact-social-icon {
        width: 34px;
        height: 34px;
    }


    .contact-social-name {
        font-size: 12px;
    }


    /*
        Satu komentar hampir penuh.
        Comment berikutnya sedikit terlihat.
    */

    .contact-guestbook
    .guestbook-v2-comment {

        flex:
            0 0
            88%;
    }


    .guestbook-slider-dots {

        margin-top: 13px;
    }

}


/* =========================================================
   TOUCH DEVICES

   Jangan paksa animasi hover/getar
========================================================= */

@media (hover: none) {

    .contact-social-link:hover
    .contact-social-icon {

        animation: none;
    }

}


/* =========================================================
   SERTIFIKAT SECTION

   Carousel 3D berputar seperti globe + kartu flip.

   GEOMETRI
   Semua kartu duduk di satu lingkaran mengelilingi poros
   vertikal. Yang diputar adalah WADAHNYA (.cert-ring), bukan
   kartunya satu per satu:

       .cert-ring : translateZ(-radius) rotateY(sudut)
       .cert-slot : rotateY(i * step) translateZ(radius)

   LAPISAN TRANSFORM (jangan digabung)
   Rotasi posisi globe dan rotasi flip tidak boleh berada di
   elemen yang sama:

       .cert-slot : HANYA posisi lingkaran
       .cert-flip : HANYA rotateY(0deg / 180deg)
       .cert-face : backface-visibility: hidden,
                    sisi belakang rotateY(180deg) sejak awal

   RESPONSIF
   Radius, lebar/tinggi kartu, dan perspective semuanya
   custom property di .certificates-section, sehingga tiap
   breakpoint tinggal menimpanya. js/certificates.js MEMBACA
   --cert-radius lewat getComputedStyle (tidak hardcode).

   TINGGI KARTU TETAP, TIDAK LAGI MENYESUAIKAN ISI
   --cert-h-base adalah tinggi kartu yang SEBENARNYA dipakai —
   bukan lagi tinggi minimum yang dinaikkan JS mengikuti sisi
   belakang terpanjang. Pendekatan lama itu membuat satu
   deskripsi yang jauh lebih panjang dari yang lain menaikkan
   --cert-h untuk SELURUH kartu di globe (geometrinya menuntut
   kartu seragam), dan di HP yang sempit itu bisa meledak jauh
   melewati lebar kartu — globe berubah jadi susunan persegi
   panjang menjulang, bukan kartu.

   Sekarang batas atasnya dijaga dari SISI SEBALIKNYA: setiap
   breakpoint punya tinggi tetap yang sudah diukur cukup untuk
   kombinasi terpanjang yang Admin CMS masih izinkan — judul,
   penerbit sisi belakang, badge, dan deskripsi masing-masing
   dibatasi jumlah katanya di admin/js/modules/certificates/
   editor-view.js (lihat WORD_LIMITS di sana). Selama Admin
   menegakkan batas itu, kartu tidak akan pernah butuh mengukur
   ulang atau men-scroll. .cert-back-desc tetap punya line-clamp
   sebagai jaring pengaman terakhir untuk data lama yang ditulis
   sebelum batas kata ini ada.
========================================================= */

.certificates-section {

    /* ---- PALET ----

       --cert-accent adalah biru aksen portofolio untuk permukaan
       GELAP (#2997ff) — biru yang sama yang sudah dipakai footer,
       nomor kategori tech stack, dan eyebrow section. Bukan biru
       baru. #0071e3 tetap dipakai untuk kontrol di atas latar
       terang (label section, titik aktif, cincin fokus tombol),
       jadi dua-duanya tetap pada perannya masing-masing. */
    --cert-accent: #2997ff;
    --cert-card-bg: #131313;
    --cert-card-border: rgba(255, 255, 255, 0.07);

    /* =========================================
       UKURAN KARTU SERTIFIKAT — ATUR DI SINI

       Ini satu-satunya tempat yang mengatur besar kartu.
       Tidak ada fungsi JavaScript yang perlu disentuh:
       js/certificates.js hanya MEMBACA --cert-radius
       (lewat getComputedStyle) untuk mengubah jarak geser
       jari jadi derajat.

         --cert-w           lebar kartu
         --cert-h-base      tinggi kartu — TETAP, lihat catatan
                            "TINGGI KARTU TETAP" di atas
         --cert-radius      jari-jari lingkaran = rapat /
                            renggangnya jarak antar kartu
         --cert-perspective kedalaman efek 3D

       ATURAN MEMPERBESAR:
       kalikan KEEMPATNYA dengan angka yang sama. Proyeksi 3D
       bersifat sebanding, jadi hasilnya tata letak yang
       persis sama — hanya lebih besar. Kalau hanya --cert-w
       yang dinaikkan, kartu akan saling mepet karena radius
       lingkarannya tidak ikut melebar.

       Tablet dan desktop memakai rasio asli 1 : 1.38 (365/264 dan
       428/310) — dua breakpoint itu tidak pernah bermasalah dan
       ruangnya sudah lebih dari cukup untuk batas kata di Admin.
       Mobile sedikit lebih tinggi, 1 : 1.55 (310/200), karena di
       lebar 200px teks yang sama membungkus jadi lebih banyak
       baris; jarak internalnya ikut dirapatkan di blok media query
       mobile supaya angkanya tidak perlu lebih besar dari itu.
    ========================================= */

    --cert-w: 310px;
    --cert-h-base: 428px;
    --cert-h: var(--cert-h-base);
    --cert-radius: 273px;
    --cert-perspective: 1740px;

    /* ---- TIMING ---- */
    --cert-spin: 0.75s cubic-bezier(0.22, 0.61, 0.36, 1);
    --cert-flip-dur: 0.6s cubic-bezier(0.4, 0, 0.2, 1);

    width: 100%;

    padding: 100px 0;

    background-color: #f5f5f7;
}


/* =========================================
   CONTAINER
========================================= */

.certificates-container {
    width: var(--page-width);
    max-width: var(--page-max-width);

    margin: 0 auto;
}


/* =========================================
   HEADING
========================================= */

.certificates-heading {
    max-width: 700px;

    margin: 0 auto 20px;

    text-align: center;
}


/* LABEL */
.certificates-label {
    margin: 0 0 10px;

    font-size: 14px;

    font-weight: 700;

    letter-spacing: 2px;

    color: #0071e3;
}


/* TITLE */
.certificates-heading h2 {
    margin: 0 0 15px;

    font-size: 42px;

    font-weight: 700;

    line-height: 1.2;

    color: #1d1d1f;
}


/* DESCRIPTION */
.certificates-description {
    margin: 0;

    font-size: 16px;

    line-height: 1.7;

    color: #6e6e73;
}


/* HINT */
.certificates-hint {
    margin: 0 0 45px;

    font-size: 12px;

    font-weight: 600;

    letter-spacing: 2.5px;

    text-transform: uppercase;
    text-align: center;

    color: #86868b;
}


/* =========================================
   CAROUSEL
========================================= */

.certificates-carousel {
    width: 100%;
    max-width: 900px;

    margin: 0 auto;
}


/* ---- STAGE: pemegang perspective ----
   touch-action: pan-y — geser horizontal memutar carousel,
   tapi scroll vertikal halaman tetap jalan. */

.cert-stage {
    position: relative;

    width: 100%;

    /* Ikut tinggi kartu, bukan angka mati. Sisa ruangnya
       cukup untuk outline fokus; tidak perlu lebih karena
       kartu sudah tidak berbayang. */
    height: calc(var(--cert-h) + 48px);

    perspective: var(--cert-perspective);

    overflow: hidden;

    touch-action: pan-y;

    -webkit-user-select: none;
    user-select: none;

    cursor: grab;
}


.cert-stage:active {
    cursor: grabbing;
}


/* ---- RING: elemen yang diputar ----
   Transform-nya ditulis ulang oleh JS (sudutnya saja);
   radius tetap dibaca dari var di sini. */

.cert-ring {
    position: absolute;
    top: 50%;
    left: 50%;

    width: var(--cert-w);
    height: var(--cert-h);

    margin-top: calc(var(--cert-h) / -2);
    margin-left: calc(var(--cert-w) / -2);

    transform-style: preserve-3d;

    transform:
        translateZ(calc(-1 * var(--cert-radius)))
        rotateY(0deg);

    transition:
        transform var(--cert-spin);

    will-change: transform;
}


/* ---- SLOT: posisi kartu di lingkaran ----
   Transform-nya di-set sekali oleh JS dan tidak pernah
   berubah lagi (menyebut var(--cert-radius), jadi otomatis
   ikut breakpoint).

   SLOT SENGAJA TIDAK PUNYA OPACITY.

   Menurut CSS Transforms Level 2, properti "grouping" —
   opacity < 1, filter, clip-path, mask — memaksa nilai terpakai
   transform-style menjadi flat. Dulu JS menulis opacity pecahan
   langsung ke elemen ini, jadi setiap kartu yang sedang meredup
   kehilangan preserve-3d-nya: .cert-flip dan kedua .cert-face
   gepeng ke satu bidang, dan backface-visibility berhenti
   memotong muka yang membelakangi kita. Hasilnya kartu belakang
   ikut tergambar dan menumpuk. Blink lebih longgar soal ini
   daripada WebKit — itulah kenapa emulasi DevTools terlihat
   sehat sementara HP asli tidak.

   Peredupan sekarang dipasang di .cert-face (daun, tidak
   menurunkan konteks 3D ke siapa pun). Lihat blok KARTU. */

.cert-slot {
    position: absolute;
    inset: 0;

    transform-style: preserve-3d;

    cursor: pointer;
}


/* Saat di-drag, rotasi dan peredupan harus mengikuti jari tanpa
   jeda. .cert-face ikut di sini karena opacity/visibility-nya
   yang sekarang bertransisi, bukan slot-nya. */
.certificates-carousel.is-dragging .cert-ring,
.certificates-carousel.is-dragging .cert-face {
    transition: none;
}


.cert-slot:focus {
    outline: none;
}


/* Outline dipasang di .cert-face, bukan di .cert-slot —
   .cert-slot ada di dalam rantai 3D dan kotaknya tidak
   selalu sejajar dengan kartu yang terlihat. */
.cert-slot:focus-visible .cert-face {
    outline: 2px solid var(--cert-accent);

    outline-offset: 3px;
}


/* ---- FLIP: hanya rotateY(0/180deg) ---- */

.cert-flip {
    position: relative;

    width: 100%;
    height: 100%;

    transform-style: preserve-3d;

    transform: rotateY(0deg);

    transition:
        transform var(--cert-flip-dur);
}


.cert-slot.is-flipped .cert-flip {
    transform: rotateY(180deg);
}

/* Kartu yang sudah lewat 90 derajat menampilkan sisi belakangnya, dan
   isinya terbaca terbalik. Ini hanya muncul kalau kartunya sedikit:
   dengan 3 kartu, tetangganya persis di 120 derajat.

   Yang disembunyikan hanya isinya. Permukaan kartunya tetap tergambar,
   jadi komposisi globe-nya utuh: kartu samping masih terlihat sebagai
   bidang gelap, hanya tanpa teks cermin. Kelasnya dipasang oleh JS di
   render(); saat kartu depan dibalik, |rel| mendekati 0 sehingga aturan
   ini tidak aktif. */

.cert-slot.is-reversed .cert-back-inner {
    visibility: hidden;
}


/* =========================================
   KARTU — SISI DEPAN & BELAKANG
========================================= */

.cert-face {
    position: absolute;
    inset: 0;

    display: flex;

    border-radius: 22px;

    background-color: var(--cert-card-bg);

    border: 1px solid var(--cert-card-border);

    /* Tanpa box-shadow — kartu gelap sudah cukup kontras di
       atas background terang, dan bayangannya bikin kartu
       samping terlihat "mengambang". */

    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;

    overflow: hidden;

    /* Peredupan kartu hidup DI SINI, bukan di .cert-slot —
       lihat catatan panjang di blok SLOT. Muka kartu adalah
       daun: tidak ada transform 3D di bawahnya, jadi opacity di
       sini tidak bisa menggepengkan konteks 3D milik siapa pun.
       JS menulis nilai yang sama ke kedua muka satu kartu.

       visibility ikut bertransisi dengan sengaja. Sesuai spesifikasi
       visibility di-interpolasi sebagai langkah diskret yang tetap
       "visible" selama transisi berjalan, jadi:
         - menuju hidden : kartu tetap tergambar sampai fade
                           selesai, baru benar-benar hilang;
         - menuju visible: langsung tampak di frame pertama,
                           sebelum ia perlu terlihat.
       Efeknya kartu yang sudah 0 opacity berhenti jadi lapisan
       yang masih dicat compositor, tanpa mengubah animasinya. */

    transition:
        opacity var(--cert-spin),
        visibility var(--cert-spin);
}


.cert-face-front {
    flex-direction: column;

    justify-content: space-between;

    padding: 36px 26px 28px;
}


/* Sisi belakang diputar sejak awal — .cert-flip yang
   membalikkannya kembali menghadap kita. */
.cert-face-back {
    transform: rotateY(180deg);

    padding: 28px 24px;
}


/* ---- GARIS AKSEN ---- */

.cert-face-front::before {
    content: "";

    position: absolute;
    top: 0;
    left: 50%;

    width: 54px;
    height: 4px;

    margin-left: -27px;

    border-radius: 0 0 3px 3px;

    background-color: var(--cert-accent);
}


/* ---- IKON ---- */

.cert-icon {
    font-size: 46px;

    line-height: 1;

    color: var(--cert-accent);
}


/* ---- TEKS SISI DEPAN ---- */

.cert-front-text {
    display: flex;

    flex-direction: column;

    gap: 7px;
}


.cert-year {
    margin: 0;

    font-size: 13px;

    font-weight: 600;

    letter-spacing: 1.6px;

    text-transform: uppercase;

    color: var(--cert-accent);
}


.cert-title {
    margin: 0;

    font-size: 20px;

    font-weight: 500;

    line-height: 1.35;

    color: #ffffff;
}


.cert-publisher {
    margin: 0;

    font-size: 12px;

    font-weight: 500;

    letter-spacing: 1.2px;

    text-transform: uppercase;

    color: rgba(255, 255, 255, 0.45);
}


/* ---- TEKS SISI BELAKANG ---- */

.cert-back-inner {
    display: flex;

    flex-direction: column;

    align-items: flex-start;

    gap: 10px;

    width: 100%;
}


.cert-back-title {
    margin: 0;

    font-size: 20px;

    font-weight: 600;

    line-height: 1.35;

    color: #ffffff;
}


.cert-back-subtitle {
    margin: 0;

    font-size: 12px;

    font-weight: 600;

    letter-spacing: 1.2px;

    text-transform: uppercase;

    color: rgba(255, 255, 255, 0.42);
}


/* Pill isian tipis, bukan blok biru solid.

   Biru solid + teks putih hanya mencapai rasio kontras ~2.6:1 —
   di bawah AA untuk teks 12px (versi merah sebelumnya juga
   ~3.1:1, sama-sama kurang). Dengan latar transparan dan teks
   #2997ff di atas kartu #131313 rasionya ~6.5:1, lolos AA, dan
   secara visual lebih tenang di kartu gelap. */

.cert-badge {
    display: inline-block;

    padding: 6px 14px;

    border-radius: 20px;

    background-color: rgba(41, 151, 255, 0.14);

    border: 1px solid rgba(41, 151, 255, 0.35);

    font-size: 12px;

    font-weight: 600;

    letter-spacing: 0.4px;

    color: var(--cert-accent);
}


.cert-back-desc {
    margin: 0;

    font-size: 15px;

    line-height: 1.55;

    color: rgba(255, 255, 255, 0.62);

    /* Jaring pengaman, bukan jalan utama: Admin CMS membatasi
       deskripsi ke WORD_LIMITS.description kata (lihat
       admin/js/modules/certificates/editor-view.js), yang sudah
       diukur muat di --cert-h-base setiap breakpoint. Baris ini
       hanya menjaga entri LAMA yang ditulis sebelum batas kata
       itu ada — dipotong rapi dengan "…", bukan meluber diam-diam
       atau butuh scroll di dalam kartu. */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 7;
    line-clamp: 7;
    overflow: hidden;
}


/* ---- TOMBOL LIHAT SERTIFIKAT ----
   Selalu dirender. Selama `link` di data masih kosong,
   tombolnya dapat kelas .is-empty (lihat js/certificates.js)
   dan tampil sebagai placeholder — begitu URL-nya diisi,
   otomatis jadi tombol aktif tanpa ubah CSS. */

.cert-link {
    margin-top: 2px;

    display: inline-flex;

    align-items: center;

    gap: 7px;

    padding: 10px 18px;

    border: 1px solid rgba(255, 255, 255, 0.22);

    border-radius: 20px;

    font-size: 12px;

    font-weight: 600;

    letter-spacing: 1.2px;

    color: #ffffff;

    text-decoration: none;

    -webkit-user-drag: none;

    transition:
        background-color 0.25s ease,
        border-color 0.25s ease;
}


.cert-link:hover {
    background-color: var(--cert-accent);

    border-color: var(--cert-accent);
}


.cert-link-icon {
    font-size: 16px;

    line-height: 1;
}


/* ---- PLACEHOLDER: link belum diisi ----
   Garis putus-putus + warna redup supaya jelas tombolnya
   belum tersambung, bukan tombol rusak. pointer-events: none
   membuat klik tembus ke kartu, jadi kartu tetap bisa
   dibalik kembali walau tombol ini yang tersentuh. */

.cert-link.is-empty {
    border-style: dashed;

    border-color: rgba(255, 255, 255, 0.16);

    color: rgba(255, 255, 255, 0.32);

    cursor: default;

    pointer-events: none;
}


.cert-link.is-empty .cert-link-icon {
    opacity: 0.55;
}


/* =========================================
   KONTROL — PANAH & TITIK
========================================= */

.cert-controls {
    display: flex;

    align-items: center;

    justify-content: center;

    gap: 18px;

    margin-top: 34px;
}


.cert-nav {
    width: 44px;
    height: 44px;

    display: inline-flex;

    align-items: center;

    justify-content: center;

    flex-shrink: 0;

    padding: 0;

    border: 1px solid #d2d2d7;

    border-radius: 50%;

    background-color: #ffffff;

    font-size: 20px;

    color: #1d1d1f;

    cursor: pointer;

    transition:
        background-color 0.25s ease,
        border-color 0.25s ease,
        color 0.25s ease;
}


.cert-nav:hover {
    background-color: #1d1d1f;

    border-color: #1d1d1f;

    color: #ffffff;
}


.cert-nav:focus-visible {
    outline: 2px solid #0071e3;

    outline-offset: 3px;
}


.cert-dots {
    display: flex;

    align-items: center;

    gap: 6px;
}


.cert-dot {
    width: 7px;
    height: 7px;

    flex-shrink: 0;

    padding: 0;

    border: 0;

    border-radius: 20px;

    background-color: #d2d2d7;

    cursor: pointer;

    transition:
        width 0.3s ease,
        background-color 0.3s ease;
}


.cert-dot.is-active {
    width: 24px;

    background-color: #0071e3;
}


.cert-dot:focus-visible {
    outline: 2px solid #0071e3;

    outline-offset: 3px;
}


/* =========================================
   TABLET — 641px s/d 1024px
========================================= */

@media (max-width: 1024px) {

    /* Keempatnya diskalakan bersama dari nilai desktop
       (×0.85) — lihat "ATURAN MEMPERBESAR" di atas. */
    .certificates-section {
        --cert-w: 264px;
        --cert-h-base: 365px;
        --cert-radius: 234px;
        --cert-perspective: 1920px;
    }


    .certificates-heading h2 {
        font-size: 34px;
    }


    .cert-face-front {
        padding: 32px 23px 25px;
    }


    .cert-face-back {
        padding: 26px 20px;
    }


    .cert-icon {
        font-size: 40px;
    }


    .cert-title,
    .cert-back-title {
        font-size: 18px;
    }


    .cert-back-desc {
        font-size: 14px;
        -webkit-line-clamp: 6;
        line-clamp: 6;
    }

}


/* =========================================
   MOBILE — 640px ke bawah

   Efek 3D disederhanakan: perspective jauh lebih besar
   sehingga kartu samping tidak terlihat ekstrem di layar
   sempit, dan radius dipendekkan agar kartu tidak keluar
   dari stage.
========================================= */

@media (max-width: 640px) {

    /* Mobile diskalakan lebih konservatif (×1.11 dari nilai
       sebelumnya, bukan ×1.24 seperti desktop): lebar layar
       membatasi rentang lingkaran — kalau lebih besar lagi,
       kartu samping mulai tersentuh tepi layar di HP 360px. */
    .certificates-section {
        --cert-w: 200px;
        --cert-h-base: 310px;
        --cert-radius: 175px;
        --cert-perspective: 2660px;

        padding: 70px 0;

        /* Stage di-full-bleed di bawah. Ini menahan sisa lebar
           scrollbar supaya halaman tidak bisa digeser ke
           samping. `clip` lebih aman dari `hidden` (tidak
           membuat scroll container baru); browser lama jatuh
           ke `hidden`. */
        overflow-x: hidden;
        overflow-x: clip;
    }


    .certificates-heading h2 {
        font-size: 28px;
    }


    .certificates-description {
        font-size: 15px;
    }


    .certificates-hint {
        margin-bottom: 35px;

        font-size: 11px;

        letter-spacing: 2px;
    }


    .cert-stage {
        height: calc(var(--cert-h) + 36px);

        /* Lingkaran kartu lebih lebar dari gutter container di
           layar sempit. Tanpa ini, kartu samping terpotong
           membelah di tengah — bukan mengecil ke tepi layar. */
        width: 100vw;
        max-width: 100vw;

        margin-left: calc(50% - 50vw);
        margin-right: calc(50% - 50vw);
    }


    .cert-face {
        border-radius: 18px;
    }


    /*
      Jarak internal dirapatkan KHUSUS di sini.

      Kartu mobile hanya 200px lebar, jadi teks yang sama membungkus
      jadi jauh lebih banyak baris daripada di tablet/desktop —
      breakpoint inilah satu-satunya yang tingginya pernah bermasalah.
      Padding, gap antar blok, line-height, dan tombol dipadatkan
      secukupnya supaya kombinasi terpanjang yang masih diizinkan
      Admin CMS (WORD_LIMITS) muat di --cert-h-base 310px — kartu
      tetap terbaca nyaman, tapi proporsinya kembali seperti kartu,
      bukan persegi panjang menjulang.
    */

    .cert-face-front {
        padding: 22px 16px 18px;
    }


    .cert-face-back {
        padding: 18px 16px;
    }


    .cert-back-inner {
        gap: 7px;
    }


    .cert-icon {
        font-size: 33px;
    }


    .cert-year {
        font-size: 11px;
    }


    .cert-title,
    .cert-back-title {
        font-size: 15.5px;
        line-height: 1.28;
    }


    .cert-publisher,
    .cert-back-subtitle {
        font-size: 10px;
    }


    .cert-back-desc {
        font-size: 12.5px;
        line-height: 1.45;
        -webkit-line-clamp: 5;
        line-clamp: 5;
    }


    .cert-badge,
    .cert-link {
        font-size: 11px;
    }


    .cert-badge {
        padding: 4px 11px;
    }


    .cert-link {
        padding: 8px 14px;
    }


    .cert-controls {
        gap: 14px;

        margin-top: 28px;
    }


    .cert-nav {
        width: 40px;
        height: 40px;

        font-size: 18px;
    }

}


/* =========================================
   REDUCED MOTION

   Rotasi globe jadi instan, flip jadi fade. Karena kartu
   tidak lagi diputar, backface-visibility dimatikan dan
   sisi belakang berhenti memakai rotateY(180deg) —
   pergantian sisi murni lewat opacity.
========================================= */

@media (prefers-reduced-motion: reduce) {

    .cert-ring {
        transition: none;
    }


    .cert-slot {
        transition:
            opacity 0.2s linear;
    }


    .cert-flip,
    .cert-slot.is-flipped .cert-flip {
        transform: none;

        transition: none;
    }


    .cert-face {
        -webkit-backface-visibility: visible;
        backface-visibility: visible;

        transition:
            opacity 0.2s linear;
    }


    .cert-face-back {
        transform: none;

        opacity: 0;

        pointer-events: none;
    }


    .cert-slot.is-flipped .cert-face-front {
        opacity: 0;
    }


    .cert-slot.is-flipped .cert-face-back {
        opacity: 1;

        pointer-events: auto;
    }

}


/* =========================================================
   REDUCED MOTION
========================================================= */


@media (prefers-reduced-motion: reduce) {

    .contact-social-link:hover
    .contact-social-icon {

        animation: none;
    }

}

/* =========================================
   TECH STACK — CMS ICON SIZING

   The CMS renders the same tile as the static
   V1 markup — icon + name — so nothing here
   changes layout, spacing or backgrounds. The
   one difference is the icon element: static
   tiles use an icon font (.tech-item > i), CMS
   tiles use an <img>, which needs its own box.

   No background, border or card is drawn. The
   icon sits directly on the Tech Stack surface
   and whatever transparency the source artwork
   has is preserved, including its own colours.
========================================= */

/*
   A fixed box with contain: every logo occupies
   the same 33px footprint as the icon font it
   replaces, and a non-square logo is letterboxed
   inside it rather than stretched to fill it.
*/

.tech-item-cms .tech-icon-img {
    width: 33px;
    height: 33px;

    max-width: 100%;
    max-height: 100%;

    object-fit: contain;

    flex-shrink: 0;

    display: block;

    background: none;

    transition:
        transform 0.35s
        cubic-bezier(
            0.22,
            1,
            0.36,
            1
        );
}


/* Same lift the static icons already use. */

.tech-item-cms:hover .tech-icon-img {
    transform:
        scale(1.12)
        rotate(-3deg);
}


/* =========================================
   MOBILE

   Matches the 28px the static .tech-item > i
   drops to at this width, so a mixed list
   stays even.
========================================= */

@media (max-width: 650px) {

    .tech-item-cms .tech-icon-img {
        width: 28px;
        height: 28px;
    }

}


@media (prefers-reduced-motion: reduce) {

    .tech-item-cms .tech-icon-img {
        transition: none !important;
    }

}

/* =========================================================
   INITIAL LOADER

   Overlay positioning lives inline in index.html so the first
   paint already shows it. Everything below is the animation and
   the exit, which are not needed until slightly later.

   The bar animation is the supplied l8 loader, recoloured only
   where it meets this site: the blocks use the portfolio ink
   (#1d1d1f) instead of pure black, and the travelling marker
   uses the dark-surface accent #2997ff already used elsewhere.

   UKURAN
   Dinaikkan dari 17px agar loader terbaca sebagai elemen utama di
   layar penuh. Semua nilai turunannya diskalakan dengan rasio yang
   sama seperti versi aslinya, sehingga karakter animasinya persis:

       jarak jatuh    ~1.68 x tinggi baris   -> --drop
       border-bottom  ~0.42 x tinggi baris
       clip-path      ~0.84 x tinggi baris

   --drop dipakai di dalam @keyframes milik loader ini saja, jadi
   satu breakpoint cukup mengganti variabelnya tanpa menyalin ulang
   seluruh keyframes.
========================================================= */

.loader {
    width: fit-content;

    --drop: 66px;

    font-size: 28px;
    font-family: monospace;
    line-height: 1.4;
    font-weight: bold;

    --c: no-repeat linear-gradient(#1d1d1f 0 0);

    background:
        var(--c), var(--c), var(--c), var(--c),
        var(--c), var(--c), var(--c);
    background-size: calc(1ch + 1px) 100%;

    border-bottom: 16px solid #0000;

    position: relative;

    animation: l8-0 3s infinite linear;

    clip-path: inset(-33px 0);
}

.loader::before {
    content: "Loading";
}

.loader::after {
    content: "";

    position: absolute;

    width: 14px;
    height: 20px;

    background: #2997ff;

    left: -14px;
    bottom: 100%;

    animation: l8-1 3s infinite linear;
}

@keyframes l8-0 {
    0%, 12.5% { background-position: calc(0*100%/6) 0,calc(1*100%/6) 0,calc(2*100%/6) 0,calc(3*100%/6) 0,calc(4*100%/6) 0,calc(5*100%/6) 0,calc(6*100%/6) 0; }
    25%       { background-position: calc(0*100%/6) var(--drop),calc(1*100%/6) 0,calc(2*100%/6) 0,calc(3*100%/6) 0,calc(4*100%/6) 0,calc(5*100%/6) 0,calc(6*100%/6) 0; }
    37.5%     { background-position: calc(0*100%/6) var(--drop),calc(1*100%/6) var(--drop),calc(2*100%/6) 0,calc(3*100%/6) 0,calc(4*100%/6) 0,calc(5*100%/6) 0,calc(6*100%/6) 0; }
    50%       { background-position: calc(0*100%/6) var(--drop),calc(1*100%/6) var(--drop),calc(2*100%/6) var(--drop),calc(3*100%/6) 0,calc(4*100%/6) 0,calc(5*100%/6) 0,calc(6*100%/6) 0; }
    62.5%     { background-position: calc(0*100%/6) var(--drop),calc(1*100%/6) var(--drop),calc(2*100%/6) var(--drop),calc(3*100%/6) var(--drop),calc(4*100%/6) 0,calc(5*100%/6) 0,calc(6*100%/6) 0; }
    75%       { background-position: calc(0*100%/6) var(--drop),calc(1*100%/6) var(--drop),calc(2*100%/6) var(--drop),calc(3*100%/6) var(--drop),calc(4*100%/6) var(--drop),calc(5*100%/6) 0,calc(6*100%/6) 0; }
    87.4%     { background-position: calc(0*100%/6) var(--drop),calc(1*100%/6) var(--drop),calc(2*100%/6) var(--drop),calc(3*100%/6) var(--drop),calc(4*100%/6) var(--drop),calc(5*100%/6) var(--drop),calc(6*100%/6) 0; }
    100%      { background-position: calc(0*100%/6) var(--drop),calc(1*100%/6) var(--drop),calc(2*100%/6) var(--drop),calc(3*100%/6) var(--drop),calc(4*100%/6) var(--drop),calc(5*100%/6) var(--drop),calc(6*100%/6) var(--drop); }
}

@keyframes l8-1 {
    100% { left: 115%; }
}


/* ---- EXIT ----
   Fades the bars a little first, then lifts the whole sheet away.
   pointer-events is dropped by JS the moment this class lands, so
   the page is clickable before the animation finishes. */

#initial-loader {
    transition:
        opacity 0.45s ease,
        transform 0.55s cubic-bezier(0.22, 1, 0.36, 1);
}

#initial-loader.is-leaving {
    opacity: 0;
    transform: translateY(-24px);
}

#initial-loader.is-leaving .loader {
    opacity: 0.45;
    transition: opacity 0.2s ease;
}


/* Screen-reader label. The bars themselves are aria-hidden, so this
   is what "Loading portfolio" is announced from. */

.visually-hidden-loader {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}


/* Layar sempit: skalanya diturunkan sedikit, dan semua nilai
   turunannya ikut agar proporsinya tetap sama. */

@media (max-width: 430px) {

    .loader {
        --drop: 56px;

        font-size: 24px;

        border-bottom: 14px solid #0000;

        clip-path: inset(-28px 0);
    }

    .loader::after {
        width: 12px;
        height: 17px;

        left: -12px;
    }

}


/* Gerak minimal: tidak ada bar berjalan dan tidak ada sapuan
   penanda. Overlay-nya tetap ada dan tetap hilang dengan fade,
   jadi fungsinya utuh, hanya tanpa animasi berulang. */

@media (prefers-reduced-motion: reduce) {

    .loader,
    .loader::after {
        animation: none;
    }

    .loader::after {
        left: 0;
        bottom: calc(100% + 4px);
    }

    #initial-loader {
        transition: opacity 0.3s ease;
    }

    #initial-loader.is-leaving {
        transform: none;
    }

}
