WhatTheStar · /design
compositions framing-panel

    FramingPanel

    The imaging planner's tool: describe a sensor and a focal length, and the panel both states the field in degrees and lays that rectangle on the sky through engine.showFieldOfView(). Composes <ToolPanel>, <Button>, <Field>, <Slider> and <HudReadout>.

    Framing

    Sensor

    36.0 × 24.0 mm

    Focal length 200 mm

    533

    Rotation

    0

    Position angle — measured from celestial north, so the frame holds its orientation against the stars rather than against the screen.

    Sampling

    Microns — gives arcsec per pixel

    Field

    10.29° × 6.87°

    Diagonal

    12.35°

    Scale

    ″/px

    Enter a pixel pitch to see whether you are sampling well.

    Select a deep-sky object to check it against this frame.

    Centred on the view

    Every control is live. The readouts are computed by fieldOfView() and pixelScale() from src/Engine/Observation.ts, which is why they work here with no engine running; only the rectangle on the sky needs the map.

    On the map it is one of the tools: the instrument bar opens it.

    Worked examples

    Rendered at build time by the panel's own maths. The arctangent form matters at wide field: the small-angle approximation everyone quotes puts a full frame at 200 mm nearly a degree and a half wrong.

    Sensor Focal Field Diagonal Scale
    Full frame · 36×24 mm 200 mm 10.29° × 6.87° 12.35° 6.13″/px at 5.94 µm
    APS-C · 23.5×15.7 mm 200 mm 6.72° × 4.50° 8.08° 3.88″/px at 3.76 µm
    Micro 4/3 · 17.3×13 mm 135 mm 7.33° × 5.51° 9.16° 5.74″/px at 3.76 µm
    1" · 13.2×8.8 mm 1000 mm 0.76° × 0.50° 0.91° 0.50″/px at 2.4 µm

    Activation

    The panel is one of the map's tools, so it is inert until the instrument bar opens it: hidden, inert, holding no engine resources and drawing nothing. A page adds it once and pays nothing until the observer asks for it.

    ---
    import FramingPanel from '../design/compositions/FramingPanel.astro';
    ---
    <FramingPanel />

    Then any of:

    openTool('framing')     // from design/compositions/tool-bus, or the bar's own button
    closeTool('framing')
    F                       // keyboard, when no field has focus

    It no longer announces a state of its own and no longer force-closes the layers list to take the column — InstrumentBar owns which tool is on screen, and this component owns only what the rectangle on the sky does. Escape closes it, like every other tool.

    Behaviour

    • The rectangle is pinned to sky coordinates, so it rides the sky as it turns and stays on the target through a time scrub.
    • It centres on the current selection — dso:select, star:select — and on the view centre when there is none. Use view centre re-pins it to wherever the camera is looking.
    • Selecting a deep-sky object compares its catalogued major axis against the frame and says plainly whether it fits, fits only lengthways, or needs a mosaic.
    • Closing the panel, or navigating to a page without it, removes the annotation — the engine survives navigation and would otherwise keep the rectangle forever.
    • Optics are remembered in localStorage under whatthestar:optics. Persistence.ts models one fixed progress record and exposes no generic slot, and a camera setting does not justify widening a file three other panels share.

    Placement

    placement="hud" (the default) docks the card into the map's left tool slot, where the shared <ToolPanel> shell gives it its width, its ceiling and its way out. placement="inline" — used above — leaves it in the page flow for documentation, where the --hud-* layout variables do not exist.