Files
svsmspcalc/SVS-MSP-Calculator-components.css
2026-03-16 01:42:17 -04:00

2198 lines
90 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.
/* SVS MSP Calculator - Components */
/* Extracted during Phase 5 to keep the HTML shell stable while splitting the monolithic stylesheet. */
/* ── SECTION CARDS (IVI) ───────────────────────────────────────
Each section = position:relative card with:
.section-num — absolute, floats left outside card (Cinzel)
.section-header — flex row: title-block | summary badge | chevron
.section-body — collapsible content (overflow:hidden, JS toggle)
JS toggleSection(id) adds/removes .sec-open class on .section.
.sec-open .sec-chevron rotates 180deg (down→up arrow).
.sec-summary-badge is shown/hidden by setSummary() in update().
─────────────────────────────────────────────────────────────── */
.section {
position: relative;
container-type: inline-size;
margin-left: var(--section-offset);
border-radius: var(--radius-card);
border: 1px solid var(--border);
border-left: 3px solid transparent;
background: var(--surface-section);
padding: var(--section-padding-top) var(--section-padding-x) var(--section-padding-bottom);
}
.fa-icon {
display: inline-block;
width: var(--icon-size, 1em);
height: var(--icon-size, 1em);
flex: 0 0 auto;
color: inherit;
background-color: currentColor;
vertical-align: middle;
mask-image: var(--fa-icon-url);
mask-repeat: no-repeat;
mask-position: center;
mask-size: contain;
-webkit-mask-image: var(--fa-icon-url);
-webkit-mask-repeat: no-repeat;
-webkit-mask-position: center;
-webkit-mask-size: contain;
}
.fa-icon--accent { color: var(--accent); }
.fa-icon--green { color: var(--green); }
.fa-icon--amber { color: var(--amber); }
.fa-icon--danger { color: var(--text-danger); }
.fa-icon--white { color: var(--text-on-accent); }
.fa-icon--theme { color: currentColor; }
/* ── FA Sharp Solid icons — inline data URIs for file:// compatibility ── */
.fa-icon-file-invoice { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath fill='currentColor' d='M240 0L0 0 0 512 384 512 384 144 240 0zm85.5 176L208 176 208 58.5 325.5 176zM64 416l0-128 256 0 0 128-256 0zM88 64l72 0 0 48-96 0 0-48 24 0zm0 96l72 0 0 48-96 0 0-48 24 0z'/%3E%3C/svg%3E"); }
.fa-icon-sun-bright { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath fill='currentColor' d='M312 544l-48 0 0-112 48 0 0 112zM180.5 397.4l-79.2 79.2-33.9-33.9 79.2-79.2 33.9 33.9zm328.1 45.3l-33.9 33.9-79.2-79.2 33.9-33.9 79.2 79.2zM288 384a128 128 0 1 1 0-256 128 128 0 1 1 0 256zM112 280l-112 0 0-48 112 0 0 48zm464 0l-112 0 0-48 112 0 0 48zM180.5 114.6l-33.9 33.9-79.2-79.2 33.9-33.9 79.2 79.2zM508.6 69.3l-79.2 79.2-33.9-33.9 79.2-79.2 33.9 33.9zM312 80l-48 0 0-112 48 0 0 112z'/%3E%3C/svg%3E"); }
.fa-icon-moon-stars { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M448-32l16 48 48 16-48 16-16 48-16-48-48-16 48-16 16-48zM314.7 83.1c-76.2 18.9-132.7 87.8-132.7 169.9 0 96.6 78.3 175 175 175 16.2 0 31.9-2.2 46.8-6.3-40.8 54.8-106.1 90.3-179.8 90.3-123.7 0-224-100.3-224-224S100.3 64 224 64c32.3 0 63 6.8 90.7 19.1zM384 352L355.2 268.8 272 240 355.2 211.2 384 128 412.8 211.2 496 240 412.8 268.8 384 352z'/%3E%3C/svg%3E"); }
.fa-icon-sparkles { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M480 32l32-72 32 72 72 32-72 32-32 72-32-72-72-32 72-32zM160 192l64-144 64 144 144 64-144 64-64 144-64-144-144-64 144-64zM480 344l32 72 72 32-72 32-32 72-32-72-72-32 72-32 32-72z'/%3E%3C/svg%3E"); }
.fa-icon-angles-up { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='currentColor' d='M246.9 41.4l-22.6-22.6-22.6 22.6-160 160-22.6 22.6 45.3 45.3 22.6-22.6 137.4-137.4 137.4 137.4 22.6 22.6 45.3-45.3-22.6-22.6-160-160zm0 192l-22.6-22.6-22.6 22.6-160 160-22.6 22.6 45.3 45.3 22.6-22.6 137.4-137.4 137.4 137.4 22.6 22.6 45.3-45.3-182.6-182.6z'/%3E%3C/svg%3E"); }
.fa-icon-angles-down { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='currentColor' d='M246.9 470.6l-22.6 22.6-22.6-22.6-160-160-22.6-22.6 45.3-45.3 22.6 22.6 137.4 137.4 137.4-137.4 22.6-22.6 45.3 45.3-182.6 182.6zm0-192l-22.6 22.6-22.6-22.6-160-160-22.6-22.6 45.3-45.3 22.6 22.6 137.4 137.4 160-160 45.3 45.3-22.6 22.6-160 160z'/%3E%3C/svg%3E"); }
.fa-icon-chevron-down { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M256.3 429.3l214.6-214.6 22.6-22.6-45.3-45.3-22.6 22.6-169.4 169.4-169.4-169.4-22.6-22.6-45.3 45.3 22.6 22.6 192 192 22.6 22.6z'/%3E%3C/svg%3E"); }
.fa-icon-chevron-left { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E%3Cpath fill='currentColor' d='M3 256l22.6 22.6 192 192 22.6 22.6 45.3-45.3-22.6-22.6-169.4-169.4 169.4-169.4 22.6-22.6-45.3-45.3-22.6 22.6-192 192-22.6 22.6z'/%3E%3C/svg%3E"); }
.fa-icon-chevron-right { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E%3Cpath fill='currentColor' d='M317.5 256L294.9 278.6 102.9 470.6 80.3 493.3 35 448 57.6 425.4 227 256 57.6 86.6 35 64 80.3 18.7 102.9 41.4 294.9 233.4 317.5 256z'/%3E%3C/svg%3E"); }
.fa-icon-square-check { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='currentColor' d='M448 480l-448 0 0-448 448 0 0 448zM308.5 151l-119.4 164.2-69.1-69.1-33.9 33.9 88.9 88.9 19.8 19.9 16.5-22.7 135.9-186.9 14.1-19.4-38.8-28.3-14.1 19.4z'/%3E%3C/svg%3E"); }
.fa-icon-circle-check { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M256 512a256 256 0 1 1 0-512 256 256 0 1 1 0 512zm84.5-361l-119.4 164.2-69.1-69.1-33.9 33.9 88.9 88.9 19.8 19.9 16.5-22.7 135.9-186.9 14.1-19.4-38.8-28.3-14.1 19.4z'/%3E%3C/svg%3E"); }
.fa-icon-circle-info { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512zM216 336l24 0 0-64-48 0 0-48 96 0 0 112 32 0 0 48-128 0 0-48 24 0zm72-144l-64 0 0-64 64 0 0 64z'/%3E%3C/svg%3E"); }
.fa-icon-square-info { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='currentColor' d='M448 32l-448 0 0 448 448 0 0-448zM184 336l24 0 0-64-48 0 0-48 96 0 0 112 32 0 0 48-128 0 0-48 24 0zm72-208l0 64-64 0 0-64 64 0z'/%3E%3C/svg%3E"); }
.fa-icon-lightbulb-on { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M512 192c0 71.1-38.6 133.1-96 166.3l0 25.7-192 0 0-25.7C166.6 325.1 128 263.1 128 192 128 86 214 0 320 0S512 86 512 192zM224 528l0-96 192 0 0 96-192 0zm16-344c0-39.8 32.2-72 72-72l8 0 0-48-8 0c-66.3 0-120 53.7-120 120l0 8 48 0 0-8zM58.7 26.5l53.5 26.7-21.5 42.9C60.3 81 19.5 60.6 15.8 58.7L37.3 15.8 58.7 26.5zm544 42.9C579.6 81 561.8 89.9 549.3 96.2L527.8 53.3C558.2 38 599 17.7 602.7 15.8l21.5 42.9-21.5 10.7zM24 168l56 0 0 48-80 0 0-48 24 0zm560 0l56 0 0 48-80 0 0-48 24 0zM90.7 341.5C67.6 353 49.8 361.9 37.3 368.2L15.8 325.3C46.2 310 87 289.7 90.7 287.8l21.5 42.9-21.5 10.7zm458.5-53.7l74.9 37.5-21.5 42.9-74.9-37.5 21.5-42.9z'/%3E%3C/svg%3E"); }
.fa-icon-users { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M320 16a104 104 0 1 1 0 208 104 104 0 1 1 0-208zM96 88a72 72 0 1 1 0 144 72 72 0 1 1 0-144zm14.7 392l-110.7 0 48-192 107 0-41.8 181.2-2.5 10.8zm418.5 0l-2.5-10.8-41.8-181.2 107 0 48 192-110.7 0zM472 160a72 72 0 1 1 144 0 72 72 0 1 1 -144 0zM208 272l224 0 48 208-320 0 48-208z'/%3E%3C/svg%3E"); }
.fa-icon-user { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='currentColor' d='M224 248a120 120 0 1 0 0-240 120 120 0 1 0 0 240zM432 512l-64-208-288 0-64 208 416 0z'/%3E%3C/svg%3E"); }
.fa-icon-desktop { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M512 32l-512 0 0 384 208 0-16 48-96 0 0 48 320 0 0-48-96 0-16-48 208 0 0-384zM448 96l0 224-384 0 0-224 384 0z'/%3E%3C/svg%3E"); }
.fa-icon-server { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='currentColor' d='M448 32l-448 0 0 192 448 0 0-192zM280 104a24 24 0 1 1 0 48 24 24 0 1 1 0-48zm56 24a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zM448 288l-448 0 0 192 448 0 0-192zM280 360a24 24 0 1 1 0 48 24 24 0 1 1 0-48zm56 24a24 24 0 1 1 48 0 24 24 0 1 1 0-64z'/%3E%3C/svg%3E"); }
.fa-icon-shield-check { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M267.6 4.5l207.5 80.5 19.2 7.4 1.2 20.5c2.9 50-4.9 126.3-37.3 200.9-32.7 75.2-91.1 150-189.4 192.6l-12.7 5.5-12.7-5.5C144.9 463.9 86.6 389.2 53.9 313.9 21.5 239.3 13.7 162.9 16.6 113L17.8 92.5 37 85 244.5 4.5 256 0 267.6 4.5zm45.8 165.3L227.8 287.6c-19.3-20-33.7-34.9-43.2-44.7l-34.5 33.3c6.2 6.4 27.2 28.1 63.1 65.2l19.8 20.6 16.8-23.1 102.4-140.8 14.1-19.4-38.8-28.2-14.1 19.4z'/%3E%3C/svg%3E"); }
.fa-icon-phone { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M0 64L128 0 224.8 128 144 208c33 70.4 89.6 127 160 160l80-80.8 128 96.8-64 128-16 0C193.4 512 0 318.6 0 80L0 64z'/%3E%3C/svg%3E"); }
.fa-icon-building { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath fill='currentColor' d='M384 0L0 0 0 512 384 512 384 0zM240 352l0 112-96 0 0-112 96 0zM96 96l64 0 0 64-64 0 0-64zm192 0l0 64-64 0 0-64 64 0zM96 224l64 0 0 64-64 0 0-64zm192 0l0 64-64 0 0-64 64 0z'/%3E%3C/svg%3E"); }
.fa-icon-print { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M64 0l304 0 80 80 0 64-384 0 0-144zM0 192l512 0 0 192-64 0 0 128-384 0 0-128-64 0 0-192zM128 416l0 32 256 0 0-96-256 0 0 64zM456 272a24 24 0 1 0 -48 0 24 24 0 1 0 48 0z'/%3E%3C/svg%3E"); }
.fa-icon-file-code { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath fill='currentColor' d='M0 0L240 0 384 144 384 512 0 512 0 0zM208 58.5L208 176 325.5 176 208 58.5zM154.2 295.6l15.6-18.2-36.4-31.2c-5 5.9-26.2 30.6-63.6 74.2L56.4 336c3.2 3.7 23.6 27.6 61.4 71.6l15.6 18.2 36.4-31.2c-7.2-8.5-24-28-50.2-58.6l34.6-40.4zm112-31.2l-15.6-18.2-36.4 31.2c7.2 8.5 24 28 50.2 58.6-26.2 30.6-43 50.1-50.2 58.6l36.4 31.2c5-5.8 26.2-30.6 63.6-74.2L327.6 336c-3.2-3.7-23.6-27.6-61.4-71.6z'/%3E%3C/svg%3E"); }
.fa-icon-location-dot { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath fill='currentColor' d='M0 188.6C0 84.4 86 0 192 0S384 84.4 384 188.6C384 339.4 192 528 192 528S0 339.4 0 188.6zM192 256a64 64 0 1 0 0-128 64 64 0 1 0 0 128z'/%3E%3C/svg%3E"); }
.fa-icon-wrench-simple { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath fill='currentColor' d='M128 160l64 64 64-64 0-160c74.6 26.4 128 92.4 128 176 0 71.1-38.6 133.1-96 166.3l0 169.7-192 0 0-169.7C38.6 309.1 0 247.1 0 176 0 92.4 53.4 26.4 128 0l0 160z'/%3E%3C/svg%3E"); }
.fa-icon-chart-line-up { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M64 32l0 384 448 0 0 64-512 0 0-448 64 0zM304 349.3c-6.6-6.6-38.6-38.6-96-96-30.7 30.7-52 52-64 64L98.7 272c8.2-8.2 37.1-37.1 86.6-86.6L208 162.7c6.6 6.6 38.6 38.6 96 96l65.4-65.4-65.4-65.4 176 0 0 176-65.4-65.4C345.1 308.2 308.2 345.1 304 349.3z'/%3E%3C/svg%3E"); }
.fa-icon-users-gear { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath fill='currentColor' d='M320 224a104 104 0 1 0 0-208 104 104 0 1 0 0 208zM96 232a72 72 0 1 0 0-144 72 72 0 1 0 0 144zm14.7 248l2.5-10.8 41.8-181.2-107 0-48 192 110.7 0zm49.3 0l184.6 0-2.1-3.7-24-41.6 32.4-18.7-32.4-18.7c14.7-25.4 33.3-57.7 56-97l16.3-28.3-182.8 0-48 208zM616 160a72 72 0 1 0 -144 0 72 72 0 1 0 144 0zM544 288l-64 0 0 33.2c-12.7 4.3-24.2 11-34 19.7l-28.8-16.6-32 55.4 28.8 16.6c-1.3 6.4-1.9 12.9-1.9 19.7s.7 13.3 1.9 19.7l-28.8 16.6 32 55.4 28.8-16.6c9.8 8.7 21.4 15.4 34.1 19.7l0 33.2 64 0 0-33.2c12.7-4.3 24.2-11 34.1-19.7l28.8 16.6 32-55.4-28.8-16.6c1.3-6.4 1.9-12.9 1.9-19.7s-.7-13.3-1.9-19.7l28.8-16.6-32-55.4-28.8 16.6c-9.8-8.7-21.4-15.4-34-19.7l0-33.2zM472 416a40 40 0 1 1 80 0 40 40 0 1 1 -80 0z'/%3E%3C/svg%3E"); }
.fa-icon-network-wired { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath fill='currentColor' d='M328 88l0 48-80 0 0-48 80 0zM248 32l-56 0 0 160 64 0 0 32-256 0 0 64 128 0 0 32-64 0 0 160 192 0 0-160-64 0 0-32 192 0 0 32-64 0 0 160 192 0 0-160-64 0 0-32 128 0 0-64-256 0 0-32 64 0 0-160-136 0zM120 376l80 0 0 48-80 0 0-48zm336 0l0 48-80 0 0-48 80 0z'/%3E%3C/svg%3E"); }
.fa-icon-book-open-cover { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath fill='currentColor' d='M288 140l0 248.1 27.8-9.9c48.4-17.3 99.3-26.1 150.7-26.1l45.5 0 0-256-45.5 0c-36.7 0-73.1 6.3-107.6 18.6-37.5 13.4-61.2 21.8-70.9 25.3zM512 32l64 0 0 384-109.5 0c-44 0-87.7 7.6-129.2 22.4L288 456 238.6 438.4C197.2 423.6 153.5 416 109.5 416L0 416 0 32 109.5 32c44 0 87.7 7.6 129.2 22.4L288 72 337.4 54.4C378.8 39.6 422.5 32 466.5 32L512 32zM0 464l109.5 0c46.8 0 93.2 8 137.2 23.8l41.3 14.7 41.3-14.7c44-15.7 90.5-23.8 137.2-23.8l109.5 0 0 48-109.5 0c-41.3 0-82.2 7.1-121.1 21l-49.4 17.6-8.1 2.9-8.1-2.9-49.4-17.6c-38.9-13.9-79.8-21-121.1-21L0 512 0 464z'/%3E%3C/svg%3E"); }
.fa-icon-handshake { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath fill='currentColor' d='M288 64l0 0 128 0 48 32 112-64 0 288-70.4 56C411.3 282.5 346.8 218.5 312 184l0 0-47.4 47.4c-21.5 21.5-52.1 28.2-79.3 20.1-.4-.1-.8-.2-1.1-.3-7-2.2-13.8-5.4-20.1-9.5-.4-.3-.9-.6-1.3-.9-3.9-2.7-7.7-5.8-11.2-9.4L144 224 288 64zM160 64l63.4 0c-90.8 100.9-139.4 154.8-145.6 161.7 25.6 25.6 38.8 38.8 39.6 39.6 50 50 131 50 181 0l13.6-13.6 157.9 156.6-41.3 34.4c-26.9-26.9-44.5-44.5-52.7-52.7L342.1 424c8.7 8.7 25.2 25.2 49.6 49.6l-7.7 6.4-62.1 0c-31.3-31.3-50.6-50.6-57.9-57.9L230.1 456c13 13 21 21 24 24L192 480 0 320 0 32 112 96 160 64z'/%3E%3C/svg%3E"); }
.fa-icon-cloud { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath fill='currentColor' d='M448 480L0 480 0 336c0-62.7 40.1-116 96-135.8L96 176c0-79.5 64.5-144 144-144 55.4 0 103.5 31.3 127.6 77.1 14.2-8.3 30.8-13.1 48.4-13.1 53 0 96 43 96 96l0 49.1c38.3 22.1 64 63.5 64 110.9l0 128-128 0z'/%3E%3C/svg%3E"); }
.fa-icon-tv-retro { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M160-13.3c6.6 6.6 38.6 38.6 96 96 57.4-57.4 89.4-89.4 96-96L397.3 32c-12 12-33.3 33.3-64 64l178.7 0 0 384-512 0 0-384 178.7 0c-30.7-30.7-52-52-64-64L160-13.3zM384 160l-320 0 0 256 320 0 0-256zm88 72a24 24 0 1 0 -48 0 24 24 0 1 0 48 0zM448 336a24 24 0 1 0 0-48 24 24 0 1 0 0 48z'/%3E%3C/svg%3E"); }
.fa-icon-triangle-exclamation { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath fill='currentColor' d='M560 480L16 480 288-16 560 480zM260 356l0 56 56 0 0-56-56 0zm-4-196l12.8 160 38.4 0 12.8-160-64 0z'/%3E%3C/svg%3E"); }
.fa-icon-hard-drive { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='currentColor' d='M448 32l-448 0 0 208 448 0 0-208zm0 256l-448 0 0 192 448 0 0-192zM224 384a32 32 0 1 1 64 0 32 32 0 1 1 -64 0zm128-32a32 32 0 1 1 0 64 32 32 0 1 1 0-64z'/%3E%3C/svg%3E"); }
.fa-icon-up-right-and-down-left-from-center { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M512 0l0 208-71-71-96 96-17 17c-8.8-8.8-25.1-25.1-49-49l-17-17 17-17 96-96-71-71 208 0zM0 512l0-208 71 71 96-96 17-17c8.8 8.8 25.1 25.1 49 49l17 17-17 17-96 96 71 71-208 0z'/%3E%3C/svg%3E"); }
.fa-icon-down-left-and-up-right-to-center { --fa-icon-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath fill='currentColor' d='M488.4-9.9c8.8 8.8 25.1 25.1 49 49l17 17-17 17-96 96 71 71-208 0 0-208 71 71 96-96 17-17zM272.4 272l0 208-71-71-96 96-17 17c-8.8-8.8-25.1-25.1-49-49l-17-17 17-17 96-96-71-71 208 0z'/%3E%3C/svg%3E"); }
.main-col > .section:first-of-type { margin-top: var(--space-lg); }
#sec-02 { order: 1; }
#sec-03 { order: 2; }
#sec-01 { order: 3; }
#sec-04 { order: 4; }
#sec-05 { order: 5; }
#sec-06 { order: 6; }
/* ── GROUP LABEL — "Managed IT Services" eyebrow above section I ── */
.group-label {
order: 0;
margin-left: var(--section-offset);
margin-bottom: calc(var(--space-xs) * -1);
font-family: 'DM Mono', monospace;
font-size: 0.6875rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--accent);
opacity: 0.7;
}
.group-label-sections {
opacity: 0.6;
letter-spacing: 0.06em;
}
/* ── GROUP DIVIDER — separates Server Managed from Site Management ── */
.group-divider {
order: 3;
border: none;
border-top: 1px solid var(--border);
margin: var(--space-xs) var(--section-offset) var(--space-xs) var(--section-offset);
opacity: 0.5;
}
/* ── GROUP STRIP — bracket alongside sections IIII ── */
#sec-02::after, #sec-03::after, #sec-01::after {
content: '';
position: absolute;
left: calc(var(--section-offset) * -1 + 2px);
top: -12px;
bottom: -12px;
width: 6px;
border-left: 3px solid var(--group-strip);
pointer-events: none;
z-index: 0;
}
/* Top cap — wraps above first section */
#sec-02::after {
top: -12px;
border-top: 3px solid var(--group-strip);
border-top-left-radius: 4px;
}
/* Bottom cap — wraps below last section */
#sec-01::after {
bottom: -12px;
border-bottom: 3px solid var(--group-strip);
border-bottom-left-radius: 4px;
}
.section-header {
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto;
align-items: start;
gap: var(--space-stack) var(--space-lg);
margin-bottom: var(--space-2xl);
}
.section:not(.sec-open) .section-header {
margin-bottom: 0;
grid-template-columns: minmax(0, 1fr) auto;
row-gap: var(--space-md);
column-gap: var(--space-stack);
}
.section-num {
font-family: 'Cinzel', serif;
font-weight: 700;
font-size: var(--section-num-size);
line-height: 1;
color: var(--border);
flex-shrink: 0;
width: var(--section-num-width);
user-select: none;
position: absolute;
left: calc(var(--section-offset) * -1);
top: calc(var(--section-padding-top) - 2px);
text-align: right;
transition: color var(--transition-medium, 0.2s) ease, opacity var(--transition-medium, 0.2s) ease;
}
.sec-active .section-num {
color: var(--accent);
opacity: 0.9;
}
.section-title-block {
min-width: 0;
max-width: none;
width: 100%;
grid-column: 1;
grid-row: 1;
}
.section:not(.sec-open) .section-title-block {
grid-column: 1;
grid-row: 1;
max-width: none;
width: 100%;
}
.section:not(.sec-open) .section-num {
position: absolute;
left: calc(var(--section-offset) * -1);
top: calc(var(--section-padding-top) - 2px);
width: var(--section-num-width);
font-size: clamp(22px, 2.2vw, 40px);
color: var(--accent);
text-align: right;
opacity: 0.82;
}
.section:not(.sec-open) .section-title {
max-width: none;
}
.section-title {
font-family: 'Poppins', sans-serif;
font-size: clamp(1.375rem, 1.5vw, 1.75rem);
font-weight: 700;
color: var(--ink);
line-height: var(--text-title-line);
word-break: break-word;
max-width: none;
text-wrap: pretty;
}
.section-title-tag { font-size: 0.9375rem; font-weight: 400; opacity: 0.6; }
.section-subtitle {
grid-column: 1 / -1;
grid-row: 3;
font-size: 0.9em;
font-weight: 400;
color: var(--muted);
margin-top: var(--space-xs);
line-height: var(--text-copy-line);
max-width: none;
}
.section-badge {
font-family: 'DM Mono', monospace;
font-size: var(--text-label-size);
text-transform: uppercase;
letter-spacing: 0.1em;
padding: var(--control-pad-y-tight) var(--control-pad-x-tight);
border: 1px solid var(--border);
border-radius: var(--radius-control);
color: var(--muted);
display: inline-block;
margin-top: var(--space-stack-tight);
}
.section-toggle { cursor: pointer; user-select: none; }
.sec-chevron {
display: flex;
align-items: center;
justify-content: center;
align-self: start;
grid-column: 3;
grid-row: 1;
color: var(--muted);
transition: transform var(--transition-medium) ease, color var(--transition-fast);
flex-shrink: 0;
transform: rotate(0deg);
width: 34px;
height: 34px;
background: var(--surface-chevron);
border-radius: var(--radius-control);
margin-top: 2px;
}
.sec-open .sec-chevron { transform: rotate(180deg); color: var(--ink); background: var(--surface-chevron-active); }
.section-toggle:hover .sec-chevron { color: var(--ink); background: var(--surface-chevron-active); }
.sec-chevron svg { display: block; }
.section-body {
overflow: hidden;
opacity: 1;
transition: height 0.34s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.22s ease;
will-change: height, opacity;
}
.section-content { min-width: 0; }
.section-content > * + * { margin-top: var(--space-stack-roomy); }
.section-content > .collapsible-header + .collapsible-body,
.section-content > .collapsible-body + .collapsible-header {
margin-top: 0;
}
.section-content > .feature-card-grid + .collapsible-header,
.section-content > .callout-green + .feature-card-grid,
.section-content > .callout-red + .feature-card-grid {
margin-top: var(--space-stack-tight);
}
@container (max-width: 520px) {
.section {
margin-left: 0;
padding: clamp(18px, 5cqi, 24px) clamp(18px, 5cqi, 22px) clamp(22px, 6cqi, 26px);
}
.section-header,
.section:not(.sec-open) .section-header {
grid-template-columns: auto minmax(0, 1fr) auto;
column-gap: var(--space-stack-tight);
row-gap: var(--space-sm);
align-items: center;
}
.section-num,
.section:not(.sec-open) .section-num {
position: static;
grid-column: 1;
grid-row: 1;
width: auto;
font-size: 1rem;
color: var(--accent);
text-align: left;
opacity: 0.85;
align-self: center;
margin-top: 0;
}
.section-title-block,
.section:not(.sec-open) .section-title-block {
grid-column: 2;
grid-row: 1;
max-width: none;
width: 100%;
}
.section-title {
font-size: 1.1rem;
max-width: none;
}
.section-subtitle {
font-size: 0.8125rem;
max-width: none;
}
.sec-chevron {
grid-column: 3;
grid-row: 1;
align-self: center;
margin-top: 0;
}
}
/* ── SECTION SUMMARY BADGE ──────────────────────────────────────
Shown only when section is COLLAPSED (display:none by default).
JS: setSummary(id, text) sets textContent + display:inline-block
when collapsed(secId) && !!text. Hidden when section is open.
On mobile (≤600px) placed in grid col 2 row 1 (top-right of header).
─────────────────────────────────────────────────────────────── */
@keyframes badgeFadeIn {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
}
.sec-summary-badge {
display: none;
align-items: center;
font-family: 'DM Mono', monospace;
font-size: 0.9375rem;
font-weight: 700;
font-variant-numeric: tabular-nums;
letter-spacing: 0.08em;
color: var(--accent);
background: var(--surface-summary-badge);
border: 2px solid var(--border-summary-badge);
border-radius: 8px;
padding: 8px 16px;
white-space: normal;
line-height: var(--text-compact-line);
max-width: min(100%, 26ch);
margin-top: var(--space-md);
text-align: left;
align-self: flex-start;
box-shadow: 0 1px 4px rgba(45, 122, 168, 0.2);
animation: badgeFadeIn 0.25s ease both;
}
.sec-open .sec-summary-badge {
display: none !important;
}
.section:not(.sec-open) .sec-summary-badge {
width: fit-content;
max-width: 100%;
margin-top: var(--space-md);
}
.section:not(.sec-open) .sec-chevron {
position: static;
grid-column: 2;
grid-row: 1;
justify-self: end;
margin-top: 2px;
}
/* Override collapsed chevron + summary badge position at small container */
@container (max-width: 520px) {
.section:not(.sec-open) .sec-chevron {
grid-column: 3;
align-self: center;
margin-top: 0;
}
.section:not(.sec-open) .sec-summary-badge {
width: 100%;
max-width: none;
margin-top: 0;
}
}
/* Hide subtitle when collapsed — title + controls are enough */
.section:not(.sec-open) .section-subtitle { display: none; }
/* ── CONTROLS ROW (stepper + badge + summary — full-width row 2) ── */
.sec-controls-row {
grid-column: 1 / -1;
grid-row: 2;
display: flex;
align-items: stretch;
gap: var(--space-stack-tight);
margin-top: var(--space-xs);
}
.sec-controls-row .num-stepper {
flex: 0 0 auto;
}
.sec-controls-row .num-input {
width: 56px;
}
.section .sec-controls-row > .section-badge,
.section .sec-controls-row > .sec-summary-badge {
display: flex;
align-items: center;
justify-content: center;
align-self: stretch;
min-height: 40px;
margin: 0;
padding: 0 var(--control-pad-x-tight);
white-space: nowrap;
line-height: 1;
border-width: 1px;
box-sizing: border-box;
max-width: none;
}
.section .sec-controls-row > .section-badge {
flex: 1 1 0%;
}
.section .sec-controls-row > .sec-summary-badge {
flex: 0 0 auto;
}
.sec-open .sec-controls-row > .sec-summary-badge { display: none !important; }
/* ── Controls row: small container — stack full-width ── */
@container (max-width: 520px) {
.sec-controls-row {
grid-row: 2;
flex-direction: column;
gap: 6px;
}
.sec-controls-row .num-stepper {
width: 100%;
max-width: none;
}
.sec-controls-row .num-input {
flex: 1 1 0%;
width: auto;
min-width: 0;
}
.sec-controls-row .step-btn {
width: 40px;
flex-shrink: 0;
}
.section .sec-controls-row > .section-badge,
.section .sec-controls-row > .sec-summary-badge {
width: 100%;
max-width: none;
align-self: stretch;
justify-content: center;
min-height: 36px;
}
}
/* ── PILL TOGGLE (Section II — M365 vs BYOL) ───────────────────
CSS-only toggle using hidden radio inputs + adjacent label styling.
input:checked + label gets accent background.
JS reads: document.getElementById("rateBYOL").checked
On mobile (≤600px) stacks vertically (grid-template-columns:1fr).
─────────────────────────────────────────────────────────────── */
.pill-toggle {
display: grid;
grid-template-columns: 1fr 1fr;
border: 1px solid var(--border);
border-radius: var(--radius-control);
overflow: hidden;
margin-bottom: 0;
}
.pill-toggle input[type=radio] { display: none; }
.pill-toggle label {
padding: var(--space-lg) var(--space-xl);
cursor: pointer;
border-right: 1px solid var(--border);
transition: background var(--transition-fast);
display: flex;
flex-direction: column;
gap: 6px;
}
.pill-toggle label:last-child { border-right: none; }
.pill-toggle input:focus-visible + label {
outline: 2px solid var(--accent);
outline-offset: -2px;
}
.pill-toggle input:checked + label {
background: var(--accent);
color: var(--text-on-accent);
}
.pill-toggle input:checked + label .pill-price { color: var(--text-on-accent); }
.pill-toggle input:checked + label .pill-desc { color: var(--text-on-accent-strong); }
.pill-toggle label .pill-price {
font-family: 'DM Mono', monospace;
font-size: 1.25rem;
font-weight: 500;
color: var(--ink);
}
.pill-toggle label .pill-price small { font-size: 0.875rem; opacity: 0.6; }
.pill-toggle label .pill-desc { font-size: 0.875rem; opacity: 0.7; }
.pill-toggle label .pill-savings {
display: block;
font-size: 0.75rem;
font-family: 'DM Mono', monospace;
color: var(--green);
margin-top: var(--space-xs);
letter-spacing: 0.02em;
}
.pill-toggle input:checked + label .pill-savings { color: var(--text-pill-savings-active); }
.pill-price .m365-price-grey {
color: var(--muted);
text-decoration: line-through;
opacity: 0.5;
margin-right: 6px;
font-size: 1rem;
}
.pill-toggle input:checked + label .m365-price-grey {
color: var(--text-on-accent);
opacity: 0.45;
}
/* ── TIER SEGMENT (Section VI — VoIP Basic/Standard/Premium) ───
3-column radio toggle. JS activateTier(tier) adds .active class.
.active overrides text colours to white on accent background.
Rates: basic $28 | standard $35 | premium $45 /seat/mo.
─────────────────────────────────────────────────────────────── */
.tier-seg-wrap {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
border: 1px solid var(--border);
border-radius: var(--radius-control);
overflow: hidden;
margin-bottom: 0;
}
.tier-seg-wrap input[type=radio] { display: none; }
.tier-seg-wrap input[type=radio]:focus-visible + .tier-seg {
outline: 2px solid var(--accent);
outline-offset: -2px;
}
.tier-seg {
padding: var(--space-stack-roomy) var(--space-stack-tight);
cursor: pointer;
border-right: 1px solid var(--border);
text-align: center;
transition: background var(--transition-fast);
}
.tier-seg:last-of-type { border-right: none; }
.tier-seg.active { background: var(--accent); }
.tier-seg .tier-name {
font-family: 'DM Mono', monospace;
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--muted);
}
.tier-seg.active .tier-name { color: var(--text-on-accent); }
.tier-seg .tier-price {
font-family: 'DM Mono', monospace;
font-size: 1.375rem;
color: var(--ink);
margin-top: 3px;
}
.tier-seg.active .tier-price { color: var(--text-on-accent); }
.tier-seg .tier-sub { font-size: 0.75rem; color: var(--muted); margin-top: 2px; }
.tier-seg.active .tier-sub { color: var(--text-on-accent-strong); }
/* ── INNER COLLAPSIBLES (What's Included / Add-Ons) ────────────
Separate from section-level collapse. JS toggleCollapsible(id)
toggles .open on .collapsible-body and swaps +/- on toggle icon.
.addon-preview-pill pills shown when collapsed (JS toggleCollapsible).
Arrow on RIGHT side to differentiate from section chevron.
─────────────────────────────────────────────────────────────── */
.collapsible-header {
display: flex;
align-items: center;
gap: var(--space-sm);
cursor: pointer;
padding: var(--space-stack) var(--space-md);
border: 1px solid var(--border);
border-radius: 8px;
margin-top: var(--space-sm);
background: var(--surface-feature);
user-select: none;
transition: background var(--transition-fast), border-color var(--transition-fast);
}
.collapsible-header:hover {
background: color-mix(in srgb, var(--accent) 6%, var(--surface-feature));
border-color: color-mix(in srgb, var(--accent) 15%, var(--border));
}
.collapsible-header--mt16 { margin-top: var(--space-stack-roomy); }
.collapsible-header--addon { flex-wrap: wrap; gap: var(--space-xs); }
.collapsible-toggle {
color: var(--accent);
width: 22px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
order: 1;
margin-left: auto;
transition: transform var(--transition-medium) ease;
}
.collapsible-toggle.open { transform: rotate(180deg); }
.collapsible-toggle .fa-icon { display: block; }
.collapsible-label {
font-family: 'DM Mono', monospace;
font-size: 13px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--ink);
order: 0;
}
.addon-preview-wrap {
display: flex; flex-wrap: wrap; gap: 5px;
width: 100%; padding-left: 0; margin-top: 6px;
order: 2;
}
.addon-preview-pill {
font-family: 'DM Mono', monospace;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--muted);
border: 1px solid var(--border);
border-radius: var(--radius-control);
padding: var(--control-pad-y-tight) var(--control-pad-x-tight);
white-space: nowrap;
transition: color var(--transition-fast), border-color var(--transition-fast), background var(--transition-fast);
}
.addon-preview-pill.active {
color: var(--green);
border-color: var(--green);
background: var(--surface-positive-pill);
}
.collapsible-body {
padding: var(--space-stack-tight) 0 var(--space-stack-tight) var(--space-3xl);
overflow: hidden;
max-height: 0;
opacity: 0;
transition: max-height 0.3s ease, opacity 0.2s ease;
}
.collapsible-body.open {
max-height: 2000px;
opacity: 1;
}
/* FEATURE LIST */
.feature-list {
list-style: none;
display: flex;
flex-direction: column;
gap: var(--space-md);
margin: var(--space-xs) 0 0;
padding: 0;
}
.feature-list li {
font-size: var(--text-copy-size);
color: var(--muted);
line-height: var(--text-copy-line);
padding-left: var(--space-lg);
position: relative;
}
.feature-list li::before {
content: '✓';
position: absolute;
left: 0;
color: var(--green);
font-size: 11px;
}
.byol-mode .m365-feature { text-decoration: line-through; opacity: 0.55; }
.byol-mode .m365-feature::before { color: var(--amber); }
/* ── NUMBER INPUTS ──────────────────────────────────────────────
.input-row — flex row: label left, .num-input right
.num-input — DM Mono, text-align:center, oninput→update()
On mobile (≤600px) input-row stacks (flex-direction:column)
and num-input goes full width.
─────────────────────────────────────────────────────────────── */
.input-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-stack-roomy) 0;
border-top: 1px solid var(--border);
}
.input-label { font-family: 'Lato', sans-serif; font-weight: 700; font-size: 16px; }
.input-sublabel { font-size: 13px; color: var(--muted); margin-top: 6px; line-height: var(--text-compact-line); }
.num-stepper {
display: flex;
align-items: stretch;
flex-shrink: 0;
}
.step-btn {
background: var(--surface-step);
border: 1px solid var(--surface-step-border);
color: var(--text-step);
font-size: 1.125rem;
font-weight: 400;
min-width: 44px;
min-height: 44px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.12s, color 0.12s, border-color var(--transition-fast, 150ms) ease;
flex-shrink: 0;
user-select: none;
line-height: 1;
}
.step-btn:first-child { border-radius: var(--radius-control) 0 0 var(--radius-control); border-right: none; }
.step-btn:last-child { border-radius: 0 var(--radius-control) var(--radius-control) 0; border-left: none; }
.step-btn:hover { background: var(--surface-step-hover); color: var(--ink); border-color: var(--accent); }
.step-btn:active { background: var(--surface-step-active); color: var(--btn-primary-fg); border-color: var(--accent); }
.num-input {
background: var(--surface-input);
border: 1px solid var(--surface-step-border);
border-radius: 0;
color: var(--ink);
font-family: 'DM Mono', monospace;
font-size: 1.125rem;
font-weight: 700;
width: 56px;
height: 44px;
text-align: center;
padding: var(--space-sm);
outline: none;
}
.num-input:focus { border-color: var(--accent); }
.num-input::-webkit-inner-spin-button,
.num-input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
.num-input[type=number] { -moz-appearance: textfield; }
/* ── ADDON ROWS ─────────────────────────────────────────────────
.addon-row — clickable label wrapping a hidden checkbox.
JS toggleAddon(cbId, rowId) toggles .selected class on row.
.selected gets accent-tinted background + border.
Price is right-aligned via margin-left:auto on .addon-price.
─────────────────────────────────────────────────────────────── */
.addon-grid { display: flex; flex-direction: column; gap: var(--space-sm); }
.addon-row {
display: flex;
align-items: flex-start;
gap: var(--space-md);
padding: var(--space-md) var(--space-stack);
border-radius: 8px;
cursor: pointer;
border: 1px solid transparent;
transition: background 0.12s, border-color 0.12s;
}
.addon-row:hover {
background: var(--surface-addon-hover);
border-color: var(--border-addon-hover);
}
.addon-row input[type=checkbox] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 18px;
height: 18px;
border: 2px solid var(--border);
border-radius: 4px;
background: transparent;
flex-shrink: 0;
margin-top: 3px;
cursor: pointer;
position: relative;
transition: background var(--transition-fast), border-color var(--transition-fast);
}
.addon-row input[type=checkbox]:checked {
background: var(--accent);
border-color: var(--accent);
}
.addon-row input[type=checkbox]:checked::after {
content: '';
position: absolute;
left: 5px;
top: 1px;
width: 5px;
height: 10px;
border: solid var(--text-on-accent);
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.addon-row:hover input[type=checkbox] {
border-color: var(--accent);
}
.addon-name { font-family: 'Lato', sans-serif; font-weight: 700; font-size: 15px; line-height: 1.35; }
.addon-price {
font-family: 'DM Mono', monospace;
font-size: 14px;
color: var(--accent);
white-space: nowrap;
margin-left: auto;
flex-shrink: 0;
}
.addon-desc { font-size: 13px; color: var(--muted); margin-top: 6px; line-height: var(--text-compact-line); }
@container (max-width: 760px) {
.addon-row {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
grid-template-rows: auto auto;
column-gap: var(--space-stack-tight);
row-gap: var(--space-sm);
padding: var(--space-stack) var(--space-md);
align-items: start;
}
.addon-row input[type=checkbox] {
grid-column: 1;
grid-row: 2;
margin-top: 2px;
}
.addon-row > div {
grid-column: 2;
grid-row: 2;
min-width: 0;
}
.addon-price {
grid-column: 1 / -1;
grid-row: 1;
margin-left: 0;
font-size: 0.8125rem;
white-space: normal;
}
.addon-name {
font-size: 0.875rem;
}
.addon-desc {
font-size: 0.75rem;
}
}
/* ── BYOL CALLOUTS (Section II) ────────────────────────────────
Shown/hidden by JS based on BYOL toggle state.
#byolCalloutGreen — M365 savings message (shown when M365 selected)
#byolCalloutRed — missed savings warning (shown when BYOL selected)
display:flex + align-items:flex-start keeps icon pinned to
first line; text wrapped in <span> so it never flows under icon.
─────────────────────────────────────────────────────────────── */
.callout-green {
background: var(--surface-success);
border: 1px solid var(--surface-success-border);
border-radius: var(--radius-control);
padding: var(--space-stack-roomy) var(--space-xl);
font-family: 'DM Mono', monospace;
font-size: 14px;
color: var(--green);
margin-bottom: 0;
line-height: 1.65;
display: flex;
align-items: flex-start;
gap: 9px;
}
.callout-red {
background: var(--surface-danger);
border: 1px solid var(--surface-danger-border);
border-radius: var(--radius-control);
padding: var(--space-stack-roomy) var(--space-xl);
font-family: 'DM Mono', monospace;
font-size: 14px;
color: var(--text-danger);
margin-bottom: 0;
line-height: 1.65;
display: flex;
align-items: flex-start;
gap: 9px;
}
.hidden { display: none !important; }
/* ── ADMIN FEE PROGRESS BAR (Section I) ────────────────────────
Shows progress toward $650 engagement threshold.
JS: progressEl width% = (baseSubtotal / ADMIN_FEE_MINIMUM) * 100
baseSubtotal = users + endpoints + servers (NOT VoIP or ZT).
Turns green at 100% (threshold met), stays blue below.
─────────────────────────────────────────────────────────────── */
.progress-wrap { margin: var(--space-stack) 0 var(--space-stack-tight); }
/* Threshold bar promoted outside section-body for always-visible display */
.sec-01-threshold.progress-wrap { margin: var(--space-stack-roomy) 0 0; }
.sec-01-threshold.floor-note { margin-top: var(--space-stack-tight); }
.section:not(.sec-open) .sec-01-threshold.progress-wrap { margin-top: var(--space-stack); margin-bottom: 0; }
.sec-open .sec-01-threshold + .floor-note + .section-body { margin-top: 0; }
.progress-label {
font-family: 'DM Mono', monospace;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
display: flex;
justify-content: space-between;
margin-bottom: 6px;
}
.progress-track {
height: 7px;
background: var(--border);
border-radius: 4px;
overflow: hidden;
}
.progress-fill {
height: 100%;
border-radius: 3px;
background: var(--accent);
transition: width 0.3s ease, background 0.3s;
}
/* ── ADMIN FEE BREAKDOWN TABLE (Section I) ─────────────────────
Shows: Base Site Admin | ZT Supplement (if active) | Total.
.fee-total row has top border separator and bold text.
All values rendered by update() via getEl('sl-admin-val') etc.
─────────────────────────────────────────────────────────────── */
.fee-table { width: 100%; border-collapse: collapse; margin-top: var(--space-stack-roomy); font-size: 14px; }
.fee-table td { padding: var(--space-sm) 0; color: var(--muted); }
.fee-table td:last-child { text-align: right; font-family: 'DM Mono', monospace; color: var(--ink); }
.fee-table tr.fee-total td { border-top: 1px solid var(--border); padding-top: var(--space-stack); color: var(--ink); font-weight: 600; }
/* ── FEATURE CARDS (Section I — What's Covered) ────────────────
Static content — 8 cards in single-column grid.
Each card has icon (inline SVG) + title (Poppins) + desc (Lato).
Not dynamically rendered; content is hard-coded in HTML.
─────────────────────────────────────────────────────────────── */
.feature-card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: var(--space-stack-roomy);
margin-top: 0;
}
.feature-card {
background: var(--surface-feature);
border: 1px solid var(--border);
border-radius: 10px;
padding: var(--space-stack) var(--space-stack-roomy);
}
.feature-card-title { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 0.9375rem; margin-bottom: var(--space-sm); display:flex; align-items:center; line-height: 1.35; }
.feature-card-desc { font-size: 0.8125rem; color: var(--muted); line-height: var(--text-copy-line); }
.m365-app-strip {
border: 1px solid var(--border);
border-radius: var(--radius-card);
padding: var(--space-lg) var(--space-lg) var(--space-stack);
background: var(--surface-feature);
}
.m365-app-list {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: var(--space-stack);
}
.m365-app-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
text-align: center;
padding: var(--space-stack) var(--space-sm);
border-radius: 10px;
transition: background var(--transition-fast), transform var(--transition-fast);
}
.m365-app-item:hover {
background: color-mix(in srgb, var(--accent) 8%, transparent);
transform: translateY(-1px);
}
.m365-app-icon {
width: 28px;
height: 28px;
object-fit: contain;
display: block;
}
.m365-app-name {
font-family: 'DM Mono', monospace;
font-size: 0.6875rem;
font-weight: 500;
letter-spacing: 0.06em;
color: var(--ink);
opacity: 0.85;
}
.m365-app-strip-note {
margin-top: var(--space-md);
padding-top: var(--space-sm);
font-family: 'DM Mono', monospace;
font-size: 0.6875rem;
letter-spacing: 0.06em;
color: var(--muted);
}
.m365-app-note-byol { display: none; }
.m365-app-strip.byol-disabled .m365-app-item {
background: transparent;
border: 1px dashed var(--border);
}
.m365-app-strip.byol-disabled .m365-app-icon {
filter: grayscale(1) saturate(0.2);
opacity: 0.4;
}
.m365-app-strip.byol-disabled .m365-app-name {
color: var(--muted);
}
.m365-app-strip.byol-disabled .m365-app-note-default { display: none; }
.m365-app-strip.byol-disabled .m365-app-note-byol {
display: inline;
color: var(--amber);
}
/* ── SIDEBAR (Desktop only, ≤1100px hidden) ─────────────────────
.sidebar-header — accent blue, shows "SVS MSP — LIVE QUOTE" + client name
.sidebar-body — all pricing lines, MRR total, notes, VS comparison,
nudge banner, export button
.sidebar-line — each service line (icon + label + value)
.sidebar-mrr — large Poppins 48px MRR total
IMPORTANT: nudgeBanner sits between .sidebar-header and .sidebar-body.
On mobile: the desktop sidebar is cloned into .mobile-panel-sheet
with _m IDs and synced by update() via syncEl/syncClass.
─────────────────────────────────────────────────────────────── */
.sidebar {
--sidebar-rule-color: var(--sidebar-line-rule);
--sidebar-copy-size: 0.84375rem;
--sidebar-copy-line: 1.5;
--sidebar-note-size: 0.78125rem;
--sidebar-mono-size: 0.75rem;
--sidebar-mrr-size: 2.8125rem;
background: var(--surface-sidebar);
border: 1px solid var(--border-sidebar);
border-radius: var(--radius-card);
overflow: hidden;
box-shadow: var(--shadow-sidebar);
}
.sidebar-focus-backdrop {
position: fixed;
inset: 0;
background: var(--surface-sidebar-focus-backdrop);
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
opacity: 0;
pointer-events: none;
transition: opacity 0.2s ease;
z-index: 520;
}
.sidebar-header {
padding: var(--space-stack) 22px var(--space-md);
background: var(--surface-sidebar-header);
}
.sidebar-header-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-md);
}
.sidebar-title {
font-family: 'DM Mono', monospace;
font-size: 0.6875rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--text-sidebar-kicker);
margin-bottom: 0;
}
/* Print button inside sidebar header — only visible in focus mode */
.sidebar-focus-print-btn {
display: none;
align-items: center;
justify-content: center;
height: 34px;
padding: 0 var(--space-stack);
border: 1px solid var(--border-overlay-btn);
border-radius: 10px;
background: var(--surface-overlay-btn);
color: var(--text-sidebar-kicker);
font-family: 'DM Mono', monospace;
font-size: 0.6875rem;
letter-spacing: 0.08em;
text-transform: uppercase;
cursor: pointer;
transition: background var(--transition-fast) ease, border-color var(--transition-fast) ease;
flex: 0 0 auto;
margin-left: auto;
}
.sidebar-focus-print-btn:hover {
background: var(--surface-overlay-btn-hover);
border-color: var(--border-overlay-btn-hover);
}
.sidebar-focus-print-btn:active { transform: translateY(1px); }
.sidebar-focus-toggle {
width: 34px;
height: 34px;
border: 1px solid var(--border-overlay-btn);
border-radius: 10px;
background: var(--surface-overlay-btn);
color: var(--text-sidebar-kicker);
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background var(--transition-fast) ease, border-color var(--transition-fast) ease, transform var(--transition-fast) ease;
flex: 0 0 auto;
}
.sidebar-focus-toggle:hover {
background: var(--surface-overlay-btn-hover);
border-color: var(--border-overlay-btn-hover);
}
.sidebar-focus-toggle:active { transform: translateY(1px); }
.sidebar-focus-toggle:focus-visible {
outline: 2px solid var(--focus-ring-overlay);
outline-offset: 2px;
}
.sidebar-focus-icon-close { display: none; }
.sidebar-focus-client {
display: none;
margin: var(--space-xs) 0 var(--space-lg);
padding-top: 0;
border-top: none;
}
.sidebar-focus-client-label {
display: block;
font-family: 'DM Mono', monospace;
font-size: 0.625rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: color-mix(in srgb, var(--ink) 62%, var(--muted));
margin-bottom: var(--space-sm);
}
.sidebar-focus-client-name {
display: block;
font-family: 'Poppins', sans-serif;
font-size: 1rem;
font-weight: 600;
line-height: 1.25;
color: var(--ink);
margin-bottom: var(--space-stack);
}
.sidebar-body { padding: var(--space-stack) 22px var(--space-xl); background: var(--surface-sidebar-body); }
.sidebar-focus-columns { display: block; }
.sidebar-focus-col + .sidebar-focus-col { margin-top: var(--space-stack); }
.sidebar-focus-col > #vsComparison { margin-top: var(--space-lg); }
.sidebar-hero {
margin-bottom: var(--space-stack);
}
.sidebar-group {
display: flex;
flex-direction: column;
padding: var(--space-stack) var(--space-stack-roomy);
border-radius: var(--radius-control);
}
.sidebar-group--monthly {
background: var(--sidebar-zone-services);
border-radius: var(--radius-card);
padding: var(--space-stack-roomy);
}
.sidebar-group--tax {
background: var(--sidebar-zone-tax);
}
.sidebar-group--invoice {
background: var(--sidebar-zone-invoice);
}
.sidebar-group--value {
background: var(--sidebar-zone-value);
}
.sidebar-group--summary {
background: var(--sidebar-zone-summary);
}
.sidebar-group + .sidebar-group {
margin-top: var(--space-stack);
}
/* Subtle hover tint for line scanning readability */
.sidebar-line:hover {
background: var(--surface-accent-soft, rgba(45, 122, 168, 0.07));
border-left-color: var(--accent);
padding-left: calc(var(--space-xs) + 4px);
}
.sidebar-group-title {
display: block;
flex: 0 0 auto;
min-height: 12px;
font-family: 'DM Mono', monospace;
font-size: 0.625rem;
font-weight: 500;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--sidebar-group-title-color);
margin: 0 0 var(--space-stack-tight);
}
.sidebar-line {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: var(--space-stack);
font-size: var(--sidebar-copy-size);
color: var(--muted);
line-height: var(--sidebar-copy-line);
padding: var(--space-stack-tight) var(--space-xs);
border-bottom: 1px var(--sidebar-line-rule-style) var(--sidebar-rule-color);
border-left: 2px solid transparent;
border-radius: 2px;
transition: background var(--transition-fast, 150ms) ease,
border-color var(--transition-fast, 150ms) ease,
padding-left var(--transition-fast, 150ms) ease;
}
/* Remove border on last visible line before a group boundary */
.sidebar-group > .sidebar-line:last-child,
#sidebarLines > .sidebar-line:last-of-type {
border-bottom: none;
}
.sidebar-line > span:first-child { flex: 1 1 auto; min-width: 0; }
.sidebar-line .val {
font-family: 'DM Mono', monospace;
font-weight: 600;
color: var(--text-money);
font-size: var(--sidebar-copy-size);
line-height: 1.2;
letter-spacing: 0.02em;
flex: 0 0 auto;
padding-left: var(--space-sm);
text-align: right;
}
.sidebar-line .lbl-icon { margin-right: var(--space-sm); opacity: 0.82; }
.sidebar-mrr-label {
font-family: 'DM Mono', monospace;
font-size: 0.625rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: var(--space-sm);
}
.sidebar-mrr {
font-family: 'Poppins', sans-serif;
font-weight: 800;
font-size: 3rem;
color: var(--text-money-hero);
line-height: 0.94;
letter-spacing: -0.02em;
text-shadow: 0 2px 12px rgba(245, 240, 232, 0.08);
margin-bottom: var(--space-stack-roomy);
}
.sidebar-line-value .val,
.sidebar-line-opportunity .val {
font-weight: 600;
}
.sidebar-line-value .lbl-icon .fa-icon,
.sidebar-line-opportunity .lbl-icon .fa-icon {
width: 15px;
height: 15px;
}
.sidebar-line-opportunity {
border-bottom-style: dotted;
}
.sidebar-line-opportunity .val {
color: var(--amber);
}
/* ── VS IN-HOUSE COMPARISON ─────────────────────────────────────
Shown only when users > 0 OR endpoints > 0 (JS toggles .hidden).
Compares SVS MRR (annualised) vs 1-person Ottawa IT hire ($85K+tools)
and 5-person team ($420K+tools). Savings rows turn amber if SVS
costs MORE than the comparison (rare at low seat counts).
updateVsComparison(q) renders this section in update().
─────────────────────────────────────────────────────────────── */
.vs-header {
display: flex;
flex-direction: column;
gap: var(--space-stack-tight);
margin-bottom: var(--space-stack-roomy);
}
.vs-brand-row {
display: flex;
align-items: center;
gap: var(--space-stack-tight);
}
.vs-brand-logo {
flex: 0 0 auto;
display: block;
}
.vs-brand-name {
font-family: 'Poppins', sans-serif;
font-size: 1rem;
font-weight: 600;
line-height: 1.2;
color: var(--ink);
letter-spacing: 0.02em;
}
.vs-table { width: 100%; border-collapse: collapse; font-size: 0.775rem; line-height: 1.56; }
.vs-table td { padding: 7px var(--space-xs); vertical-align: middle; }
.vs-table td:last-child { text-align: right; font-family: 'DM Mono', monospace; white-space: nowrap; }
.vs-table tr:not(.vs-save-row) { opacity: 0.85; }
.vs-table tr.vs-save-row { opacity: 1; }
.vs-table tr:first-child td { padding-top: 2px; padding-bottom: var(--space-stack-roomy); border-bottom: 1px solid var(--border); }
.vs-table tr:nth-child(2) td,
.vs-table tr:nth-child(4) td { padding-top: var(--space-stack-roomy); }
.vs-save-row td {
padding: 11px var(--space-stack);
font-size: 0.71875rem;
font-family: 'DM Mono', monospace;
letter-spacing: 0.07em;
line-height: 1.35;
}
.vs-save-row td:first-child { border-radius: 8px 0 0 8px; }
.vs-save-row td:last-child { border-radius: 0 8px 8px 0; }
.vs-label {
font-family: 'DM Mono', monospace;
font-size: 0.6875rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 0;
display: flex;
align-items: center;
gap: var(--space-sm);
}
.vs-label::after { content: ''; flex: 1; height: 1px; background: var(--border); }
/* ── INSIGHT NUDGE BANNER ───────────────────────────────────────
Contextual sales insight shown at bottom of sidebar.
Conditions (evaluated in update() → renderNudge()):
amber — ZT active
green — BYOL selected + users > 0
green — PWM not selected + users > 0
Auto-rotates every 30s via startNudgeRotation() (setInterval).
Manual nav via cycleNudge(dir) — does NOT reset the timer.
.nudge-nav-btn — SVG chevron pills ( ), hidden when only 1 nudge.
BOTH #nudgeBanner and #nudgeBanner_m are updated by renderNudge()
via applyNudge('') and applyNudge('_m').
nudgeBanner sits between .sidebar-header and .sidebar-body.
─────────────────────────────────────────────────────────────── */
.nudge-banner {
margin: 0;
padding: var(--space-xl) 22px;
font-size: 0.84375rem;
line-height: 1.6;
min-height: 132px;
box-sizing: border-box;
border-radius: var(--radius-control);
transition: opacity 0.18s ease, background var(--transition-medium) ease, border-color var(--transition-medium) ease;
}
.nudge-banner.nudge-fading { opacity: 0; }
.nudge-banner.amber {
background: var(--surface-warning);
color: var(--amber);
border-left: 4px solid var(--amber);
}
.nudge-banner.green {
background: var(--surface-success);
color: var(--green);
border-left: 4px solid var(--green);
}
.nudge-banner-label {
font-family: 'DM Mono', monospace;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.12em;
opacity: 1;
display: block;
margin-bottom: 0;
}
#nudgeCounter {
font-size: 0.75rem;
opacity: 0.55;
}
.nudge-nav-btn {
background: var(--surface-ghost);
border: 1px solid var(--border-nudge-nav);
cursor: pointer;
padding: 0;
width: 34px;
height: 34px;
border-radius: 7px;
display: flex;
align-items: center;
justify-content: center;
color: inherit;
flex-shrink: 0;
transition: background var(--transition-fast), transform 0.1s;
}
.nudge-nav-btn:hover { background: var(--surface-ghost-hover); transform: scale(1.06); }
.nudge-nav-btn:active { transform: scale(0.95); }
.nudge-nav-btn .fa-icon { display: block; --icon-size: 16px; }
/* ── QUOTE SETTINGS BAR ─────────────────────────────────────────
Sits below the client bar, above Section I.
Left: contract term 3-way toggle.
Right: HST checkbox + one-time fee input.
Tokenized left alignment stays matched to the section gutter.
─────────────────────────────────────────────────────────────── */
/* ── SECTIONS TOOLBAR (Collapse All / Expand All) ───────────────── */
.sections-toolbar {
display: flex;
justify-content: flex-start;
margin-left: var(--section-offset);
margin-bottom: var(--space-stack);
}
.btn-toggle-all {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: var(--control-min-height);
font-family: 'DM Mono', monospace;
font-size: var(--text-meta-size);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
background: none;
border: 1px solid var(--border);
border-radius: var(--radius-control);
padding: var(--control-pad-y) var(--control-pad-x);
cursor: pointer;
touch-action: manipulation;
transition: color var(--transition-fast), border-color var(--transition-fast), background var(--transition-fast);
}
.btn-toggle-all:hover {
color: var(--ink);
border-color: var(--accent);
background: var(--surface-accent-soft);
}
.quote-settings-bar {
margin-left: var(--section-offset);
padding: clamp(18px, 2.4vw, 22px) clamp(20px, 2.8vw, 26px);
display: grid;
grid-template-columns: minmax(0, 1.55fr) 1px minmax(18rem, 0.95fr);
align-items: stretch;
gap: 0;
background: var(--surface-settings);
border: 1px solid var(--border);
border-radius: var(--radius-card);
overflow: hidden;
}
.qs-group {
display: flex;
flex-direction: column;
gap: var(--space-stack-tight);
container-type: inline-size;
min-width: 0;
width: 100%;
padding: 0 clamp(18px, 2.5cqi, 24px) 0 0;
max-width: none;
}
.qs-label {
font-family: 'DM Mono', monospace;
font-size: var(--text-meta-size);
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
}
.qs-label-row {
display: flex;
flex-direction: column;
gap: var(--space-sm);
margin-bottom: 2px;
}
.qs-term-wrap {
margin-bottom: 0;
border: 1px solid var(--border-term-wrap);
border-radius: var(--space-stack);
background: var(--surface-term-wrap);
box-shadow: var(--shadow-term-wrap);
}
.qs-term-wrap .tier-seg {
padding: clamp(14px, 2.5cqi, 16px) clamp(12px, 2.3cqi, 14px) clamp(14px, 2.4cqi, 15px);
background: var(--surface-term-tile);
transition: background 200ms ease, color 200ms ease, border-color 200ms ease, box-shadow 200ms ease, transform 200ms ease;
}
.qs-term-wrap .tier-seg:hover {
background: var(--surface-term-tile-hover);
}
.qs-term-wrap .tier-seg.active {
background: var(--surface-term-tile-active);
border-color: var(--border-term-tile-active);
box-shadow: var(--shadow-term-tile-active);
}
.qs-term-wrap .tier-name {
font-size: 12px;
font-weight: 400;
margin-bottom: 6px;
color: var(--text-term-name);
word-break: normal;
overflow-wrap: normal;
text-wrap: pretty;
}
.qs-term-wrap .tier-seg.active .tier-name {
color: var(--text-term-name-active);
font-weight: 700;
}
.qs-term-wrap .tier-sub {
margin-top: 0;
line-height: var(--text-compact-line);
overflow-wrap: break-word;
word-break: normal;
text-wrap: pretty;
color: var(--text-term-sub);
font-weight: 400;
}
.qs-term-wrap .tier-seg.active .tier-sub {
color: var(--text-term-sub-active);
font-weight: 400;
}
.qs-term-wrap .tier-price { display: none; }
/* Best Value badge on 24-month */
.qs-best-badge {
display: inline-flex;
max-width: 100%;
font-family: 'DM Mono', monospace;
font-size: 8px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--text-best-value);
background: var(--surface-best-value);
border: 1px solid var(--border-best-value);
border-radius: var(--radius-control);
padding: 2px var(--space-sm);
vertical-align: middle;
margin-left: 5px;
line-height: 1.5;
white-space: nowrap;
}
.tier-seg.active .qs-best-badge {
color: var(--text-best-value-active);
background: var(--surface-best-value-active);
border-color: var(--border-best-value-active);
}
/* Discount sub-text — !important overrides parent .tier-seg color inheritance */
.qs-discount-sub {
color: var(--text-term-discount) !important;
font-weight: 700;
}
.tier-seg.active .qs-discount-sub { color: var(--text-term-discount-active) !important; }
.qs-savings-stack {
display: flex;
flex-direction: column;
gap: var(--space-stack-tight);
margin-top: var(--space-stack);
}
/* Dynamic savings row — appears below selector when discounted term active */
.qs-savings-row {
display: flex;
align-items: center;
gap: var(--space-stack-tight);
font-family: 'DM Mono', monospace;
font-size: 0.8125rem;
letter-spacing: 0.04em;
color: var(--green);
margin-top: 0;
padding: var(--space-stack) var(--space-lg);
border: 1px solid color-mix(in srgb, var(--green) 22%, var(--border));
border-left: 4px solid var(--green);
border-radius: var(--radius-control);
background: color-mix(in srgb, var(--surface-positive-badge) 60%, transparent);
line-height: 1.5;
}
.qs-savings-row.hidden { display: none; }
.qs-savings-row .fa-icon { color: var(--green); flex-shrink: 0; opacity: 0.3; }
.qs-savings-row strong { color: var(--green); font-weight: 700; }
/* Vertical divider between contract term and onboarding fee */
.qs-divider {
width: 1px;
height: auto;
background: var(--surface-settings-divider);
margin: 0;
align-self: stretch;
}
.qs-right {
display: flex;
flex-direction: column;
gap: var(--space-md);
padding: 0 0 0 clamp(18px, 2.5cqi, 24px);
justify-content: center;
min-width: 0;
max-width: none;
}
@container (max-width: 1040px) {
.quote-settings-bar {
grid-template-columns: 1fr;
row-gap: var(--space-lg);
}
.qs-group {
padding-right: 0;
}
.qs-divider {
width: auto;
height: 1px;
}
.qs-right {
padding-left: 0;
}
}
/* ── Custom toggle switch (replaces native checkbox for Waive) ── */
.qs-toggle-row {
display: flex;
align-items: center;
gap: 9px;
cursor: pointer;
user-select: none;
}
.qs-toggle-row input[type=checkbox] { display: none; }
.qs-toggle-row input[type=checkbox]:focus-visible + .qs-switch {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.qs-switch {
width: 34px;
height: 20px;
background: var(--surface-switch-off);
border-radius: 10px;
position: relative;
transition: background 0.2s;
flex-shrink: 0;
}
.qs-switch::after {
content: '';
position: absolute;
width: 14px;
height: 14px;
background: var(--surface-switch-knob);
border-radius: 50%;
top: 3px;
left: 3px;
transition: left 0.2s, background 0.2s;
box-shadow: var(--shadow-switch-knob);
}
.qs-toggle-row input:checked ~ .qs-switch {
background: var(--surface-switch-on);
box-shadow: 0 0 8px rgba(58, 184, 112, 0.3);
}
.qs-toggle-row input:checked ~ .qs-switch::after { left: 17px; }
.qs-fee-waive:has(input:disabled) { opacity: 0.5; cursor: default; }
.qs-fee-input:disabled { opacity: 0.4; cursor: not-allowed; }
.qs-toggle-label {
font-family: 'DM Mono', monospace;
font-size: 12px;
color: var(--muted);
letter-spacing: 0.04em;
}
.qs-fee-row {
display: flex;
flex-direction: column;
gap: var(--space-stack-tight);
padding: var(--space-sm) 0 0;
}
.qs-fee-header {
display: flex;
align-items: center;
gap: var(--space-stack-tight);
}
.qs-fee-waive {
margin-left: 0;
align-self: flex-start;
padding: var(--control-pad-y-tight) var(--control-pad-x-tight);
border: 1px solid var(--border);
border-radius: 999px;
background: color-mix(in srgb, var(--surface-input) 85%, transparent);
}
.qs-fee-label {
font-family: 'DM Mono', monospace;
font-size: 13px;
color: var(--ink);
letter-spacing: 0.04em;
line-height: var(--text-compact-line);
}
.qs-fee-input-wrap {
display: flex;
align-items: center;
background: var(--surface-input);
border: 1px solid var(--border);
border-radius: 10px;
overflow: hidden;
width: 100%;
}
.qs-fee-dollar {
padding: 6px var(--space-sm);
font-family: 'DM Mono', monospace;
font-size: 14px;
color: var(--muted);
background: var(--surface-input);
border-right: 1px solid var(--border);
}
.qs-fee-input {
background: var(--surface-input);
border: none;
color: var(--ink);
font-family: 'DM Mono', monospace;
font-size: 18px;
width: 100%;
min-width: 0;
text-align: left;
padding: var(--space-md) var(--space-stack);
outline: none;
}
.qs-fee-input::placeholder {
color: color-mix(in srgb, var(--muted) 86%, transparent);
opacity: 1;
font-size: 15px;
}
.qs-fee-input::-webkit-inner-spin-button,
.qs-fee-input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
.qs-fee-input[type=number] { -moz-appearance: textfield; }
/* ── INLINE-STYLE REPLACEMENT CLASSES ───────────────────────────
These replace presentational style="" attributes that previously
bypassed the design token system. All colours use tokens.
─────────────────────────────────────────────────────────────── */
/* Section I — admin fee display row */
/* .admin-fee-header base styles merged into the waived section definition at line ~1079 */
.admin-fee-title { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1.375rem; }
.admin-fee-val { font-family: 'DM Mono', monospace; font-size: 1.375rem; color: var(--accent); }
.admin-fee-sub { font-size: 0.75rem; color: var(--muted); margin-bottom: var(--space-stack); line-height: var(--text-compact-line); }
.floor-note { font-size: 12px; color: var(--muted); margin-top: var(--space-stack-tight); margin-bottom: var(--space-stack-roomy); font-family: 'DM Mono', monospace; letter-spacing: 0.08em; text-transform: uppercase; line-height: var(--text-compact-line); }
/* Sidebar sub-line rows (users/endpoints/admin breakdown text) */
.sl-sub {
font-size: var(--sidebar-mono-size);
color: var(--muted);
font-family: 'DM Mono', monospace;
line-height: 1.6;
letter-spacing: 0.02em;
padding: var(--space-xs) 0 var(--space-stack) var(--space-2xl);
}
.sl-sub-row {
display: grid;
align-items: start;
}
.sl-sub-row-base {
grid-template-columns: minmax(0, 1fr);
}
.sl-sub-row-addon {
grid-template-columns: minmax(0, 1fr) auto;
column-gap: var(--space-md);
padding: 5px 0 0;
border-top: 1px dotted color-mix(in srgb, var(--sidebar-rule-color) 88%, transparent);
}
.sl-sub-row + .sl-sub-row {
margin-top: 2px;
}
.sl-sub-copy {
min-width: 0;
}
.sl-sub-row-addon .sl-sub-copy {
padding-left: var(--space-md);
}
.sl-sub-val {
color: var(--muted);
text-align: right;
white-space: nowrap;
}
/* Per-user cost section */
.per-user-cost-sub { display: inline-block; font-size: 0.625rem; opacity: 0.6; font-weight: 400; margin-top: 3px; }
.sidebar-note-mono { font-size: var(--sidebar-mono-size); padding: 2px 0 6px; font-family: 'DM Mono', monospace; line-height: 1.45; }
/* VS Comparison block */
.vs-comparison-wrap {
margin-top: var(--space-stack-roomy);
margin-bottom: var(--space-stack);
padding: var(--space-xl) var(--space-xl) var(--space-lg);
background: var(--surface-compare);
border: 1px solid var(--border-compare);
border-radius: var(--radius-card);
}
.vs-svs-label { font-size: 0.9375rem; color: var(--text-vs-heading); font-weight: 600; line-height: 1.3; }
.vs-val-accent { color: var(--text-vs-accent); font-weight: 600; font-size: 0.9375rem; }
.vs-td-muted { color: var(--text-vs-muted); font-size: 0.8125rem; line-height: 1.45; }
.vs-td-icon { margin-right: 6px; opacity: 0.7; vertical-align: middle; }
.vs-footnote {
font-size: 0.6875rem;
color: var(--muted);
margin-top: var(--space-stack);
padding-top: var(--space-md);
border-top: 1px solid var(--border);
line-height: 1.6;
font-style: italic;
}
/* Side note icons and savings highlight */
.savings-amount { color: var(--green); }
.sl-otf-waived > span:first-child { color: var(--green); text-decoration: line-through; text-decoration-color: var(--green); }
.sl-otf-waived .val { color: var(--green); }
.sl-otf-waived .otf-amt { text-decoration: none; }
.sl-otf-waived .otf-amt-strike { text-decoration: line-through; text-decoration-color: var(--green); opacity: 0.7; margin-right: var(--space-xs); }
.sl-otf-waived .otf-waived-label { text-decoration: none; font-weight: 600; letter-spacing: 0.06em; font-size: 0.7rem; margin-right: var(--space-xs); }
/* ── ADMIN FEE WAIVED display */
.admin-fee-header { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-stack-tight); margin-bottom: 6px; }
.admin-fee-waive-toggle { margin-left: auto; }
.admin-fee-strike { text-decoration: line-through; color: var(--muted); text-decoration-color: var(--muted); }
.admin-fee-waived-badge { font-family: 'DM Mono', monospace; font-size: 0.75rem; font-weight: 700; letter-spacing: 0.08em; color: var(--green); background: var(--surface-positive-badge); border: 1px solid var(--border-positive-badge); border-radius: var(--radius-control); padding: 2px var(--space-sm); vertical-align: middle; }
.sl-admin-waived > span:first-child { text-decoration: line-through; text-decoration-color: var(--muted); color: var(--muted); }
.admin-waive-savings { display: flex; align-items: center; gap: var(--space-sm); font-family: 'DM Mono', monospace; font-size: 0.78125rem; letter-spacing: 0.04em; color: var(--green); background: var(--surface-positive-panel); border: 1px solid var(--border-positive-panel); border-radius: var(--radius-control); padding: var(--space-stack-tight) var(--space-stack); margin-top: var(--space-md); margin-bottom: 6px; }
.admin-waive-savings.hidden { display: none; }
#adminWaivedAmt { font-weight: 700; }
/* Nudge banner internal flex rows */
.nudge-header-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-stack-tight); }
.nudge-nav-group { display: flex; gap: var(--space-sm); }
/* VoIP savings prompt */
.savings-prompt { font-size: 0.8125rem; color: var(--muted); margin-top: var(--space-sm); }
/* ── SIDEBAR UTILITY CLASSES ─────────────────────────────────────
.sl-muted — de-emphasised row labels/values
.sl-discount-val — green discount amount
.sl-hst-val — muted HST amount
─────────────────────────────────────────────────────────────── */
/* Sidebar utility classes — !important overrides .sidebar-line .val compound selector */
.sl-muted { color: var(--muted) !important; font-size: 0.6875rem; }
.sl-discount-val { color: var(--green) !important; }
.sl-discount-detail { font-size: 0.7rem; opacity: 0.7; }
.sl-hst-val { color: var(--text-money) !important; font-size: var(--sidebar-copy-size); }
.sidebar-line-discount { border-bottom-style: dashed; border-bottom-color: var(--sidebar-rule-color); opacity: 0.8; }
.sidebar-line.sidebar-line-hst {
margin-top: 0;
padding-top: var(--space-stack-tight);
padding-bottom: var(--space-stack-tight);
border-top: 1px var(--sidebar-line-rule-style) var(--sidebar-rule-color);
border-bottom: none;
}
.sidebar-line.sidebar-line-total {
font-weight: 600;
margin-top: var(--space-sm);
border-top: 2px solid color-mix(in srgb, var(--accent) 30%, transparent);
border-bottom: none;
padding-top: var(--space-stack-roomy);
}
.sidebar-line.sidebar-line-total .val {
font-size: 1.1em;
font-weight: 700;
color: var(--text-money-hero);
}
.suffix-mo {
font-size: 0.7em;
font-weight: 500;
color: var(--muted);
letter-spacing: 0.02em;
}
.sl-hst-toggle {
justify-content: flex-start;
margin: var(--space-sm) 0;
}
body.sidebar-focus-open { overflow: hidden; }
body.sidebar-focus-open .sidebar-focus-backdrop {
opacity: 1;
pointer-events: auto;
}
body.sidebar-focus-open .side-col {
position: relative;
z-index: 530;
}
body.sidebar-focus-open .sidebar-utility { display: none; }
body.sidebar-focus-open .side-col .export-wrap { display: none; }
body.sidebar-focus-open .sidebar-focus-print-btn { display: inline-flex; }
body.sidebar-focus-open .side-col .sidebar {
position: fixed;
top: calc(var(--top-bar-sticky-offset) + 10px);
left: 50%;
right: auto;
transform: translateX(-50%);
width: min(var(--page-max-width), calc(100vw - 20px));
max-height: calc(100vh - var(--top-bar-sticky-offset) - 20px);
display: flex;
flex-direction: column;
z-index: 540;
box-shadow: var(--shadow-sidebar-focus);
}
body.sidebar-focus-open .side-col .sidebar-focus-client {
display: block;
}
body.sidebar-focus-open .side-col .sidebar-body {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
overscroll-behavior: contain;
padding: var(--space-4xl) var(--space-4xl) var(--space-3xl);
}
body.sidebar-focus-open .side-col .nudge-banner {
display: none !important;
}
body.sidebar-focus-open .side-col #vsComparison {
display: none !important;
}
body.sidebar-focus-open .side-col .sidebar-body > * {
min-width: 0;
}
body.sidebar-focus-open .side-col .sidebar-hero {
margin-bottom: var(--space-2xl);
}
body.sidebar-focus-open .side-col .sidebar-focus-columns {
display: grid;
grid-template-columns: minmax(0, 1.12fr) minmax(560px, 0.98fr);
gap: 0 42px;
align-items: start;
}
body.sidebar-focus-open .side-col .sidebar-focus-col {
display: flex;
flex-direction: column;
gap: var(--space-lg);
min-width: 0;
}
body.sidebar-focus-open .side-col .sidebar-focus-col + .sidebar-focus-col {
margin-top: 0;
}
body.sidebar-focus-open .side-col .sidebar-focus-col > .sidebar-group {
margin-top: 0;
}
body.sidebar-focus-open .side-col .sidebar-focus-col > #vsComparison {
margin-top: 0;
}
/* .export-wrap hidden in focus mode — see rule near line 1704 */
body.sidebar-focus-open .sidebar-focus-icon-open { display: none; }
body.sidebar-focus-open .sidebar-focus-icon-close { display: inline-flex; }
.mobile-panel-sheet .sidebar-focus-toggle { display: none; }
.mobile-panel-sheet .sidebar-focus-print-btn { display: none; }
/* ── VS COMPARISON CSS CLASSES (replace inline styles) ──────────
.vs-save-green — green "YOU SAVE" row background
.vs-save-amber — amber "Costs more" row background
.vs-val-green — green text for savings value/label
.vs-val-amber — amber text for "costs more" value/label
─────────────────────────────────────────────────────────────── */
.vs-save-green td { background: var(--surface-compare-success); }
.vs-save-amber td { background: var(--surface-compare-warning); }
/* VS value utility classes — !important overrides inherited td color */
.vs-val-green { color: var(--green) !important; }
.vs-val-amber { color: var(--amber) !important; }
/* ── SECTION CARD HOVER / OPEN POLISH ───────────────────────────
Subtle left accent glow on hover; stronger treatment when open.
─────────────────────────────────────────────────────────────── */
.section {
box-shadow: var(--shadow-card);
transition: border-color var(--transition-medium, 0.2s) ease, box-shadow var(--transition-medium, 0.2s) ease;
}
.section.sec-active {
border-left: 3px solid color-mix(in srgb, var(--accent) 50%, transparent);
}
.section:hover {
border-color: var(--section-hover-border);
box-shadow: var(--shadow-card-hover), var(--section-hover-shadow);
}
.section.sec-open {
border-color: var(--section-open-border);
box-shadow: var(--shadow-card-open), var(--section-open-shadow);
}
/* ── ADDON ROW SELECTED — stronger check indicator ──────────────
.selected gets a more prominent border + check indicator via
the checkbox's native accent-color. No pseudo-element needed.
─────────────────────────────────────────────────────────────── */
@keyframes stepper-pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.num-input.pulse {
animation: stepper-pulse 150ms ease-out;
}
@keyframes addonPulse {
0% { transform: scale(1); }
50% { transform: scale(1.015); }
100% { transform: scale(1); }
}
.addon-row.selected {
background: var(--surface-selected);
border-color: var(--accent);
box-shadow: inset 3px 0 0 0 var(--accent);
animation: addonPulse 0.2s ease;
}
.addon-row.selected .addon-name { color: var(--ink); }
.addon-row.selected .addon-price { color: var(--text-selected-accent); }
.addon-row.selected .addon-desc { color: color-mix(in srgb, var(--ink) 86%, var(--muted)); }
/* ── QUOTE NOTES ────────────────────────────────────────────────
Free-text notes field above export buttons.
Persisted in localStorage, included in print + JSON export.
─────────────────────────────────────────────────────────────── */
.quote-notes-wrap {
padding: var(--space-md) var(--space-xl) 0;
}
.quote-notes-label {
font-family: 'DM Mono', monospace;
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
display: block;
margin-bottom: 6px;
}
.quote-notes-input {
width: 100%;
background: var(--surface-card);
border: 1px solid var(--border);
border-radius: var(--radius-control);
color: var(--ink);
font-family: 'Poppins', sans-serif;
font-size: 12px;
padding: var(--space-sm) var(--space-stack-tight);
resize: vertical;
min-height: 56px;
max-height: 160px;
outline: none;
transition: border-color var(--transition-fast);
}
.quote-notes-input:focus {
border-color: var(--accent);
}
.quote-notes-input::placeholder {
color: var(--muted);
opacity: 0.5;
}
/* ── EXPORT BUTTONS ─────────────────────────────────────────────
Primary CTA: Print / Save PDF
Secondary: Export JSON + Copy
─────────────────────────────────────────────────────────────── */
.export-wrap {
padding: var(--space-stack-roomy) var(--space-xl) var(--space-lg);
background: transparent;
border-top: none;
display: flex;
flex-direction: column;
gap: var(--space-stack-tight);
}
.btn-export {
width: 100%;
background: var(--accent);
color: var(--btn-primary-fg);
border: none;
border-radius: var(--radius-control);
min-height: var(--control-min-height);
padding: var(--control-pad-y) var(--control-pad-x);
font-family: 'DM Mono', monospace;
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
cursor: pointer;
transition: background var(--transition-fast), transform 0.1s, filter var(--transition-fast), box-shadow var(--transition-fast);
display: flex;
align-items: center;
justify-content: center;
}
.btn-export:hover {
background: var(--btn-primary-hover);
filter: brightness(1.15);
box-shadow: var(--shadow-export-hover);
}
.btn-export:active { transform: scale(0.97); filter: brightness(0.95); }
.btn-export-secondary {
background: transparent;
border: 1px solid var(--border);
color: var(--muted);
font-size: 0.71875rem;
padding: var(--space-stack-tight) var(--space-stack);
}
.btn-export-secondary:hover { background: var(--card); border-color: var(--accent); color: var(--ink); }
/* ── VOIP PHONE BILL SAVINGS ESTIMATOR (Section VI) ────────────
Optional input: current monthly phone bill.
updateSavings(q) compares against voipTotal and shows green
savings message or amber warning if VoIP costs more.
On mobile stacks vertically (flex-direction:column).
─────────────────────────────────────────────────────────────── */
.savings-input-row {
display: flex;
align-items: center;
gap: var(--space-md);
margin-top: var(--space-stack-roomy);
padding-top: var(--space-stack-roomy);
border-top: 1px solid var(--border);
}
.savings-input-row label {
font-size: 0.875rem;
color: var(--muted);
flex: 1;
}
.savings-input-row input {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-control);
color: var(--ink);
font-family: 'DM Mono', monospace;
font-size: 1.125rem;
width: 120px;
text-align: center;
padding: var(--control-pad-y-tight) var(--control-pad-x-tight);
outline: none;
}
.savings-result {
margin-top: var(--space-md);
background: var(--surface-success);
border: 1px solid var(--surface-success-border);
border-radius: var(--radius-control);
padding: var(--control-pad-y) var(--control-pad-x);
font-family: 'DM Mono', monospace;
font-size: 0.875rem;
color: var(--green);
line-height: 1.65;
}
/* Amber modifier — toggled by JS (classList.add/remove) when VoIP quote > current bill */
.savings-result.savings-amber {
background: var(--surface-warning-panel);
border-color: var(--surface-warning-border);
color: var(--amber);
}
/* ── BOTTOM PITCH BANNER ────────────────────────────────────────
4-column grid (2-col on tablet/mobile) outside the .outer grid.
.pitch-inner has margin-left:96px to align with section cards.
Columns: Security-First | Ottawa-Based | Flat-Rate | Scales With You
.pitch-footer — green strip at bottom with tagline.
Icons are inline SVG (FA Free 6.5.0 paths), accent blue.
─────────────────────────────────────────────────────────────── */
.pitch-wrap {
width: 100%;
padding: 0;
margin: 0;
}
.pitch-inner {
margin-left: 0;
background: var(--card);
border: none;
border-top: 1px solid var(--border);
border-radius: 0;
overflow: hidden;
}
.pitch-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.pitch-item {
padding: 26px 22px;
border-right: 1px solid var(--border);
}
.pitch-item:last-child { border-right: none; }
.pitch-head {
display: flex;
align-items: center;
gap: var(--space-md);
margin-bottom: var(--space-stack-tight);
min-height: 28px;
}
.pitch-icon {
display: inline-flex;
align-items: center;
justify-content: center;
flex: 0 0 auto;
font-size: 20px;
color: var(--accent);
}
.pitch-title {
font-family: 'Poppins', sans-serif;
font-weight: 600;
font-size: 16px;
line-height: 1.3;
margin: 0;
}
.pitch-desc { font-size: var(--text-copy-size); color: var(--muted); line-height: var(--text-copy-line); }
.pitch-footer {
background: var(--surface-success);
border-top: 1px solid var(--surface-success-border);
padding: var(--space-sm) var(--space-3xl);
font-family: 'DM Mono', monospace;
font-size: 11px;
color: var(--green);
letter-spacing: 0.05em;
text-align: center;
}
@media (min-width: 1500px) {
.quote-settings-bar {
gap: var(--space-stack-tight);
}
.section-header {
margin-bottom: var(--space-3xl);
}
.sidebar-mrr {
font-size: 52px;
}
.pill-toggle label {
padding: var(--space-xl) 22px;
}
}