@import url('/assets/css/theme-forgejo-dark.css'); @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Major+Mono+Display&display=swap'); @font-face { font-family: "Inter"; font-style: normal; font-weight: 100 900; font-display: swap; src: url("/assets/font/inter-var.woff2") format("woff2-variations"), url("/assets/font/inter-var.woff2") format("woff2"); } /* Site-wide font override — JetBrains Mono everywhere */ :root { --fonts-proportional: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace; --fonts-monospace: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace; } html, body, .ui, .ui.menu, .ui.menu .item, .ui.button, .ui.input input, .ui.dropdown, .ui.dropdown .menu > .item, input, textarea, select, button { font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace !important; } :root { /* FlexHub Main — magenta -> blue gradient on black */ /* Primary = periwinkle blue-violet signal */ --color-primary: #5b6cff; --color-primary-contrast: #ffffff; --color-primary-dark-1: #4f5ef3; --color-primary-dark-2: #3d4fe1; --color-primary-dark-3: #2b40c9; --color-primary-dark-4: #2031af; --color-primary-dark-5: #182694; --color-primary-dark-6: #111c78; --color-primary-dark-7: #0c145d; --color-primary-light-1: #7886ff; --color-primary-light-2: #99a3ff; --color-primary-light-3: #b8beff; --color-primary-light-4: #d2d6ff; --color-primary-light-5: #e0e3ff; --color-primary-light-6: #ebedff; --color-primary-light-7: #f5f6ff; --color-primary-alpha-10: #5b6cff1a; --color-primary-alpha-20: #5b6cff33; --color-primary-alpha-30: #5b6cff4d; --color-primary-alpha-40: #5b6cff66; --color-primary-alpha-50: #5b6cff80; --color-primary-alpha-60: #5b6cff99; --color-primary-alpha-70: #5b6cffb3; --color-primary-alpha-80: #5b6cffcc; --color-primary-alpha-90: #5b6cffe6; --color-primary-hover: var(--color-primary-light-1); --color-primary-active: var(--color-primary-dark-1); /* Accent gradient stops */ --fh-grad-from: #d423ff; --fh-grad-mid: #6a3aff; --fh-grad-to: #22b8ff; --fh-grad: linear-gradient(90deg, var(--fh-grad-from) 0%, var(--fh-grad-mid) 50%, var(--fh-grad-to) 100%); /* Surfaces — pure black base */ --color-body: #000000; --color-box-header: #0a0a0a; --color-box-body: #060606; --color-box-body-highlight: #101010; --color-card: #0a0a0a; --color-menu: #060606; --color-header-wrapper: #000000; --color-nav-bg: #000000; --color-secondary-nav-bg: var(--color-body); --color-footer: #000000; --color-button: #1a1a1a; --color-secondary-bg: #1a1a1a; --color-secondary: #1a1a1a; --color-secondary-dark-1: #222222; --color-secondary-dark-2: #2a2a2a; } /* FlexHub homepage hero — L1 layout (4-in-row) */ .flexhub-home { padding: 5rem 1rem 3rem; text-align: center; } .flexhub-home .flexhub-text-wordmark { display: block; width: min(640px, 80vw); aspect-ratio: 1400 / 310; margin: 0 auto 1.5rem; background: url('/assets/img/flexhub-main-home-wordmark.png') center/contain no-repeat; /* hide any text children inherited from template */ font-size: 0; line-height: 0; color: transparent; } .flexhub-home .flexhub-text-wordmark .fh-flex, .flexhub-home .flexhub-text-wordmark::after { display: none !important; content: none !important; } .flexhub-home .tagline { font-size: clamp(1.1rem, 2vw, 1.4rem); color: var(--color-text-light); margin: 0 0 0.4rem; font-weight: 400; } .flexhub-home .subtagline { font-size: 1rem; color: var(--color-text-light-2); margin: 0 0 3rem; font-style: italic; background: var(--fh-grad); -webkit-background-clip: text; background-clip: text; color: transparent; display: inline-block; } .flexhub-home .agent-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1.25rem; max-width: 1200px; margin: 0 auto; padding: 0 2rem 4rem; } @media (max-width: 980px) { .flexhub-home .agent-grid { grid-template-columns: repeat(2, 1fr); } } /* V2 — neon outline (constant gradient stroke + dual glow on hover) */ .flexhub-home .agent-card { position: relative; padding: 18px 18px 20px; border-radius: 14px; background: linear-gradient(#0a0612, #0a0612) padding-box, var(--fh-grad) border-box; border: 1px solid transparent; text-align: left; transition: transform .25s ease, box-shadow .25s ease; } .flexhub-home .agent-card:hover { transform: translateY(-3px); box-shadow: 0 8px 28px -8px #d423ff66, 0 8px 28px -8px #22b8ff55; } /* Unified outlined-letter marker */ .flexhub-home .agent-card .marker { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; border-radius: 9px; background: linear-gradient(#0a0612, #0a0612) padding-box, linear-gradient(180deg, var(--fh-grad-from), var(--fh-grad-mid), var(--fh-grad-to)) border-box; border: 1.5px solid transparent; font-family: "JetBrains Mono", ui-monospace, monospace; font-size: 17px; font-weight: 700; line-height: 1; margin-bottom: 14px; transition: filter .25s ease; } .flexhub-home .agent-card .marker > span { background: linear-gradient(180deg, var(--fh-grad-from), var(--fh-grad-mid), var(--fh-grad-to)); -webkit-background-clip: text; background-clip: text; color: transparent; font-weight: 700; font-family: "JetBrains Mono", ui-monospace, monospace; } .flexhub-home .agent-card:hover .marker { filter: drop-shadow(0 0 6px #d423ff66) drop-shadow(0 0 10px #22b8ff44); } .flexhub-home .agent-card h3 { margin: 0 0 0.4rem; color: #ffffff; font-size: 1.05rem; font-weight: 700; } .flexhub-home .agent-card p { margin: 0; color: var(--color-text-light); font-size: 0.92rem; line-height: 1.45; } /* Kill default menu-item hover bg on the logo link */ #navbar-logo, #navbar-logo:hover, #navbar-logo:focus, #navbar-logo.active, .navbar-left .item#navbar-logo:hover { background: transparent !important; box-shadow: none !important; } /* Bracket-frame hover on navbar items except logo + sign-in */ #navbar .item:not(#navbar-logo):not([href*="/user/login"]) { position: relative; padding-left: 18px !important; padding-right: 18px !important; background: transparent !important; transition: color .2s ease, background .2s ease, border-color .2s ease; } #navbar .item:not(#navbar-logo):not([href*="/user/login"])::before, #navbar .item:not(#navbar-logo):not([href*="/user/login"])::after { font-family: "Major Mono Display", "JetBrains Mono", monospace !important; font-weight: 400 !important; display: inline-block !important; visibility: visible !important; position: absolute !important; top: 50% !important; transform: translateY(-50%) translateX(0); opacity: 0; font-size: 16px !important; line-height: 1 !important; width: auto !important; min-width: 8px !important; height: auto !important; margin: 0 !important; padding: 0 !important; text-indent: 0 !important; background: transparent !important; background-color: transparent !important; border: 0 !important; box-shadow: none !important; overflow: visible !important; transition: opacity .2s ease, transform .25s cubic-bezier(.2,.7,.1,1.2); pointer-events: none; z-index: 2 !important; } #navbar .item:not(#navbar-logo):not([href*="/user/login"])::before { content: "[" !important; left: 4px !important; right: auto !important; color: var(--fh-grad-from) !important; } #navbar .item:not(#navbar-logo):not([href*="/user/login"])::after { content: "]" !important; right: 4px !important; left: auto !important; color: var(--fh-grad-to) !important; } /* Defeat Semantic UI's .ui.secondary.menu .item:before { display:none } and .ui.menu .item:before { width:1px; background:rgba(...) } divider rule. */ .full.height #navbar .item:not(#navbar-logo):not([href*="/user/login"])::before, .ui.secondary.menu#navbar .item:not(#navbar-logo):not([href*="/user/login"])::before, .ui.menu#navbar .item:not(#navbar-logo):not([href*="/user/login"])::before { content: "[" !important; display: inline-block !important; visibility: visible !important; width: auto !important; height: auto !important; background: transparent !important; background-color: transparent !important; color: var(--fh-grad-from) !important; left: 4px !important; right: auto !important; top: 50% !important; font-size: 16px !important; font-family: "Major Mono Display","JetBrains Mono",monospace !important; } #navbar .item:not(#navbar-logo):not([href*="/user/login"]):hover, #navbar .item:not(#navbar-logo):not([href*="/user/login"]).active { color: #ffffff !important; background: transparent !important; box-shadow: none !important; border-color: transparent !important; } #navbar .item:not(#navbar-logo):not([href*="/user/login"]):hover::before, #navbar .item:not(#navbar-logo):not([href*="/user/login"]).active::before { opacity: 1; transform: translateY(-50%) translateX(-4px); } #navbar .item:not(#navbar-logo):not([href*="/user/login"]):hover::after, #navbar .item:not(#navbar-logo):not([href*="/user/login"]).active::after { opacity: 1; transform: translateY(-50%) translateX( 4px); } /* Sign-in — bordered pill + variant-D panel-fill hover + [← arrow text */ #navbar .item[href*="/user/login"] { position: relative; display: inline-flex !important; align-items: center !important; gap: 6px !important; padding: 6px 12px !important; margin: 0 4px; border: 1px solid #ffffff22 !important; border-radius: 6px !important; color: #e9e6f7 !important; background-color: transparent !important; background-image: linear-gradient(90deg, #d423ff26, #22b8ff26) !important; background-size: 0% 100% !important; background-position: left center !important; background-repeat: no-repeat !important; overflow: hidden; transition: background-size .35s cubic-bezier(.2,.7,.1,1), border-color .2s, color .2s; } #navbar .item[href*="/user/login"]:hover { background-size: 100% 100% !important; border-color: #ffffff14 !important; color: #ffffff !important; } /* hide built-in octicon, replace with [← in Major Mono */ #navbar .item[href*="/user/login"] .svg.octicon-sign-in, #navbar .item[href*="/user/login"] svg.octicon-sign-in, #navbar .item[href*="/user/login"] > svg { display: none !important; } #navbar .item[href*="/user/login"]::before { content: "[←" !important; display: inline-block !important; visibility: visible !important; font-family: "Major Mono Display","JetBrains Mono",monospace !important; font-weight: 400 !important; color: #9d97b8 !important; font-size: 14px !important; line-height: 1 !important; position: static !important; opacity: 1 !important; transform: none !important; width: auto !important; height: auto !important; margin: 0 !important; padding: 0 !important; text-indent: 0 !important; background: transparent !important; background-color: transparent !important; border: 0 !important; box-shadow: none !important; pointer-events: none; transition: color .2s ease; } #navbar .item[href*="/user/login"]:hover::before { color: #ffffff !important; } /* gradient 1px under-line on hover */ #navbar .item[href*="/user/login"]::after { content: "" !important; position: absolute !important; left: 0; right: 0; bottom: 0; height: 1px !important; width: auto !important; top: auto !important; background: var(--fh-grad) !important; transform: scaleX(0); transform-origin: left center; transition: transform .35s cubic-bezier(.2,.7,.1,1); opacity: 1; font-size: 0 !important; border: 0 !important; pointer-events: none; } #navbar .item[href*="/user/login"]:hover::after { transform: scaleX(1); } /* Navbar wordmark — image swap + chromatic-glitch hover */ .flexhub-nav-wordmark { display: inline-block; width: 86px; height: 22px; background: url('/assets/img/flexhub-main-nav-wordmark.png') left center/contain no-repeat; font-size: 0; line-height: 0; color: transparent; position: relative; isolation: isolate; } .flexhub-nav-wordmark .fh-flex { display: none !important; } .flexhub-nav-wordmark::before, .flexhub-nav-wordmark::after { content: ""; position: absolute; inset: 0; background: url('/assets/img/flexhub-main-nav-wordmark.png') left center/contain no-repeat; mix-blend-mode: screen; opacity: 0; pointer-events: none; transition: opacity .12s linear, transform .12s linear; } .flexhub-nav-wordmark::before { filter: hue-rotate(-30deg) saturate(1.4); } .flexhub-nav-wordmark::after { filter: hue-rotate( 60deg) saturate(1.4); } .flexhub-nav-wordmark:hover { animation: fhGlitch .35s steps(6, end) 1; } .flexhub-nav-wordmark:hover::before { opacity: .9; transform: translate(-2px, 1px); } .flexhub-nav-wordmark:hover::after { opacity: .9; transform: translate( 2px, -1px); } @keyframes fhGlitch { 0% { transform: translate(0, 0); } 20% { transform: translate(-1px, 0); } 40% { transform: translate( 1px, 0); } 60% { transform: translate(-1px, 1px) skewX(-2deg); } 80% { transform: translate( 1px,-1px) skewX( 2deg); } 100% { transform: translate(0, 0); } } /* Footer s8n.ru link in gradient */ footer .footer-content a[href*="s8n.ru"], .page-footer a[href*="s8n.ru"] { background: var(--fh-grad); -webkit-background-clip: text; background-clip: text; color: transparent; font-weight: 700; }