feat(themes): better neogothic theme

This commit is contained in:
h
2026-01-17 21:07:45 +01:00
parent 99c11dda1a
commit 9d6ff3ae8c
2 changed files with 476 additions and 201 deletions

View File

@@ -1,4 +1,4 @@
@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700&family=JetBrains+Mono:wght@300;400;700&family=Playfair+Display:wght@400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;500;600;700&family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;1,400&display=swap');
gitea-theme-meta-info { gitea-theme-meta-info {
--theme-display-name: "neogothic"; --theme-display-name: "neogothic";
@@ -6,213 +6,246 @@ gitea-theme-meta-info {
:root { :root {
--is-dark-theme: true; --is-dark-theme: true;
--color-primary: #00f0ff; --color-primary: #8A9299;
--color-primary-dark-1: #33f3ff; --color-primary-dark-1: #A3ABB2;
--color-primary-dark-2: #66f6ff; --color-primary-dark-2: #BCC3C9;
--color-primary-dark-3: #99f9ff; --color-primary-dark-3: #D5DADF;
--color-primary-dark-4: #ccfcff; --color-primary-dark-4: #EEF0F2;
--color-primary-light-1: #00c0cc; --color-primary-light-1: #6B757D;
--color-primary-light-2: #009099; --color-primary-light-2: #4E5962;
--color-primary-light-3: #006066; --color-primary-light-3: #3A434A;
--color-primary-light-4: #003844; --color-primary-light-4: #272E33;
--color-primary-alpha-10: rgba(0, 240, 255, 0.1); --color-primary-alpha-10: rgba(138, 146, 153, 0.10);
--color-primary-alpha-20: rgba(0, 240, 255, 0.2); --color-primary-alpha-20: rgba(138, 146, 153, 0.20);
--color-primary-alpha-30: rgba(0, 240, 255, 0.3); --color-primary-alpha-30: rgba(138, 146, 153, 0.30);
--color-primary-alpha-40: rgba(0, 240, 255, 0.4); --color-primary-alpha-40: rgba(138, 146, 153, 0.40);
--color-primary-alpha-50: rgba(0, 240, 255, 0.5); --color-primary-alpha-50: rgba(138, 146, 153, 0.50);
--color-primary-alpha-60: rgba(0, 240, 255, 0.6); --color-primary-alpha-60: rgba(138, 146, 153, 0.60);
--color-body: #050505; --color-accent: #A89064;
--color-box-body: rgba(10, 10, 10, 0.8); --color-accent-alpha-20: rgba(168, 144, 100, 0.20);
--color-box-header: rgba(5, 5, 5, 0.9); --color-accent-alpha-40: rgba(168, 144, 100, 0.40);
--color-footer: #050505;
--color-navbar: rgba(5, 5, 5, 0.95);
--color-menu: #0a0a0a;
--color-card: rgba(10, 10, 10, 0.6);
--color-text: #e0e0e0; --color-body: #0A0B0D;
--color-text-light: #c0c0c0; --color-box-body: rgba(14, 16, 19, 0.88);
--color-text-light-2: #a0a0a0; --color-box-header: rgba(10, 12, 14, 0.94);
--color-text-light-3: #808080; --color-footer: #08090B;
--color-link: #00f0ff; --color-navbar: rgba(8, 9, 11, 0.97);
--color-link-hover: #66f6ff; --color-menu: #0D0E11;
--color-card: rgba(14, 16, 19, 0.75);
--color-border: #333333; --color-text: #E2E4E6;
--color-border-secondary: #222222; --color-text-light: #9BA0A5;
--color-secondary: #222222; --color-text-light-2: #6D7378;
--color-secondary-alpha-6: rgba(34, 34, 34, 0.6); --color-text-light-3: #484D52;
--color-link: #A3ABB2;
--color-link-hover: #D5DADF;
--color-input-background: #000000; --color-border: #1E2227;
--color-input-text: #e0e0e0; --color-border-secondary: #151719;
--color-input-border: #333333; --color-secondary: #151719;
--color-input-border-hover: #00f0ff; --color-secondary-alpha-6: rgba(21, 23, 25, 0.6);
--color-input-background: #0C0D10;
--color-input-text: #E2E4E6;
--color-input-border: #1E2227;
--color-input-border-hover: #8A9299;
--color-code-bg: #1e1f22; --color-code-bg: #1e1f22;
--color-code-sidebar-bg: #2b2d30; --color-code-sidebar-bg: #2b2d30;
--color-editor-line-number: #4b5059; --color-editor-line-number: #4b5059;
--fonts-proportional: 'JetBrains Mono', 'Fira Code', monospace; --fonts-proportional: 'JetBrains Mono', monospace;
--fonts-monospace: 'JetBrains Mono', 'Fira Code', monospace; --fonts-monospace: 'JetBrains Mono', monospace;
--fonts-regular: 'JetBrains Mono', 'Fira Code', monospace; --fonts-regular: 'JetBrains Mono', monospace;
--font-family-header: 'Cinzel', 'Playfair Display', serif; --font-family-header: 'Cinzel', serif;
--transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
--transition-base: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 0.4s cubic-bezier(0.4, 0, 0.2, 1);
} }
body { body {
background-color: var(--color-body); background-color: var(--color-body);
background-image:
radial-gradient(ellipse 80% 50% at 50% -20%, rgba(138, 146, 153, 0.03) 0%, transparent 50%),
linear-gradient(180deg, var(--color-body) 0%, #080909 100%);
background-attachment: fixed;
color: var(--color-text); color: var(--color-text);
font-family: var(--fonts-regular); font-family: var(--fonts-regular);
font-weight: 400;
font-size: 13px;
letter-spacing: 0.01em;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
} }
h1, h2, h3, h4, h5, h6, .ui.header { h1, h2, h3, h4, h5, h6, .ui.header {
font-family: var(--font-family-header) !important; font-family: var(--font-family-header) !important;
font-weight: 400; font-weight: 500;
letter-spacing: 0.05em; letter-spacing: 0.12em;
text-transform: uppercase; text-transform: uppercase;
color: var(--color-text); color: var(--color-text);
} }
h1, .ui.header.large { font-size: 1.8em; }
h2 { font-size: 1.4em; }
h3 { font-size: 1.15em; }
a {
color: var(--color-link);
text-decoration: none;
transition: color var(--transition-fast);
}
a:hover {
color: var(--color-link-hover);
}
* { * {
border-radius: 0px !important; border-radius: 0px !important;
} }
.ui.menu, .ui.secondary.menu, .following.bar { .ui.menu, .ui.secondary.menu, .following.bar {
background: var(--color-navbar) !important; background: var(--color-navbar) !important;
border-bottom: 1px solid var(--color-primary-alpha-30); border-bottom: 1px solid var(--color-border);
backdrop-filter: blur(10px); backdrop-filter: blur(16px) saturate(180%);
-webkit-backdrop-filter: blur(16px) saturate(180%);
} }
.ui.secondary.menu .item { .ui.secondary.menu .item {
color: var(--color-text-light); color: var(--color-text-light);
font-family: var(--fonts-monospace); font-family: var(--fonts-monospace);
text-transform: uppercase; text-transform: uppercase;
font-size: 0.9em; font-size: 0.8em;
font-weight: 400;
letter-spacing: 0.1em;
border: none !important; border: none !important;
margin: 0 5px; margin: 0 4px;
padding: 14px 8px;
transition: color var(--transition-base);
position: relative;
}
.ui.secondary.menu .item::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 1px;
background: var(--color-primary);
transition: all var(--transition-base);
transform: translateX(-50%);
}
.ui.secondary.menu .item:hover {
color: var(--color-text);
}
.ui.secondary.menu .item:hover::after {
width: 100%;
} }
.ui.secondary.menu .active.item { .ui.secondary.menu .active.item {
color: var(--color-primary); color: var(--color-text) !important;
background: transparent !important; background: transparent !important;
box-shadow: inset 0 -2px 0 0 var(--color-primary) !important;
border: none !important; border: none !important;
} }
.ui.secondary.menu .active.item::after {
width: 100%;
background: var(--color-accent);
height: 2px;
}
.ui.container.fluid.padded { .ui.container.fluid.padded {
border-bottom: 1px solid var(--color-border); border-bottom: 1px solid var(--color-border);
background: linear-gradient(180deg, rgba(5,5,5,0) 0%, rgba(0,240,255,0.05) 100%); background: transparent;
} }
.ui.button, .ui.basic.button { .ui.button, .ui.basic.button {
background: rgba(0, 0, 0, 0.5); background: var(--color-primary-light-4);
border: 1px solid var(--color-primary-alpha-50); border: 1px solid var(--color-primary-alpha-50);
color: var(--color-primary); color: var(--color-text);
font-family: var(--fonts-monospace); font-family: var(--fonts-monospace);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 1px; letter-spacing: 0.08em;
transition: all 0.2s ease; font-size: 0.85em;
transition: all var(--transition-base);
box-shadow: none !important; box-shadow: none !important;
} }
.ui.button:hover { .ui.button:hover {
background: var(--color-primary-alpha-20);
color: #fff;
border-color: var(--color-primary); border-color: var(--color-primary);
box-shadow: 0 0 10px var(--color-primary-alpha-40) !important; color: var(--color-text);
background: var(--color-primary-alpha-30);
} }
.ui.primary.button, .ui.green.button, .ui.blue.button { .ui.primary.button, .ui.green.button, .ui.blue.button {
background: var(--color-primary) !important; background: linear-gradient(180deg, var(--color-primary) 0%, var(--color-primary-light-1) 100%) !important;
color: #000 !important; color: var(--color-body) !important;
border: 1px solid var(--color-primary); border: 1px solid var(--color-primary);
font-weight: 700; font-weight: 500;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08) !important;
} }
.ui.primary.button:hover { .ui.primary.button:hover {
background: #33f3ff !important; background: linear-gradient(180deg, var(--color-primary-dark-1) 0%, var(--color-primary) 100%) !important;
box-shadow: 0 0 15px var(--color-primary) !important; border-color: var(--color-primary-dark-1);
} }
.ui.buttons { .ui.buttons {
display: inline-flex !important; gap: 0 !important;
overflow: visible !important;
background: transparent !important;
border: none !important;
box-shadow: none !important;
margin: 0 !important;
} }
.ui.buttons > .button, .ui.buttons > .button,
.ui.buttons > .ui.button { .ui.buttons > .ui.button {
margin: 0 !important; margin: 0 !important;
margin-left: -1px !important; font-size: 0.85rem !important;
z-index: 1; background: transparent !important;
position: relative; border: 1px solid var(--color-border) !important;
border: 1px solid var(--color-primary-alpha-50) !important; color: var(--color-text-light) !important;
box-shadow: none !important;
flex-shrink: 0;
} }
.ui.buttons > .button:first-child, .ui.buttons > .button:not(:first-child),
.ui.buttons > .ui.button:first-child { .ui.buttons > .ui.button:not(:first-child) {
margin-left: 0 !important; margin-left: -1px !important;
} }
.ui.buttons > .button:hover, .ui.buttons > .button:hover,
.ui.buttons > .button:active, .ui.buttons > .ui.button:hover {
.ui.buttons > .button.active, z-index: 2;
.ui.buttons > .ui.button:hover, border-color: var(--color-primary) !important;
.ui.buttons > .ui.button:active, color: var(--color-text) !important;
.ui.buttons > .ui.button.active {
z-index: 10;
border: 1px solid var(--color-primary) !important;
box-shadow: none !important;
} }
.ui.vertical.buttons { .ui.buttons .button.active,
display: inline-flex !important; .ui.button.active {
flex-direction: column !important; background: var(--color-primary-alpha-20) !important;
overflow: visible !important; color: var(--color-text) !important;
background: transparent !important; border-color: var(--color-primary) !important;
border: none !important; z-index: 3;
box-shadow: none !important;
} }
.ui.vertical.buttons > .button, .ui.input input,
.ui.vertical.buttons > .ui.button { .ui.form input[type="text"],
margin: 0 !important; .ui.form input[type="email"],
margin-top: -1px !important; .ui.form input[type="password"],
margin-left: 0 !important; .ui.form textarea {
z-index: 1; background: var(--color-input-background) !important;
position: relative;
border: 1px solid var(--color-primary-alpha-50) !important;
}
.ui.vertical.buttons > .button:first-child,
.ui.vertical.buttons > .ui.button:first-child {
margin-top: 0 !important;
}
.ui.vertical.buttons > .button:hover,
.ui.vertical.buttons > .button:active,
.ui.vertical.buttons > .button.active,
.ui.vertical.buttons > .ui.button:hover,
.ui.vertical.buttons > .ui.button:active,
.ui.vertical.buttons > .ui.button.active {
z-index: 10;
border: 1px solid var(--color-primary) !important;
}
.ui.input input, .ui.form input[type="text"], .ui.form input[type="email"], .ui.form input[type="password"] {
background: transparent !important;
border: 1px solid var(--color-border) !important; border: 1px solid var(--color-border) !important;
color: var(--color-text) !important; color: var(--color-text) !important;
padding: 10px 10px 10px 10px !important; padding: 12px 14px !important;
font-family: var(--fonts-regular);
font-size: 0.95em;
transition: all var(--transition-base);
} }
.ui.icon.input > i.icon { .ui.icon.input > i.icon {
color: var(--color-primary); color: var(--color-text-light-2);
opacity: 0.8; opacity: 1;
transition: color var(--transition-base);
} }
.ui.icon.input input { .ui.icon.input input {
@@ -221,18 +254,37 @@ h1, h2, h3, h4, h5, h6, .ui.header {
.ui.left.icon.input input { .ui.left.icon.input input {
padding-left: 2.67142857em !important; padding-left: 2.67142857em !important;
padding-right: 10px !important; padding-right: 14px !important;
} }
.ui.input input:focus, .ui.form input:focus { .ui.input input:focus,
.ui.form input:focus,
.ui.form textarea:focus {
border-color: var(--color-primary) !important; border-color: var(--color-primary) !important;
box-shadow: 0 0 0 1px var(--color-primary-alpha-30) !important;
outline: none;
}
.ui.input:focus-within > i.icon {
color: var(--color-primary);
}
.ui.input input::placeholder,
.ui.form input::placeholder,
.ui.form textarea::placeholder {
color: var(--color-text-light-3);
font-style: italic;
font-weight: 300;
} }
.ui.card, .ui.segment, .ui.attached.segment { .ui.card, .ui.segment, .ui.attached.segment {
background: var(--color-box-body) !important; background: var(--color-box-body) !important;
border: 1px solid var(--color-border); border: 1px solid var(--color-border);
backdrop-filter: blur(10px); backdrop-filter: blur(8px);
box-shadow: none !important; -webkit-backdrop-filter: blur(8px);
box-shadow:
0 4px 24px rgba(0, 0, 0, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.02) !important;
} }
.ui.header.segment, .ui.top.attached.header { .ui.header.segment, .ui.top.attached.header {
@@ -306,18 +358,52 @@ td.lines-code.chroma {
border: 1px solid var(--color-border); border: 1px solid var(--color-border);
} }
.ui.table thead th { .ui.table thead th {
background: rgba(255,255,255,0.05); background: rgba(138, 146, 153, 0.04);
color: var(--color-text); color: var(--color-text-light);
border-bottom: 1px solid var(--color-primary-alpha-30); border-bottom: 1px solid var(--color-border);
font-family: var(--fonts-regular);
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.75em;
font-weight: 500;
padding: 14px 12px;
} }
.ui.table tbody tr { .ui.table tbody tr {
border-bottom: 1px solid var(--color-border-secondary); border-bottom: 1px solid var(--color-border-secondary);
transition: background var(--transition-fast);
}
.ui.table tbody tr:hover {
background: rgba(138, 146, 153, 0.03);
}
.ui.table td {
padding: 12px;
}
.file-view.code-view td.lines-num {
padding: 0 8px !important;
text-align: right !important;
}
.file-view.code-view td.lines-code {
padding: 0 1px 0 5px !important;
} }
.ui.label { .ui.label {
background: transparent; background: transparent;
border: 1px solid var(--color-border); border: 1px solid var(--color-border);
color: var(--color-text-light); color: var(--color-text-light);
font-family: var(--fonts-monospace);
font-size: 0.75em;
letter-spacing: 0.05em;
padding: 5px 10px;
}
.ui.label.primary, .ui.label.blue {
background: var(--color-primary-alpha-20);
border-color: var(--color-primary-alpha-40);
color: var(--color-primary-dark-2);
} }
.ui.popup, .ui.popup,
@@ -328,7 +414,9 @@ td.lines-code.chroma {
background: var(--color-menu) !important; background: var(--color-menu) !important;
color: var(--color-text) !important; color: var(--color-text) !important;
border: 1px solid var(--color-border) !important; border: 1px solid var(--color-border) !important;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5) !important; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) !important;
font-family: var(--fonts-regular);
font-size: 0.85em;
} }
.tippy-content { .tippy-content {
@@ -345,42 +433,25 @@ td.lines-code.chroma {
border: 1px solid var(--color-border) !important; border: 1px solid var(--color-border) !important;
} }
.ui.dropdown .menu, .ui.dropdown .menu {
.ui.selection.dropdown .menu,
.ui.active.dropdown .menu,
.ui.visible.dropdown > .menu {
background: var(--color-menu) !important; background: var(--color-menu) !important;
border: 1px solid var(--color-border) !important; border: 1px solid var(--color-border) !important;
z-index: 1000 !important; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
position: absolute !important;
} }
.ui.dropdown .menu > .item, .ui.dropdown .menu > .item {
.ui.selection.dropdown .menu > .item {
background: transparent !important; background: transparent !important;
color: var(--color-text) !important; color: var(--color-text) !important;
border-top: 1px solid var(--color-border-secondary) !important; border-top: 1px solid var(--color-border-secondary) !important;
padding: 10px 14px !important;
} }
.ui.dropdown .menu > .item:first-child { .ui.dropdown .menu > .item:first-child {
border-top: none !important; border-top: none !important;
} }
.ui.dropdown .menu > .item:hover, .ui.dropdown .menu > .item:hover {
.ui.dropdown .menu > .item.selected, background: var(--color-primary-alpha-10) !important;
.ui.dropdown .menu > .item.active {
background: var(--color-primary-alpha-20) !important;
color: var(--color-primary) !important;
}
.ui.dropdown {
position: relative;
z-index: 10;
}
.ui.dropdown.active,
.ui.dropdown.visible {
z-index: 1001 !important;
} }
footer { footer {
@@ -405,15 +476,15 @@ footer {
border: 1px solid var(--color-border) !important; border: 1px solid var(--color-border) !important;
color: var(--color-text) !important; color: var(--color-text) !important;
min-width: 100px !important; min-width: 100px !important;
padding: 3px 6px !important; padding: 4px 8px !important;
font-size: 0.8em !important; font-size: 0.75em !important;
height: auto !important; height: auto !important;
min-height: unset !important; min-height: unset !important;
} }
.theme-selector-footer .ui.button { .theme-selector-footer .ui.button {
padding: 3px 8px !important; padding: 4px 10px !important;
font-size: 0.75em !important; font-size: 0.7em !important;
margin: 0 !important; margin: 0 !important;
} }
@@ -422,17 +493,220 @@ footer {
height: 8px; height: 8px;
} }
::-webkit-scrollbar-track { ::-webkit-scrollbar-track {
background: #2b2d30; background: transparent;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background: #4b5059; background: var(--color-border);
border: 1px solid #2b2d30; border: 2px solid transparent;
background-clip: content-box;
} }
::-webkit-scrollbar-thumb:hover { ::-webkit-scrollbar-thumb:hover {
background: #548af7; background: var(--color-primary-light-2);
background-clip: content-box;
}
::-webkit-scrollbar-corner {
background: transparent;
} }
::selection { ::selection {
background: #2e436e; background: rgba(138, 146, 153, 0.35);
color: #bcbec4; color: var(--color-text);
}
::-moz-selection {
background: rgba(138, 146, 153, 0.35);
color: var(--color-text);
}
.ui.loader::before {
border-color: var(--color-border) !important;
}
.ui.loader::after {
border-color: var(--color-primary) transparent transparent !important;
}
.ui.message {
background: var(--color-box-body) !important;
border: 1px solid var(--color-border);
color: var(--color-text);
box-shadow: none !important;
}
.ui.negative.message,
.ui.error.message {
background: rgba(139, 58, 58, 0.15) !important;
border-color: rgba(139, 58, 58, 0.4);
color: #E07070;
}
.ui.positive.message,
.ui.success.message {
background: rgba(88, 139, 58, 0.15) !important;
border-color: rgba(88, 139, 58, 0.4);
color: #7CB05C;
}
.ui.warning.message {
background: rgba(168, 144, 100, 0.15) !important;
border-color: rgba(168, 144, 100, 0.4);
color: var(--color-accent);
}
.repository .repo-header {
background: transparent !important;
}
.repository .ui.secondary.menu,
.repository .ui.tabular.menu,
.repository .ui.menu {
background: transparent !important;
border-bottom: 1px solid var(--color-border);
backdrop-filter: none !important;
}
.issue.is-open .issue-state-label {
background: rgba(88, 139, 58, 0.2) !important;
color: #7CB05C !important;
}
.issue.is-closed .issue-state-label {
background: rgba(139, 58, 58, 0.2) !important;
color: #E07070 !important;
}
.heatmap rect {
rx: 0 !important;
ry: 0 !important;
}
.heatmap .ContributionCalendar-day[data-level="0"] { fill: var(--color-border-secondary) !important; }
.heatmap .ContributionCalendar-day[data-level="1"] { fill: rgba(138, 146, 153, 0.25) !important; }
.heatmap .ContributionCalendar-day[data-level="2"] { fill: rgba(138, 146, 153, 0.45) !important; }
.heatmap .ContributionCalendar-day[data-level="3"] { fill: rgba(138, 146, 153, 0.65) !important; }
.heatmap .ContributionCalendar-day[data-level="4"] { fill: var(--color-primary) !important; }
.ui.modal {
background: var(--color-box-body) !important;
border: 1px solid var(--color-border);
box-shadow: 0 16px 64px rgba(0, 0, 0, 0.5) !important;
}
.ui.modal > .header {
background: var(--color-box-header) !important;
border-bottom: 1px solid var(--color-border);
color: var(--color-text) !important;
font-family: var(--font-family-header);
letter-spacing: 0.1em;
text-transform: uppercase;
}
.ui.modal > .content {
background: transparent !important;
color: var(--color-text);
}
.ui.modal > .actions {
background: var(--color-box-header) !important;
border-top: 1px solid var(--color-border);
}
.ui.dimmer {
background: rgba(0, 0, 0, 0.75) !important;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.ui.avatar,
.avatar,
img.avatar {
border: 1px solid var(--color-border) !important;
}
.file-tree-item:hover {
background: var(--color-primary-alpha-10) !important;
}
.file-tree-item.selected {
background: var(--color-primary-alpha-20) !important;
}
.diff-file-header {
background: var(--color-box-header) !important;
border-bottom: 1px solid var(--color-border);
}
.add-code, .diff-line-add {
background: rgba(88, 139, 58, 0.12) !important;
}
.del-code, .diff-line-del {
background: rgba(139, 58, 58, 0.12) !important;
}
.ui.tabular.menu {
border-bottom: 1px solid var(--color-border);
}
.ui.tabular.menu .item {
border: none !important;
background: transparent !important;
color: var(--color-text-light);
padding: 12px 16px;
margin-bottom: -1px;
}
.ui.tabular.menu .item:hover {
color: var(--color-text);
}
.ui.tabular.menu .active.item {
background: transparent !important;
color: var(--color-text) !important;
border-bottom: 2px solid var(--color-accent) !important;
}
#portfolio-controls,
#portfolio-controls *,
.portfolio-card,
.portfolio-card * {
border-radius: 0px !important;
}
.portfolio-card {
overflow: visible;
z-index: 1;
--glow-color: var(--color-primary);
transition: border-color 0.5s cubic-bezier(0.4, 0, 0.2, 1);
transform: none !important;
}
.portfolio-card::before {
content: '';
position: absolute;
inset: 0;
background: var(--glow-color, var(--color-primary));
opacity: 0;
filter: blur(12px);
z-index: -1;
transition: opacity 0.6s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.portfolio-card:hover {
transform: none !important;
box-shadow: none !important;
border-color: var(--color-secondary) !important;
}
.portfolio-card:hover::before {
opacity: 0.25;
}
.portfolio-card .card-content,
.portfolio-card .card-footer {
background: var(--color-box-body);
position: relative;
z-index: 1;
} }

View File

@@ -72,7 +72,6 @@
margin-bottom: 2rem; margin-bottom: 2rem;
background: var(--color-box-header); background: var(--color-box-header);
padding: 1rem; padding: 1rem;
border-radius: 4px;
border: 1px solid var(--color-secondary); border: 1px solid var(--color-secondary);
} }
@@ -126,14 +125,14 @@
.portfolio-card { .portfolio-card {
background-color: var(--color-box-body); background-color: var(--color-box-body);
border: 1px solid var(--color-secondary); border: 1px solid var(--color-secondary);
border-radius: 6px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 380px; height: 380px;
position: relative; position: relative;
transition: transform 0.2s, border-color 0.2s, box-shadow 0.2s; transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
overflow: hidden; overflow: hidden;
text-decoration: none !important; text-decoration: none !important;
cursor: pointer;
} }
.portfolio-card:hover { .portfolio-card:hover {
@@ -437,13 +436,15 @@ document.addEventListener('DOMContentLoaded', async () => {
const langColor = getLangColor(item.language); const langColor = getLangColor(item.language);
card.style.setProperty('--hover-color', langColor); const hexToRgb = (hex) => {
card.addEventListener('mouseenter', () => { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
card.style.borderColor = langColor; return result ?
}); `${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)}` :
card.addEventListener('mouseleave', () => { '138, 146, 153';
card.style.borderColor = 'var(--color-secondary)'; };
});
card.style.setProperty('--glow-color', langColor);
card.style.setProperty('--glow-rgb', hexToRgb(langColor));
let linksHtml = ''; let linksHtml = '';
linksHtml += `<a href="${item.url}" class="portfolio-link" style="color: ${langColor}" target="_blank">git</a>`; linksHtml += `<a href="${item.url}" class="portfolio-link" style="color: ${langColor}" target="_blank">git</a>`;