Release v2.0.0
CI / Windows baseline (push) Canceled after 0s

This commit is contained in:
2026-09-10 20:59:52 +03:00
parent 9c987df6e9
commit efda8eb98f
142 changed files with 68308 additions and 9333 deletions
+393 -198
View File
@@ -1342,6 +1342,47 @@ button:disabled {
padding: 0 18px clamp(34px, 10vh, 92px);
}
.summary-state-copy {
grid-column: 1 / -1;
margin: 0;
color: var(--text-secondary);
font-size: 12px;
line-height: 1.5;
text-align: center;
}
.summary-main:has(.summary-state-copy) {
grid-template-rows: minmax(0, 1fr) auto;
row-gap: 12px;
padding-bottom: 24px;
}
.simple-panel:has(.startup-error) {
grid-template-rows: auto minmax(0, 1fr);
gap: 12px;
}
.startup-error {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 10px 14px;
border: 1px solid var(--border-strong);
border-radius: 8px;
background: var(--surface-raised);
color: var(--text-secondary);
font-size: 12px;
line-height: 1.5;
}
.startup-error p {
margin: 0;
}
.startup-error button {
flex-shrink: 0;
}
.summary-status-control {
position: relative;
isolation: isolate;
@@ -1812,130 +1853,6 @@ button.summary-card:hover {
box-shadow: 0 0 0 4px rgba(96, 165, 250, 0.14);
}
.setup-strip {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: 10px;
align-items: center;
min-height: 42px;
border: 0;
border-radius: 8px;
background: var(--surface-panel);
padding: 7px 10px;
}
.setup-strip.with-progress {
row-gap: 8px;
}
.setup-strip-title {
color: #8d99ae;
font-size: 12px;
font-weight: 800;
}
.setup-strip-items {
display: flex;
gap: 7px;
min-width: 0;
overflow-x: auto;
scrollbar-width: thin;
}
.setup-strip-item {
display: inline-flex;
flex: 0 0 auto;
gap: 7px;
align-items: center;
min-height: 28px;
border: 1px solid #2b3342;
border-radius: 999px;
background: #151b25;
color: #dbeafe;
padding: 5px 9px;
}
.setup-strip-dot {
width: 8px;
height: 8px;
border-radius: 999px;
background: #f59e0b;
box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.11);
}
.setup-strip-item.installed .setup-strip-dot {
background: #22c55e;
box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.11);
}
.setup-strip-item.active {
border-color: #60a5fa;
background: #122033;
}
.setup-strip-item.active .setup-strip-dot {
background: #60a5fa;
box-shadow: 0 0 0 3px rgba(96, 165, 250, 0.14);
}
.setup-strip-item.failed {
border-color: #ef4444;
background: #26151a;
}
.setup-strip-item.failed .setup-strip-dot {
background: #ef4444;
box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.12);
}
.setup-strip-item strong {
font-size: 12px;
white-space: nowrap;
}
.setup-strip-item span:not(.setup-strip-dot) {
color: #9aa8bd;
font-size: 12px;
white-space: nowrap;
}
.setup-progress {
display: grid;
grid-column: 1 / -1;
grid-template-columns: minmax(96px, 160px) minmax(0, 1fr);
gap: 9px;
align-items: center;
}
.setup-progress-track {
overflow: hidden;
height: 6px;
border-radius: 999px;
background: #202a38;
}
.setup-progress-fill {
display: block;
width: 0;
height: 100%;
border-radius: inherit;
background: #60a5fa;
transition: width 180ms ease;
}
.setup-progress--failed .setup-progress-fill {
background: #ef4444;
}
.setup-progress-message {
min-width: 0;
overflow: hidden;
color: #9aa8bd;
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
.service-actions {
position: relative;
display: flex;
@@ -2597,9 +2514,8 @@ button.summary-card:hover {
}
.changes-actions .ui-button-label {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
white-space: normal;
overflow-wrap: anywhere;
}
.section-head span {
@@ -3031,12 +2947,18 @@ button.summary-card:hover {
.log-history {
position: absolute;
right: 0;
bottom: 100%;
bottom: calc(100% + var(--app-change-dock-height));
left: 0;
display: grid;
grid-column: 1 / -1;
gap: 6px;
max-height: 230px;
max-height: min(
230px,
calc(
100vh - var(--app-header-height) - var(--app-footer-height) -
var(--app-change-dock-height) - 12px
)
);
overflow: auto;
border: 1px solid #2b3342;
border-bottom: 0;
@@ -3395,8 +3317,6 @@ button.summary-card:hover {
.finder-card,
.ui-service-row,
.connection-check,
.setup-strip,
.setup-strip-item,
.external-proxy-card,
.singbox-workspace,
.subscription-icon,
@@ -3454,7 +3374,6 @@ button.summary-card:hover {
.finder-card,
.ui-service-row,
.connection-check,
.setup-strip,
.external-proxy-card,
.apps-section,
.app-add-skeleton,
@@ -3586,7 +3505,6 @@ button.summary-card:hover {
.ui-service-dot,
.status-light,
.setup-strip-dot,
.route-chain-dot,
.server-select-dot {
border: 0;
@@ -3605,58 +3523,6 @@ button.summary-card:hover {
transform: scale(1.22);
}
.setup-strip {
padding: 8px 2px;
}
.setup-strip-items {
gap: 12px;
}
.setup-strip-item {
position: relative;
gap: 6px;
min-height: 28px;
border-radius: 0;
background: transparent;
padding: 4px 2px;
animation: float-item-in 520ms var(--ease-out) both;
transition:
color 600ms var(--ease-out),
filter 600ms var(--ease-out),
opacity 240ms var(--ease-out),
transform 240ms var(--ease-out);
}
.setup-strip-item:nth-child(2) {
animation-delay: 70ms;
}
.setup-strip-item:nth-child(3) {
animation-delay: 140ms;
}
.setup-strip-item:hover {
filter: drop-shadow(0 0 12px oklch(0.68 0.11 185 / 0.12));
transform: translateY(-1px);
}
.setup-strip-item.active,
.setup-strip-item.failed {
border: 0;
background: transparent;
}
.setup-progress-track {
background: oklch(0.68 0.11 185 / 0.08);
}
.setup-progress-fill {
background: var(--accent);
box-shadow: 0 0 16px oklch(0.68 0.11 185 / 0.42);
transition: width 900ms var(--ease-out);
}
.connection-check {
display: grid;
gap: 0;
@@ -4562,7 +4428,7 @@ button.summary-card:hover {
}
.log-history {
background: color-mix(in oklch, var(--surface-raised) 86%, transparent);
background: var(--surface-raised);
box-shadow: 0 -18px 48px oklch(0.08 0.012 145 / 0.3);
backdrop-filter: blur(18px);
animation: dock-arrive 240ms var(--ease-out);
@@ -4577,6 +4443,58 @@ button.summary-card:hover {
transform 240ms var(--ease-out);
}
.log-history-row > div {
min-width: 0;
}
.profile-toggle.ui-button {
min-width: 180px;
min-height: 40px;
padding: 6px 10px;
color: var(--text-secondary);
background: transparent;
}
.profile-toggle .ui-button-label {
display: inline-flex;
align-items: center;
gap: 9px;
font-size: 12px;
}
.profile-toggle-track {
position: relative;
display: inline-block;
flex: 0 0 28px;
height: 16px;
border-radius: 8px;
background: color-mix(
in oklch,
var(--text-secondary) 25%,
var(--surface-raised)
);
}
.profile-toggle-track::after {
content: "";
position: absolute;
top: 3px;
left: 3px;
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--text-secondary);
}
.profile-toggle[aria-checked="true"] .profile-toggle-track {
background: oklch(0.68 0.11 185 / 0.25);
}
.profile-toggle[aria-checked="true"] .profile-toggle-track::after {
transform: translateX(12px);
background: oklch(0.78 0.065 185);
}
.log-history-row:hover {
background: color-mix(in oklch, var(--surface-panel) 58%, transparent);
transform: translateX(2px);
@@ -4904,7 +4822,6 @@ button.summary-card:hover {
.ui-tab:hover,
.ui-service-row:hover,
.finder-card:hover,
.setup-strip-item:hover,
.connection-probe-row:hover,
.connection-result:hover,
.connection-result:focus-visible,
@@ -5096,11 +5013,6 @@ button.summary-card:hover {
width: min(202px, 64vw);
}
.setup-strip {
grid-template-columns: 1fr;
align-items: stretch;
}
.apps-header {
grid-template-columns: 1fr;
min-height: 0;
@@ -5242,11 +5154,6 @@ button.summary-card:hover {
grid-column: 1 / -1;
}
.setup-strip-items {
flex-wrap: wrap;
overflow: visible;
}
.service-button {
flex: 1;
}
@@ -5320,7 +5227,6 @@ button.summary-card:hover {
}
.log-history {
max-height: 220px;
padding: 7px 10px;
}
@@ -5398,3 +5304,292 @@ button.summary-card:hover {
width: 100%;
}
}
/* Local component packages and explicit legacy cutover. */
.component-management-stack {
display: grid;
gap: 10px;
min-width: 0;
}
.component-package-status,
.migration-notice {
min-width: 0;
border-radius: 14px;
background: color-mix(in oklch, var(--surface-panel) 44%, transparent);
padding: 14px;
}
.component-package-status {
display: grid;
gap: 10px;
min-block-size: 340px;
}
.component-package-head,
.migration-notice-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 14px;
min-width: 0;
}
.component-package-head > div,
.migration-notice-head > div {
min-width: 0;
}
.component-package-head > div > span,
.migration-notice-head > div > span,
.component-package-versions dt {
color: var(--text-muted);
font-size: 10px;
font-weight: 750;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.component-package-head h3,
.migration-notice-head h3 {
margin: 3px 0 0;
color: var(--text-primary);
font-size: 15px;
line-height: 1.3;
overflow-wrap: anywhere;
}
.component-package-summary,
.migration-notice-detail,
.migration-storage-result {
color: var(--text-secondary);
font-size: 12px;
line-height: 1.5;
margin: 0;
overflow-wrap: anywhere;
}
.component-package-summary {
block-size: 44px;
overflow: auto;
}
.component-package-versions {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 8px;
margin: 0;
}
.component-package-versions > div {
display: grid;
align-content: start;
gap: 4px;
min-width: 0;
block-size: 64px;
border-radius: 10px;
background: color-mix(in oklch, var(--surface-inset) 48%, transparent);
padding: 8px 9px;
}
.component-package-versions dd {
display: -webkit-box;
min-width: 0;
min-height: 32px;
max-height: 32px;
color: var(--text-primary);
font-size: 12px;
font-variant-numeric: tabular-nums;
line-height: 1.35;
margin: 0;
overflow: hidden;
overflow-wrap: anywhere;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.component-package-actions {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
}
.component-package-actions .ui-button {
width: 100%;
min-width: 0;
min-height: 40px;
max-height: 40px;
white-space: normal;
}
.component-package-reasons,
.component-package-feedback,
.migration-disabled-reason,
.migration-notice-feedback {
min-width: 0;
color: var(--text-muted);
font-size: 10px;
line-height: 1.45;
overflow-wrap: anywhere;
}
.component-package-reasons,
.migration-disabled-reason {
min-height: 36px;
max-height: 36px;
overflow: auto;
margin: 0;
}
.component-package-feedback,
.migration-notice-feedback {
min-height: 36px;
max-height: 36px;
overflow: auto;
}
.component-package-feedback p,
.migration-notice-feedback p {
margin: 0;
}
.component-package-feedback .neutral,
.migration-notice-feedback .neutral {
color: var(--text-secondary);
}
.component-package-feedback .error,
.migration-notice-feedback .error {
color: oklch(0.78 0.1 28);
}
.migration-notice {
--migration-tone: var(--text-muted);
position: relative;
isolation: isolate;
display: grid;
gap: 10px;
overflow: hidden;
}
.migration-notice::before {
position: absolute;
top: 14px;
bottom: 14px;
left: 0;
width: 2px;
border-radius: 999px;
background: var(--migration-tone);
box-shadow: 0 0 14px
color-mix(in oklch, var(--migration-tone) 42%, transparent);
content: "";
}
.migration-notice--ok {
--migration-tone: oklch(0.76 0.12 155);
}
.migration-notice--warning {
--migration-tone: oklch(0.8 0.12 82);
}
.migration-notice--error {
--migration-tone: oklch(0.78 0.1 28);
}
.migration-notice--checking {
--migration-tone: oklch(0.8 0.09 215);
}
.migration-storage-result {
min-height: 18px;
color: var(--text-muted);
}
.migration-action-slot {
display: flex;
align-items: center;
justify-content: flex-end;
min-height: 36px;
}
.migration-action-slot .ui-button {
min-width: min(100%, 236px);
}
.migration-cleanup-action {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 14px;
align-items: center;
min-height: 66px;
border: 1px solid oklch(0.62 0.16 28 / 0.24);
border-radius: 10px;
background: oklch(0.62 0.16 28 / 0.06);
padding: 10px 11px;
}
.migration-cleanup-action > div {
display: grid;
gap: 3px;
min-width: 0;
}
.migration-cleanup-action strong {
color: oklch(0.84 0.09 28);
font-size: 11px;
}
.migration-cleanup-action span {
color: var(--text-secondary);
font-size: 10px;
line-height: 1.4;
overflow-wrap: anywhere;
}
.migration-cleanup-action .ui-button {
min-width: 184px;
}
.migration-cleanup-action > .migration-cleanup-buttons {
display: grid;
gap: 6px;
}
.summary-toggle-button.summary-toggle-indicator {
cursor: default;
}
.summary-toggle-button.summary-toggle-indicator:hover:not(:disabled),
.summary-toggle-button.summary-toggle-indicator:active:not(:disabled) {
filter: none;
transform: none;
}
@media (max-width: 680px) {
.component-package-versions {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.component-package-actions {
grid-template-columns: 1fr;
}
.migration-cleanup-action {
grid-template-columns: 1fr;
}
.migration-cleanup-action .ui-button,
.migration-action-slot .ui-button {
width: 100%;
min-width: 0;
}
}
@media (max-width: 480px) {
.component-package-head,
.migration-notice-head {
align-items: flex-start;
flex-direction: column;
}
}
+334
View File
@@ -0,0 +1,334 @@
/* ProxiFyre: a compact, readable application list. */
#panel-proxifyre {
gap: 18px;
padding-block: 8px 24px;
}
.proxifyre-card {
grid-template-columns: auto minmax(0, 1fr) auto;
min-height: 48px;
border-radius: 12px;
background: color-mix(in oklch, var(--surface-panel) 32%, transparent);
padding: 8px 10px;
}
.proxifyre-card .ui-service-dot {
width: 8px;
height: 8px;
}
.proxifyre-card .ui-service-title-line > strong {
font-size: 13px;
font-weight: 720;
}
.proxifyre-card .ui-service-text > span {
color: var(--text-muted);
font-size: 10px;
line-height: 1.4;
}
.proxifyre-card .ui-service-actions > .ui-button {
min-height: 32px;
padding: 6px 10px;
font-size: 11px;
}
.apps-section {
margin-top: 0;
padding: 0 4px;
}
.application-stage {
width: min(100%, 720px);
margin-inline: auto;
}
.application-panel {
position: relative;
z-index: 2;
display: grid;
gap: 8px;
width: min(100%, 720px);
margin-inline: auto;
border-radius: 14px;
background: var(--surface-panel);
box-shadow: 0 18px 48px oklch(0.08 0.012 145 / 0.14);
padding: 10px 12px 12px;
}
.application-list-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 42px;
padding: 0 4px 2px 8px;
}
.application-list-heading {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
min-width: 0;
}
.application-list-heading strong {
color: var(--text-secondary);
font-size: 12px;
font-weight: 720;
}
.application-list-heading > span {
color: var(--text-muted);
font-size: 10px;
font-variant-numeric: tabular-nums;
}
.application-add-actions {
display: flex;
align-items: center;
gap: 4px;
}
.application-add-actions .ui-icon-button {
width: 40px;
min-width: 40px;
min-height: 40px;
border: 0;
border-radius: 50%;
background: transparent;
color: var(--text-muted);
}
.application-add-actions .ui-icon-button:hover:not(:disabled) {
background: var(--accent-soft);
color: oklch(0.82 0.08 185);
}
.application-process-anchor {
display: flex;
}
.application-process-popover {
position: fixed;
z-index: 95;
display: grid;
gap: 9px;
border-radius: 10px;
background: var(--surface-raised);
box-shadow: 0 16px 42px oklch(0.08 0.012 145 / 0.42);
padding: 11px;
transform-origin: top center;
animation: process-popover-in 160ms var(--ease-out);
}
.application-process-popover[data-placement="top"] {
transform-origin: bottom center;
}
.application-process-popover label {
color: var(--text-secondary);
font-size: 10px;
font-weight: 720;
}
.application-process-popover input {
min-width: 0;
min-height: 36px;
border: 0;
border-radius: 8px 8px 3px 3px;
background: color-mix(in oklch, var(--surface-inset) 82%, transparent);
box-shadow: inset 0 -1px var(--border-strong);
color: var(--text-primary);
outline: 0;
padding: 7px 10px;
transition:
background-color 240ms var(--ease-out),
box-shadow 600ms var(--ease-out);
}
.application-process-popover input:focus {
box-shadow:
inset 0 -1px var(--accent),
0 9px 24px oklch(0.68 0.11 185 / 0.08);
}
.application-process-popover-actions {
display: flex;
justify-content: flex-end;
gap: 6px;
}
@keyframes process-popover-in {
from {
opacity: 0;
transform: translateY(-4px) scale(0.98);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.application-list {
display: grid;
gap: 2px;
min-width: 0;
}
.application-list-row {
position: relative;
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 10px;
min-height: 50px;
border-radius: 10px;
padding: 5px 4px 5px 8px;
transition:
background-color 300ms var(--ease-out),
transform 300ms var(--ease-out);
}
.application-list-row::before {
position: absolute;
top: 12px;
bottom: 12px;
left: 0;
width: 2px;
border-radius: 999px;
background: var(--text-muted);
content: "";
opacity: 0;
transform: scaleY(0.35);
transition:
opacity 200ms var(--ease-out),
transform 260ms var(--ease-out);
}
.application-list-row:hover {
background: color-mix(in oklch, var(--surface-raised) 28%, transparent);
transform: translateX(3px);
}
.application-list-row:hover::before {
opacity: 0.58;
transform: scaleY(1);
}
.application-list-row-icon {
display: grid;
place-items: center;
width: 30px;
height: 30px;
color: var(--text-muted);
transition: color 420ms var(--ease-out);
}
.application-list-row:hover .application-list-row-icon {
color: var(--text-primary);
}
.application-list-row-copy {
display: grid;
gap: 2px;
min-width: 0;
}
.application-list-row-copy strong,
.application-list-row-copy span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.application-list-row-copy strong {
color: var(--text-secondary);
font-size: 11px;
font-weight: 680;
}
.application-list-row-copy span {
color: var(--text-muted);
font-size: 9px;
}
.application-list-row .ui-icon-button {
width: 40px;
min-width: 40px;
min-height: 40px;
border: 0;
border-radius: 50%;
background: transparent;
color: var(--text-muted);
opacity: 0.54;
}
.application-list-row:hover .ui-icon-button,
.application-list-row .ui-icon-button:focus-visible {
opacity: 1;
}
.application-list-row .ui-icon-button:hover:not(:disabled) {
background: oklch(0.58 0.13 28 / 0.12);
color: oklch(0.8 0.08 28);
}
.application-empty-state {
min-height: 78px;
display: grid;
place-items: center;
color: var(--text-muted);
font-size: 10px;
text-align: center;
}
@media (max-width: 680px) {
#panel-proxifyre {
gap: 14px;
}
.proxifyre-card {
grid-template-columns: auto minmax(0, 1fr) auto;
}
.proxifyre-card .ui-service-actions {
grid-column: auto;
display: flex;
width: auto;
}
.proxifyre-card .ui-service-actions > .ui-button {
width: auto;
}
}
@media (max-width: 430px) {
.proxifyre-card {
grid-template-columns: auto minmax(0, 1fr);
}
.proxifyre-card .ui-service-actions {
grid-column: 1 / -1;
justify-content: flex-end;
}
}
@media (prefers-reduced-motion: reduce) {
.application-process-popover,
.application-list-row,
.application-list-row::before,
.application-list-row-icon {
animation: none;
transition: none;
}
.application-list-row:hover {
transform: none;
}
}