mirror of
https://github.com/NotoChen/Jetbrains-Help.git
synced 2025-09-14 08:08:30 +08:00
style: ui 重构
This commit is contained in:
parent
b0d4b6d8af
commit
b6aaa1c398
|
@ -1,535 +1,160 @@
|
|||
.form {
|
||||
background-color: #15172b;
|
||||
border-radius: 20px;
|
||||
box-sizing: border-box;
|
||||
height: 500px;
|
||||
padding: 20px;
|
||||
width: 320px;
|
||||
}
|
||||
|
||||
.title {
|
||||
color: #eee;
|
||||
font-family: sans-serif;
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
color: #eee;
|
||||
font-family: sans-serif;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.input-container {
|
||||
height: 50px;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.ic1 {
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.ic2 {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.input {
|
||||
background-color: #303245;
|
||||
border-radius: 12px;
|
||||
border: 0;
|
||||
box-sizing: border-box;
|
||||
color: #eee;
|
||||
font-size: 18px;
|
||||
height: 100%;
|
||||
outline: 0;
|
||||
padding: 4px 20px 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.cut {
|
||||
background-color: #15172b;
|
||||
border-radius: 10px;
|
||||
height: 20px;
|
||||
left: 20px;
|
||||
position: absolute;
|
||||
top: -20px;
|
||||
transform: translateY(0);
|
||||
transition: transform 200ms;
|
||||
width: 76px;
|
||||
}
|
||||
|
||||
.cut-short {
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.input:focus ~ .cut,
|
||||
.input:not(:placeholder-shown) ~ .cut {
|
||||
transform: translateY(8px);
|
||||
}
|
||||
|
||||
.placeholder {
|
||||
color: #65657b;
|
||||
font-family: sans-serif;
|
||||
left: 20px;
|
||||
line-height: 14px;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
transform-origin: 0 50%;
|
||||
transition: transform 200ms, color 200ms;
|
||||
top: 20px;
|
||||
}
|
||||
|
||||
.input:focus ~ .placeholder,
|
||||
.input:not(:placeholder-shown) ~ .placeholder {
|
||||
transform: translateY(-30px) translateX(10px) scale(0.75);
|
||||
}
|
||||
|
||||
.input:not(:placeholder-shown) ~ .placeholder {
|
||||
color: #808097;
|
||||
}
|
||||
|
||||
.input:focus ~ .placeholder {
|
||||
color: #dc2f55;
|
||||
}
|
||||
|
||||
.submit {
|
||||
background-color: #08d;
|
||||
border-radius: 12px;
|
||||
border: 0;
|
||||
box-sizing: border-box;
|
||||
color: #eee;
|
||||
cursor: pointer;
|
||||
font-size: 18px;
|
||||
height: 50px;
|
||||
margin-top: 38px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.submit:active {
|
||||
background-color: #06b;
|
||||
}
|
||||
:root {
|
||||
--text-grey: #9e9e9e;
|
||||
--text-main: rgba(0, 0, 0, 0.87);
|
||||
--spacing: 4px;
|
||||
--size: 64px;
|
||||
--radius: 1.5rem;
|
||||
--accent: #5380f7;
|
||||
--text-sm: 0.875rem;
|
||||
--main-bg: #fff;
|
||||
--card-bg: #fff;
|
||||
--hover-color: #eee;
|
||||
--border-color: rgba(0, 0, 0, 0.05);
|
||||
--grey-400: rgba(0, 0, 0, 0.04);
|
||||
--grey-600: rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--main-bg: rgb(0, 0, 0);
|
||||
--card-bg: rgb(31, 34, 38);
|
||||
--text-main: #d9d9d9;
|
||||
--text-grey: #6e767d;
|
||||
--accent: #1d9bf0;
|
||||
--hover-color: rgba(255, 255, 255, 0.07);
|
||||
--border-color: #4b4648;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 1rem;
|
||||
line-height: 1.5;
|
||||
word-wrap: break-word;
|
||||
font-kerning: normal;
|
||||
font-family: 'Gotham SSm A', 'Gotham SSm B', 'Arial Unicode MS', Helvetica, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
background-color: var(--main-bg);
|
||||
}
|
||||
|
||||
* ul, * ol {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
*[role='button'], button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.color-primary {
|
||||
color: var(--text-main);
|
||||
}
|
||||
/* Custom Icon Styles - Keep these for JetBrains product icons */
|
||||
|
||||
|
||||
.mt-0 {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
|
||||
.radius-1 {
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.px-6 {
|
||||
padding-left: calc(var(--spacing) * 6);
|
||||
padding-right: calc(var(--spacing) * 6);
|
||||
}
|
||||
|
||||
.py-6 {
|
||||
padding-left: calc(var(--spacing)* 6);
|
||||
padding-right: calc(var(--spacing)* 6);
|
||||
}
|
||||
|
||||
.py-10 {
|
||||
padding-top: calc(var(--spacing) * 10);
|
||||
padding-bottom: calc(var(--spacing) * 10);
|
||||
}
|
||||
|
||||
.pd-6 {
|
||||
padding: calc(var(--spacing) * 6);
|
||||
}
|
||||
|
||||
|
||||
.pt-1 {
|
||||
padding-top: var(--spacing);
|
||||
}
|
||||
|
||||
.pb-0 {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.overflow-hidden {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.justify-between {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.justify-center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
|
||||
.items-center {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.shrink-0 {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.text-grey {
|
||||
color: var(--text-grey);
|
||||
}
|
||||
|
||||
.text-sm {
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.bg-card {
|
||||
background-color: var(--card-bg);
|
||||
}
|
||||
|
||||
.truncate {
|
||||
/* display: -webkit-box; */
|
||||
/* -webkit-box-orient: vertical; */
|
||||
/* -webkit-line-clamp: var(--line, 3); */
|
||||
/* overflow: hidden; */
|
||||
}
|
||||
|
||||
.truncate-1 {
|
||||
--line: 1;
|
||||
}
|
||||
|
||||
.overflow-ellipsis {
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.z-grid {
|
||||
display: grid;
|
||||
grid-gap: var(--gutter, 1rem);
|
||||
grid-template-columns: repeat(auto-fill, minmax(min(var(--space, 10rem), 100%), 1fr));
|
||||
}
|
||||
|
||||
|
||||
.card {
|
||||
box-shadow: rgb(0 0 0 / 30%) 0 8px 40px -12px;
|
||||
border-radius: 1.5rem;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) 0ms;
|
||||
width: 90%;
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
background-color: var(--card-bg);
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.card:hover .mask {
|
||||
bottom: -1.5rem;
|
||||
}
|
||||
|
||||
.card:hover .mask-c-1 {
|
||||
bottom: -2.5rem;
|
||||
}
|
||||
|
||||
.container {
|
||||
padding-top: calc(var(--spacing) * 10);
|
||||
}
|
||||
|
||||
.container p {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
|
||||
}
|
||||
|
||||
.container p::after {
|
||||
content: attr(data-content);
|
||||
position: absolute;
|
||||
transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
|
||||
color: transparent;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.container p:hover {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
.container p:hover::after {
|
||||
color: var(--text-main);
|
||||
background-color: var(--hover-color);
|
||||
}
|
||||
|
||||
.toggle li {
|
||||
z-index: 99;
|
||||
position: relative;
|
||||
background: transparent;
|
||||
padding: 0 20px;
|
||||
color: var(--text-main);
|
||||
transition: background-color 250ms ease-out;
|
||||
}
|
||||
|
||||
.toggle li:hover {
|
||||
background-color: var(--hover-color);
|
||||
}
|
||||
|
||||
.toggle li.active a {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.toggle li:first-child {
|
||||
border-top-left-radius: var(--text-sm);
|
||||
border-top-right-radius: var(--text-sm);
|
||||
}
|
||||
|
||||
.toggle li:last-child {
|
||||
border-bottom-left-radius: var(--text-sm);
|
||||
border-bottom-right-radius: var(--text-sm);
|
||||
}
|
||||
|
||||
.toggle li:last-child a {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
.toggle li a {
|
||||
display: block;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding: 16px 0;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* JetBrains Product Icons */
|
||||
.icon {
|
||||
background-image: url('../images/icons.svg?t=4567');
|
||||
background-size: 64px;
|
||||
background-position-x: 0;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
|
||||
.icon-ii {
|
||||
background-image: url('../images/intellij-idea.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/intellij-idea/intellij-idea.svg');
|
||||
}
|
||||
|
||||
.icon-ps {
|
||||
background-image: url('../images/phpstorm.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/phpstorm/phpstorm.svg');
|
||||
}
|
||||
|
||||
.icon-ac {
|
||||
background-position-y: -192px;
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/appcode/appcode.svg');
|
||||
}
|
||||
|
||||
.icon-db {
|
||||
background-image: url('../images/datagrip.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/datagrip/datagrip.svg');
|
||||
}
|
||||
|
||||
.icon-rm {
|
||||
background-image: url('../images/rubymine.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/rubymine/rubymine.svg');
|
||||
}
|
||||
|
||||
.icon-ws {
|
||||
background-image: url('../images/webstorm.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/webstorm/webstorm.svg');
|
||||
}
|
||||
|
||||
.icon-rd {
|
||||
background-image: url('../images/rider.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/rider/rider.svg');
|
||||
}
|
||||
|
||||
.icon-cl {
|
||||
background-image: url('../images/clion.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/clion/clion.svg');
|
||||
}
|
||||
|
||||
.icon-pc {
|
||||
background-image: url('../images/pycharm.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/pycharm/pycharm.svg');
|
||||
}
|
||||
|
||||
.icon-go {
|
||||
background-image: url('../images/goland.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/goland/goland.svg');
|
||||
}
|
||||
|
||||
.icon-ds {
|
||||
background-image: url('../images/dataspell.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/dataspell/dataspell.svg');
|
||||
}
|
||||
|
||||
.icon-dc {
|
||||
background-image: url('../images/dotcover.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/dotcover/dotcover.svg');
|
||||
}
|
||||
|
||||
.icon-dpn {
|
||||
background-image: url('../images/dottrace.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/dottrace/dottrace.svg');
|
||||
}
|
||||
|
||||
.icon-dm {
|
||||
background-image: url('../images/dotmemory.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/dotmemory/dotmemory.svg');
|
||||
}
|
||||
|
||||
.icon-rr {
|
||||
background-image: url('../images/rustrover.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/rustrover/rustrover.svg');
|
||||
}
|
||||
|
||||
.icon-qa {
|
||||
background-image: url('../images/aqua.svg?v=1');
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/aqua/aqua.svg');
|
||||
}
|
||||
|
||||
.mask {
|
||||
transition: 0.2s;
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
width: 88%;
|
||||
height: 100%;
|
||||
bottom: 0;
|
||||
border-radius: 1.5rem;
|
||||
background-color: var(--grey-600);
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
.icon-al {
|
||||
background-image: url('https://resources.jetbrains.com/storage/logos/web/toolbox/toolbox.svg');
|
||||
}
|
||||
|
||||
.mask-c-1 {
|
||||
bottom: 0;
|
||||
width: 72%;
|
||||
background-color: var(--grey-400);
|
||||
/* Custom animations and transitions for enhanced UX */
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; transform: translateY(20px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
.avatar-wrapper {
|
||||
position: relative;
|
||||
width: var(--size);
|
||||
height: var(--size);
|
||||
font-size: 1.25rem;
|
||||
user-select: none;
|
||||
transform: translateY(50%);
|
||||
@keyframes slideIn {
|
||||
from { transform: translateX(-100%); }
|
||||
to { transform: translateX(0); }
|
||||
}
|
||||
|
||||
.avatar-wrapper img, .avatar-wrapper .icon {
|
||||
.animate-fade-in {
|
||||
animation: fadeIn 0.5s ease-out;
|
||||
}
|
||||
|
||||
.animate-slide-in {
|
||||
animation: slideIn 0.3s ease-out;
|
||||
}
|
||||
|
||||
/* Responsive Grid Layout */
|
||||
.grid-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
|
||||
gap: 1.5rem;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
background-color: var(--card-bg);
|
||||
color: transparent;
|
||||
object-fit: cover;
|
||||
text-align: center;
|
||||
text-indent: 10000px;
|
||||
}
|
||||
|
||||
|
||||
header.tip a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
header.tip p {
|
||||
word-break: break-word;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
|
||||
main hr {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: var(--border-color);
|
||||
height: 1px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
footer {
|
||||
--_size: 40px;
|
||||
padding-top: var(--_size);
|
||||
width: 96%;
|
||||
margin: calc(var(--spacing) * 10) auto 0;
|
||||
padding-bottom: var(--_size);
|
||||
border-top: 1px solid var(--border-color);
|
||||
-moz-box-align: center;
|
||||
-webkit-box-pack: justify;
|
||||
/* Responsive breakpoints for different card sizes */
|
||||
@media (max-width: 640px) {
|
||||
.grid-container {
|
||||
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
|
||||
gap: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
footer .lt-panel p:nth-of-type(1) {
|
||||
color: inherit;
|
||||
}
|
||||
header.tip {
|
||||
top: 2.3%;
|
||||
background-color: var(--card-bg);
|
||||
color: var(--text-main);
|
||||
z-index: 99;
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
border-radius: 16px;
|
||||
box-shadow: rgb(0 0 0 / 30%) 0 8px 40px -12px;
|
||||
transition: transform 250ms ease, box-shadow 250ms ease;
|
||||
}
|
||||
.sticky {
|
||||
position: sticky;
|
||||
@media (min-width: 641px) and (max-width: 1024px) {
|
||||
.grid-container {
|
||||
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
|
||||
gap: 1.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1025px) {
|
||||
.grid-container {
|
||||
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||||
gap: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.parent {
|
||||
position: relative;
|
||||
/* Custom scrollbar for better aesthetics */
|
||||
::-webkit-scrollbar {
|
||||
width: 8px;
|
||||
}
|
||||
.search {
|
||||
width: 300px;
|
||||
height: 40px;
|
||||
border-radius: 18px;
|
||||
outline: none;
|
||||
/*border: 1px solid #ccc;*/
|
||||
padding-left: 20px;
|
||||
/*position: absolute;*/
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #c1c1c1;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: #a8a8a8;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
::-webkit-scrollbar-track {
|
||||
background: #2d2d2d;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #555;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: #777;
|
||||
}
|
||||
}
|
|
@ -14,7 +14,14 @@ $(document).ready(function() {
|
|||
expiryDate: $('#expiryDate').val()
|
||||
};
|
||||
localStorage.setItem('licenseInfo', JSON.stringify(licenseInfo));
|
||||
$('#mask, #form').hide();
|
||||
|
||||
// Add fade out animation
|
||||
$('#form').addClass('opacity-0 scale-95');
|
||||
$('#mask').addClass('opacity-0');
|
||||
|
||||
setTimeout(() => {
|
||||
$('#mask, #form').hide().removeClass('opacity-0 scale-95');
|
||||
}, 300);
|
||||
};
|
||||
|
||||
// Function to handle search input
|
||||
|
@ -22,15 +29,52 @@ $(document).ready(function() {
|
|||
$("#product-list").load('/search?search=' + e.target.value);
|
||||
});
|
||||
|
||||
// Function to update preview
|
||||
window.updatePreview = function() {
|
||||
const licenseeName = $('#licenseeName').val() || '光云';
|
||||
const assigneeName = $('#assigneeName').val() || '藏柏';
|
||||
const expiryDate = $('#expiryDate').val() || '2111/11/11';
|
||||
|
||||
$('#previewLicenseName').text(licenseeName);
|
||||
$('#previewAssigneeName').text(assigneeName);
|
||||
$('#previewExpiryDate').text(expiryDate);
|
||||
};
|
||||
|
||||
// Function to show license form
|
||||
window.showLicenseForm = function () {
|
||||
let licenseInfo = JSON.parse(localStorage.getItem('licenseInfo'));
|
||||
$('#licenseeName').val(licenseInfo?.licenseeName || '光云');
|
||||
$('#assigneeName').val(licenseInfo?.assigneeName || '藏柏');
|
||||
$('#expiryDate').val(licenseInfo?.expiryDate || '2111-11-11');
|
||||
|
||||
// Update preview with current values
|
||||
updatePreview();
|
||||
|
||||
// Show with fade in animation
|
||||
$('#mask, #form').show();
|
||||
setTimeout(() => {
|
||||
$('#form').removeClass('opacity-0 scale-95');
|
||||
$('#mask').removeClass('opacity-0');
|
||||
}, 10);
|
||||
};
|
||||
|
||||
// Function to close modal
|
||||
window.closeModal = function() {
|
||||
$('#form').addClass('opacity-0 scale-95');
|
||||
$('#mask').addClass('opacity-0');
|
||||
|
||||
setTimeout(() => {
|
||||
$('#mask, #form').hide().removeClass('opacity-0 scale-95');
|
||||
}, 300);
|
||||
};
|
||||
|
||||
// Close modal when clicking on mask
|
||||
$('#mask').on('click', function(e) {
|
||||
if (e.target === this) {
|
||||
closeModal();
|
||||
}
|
||||
});
|
||||
|
||||
// Function to show VM options
|
||||
window.showVmoptins = function () {
|
||||
var text = "-javaagent:/(Your Path)/ja-netfilter/ja-netfilter.jar\n" +
|
||||
|
|
|
@ -5,99 +5,277 @@
|
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>Jetbrains-Help</title>
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/css/index.css">
|
||||
<link rel="icon" href="https://www.jetbrains.com/favicon.ico?r=1234">
|
||||
<script>
|
||||
tailwind.config = {
|
||||
darkMode: 'media',
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'jetbrains-blue': '#5380f7',
|
||||
'jetbrains-dark-blue': '#1d9bf0',
|
||||
'card-light': '#ffffff',
|
||||
'card-dark': '#1f2226',
|
||||
'bg-light': '#ffffff',
|
||||
'bg-dark': '#000000',
|
||||
'text-light': 'rgba(0, 0, 0, 0.87)',
|
||||
'text-dark': '#d9d9d9',
|
||||
'text-grey-light': '#9e9e9e',
|
||||
'text-grey-dark': '#6e767d',
|
||||
'border-light': 'rgba(0, 0, 0, 0.05)',
|
||||
'border-dark': '#4b4648',
|
||||
'hover-light': '#eeeeee',
|
||||
'hover-dark': 'rgba(255, 255, 255, 0.07)'
|
||||
},
|
||||
fontFamily: {
|
||||
'jetbrains': ['Gotham SSm A', 'Gotham SSm B', 'Arial Unicode MS', 'Helvetica', 'sans-serif']
|
||||
},
|
||||
boxShadow: {
|
||||
'card': 'rgb(0 0 0 / 30%) 0 8px 40px -12px',
|
||||
'card-hover': 'rgb(0 0 0 / 40%) 0 12px 50px -8px'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<header class="tip sticky flex items-center py-6">
|
||||
<p>
|
||||
🇨🇳 下载 <a href="ja-netfilter" title="Download jetbra first">ja-netfilter.zip</a> , 然后配置
|
||||
你的JetBrains IDE(anything)'s <a onclick="showVmoptins()">IDE.vmoptions</a> 配置文件!<br>
|
||||
🇨🇳 当然你也可以 <a onclick="showLicenseForm()">重新定制激活授权</a> 用以自定义你的激活信息!</br>
|
||||
<strong>🇨🇳 请注意,此页面仅由 <span
|
||||
th:text="${defaults.getDefaultLicenseName()} + '/' + ${defaults.getDefaultAssigneeName()}"></span>
|
||||
个人所有!</strong>
|
||||
</p>
|
||||
<form class="parent">
|
||||
<input type="text" class="search" id="search" placeholder="搜索IDE或者插件">
|
||||
</form>
|
||||
<body class="bg-bg-light dark:bg-bg-dark text-text-light dark:text-text-dark font-jetbrains antialiased min-h-screen">
|
||||
<!-- Header Section -->
|
||||
<header class="sticky top-0 z-50 bg-card-light dark:bg-card-dark shadow-card rounded-2xl mx-auto mt-4 w-11/12 max-w-6xl">
|
||||
<div class="flex flex-col lg:flex-row items-start lg:items-center justify-between p-6 gap-4">
|
||||
<!-- Info Section -->
|
||||
<div class="flex-1 space-y-2">
|
||||
<div class="flex items-center gap-2 text-sm lg:text-base">
|
||||
<span class="text-2xl">🇨🇳</span>
|
||||
<span>下载
|
||||
<a href="ja-netfilter"
|
||||
title="Download jetbra first"
|
||||
class="text-jetbrains-blue dark:text-jetbrains-dark-blue hover:underline font-medium transition-colors">
|
||||
ja-netfilter.zip (点击下载Jar)
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 text-sm lg:text-base">
|
||||
<span class="text-2xl">🇨🇳</span>
|
||||
<span>配置JetBrains IDE's
|
||||
<a onclick="showVmoptins()"
|
||||
class="text-jetbrains-blue dark:text-jetbrains-dark-blue hover:underline font-medium cursor-pointer transition-colors">
|
||||
IDE.vmoptions (点击复制VM配置)
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 text-sm lg:text-base">
|
||||
<span class="text-2xl">🇨🇳</span>
|
||||
<span>选择合适的IDE or Plugin, 点击复制激活码即可, 激活预览如下 ↓</span>
|
||||
</div>
|
||||
<!-- License Preview -->
|
||||
<div class="inline-block bg-gray-50 dark:bg-gray-800 rounded-lg px-4 py-2 mb-3 border border-gray-200 dark:border-gray-700">
|
||||
<span class="text-sm text-text-light dark:text-text-dark">
|
||||
授权给 <span id="previewLicenseName" th:text="${defaults.getDefaultLicenseName()}" class="font-medium">光云</span> / <span id="previewAssigneeName" th:text="${defaults.getDefaultAssigneeName()}" class="font-medium">藏柏</span>,有效期至 <span id="previewExpiryDate" th:text="${defaults.getDefaultExpiryDate()}" class="font-medium">2111/11/11</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-2 text-sm lg:text-base">
|
||||
<span class="text-2xl">🇨🇳</span>
|
||||
<span>可以
|
||||
<a onclick="showLicenseForm()"
|
||||
class="text-jetbrains-blue dark:text-jetbrains-dark-blue hover:underline font-medium cursor-pointer transition-colors">
|
||||
自定义激活信息 (点击修改)
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<!-- <div class="flex items-center gap-2 text-sm lg:text-base font-semibold">-->
|
||||
<!-- <span class="text-2xl">🇨🇳</span>-->
|
||||
<!-- <span>请注意,此页面仅由-->
|
||||
<!-- <span class="text-jetbrains-blue dark:text-jetbrains-dark-blue"-->
|
||||
<!-- th:text="${defaults.getDefaultLicenseName()} + '/' + ${defaults.getDefaultAssigneeName()}">-->
|
||||
<!-- </span>-->
|
||||
<!-- 个人所有!-->
|
||||
<!-- </span>-->
|
||||
<!-- </div>-->
|
||||
</div>
|
||||
|
||||
<!-- Search Section -->
|
||||
<div class="w-full lg:w-auto lg:min-w-[400px] xl:min-w-[500px]">
|
||||
<div class="relative">
|
||||
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
|
||||
<svg class="h-5 w-5 text-text-grey-light dark:text-text-grey-dark" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<input type="text"
|
||||
id="search"
|
||||
placeholder="搜索IDE或者插件"
|
||||
class="w-full pl-10 pr-4 py-3 bg-white dark:bg-gray-800 border border-border-light dark:border-border-dark rounded-xl text-text-light dark:text-text-dark placeholder-text-grey-light dark:placeholder-text-grey-dark focus:outline-none focus:ring-2 focus:ring-jetbrains-blue dark:focus:ring-jetbrains-dark-blue focus:border-transparent transition-all duration-200 shadow-sm hover:shadow-md">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<main id="product-list" class="px-6 z-grid py-10" style="--space: 20rem; --gutter: 3.5rem">
|
||||
<!-- Main Content -->
|
||||
<main id="product-list" class="px-4 py-8">
|
||||
<th:block th:fragment="product-list">
|
||||
<th:block th:each="product:${products}">
|
||||
<article class="card" th:data-product="${product.getName()}"
|
||||
th:data-product-codes="${product.getProductCode()}">
|
||||
<header>
|
||||
<div class="flex items-center justify-between px-6 pt-1 pb-0 bg-card radius-1">
|
||||
<div class="avatar-wrapper flex items-center justify-center overflow-hidden shrink-0">
|
||||
<div class="icon" th:classappend="${product.getIconClass()}" role="img"></div>
|
||||
<!-- Unified Products and Plugins Grid -->
|
||||
<div class="grid-container">
|
||||
<!-- Products (will be rendered first) -->
|
||||
<th:block th:each="product:${products}">
|
||||
<article class="group relative bg-card-light dark:bg-card-dark rounded-2xl shadow-card hover:shadow-card-hover transform hover:-translate-y-1 transition-all duration-300 overflow-hidden cursor-pointer"
|
||||
th:data-product="${product.getName()}"
|
||||
th:data-product-codes="${product.getProductCode()}"
|
||||
onclick="copyLicense(this)"
|
||||
title="点击复制激活码">
|
||||
|
||||
<!-- Card Content -->
|
||||
<div class="p-6 flex items-center h-32">
|
||||
<!-- Icon -->
|
||||
<div class="w-20 h-20 rounded-xl bg-white dark:bg-gray-800 shadow-sm flex items-center justify-center mr-6 flex-shrink-0 group-hover:scale-110 transition-transform duration-300">
|
||||
<div class="icon w-16 h-16 bg-contain bg-center bg-no-repeat" th:classappend="${product.getIconClass()}" role="img"></div>
|
||||
</div>
|
||||
|
||||
<!-- Product Name -->
|
||||
<h3 class="text-base font-semibold text-text-light dark:text-text-dark leading-tight group-hover:opacity-30 transition-opacity duration-300 flex-grow"
|
||||
th:title="${product.getName()}"
|
||||
th:text="${product.getName()}">
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<!-- Hover Overlay -->
|
||||
<div class="absolute inset-0 bg-card-light dark:bg-card-dark rounded-2xl flex items-center justify-center opacity-0 group-hover:opacity-95 transition-opacity duration-300">
|
||||
<div class="text-center">
|
||||
<div class="w-12 h-12 mx-auto mb-3 text-jetbrains-blue dark:text-jetbrains-dark-blue">
|
||||
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-full h-full">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="text-base font-medium text-jetbrains-blue dark:text-jetbrains-dark-blue">
|
||||
点击复制激活码
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
</header>
|
||||
<div class="pd-6 overflow-hidden bg-card container radius-1">
|
||||
<h1 class="truncate truncate-1 color-primary mt-0 overflow-ellipsis" th:title="${product.getName()}"
|
||||
th:text="${product.getName()}"></h1>
|
||||
<p title="复制到剪贴板" class="truncate text-sm text-grey" onclick="copyLicense(this)"
|
||||
data-content="复制到剪贴板">
|
||||
*********************************************************************************************************************************************************
|
||||
</p>
|
||||
</div>
|
||||
<div class="mask"></div>
|
||||
<div class="mask mask-c-1"></div>
|
||||
</article>
|
||||
</th:block>
|
||||
<th:block th:each="plugin:${plugins}">
|
||||
<article class="card" th:data-product="${plugin.getName()}"
|
||||
th:data-product-codes="${plugin.getProductCode()}">
|
||||
<header>
|
||||
<div class="flex items-center justify-between px-6 pt-1 pb-0 bg-card radius-1">
|
||||
<div class="avatar-wrapper flex items-center justify-center overflow-hidden shrink-0">
|
||||
<div class="icon" role="img"
|
||||
th:style="'background-image: url(' + ${plugin.getIcon()} + ')'"></div>
|
||||
|
||||
<!-- Subtle Shadow -->
|
||||
<div class="absolute -bottom-1 left-1/2 transform -translate-x-1/2 w-11/12 h-2 bg-gray-200 dark:bg-gray-600 rounded-2xl -z-10 opacity-30 group-hover:opacity-50 transition-opacity duration-300"></div>
|
||||
</article>
|
||||
</th:block>
|
||||
|
||||
<!-- Plugins (will be rendered after products) -->
|
||||
<th:block th:each="plugin:${plugins}">
|
||||
<article class="group relative bg-card-light dark:bg-card-dark rounded-2xl shadow-card hover:shadow-card-hover transform hover:-translate-y-1 transition-all duration-300 overflow-hidden cursor-pointer"
|
||||
th:data-product="${plugin.getName()}"
|
||||
th:data-product-codes="${plugin.getProductCode()}"
|
||||
onclick="copyLicense(this)"
|
||||
title="点击复制激活码">
|
||||
|
||||
<!-- Card Content -->
|
||||
<div class="p-6 flex items-center h-32">
|
||||
<!-- Icon -->
|
||||
<div class="w-20 h-20 rounded-xl bg-white dark:bg-gray-800 shadow-sm flex items-center justify-center mr-6 flex-shrink-0 group-hover:scale-110 transition-transform duration-300">
|
||||
<div class="icon w-16 h-16 bg-cover bg-center bg-no-repeat rounded-lg"
|
||||
role="img"
|
||||
th:style="'background-image: url(' + ${plugin.getIcon()} + ')'">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Product Name -->
|
||||
<h3 class="text-base font-semibold text-text-light dark:text-text-dark leading-tight group-hover:opacity-30 transition-opacity duration-300 flex-grow"
|
||||
th:title="${plugin.getName()}"
|
||||
th:text="${plugin.getName()}">
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<!-- Hover Overlay -->
|
||||
<div class="absolute inset-0 bg-card-light dark:bg-card-dark rounded-2xl flex items-center justify-center opacity-0 group-hover:opacity-95 transition-opacity duration-300">
|
||||
<div class="text-center">
|
||||
<div class="w-12 h-12 mx-auto mb-3 text-jetbrains-blue dark:text-jetbrains-dark-blue">
|
||||
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" class="w-full h-full">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="text-base font-medium text-jetbrains-blue dark:text-jetbrains-dark-blue">
|
||||
点击复制激活码
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
</header>
|
||||
<div class="pd-6 overflow-hidden bg-card container radius-1">
|
||||
<h1 class="truncate truncate-1 color-primary mt-0 overflow-ellipsis" th:title="${plugin.getName()}"
|
||||
th:text="${plugin.getName()}"></h1>
|
||||
<p title="复制到剪贴板" class="truncate text-sm text-grey" onclick="copyLicense(this)"
|
||||
data-content="复制到剪贴板">
|
||||
*********************************************************************************************************************************************************
|
||||
</p>
|
||||
</div>
|
||||
<div class="mask"></div>
|
||||
<div class="mask mask-c-1"></div>
|
||||
</article>
|
||||
</th:block>
|
||||
|
||||
<!-- Subtle Shadow -->
|
||||
<div class="absolute -bottom-1 left-1/2 transform -translate-x-1/2 w-11/12 h-2 bg-gray-200 dark:bg-gray-600 rounded-2xl -z-10 opacity-30 group-hover:opacity-50 transition-opacity duration-300"></div>
|
||||
</article>
|
||||
</th:block>
|
||||
</div>
|
||||
</th:block>
|
||||
</main>
|
||||
<div id="mask"
|
||||
style="position:fixed;top:0;left:0;z-index:998;width:100%;height:100%;display:none;background-color:#000;opacity:0.5;overflow:hidden;"></div>
|
||||
<div id="form" style="position:fixed;top:20%;left:40%;width:40%;height:500px;z-index:999;display:none;">
|
||||
<div class="form">
|
||||
<div class="title">授权信息</div>
|
||||
<div class="subtitle">欢迎你自定义</div>
|
||||
<div class="input-container ic1">
|
||||
<input id="licenseeName" class="input" type="text" placeholder=" "
|
||||
th:value="${defaults.getDefaultLicenseName()}"/>
|
||||
<div class="cut"></div>
|
||||
<label for="licenseeName" class="placeholder">许可证名称</label>
|
||||
<!-- Modal Overlay -->
|
||||
<div id="mask" class="fixed inset-0 bg-black bg-opacity-40 backdrop-blur-sm z-40 hidden opacity-0 transition-all duration-300"></div>
|
||||
|
||||
<!-- License Form Modal -->
|
||||
<div id="form" class="fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 z-50 hidden opacity-0 scale-95 transition-all duration-300">
|
||||
<div class="bg-white dark:bg-gray-800 rounded-xl p-6 w-80 shadow-lg border border-gray-200 dark:border-gray-700">
|
||||
<!-- Close Button -->
|
||||
<div class="flex justify-end mb-3">
|
||||
<button onclick="closeModal()" class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors duration-200">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="input-container ic2">
|
||||
<input id="assigneeName" class="input" type="text" placeholder=" "
|
||||
th:value="${defaults.getDefaultAssigneeName()}"/>
|
||||
<div class="cut"></div>
|
||||
<label for="assigneeName" class="placeholder">许可人名称</label>
|
||||
|
||||
<!-- Modal Header -->
|
||||
<div class="text-center mb-6">
|
||||
<h2 class="text-lg font-semibold text-gray-800 dark:text-gray-200 mb-1">授权信息定制</h2>
|
||||
<p class="text-sm text-gray-500 dark:text-gray-400">自定义您的激活授权信息</p>
|
||||
</div>
|
||||
<div class="input-container ic2">
|
||||
<input id="expiryDate" class="input" type="text" placeholder=""
|
||||
th:value="${defaults.getDefaultExpiryDate()}"/>
|
||||
<div class="cut cut-short"></div>
|
||||
<label for="expiryDate" class="placeholder">过期时间</label>
|
||||
|
||||
<!-- Form Fields -->
|
||||
<div class="space-y-4">
|
||||
<!-- License Name Field -->
|
||||
<div class="space-y-1">
|
||||
<label for="licenseeName" class="block text-xs font-medium text-gray-600 dark:text-gray-400">
|
||||
许可证名称
|
||||
</label>
|
||||
<input id="licenseeName"
|
||||
type="text"
|
||||
th:value="${defaults.getDefaultLicenseName()}"
|
||||
oninput="updatePreview()"
|
||||
class="w-full px-3 py-2 text-sm bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-800 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 focus:border-transparent transition-all duration-200">
|
||||
</div>
|
||||
|
||||
<!-- Assignee Name Field -->
|
||||
<div class="space-y-1">
|
||||
<label for="assigneeName" class="block text-xs font-medium text-gray-600 dark:text-gray-400">
|
||||
许可人名称
|
||||
</label>
|
||||
<input id="assigneeName"
|
||||
type="text"
|
||||
th:value="${defaults.getDefaultAssigneeName()}"
|
||||
oninput="updatePreview()"
|
||||
class="w-full px-3 py-2 text-sm bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-800 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 focus:border-transparent transition-all duration-200">
|
||||
</div>
|
||||
|
||||
<!-- Expiry Date Field -->
|
||||
<div class="space-y-1">
|
||||
<label for="expiryDate" class="block text-xs font-medium text-gray-600 dark:text-gray-400">
|
||||
过期时间
|
||||
</label>
|
||||
<input id="expiryDate"
|
||||
type="text"
|
||||
th:value="${defaults.getDefaultExpiryDate()}"
|
||||
oninput="updatePreview()"
|
||||
class="w-full px-3 py-2 text-sm bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-800 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 focus:border-transparent transition-all duration-200">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Action Buttons -->
|
||||
<div class="flex gap-2 mt-6">
|
||||
<button onclick="closeModal()"
|
||||
class="flex-1 px-4 py-2 text-sm bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 font-medium rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-gray-300 dark:focus:ring-gray-500">
|
||||
取消
|
||||
</button>
|
||||
<button onclick="submitLicenseInfo(this)"
|
||||
class="flex-1 px-4 py-2 text-sm bg-blue-500 dark:bg-blue-600 text-white font-medium rounded-lg hover:bg-blue-600 dark:hover:bg-blue-500 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400">
|
||||
确认保存
|
||||
</button>
|
||||
</div>
|
||||
<button class="submit" onclick="submitLicenseInfo(this)">确认</button>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
Loading…
Reference in New Issue
Block a user