Microscope

How a student looks at a sample under a microscope. The microscope is a real object on the desk — the student drags a sample onto its plate and reads the magnified view through a picture-in-picture panel. Same gesture vocabulary as a scale.

The microscope is a lab object on the desk, not a UI panel that drops in. It declares object_purpose: [sample_viewer] in its lab-object manifest — the same declaration scales and thermometers use to publish their "I have a readout" semantic. The kit knows the microscope wants a readout; the readout is the picture-in-picture panel.

Mechanically the microscope is the scale-shaped sample viewer. A student places a sample on its plate, observes the magnified view, switches magnification, and removes the sample when done. The plate is a surface; the sample is what goes on it; the PiP is the readout — same shape as putting a brick on a balance and watching the gram readout, just with imagery instead of digits.

  1. 1

    The microscope sits on the desk.

    At setup, the microscope, the magnifying glass, and the samples all sit on the desk. No PiP yet; the canvas is the only viewport. The student reads the step and identifies the sample to inspect.

  2. 2

    The student drags a sample onto the plate.

    Same gesture as placing an object on a scale: pick up the sample, drag it across the desk, drop it on the microscope's plate. Snap-and-settle visualisation while in flight; the sample commits to the plate on release.

    The kit enriches the step's operation: position + on_surface constraint: because the microscope carries object_purpose: [sample_viewer], the PiP panel mounts automatically once the sample lands. The author didn't write a pip: field — the lab-object catalogue did the work.

  3. 3

    The PiP appears, showing the sample magnified.

    Once the sample is on the plate, a framed picture-in-picture panel mounts at the screen's right edge, vertically centred between the step bar and the widget bar. Inside:

    • viewportSample imagery from the lab-object catalogue (visual.special_effects.sample.images[]), rendered at the current magnification.
    • hudLight-mono uppercase — magnification + sample identity bottom-left, scale bar bottom-right.
    • controlsA toggle group below the viewport with the supported zoom modes (e.g. 4× / 10× / 40×). Current is filled, others outlined.
  4. 4

    The student switches zoom modes.

    Tap a different objective. The selected button fills, the previous one outlines, the viewport re-renders the same sample at the new magnification. The HUD updates accordingly.

    Today's open question: how many zoom levels the kit ships with — one PiP widget version per magnification scheme, or one widget with multiple levels parameterised by the lab-object catalogue. Resolves with the first lesson that needs it.

  5. 5

    The student drags the sample back.

    Same gesture as taking something off a scale — drag the sample off the plate, the PiP unmounts, the desk returns to its setup state. The next sample (or the next step) can take over.

    If the next step also calls for the microscope but with a different sample, the panel chrome can stay mounted and just swap content. If the next step has no sample on the plate, the PiP tears down.

No pip: field. The author writes a regular position-onto-surface step targeting the microscope's plate; the kit handles the rest.

- step: 5
  phase: action
  description: "Place the peat sample on the microscope."
  ui: drag
  operation: position
  object: peat_sample
  constraints:
    - type: on_surface
      surface: microscope_1.plate

What the kit fills in

  • sample_viewerThe microscope's lab-object manifest declares object_purpose: [sample_viewer] alongside visual.special_effects.sample_display + sample_telemetry. The enricher reads this and adds a PiP widget to the step.
  • sample.imagesThe peat sample's manifest carries visual.special_effects.sample.images[] — the zoomed-in renders one per magnification level. The PiP picks the right one based on the active objective.
  • sample.descriptionThe same manifest carries sample.description — surfaced as a description widget in the widget bar slot, separate from the PiP.

The microscope behaves the same way a scale does: the operation is "put something on it", the readout fills in from the lab-object catalogue. The author does not author the readout shape; the lab object does.