.proxy-page { width: 100%; max-width: 1440px; margin: 0 auto; animation: proxy-page-in .18s ease-out; } .proxy-page-heading { align-items: flex-start; } .proxy-page-heading > div:first-child { min-width: 0; } .proxy-heading-actions, .proxy-editor-actions, .proxy-inspector-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .proxy-profile-workspace, .proxy-source-workspace { min-height: 610px; display: grid; grid-template-columns: minmax(240px, 300px) minmax(0, 1fr); border: 1px solid var(--border); border-radius: var(--radius-md); overflow: hidden; background: var(--surface); box-shadow: var(--shadow-sm); } .proxy-profile-index, .proxy-source-index { min-width: 0; border-right: 1px solid var(--border); background: var(--surface-subtle); } .proxy-panel-label { min-height: 43px; padding: 0 14px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--border); color: var(--muted-strong); font-size: var(--text-xs); font-weight: 600; } .proxy-panel-label strong { min-width: 24px; padding: 2px 6px; border-radius: 999px; background: var(--surface); color: var(--muted-strong); font-size: var(--text-xs); text-align: center; } .proxy-profile-list, .proxy-source-list { padding: 6px; display: grid; gap: 2px; } .proxy-profile-list > button, .proxy-source-list > button { width: 100%; min-width: 0; min-height: 54px; padding: 7px 9px; display: grid; align-items: center; gap: 9px; border: 1px solid transparent; border-radius: var(--radius-md); background: transparent; color: var(--foreground); text-align: left; cursor: pointer; transition: background-color .14s ease, border-color .14s ease, box-shadow .14s ease; } .proxy-profile-list > button { grid-template-columns: 30px minmax(0, 1fr) auto 15px; } .proxy-source-list > button { grid-template-columns: 12px minmax(0, 1fr) auto 15px; } .proxy-profile-list > button:hover, .proxy-source-list > button:hover { background: var(--surface); } .proxy-profile-list > button:focus-visible, .proxy-source-list > button:focus-visible, .proxy-rule-row:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--focus); } .proxy-profile-list > button.is-selected, .proxy-source-list > button.is-selected { border-color: color-mix(in srgb, var(--primary) 22%, var(--border)); background: var(--surface); box-shadow: var(--shadow-sm); } .proxy-profile-list > button > span:nth-child(2), .proxy-source-list > button > span:nth-child(2) { min-width: 0; } .proxy-profile-list strong, .proxy-profile-list small, .proxy-source-list strong, .proxy-source-list small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-profile-list strong, .proxy-source-list strong { font-size: var(--text-sm); line-height: 17px; } .proxy-profile-list small, .proxy-source-list small { margin-top: 2px; color: var(--muted); font-size: var(--text-xs); line-height: 15px; } .proxy-profile-list > button > i, .proxy-source-list > button > i { color: var(--muted); font-size: var(--text-xs); font-style: normal; white-space: nowrap; } .proxy-profile-list > button.is-active > i { color: var(--success); font-weight: 600; } .proxy-profile-list > button > svg, .proxy-source-list > button > svg { color: var(--muted); } .proxy-profile-icon { width: 30px; height: 30px; display: grid; place-items: center; border: 1px solid var(--border); border-radius: 7px; background: var(--surface); color: var(--muted-strong); } .proxy-profile-list > button.is-selected .proxy-profile-icon { border-color: color-mix(in srgb, var(--primary) 26%, var(--border)); background: var(--primary-soft); color: var(--primary); } .proxy-source-item { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) 54px; align-items: center; border: 1px solid transparent; border-radius: var(--radius-md); transition: background-color .14s ease, border-color .14s ease, box-shadow .14s ease; } .proxy-source-item:hover { background: var(--surface); } .proxy-source-item.is-selected { border-color: color-mix(in srgb, var(--primary) 22%, var(--border)); background: var(--surface); box-shadow: var(--shadow-sm); } .proxy-source-select { min-width: 0; min-height: 54px; padding: 7px 3px 7px 9px; display: grid; grid-template-columns: 12px minmax(0, 1fr) auto 15px; align-items: center; gap: 9px; border: 0; background: transparent; color: var(--foreground); text-align: left; cursor: pointer; } .proxy-source-select:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--focus); } .proxy-source-select > span:nth-child(2) { min-width: 0; } .proxy-source-select strong, .proxy-source-select small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-source-select strong { font-size: var(--text-sm); line-height: 17px; } .proxy-source-select small { margin-top: 2px; color: var(--muted); font-size: var(--text-xs); line-height: 15px; } .proxy-source-select > i { color: var(--muted); font-size: var(--text-xs); font-style: normal; white-space: nowrap; } .proxy-source-select > svg { color: var(--muted); } .proxy-source-order { display: flex; align-items: center; gap: 1px; opacity: .35; transition: opacity .14s ease; } .proxy-source-item:hover .proxy-source-order, .proxy-source-item.is-selected .proxy-source-order { opacity: 1; } .proxy-source-order .ui-button { width: 24px; height: 24px; } .proxy-profile-editor, .proxy-source-main, .proxy-rule-inspector { min-width: 0; background: var(--surface); } .proxy-profile-editor, .proxy-source-editor, .proxy-rule-inspector { padding: 22px 24px 24px; } .proxy-editor-heading { min-height: 48px; margin-bottom: 22px; padding-bottom: 16px; display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; border-bottom: 1px solid var(--border); } .proxy-editor-heading > div { min-width: 0; } .proxy-editor-heading span, .proxy-editor-heading h2 { display: block; } .proxy-editor-heading span { color: var(--muted); font-size: var(--text-xs); line-height: 16px; } .proxy-editor-heading h2 { margin: 2px 0 0; overflow: hidden; color: var(--foreground); font-size: 18px; line-height: 24px; text-overflow: ellipsis; white-space: nowrap; } .proxy-live-state, .proxy-inline-switch { min-height: 30px; display: inline-flex !important; align-items: center; gap: 7px; color: var(--muted-strong) !important; white-space: nowrap; } .proxy-live-state i { width: 7px; height: 7px; border-radius: 50%; background: var(--muted); } .proxy-live-state.is-live { color: var(--success) !important; } .proxy-live-state.is-live i { background: var(--success); box-shadow: 0 0 0 3px var(--success-soft); } .proxy-form-grid, .proxy-source-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; } .proxy-form-grid > label:has(textarea), .proxy-form-grid > label:has(input[placeholder*="PAC"]), .proxy-source-form > label:nth-child(2) { grid-column: 1 / -1; } .proxy-auth-section { margin-top: 22px; border-top: 1px solid var(--border); } .proxy-auth-section > label { min-height: 64px; display: flex; align-items: center; justify-content: space-between; gap: 16px; } .proxy-auth-section > label > span:first-child { min-width: 0; display: flex; align-items: flex-start; gap: 10px; } .proxy-auth-section > label svg { margin-top: 2px; color: var(--muted-strong); } .proxy-auth-section strong, .proxy-auth-section small { display: block; } .proxy-auth-section strong { font-size: var(--text-sm); } .proxy-auth-section small { margin-top: 2px; color: var(--muted); font-size: var(--text-xs); } .proxy-auth-fields { padding: 16px; display: grid; grid-template-columns: 1fr 1fr; gap: 14px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-subtle); } .proxy-editor-actions, .proxy-inspector-actions { margin-top: 22px; padding-top: 16px; border-top: 1px solid var(--border); } /* Automatic routing control plane */ .proxy-apply-band { min-height: 86px; margin-bottom: 14px; padding: 12px 16px; display: grid; grid-template-columns: minmax(220px, 1.3fr) minmax(150px, .7fr) minmax(150px, .7fr) auto; align-items: end; gap: 14px; border: 1px solid var(--border); border-left: 3px solid var(--muted); border-radius: var(--radius-md); background: var(--surface); box-shadow: var(--shadow-sm); } .proxy-apply-band.is-active { border-left-color: var(--success); } .proxy-apply-band.is-dirty { border-left-color: var(--warning); } .proxy-mode-state { min-width: 0; align-self: center; } .proxy-mode-state span, .proxy-mode-state strong { display: flex; align-items: center; } .proxy-mode-state span { gap: 7px; color: var(--foreground); font-size: var(--text-md); font-weight: 600; } .proxy-mode-state span i { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); } .proxy-apply-band.is-active .proxy-mode-state span i { background: var(--success); box-shadow: 0 0 0 3px var(--success-soft); } .proxy-apply-band.is-dirty .proxy-mode-state span i { background: var(--warning); box-shadow: 0 0 0 3px var(--warning-soft); } .proxy-mode-state strong { margin-top: 5px; color: var(--muted); font-size: var(--text-xs); font-weight: 500; } .proxy-compile-metrics { min-height: 38px; padding: 0 12px; display: flex; align-items: center; gap: 12px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-subtle); white-space: nowrap; } .proxy-compile-metrics span { color: var(--muted); font-size: var(--text-xs); } .proxy-compile-metrics strong { color: var(--foreground); font-variant-numeric: tabular-nums; } .proxy-runtime-alert, .proxy-source-message { margin-bottom: 14px; padding: 10px 12px; display: flex; align-items: flex-start; gap: 9px; border-left: 3px solid var(--danger); background: var(--danger-soft); color: var(--danger); font-size: var(--text-xs); line-height: 17px; } .proxy-runtime-alert svg, .proxy-source-message svg { margin-top: 1px; flex: 0 0 auto; } .proxy-runtime-alert strong { display: block; margin-bottom: 2px; } .proxy-route-probe { min-height: 52px; margin-bottom: 14px; display: grid; grid-template-columns: minmax(330px, .9fr) minmax(0, 1.1fr); border: 1px solid var(--border); border-radius: var(--radius-md); overflow: hidden; background: var(--surface); } .proxy-probe-input { min-width: 0; padding: 8px 10px 8px 13px; display: flex; align-items: center; gap: 8px; border-right: 1px solid var(--border); color: var(--muted); } .proxy-probe-input input { min-width: 0; flex: 1; border: 0; background: transparent; color: var(--foreground); outline: 0; font-size: var(--text-sm); } .proxy-probe-result, .proxy-probe-placeholder { min-width: 0; padding: 8px 14px; display: flex; align-items: center; gap: 8px; } .proxy-probe-result span { padding: 2px 6px; border-radius: 4px; background: var(--primary-soft); color: var(--primary-text); font-size: var(--text-xs); white-space: nowrap; } .proxy-probe-result strong, .proxy-probe-result b, .proxy-probe-result small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-probe-result strong, .proxy-probe-result b { font-size: var(--text-sm); } .proxy-probe-result i { color: var(--muted); font-style: normal; } .proxy-probe-result small, .proxy-probe-placeholder { color: var(--muted); font-size: var(--text-xs); } .proxy-probe-result small { margin-left: auto; } .proxy-current-site { min-height: 54px; margin-bottom: 14px; padding: 8px 12px; display: flex; align-items: center; justify-content: space-between; gap: 14px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-subtle); } .proxy-current-site > div { min-width: 0; display: flex; align-items: center; gap: 9px; } .proxy-current-site > div:first-child svg { color: var(--primary); } .proxy-current-site strong, .proxy-current-site small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-current-site strong { font-size: var(--text-sm); } .proxy-current-site small { margin-top: 1px; color: var(--muted); font-size: var(--text-xs); } .proxy-rule-workspace { min-height: 585px; display: grid; grid-template-columns: minmax(620px, 1.65fr) minmax(300px, .85fr); border: 1px solid var(--border); border-radius: var(--radius-md); overflow: hidden; background: var(--surface); box-shadow: var(--shadow-sm); } .proxy-rule-table { min-width: 0; border-right: 1px solid var(--border); } .proxy-table-toolbar, .proxy-table-head, .proxy-rule-head { min-height: 44px; padding: 0 12px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--border); } .proxy-table-toolbar > div { display: flex; align-items: center; gap: 7px; color: var(--foreground); font-size: var(--text-sm); font-weight: 600; } .proxy-table-toolbar strong { min-width: 24px; padding: 1px 6px; border-radius: 999px; background: var(--surface-subtle); color: var(--muted-strong); font-size: var(--text-xs); text-align: center; } .proxy-rule-head, .proxy-rule-row { display: grid; grid-template-columns: 58px minmax(135px, 1fr) minmax(155px, 1.2fr) minmax(110px, .7fr) 50px 16px; align-items: center; gap: 8px; } .proxy-rule-head { min-height: 34px; padding: 0 12px; border-bottom: 1px solid var(--border); background: var(--surface-subtle); color: var(--muted); font-size: var(--text-xs); } .proxy-virtual-list { overflow: auto; scrollbar-width: thin; } .proxy-rule-row { left: 0; right: 0; width: 100%; padding: 0 12px; border: 0; border-bottom: 1px solid var(--border); background: var(--surface); color: var(--foreground); text-align: left; cursor: pointer; transition: background-color .12s ease, box-shadow .12s ease; } .proxy-rule-row:hover { background: var(--surface-subtle); } .proxy-rule-row.is-selected { background: var(--primary-soft); box-shadow: inset 3px 0 var(--primary); } .proxy-rule-row > span, .proxy-rule-row > code { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-rule-row > span:nth-child(2) strong, .proxy-rule-row > span:nth-child(2) small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-rule-row > span:nth-child(2) strong { font-size: var(--text-sm); line-height: 17px; } .proxy-rule-row > span:nth-child(2) small, .proxy-rule-row > span:nth-child(4), .proxy-rule-row > code { color: var(--muted); font-size: var(--text-xs); } .proxy-rule-row > i { color: var(--muted); font-size: var(--text-xs); font-style: normal; } .proxy-rule-row > i.is-enabled { color: var(--success); } .proxy-rule-row > svg { color: var(--muted); } .proxy-rule-order { display: flex; align-items: center; gap: 1px; } .proxy-rule-order .ui-button { width: 25px; height: 25px; } .proxy-table-empty, .proxy-source-rule-loading { min-height: 220px; padding: 24px; display: grid; place-items: center; align-content: center; gap: 5px; color: var(--muted); font-size: var(--text-xs); text-align: center; } .proxy-table-empty strong { color: var(--foreground); font-size: var(--text-sm); } .proxy-source-summary { min-height: 64px; padding: 10px 14px; display: flex; align-items: center; gap: 10px; border-top: 1px solid var(--border); background: var(--surface-subtle); } .proxy-source-summary > svg { color: var(--primary); } .proxy-source-summary strong, .proxy-source-summary small { display: block; } .proxy-source-summary strong { font-size: var(--text-sm); } .proxy-source-summary small { margin-top: 2px; color: var(--muted); font-size: var(--text-xs); } .proxy-rule-inspector { overflow-y: auto; } .proxy-rule-inspector > label { margin-bottom: 14px; } .proxy-rule-inspector textarea { resize: vertical; } .proxy-trace { margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); } .proxy-trace > div { margin-bottom: 8px; display: flex; align-items: center; gap: 7px; color: var(--muted-strong); font-size: var(--text-xs); } .proxy-trace p { min-height: 35px; margin: 0; padding: 5px 7px; display: grid; grid-template-columns: 16px minmax(0, 1fr); gap: 7px; border-left: 1px solid var(--border); } .proxy-trace p.is-match { border-left-color: var(--success); background: var(--success-soft); } .proxy-trace p > i, .proxy-trace p > i > span { width: 13px; height: 13px; display: block; color: var(--success); font-style: normal; } .proxy-trace p > i > span { margin-top: 1px; border: 1px solid var(--border); border-radius: 50%; } .proxy-trace strong, .proxy-trace small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-trace strong { font-size: var(--text-xs); } .proxy-trace small { color: var(--muted); font-size: var(--text-xs); } /* Rule subscriptions */ .proxy-source-empty { min-height: 210px; padding: 24px; display: grid; place-items: center; align-content: center; gap: 6px; color: var(--muted); font-size: var(--text-xs); text-align: center; } .proxy-source-empty strong { color: var(--foreground); font-size: var(--text-sm); } .proxy-source-status { width: 10px; height: 10px; display: grid; place-items: center; } .proxy-source-status i { width: 7px; height: 7px; border-radius: 50%; background: var(--muted); } .proxy-source-status.ready i { background: var(--success); } .proxy-source-status.updating i { background: var(--warning); animation: proxy-source-pulse 1s infinite; } .proxy-source-status.error i { background: var(--danger); } .proxy-source-main { min-height: 0; display: grid; grid-template-rows: auto minmax(270px, 1fr); } .proxy-source-editor { border-bottom: 1px solid var(--border); } .proxy-source-message { margin: 16px 0 0; } .proxy-source-message.is-warning { border-left-color: var(--warning); background: var(--warning-soft); color: var(--warning); } .proxy-source-rules { min-height: 0; display: grid; grid-template-rows: auto auto auto minmax(160px, 1fr) auto; overflow: hidden; } .proxy-source-rules-heading { min-height: 48px; padding: 7px 14px; display: flex; align-items: center; justify-content: space-between; gap: 14px; border-bottom: 1px solid var(--border); } .proxy-source-rules-heading > div { display: flex; align-items: center; gap: 7px; font-size: var(--text-sm); } .proxy-source-rules-heading > div strong { color: var(--muted-strong); font-variant-numeric: tabular-nums; } .proxy-source-rules-heading label { width: min(310px, 45%); height: 32px; padding: 0 9px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--background); color: var(--muted); } .proxy-source-rules-heading input { min-width: 0; flex: 1; border: 0; background: transparent; color: var(--foreground); outline: 0; font-size: var(--text-xs); } .proxy-source-stats { min-height: 32px; padding: 0 14px; display: flex; align-items: center; gap: 14px; border-bottom: 1px solid var(--border); background: var(--surface-subtle); color: var(--muted); font-size: var(--text-xs); } .proxy-source-stats span { display: inline-flex; align-items: center; gap: 4px; } .proxy-source-stats span:first-child { color: var(--success); } .proxy-source-stats .is-warning { color: var(--warning); } .proxy-source-rule-head, .proxy-source-rule-list > div { display: grid; grid-template-columns: 50px 110px minmax(180px, 1fr) minmax(110px, .35fr); align-items: center; gap: 8px; } .proxy-source-rule-head { min-height: 31px; padding: 0 14px; border-bottom: 1px solid var(--border); color: var(--muted); font-size: var(--text-xs); } .proxy-source-rule-list { min-height: 0; overflow: auto; scrollbar-width: thin; } .proxy-source-rule-list > div { min-height: 32px; padding: 0 14px; border-bottom: 1px solid var(--border); font-size: var(--text-xs); } .proxy-source-rule-list > div:hover { background: var(--surface-subtle); } .proxy-source-rule-list code, .proxy-source-rule-list i { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .proxy-source-rule-list code { color: var(--muted-strong); } .proxy-source-rule-list i { color: var(--primary-text); font-style: normal; } .proxy-source-rule-list i.is-exception { color: var(--success); } .proxy-source-pagination { min-height: 38px; padding: 0 10px 0 14px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--border); color: var(--muted); font-size: var(--text-xs); font-variant-numeric: tabular-nums; } .proxy-source-pagination > div { display: flex; gap: 2px; } @keyframes proxy-page-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } @keyframes proxy-source-pulse { 50% { opacity: .32; } } @media (max-width: 1180px) { .proxy-apply-band { grid-template-columns: minmax(220px, 1fr) minmax(140px, .7fr) minmax(140px, .7fr); } .proxy-compile-metrics { grid-column: 1 / -1; justify-content: flex-start; } .proxy-rule-workspace { grid-template-columns: minmax(530px, 1.4fr) minmax(280px, .8fr); } .proxy-rule-head, .proxy-rule-row { grid-template-columns: 54px minmax(120px, 1fr) minmax(130px, 1fr) minmax(90px, .65fr) 44px 14px; } } @media (max-width: 920px) { .proxy-profile-workspace, .proxy-source-workspace, .proxy-rule-workspace { grid-template-columns: 1fr; } .proxy-profile-index, .proxy-source-index, .proxy-rule-table { border-right: 0; border-bottom: 1px solid var(--border); } .proxy-profile-list, .proxy-source-list { max-height: 240px; overflow-y: auto; } .proxy-rule-inspector { overflow: visible; } .proxy-source-main { min-height: 680px; } } @media (max-width: 720px) { .proxy-heading-actions { width: 100%; } .proxy-apply-band, .proxy-route-probe { grid-template-columns: 1fr; } .proxy-compile-metrics { grid-column: auto; overflow-x: auto; } .proxy-probe-input { border-right: 0; border-bottom: 1px solid var(--border); } .proxy-current-site { align-items: flex-start; flex-direction: column; } .proxy-profile-editor, .proxy-source-editor, .proxy-rule-inspector { padding: 18px 16px; } .proxy-form-grid, .proxy-source-form, .proxy-auth-fields { grid-template-columns: 1fr; } .proxy-form-grid > label, .proxy-source-form > label { grid-column: auto !important; } .proxy-rule-table { overflow-x: auto; } .proxy-rule-head, .proxy-virtual-list, .proxy-source-rule-head, .proxy-source-rule-list { min-width: 680px; } .proxy-source-rules-heading { align-items: stretch; flex-direction: column; } .proxy-source-rules-heading label { width: 100%; } } @media (prefers-reduced-motion: reduce) { .proxy-page, .proxy-source-status.updating i { animation: none; } }