Files
micarrsim/apps/array-builder/styles.css
T

1100 lines
19 KiB
CSS
Raw 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,
.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);
}
.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;
}
.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;
}
.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;
}
@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;
}
.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;
}
.zoom-tools {
width: 100%;
}
.zoom-tools .tool-button {
flex: 1 1 auto;
}
.array-canvas-card {
min-height: 360px;
}
#array-canvas {
height: 430px;
}
.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;
}
}