| from pathlib import Path |
|
|
| app_css = ''' |
| :root { |
| font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; |
| color: #111827; |
| background: #f8fafc; |
| line-height: 1.5; |
| } |
| |
| *, *::before, *::after { |
| box-sizing: border-box; |
| } |
| |
| html, body, #root { |
| min-height: 100%; |
| } |
| |
| body { |
| margin: 0; |
| background: #f8fafc; |
| color: #111827; |
| } |
| |
| button, input, select, textarea { |
| font: inherit; |
| } |
| |
| button { |
| cursor: pointer; |
| } |
| |
| .app-shell { |
| max-width: 1200px; |
| margin: 0 auto; |
| padding: 24px; |
| } |
| |
| .topbar { |
| display: flex; |
| flex-wrap: wrap; |
| justify-content: space-between; |
| align-items: center; |
| gap: 16px; |
| padding: 22px 24px; |
| background: #ffffff; |
| border: 1px solid #e5e7eb; |
| border-radius: 18px; |
| } |
| |
| .topbar h1 { |
| margin: 0; |
| font-size: clamp(1.9rem, 2.5vw, 2.6rem); |
| } |
| |
| .topbar p { |
| margin: 6px 0 0; |
| color: #475569; |
| } |
| |
| .topbar-nav { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 10px; |
| } |
| |
| .topbar-nav a { |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| padding: 10px 14px; |
| border-radius: 14px; |
| background: #f8fafc; |
| color: #334155; |
| text-decoration: none; |
| border: 1px solid transparent; |
| transition: background 0.2s ease, border-color 0.2s ease; |
| } |
| |
| .topbar-nav a:hover { |
| background: #ffffff; |
| border-color: #d1d5db; |
| } |
| |
| .content-viewer { |
| margin-top: 24px; |
| } |
| |
| .route-index, |
| .panel, |
| .viewer-panel, |
| .bridge-panel, |
| .room-setup-dropzone, |
| .room-setup-card, |
| .room-setup-preview { |
| background: #ffffff; |
| border: 1px solid #e5e7eb; |
| border-radius: 20px; |
| } |
| |
| .route-index, |
| .panel, |
| .viewer-panel, |
| .bridge-panel, |
| .room-setup-card { |
| padding: 22px; |
| } |
| |
| .route-index h2, |
| .panel h2, |
| .viewer-panel h2, |
| .room-setup-copy h1, |
| .room-setup-bottom h2 { |
| margin: 0 0 16px; |
| } |
| |
| .route-index p, |
| .room-setup-features li, |
| .room-setup-drop-content p, |
| .room-setup-drop-content small, |
| .room-setup-card h3, |
| .topbar p, |
| .error-box, |
| .empty-state { |
| color: #475569; |
| } |
| |
| .route-index ul, |
| .room-setup-features, |
| .room-setup-filters, |
| .room-setup-grid { |
| margin: 0; |
| padding: 0; |
| list-style: none; |
| } |
| |
| .route-index ul { |
| display: grid; |
| gap: 12px; |
| } |
| |
| .form-row { |
| display: grid; |
| gap: 14px; |
| margin-bottom: 20px; |
| } |
| |
| label { |
| font-size: 0.95rem; |
| color: #334155; |
| } |
| |
| input, |
| select, |
| textarea { |
| width: 100%; |
| padding: 14px 16px; |
| border-radius: 14px; |
| border: 1px solid #d1d5db; |
| background: #f8fafc; |
| color: #111827; |
| } |
| |
| input:focus, |
| select:focus, |
| textarea:focus { |
| outline: 2px solid #cbd5e1; |
| outline-offset: 2px; |
| } |
| |
| .button, |
| .button-primary, |
| .button-secondary { |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| gap: 10px; |
| border-radius: 16px; |
| padding: 14px 18px; |
| font-weight: 700; |
| border: 1px solid transparent; |
| transition: all 0.2s ease; |
| } |
| |
| .button { |
| background: #111827; |
| color: #ffffff; |
| } |
| |
| .button:hover { |
| opacity: 0.95; |
| } |
| |
| .button.secondary, |
| .button-secondary { |
| background: #f3f4f6; |
| color: #111827; |
| border-color: #d1d5db; |
| } |
| |
| .error-box { |
| margin-top: 16px; |
| padding: 16px; |
| border-radius: 16px; |
| background: #fef2f2; |
| color: #991b1b; |
| border: 1px solid #fecaca; |
| } |
| |
| .empty-state { |
| min-height: 220px; |
| display: grid; |
| place-content: center; |
| border: 1px dashed #d1d5db; |
| border-radius: 18px; |
| } |
| |
| .room-setup { |
| background: #f8fafc; |
| } |
| |
| .room-setup-inner { |
| max-width: 1200px; |
| margin: 0 auto; |
| padding: 32px 24px; |
| } |
| |
| .room-setup-header { |
| display: flex; |
| justify-content: flex-end; |
| margin-bottom: 24px; |
| } |
| |
| .room-setup-close { |
| border: none; |
| background: transparent; |
| color: #475569; |
| padding: 10px; |
| border-radius: 999px; |
| cursor: pointer; |
| } |
| |
| .room-setup-close:hover { |
| background: #e5e7eb; |
| } |
| |
| .room-setup-top { |
| display: grid; |
| gap: 24px; |
| grid-template-columns: 1.1fr 0.9fr; |
| margin-bottom: 40px; |
| } |
| |
| .room-setup-copy h1 { |
| margin: 0 0 24px; |
| font-size: clamp(2rem, 2.5vw, 3rem); |
| color: #111827; |
| } |
| |
| .room-setup-features { |
| display: grid; |
| gap: 16px; |
| } |
| |
| .room-setup-features li { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| color: #475569; |
| } |
| |
| .room-setup-actions { |
| display: grid; |
| gap: 16px; |
| } |
| |
| .button-primary { |
| background: #111827; |
| color: #ffffff; |
| } |
| |
| .button-primary:hover { |
| opacity: 0.95; |
| } |
| |
| .button-secondary { |
| background: #ffffff; |
| color: #334155; |
| border-color: #d1d5db; |
| } |
| |
| .button-secondary:hover { |
| background: #f3f4f6; |
| } |
| |
| .button-icon-border { |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| width: 30px; |
| height: 30px; |
| border-radius: 10px; |
| border: 1px solid #d1d5db; |
| } |
| |
| .room-setup-dropzone { |
| position: relative; |
| min-height: 420px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| transition: all 0.2s ease; |
| padding: 24px; |
| border: 1px dashed #d1d5db; |
| border-radius: 28px; |
| } |
| |
| .room-setup-dropzone.dragging { |
| background: #f3f4f6; |
| } |
| |
| .room-setup-file-input { |
| position: absolute; |
| inset: 0; |
| width: 100%; |
| height: 100%; |
| opacity: 0; |
| cursor: pointer; |
| } |
| |
| .room-setup-drop-content { |
| text-align: center; |
| } |
| |
| .room-setup-drop-icon { |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| width: 72px; |
| height: 72px; |
| border-radius: 999px; |
| background: #e2e8f0; |
| color: #64748b; |
| margin-bottom: 18px; |
| } |
| |
| .room-setup-drop-icon.active { |
| background: #dbeafe; |
| color: #1e293b; |
| } |
| |
| .room-setup-drop-content h3 { |
| margin: 0 0 8px; |
| font-size: 1.2rem; |
| } |
| |
| .room-setup-drop-content p, |
| .room-setup-drop-content small { |
| margin: 0; |
| color: #64748b; |
| } |
| |
| .room-setup-preview { |
| position: relative; |
| width: 100%; |
| height: 100%; |
| } |
| |
| .room-setup-preview img { |
| width: 100%; |
| height: 100%; |
| object-fit: cover; |
| } |
| |
| .room-setup-preview-overlay { |
| position: absolute; |
| inset: 0; |
| background: rgba(255, 255, 255, 0.85); |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| opacity: 0; |
| transition: opacity 0.2s ease; |
| } |
| |
| .room-setup-preview:hover .room-setup-preview-overlay { |
| opacity: 1; |
| } |
| |
| .button-delete { |
| background: #ffffff; |
| color: #111827; |
| padding: 12px 16px; |
| border-radius: 14px; |
| font-weight: 600; |
| border: 1px solid #d1d5db; |
| } |
| |
| .room-setup-bottom h2 { |
| margin: 0 0 24px; |
| } |
| |
| .room-setup-filters { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 10px; |
| margin-bottom: 24px; |
| } |
| |
| .room-setup-filter { |
| border: 1px solid #d1d5db; |
| background: #ffffff; |
| color: #334155; |
| padding: 10px 16px; |
| border-radius: 16px; |
| cursor: pointer; |
| transition: all 0.2s ease; |
| } |
| |
| .room-setup-filter.active { |
| background: #f3f4f6; |
| } |
| |
| .room-setup-grid { |
| display: grid; |
| grid-template-columns: repeat(1, minmax(0, 1fr)); |
| gap: 20px; |
| } |
| |
| .room-setup-card { |
| overflow: hidden; |
| border-radius: 24px; |
| background: #ffffff; |
| box-shadow: 0 8px 20px rgba(15, 23, 42, 0.06); |
| } |
| |
| .room-setup-card-image { |
| position: relative; |
| aspect-ratio: 4 / 3; |
| overflow: hidden; |
| } |
| |
| .room-setup-card-image img { |
| width: 100%; |
| height: 100%; |
| object-fit: cover; |
| transition: transform 0.4s ease; |
| } |
| |
| .room-setup-card:hover .room-setup-card-image img { |
| transform: scale(1.04); |
| } |
| |
| .room-setup-card h3 { |
| margin: 16px; |
| font-size: 1rem; |
| color: #334155; |
| } |
| |
| .app-version-badge { |
| position: fixed; |
| right: 0; |
| bottom: 0; |
| padding: 10px 14px; |
| border-radius: 12px 0 0 0; |
| background: rgba(255, 255, 255, 0.95); |
| border: 1px solid #e5e7eb; |
| color: #475569; |
| font-size: 0.8rem; |
| z-index: 1000; |
| } |
| |
| .app-version-badge span { |
| display: block; |
| font-weight: 700; |
| color: #111827; |
| } |
| |
| .app-version-badge small { |
| display: block; |
| margin-top: 2px; |
| } |
| |
| @media (max-width: 960px) { |
| .room-setup-top { |
| grid-template-columns: 1fr; |
| } |
| |
| .room-setup-grid { |
| grid-template-columns: repeat(2, minmax(0, 1fr)); |
| } |
| } |
| |
| @media (max-width: 640px) { |
| .room-setup-inner { |
| padding: 20px 16px; |
| } |
| |
| .room-setup-grid { |
| grid-template-columns: 1fr; |
| } |
| } |
| |
| @media (max-width: 900px) { |
| .content { |
| grid-template-columns: 1fr; |
| } |
| } |
| '@; Set-Content -Path '.\src\App.css' -Value $content" |