# Perspective Reference

Reviewed Ignition 8.3 guidance for composing native interfaces. A focused reference, not the complete platform manual.

## Responsive layouts

Ignition 8.3 · Reviewed 2026-09-16

For flowing controls, use a Flex container. Child sizing belongs in position.grow, position.shrink and position.basis; props.flexGrow is not the Perspective child layout contract.

props.wrap accepts nowrap, wrap or wrap-reverse. It is not a boolean. Bound compact inputs so a wide parent does not stretch them across the page.

Our Viewcraft convention prefers Flex for forms and dashboards. Coordinate remains appropriate for spatial diagrams. Test the actual available width after docks, not only the browser width.

Native example

```json
{
  "type": "ia.container.flex",
  "props": {
    "direction": "row",
    "wrap": "wrap"
  },
  "children": [
    {
      "type": "ia.display.view",
      "position": {
        "grow": 0,
        "shrink": 1,
        "basis": "160px"
      },
      "props": {
        "path": "Primitives/Button",
        "params": {
          "label": "Inspect pump"
        }
      }
    }
  ]
}
```

[Ignition 8.3 · Flex Container](https://www.docs.inductiveautomation.com/docs/8.3/appendix/components/perspective-components/perspective-container-palette/perspective-flex-container)

Local context: Ignition Architect layout notes, corrected against the official child position and wrap properties; Viewcraft component contracts.

## Reusable views & parameters

Ignition 8.3 · Reviewed 2026-09-16

An Embedded View uses props.path to select a view and props.params to pass values. Param names must match the receiving view.

Read get_component and get_examples before composing. Viewcraft Status Badge uses status, not state. Check useDefaultViewWidth and useDefaultViewHeight when diagnosing unexpected embedded sizing.

Include the view resource metadata, named styles and documented shared CSS dependencies. A source snapshot is not evidence that a Designer import or runtime preview has passed.

Native example

```json
{
  "type": "ia.display.view",
  "props": {
    "path": "Status/StatusBadge",
    "params": {
      "label": "Pump running",
      "status": "running",
      "showDot": true
    }
  }
}
```

[Ignition 8.3 · Embedded View](https://www.docs.inductiveautomation.com/docs/8.3/appendix/components/perspective-components/perspective-embedding-palette/perspective-embedded-view)

Local context: Current Viewcraft Button and Status Badge snapshots; Rungsmith component and verification references.

## Messages & popups

Ignition 8.3 · Reviewed 2026-09-16

A button message needs a matching component handler and a deliberate listening scope. sendMessage targets component handlers; it does not invoke Session Event message handlers. Delivery is asynchronous.

openPopup requires both an id and a view path. Pass view parameters through params. The example assumes the target popup exists and is called from its Perspective session.

For Gateway calls, supply sessionId and pageId as required by the API. Keep demo interactions separate from real equipment commands; do not place tag writes inside binding transforms.

Native example

```python
system.perspective.openPopup("pump-details", "Popups/PumpDetails", params={"equipmentId": "P-01"}, modal=True, viewportBound=True)
```

[Ignition 8.3 · openPopup](https://www.docs.inductiveautomation.com/docs/8.3/appendix/scripting-functions/system-perspective/system-perspective-openPopup)

[Ignition 8.3 · sendMessage](https://www.docs.inductiveautomation.com/docs/8.3/appendix/scripting-functions/system-perspective/system-perspective-sendMessage)

Local context: Ignition Architect event notes, with popup signature and message scope checked against official documentation.