:root{--color-bg: #f8f9fa;--color-surface: #ffffff;--color-border: #e5e7eb;--color-text: #1f2937;--color-muted: #6b7280;--color-green: #16a34a;--color-red: #dc2626;--color-orange: #ea580c;--color-blue: #2563eb;--color-blue-bg: #eff6ff;--radius: 6px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:var(--color-bg);color:var(--color-text);line-height:1.5;-webkit-tap-highlight-color:transparent;padding-bottom:env(safe-area-inset-bottom)}button,select{-webkit-user-select:none;user-select:none}button:active,select:active{opacity:.7}button:focus-visible,select:focus-visible{outline:2px solid var(--color-blue);outline-offset:1px}.page-header{padding:1.5rem 2rem 0;max-width:960px;margin:0 auto}.page-header h1{font-size:1.5rem;margin-bottom:.25rem}.lead{color:var(--color-muted);font-size:.875rem}.assembly-main{display:grid;grid-template-columns:1fr 280px;gap:1rem;padding:1rem 2rem;max-width:960px;margin:0 auto}.assembly-left{display:flex;flex-direction:column;gap:1rem;min-width:0}.slot-group{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);overflow:hidden}.slot-group-header{padding:.5rem 1rem;font-weight:600;font-size:.8125rem;background:#f3f4f6;color:var(--color-muted);text-transform:uppercase}.bs-select{display:flex;align-items:center;gap:.25rem}.bs-select select{font-size:.75rem;padding:.25rem .5rem;border:1px solid var(--color-border);border-radius:var(--radius);background:#fff;color:var(--color-text);cursor:pointer;min-width:0}.bs-select button{font-size:.625rem;padding:.125rem .375rem;border:1px solid var(--color-border);border-radius:var(--radius);background:#fff;color:var(--color-muted);cursor:pointer}.bs-select button:hover{color:var(--color-red);border-color:var(--color-red)}.slot-card{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-bottom:1px solid var(--color-border);min-width:0;overflow:hidden}.slot-card:last-child{border-bottom:none}.slot-card.inactive{opacity:.35}.slot-status{width:1.25rem;height:1.25rem;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:.75rem;border-radius:50%}.slot-status.assigned{background:var(--color-green);color:#fff}.slot-status.available{background:#e5e7eb;color:var(--color-muted);font-size:.625rem;min-width:1.5rem;border-radius:999px;padding:0 .25rem}.slot-status.conflict{background:var(--color-red);color:#fff}.slot-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.8125rem}.slot-name span{color:var(--color-muted);font-size:.6875rem;margin-left:.25rem}.slot-picker{display:flex;align-items:center;gap:.25rem;flex-shrink:0}.slot-interfaces{font-size:.675rem;color:var(--color-muted);padding:.25rem 0 .1rem 1.75rem;border-top:1px dashed var(--color-border);margin-top:.1rem;min-width:0}.iface-row{display:flex;align-items:center;gap:.3rem;padding:.1rem 0;line-height:1.4}.iface-dir{width:1rem;text-align:center;flex-shrink:0;font-size:.7rem}.iface-dir.provides{color:var(--color-blue)}.iface-dir.consumes{color:var(--color-orange)}.iface-peer{color:var(--color-text);white-space:nowrap;font-weight:500}.iface-value{font-weight:500}.iface-status{font-size:.6rem}.iface-status.matched{color:var(--color-green)}.iface-status.conflict{color:var(--color-red)}.iface-peers{color:var(--color-muted);font-size:.625rem;margin-left:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:120px}.conflict-panel{display:flex;flex-direction:column;gap:.5rem}.conflict-card{background:#fef2f2;border:1px solid #fecaca;border-radius:var(--radius);padding:.5rem .75rem}.conflict-card h3{font-size:.8125rem;color:var(--color-red);margin-bottom:.25rem}.conflict-card p{font-size:.75rem;color:var(--color-muted)}.warning-card{background:#fff7ed;border-color:#fed7aa}.warning-card h3{color:var(--color-orange)}.empty-state{color:var(--color-muted);font-size:.8125rem;text-align:center;padding:2rem;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius)}.toolbar{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap}.toolbar button{font-size:.75rem;padding:.375rem .75rem;border:1px solid var(--color-border);border-radius:var(--radius);background:#fff;cursor:pointer}.toolbar button:hover{border-color:var(--color-blue);color:var(--color-blue)}.toolbar button.primary{background:var(--color-blue);color:#fff;border-color:var(--color-blue)}.complete-badge{font-size:.75rem;padding:.25rem .625rem;border-radius:999px;background:#dcfce7;color:#166534}.incomplete-badge{font-size:.75rem;padding:.25rem .625rem;border-radius:999px;background:#ffedd5;color:#9a3412}.auto-complete-error{font-size:.8rem;padding:.5rem .75rem;border-radius:var(--radius);background:#fef2f2;color:#dc2626;border:1px solid #fecaca}.auto-complete-error:before{content:"⚠ "}@media (max-width: 1023px){.assembly-main{grid-template-columns:1fr}.conflict-panel{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:.5rem}.empty-state{padding:1rem}.bs-select select{max-width:200px}.template-selector{padding:2rem 1.5rem}}@media (max-width: 767px){.page-header{padding:.75rem 1rem}.page-header h1{font-size:1.15rem}.assembly-main{padding:.5rem .75rem .75rem}.slot-card{flex-wrap:wrap;gap:.25rem}.slot-name{flex:1 1 100%;order:-1;white-space:normal;font-size:.8125rem}.bs-select{flex:1 1 100%}.bs-select select{flex:1;min-width:0;max-width:none;padding:.5rem;min-height:44px;font-size:.8125rem}.bs-select button{padding:.5rem .75rem;min-height:44px}.toolbar{gap:.5rem}.toolbar button{padding:.5rem .75rem;min-height:44px}.conflict-panel{grid-template-columns:1fr}.slot-interfaces{font-size:.75rem}.iface-row{flex-wrap:wrap}.iface-peers{max-width:none;font-size:.6875rem}.template-selector{padding:2rem 1rem}.template-selector-header h1{font-size:1.25rem}.template-grid{grid-template-columns:1fr;max-width:100%}.template-card{padding:1rem}}@media (max-width: 480px){.page-header{padding:.5rem .75rem}.page-header h1{font-size:1.05rem}.lead{font-size:.75rem}.assembly-main{padding:.5rem}.toolbar{flex-direction:column;align-items:stretch}.toolbar button{text-align:center}.toolbar .primary{order:-1}.slot-group-header{font-size:.75rem;padding:.4rem .6rem}.slot-name,.bs-select select{font-size:.75rem}.conflict-card{padding:.4rem .5rem}.conflict-card h3{font-size:.75rem}.conflict-card p{font-size:.6875rem}.template-selector{padding:1.5rem .75rem}.template-selector-header h1{font-size:1.15rem}.template-card-name{font-size:.8125rem}.template-card-meta{font-size:.6875rem}}.template-selector{display:flex;flex-direction:column;align-items:center;padding:3rem 2rem}.template-selector-header{text-align:center;margin-bottom:2rem}.template-selector-header h1{font-size:1.5rem;margin-bottom:.25rem}.template-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:1rem;max-width:560px;width:100%}.template-card{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;padding:1rem 1.25rem;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);cursor:pointer;text-align:left;font-size:.875rem;transition:border-color .15s,box-shadow .15s}.template-card:hover{border-color:var(--color-blue);box-shadow:0 0 0 1px var(--color-blue)}.template-card-name{font-weight:600}.template-card-meta{font-size:.75rem;color:var(--color-muted)}.loading-skeleton{max-width:960px;margin:0 auto;padding:2rem}.loading-header{height:1.5rem;width:200px;background:#e5e7eb;border-radius:var(--radius);margin-bottom:1.5rem;animation:pulse 1.5s ease-in-out infinite}.loading-grid{display:grid;grid-template-columns:1fr 1fr;gap:1rem}.loading-card{height:120px;background:#f3f4f6;border-radius:var(--radius);animation:pulse 1.5s ease-in-out infinite}.loading-card:nth-child(2n){animation-delay:.15s}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.error-fallback{text-align:center;padding:3rem 2rem;max-width:960px;margin:0 auto}.error-fallback h2{font-size:1.25rem;color:var(--color-red);margin-bottom:.5rem}.error-fallback p{color:var(--color-muted);margin-bottom:1rem}.error-fallback button{padding:.5rem 1rem;border:1px solid var(--color-border);border-radius:var(--radius);background:#fff;cursor:pointer;font-size:.875rem}.error-fallback button:hover{border-color:var(--color-blue);color:var(--color-blue)}.toolbar-spacer{flex:1}@media (pointer: coarse){.bs-select select,.bs-select button,.toolbar button,.template-card{min-height:44px;min-width:44px}button,select{touch-action:manipulation}}@media (max-width: 480px){.loading-skeleton{padding:1rem}.loading-grid{grid-template-columns:1fr}.error-fallback{padding:2rem 1rem}.error-fallback h2{font-size:1.1rem}}
