> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes.
# sw-ui-call-layout
Fluid call layout that adapts to any container shape.
```html
```
Uses the container's **aspect ratio** (not just width) to decide whether
the transcript pane sits beside the video (landscape) or below it
(portrait / narrow). The video area is always maximised.
```
Wide (landscape): Narrow (portrait):
┌────────────────┬─────────┐ ┌─────────────────┐
│ VIDEO │ TRANSCR │ │ VIDEO │
│ (maximised) │ (side) │ │ (maximised) │
├────────────────┴─────────┤ ├──────────────────┤
│ CONTROLS │ │ CONTROLS │
└──────────────────────────┘ ├──────────────────┤
│ TRANSCRIPT │
└──────────────────┘
```
*Class: `SwUiCallLayout` · Module: `packages/web-components/src/components/UI/layout/sw-ui-call-layout.ts`*
## class: `SwUiCallLayout`, `sw-ui-call-layout`
### Fields
**`transcript`** `boolean` — default: false
show / hide the transcript pane
---
**`loading`** `boolean` — default: false
show a spinner overlay on the video area
---
**`shadow`** `boolean` — default: false
apply a drop shadow to the host
---
**`fullscreen`** `boolean`
(read-only) reflects the current fullscreen state
---
### Methods
| Name | Privacy | Description | Parameters | Return | Inherited From |
| ------------------ | ------- | ----------- | ---------- | ------ | -------------- |
| `toggleTranscript` | | | | `void` | |
| `toggleFullscreen` | | | | `void` | |
### Attributes
| Name | Field | Inherited From |
| ------------ | ---------- | -------------- |
| `transcript` | transcript | |
| `loading` | loading | |
| `shadow` | shadow | |
### CSS Properties
| Name | Default | Description |
| ---------------------------------------- | ------- | ---------------------------------------------------------- |
| `--sw-call-layout-radius` | | \[0] - border-radius on external corners |
| `--sw-call-layout-shadow` | | box-shadow when \`shadow\` is set |
| `--sw-call-layout-loading-bg` | | \[rgba(0,0,0,0.6)] - loading overlay background |
| `--loading-spinner-size` | | \[48] - spinner icon size (px, number) |
| `--sw-call-layout-transcript-transition` | | \[350ms ease-in-out] - open/close transition |
| `--sw-call-layout-pip-width` | | \[clamp(100px, 20%, 200px)] - PiP container width |
| `--sw-call-layout-pip-radius` | | \[8px] - PiP border-radius |
| `--sw-call-layout-pip-shadow` | | \[0 2px 8px rgba(0,0,0,0.5)] - PiP box-shadow |
| `--sw-call-layout-pip-bottom` | | \[12px] - PiP offset from bottom |
| `--sw-call-layout-pip-right` | | \[12px] - PiP offset from right |
### Slots
| Name | Description |
| ---------------- | ------------------------------------------------------- |
| `video` | main video content |
| `background` | element behind the video (e.g. \`\\`) |
| `floating-video` | picture-in-picture overlay (absolute, bottom-right) |
| `controls` | control bar beneath the video |
| `transcript` | transcript panel (side or bottom) |
---