811 lines
20 KiB
CSS
811 lines
20 KiB
CSS
.client-live-region {
|
|
position: fixed;
|
|
width: 1px;
|
|
height: 1px;
|
|
overflow: hidden;
|
|
clip-path: inset(50%);
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.client-rail-action {
|
|
--client-rail-state-duration: 340ms;
|
|
position: relative;
|
|
width: 42px;
|
|
height: 48px;
|
|
display: grid;
|
|
place-items: center;
|
|
padding: 0;
|
|
border: 0;
|
|
background: transparent;
|
|
color: var(--client-muted);
|
|
cursor: pointer;
|
|
transition: color 240ms ease, transform 440ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-rail-action svg {
|
|
width: 23px;
|
|
height: 23px;
|
|
fill: none;
|
|
stroke: currentColor;
|
|
stroke-width: 1.75;
|
|
stroke-linecap: round;
|
|
stroke-linejoin: round;
|
|
overflow: visible;
|
|
transition: color 240ms ease, filter 360ms ease, transform 180ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-rail-action:active:not(:disabled) svg {
|
|
transform: scale(0.94);
|
|
transition: color 120ms ease, filter 120ms ease, transform 120ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-rail-action > span {
|
|
position: absolute;
|
|
right: 48px;
|
|
width: max-content;
|
|
color: var(--client-text);
|
|
font: var(--type-control);
|
|
letter-spacing: var(--type-control-tracking);
|
|
text-transform: var(--type-control-transform);
|
|
opacity: 0;
|
|
filter: blur(5px);
|
|
pointer-events: none;
|
|
transform: translateX(8px);
|
|
transition: opacity 350ms ease, filter 350ms ease, transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-rail-action:hover,
|
|
.client-rail-action:focus-visible {
|
|
outline: 0;
|
|
color: var(--client-accent);
|
|
transform: translateX(-3px);
|
|
}
|
|
|
|
.client-rail-action:hover > span,
|
|
.client-rail-action:focus-visible > span {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: translateX(0);
|
|
}
|
|
|
|
.client-rail-action:hover svg,
|
|
.client-rail-action:focus-visible svg,
|
|
.client-rail-action.is-open svg {
|
|
filter: drop-shadow(0 0 7px color-mix(in oklch, var(--client-accent) 52%, transparent));
|
|
}
|
|
|
|
.client-rail-subscription-back,
|
|
.client-rail-subscription-front,
|
|
.client-rail-info-ring,
|
|
.client-rail-info-mark,
|
|
.client-rail-device-monitor,
|
|
.client-rail-device-phone,
|
|
.client-rail-device-bridge,
|
|
.client-rail-diagnostics-glass,
|
|
.client-rail-rule-knob {
|
|
transform-box: fill-box;
|
|
transform-origin: center;
|
|
transition: transform var(--client-rail-state-duration) cubic-bezier(0.16, 1, 0.3, 1), opacity 260ms ease, stroke-dasharray var(--client-rail-state-duration) cubic-bezier(0.16, 1, 0.3, 1), stroke-dashoffset var(--client-rail-state-duration) cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-rail-action .client-rail-subscription-card,
|
|
.client-rail-action .client-rail-rule-knob {
|
|
fill: var(--client-bg);
|
|
}
|
|
|
|
.client-rail-subscription-lines {
|
|
opacity: 1;
|
|
}
|
|
|
|
.client-subscription-toggle.is-open .client-rail-subscription-back {
|
|
transform: translate(1.5px, -1px);
|
|
}
|
|
|
|
.client-subscription-toggle.is-open .client-rail-subscription-front {
|
|
transform: translate(-2px, 1px);
|
|
}
|
|
|
|
.client-rail-info-ring {
|
|
stroke-dasharray: 1 0;
|
|
stroke-dashoffset: 0.1;
|
|
}
|
|
|
|
.client-instructions-toggle.is-open .client-rail-info-ring {
|
|
stroke-dasharray: 0.9 0.1;
|
|
}
|
|
|
|
.client-instructions-toggle.is-open .client-rail-info-mark {
|
|
transform: translateY(-1px);
|
|
}
|
|
|
|
.client-rail-device-bridge {
|
|
opacity: 0;
|
|
transform: scaleX(0);
|
|
}
|
|
|
|
.client-rail-subscription-scan,
|
|
.client-rail-info-sweep,
|
|
.client-rail-device-packet,
|
|
.client-rail-diagnostics-scan,
|
|
.client-rail-rule-scan {
|
|
stroke-width: 2.4;
|
|
opacity: 0;
|
|
stroke-dasharray: 0.18 0.82;
|
|
stroke-dashoffset: 1;
|
|
}
|
|
|
|
.client-rail-device-packet {
|
|
stroke-dasharray: 0.36 0.64;
|
|
}
|
|
|
|
.client-devices-toggle.is-open .client-rail-device-monitor {
|
|
transform: translateX(1px);
|
|
}
|
|
|
|
.client-devices-toggle.is-open .client-rail-device-phone {
|
|
transform: translateX(-1px);
|
|
}
|
|
|
|
.client-devices-toggle.is-open .client-rail-device-bridge {
|
|
opacity: 1;
|
|
transform: scaleX(1);
|
|
}
|
|
|
|
.client-diagnostics-toggle.is-open .client-rail-diagnostics-glass {
|
|
transform: translate(1px, -1px) rotate(-4deg);
|
|
}
|
|
|
|
.client-local-rules-toggle.is-open .client-rail-rule-knob.is-top {
|
|
transform: translateX(2px);
|
|
}
|
|
|
|
.client-local-rules-toggle.is-open .client-rail-rule-knob.is-bottom {
|
|
transform: translateX(-2px);
|
|
}
|
|
|
|
.client-subscription-toggle.is-open .client-rail-subscription-scan,
|
|
.client-instructions-toggle.is-open .client-rail-info-sweep,
|
|
.client-devices-toggle.is-open .client-rail-device-packet,
|
|
.client-diagnostics-toggle.is-open .client-rail-diagnostics-scan,
|
|
.client-local-rules-toggle.is-open .client-rail-rule-scan {
|
|
animation: client-rail-ambient-trace 10s 1.1s linear infinite;
|
|
}
|
|
|
|
.client-local-rules-toggle.is-open .client-rail-rule-scan.is-bottom {
|
|
animation: client-rail-ambient-trace 10s 1.32s linear infinite;
|
|
}
|
|
|
|
@keyframes client-rail-ambient-trace {
|
|
0% { opacity: 0; stroke-dashoffset: 1; }
|
|
2% { opacity: 1; }
|
|
8% { opacity: 1; stroke-dashoffset: 0; }
|
|
10%, 100% { opacity: 0; stroke-dashoffset: 0; }
|
|
}
|
|
|
|
.client-local-rules-toggle:disabled {
|
|
cursor: default;
|
|
color: var(--client-muted);
|
|
transform: none;
|
|
}
|
|
|
|
.client-local-rules-toggle:disabled span {
|
|
opacity: 0;
|
|
filter: blur(5px);
|
|
transform: translateX(8px);
|
|
}
|
|
|
|
.client-local-rules-toggle:disabled:hover span {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: translateX(0);
|
|
}
|
|
|
|
.client-rail-action.is-open {
|
|
--client-rail-state-duration: 480ms;
|
|
color: var(--client-accent);
|
|
}
|
|
|
|
.client-local-rules-toggle.has-pending:not(.is-open) {
|
|
color: oklch(0.68 0.14 72);
|
|
}
|
|
|
|
.client-local-rules-toggle.has-pending:not(.is-open) svg {
|
|
filter: drop-shadow(0 0 7px oklch(0.68 0.14 72 / 0.42));
|
|
}
|
|
|
|
.client-rail-action.is-open > span {
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.client-secondary-menu:has(.client-rail-action.is-open) .client-rail-action > span {
|
|
opacity: 0;
|
|
}
|
|
|
|
.client-drawer {
|
|
position: fixed;
|
|
inset: 0 0 0 auto;
|
|
z-index: 50;
|
|
width: min(580px, 100vw);
|
|
overflow-x: hidden;
|
|
overflow-y: auto;
|
|
background: color-mix(in oklch, var(--client-bg) 99%, var(--client-panel));
|
|
color: var(--client-text);
|
|
box-shadow: -26px 0 72px oklch(0.09 0.015 145 / 0.12);
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
transform: translateX(104%);
|
|
transition: transform 760ms cubic-bezier(0.16, 1, 0.3, 1), opacity 500ms ease, visibility 0s 760ms;
|
|
}
|
|
|
|
.client-drawer.is-open {
|
|
opacity: 1;
|
|
visibility: visible;
|
|
transform: translateX(0);
|
|
transition-delay: 0s;
|
|
}
|
|
|
|
.client-drawer-sheet {
|
|
position: relative;
|
|
min-height: 100%;
|
|
padding: 54px 72px 72px 34px;
|
|
font-family: var(--font-family-client);
|
|
}
|
|
|
|
.client-delete-strike {
|
|
--client-delete-strike-y: 50%;
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
left: 12px;
|
|
z-index: 100;
|
|
background: transparent;
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
transform: scaleX(0);
|
|
transform-origin: left center;
|
|
}
|
|
|
|
.client-delete-strike::after {
|
|
content: '';
|
|
position: absolute;
|
|
left: 0;
|
|
right: 0;
|
|
top: calc(var(--client-delete-strike-y) - 1px);
|
|
height: 2px;
|
|
background: oklch(0.68 0.15 28);
|
|
clip-path: polygon(0 24%, 100% 50%, 0 76%);
|
|
}
|
|
|
|
.client-deletable-row.is-removing > .client-delete-strike {
|
|
animation: client-delete-strike 820ms cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
}
|
|
|
|
.client-deletable-row.is-removing > :not(.client-delete-strike) {
|
|
position: relative;
|
|
z-index: 0;
|
|
}
|
|
|
|
.client-deletable-row.is-removing > :not(.client-delete-strike):not(.client-local-rule-enabled) {
|
|
animation: client-delete-content-dim 820ms ease-out both;
|
|
}
|
|
|
|
.client-deletable-row.is-removing .client-local-rule-enabled circle,
|
|
.client-deletable-row.is-removing .client-rule-check {
|
|
opacity: 0;
|
|
}
|
|
|
|
.client-row-delete {
|
|
width: 28px;
|
|
height: 32px;
|
|
padding: 0;
|
|
border: 0;
|
|
background: transparent;
|
|
color: var(--client-muted);
|
|
font-size: var(--font-size-icon-delete);
|
|
cursor: pointer;
|
|
transition: color 180ms ease, filter 260ms ease, transform 300ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-row-delete:hover {
|
|
color: oklch(0.68 0.15 28);
|
|
filter: drop-shadow(0 0 7px oklch(0.68 0.15 28 / 0.42));
|
|
transform: rotate(8deg) scale(1.1);
|
|
}
|
|
|
|
.client-rule-handle:focus-visible,
|
|
.client-local-rule-enabled:focus-visible,
|
|
.client-rule-type-trigger:focus-visible,
|
|
.client-rule-outbound button:focus-visible,
|
|
.client-row-delete:focus-visible,
|
|
.client-row-add:focus-visible,
|
|
.client-local-rules-save:focus-visible,
|
|
.client-local-rules-actions button:focus-visible {
|
|
outline: 0;
|
|
color: var(--client-accent);
|
|
text-shadow: 0 0 10px color-mix(in oklch, var(--client-accent) 48%, transparent);
|
|
}
|
|
|
|
.client-row-add {
|
|
width: fit-content;
|
|
padding: 7px 0;
|
|
border: 0;
|
|
background: transparent;
|
|
color: var(--client-accent);
|
|
font: var(--type-control);
|
|
letter-spacing: var(--type-control-tracking);
|
|
text-transform: var(--type-control-transform);
|
|
cursor: pointer;
|
|
transition: opacity 220ms ease, color 220ms ease, text-shadow 300ms ease;
|
|
}
|
|
|
|
.client-row-add:hover {
|
|
text-shadow: 0 0 10px color-mix(in oklch, var(--client-accent) 55%, transparent);
|
|
}
|
|
|
|
.client-row-add:disabled {
|
|
opacity: 0.3;
|
|
cursor: not-allowed;
|
|
text-shadow: none;
|
|
}
|
|
|
|
.client-row-add-slot {
|
|
min-height: 40px;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
}
|
|
|
|
.client-row-add-slot > span {
|
|
color: var(--client-muted);
|
|
font: var(--type-micro);
|
|
letter-spacing: var(--type-micro-tracking);
|
|
text-transform: var(--type-micro-transform);
|
|
opacity: 0;
|
|
filter: blur(5px);
|
|
transform: translateX(-6px);
|
|
transition: opacity 220ms ease, filter 320ms ease, transform 380ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-row-add-slot > span.is-visible {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: translateX(0);
|
|
}
|
|
|
|
@keyframes client-row-enter {
|
|
from { opacity: 0; filter: blur(8px); transform: translateY(-10px) scale(0.985); }
|
|
to { opacity: 1; filter: blur(0); transform: translateY(0) scale(1); }
|
|
}
|
|
|
|
@keyframes client-row-leave {
|
|
0%, 52% { opacity: 1; filter: blur(0); transform: translateX(0); }
|
|
100% { opacity: 0; filter: blur(8px); transform: translateX(28px); }
|
|
}
|
|
|
|
@keyframes client-delete-strike {
|
|
0% { opacity: 0.58; transform: scaleX(0); transform-origin: left center; }
|
|
42%, 52% { opacity: 0.58; transform: scaleX(1); transform-origin: left center; }
|
|
53% { opacity: 0.58; transform: scaleX(1); transform-origin: right center; }
|
|
100% { opacity: 0; transform: scaleX(0); transform-origin: right center; }
|
|
}
|
|
|
|
@keyframes client-delete-content-dim {
|
|
0%, 52% { opacity: 0.58; filter: brightness(0.55) saturate(0.65) blur(1.4px); }
|
|
100% { opacity: 0; filter: brightness(0.42) saturate(0.5) blur(2.6px); }
|
|
}
|
|
|
|
.client-instructions-header {
|
|
display: grid;
|
|
gap: 9px;
|
|
margin: 0 8px 38px;
|
|
}
|
|
|
|
.client-drawer-close {
|
|
position: absolute;
|
|
top: 10px;
|
|
right: 10px;
|
|
width: 44px;
|
|
height: 44px;
|
|
padding: 0;
|
|
border: 0;
|
|
background: transparent;
|
|
color: var(--client-muted);
|
|
font: var(--type-icon-close);
|
|
cursor: pointer;
|
|
transition: color 220ms ease, transform 300ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-drawer-close:hover {
|
|
color: var(--client-text);
|
|
transform: scale(1.08);
|
|
}
|
|
|
|
.client-drawer-close:focus-visible {
|
|
outline: 2px solid var(--client-accent);
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
.client-instructions-header span,
|
|
.client-instruction-summary > span {
|
|
color: var(--client-muted);
|
|
font: var(--type-label);
|
|
letter-spacing: var(--type-label-tracking);
|
|
text-transform: var(--type-label-transform);
|
|
}
|
|
|
|
.client-instructions-header h2 {
|
|
margin: 0;
|
|
font: var(--type-drawer-title);
|
|
letter-spacing: var(--type-drawer-title-tracking);
|
|
text-transform: var(--type-drawer-title-transform);
|
|
}
|
|
|
|
.client-instructions-intro {
|
|
display: grid;
|
|
gap: 12px;
|
|
margin-top: 15px;
|
|
color: var(--client-muted);
|
|
font: var(--type-body);
|
|
letter-spacing: var(--type-body-tracking);
|
|
text-transform: var(--type-body-transform);
|
|
}
|
|
|
|
.client-instructions-intro p {
|
|
margin: 0;
|
|
}
|
|
|
|
.client-instruction-copy-button {
|
|
width: 104px;
|
|
min-width: 104px;
|
|
min-height: 34px;
|
|
padding: 0;
|
|
color: var(--client-accent);
|
|
opacity: 1;
|
|
}
|
|
|
|
.client-tooltip-anchor {
|
|
position: relative;
|
|
}
|
|
|
|
.client-tooltip {
|
|
position: absolute;
|
|
bottom: calc(100% + 6px);
|
|
left: 50%;
|
|
z-index: 1000;
|
|
width: max-content;
|
|
max-width: 220px;
|
|
padding: 6px 8px;
|
|
border-radius: 8px;
|
|
background: oklch(0.14 0.012 145);
|
|
box-shadow: 0 8px 26px oklch(0.08 0.015 145 / 0.16);
|
|
color: oklch(0.94 0.008 145);
|
|
font: var(--type-tooltip);
|
|
letter-spacing: var(--type-tooltip-tracking);
|
|
text-transform: var(--type-tooltip-transform);
|
|
text-align: center;
|
|
white-space: normal;
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
filter: blur(2px);
|
|
pointer-events: none;
|
|
transform: translate(-50%, 2px);
|
|
transition: opacity 90ms ease, filter 120ms ease, transform 140ms cubic-bezier(0.16, 1, 0.3, 1), visibility 0s 140ms;
|
|
}
|
|
|
|
.client-tooltip-anchor:hover > .client-tooltip,
|
|
.client-tooltip-anchor:focus-visible > .client-tooltip,
|
|
.client-tooltip-anchor:has(> :focus-visible) > .client-tooltip {
|
|
opacity: 1;
|
|
visibility: visible;
|
|
filter: blur(0);
|
|
transform: translate(-50%, 0);
|
|
transition-delay: 20ms, 20ms, 20ms, 0s;
|
|
}
|
|
|
|
.client-duration-toggle > .client-tooltip {
|
|
top: 50%;
|
|
right: calc(100% + 12px);
|
|
bottom: auto;
|
|
left: auto;
|
|
transform: translate(2px, -50%);
|
|
}
|
|
|
|
.client-duration-toggle:hover > .client-tooltip,
|
|
.client-duration-toggle:focus-visible > .client-tooltip {
|
|
transform: translate(0, -50%);
|
|
}
|
|
|
|
.client-form {
|
|
position: static;
|
|
grid-column: 3;
|
|
align-self: center;
|
|
justify-self: start;
|
|
min-width: 0;
|
|
width: min(360px, 100%);
|
|
max-height: min(640px, calc(100vh - 120px));
|
|
overflow: visible;
|
|
display: grid;
|
|
gap: 36px;
|
|
transition: opacity 650ms cubic-bezier(0.16, 1, 0.3, 1), filter 650ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-confirmation-popup {
|
|
position: fixed;
|
|
inset: 0;
|
|
z-index: 100;
|
|
display: grid;
|
|
place-items: center;
|
|
padding: 24px;
|
|
background: color-mix(in oklch, var(--client-bg) 76%, transparent);
|
|
-webkit-backdrop-filter: blur(0);
|
|
backdrop-filter: blur(0);
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
pointer-events: none;
|
|
transition: opacity 260ms ease, -webkit-backdrop-filter 520ms cubic-bezier(0.16, 1, 0.3, 1), backdrop-filter 520ms cubic-bezier(0.16, 1, 0.3, 1), visibility 0s 520ms;
|
|
}
|
|
|
|
.client-confirmation-popup.is-open {
|
|
-webkit-backdrop-filter: blur(18px);
|
|
backdrop-filter: blur(18px);
|
|
opacity: 1;
|
|
visibility: visible;
|
|
pointer-events: auto;
|
|
transition-delay: 0s;
|
|
}
|
|
|
|
.client-confirmation-dialog {
|
|
width: min(430px, calc(100vw - 48px));
|
|
display: grid;
|
|
gap: 14px;
|
|
padding: 32px 34px;
|
|
background: color-mix(in oklch, var(--client-bg) 82%, transparent);
|
|
box-shadow: 0 0 86px color-mix(in oklch, var(--client-bg) 86%, transparent);
|
|
color: var(--client-text);
|
|
font-family: var(--font-family-client);
|
|
opacity: 0;
|
|
filter: blur(18px);
|
|
transform: scale(0.9);
|
|
transition: opacity 300ms ease, filter 520ms cubic-bezier(0.16, 1, 0.3, 1), transform 560ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-confirmation-popup.is-open .client-confirmation-dialog {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: scale(1);
|
|
transition-delay: 90ms;
|
|
}
|
|
|
|
.client-confirmation-dialog > * {
|
|
opacity: 0;
|
|
filter: blur(7px);
|
|
transform: translateY(7px);
|
|
transition: opacity 260ms ease, filter 420ms cubic-bezier(0.16, 1, 0.3, 1), transform 460ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-confirmation-popup.is-open .client-confirmation-kicker {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: translateY(0);
|
|
transition-delay: 170ms;
|
|
}
|
|
|
|
.client-confirmation-popup.is-open .client-confirmation-dialog h2 {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: translateY(0);
|
|
transition-delay: 210ms;
|
|
}
|
|
|
|
.client-confirmation-popup.is-open .client-confirmation-dialog p {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: translateY(0);
|
|
transition-delay: 270ms;
|
|
}
|
|
|
|
.client-confirmation-popup.is-open .client-confirmation-actions {
|
|
opacity: 1;
|
|
filter: blur(0);
|
|
transform: translateY(0);
|
|
transition-delay: 330ms;
|
|
}
|
|
|
|
.client-confirmation-kicker {
|
|
color: var(--client-muted);
|
|
font: var(--type-label);
|
|
letter-spacing: var(--type-label-tracking);
|
|
text-transform: var(--type-label-transform);
|
|
}
|
|
|
|
.client-confirmation-dialog h2 {
|
|
color: oklch(0.68 0.15 28);
|
|
font: var(--type-state-title);
|
|
letter-spacing: var(--type-state-title-tracking);
|
|
text-transform: var(--type-state-title-transform);
|
|
}
|
|
|
|
.client-confirmation-dialog p {
|
|
max-width: 54ch;
|
|
color: var(--client-muted);
|
|
font: var(--type-body);
|
|
letter-spacing: var(--type-body-tracking);
|
|
text-transform: var(--type-body-transform);
|
|
}
|
|
|
|
.client-confirmation-actions {
|
|
display: flex;
|
|
gap: 18px;
|
|
margin-top: 4px;
|
|
}
|
|
|
|
.client-confirmation-actions button {
|
|
padding: 6px 0;
|
|
border: 0;
|
|
background: transparent;
|
|
color: var(--client-text);
|
|
font: var(--type-control);
|
|
letter-spacing: var(--type-control-tracking);
|
|
text-transform: var(--type-control-transform);
|
|
cursor: pointer;
|
|
transition: color 200ms ease, filter 300ms ease, transform 300ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-confirmation-actions button:hover:not(:disabled),
|
|
.client-confirmation-actions button:focus-visible {
|
|
outline: none;
|
|
filter: drop-shadow(0 0 7px currentColor);
|
|
transform: translateY(-1px);
|
|
}
|
|
|
|
.client-confirmation-actions .is-danger {
|
|
color: oklch(0.68 0.15 28);
|
|
}
|
|
|
|
.client-confirmation-actions button:disabled {
|
|
opacity: 0.4;
|
|
cursor: wait;
|
|
}
|
|
|
|
.client-shell:has(.harbor-brand.is-gateway-active) .client-form {
|
|
opacity: 0.34;
|
|
filter: grayscale(1) saturate(0);
|
|
}
|
|
|
|
@keyframes client-spin {
|
|
to { transform: rotate(360deg); }
|
|
}
|
|
|
|
.client-server:focus-visible,
|
|
.client-power:focus-visible {
|
|
outline: 2px solid var(--client-accent);
|
|
outline-offset: 3px;
|
|
}
|
|
|
|
.client-inline-error {
|
|
position: absolute;
|
|
left: 50%;
|
|
z-index: 3;
|
|
width: min(360px, 90vw);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 8px;
|
|
flex-wrap: wrap;
|
|
color: oklch(0.62 0.2 28);
|
|
font: var(--type-body);
|
|
letter-spacing: var(--type-body-tracking);
|
|
text-transform: var(--type-body-transform);
|
|
text-align: center;
|
|
transform: translateX(-50%);
|
|
}
|
|
|
|
.client-inline-error small {
|
|
color: var(--client-muted);
|
|
font: var(--type-label);
|
|
letter-spacing: var(--type-label-tracking);
|
|
text-transform: var(--type-label-transform);
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.client-inline-error button {
|
|
padding: 4px 7px;
|
|
border: 0;
|
|
border-radius: 6px;
|
|
background: color-mix(in oklch, var(--client-control) 72%, transparent);
|
|
color: var(--client-text);
|
|
font: var(--type-label);
|
|
letter-spacing: var(--type-label-tracking);
|
|
text-transform: var(--type-label-transform);
|
|
cursor: pointer;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.client-inline-error button:focus-visible {
|
|
outline: 2px solid oklch(0.68 0.15 28);
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
.client-operation-progress {
|
|
color: var(--client-accent);
|
|
}
|
|
|
|
.client-operation-progress::before {
|
|
width: 6px;
|
|
height: 6px;
|
|
border-radius: 50%;
|
|
background: currentColor;
|
|
box-shadow: 0 0 8px currentColor;
|
|
content: '';
|
|
animation: client-operation-pulse 900ms ease-in-out infinite alternate;
|
|
}
|
|
|
|
@keyframes client-operation-pulse {
|
|
to { opacity: 0.35; transform: scale(0.72); }
|
|
}
|
|
|
|
.client-copy-button {
|
|
position: relative;
|
|
width: 86px;
|
|
padding: 6px 10px;
|
|
border: 0;
|
|
background: transparent;
|
|
color: var(--client-muted);
|
|
font: var(--type-label);
|
|
letter-spacing: var(--type-label-tracking);
|
|
text-transform: var(--type-label-transform);
|
|
cursor: pointer;
|
|
opacity: 0.76;
|
|
transition: color 220ms ease, opacity 220ms ease, transform 220ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
}
|
|
|
|
.client-copy-label {
|
|
transition: opacity 100ms ease;
|
|
}
|
|
|
|
.client-copy-button.is-copied .client-copy-label,
|
|
.client-copy-button.is-copy-error .client-copy-label {
|
|
opacity: 0;
|
|
}
|
|
|
|
.client-copy-feedback {
|
|
position: absolute;
|
|
inset: 0;
|
|
display: grid;
|
|
place-items: center;
|
|
color: var(--client-accent);
|
|
animation: client-copy-fade 800ms cubic-bezier(0.4, 0, 1, 1) forwards;
|
|
}
|
|
|
|
.client-copy-button.is-copy-error .client-copy-feedback {
|
|
color: oklch(0.68 0.15 28);
|
|
filter: drop-shadow(0 0 5px oklch(0.68 0.15 28 / 0.45));
|
|
}
|
|
|
|
@keyframes client-copy-fade {
|
|
0%, 18% { opacity: 1; filter: drop-shadow(0 0 5px var(--client-accent)); }
|
|
100% { opacity: 0; filter: drop-shadow(0 0 0 transparent); }
|
|
}
|
|
|
|
.client-copy-button:hover {
|
|
color: var(--client-text);
|
|
opacity: 1;
|
|
transform: translateY(-2px);
|
|
}
|
|
|
|
.client-copy-button:active {
|
|
transform: translateY(0) scale(0.98);
|
|
}
|
|
|
|
.client-copy-button.is-copied {
|
|
opacity: 1;
|
|
color: var(--client-accent);
|
|
}
|
|
|
|
.client-copy-button:focus-visible {
|
|
outline: 2px solid var(--client-accent);
|
|
outline-offset: 3px;
|
|
}
|