Files

1602 lines
28 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.array-builder-shell {
min-width: 320px;
overflow-x: clip;
}
.skip-link {
position: fixed;
z-index: 100;
top: 8px;
left: 8px;
padding: 9px 12px;
border-radius: 9px;
color: #06130f;
background: var(--mint);
font-size: 0.72rem;
font-weight: 750;
text-decoration: none;
transform: translateY(-150%);
}
.skip-link:focus {
transform: translateY(0);
}
.array-builder-header {
position: sticky;
z-index: 30;
top: 0;
min-height: 59px;
padding-block: 9px;
gap: 16px;
background: rgb(8 17 15 / 94%);
}
.header-actions,
.runtime-line,
.section-title,
.section-title > div,
.toolbar-group,
.snap-controls {
display: flex;
min-width: 0;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.header-actions {
justify-content: flex-end;
}
.button,
.tool-button,
.icon-button,
.mini-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 0;
min-height: 36px;
padding: 8px 12px;
border: 1px solid var(--line);
border-radius: 10px;
color: var(--text);
background: var(--surface-raised);
cursor: pointer;
font-size: 0.76rem;
font-weight: 720;
text-decoration: none;
transition:
border-color 140ms ease,
background 140ms ease,
transform 140ms ease;
}
.button:hover:not(:disabled),
.button:focus-visible,
.tool-button:hover:not(:disabled),
.tool-button:focus-visible,
.icon-button:hover:not(:disabled),
.icon-button:focus-visible,
.mini-button:hover:not(:disabled),
.mini-button:focus-visible {
border-color: var(--mint);
outline: none;
}
.button:hover:not(:disabled),
.tool-button:hover:not(:disabled),
.icon-button:hover:not(:disabled),
.mini-button:hover:not(:disabled) {
transform: translateY(-1px);
}
.button:disabled,
.tool-button:disabled,
.icon-button:disabled,
.mini-button:disabled {
cursor: not-allowed;
opacity: 0.42;
transform: none;
}
.button--primary {
border-color: rgb(101 242 191 / 55%);
color: #06130f;
background: var(--mint);
}
.button--ghost {
background: rgb(255 255 255 / 3%);
}
.button--danger {
border-color: rgb(255 123 115 / 36%);
color: var(--danger);
background: rgb(255 123 115 / 7%);
}
.button--full {
width: 100%;
margin-top: 12px;
}
.file-button {
position: relative;
}
.file-button input {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
clip-path: inset(50%);
}
.file-button:focus-within {
border-color: var(--mint);
outline: 2px solid rgb(101 242 191 / 16%);
}
.array-workflow {
min-width: 0;
margin-left: auto;
}
.array-workflow ol {
display: flex;
align-items: center;
margin: 0;
padding: 0;
list-style: none;
}
.array-workflow li {
display: flex;
align-items: center;
gap: 6px;
color: var(--muted);
font-size: 0.67rem;
font-weight: 680;
white-space: nowrap;
}
.array-workflow li + li::before {
width: 16px;
height: 1px;
margin: 0 6px;
background: var(--line);
content: "";
}
.array-workflow li span {
display: grid;
width: 20px;
height: 20px;
border: 1px solid rgb(101 242 191 / 34%);
border-radius: 50%;
place-items: center;
color: var(--mint);
font: 750 0.6rem ui-monospace, SFMono-Regular, Consolas, monospace;
}
.array-builder-layout {
--control-panel-width: 420px;
display: grid;
grid-template-columns: var(--control-panel-width) 12px minmax(0, 1fr);
width: min(1880px, 100%);
min-height: calc(100vh - 59px);
margin: 0 auto;
}
.array-controls {
grid-column: 1;
grid-row: 1;
position: sticky;
top: 59px;
min-width: 0;
align-self: start;
overflow-y: auto;
max-height: calc(100vh - 59px);
padding: 14px;
border-right: 1px solid var(--line);
background: rgb(12 24 21 / 88%);
backdrop-filter: blur(18px);
container-name: array-controls;
container-type: inline-size;
scrollbar-width: thin;
}
.array-builder-layout > .split-handle {
grid-column: 2;
grid-row: 1;
position: sticky;
top: 59px;
height: calc(100vh - 59px);
align-self: start;
}
.runtime-line {
justify-content: space-between;
margin-bottom: 11px;
}
.save-state {
min-width: 0;
color: var(--muted);
font-size: 0.68rem;
overflow-wrap: anywhere;
}
.save-state.is-dirty {
color: var(--amber);
}
.validation-card {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 12px 14px;
border: 1px solid var(--line);
border-radius: 13px;
background: #0b1714;
}
.validation-card > div {
min-width: 0;
}
.validation-dot {
width: 9px;
height: 9px;
flex: 0 0 auto;
margin-top: 4px;
border-radius: 50%;
background: var(--muted);
box-shadow: 0 0 0 4px rgb(145 170 162 / 8%);
}
.validation-card strong,
.validation-card p {
overflow-wrap: anywhere;
}
.validation-card strong {
font-size: 0.75rem;
}
.validation-card p {
margin: 3px 0 0;
color: var(--muted);
font-size: 0.65rem;
line-height: 1.5;
}
.validation-card.is-valid .validation-dot {
background: var(--mint);
box-shadow: 0 0 0 4px rgb(101 242 191 / 10%);
}
.validation-card.is-warning .validation-dot {
background: var(--amber);
box-shadow: 0 0 0 4px rgb(255 197 110 / 10%);
}
.validation-card.is-invalid .validation-dot {
background: var(--danger);
box-shadow: 0 0 0 4px rgb(255 123 115 / 10%);
}
.control-section {
margin-top: 11px;
padding: 16px;
border: 1px solid var(--line);
border-radius: 15px;
background: rgb(255 255 255 / 2%);
}
.control-section--primary {
border-color: rgb(101 242 191 / 26%);
background: rgb(101 242 191 / 3%);
}
.section-title {
margin-bottom: 13px;
}
.section-title--split {
justify-content: space-between;
}
.section-title > span,
.section-title > div > span {
color: var(--mint);
font: 750 0.65rem ui-monospace, SFMono-Regular, Consolas, monospace;
}
.section-title h2 {
margin: 0;
font-size: 0.86rem;
}
.mini-button {
min-height: 30px;
padding: 5px 8px;
color: var(--mint);
background: rgb(101 242 191 / 5%);
font-size: 0.66rem;
}
.field {
display: grid;
min-width: 0;
gap: 5px;
}
.field > span,
.compact-field > span {
color: var(--muted);
font-size: 0.65rem;
font-weight: 650;
}
.field > span small {
color: #6f8981;
font-size: 0.58rem;
font-weight: 500;
}
.field input,
.field select,
.field textarea,
.compact-field input {
width: 100%;
min-width: 0;
min-height: 36px;
padding: 7px 8px;
border: 1px solid var(--line);
border-radius: 9px;
color: var(--text);
background: #0b1714;
font-size: 0.72rem;
}
.field textarea {
min-height: 64px;
resize: vertical;
line-height: 1.45;
}
.field input:focus,
.field select:focus,
.field textarea:focus,
.compact-field input:focus {
border-color: var(--mint);
outline: 2px solid rgb(101 242 191 / 10%);
}
.field input:disabled,
.field select:disabled,
.field textarea:disabled {
cursor: not-allowed;
opacity: 0.48;
}
.field--wide + .field--wide,
.field-grid + .field--wide,
.field--wide + .field-grid,
.search-field + .microphone-list {
margin-top: 10px;
}
.field-grid,
.preset-grid,
.button-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 9px;
}
.field-grid--three {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.field-grid + .field-grid,
.preset-grid,
.button-grid {
margin-top: 10px;
}
.preset-grid__wide,
.button-grid__wide {
grid-column: 1 / -1;
}
.section-note {
margin: 10px 0 0;
color: var(--muted);
font-size: 0.65rem;
line-height: 1.55;
overflow-wrap: anywhere;
}
.microphone-list {
min-height: 142px;
max-height: min(31vh, 310px);
overflow-y: auto;
padding: 7px;
border: 1px solid var(--line);
border-radius: 11px;
background: #08130f;
scrollbar-width: thin;
}
.microphone-list > .list-empty {
display: grid;
min-height: 124px;
margin: 0;
padding: 14px;
place-items: center;
color: var(--muted);
font-size: 0.68rem;
text-align: center;
}
.microphone-list [data-microphone-id] {
display: grid;
grid-template-columns: minmax(82px, 0.7fr) minmax(130px, 1.3fr);
width: 100%;
min-width: 0;
min-height: 38px;
align-items: center;
gap: 8px;
padding: 7px 9px;
border: 1px solid transparent;
border-radius: 8px;
color: var(--muted);
background: transparent;
cursor: pointer;
font-size: 0.65rem;
text-align: left;
}
.microphone-list [data-microphone-id] + [data-microphone-id] {
margin-top: 3px;
}
.microphone-list [data-microphone-id]:hover,
.microphone-list [data-microphone-id]:focus-visible,
.microphone-list [data-microphone-id].is-selected,
.microphone-list [data-microphone-id][aria-selected="true"] {
border-color: rgb(101 242 191 / 40%);
color: var(--text);
background: rgb(101 242 191 / 7%);
outline: none;
}
.microphone-list [data-microphone-id] > * {
min-width: 0;
overflow-wrap: anywhere;
}
.microphone-row__channel {
display: grid;
width: 25px;
height: 25px;
place-items: center;
border: 1px solid var(--line);
border-radius: 7px;
color: var(--mint);
font: 750 0.6rem ui-monospace, SFMono-Regular, Consolas, monospace;
}
.microphone-row__identity {
display: grid;
min-width: 0;
grid-template-columns: minmax(0, 1fr) auto;
gap: 2px 7px;
}
.microphone-row__identity strong,
.microphone-row__identity small {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.microphone-row__identity strong {
grid-column: 1;
color: var(--text);
font-size: 0.68rem;
}
.microphone-row__identity small {
grid-column: 1 / -1;
color: var(--muted);
font: 600 0.58rem ui-monospace, SFMono-Regular, Consolas, monospace;
}
.microphone-row__calibration {
grid-column: 2;
grid-row: 1;
padding: 2px 5px;
border-radius: 999px;
color: var(--cyan);
background: rgb(88 199 232 / 9%);
font: 700 0.53rem ui-monospace, SFMono-Regular, Consolas, monospace;
}
.microphone-list__empty {
display: grid;
min-height: 124px;
margin: 0;
padding: 14px;
place-items: center;
color: var(--muted);
font-size: 0.68rem;
text-align: center;
}
.selected-microphone-editor {
margin-top: 11px;
padding-top: 11px;
border-top: 1px solid rgb(145 170 162 / 14%);
}
.selection-empty {
margin: 0 0 9px;
color: var(--muted);
font-size: 0.67rem;
line-height: 1.5;
}
details > summary {
list-style: none;
}
details > summary::-webkit-details-marker {
display: none;
}
.inline-details,
.shortcut-help {
margin-top: 10px;
border: 1px solid var(--line);
border-radius: 10px;
background: rgb(255 255 255 / 1.5%);
}
.inline-details > summary,
.beam-pattern-card {
container: beam-pattern / inline-size;
margin-top: 10px;
overflow: hidden;
border: 1px solid var(--line);
border-radius: 16px;
background: rgb(255 255 255 / 2%);
}
.beam-pattern-heading {
display: flex;
min-width: 0;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 16px;
cursor: pointer;
}
.beam-pattern-heading::after {
color: var(--mint);
content: "+";
font-size: 1rem;
}
.beam-pattern-card[open] > .beam-pattern-heading::after {
content: "−";
}
.beam-pattern-heading > div {
min-width: 0;
}
.beam-pattern-heading .eyebrow {
margin: 0 0 3px;
font-size: 0.61rem;
}
.beam-pattern-heading h2 {
margin: 0;
font-size: 0.94rem;
}
.beam-pattern-heading > span {
min-width: 0;
margin-left: auto;
color: var(--muted);
font: 650 0.65rem ui-monospace, SFMono-Regular, Consolas, monospace;
overflow-wrap: anywhere;
text-align: right;
}
.beam-pattern-body {
display: grid;
min-width: 0;
grid-template-columns: minmax(270px, 0.82fr) minmax(340px, 1.18fr);
gap: 18px;
padding: 16px;
border-top: 1px solid var(--line);
}
.beam-pattern-controls,
.beam-pattern-visuals,
.beam-pattern-figure,
.beam-pattern-surface-figure {
min-width: 0;
}
.beam-pattern-model {
display: flex;
min-width: 0;
flex-wrap: wrap;
align-items: center;
gap: 7px;
margin: 0 0 12px;
color: #cfe2db;
font: 680 0.64rem ui-monospace, SFMono-Regular, Consolas, monospace;
overflow-wrap: anywhere;
}
.beam-pattern-model span {
padding: 3px 6px;
border: 1px solid rgb(88 199 232 / 28%);
border-radius: 999px;
color: var(--cyan);
background: rgb(88 199 232 / 7%);
font-size: 0.55rem;
}
.beam-pattern-view-switch {
display: inline-flex;
gap: 5px;
margin-bottom: 11px;
padding: 3px;
border: 1px solid var(--line);
border-radius: 10px;
background: #07110f;
}
.beam-pattern-view-switch .tool-button {
min-width: 82px;
}
.beam-pattern-fields {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 9px;
}
.beam-frequency-field {
grid-column: 1 / -1;
}
.beam-frequency-field > small,
.beam-pattern-fields .field > small {
margin-top: 5px;
color: var(--muted);
font-size: 0.56rem;
line-height: 1.4;
}
.beam-frequency-control {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(92px, auto);
align-items: center;
gap: 10px;
}
#beam-pattern-frequency {
min-width: 0;
padding-inline: 0;
accent-color: var(--mint);
cursor: ew-resize;
}
#beam-pattern-frequency-value {
color: var(--mint);
font: 760 0.72rem ui-monospace, SFMono-Regular, Consolas, monospace;
text-align: right;
white-space: nowrap;
}
.beam-pattern-metrics {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 7px;
margin-top: 11px;
}
.beam-pattern-metrics article {
min-width: 0;
padding: 9px 10px;
border: 1px solid var(--line);
border-radius: 9px;
background: #0b1714;
}
.beam-pattern-metrics span,
.beam-pattern-metrics strong {
display: block;
min-width: 0;
overflow-wrap: anywhere;
}
.beam-pattern-metrics span {
margin-bottom: 4px;
color: var(--muted);
font-size: 0.57rem;
}
.beam-pattern-metrics strong {
font: 720 0.68rem ui-monospace, SFMono-Regular, Consolas, monospace;
}
.beam-pattern-status {
margin: 11px 0 0;
padding: 9px 10px;
border: 1px solid rgb(101 242 191 / 22%);
border-radius: 9px;
color: #cfe2db;
background: rgb(101 242 191 / 4%);
font-size: 0.64rem;
line-height: 1.5;
overflow-wrap: anywhere;
}
.beam-pattern-status[data-severity="warning"] {
border-color: rgb(255 197 110 / 28%);
color: #ffe0a8;
background: rgb(255 197 110 / 5%);
}
.beam-pattern-status[data-severity="error"] {
border-color: rgb(255 123 115 / 34%);
color: #ffc1bd;
background: rgb(255 123 115 / 6%);
}
.beam-pattern-note {
margin: 9px 0 0;
color: var(--muted);
font-size: 0.59rem;
line-height: 1.55;
overflow-wrap: anywhere;
}
.beam-pattern-visuals {
display: grid;
min-width: 0;
align-content: start;
gap: 11px;
}
.beam-pattern-cut-grid {
display: grid;
min-width: 0;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.beam-pattern-figure,
.beam-pattern-surface-figure {
display: grid;
align-content: start;
gap: 7px;
margin: 0;
}
.beam-pattern-figure-heading {
display: flex;
min-width: 0;
align-items: baseline;
justify-content: space-between;
gap: 7px;
}
.beam-pattern-figure-heading strong {
color: #edf9f4;
font-size: 0.7rem;
}
.beam-pattern-figure-heading span {
min-width: 0;
color: var(--muted);
font: 620 0.53rem ui-monospace, SFMono-Regular, Consolas, monospace;
overflow-wrap: anywhere;
text-align: right;
}
#beam-pattern-plot-xz,
#beam-pattern-plot-yz,
#beam-pattern-plot-xy {
display: block;
width: 100%;
height: auto;
aspect-ratio: 1;
overflow: visible;
border: 1px solid rgb(145 170 162 / 22%);
border-radius: 11px;
color: var(--mint);
background: #07110f;
}
.beam-pattern-figure figcaption {
min-height: 3.8em;
margin: 0;
color: var(--muted);
font-size: 0.56rem;
line-height: 1.45;
overflow-wrap: anywhere;
}
.beam-pattern-surface-figure {
justify-items: stretch;
}
#beam-pattern-surface {
display: block;
width: 100%;
height: auto;
aspect-ratio: 16 / 10;
border: 1px solid rgb(145 170 162 / 24%);
border-radius: 12px;
background: #07110f;
cursor: grab;
touch-action: none;
}
#beam-pattern-surface[data-orbiting="true"] {
cursor: grabbing;
}
#beam-pattern-surface:focus-visible {
outline: 2px solid var(--mint);
outline-offset: -3px;
}
.beam-pattern-surface-figure figcaption {
color: var(--muted);
font-size: 0.58rem;
line-height: 1.45;
}
.beam-pattern-diagnostics {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 7px;
}
.beam-pattern-diagnostics p {
min-width: 0;
margin: 0;
padding: 8px 9px;
border: 1px solid var(--line);
border-radius: 8px;
color: var(--muted);
background: rgb(255 255 255 / 1.5%);
font-size: 0.55rem;
line-height: 1.45;
overflow-wrap: anywhere;
}
.beam-pattern-diagnostics strong,
.beam-pattern-diagnostics span {
display: block;
}
.beam-pattern-diagnostics strong {
margin-bottom: 3px;
color: #cfe2db;
}
[data-beam-mode][hidden],
#beam-pattern-cuts-view[hidden],
#beam-pattern-surface-view[hidden],
#beam-pattern-peaks[hidden] {
display: none !important;
}
.beam-pattern-ring,
.beam-pattern-axis {
stroke: rgb(145 170 162 / 28%);
stroke-width: 1;
}
.beam-pattern-ring-label {
fill: #76948a;
}
.beam-pattern-axis-labels {
color: #b9cec7;
}
.beam-pattern-steering {
color: var(--amber);
}
.beam-pattern-response {
color: var(--mint);
}
.beam-pattern-error {
color: #ffc1bd;
font: 650 13px system-ui, sans-serif;
}
.shortcut-help > summary {
position: relative;
padding: 10px 32px 10px 11px;
color: var(--muted);
cursor: pointer;
font-size: 0.66rem;
font-weight: 690;
}
.inline-details > summary::after,
.shortcut-help > summary::after {
position: absolute;
top: 50%;
right: 11px;
color: var(--mint);
content: "+";
transform: translateY(-50%);
}
.inline-details[open] > summary::after,
.shortcut-help[open] > summary::after {
content: "−";
}
.calibration-fields {
padding: 10px;
border-top: 1px solid var(--line);
}
.inline-details .section-note {
margin: 0;
padding: 0 10px 10px;
}
.mobile-save-actions {
display: none;
}
.array-workspace {
grid-column: 3;
grid-row: 1;
min-width: 0;
padding: 18px clamp(18px, 2.5vw, 38px) 38px;
}
.workspace-heading {
display: flex;
min-width: 0;
align-items: flex-end;
justify-content: space-between;
gap: 18px;
margin-bottom: 13px;
}
.workspace-heading .eyebrow {
margin-bottom: 5px;
font-size: 0.65rem;
}
.workspace-heading h1 {
margin: 0;
font-size: clamp(1.45rem, 2.6vw, 2.25rem);
letter-spacing: -0.045em;
}
.workspace-summary {
min-width: 0;
margin: 0;
color: var(--muted);
font: 650 0.7rem ui-monospace, SFMono-Regular, Consolas, monospace;
overflow-wrap: anywhere;
text-align: right;
}
.workspace-toolbar {
display: flex;
min-width: 0;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-bottom: 9px;
padding: 9px;
border: 1px solid var(--line);
border-radius: 12px;
background: rgb(255 255 255 / 2%);
}
.toolbar-group {
flex: 0 1 auto;
padding-right: 8px;
border-right: 1px solid var(--line);
}
.axis-view-control {
display: grid;
min-width: 0;
grid-template-columns: auto minmax(132px, 1fr);
align-items: center;
gap: 7px;
padding-right: 8px;
border-right: 1px solid var(--line);
}
.axis-view-control[hidden] {
display: none !important;
}
.axis-view-control > span {
color: var(--muted);
font-size: 0.64rem;
font-weight: 680;
white-space: nowrap;
}
.axis-view-control select {
width: 100%;
min-width: 0;
max-width: 184px;
min-height: 32px;
padding: 5px 27px 5px 8px;
border: 1px solid var(--line);
border-radius: 8px;
color: var(--text);
background: #0b1714;
font-size: 0.66rem;
}
.axis-view-control select:focus-visible {
border-color: var(--mint);
outline: 2px solid rgb(101 242 191 / 10%);
}
.tool-button,
.icon-button {
min-height: 32px;
padding: 6px 9px;
border-radius: 8px;
color: var(--muted);
background: #0b1714;
font-size: 0.68rem;
}
.tool-button.is-active,
.tool-button[aria-pressed="true"] {
border-color: rgb(101 242 191 / 54%);
color: var(--mint);
background: rgb(101 242 191 / 8%);
}
.icon-button {
width: 32px;
padding-inline: 0;
color: var(--text);
font-size: 1rem;
}
kbd {
padding: 1px 4px;
border: 1px solid var(--line);
border-radius: 4px;
color: var(--muted);
background: rgb(255 255 255 / 3%);
font: 650 0.58rem ui-monospace, SFMono-Regular, Consolas, monospace;
}
.snap-controls {
margin-left: auto;
}
.check-field {
display: flex;
min-height: 32px;
align-items: center;
gap: 6px;
color: var(--muted);
font-size: 0.67rem;
font-weight: 650;
}
.check-field input {
width: 16px;
height: 16px;
accent-color: var(--mint);
}
.compact-field {
display: grid;
grid-template-columns: auto 62px auto;
align-items: center;
gap: 5px;
}
.compact-field input {
min-height: 32px;
padding: 5px 7px;
}
.compact-field small {
color: var(--muted);
font-size: 0.6rem;
}
.array-canvas-card {
position: relative;
overflow: hidden;
min-height: 520px;
border: 1px solid var(--line);
border-radius: 18px;
background: #07110f;
box-shadow: var(--shadow);
}
#array-canvas {
display: block;
width: 100%;
height: clamp(520px, 68vh, 840px);
cursor: default;
touch-action: none;
}
#array-canvas:focus-visible {
outline: 2px solid var(--mint);
outline-offset: -3px;
}
body[data-array-tool="add"] #array-canvas,
.array-builder-shell[data-array-tool="add"] #array-canvas {
cursor: crosshair;
}
#array-canvas[data-view-mode="3d"] {
cursor: grab;
touch-action: none;
}
#array-canvas[data-view-mode="3d"][data-orbiting="true"] {
cursor: grabbing;
}
.canvas-instructions {
position: absolute;
top: 24px;
left: 50%;
display: grid;
width: min(430px, calc(100% - 40px));
gap: 5px;
color: var(--muted);
text-align: center;
pointer-events: none;
transform: translateX(-50%);
}
.canvas-instructions strong {
color: #cfe2db;
font-size: 0.78rem;
}
.canvas-instructions span {
font-size: 0.65rem;
}
.canvas-instructions.is-hidden {
display: none;
}
.canvas-front-badge {
position: absolute;
left: 12px;
bottom: 12px;
max-width: calc(100% - 190px);
padding: 7px 10px;
border: 1px solid rgb(88 199 232 / 30%);
border-radius: 999px;
color: var(--cyan);
background: rgb(8 17 15 / 84%);
backdrop-filter: blur(10px);
font: 720 0.62rem ui-monospace, SFMono-Regular, Consolas, monospace;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
pointer-events: none;
}
.selection-status {
position: absolute;
right: 12px;
bottom: 12px;
max-width: calc(100% - 24px);
overflow: hidden;
padding: 7px 10px;
border: 1px solid rgb(255 255 255 / 10%);
border-radius: 999px;
color: #d7e8e2;
background: rgb(8 17 15 / 82%);
backdrop-filter: blur(10px);
font: 650 0.65rem ui-monospace, SFMono-Regular, Consolas, monospace;
text-overflow: ellipsis;
white-space: nowrap;
pointer-events: none;
}
.array-statistics {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 9px;
margin-top: 10px;
}
.metric-card {
min-width: 0;
padding: 12px;
border: 1px solid var(--line);
border-radius: 12px;
background: rgb(255 255 255 / 2%);
}
.metric-card span,
.metric-card strong,
.metric-card small {
display: block;
min-width: 0;
overflow-wrap: anywhere;
}
.metric-card span {
margin-bottom: 5px;
color: var(--muted);
font-size: 0.62rem;
}
.metric-card strong {
font-size: 0.94rem;
letter-spacing: -0.025em;
}
.metric-card small {
margin-top: 4px;
color: var(--muted);
font-size: 0.56rem;
line-height: 1.35;
}
.shortcut-help > summary {
padding: 10px 34px 10px 12px;
}
.shortcut-help > div {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
padding: 10px;
border-top: 1px solid var(--line);
}
.shortcut-help p {
margin: 0;
padding: 9px;
border-radius: 8px;
color: var(--muted);
background: #0b1714;
font-size: 0.64rem;
line-height: 1.6;
}
.is-hidden {
display: none !important;
}
@container beam-pattern (max-width: 760px) {
.beam-pattern-body {
grid-template-columns: minmax(0, 1fr);
}
}
@container beam-pattern (max-width: 620px) {
.beam-pattern-cut-grid,
.beam-pattern-diagnostics {
grid-template-columns: minmax(0, 1fr);
}
.beam-pattern-figure figcaption {
min-height: 0;
}
}
@container beam-pattern (max-width: 460px) {
.beam-pattern-heading {
align-items: flex-start;
}
.beam-pattern-heading > span {
display: none;
}
.beam-pattern-fields,
.beam-pattern-metrics {
grid-template-columns: minmax(0, 1fr);
}
.beam-frequency-field {
grid-column: auto;
}
.beam-frequency-control {
grid-template-columns: minmax(0, 1fr);
gap: 5px;
}
#beam-pattern-frequency-value {
text-align: left;
}
}
@media (max-width: 1280px) {
.array-workflow li {
font-size: 0;
gap: 0;
}
.array-workflow li + li::before {
width: 11px;
margin-inline: 4px;
}
.array-statistics {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 1100px) {
.array-builder-layout {
grid-template-columns: minmax(340px, 38%) minmax(0, 1fr);
}
.array-builder-layout > .split-handle {
display: none;
}
.array-controls {
grid-column: 1;
}
.array-workspace {
grid-column: 2;
}
.array-controls,
.array-workspace {
width: 100%;
min-width: 0;
}
.microphone-list {
max-height: 360px;
}
}
@media (max-width: 760px) {
.array-builder-layout {
grid-template-columns: minmax(0, 1fr);
}
.array-builder-header {
position: static;
flex-wrap: wrap;
gap: 10px;
}
.array-workspace {
grid-column: 1;
grid-row: 1;
}
.array-controls {
grid-column: 1;
grid-row: 2;
position: static;
overflow: visible;
max-height: none;
border-right: 0;
border-top: 1px solid var(--line);
border-bottom: 0;
}
.array-workflow {
width: 100%;
margin: 0;
}
.array-workflow ol {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.array-workflow li {
display: grid;
grid-template-columns: 20px minmax(0, 1fr);
gap: 5px;
font-size: 0.62rem;
white-space: normal;
}
.array-workflow li + li::before {
display: none;
}
.workspace-heading {
align-items: flex-start;
flex-direction: column;
gap: 8px;
}
.workspace-summary {
text-align: left;
}
.snap-controls {
width: 100%;
margin-left: 0;
justify-content: space-between;
}
.array-canvas-card {
min-height: 430px;
}
#array-canvas {
height: 500px;
touch-action: pan-y;
}
#array-canvas[data-view-mode="3d"],
#beam-pattern-surface {
touch-action: pan-y;
}
.shortcut-help > div {
grid-template-columns: minmax(0, 1fr);
}
.mobile-save-actions {
display: block;
padding: 2px 0 16px;
}
}
@media (max-width: 520px) {
.array-builder-header {
align-items: stretch;
flex-direction: column;
padding-inline: 14px;
}
.array-builder-header .app-brand {
align-self: flex-start;
}
.header-actions {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
width: 100%;
gap: 6px;
}
.header-actions .button {
width: 100%;
padding-inline: 6px;
font-size: 0.68rem;
text-align: center;
}
.array-controls,
.array-workspace {
padding-inline: 14px;
}
.array-workspace {
padding-top: 15px;
}
.workspace-toolbar {
align-items: stretch;
}
.toolbar-group {
min-width: 0;
flex: 1 1 auto;
padding-right: 0;
border-right: 0;
}
.toolbar-group .tool-button {
flex: 1 1 auto;
}
.axis-view-control {
width: 100%;
grid-template-columns: auto minmax(0, 1fr);
padding-right: 0;
border-right: 0;
}
.axis-view-control select {
max-width: none;
}
.zoom-tools {
width: 100%;
}
.zoom-tools .tool-button {
flex: 1 1 auto;
}
.array-canvas-card {
min-height: 360px;
}
#array-canvas {
height: 430px;
}
.canvas-front-badge {
bottom: 48px;
max-width: calc(100% - 24px);
border-radius: 10px;
line-height: 1.35;
text-overflow: clip;
white-space: normal;
}
.array-statistics {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.canvas-instructions {
top: 18px;
}
}
@container array-controls (max-width: 380px) {
.field-grid--three {
grid-template-columns: minmax(0, 1fr);
}
.microphone-list [data-microphone-id] {
grid-template-columns: minmax(0, 1fr);
}
}
@container array-controls (max-width: 340px) {
.preset-grid,
.button-grid,
.calibration-fields {
grid-template-columns: minmax(0, 1fr);
}
.preset-grid__wide,
.button-grid__wide {
grid-column: auto;
}
}