Browser feature lookup
PulsePoint Runtime Map
Match an interface problem to the PulsePoint API that owns it. Caspian templates are plain HTML; the React comparison applies to hooks and component decomposition, never to markup syntax.
Copy-safe authoring contract
Conditions: use hidden="{!visible}", not JSX logical expressions.
Lists: use <template pp-for="item in items"> and plain key.
Attributes: always quote brace values and use native names such as class and onclick.
Scripts: keep one plain owned <script> inside the authoring template root.
Need → API → ownership
Rendered state and derived values
pp.state, pp.reducer, pp.memo, and pp.callback. State means a render is required.
Lifecycles and browser objects
pp.effect, pp.layoutEffect, pp.ref, and pp.syncExternalStore.
Shared and out-of-tree UI
pp.createContext + pp.context, pp.portal, and pp.imperativeHandle.
Responsive updates and failures
pp.transition, pp.deferredValue, pp.optimistic, and pp.errorBoundary.
Stable DOM relationships
Use pp.id() for id/for and ARIA pairs, and pp-ref only for imperative element access.
Props and component boundaries
Forward props to the native Python component root, read pp.props in the owning script, then bind top-level names in markup.
Browser-to-server transport
| Interaction | Use | Important contract |
|---|---|---|
| Forms, reads, writes, buttons | @rpc() + pp.rpc() | Arguments are signature-filtered; protected actions declare auth. |
| Progressive server output | onStream | Python generators become SSE and remain abortable. |
| Multipart uploads | onUploadProgress | The callback receives loaded, total, and percent. |
| Persistent two-way channels | @socket() + pp.socket() | Requires the WebSocket feature gate and uses one shared endpoint. |
Navigation and rendering
- Eligible same-origin links use SPA navigation automatically;
pp-spa="false"opts out. loading.pysupplies optional subtree navigation UI.pp-reset-scroll="true"marks only the pane that should reset.- Deferred inert templates keep brace expressions safe until PulsePoint materializes component roots.
Performance ownership
- Keep keystroke-frequency state in the smallest useful component.
- Keep timers, request generations, and cursors in refs when they do not render.
- Debounce the expensive action, not an unnecessary page-sized render.
- Use the built-in perf helpers to separate owner renders from reconciliation work.