{
  "site": "https://fframes-kit.pages.dev",
  "import": "use fframes_kit::prelude::*;",
  "components": [
    {
      "name": "ActionPotential",
      "summary": "An action potential traced on axes of time (ms) against membrane potential (mV), `x_length` by `y_length` (units of `ui.space`) around `center`. From `delay` the trace draws from 0 to 6 ms in `duration` seconds, a dot at its head; the dashed threshold and resting lines are there from the start. Each phase is named as the trace reaches it: resting potential, stimulus, depolarization, the peak, repolarization and hyperpolarization.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/action-potential/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/action-potential.md",
      "scenes": [
        "ActionPotential"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ActionPotential-a92f27f6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/neuron.rs#L439",
      "themed": true,
      "fields": [
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the trace begins to draw."
        },
        {
          "name": "duration",
          "type": "f32",
          "default": "5.0",
          "docs": "Seconds the trace takes to draw from 0 to 6 ms."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, -0.3)",
          "docs": "The middle of the axes, in units of `ui.space`."
        },
        {
          "name": "x_length",
          "type": "f64",
          "default": "9.0",
          "docs": "Width of the axes, in units of `ui.space`."
        },
        {
          "name": "y_length",
          "type": "f64",
          "default": "5.2",
          "docs": "Height of the axes, in units of `ui.space`."
        },
        {
          "name": "trace_color",
          "type": "Color",
          "default": "Color::hex(\"#ffd43b\")",
          "docs": "Colour of the trace and the dot at its head."
        },
        {
          "name": "threshold_color",
          "type": "Color",
          "default": "Color::hex(\"#ff8787\")",
          "docs": "Colour of the dashed threshold line (-55 mV)."
        },
        {
          "name": "axis_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the axes and the dashed resting line (-70 mV)."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "label_style",
          "docs": "The font of the axis labels and numbers: family, size in pixels and weight."
        },
        {
          "name": "phase_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the phase names along the trace: family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the phase names."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Angle",
      "summary": "The mark of the angle between two lines (Manim `Angle`): an arc of `radius` about where they cross, counterclockwise on screen from the first line to the second.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Angle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Angle-92296eb8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/angles.rs#L256",
      "themed": true,
      "fields": [
        {
          "name": "line1",
          "type": "Segment",
          "default": "((0.0, 0.0), (200.0, 0.0))",
          "docs": "The first line as two points `((x1, y1), (x2, y2))` in pixels of the canvas; the mark starts from it."
        },
        {
          "name": "line2",
          "type": "Segment",
          "default": "((0.0, 0.0), (0.0, -200.0))",
          "docs": "The second line, in the same form; the mark turns to it."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "ANGLE_RADIUS",
          "docs": "Radius of the mark in pixels, about where the lines cross."
        },
        {
          "name": "quadrant",
          "type": "(f32, f32)",
          "default": "(1.0, 1.0)",
          "docs": "Which half of each line the mark sits on: `1` along its direction, `-1` against."
        },
        {
          "name": "other_angle",
          "type": "bool",
          "default": "false",
          "docs": "Marks the other angle, clockwise from the first line to the second."
        },
        {
          "name": "elbow",
          "type": "bool",
          "default": null,
          "docs": "A square corner instead of an arc."
        },
        {
          "name": "dot",
          "type": "bool",
          "default": "false",
          "docs": "A dot inside the mark, `dot_distance` of the way out from the corner."
        },
        {
          "name": "dot_radius",
          "type": "f32",
          "default": "5.0",
          "docs": "Radius of the dot in pixels."
        },
        {
          "name": "dot_distance",
          "type": "f32",
          "default": "0.55",
          "docs": "How far out the dot sits, as a fraction of the mark's radius (0 at the corner, 1 on the mark)."
        },
        {
          "name": "dot_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the dot."
        },
        {
          "name": "label",
          "type": "ShapeLabel",
          "default": "ShapeLabel::None",
          "docs": "A label beside the mark, `label_buff` beyond its radius."
        },
        {
          "name": "label_buff",
          "type": "f32",
          "default": "3.0 * SMALL_BUFF",
          "docs": "Pixels between the mark's radius and the label."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The label's font: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the label text."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Some(theme.colors.accent)",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn value(&self) -> f32",
          "summary": "The angle the mark spans in radians, always positive (Manim `get_value`)."
        },
        {
          "signature": "fn path(&self) -> BezPath",
          "summary": "The mark alone: an arc, or a square corner."
        }
      ]
    },
    {
      "name": "AnimatedBoundary",
      "summary": "An outline that keeps drawing itself in one colour after another, the previous colour fading out under it (Manim's `AnimatedBoundary`). It never ends; put it in a `Sequence` to stop it.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "AnimatedBoundary"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/AnimatedBoundary-a15432a3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/indicate_ii.rs#L310",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape whose outline is traced; the shape itself is not drawn."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": null,
          "docs": "The colours it draws in, one after another; empty draws nothing."
        },
        {
          "name": "max_stroke_width",
          "type": "f32",
          "default": null,
          "docs": "Outline width in pixels of the colour being drawn; the previous colour thins from this to 0."
        },
        {
          "name": "cycle_rate",
          "type": "f32",
          "default": null,
          "docs": "Colours per second."
        },
        {
          "name": "back_and_forth",
          "type": "bool",
          "default": null,
          "docs": "Every other colour draws from the end back."
        },
        {
          "name": "draw_rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of each colour's drawing along the outline."
        },
        {
          "name": "fade_rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the previous colour fading out."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, colors: Vec<Color>) -> Self",
          "summary": "Around `shape` in `colors`, Manim's defaults otherwise."
        }
      ]
    },
    {
      "name": "AnimatedEmoji",
      "summary": "A Noto animated emoji (Remotion's `<AnimatedEmoji>`), played from `start` seconds of its container from the file `file_name` gives in the media folder. `(x, y)` is the top left of a `size` pixel square. It fades in over `fade` seconds and plays at `speed`, again and again with `looping`, otherwise its last frame stays. A missing file draws nothing, and `inspect` warns with the address to download it from. The tone applies to the emoji that have skin tones.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs.md",
      "scenes": [
        "AnimatedEmoji"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/AnimatedEmoji-03f3e801.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/assets/emoji.rs#L210",
      "themed": true,
      "fields": [
        {
          "name": "name",
          "type": "&str",
          "default": "\"grinning\"",
          "docs": "Name of the emoji from `NAMES`, which also names its `.json` file in the media folder."
        },
        {
          "name": "skin_tone",
          "type": "Option<SkinTone>",
          "default": "None",
          "docs": "Skin tone of a hand emoji; `None` for the default, and ignored for emoji without skin tones."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "880.0",
          "docs": "Left edge in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "460.0",
          "docs": "Top edge in pixels of the canvas."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "160.0",
          "docs": "Side of the square the emoji fills, in pixels."
        },
        {
          "name": "start",
          "type": "f32",
          "default": "0.0",
          "docs": "Second it starts playing, local to the parent container."
        },
        {
          "name": "speed",
          "type": "f32",
          "default": "1.0",
          "docs": "Playback speed; 1 is normal, 2 twice as fast."
        },
        {
          "name": "looping",
          "type": "bool",
          "default": "true",
          "docs": "Plays again and again; `false` keeps the last frame."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds it takes to fade in from `start`."
        }
      ],
      "methods": [
        {
          "signature": "fn file(&self) -> String",
          "summary": "The file this emoji plays."
        }
      ]
    },
    {
      "name": "AnimationGroup",
      "summary": "Every child at once (Manim's `AnimationGroup` with no lag).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "AnimationGroup"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/AnimationGroup-4d111427.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/group.rs#L83",
      "themed": false,
      "fields": [
        {
          "name": "children",
          "type": "Vec<Children>",
          "default": null,
          "docs": "The children, all started together; each is a closure taking the `Ui`."
        }
      ],
      "methods": []
    },
    {
      "name": "Annotation",
      "summary": "An annotation: a dot on the `target`, an elbow line to `label` (first across, then up or down) and the text at its end. The line draws on over `run_time` seconds from `delay`; the text fades in over the last 40 %. (The shape called `Callout` is the Remotion speech bubble, so this one has another name.)",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "Annotation"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Annotation-279b2abc.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/annotation.rs#L18",
      "themed": true,
      "fields": [
        {
          "name": "target",
          "type": "(f32, f32)",
          "default": "(0.0, 0.0)",
          "docs": "The point the dot marks, in pixels of the canvas."
        },
        {
          "name": "label",
          "type": "(f32, f32)",
          "default": "(0.0, 0.0)",
          "docs": "Where the line ends and the text sits, in pixels of the canvas; the text goes right of it when it is right of `target`, else left."
        },
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The words at the end of the line."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the dot, line and text."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "letter_spacing",
          "type": "f32",
          "default": "2.0",
          "docs": "Extra space between letters of the text, in pixels."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the line and the ring around the dot, in pixels."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.slow",
          "docs": "Seconds the line takes to draw on; the text fades in over the last 40 %."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.standard",
          "docs": "Easing of the drawing over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn draw(self, progress: f32) -> Svgr",
          "summary": "The annotation `progress` (0 to 1) of the way drawn."
        }
      ]
    },
    {
      "name": "AnnotationDot",
      "summary": "A dot that marks a point for an annotation (Manim `AnnotationDot`): a third larger than a `Dot`, filled in the accent colour with a light outline.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "AnnotationDot"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/AnnotationDot-37e10b82.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/labeled.rs#L170",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "10.4",
          "docs": "Radius in pixels."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": null,
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": null,
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": null,
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "AnnularSector",
      "summary": "The part of a ring from `start_angle` by `angle` (Manim `AnnularSector`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "AnnularSector"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/AnnularSector-bf90805d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arcs.rs#L185",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "inner_radius",
          "type": "f32",
          "default": "50.0",
          "docs": "Radius in pixels of the inner edge."
        },
        {
          "name": "outer_radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels of the outer edge."
        },
        {
          "name": "start_angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Where it starts, in radians counterclockwise on screen from the right (0 is right)."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "std::f32::consts::FRAC_PI_2",
          "docs": "Turn in radians, counterclockwise on screen for a positive value."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Annulus",
      "summary": "A ring between two circles (Manim `Annulus`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Annulus"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Annulus-ccf82553.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L166",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "inner_radius",
          "type": "f32",
          "default": "50.0",
          "docs": "Radius in pixels of the hole."
        },
        {
          "name": "outer_radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels of the outer edge."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Appear",
      "summary": "Shows its children from `from` seconds on: they rise `rise` units into place, grow from `scale_from` about `center` and fade in over `enter` seconds. They leave the same way up over `exit` seconds, ending at `until` seconds, or at the end of the container (`ui.duration`) when `until` is `None`. Inside, time starts at `from`, as in a `Sequence`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "Appear"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Appear-6a73b190.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/appear.rs#L15",
      "themed": true,
      "fields": [
        {
          "name": "from",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start when the children appear; inside, their time starts at `from`."
        },
        {
          "name": "until",
          "type": "Option<f32>",
          "default": null,
          "docs": "Seconds when the children are gone, after leaving over `exit`; `None` ends with the container."
        },
        {
          "name": "center",
          "type": "(f32, f32)",
          "default": null,
          "docs": "The point the content scales about, in canvas units."
        },
        {
          "name": "rise",
          "type": "f32",
          "default": null,
          "docs": "Pixels the children rise into place as they enter, and sink as they leave."
        },
        {
          "name": "scale_from",
          "type": "f32",
          "default": null,
          "docs": "Scale the children grow from as they enter, 1 for no growth."
        },
        {
          "name": "enter",
          "type": "f32",
          "default": null,
          "docs": "Seconds the children take to fade, rise and grow in."
        },
        {
          "name": "exit",
          "type": "f32",
          "default": null,
          "docs": "Seconds the children take to leave before `until` or the end of the container; 0 cuts them off."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the entrance over `enter` seconds."
        },
        {
          "name": "children",
          "type": "Children",
          "default": null,
          "docs": "What it shows (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn new(ui: &Ui, from: f32, center: (f32, f32), children: Children) -> Self",
          "summary": "Times and motion from the theme: `motion.duration.enter` and `exit`, a 60 unit rise, scaling from 0.92."
        },
        {
          "signature": "fn state(&self, t: f32, end: Option<f32>) -> (f32, f32)",
          "summary": "`(entered, left)`, both from 0 to 1, at `t` seconds of a container that ends at `end`."
        }
      ]
    },
    {
      "name": "ApplyComplexFunction",
      "summary": "Moves every point of the shape to `function(re, im)` of the complex number at it (Manim's `ApplyComplexFunction`, 1 second), in the units of `ui.space`. As in Manim the points travel on arcs as wide as the angle of `function(1)`, so a rotation turns.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ApplyComplexFunction"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ApplyComplexFunction-5fc7b864.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/apply.rs#L131",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape that is transformed; drawn unchanged until `delay` has passed."
        },
        {
          "name": "function",
          "type": "fn((f64, f64)) -> (f64, f64)",
          "default": null,
          "docs": "Maps the complex number `(re, im)` at a point, in units of `ui.space`, to where the point ends up."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, function: fn((f64, f64)) -> (f64, f64)) -> Self",
          "summary": "Manim's 1 second, smooth."
        },
        {
          "signature": "fn path_arc(&self) -> f64",
          "summary": "The angle of `function(1)`: how far the points turn on their way."
        }
      ]
    },
    {
      "name": "ApplyFunction",
      "summary": "Morphs the shape into `function(shape)` (Manim's `ApplyFunction`, a `Transform` in 1 second).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ApplyFunction"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ApplyFunction-9186d23e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/apply.rs#L179",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape that is transformed; drawn unchanged until `delay` has passed."
        },
        {
          "name": "function",
          "type": "fn(Shape) -> Shape",
          "default": null,
          "docs": "Builds the shape it morphs into from a copy of `shape`."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, function: fn(Shape) -> Shape) -> Self",
          "summary": "Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "ApplyMatrix",
      "summary": "Moves every point of the shape by the 2×2 `matrix` about `about_point` (Manim's `ApplyMatrix`, about the origin of `ui.space` in 3 seconds). The matrix and the point are in the units of `ui.space`, `y` up: `[[0, -1], [1, 0]]` turns a quarter counterclockwise.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ApplyMatrix"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ApplyMatrix-818901e4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/apply.rs#L31",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape that is transformed; drawn unchanged until `delay` has passed."
        },
        {
          "name": "matrix",
          "type": "[[f64; 2]; 2]",
          "default": null,
          "docs": "The 2x2 matrix, row by row, applied to each point's offset from `about_point`, in units of `ui.space` with y up."
        },
        {
          "name": "about_point",
          "type": "Option<(f64, f64)>",
          "default": null,
          "docs": "In units; `None` is the origin of the space."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, matrix: [[f64; 2]; 2]) -> Self",
          "summary": "About the origin in Manim's 3 seconds, smooth."
        },
        {
          "signature": "fn map(&self, space: Space, p: Point) -> Point",
          "summary": "Where the pixel `p` ends up."
        }
      ]
    },
    {
      "name": "ApplyPointwiseFunction",
      "summary": "Moves every point of the shape to `function(x, y)` (Manim's `ApplyPointwiseFunction`, 3 seconds), in the units of `ui.space`, `y` up. The path is cut into small pieces first like a `super::Homotopy`, so straight lines bend.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ApplyPointwiseFunction"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ApplyPointwiseFunction-c7a4e51a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/apply.rs#L89",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape that is transformed; drawn unchanged until `delay` has passed."
        },
        {
          "name": "function",
          "type": "fn(f64, f64) -> (f64, f64)",
          "default": null,
          "docs": "Maps a point `(x, y)` in units of `ui.space` (y up) to where it ends up."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, function: fn(f64, f64) -> (f64, f64)) -> Self",
          "summary": "Manim's 3 seconds, smooth."
        }
      ]
    },
    {
      "name": "ApplyPointwiseFunctionToCenter",
      "summary": "Moves the whole shape so its center goes to `function(center)` (Manim's `ApplyPointwiseFunctionToCenter`, 3 seconds), in the units of `ui.space`. The shape keeps its form.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ApplyPointwiseFunctionToCenter"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ApplyPointwiseFunctionToCenter-203b85d4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/apply.rs#L222",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape that is transformed; drawn unchanged until `delay` has passed."
        },
        {
          "name": "function",
          "type": "fn(f64, f64) -> (f64, f64)",
          "default": null,
          "docs": "Maps the shape's center `(x, y)` in units of `ui.space` (y up) to where the center ends up."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, function: fn(f64, f64) -> (f64, f64)) -> Self",
          "summary": "Manim's 3 seconds, smooth."
        }
      ]
    },
    {
      "name": "ApplyWave",
      "summary": "A wave runs across the shape from left to right and bends it by `amplitude` pixels in `direction` (Manim's `ApplyWave`). The shape is drawn as built before and after.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ApplyWave"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ApplyWave-f53ee065.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/indicate_ii.rs#L405",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape that is bent by the wave; drawn as built before and after."
        },
        {
          "name": "direction",
          "type": "(f32, f32)",
          "default": null,
          "docs": "Canvas units, `y` down: `(0.0, -1.0)` is Manim's `UP`."
        },
        {
          "name": "amplitude",
          "type": "f32",
          "default": null,
          "docs": "How far points are nudged at the crest, in pixels of the canvas."
        },
        {
          "name": "wave_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing that shapes each ripple of the wave."
        },
        {
          "name": "time_width",
          "type": "f32",
          "default": null,
          "docs": "The wave's length as a fraction of the shape's width."
        },
        {
          "name": "ripples",
          "type": "usize",
          "default": null,
          "docs": "Number of crests that pass across the shape (at least 1)."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the wave takes to cross the shape."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape) -> Self",
          "summary": "Up by 27 pixels (Manim's 0.2 units), one ripple in 2 seconds."
        },
        {
          "signature": "fn path_at(&self, p: f32) -> BezPath",
          "summary": "The path at progress `p`."
        }
      ]
    },
    {
      "name": "Arc",
      "summary": "Part of a circle's outline from `start_angle` by `angle` (Manim `Arc`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Arc"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Arc-8503fbc1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L140",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels."
        },
        {
          "name": "start_angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Where the arc starts, in radians counterclockwise on screen from the right (0 is right)."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "std::f32::consts::FRAC_PI_2",
          "docs": "How far the arc turns, in radians; counterclockwise on screen for a positive value."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "ArcBetweenPoints",
      "summary": "The arc from `(x1, y1)` to `(x2, y2)` that turns by `angle`, counterclockwise on screen for a positive angle (Manim `ArcBetweenPoints`). A `radius` replaces the angle with the shorter arc of that radius (negative for the other side).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "ArcBetweenPoints"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ArcBetweenPoints-8dc8a0d5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arcs.rs#L44",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "std::f32::consts::FRAC_PI_2",
          "docs": "Turn in radians, counterclockwise on screen for a positive value."
        },
        {
          "name": "radius",
          "type": "Option<f32>",
          "default": "None",
          "docs": "`Some` replaces `angle` with the shorter arc of this radius in pixels (negative for the other side); `None` uses `angle`."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        },
        {
          "signature": "fn turn(&self) -> f64",
          "summary": "The turn of the arc: `angle`, or the one `radius` gives."
        }
      ]
    },
    {
      "name": "ArcBrace",
      "summary": "A brace bent along an arc (Manim `ArcBrace`): round the circle of `radius` about `(cx, cy)` from `start_angle` turning `angle` (radians, counterclockwise on screen), its tip `depth` pixels outward, or toward the center when `inside`. `ArcBrace::tip` is where a label goes.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "ArcBrace"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ArcBrace-bb6d7b5c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/brace.rs#L74",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "135.0",
          "docs": "Radius in pixels of the circle the brace follows."
        },
        {
          "name": "start_angle",
          "type": "f32",
          "default": "-1.0",
          "docs": "Where the brace starts, in radians counterclockwise on screen from the right."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "2.0",
          "docs": "How far the brace turns, in radians; counterclockwise on screen for a positive value, clockwise for a negative one."
        },
        {
          "name": "depth",
          "type": "f32",
          "default": "24.0",
          "docs": "How far in pixels the tip sticks out of the arc; negative turns the brace over."
        },
        {
          "name": "inside",
          "type": "bool",
          "default": "false",
          "docs": "Puts the tip toward the center instead of outward."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        },
        {
          "signature": "fn tip(&self) -> (f32, f32)",
          "summary": "The point of the tip."
        }
      ]
    },
    {
      "name": "ArcPolygon",
      "summary": "A closed shape of arcs between consecutive `points`, each turning by `angle` (Manim `ArcPolygon`); a `radius` replaces the angle as on `ArcBetweenPoints`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "ArcPolygon"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ArcPolygon-692f219b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arcs.rs#L220",
      "themed": true,
      "fields": [
        {
          "name": "points",
          "type": "Vec<(f32, f32)>",
          "default": "vec![(0.0, -100.0), (100.0, 100.0), (-100.0, 100.0)]",
          "docs": "Corner points `(x, y)` in pixels of the canvas; arcs join them in order and back to the first."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "std::f32::consts::FRAC_PI_4",
          "docs": "Turn in radians of each arc between consecutive points."
        },
        {
          "name": "radius",
          "type": "Option<f32>",
          "default": "None",
          "docs": "`Some` replaces `angle` with the shorter arc of this radius in pixels on each side; `None` uses `angle`."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "ArcPolygonFromArcs",
      "summary": "A closed shape of the given arcs (Manim `ArcPolygonFromArcs`): each one after the other, joined by straight lines where one does not end where the next starts.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "ArcPolygonFromArcs"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ArcPolygonFromArcs-8414a160.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arcs.rs#L270",
      "themed": true,
      "fields": [
        {
          "name": "arcs",
          "type": "Vec<ArcBetweenPoints>",
          "default": "Vec::new()",
          "docs": "The arcs, drawn in order; a straight line joins one that ends away from where the next starts."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Area",
      "summary": "The region between `f` and `bounded` (the x-axis when `None`) from `x_range.0` to `x_range.1` (Manim `get_area(graph, x_range, bounded_graph)`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under.md",
      "scenes": [
        "Area"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Area-7c7c71b7.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/graph.rs#L330",
      "themed": true,
      "fields": [
        {
          "name": "f",
          "type": "Func",
          "default": "|x| x",
          "docs": "The upper function of the region, in data units; a plain `fn`."
        },
        {
          "name": "bounded",
          "type": "Option<Func>",
          "default": "None",
          "docs": "The function that bounds the region below; `None` bounds it with the x-axis."
        },
        {
          "name": "x_range",
          "type": "(f64, f64)",
          "default": "(0.0, 1.0)",
          "docs": "The first and last `x` the region covers, in data units."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The mapping of the axes the region sits on (`axes.map(ui)`)."
        },
        {
          "name": "samples",
          "type": "usize",
          "default": "128",
          "docs": "Number of straight pieces the region's edges are sampled with."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "paint.fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "paint.stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "paint.stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "AreaUnder",
      "summary": "The area under a graph revealed from left to right over `run_time` seconds after `delay` (Manim's `get_area` with a growing `x_range`), with the integral of the part shown so far written after the text of `value`. Build `area` with `Axes::area`; `key` tells the clip paths of two areas in one frame apart.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under.md",
      "scenes": [
        "AreaUnder"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/AreaUnder-941ff31b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/calculus.rs#L367",
      "themed": true,
      "fields": [
        {
          "name": "area",
          "type": "Area",
          "default": "Area::themed(theme)",
          "docs": "The region to reveal, built with `Axes::area`: the graph, its axes and the `x_range` it covers."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the area starts to grow."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "1.5",
          "docs": "Seconds the area takes to grow across its `x_range`."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::default()",
          "docs": "Easing of the growth over its run time."
        },
        {
          "name": "value",
          "type": "Option<Label>",
          "default": "None",
          "docs": "Text written beside the area followed by the integral of the part shown so far; `None` for no number."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "3",
          "docs": "Digits after the decimal point of the integral."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip path when two areas share a frame; `None` for the default."
        }
      ],
      "methods": []
    },
    {
      "name": "ArrayView",
      "summary": "An array as a row of cells with its values, placed around `center` (units of `ui.space`), each `cell` pixels wide and `gap` apart, with the index under each cell (`indices`, manim-dsa's `add_indexes`) and `label` left of the row (`add_label`, empty for none). It plays an `ArrayTrace`, one step every `step_time` seconds from `delay`: compared cells light up, moved cells travel to their new place on an arc, cells in their final place turn `colors.sorted`, cells outside the step's range dim and pointers move under the cells. An appended cell drops in at the end and a popped one rises out; the row is laid out for the trace's longest step, so the other cells stay where they are. With `notes` the step's note is written under the pointers. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/array-view-and-binary-search/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/array-view-and-binary-search.md",
      "scenes": [
        "ArrayView"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ArrayView-c779e3cb.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/array.rs#L134",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&ArrayTrace>",
          "default": "None",
          "docs": "The recorded steps to play (`ArrayTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.6",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the row, in units of `ui.space`."
        },
        {
          "name": "cell",
          "type": "f32",
          "default": "96.0",
          "docs": "Width and height of one cell in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "12.0",
          "docs": "Space between neighbouring cells in pixels."
        },
        {
          "name": "indices",
          "type": "bool",
          "default": "true",
          "docs": "Whether the index of each cell is written under it."
        },
        {
          "name": "label",
          "type": "&str",
          "default": "\"\"",
          "docs": "Text written left of the row; empty for none."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the pointers."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the cells in each state (compared, moved, sorted, found)."
        },
        {
          "name": "pointer_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the pointer names and arrows under the cells."
        },
        {
          "name": "index_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the indices under the cells."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the label left of the row."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the values in the cells."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the indices, pointer names and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn slot_x(&self, middle: f64, n: usize, slot: f64) -> f64",
          "summary": "The pixel centre of slot `slot` (fractional while cells move) for `n` cells."
        }
      ]
    },
    {
      "name": "Arrow",
      "summary": "An arrow from `(x1, y1)` to `(x2, y2)` (Manim `Arrow`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Arrow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Arrow-db3f4589.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arrows.rs#L170",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length in pixels of each tip from its point back along the shaft; shortened to fit a short arrow."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width in pixels of each tip across the shaft."
        },
        {
          "name": "tip_start",
          "type": "Option<ArrowTip>",
          "default": "None",
          "docs": "The tip at the start; `None` for none."
        },
        {
          "name": "tip_end",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the end; `None` for none."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::arrow(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "ArrowVectorField",
      "summary": "An arrow at every grid point of a `VectorField` (Manim `ArrowVectorField`), starting at the point, pointing along the vector, `length(magnitude)` units long and coloured by the magnitude. Zero vectors draw nothing.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "ArrowVectorField"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ArrowVectorField-5a2e07ae.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/vector_field.rs#L127",
      "themed": true,
      "fields": [
        {
          "name": "field",
          "type": "VectorField",
          "default": "VectorField::themed(theme)",
          "docs": "The vector field: the function, the box of grid points the arrows start from, and the colour by length."
        },
        {
          "name": "length",
          "type": "fn(f64) -> f64",
          "default": "sigmoid_length",
          "docs": "The arrow's length in units for a vector of this magnitude."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the arrow shafts in pixels."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "14.0",
          "docs": "Length of the arrow tips in pixels; shortened to half of a short arrow."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "12.0",
          "docs": "Width of the arrow tips in pixels, scaled down with a shortened tip."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the arrows appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the arrows leave at the end of their container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played on the arrows while they are shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shapes(&self, space: Space) -> Vec<Shape>",
          "summary": "The arrows as shapes, in pixels of `space`."
        }
      ]
    },
    {
      "name": "Axes",
      "summary": "Two number lines that cross where `x = 0` and `y = 0` (Manim `Axes`), or at the ends of the ranges that do not contain 0. Build the graphs and lines that go on them with `Axes::plot`, `Axes::vertical_line`, `Axes::riemann_rectangles` and `Axes::area`; they keep the axes' mapping.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "Axes"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Axes-70de6973.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/axes.rs#L449",
      "themed": true,
      "fields": [
        {
          "name": "x_range",
          "type": "Range",
          "default": "Range::new(-6.0, 6.0, 1.0)",
          "docs": "In axis units, see `Scaling`."
        },
        {
          "name": "y_range",
          "type": "Range",
          "default": "Range::new(-3.0, 3.0, 1.0)",
          "docs": "Range of the y-axis, `Range::new(min, max, step)`, in axis units; see `Scaling`."
        },
        {
          "name": "x_scaling",
          "type": "Scaling",
          "default": "Scaling::Linear",
          "docs": "How x values are spread along the x-axis: `Linear` or `LogBase`; `x_range` is then in axis units (exponents)."
        },
        {
          "name": "y_scaling",
          "type": "Scaling",
          "default": "Scaling::Linear",
          "docs": "How y values are spread along the y-axis: `Linear` or `LogBase`; `y_range` is then in axis units (exponents)."
        },
        {
          "name": "x_length",
          "type": "f64",
          "default": "12.0",
          "docs": "Length of the x-axis in units of `ui.space`."
        },
        {
          "name": "y_length",
          "type": "f64",
          "default": "6.0",
          "docs": "Length of the y-axis in units of `ui.space`."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the axes' box, in units of `ui.space`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the axis lines, their tips and their ticks."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the axis lines and the ticks in pixels."
        },
        {
          "name": "tips",
          "type": "bool",
          "default": "true",
          "docs": "Arrow tips at the positive ends."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length of an arrow tip in pixels."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width of an arrow tip in pixels."
        },
        {
          "name": "include_ticks",
          "type": "bool",
          "default": "true",
          "docs": "Draws a tick at every step of each range."
        },
        {
          "name": "tick_size",
          "type": "f32",
          "default": "10.0",
          "docs": "Half the length of a tick, in pixels."
        },
        {
          "name": "x_numbers",
          "type": "Vec<f64>",
          "default": "Vec::new()",
          "docs": "Values written below the x-axis (Manim `numbers_to_include`). A number where the y-axis crosses is left out, as in Manim."
        },
        {
          "name": "y_numbers",
          "type": "Vec<f64>",
          "default": "Vec::new()",
          "docs": "Values written left of the y-axis."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "0",
          "docs": "Digits after the decimal point of the written numbers."
        },
        {
          "name": "number_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the numbers: family, size in pixels and weight."
        },
        {
          "name": "number_fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the numbers."
        },
        {
          "name": "x_label",
          "type": "Option<Cow<str>>",
          "default": "None",
          "docs": "Written up and right of the end of the x-axis (Manim `get_axis_labels`)."
        },
        {
          "name": "y_label",
          "type": "Option<Cow<str>>",
          "default": "None",
          "docs": "Text written up and right of the end of the y-axis; `None` for none."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the axis labels: family, size in pixels and weight."
        },
        {
          "name": "label_fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the axis labels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the axis lines and ticks appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the axis lines and ticks leave at the end of their container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played on the lines while they are shown."
        },
        {
          "name": "labels_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the numbers and labels appear and go; the lines use `enter` and `exit`."
        },
        {
          "name": "labels_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade the numbers and labels out before the end of the container; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn map_in(&self, space: Space) -> AxesMap",
          "summary": "The mapping in `space`."
        },
        {
          "signature": "fn map(&self, ui: &Ui) -> AxesMap",
          "summary": "The mapping in `ui.space`."
        },
        {
          "signature": "fn c2p(&self, ui: &Ui, x: f64, y: f64) -> (f32, f32)",
          "summary": "The pixel of the data point `(x, y)` (Manim `c2p`)."
        },
        {
          "signature": "fn p2c(&self, ui: &Ui, x: f32, y: f32) -> (f64, f64)",
          "summary": "The data point at a pixel (Manim `p2c`)."
        },
        {
          "signature": "fn plot(&self, ui: &Ui, f: Func) -> FunctionGraph",
          "summary": "The graph of `f` over the whole x range (Manim `axes.plot(f)`); change `x_range`, the paint or `enter` with struct update syntax."
        },
        {
          "signature": "fn plot_parametric(&self, ui: &Ui, f: Curve, t_range: (f64, f64)) -> ParametricFunction",
          "summary": "The curve `t -> f(t)` in the axes' data units (Manim `plot_parametric_curve`)."
        },
        {
          "signature": "fn vertical_line(&self, ui: &Ui, x: f64, y: f64) -> DashedLine",
          "summary": "A dashed line from the data point `(x, y)` straight down (or up) to the x-axis, in the highlight colour (Manim `get_vertical_line(c2p(x, y))`)."
        },
        {
          "signature": "fn graph_label(&self, ui: &Ui, graph: &FunctionGraph, text: impl Into<Cow<str>>, x: f64, direction: Anchor) -> Label",
          "summary": "A label next to the point of `graph` above `x`, in the graph's colour (Manim `get_graph_label(graph, label, x_val, direction)`)."
        },
        {
          "signature": "fn riemann_rectangles(&self, ui: &Ui, f: Func, x_range: (f64, f64), dx: f64) -> RiemannRectangles",
          "summary": "Rectangles of width `dx` under `f` from `x_range.0` to `x_range.1` (Manim `get_riemann_rectangles`)."
        },
        {
          "signature": "fn area(&self, ui: &Ui, f: Func, x_range: (f64, f64)) -> Area",
          "summary": "The region between `f` and the x-axis from `x_range.0` to `x_range.1`; set `bounded` for the region between two graphs (Manim `get_area`)."
        },
        {
          "signature": "fn plot_implicit_curve(&self, ui: &Ui, f: Implicit) -> ImplicitFunction",
          "summary": "The curve where `f(x, y) = 0` over the axes' ranges (Manim `plot_implicit_curve`)."
        }
      ]
    },
    {
      "name": "BackgroundRectangle",
      "summary": "A filled rectangle behind a box, so it reads over a busy picture (Manim `BackgroundRectangle`): the background colour at Manim's 75% opacity, no outline.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "BackgroundRectangle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BackgroundRectangle-1443fb8b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/matchers.rs#L39",
      "themed": true,
      "fields": [
        {
          "name": "around",
          "type": "Rect",
          "default": "Rect::ZERO",
          "docs": "The box it is drawn around, in pixels of the canvas."
        },
        {
          "name": "buff",
          "type": "f32",
          "default": "0.0",
          "docs": "Pixels the rectangle extends beyond the box on every side."
        },
        {
          "name": "corner_radius",
          "type": "f32",
          "default": "0.0",
          "docs": "Radius of the rounded corners in pixels; 0 for square corners."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "paint.fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "paint.stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "paint.stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "BarChart",
      "summary": "Bars that grow one after another from a baseline, each with its value counting up above it and its label below. `(x, y)` is the left end of the baseline; the tallest bar is `max_height` high when `max_value` is `None`. A bar is never thinner than half a pixel, so a growing bar starts as a hairline.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "BarChart"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BarChart-b59040a1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/data/bar_chart.rs#L19",
      "themed": true,
      "fields": [
        {
          "name": "bars",
          "type": "Vec<(Cow<str>, f64)>",
          "default": "Vec::new()",
          "docs": "`(label, value)` of each bar, left to right."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left end of the baseline in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline in pixels of the canvas; bars grow up from it."
        },
        {
          "name": "bar_width",
          "type": "f32",
          "default": "126.0",
          "docs": "Width of one bar in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "62.0",
          "docs": "Space between neighbouring bars in pixels."
        },
        {
          "name": "max_height",
          "type": "f32",
          "default": "330.0",
          "docs": "Height in pixels of the bar whose value is `max_value`."
        },
        {
          "name": "max_value",
          "type": "Option<f64>",
          "default": "None",
          "docs": "The value drawn `max_height` high; `None` uses the largest value."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "8.0",
          "docs": "Corner radius of the bars in pixels."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the bars."
        },
        {
          "name": "highlight",
          "type": "Option<usize>",
          "default": "None",
          "docs": "The index of a bar drawn in `highlight_fill`."
        },
        {
          "name": "highlight_fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the highlighted bar."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the values above the bars."
        },
        {
          "name": "value_fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the values above the bars."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the labels below the bars."
        },
        {
          "name": "label_fill",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the labels below the bars."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "0",
          "docs": "Digits after the decimal point of the counting values."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first bar begins to grow."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "theme.motion.stagger.loose",
          "docs": "Seconds between the start of one bar and the start of the next."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.slow",
          "docs": "Seconds one bar takes to grow."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.enter",
          "docs": "Easing of each bar's growth over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn grown(&self, i: usize, t: f32) -> f32",
          "summary": "How far bar `i` has grown at `t`, from 0 to 1 (past 1 while a spring overshoots)."
        }
      ]
    },
    {
      "name": "BevelAlpha",
      "summary": "Highlights and shadows along the alpha edges of its children, so text, logos and shapes look raised (Remotion's `bevelAlpha()`). `edge_thickness` is the width of the rounded bevel, `light_angle` the light's direction in degrees clockwise from above (0 lights the top edges), `light_color` the colour added to the lit edges (its alpha sets the strength) and `light_intensity` the strength of both, 0 to 1. A fully opaque picture has no alpha edges and stays as it is.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "BevelAlpha"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BevelAlpha-538116c0.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/edges.rs#L74",
      "themed": true,
      "fields": [
        {
          "name": "edge_thickness",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(2.0)",
          "docs": "Width of the rounded bevel in the children's user units; 0 or less leaves the picture unchanged. Animatable."
        },
        {
          "name": "light_angle",
          "type": "f32",
          "default": "-60.0",
          "docs": "Degrees clockwise from straight up that the light comes from: 0 lights the top edges, 90 the right ones."
        },
        {
          "name": "light_color",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Colour added to the lit edges; its alpha sets the strength of the light."
        },
        {
          "name": "light_intensity",
          "type": "f32",
          "default": "0.4",
          "docs": "0 to 1 strength of the lit and the shaded edges."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "BinarySearch",
      "summary": "`ArrayView` playing `ArrayTrace::binary_search`, with what it looks for written above the cells (`\"looking for 23\"`). The search's range dims the cells it has ruled out, and the `lo`, `mid` and `hi` pointers move under the cells.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/array-view-and-binary-search/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/array-view-and-binary-search.md",
      "scenes": [
        "BinarySearch"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BinarySearch-fccc6d64.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/array.rs#L373",
      "themed": true,
      "fields": [
        {
          "name": "view",
          "type": "ArrayView",
          "default": "ArrayView { step_time: 0.9, ..ArrayView::themed(theme) }",
          "docs": "The array view that plays the search; its `trace` should be `ArrayTrace::binary_search`."
        },
        {
          "name": "target",
          "type": "i64",
          "default": "0",
          "docs": "The value the search looks for, written in the caption."
        },
        {
          "name": "caption",
          "type": "bool",
          "default": "true",
          "docs": "Whether `looking for ..` is written above the cells."
        },
        {
          "name": "caption_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the caption."
        }
      ],
      "methods": []
    },
    {
      "name": "BlockArrow",
      "summary": "A block arrow `length` long pointing in `angle` (counterclockwise on screen, 0 is right), centered on `(cx, cy)` (Remotion `Arrow`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "BlockArrow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BlockArrow-985a35ec.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/remotion.rs#L36",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "length",
          "type": "f32",
          "default": "300.0",
          "docs": "Total length in pixels, tail to point."
        },
        {
          "name": "head_width",
          "type": "f32",
          "default": "185.0",
          "docs": "Width in pixels of the arrowhead across the shaft."
        },
        {
          "name": "head_length",
          "type": "f32",
          "default": "120.0",
          "docs": "Length in pixels of the arrowhead (at most `length`)."
        },
        {
          "name": "shaft_width",
          "type": "f32",
          "default": "80.0",
          "docs": "Width in pixels of the shaft."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Direction it points, in radians counterclockwise on screen from the right (0 is right)."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Blur",
      "summary": "Its children blurred by a Gaussian of `radius` (the standard deviation, in view-box units), which can be animated: a focus pull, a background pushed back behind a title. A radius of 0 draws the children unfiltered. `key` names the filter when two blurs share a frame.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Blur"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Blur-b4f85c58.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/blur.rs#L18",
      "themed": true,
      "fields": [
        {
          "name": "radius",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(8.0)",
          "docs": "Gaussian standard deviation in view-box units; 0 draws the children unblurred. Animate it for a focus pull."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two blurs share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is blurred (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "BohrAtom",
      "summary": "The Bohr model of element `element` (atomic number): its symbol on the nucleus at `center` (units of `ui.space`) and its electrons on rings `shell_gap` pixels apart, from the ground state configuration. After `delay` the electrons appear one by one, innermost shell first, over `fill` seconds, and every shell turns, the outer ones slower (`speed` radians a second on the first). With `labels` the name and the electrons per shell sit under the atom. The rings draw with `enter`, the nucleus, the electrons and the labels with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/bohr-atom/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/bohr-atom.md",
      "scenes": [
        "BohrAtom"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BohrAtom-e37da4b9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/bohr.rs#L29",
      "themed": true,
      "fields": [
        {
          "name": "element",
          "type": "u32",
          "default": "11",
          "docs": "Atomic number of the element drawn (11 is sodium)."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the nucleus, in units of `ui.space`."
        },
        {
          "name": "nucleus_radius",
          "type": "f32",
          "default": "46.0",
          "docs": "Radius in pixels of the nucleus disc that carries the symbol."
        },
        {
          "name": "shell_gap",
          "type": "f32",
          "default": "56.0",
          "docs": "Distance in pixels between neighbouring shell rings, and from the nucleus to the first."
        },
        {
          "name": "electron_radius",
          "type": "f32",
          "default": "10.0",
          "docs": "Radius in pixels of an electron dot."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the electrons begin to appear."
        },
        {
          "name": "fill",
          "type": "f32",
          "default": "1.5",
          "docs": "Seconds the electrons take to appear one after another, innermost shell first."
        },
        {
          "name": "speed",
          "type": "f32",
          "default": "1.2",
          "docs": "Turning speed of the first shell in radians per second; outer shells turn slower."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the element name and the electrons per shell under the atom; `false` for none."
        },
        {
          "name": "nucleus_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the nucleus disc."
        },
        {
          "name": "shell_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the shell rings."
        },
        {
          "name": "electron_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the electron dots."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the name and shell count label under the atom."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Outline width in pixels of the shell rings."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the shell rings appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the shell rings leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the nucleus, electrons and labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the nucleus, electrons and labels before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn shell_radius(&self, index: usize) -> f64",
          "summary": "The radius in pixels of shell `index` (0 innermost)."
        },
        {
          "signature": "fn electron_angle(&self, index: usize, slot: u32, count: u32, t: f64) -> f64",
          "summary": "The angle in radians of electron `slot` of the `count` on shell `index`, `t` seconds after `delay`: evenly spaced, turning at `speed / (index + 1)`."
        }
      ]
    },
    {
      "name": "BondFormation",
      "summary": "Two atoms forming a bond, with their valence electrons on rings around their symbols. Ionic: from `at` over `duration` seconds the left atom's electrons arc over to the gaps of the right one, the left ring fades when it is empty, and the charges appear. Covalent: the atoms move together until their rings overlap and the shared electrons pair up between them. `left` and `right` are atomic numbers, placed `distance` pixels apart around `center` (units of `ui.space`). The rings draw with `enter`, the rest with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/bond-formation/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/bond-formation.md",
      "scenes": [
        "BondFormation"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BondFormation-b89e4131.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/bond_formation.rs#L89",
      "themed": true,
      "fields": [
        {
          "name": "kind",
          "type": "BondType",
          "default": "BondType::Ionic",
          "docs": "Ionic (the left atom gives electrons away) or covalent (the atoms share pairs)."
        },
        {
          "name": "left",
          "type": "u32",
          "default": "11",
          "docs": "Atomic number of the left atom; the electron donor when ionic."
        },
        {
          "name": "right",
          "type": "u32",
          "default": "17",
          "docs": "Atomic number of the right atom; the electron acceptor when ionic."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle between the two atoms, in units of `ui.space`."
        },
        {
          "name": "distance",
          "type": "f32",
          "default": "520.0",
          "docs": "Pixels between the atom centres at the start; covalent atoms then move closer until their rings overlap."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "130.0",
          "docs": "Radius in pixels of each valence ring; the nucleus and electron sizes follow it."
        },
        {
          "name": "at",
          "type": "f32",
          "default": "1.0",
          "docs": "Seconds after the container's start when the bonding begins."
        },
        {
          "name": "duration",
          "type": "f32",
          "default": "1.5",
          "docs": "Seconds the electron transfer (and, when covalent, the approach) takes."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the ion charges (ionic) or the number of shared pairs (covalent) once bonded; `false` for none."
        },
        {
          "name": "nucleus_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the nucleus discs behind the symbols."
        },
        {
          "name": "ring_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the valence rings."
        },
        {
          "name": "electron_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the electrons."
        },
        {
          "name": "shared_color",
          "type": "Color",
          "default": "Color::hex(\"#69db7c\")",
          "docs": "Colour the shared electron pairs and the \"shared pairs\" label turn to when covalent."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the ion charge labels."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Outline width in pixels of the valence rings."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the valence rings appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the valence rings leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the nuclei, electrons, symbols and labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the nuclei, electrons, symbols and labels before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Brace",
      "summary": "A curly brace along `(x1, y1)` to `(x2, y2)` whose tip points `depth` pixels to the right of that direction on screen: below for a brace drawn left to right (Manim `Brace` under a mobject). `Brace::tip` is where a label goes.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Brace"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Brace-8d1f7eb0.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/brace.rs#L8",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the span the brace runs along."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the span the brace runs along (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the span the brace runs along."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the span the brace runs along (y down)."
        },
        {
          "name": "depth",
          "type": "f32",
          "default": "24.0",
          "docs": "How far in pixels the tip sticks out, to the right of the direction from start to end on screen; negative turns the brace over."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        },
        {
          "signature": "fn tip(&self) -> (f32, f32)",
          "summary": "The point of the tip."
        }
      ]
    },
    {
      "name": "BraceLabel",
      "summary": "A `Brace` with text at its tip (Manim `BraceLabel`, `brace.get_text`). The label sits on the side the tip points to; the brace draws with its own `enter`, the text fades with `label_enter`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "BraceLabel"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BraceLabel-5e5b8ad1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/label.rs#L253",
      "themed": true,
      "fields": [
        {
          "name": "brace",
          "type": "Brace",
          "default": "Brace::themed(theme)",
          "docs": "The brace to label; it draws with its own `enter` and `exit`."
        },
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The text at the brace's tip."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "buff",
          "type": "f32",
          "default": "theme.spacing.sm",
          "docs": "Pixels between the tip and the text's box."
        },
        {
          "name": "label_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the text fades in; `None` shows it from the start."
        },
        {
          "name": "label_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the text fades out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn label(&self) -> Label",
          "summary": "The label at the tip, on the side the tip points to; centered on it for a brace of zero length."
        }
      ]
    },
    {
      "name": "Brightness",
      "summary": "Its children brighter or darker (CSS `brightness()`): `amount` 1 unchanged, 0 black.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Brightness"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Brightness-4532e323.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L300",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.3)",
          "docs": "Brightness factor on the colours: 1 unchanged, 0 black, above 1 brighter."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Broadcast",
      "summary": "Rings that grow out of `point` to `radius` one after another while they fade (Manim's `Broadcast`). Each ring runs as a part of a `LaggedStart` of `n_mobs`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "Broadcast"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Broadcast-71d71a97.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/indicate_ii.rs#L235",
      "themed": true,
      "fields": [
        {
          "name": "point",
          "type": "(f32, f32)",
          "default": "(960.0, 540.0)",
          "docs": "Where the rings start, in pixels of the canvas."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "270.0",
          "docs": "The radius the rings grow to."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the rings."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the rings in pixels."
        },
        {
          "name": "n_mobs",
          "type": "usize",
          "default": "5",
          "docs": "How many rings are sent out, one after another (at least 1)."
        },
        {
          "name": "initial_opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "Opacity of a ring when it starts, 0 transparent to 1 opaque."
        },
        {
          "name": "final_opacity",
          "type": "f32",
          "default": "0.0",
          "docs": "Opacity of a ring when it has reached `radius`."
        },
        {
          "name": "initial_width",
          "type": "f32",
          "default": "0.0",
          "docs": "The width the rings start at."
        },
        {
          "name": "lag_ratio",
          "type": "f32",
          "default": "0.2",
          "docs": "Fraction of a ring's time between the starts of two rings."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "3.0",
          "docs": "Seconds the whole broadcast takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::Smooth",
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": []
    },
    {
      "name": "BulletedList",
      "summary": "Manim's `BulletedList`: one line per item, each after a round bullet. `(x, y)` is the left of the first bullet on the first baseline; lines are `line_spacing` times the font size apart. The bullets are circles, so they need no glyph in the font.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "BulletedList"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/BulletedList-72a8ff17.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/bulleted_list.rs#L22",
      "themed": true,
      "fields": [
        {
          "name": "items",
          "type": "Vec<Cow<str>>",
          "default": "Vec::new()",
          "docs": "One line per item, each after a bullet."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left of the first bullet, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the first item, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "style",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the text."
        },
        {
          "name": "bullet_fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the bullets."
        },
        {
          "name": "indent",
          "type": "f32",
          "default": "style.size as f32 * 1.1",
          "docs": "Pixels from the bullet's left to the text."
        },
        {
          "name": "line_spacing",
          "type": "f32",
          "default": "style.line_height * 1.25",
          "docs": "Baseline distance as a multiple of the font size."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds before the first item comes in, when `stagger` is set."
        },
        {
          "name": "stagger",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Seconds between the starts of two items coming in; `None` (the default) shows every item from the start."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.enter",
          "docs": "Seconds each item takes to fade and rise into place, when `stagger` is set."
        }
      ],
      "methods": [
        {
          "signature": "fn baseline(&self, index: usize) -> f32",
          "summary": "The baseline of item `index`."
        },
        {
          "signature": "fn revealed_at(&self, index: usize) -> f32",
          "summary": "Seconds into the container when item `index` is fully in: 0 without a `stagger`."
        }
      ]
    },
    {
      "name": "Burlap",
      "summary": "Coarse woven sacking over its children (Remotion's `burlap()`): strands `size` units wide run across and down, the gaps between them and blotchy `roughness` darken the picture towards `color`, mixed in by `amount`. `seed` picks the blotches. Remotion's over and under weave, strand jitter and dashes are left out. The strands are repeating gradients, so they stay sharp at any size, but keep them a few output pixels wide; finer cloth aliases. The children render twice, their alpha stays.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Burlap"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Burlap-8ec0ff07.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/textures.rs#L449",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.55)",
          "docs": "0 the children unchanged to 1 fully woven; at most the share `color` covers the gaps. Animatable."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "5.0",
          "docs": "Width of one strand in the children's user units; keep it a few output pixels wide or it aliases."
        },
        {
          "name": "roughness",
          "type": "f32",
          "default": "0.7",
          "docs": "0 to 1 strength of the blotchy darkening on top of the weave."
        },
        {
          "name": "seed",
          "type": "u32",
          "default": "0",
          "docs": "Picks the blotches."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "Color::BLACK",
          "docs": "Colour the gaps and blotches darken the picture towards."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the cloth covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the gradient, filter and mask ids when two burlaps share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is covered with burlap, by its alpha (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Callout",
      "summary": "A speech bubble: a rounded box with a tail that points at `(tail_x, tail_y)`. The tail overlaps the box, so give it a fill and no outline.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Callout"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Callout-75608d2c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/remotion.rs#L80",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "400.0",
          "docs": "Width in pixels of the box."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "200.0",
          "docs": "Height in pixels of the box."
        },
        {
          "name": "corner_radius",
          "type": "f32",
          "default": "theme.radius.md",
          "docs": "Radius of the rounded corners in pixels; 0 for square corners."
        },
        {
          "name": "tail_x",
          "type": "f32",
          "default": "-100.0",
          "docs": "X in pixels of the canvas the tail points at."
        },
        {
          "name": "tail_y",
          "type": "f32",
          "default": "200.0",
          "docs": "Y in pixels of the canvas the tail points at."
        },
        {
          "name": "tail_width",
          "type": "f32",
          "default": "60.0",
          "docs": "Width in pixels of the tail where it meets the box."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "CallStack",
      "summary": "The call stack of a recursion: a frame for each open call, `height` pixels tall and wide enough for the longest label, piled up from the bottom of a column `capacity` frames tall (or as tall as the trace needs), centred on `center` (units of `ui.space`). It plays a `CallTrace`, one step every `step_time` seconds from `delay`: a call drops a frame on top, the innermost frame lights up, a returning frame shows its result in `colors.found` and then rises out. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/call-trace-call-stack-and-recursion-tree/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/call-trace-call-stack-and-recursion-tree.md",
      "scenes": [
        "CallStack"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CallStack-7c28482c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/recursion.rs#L366",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&CallTrace>",
          "default": "None",
          "docs": "The recorded calls to play (`CallTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.6",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the column, in units of `ui.space`."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "64.0",
          "docs": "Height of a frame in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "10.0",
          "docs": "Space between neighbouring frames in pixels."
        },
        {
          "name": "capacity",
          "type": "usize",
          "default": "0",
          "docs": "How many frames tall the column is; 0 uses the deepest the trace gets."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the stack."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the frames in each state (`colors.found` for a returning call)."
        },
        {
          "name": "frame_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the column's outline."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the call labels."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "CameraMotionBlur",
      "summary": "Motion blur as a film camera records it, like Remotion's `<CameraMotionBlur>`: the children are averaged over the time the shutter is open before each frame. `shutter_angle` is in degrees, 360 for the whole frame interval; `samples` (at most `MAX_SAMPLES`) are the moments averaged. Each is drawn over the earlier ones with opacity `1 / k` for the `k`-th, so all count the same where the children are opaque.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "CameraMotionBlur"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CameraMotionBlur-99914449.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/motion_blur.rs#L83",
      "themed": true,
      "fields": [
        {
          "name": "shutter_angle",
          "type": "f32",
          "default": "180.0",
          "docs": "Degrees the shutter stays open per frame: 360 is the whole frame interval, 180 half of it (Remotion's default)."
        },
        {
          "name": "samples",
          "type": "usize",
          "default": "10",
          "docs": "Moments averaged over the open shutter, at most `MAX_SAMPLES`; more is smoother and costs more renders."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is blurred by its own motion (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn offsets(&self, fps: usize) -> Vec<f32>",
          "summary": "Seconds before the frame of each sample at `fps`, the earliest first and the frame itself last."
        }
      ]
    },
    {
      "name": "Canvas",
      "summary": "Content drawn in another coordinate system: its children see `space` as `ui.space` (Manim's frame, moved and scaled), for a graph in one half of the screen or a figure in a card.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "Canvas"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Canvas-e1472c7c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/canvas.rs#L14",
      "themed": true,
      "fields": [
        {
          "name": "space",
          "type": "Space",
          "default": "Space::FULL_HD",
          "docs": "The coordinate system the children see as `ui.space`: units, origin and canvas box."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "What it draws in that space (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Captions",
      "summary": "The cue of a subtitle (`.vtt`) file that plays now, wrapped into `width` pixels. Cue times are seconds of the video, or of the container with `video_time: false`. A missing file draws nothing (and `inspect` reports it).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "Captions"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Captions-decfb3bc.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/captions.rs#L18",
      "themed": true,
      "fields": [
        {
          "name": "file",
          "type": "&str",
          "default": "\"\"",
          "docs": "A subtitle file of the video's media."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "160.0",
          "docs": "Left edge of the caption box, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "900.0",
          "docs": "Baseline of the first line, in pixels of the canvas; later lines go below."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1600.0",
          "docs": "Width in pixels the cue wraps into; it is aligned inside this width."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.heading",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.caption",
          "docs": "Colour of the text."
        },
        {
          "name": "align",
          "type": "TextAlign",
          "default": "TextAlign::Center",
          "docs": "How the lines sit inside `width`: left, center or right."
        },
        {
          "name": "video_time",
          "type": "bool",
          "default": "true",
          "docs": "`true` reads cue times as seconds of the whole video; `false` as seconds of the container."
        }
      ],
      "methods": []
    },
    {
      "name": "CaptionStack",
      "summary": "Timed captions without a subtitle file: each `Caption` rises `rise` units into place at its `at` seconds and leaves upward while the next one comes in. The last stays. `(x, y)` is the baseline of the tag; the line is `gap` pixels below it.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "CaptionStack"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CaptionStack-8fe1319e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/captions.rs#L107",
      "themed": true,
      "fields": [
        {
          "name": "items",
          "type": "Vec<Caption>",
          "default": "Vec::new()",
          "docs": "The cards, in order of `at`; each shows from its `at` seconds."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "96.0",
          "docs": "Left edge of the tag and line, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "860.0",
          "docs": "Baseline of the tag in pixels of the canvas; the line sits `gap` below."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "88.0",
          "docs": "Pixels from the tag's baseline to the line's baseline."
        },
        {
          "name": "tag_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the small tag: family, size in pixels and weight."
        },
        {
          "name": "line_style",
          "type": "TextStyle",
          "default": "theme.typography.heading",
          "docs": "The font of the line: family, size in pixels and weight."
        },
        {
          "name": "tag_fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the tag."
        },
        {
          "name": "line_fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the line."
        },
        {
          "name": "tag_spacing",
          "type": "f32",
          "default": "4.0",
          "docs": "Extra space between letters of the tag, in pixels."
        },
        {
          "name": "rise",
          "type": "f32",
          "default": "40.0",
          "docs": "Pixels a card rises into place as it enters (and about three quarters of that as it leaves)."
        },
        {
          "name": "enter",
          "type": "f32",
          "default": "theme.motion.duration.enter",
          "docs": "Seconds a card takes to fade and rise in."
        },
        {
          "name": "leave",
          "type": "f32",
          "default": "theme.motion.duration.exit",
          "docs": "Seconds before the next caption's `at` that this one starts to leave."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.enter",
          "docs": "Easing of a card rising into place."
        }
      ],
      "methods": []
    },
    {
      "name": "Cell",
      "summary": "A cell, `size` pixels from its centre to its side, centred on `center` (units of `ui.space`). From `delay` its `organelles` (all of `kind`'s, `Organelle::of`, when empty) appear one every `stagger` seconds in the order given: each fades in and grows into place, the membrane and wall draw their outline first. With `labels` a leader line then draws from each to its name, in columns left and right of the cell. Free ribosomes are placed at random from `seed`. The whole figure fades with `enter` and `exit`.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/cell/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/cell.md",
      "scenes": [
        "Cell"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Cell-3a582d6f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/cell.rs#L585",
      "themed": true,
      "fields": [
        {
          "name": "kind",
          "type": "CellKind",
          "default": "CellKind::Animal",
          "docs": "Animal or plant cell: picks which organelles exist and the cell outline (rounded blob or walled rectangle)."
        },
        {
          "name": "organelles",
          "type": "Vec<Organelle>",
          "default": "Vec::new()",
          "docs": "Organelles to show, in the order they appear; empty shows all of `kind`'s (`Organelle::of`)."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first organelle appears."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.5",
          "docs": "Seconds between one organelle starting to appear and the next."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the cell, in units of `ui.space`."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "330.0",
          "docs": "Pixels from the cell's centre to its side (half the width)."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Draws a leader line and name for each organelle when `true`; `false` for the bare cell."
        },
        {
          "name": "seed",
          "type": "u64",
          "default": "7",
          "docs": "Seed for the random placement of the free ribosomes; the same seed gives the same dots."
        },
        {
          "name": "palette",
          "type": "CellPalette",
          "default": "CellPalette::default()",
          "docs": "Colours of the cytoplasm, membrane and each organelle."
        },
        {
          "name": "leader_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the leader lines."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the organelle names."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the organelle names: family, size in pixels and weight."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "ChangeDecimalToValue",
      "summary": "Counts a `DecimalNumber` from the value of its tracker to `target` (Manim's `ChangeDecimalToValue`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ChangeDecimalToValue"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ChangeDecimalToValue-b708aed6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/speed.rs#L104",
      "themed": false,
      "fields": [
        {
          "name": "number",
          "type": "DecimalNumber",
          "default": null,
          "docs": "The number to change; its current value is the start."
        },
        {
          "name": "target",
          "type": "f32",
          "default": null,
          "docs": "The value it counts to by the end."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(number: DecimalNumber, target: f32) -> Self",
          "summary": "In Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "ChangeSpeed",
      "summary": "Plays its children faster or slower over the first `run_time` seconds (Manim's `ChangeSpeed`). `speed` is a curve of `(fraction of run_time, speed)` points, straight between them and flat beyond them; no points is speed 1. The children see their time `t` as `run_time · S(t / run_time) / S(1)`, `S` the area under the curve, so they start and end where they would anyway and only the pace in between changes. After `run_time` their time is the real one again.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ChangeSpeed"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ChangeSpeed-348f3445.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/speed.rs#L19",
      "themed": false,
      "fields": [
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds over which the pace changes; after that the children run at real time."
        },
        {
          "name": "speed",
          "type": "Vec<(f32, f32)>",
          "default": null,
          "docs": "Curve of `(fraction of run_time, speed)` points, straight between them and flat beyond; empty for speed 1."
        },
        {
          "name": "children",
          "type": "Children",
          "default": null,
          "docs": "What it plays at the changed pace (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn remap(&self, t: f32) -> f32",
          "summary": "The time the children see at local second `t`."
        }
      ]
    },
    {
      "name": "ChangingDecimal",
      "summary": "Shows `number_update_func(alpha)` in a `DecimalNumber` while the animation's progress runs from 0 to 1 (Manim's `ChangingDecimal`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ChangingDecimal"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ChangingDecimal-b0390fac.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/speed.rs#L145",
      "themed": false,
      "fields": [
        {
          "name": "number",
          "type": "DecimalNumber",
          "default": null,
          "docs": "The number to show; its `value` is replaced while the animation runs."
        },
        {
          "name": "number_update_func",
          "type": "fn(f32) -> f32",
          "default": null,
          "docs": "Gives the value to show from the progress, 0 to 1."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(number: DecimalNumber, number_update_func: fn(f32) -> f32) -> Self",
          "summary": "In Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "ChapterList",
      "summary": "A list of chapters with a highlight that springs to the chapter playing now (an agenda, the steps of a tutorial). Each chapter is `(start seconds, title)`, in order; before the first start the highlight is on the first row. `(x, y)` is the top left of the list.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "ChapterList"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ChapterList-e8e1bf6e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/chapters.rs#L17",
      "themed": true,
      "fields": [
        {
          "name": "chapters",
          "type": "Vec<(f32, Cow<str>)>",
          "default": "Vec::new()",
          "docs": "Each chapter as `(start in seconds, title)`, in order; the highlight moves to a chapter when it starts."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "96.0",
          "docs": "Left edge of the list, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "240.0",
          "docs": "Top of the first row, in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "720.0",
          "docs": "Width of the highlight bar in pixels."
        },
        {
          "name": "row_height",
          "type": "f32",
          "default": "72.0",
          "docs": "Height of one row, and of the highlight, in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "12.0",
          "docs": "Pixels between two rows."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the titles that are not playing."
        },
        {
          "name": "active_fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the title of the chapter playing now."
        },
        {
          "name": "highlight",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Colour of the bar behind the current chapter."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "theme.radius.md",
          "docs": "Corner radius of the highlight bar in pixels."
        },
        {
          "name": "spring",
          "type": "(f32, f32)",
          "default": "(130.0 / 0.45, 20.0 / 0.45)",
          "docs": "`(stiffness, damping)` of the highlight's mass-1 spring."
        }
      ],
      "methods": [
        {
          "signature": "fn active(&self, t: f32) -> usize",
          "summary": "The chapter playing at `t`."
        },
        {
          "signature": "fn highlight_row(&self, t: f32) -> f32",
          "summary": "The top of the highlight at `t`, in rows from the first (between two rows while it moves)."
        }
      ]
    },
    {
      "name": "ChargeGlow",
      "summary": "Manim-physics' `Charge` drawn: a disc at the charge with its sign, `radius` pixels for a charge of 1 and growing with the square root of `|q|` (half to twice that), in a soft glow with `glow`. Positive charges are `positive_color`, negative ones `negative_color`. The data is a `Charge`, which `Field` and `ElectricField` take as well.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/electric-field-and-magnetic-field/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/electric-field-and-magnetic-field.md",
      "scenes": [
        "ChargeGlow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ChargeGlow-356589e6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/electro.rs#L26",
      "themed": true,
      "fields": [
        {
          "name": "charge",
          "type": "Charge",
          "default": "Charge::new(0.0, 0.0, 1.0)",
          "docs": "The charge to draw: position in units of `ui.space` and its signed strength `q`."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "26.0",
          "docs": "Disc radius in pixels for a charge of 1; it grows with the square root of `|q|`."
        },
        {
          "name": "glow",
          "type": "bool",
          "default": "true",
          "docs": "Draws a soft glow of rings around the disc."
        },
        {
          "name": "positive_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of a positive charge."
        },
        {
          "name": "negative_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of a negative charge."
        },
        {
          "name": "sign_color",
          "type": "Color",
          "default": "theme.colors.background",
          "docs": "Colour of the `+` or `−` sign on the disc."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn disc_radius(&self) -> f32",
          "summary": "The disc's radius in pixels."
        }
      ]
    },
    {
      "name": "Check",
      "summary": "A check mark that draws itself on from `delay` seconds over `run_time`. `(x, y)` is the start of the short stroke; the mark is 27 by 20 units times `size`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "Check"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Check-614084d2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/progress.rs#L75",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Start of the short stroke, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Start of the short stroke, in pixels of the canvas."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "1.0",
          "docs": "Scale of the mark, which is 27 by 20 pixels at 1."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the mark."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "5.0",
          "docs": "Width of the mark's line in pixels."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.base",
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.standard",
          "docs": "Easing of the drawing over its run time."
        }
      ],
      "methods": []
    },
    {
      "name": "Checkerboard",
      "summary": "A checkerboard over its children (Remotion's `checkerboard()`): square cells `cell_size` units wide in `colors` taken in turn along each row and column, `gap` units of the children showing between them. `angle` turns the board about the middle of the area in degrees and `offset_x`, `offset_y` move it; with `mask_to_source_alpha` it covers only the opaque parts of the children (which then render twice).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Checkerboard"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Checkerboard-056d86ea.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L318",
      "themed": true,
      "fields": [
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "PALE_BLUES.to_vec()",
          "docs": "Colours of the cells, taken in turn along every row and column; empty draws no board."
        },
        {
          "name": "cell_size",
          "type": "f32",
          "default": "80.0",
          "docs": "Side of one square cell in the children's user units."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "0.0",
          "docs": "Width in user units of the children showing between cells."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the board is turned about the middle of the area."
        },
        {
          "name": "offset_x",
          "type": "f32",
          "default": "0.0",
          "docs": "Horizontal shift of the board in user units."
        },
        {
          "name": "offset_y",
          "type": "f32",
          "default": "0.0",
          "docs": "Vertical shift of the board in user units."
        },
        {
          "name": "mask_to_source_alpha",
          "type": "bool",
          "default": "false",
          "docs": "`true` covers only the opaque parts of the children, which then render twice."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the board covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip and mask ids when two boards share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the board is laid over (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Circle",
      "summary": "A circle (Manim `Circle`, Remotion `Circle`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Circle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Circle-88a3e8ed.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L85",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Circuit",
      "summary": "A series circuit on a rectangular loop centered on `center`, `width` by `height` units of `ui.space`: a battery on the left side, a switch on the top, a bulb on the right and a resistor on the bottom, each left out when its flag is off (the wire runs on). The switch closes `on_at` seconds after the local start; then the current flows as dots, clockwise out of the battery's long plate (+) at `current_speed` pixels a second, and the bulb glows. Without a switch the current starts at `on_at`. A label left empty is not drawn. The wire and the parts draw with `enter`, the labels, dots and glow fade with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/circuit/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/circuit.md",
      "scenes": [
        "Circuit"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Circuit-ca64f54b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/circuit.rs#L26",
      "themed": true,
      "fields": [
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the loop, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f64",
          "default": "8.0",
          "docs": "Width of the loop in units of `ui.space`."
        },
        {
          "name": "height",
          "type": "f64",
          "default": "4.5",
          "docs": "Height of the loop in units of `ui.space`."
        },
        {
          "name": "battery",
          "type": "bool",
          "default": "true",
          "docs": "Draws the battery on the left side; off leaves the wire running on."
        },
        {
          "name": "switch",
          "type": "bool",
          "default": "true",
          "docs": "Draws the switch on the top side; off leaves the wire running on and the current starts at `on_at`."
        },
        {
          "name": "bulb",
          "type": "bool",
          "default": "true",
          "docs": "Draws the bulb on the right side; off leaves the wire running on."
        },
        {
          "name": "resistor",
          "type": "bool",
          "default": "true",
          "docs": "Draws the resistor on the bottom side; off leaves the wire running on."
        },
        {
          "name": "on_at",
          "type": "f32",
          "default": "1.0",
          "docs": "Seconds after the local start when the switch begins to close and the current starts."
        },
        {
          "name": "current_speed",
          "type": "f32",
          "default": "160.0",
          "docs": "Speed of the current dots along the wire, in pixels per second."
        },
        {
          "name": "dots",
          "type": "usize",
          "default": "28",
          "docs": "Number of dots that make up the current, spread evenly around the loop."
        },
        {
          "name": "battery_label",
          "type": "&str",
          "default": "\"9 V\"",
          "docs": "Text beside the battery; empty for none."
        },
        {
          "name": "switch_label",
          "type": "&str",
          "default": "\"\"",
          "docs": "Text above the switch; empty for none."
        },
        {
          "name": "bulb_label",
          "type": "&str",
          "default": "\"\"",
          "docs": "Text beside the bulb; empty for none."
        },
        {
          "name": "resistor_label",
          "type": "&str",
          "default": "\"R\"",
          "docs": "Text below the resistor; empty for none."
        },
        {
          "name": "wire_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the wire and the parts."
        },
        {
          "name": "dot_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the current dots."
        },
        {
          "name": "glow_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the bulb's glow once current flows."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the labels."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Wire width in pixels; the battery's short plate is 2.5 times as thick."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the wire and the parts draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the wire and the parts leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the labels, dots and glow fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the labels, dots and glow fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn lever_angle(&self, now: f32) -> f64",
          "summary": "The angle of the switch's lever, from open (35°) to closed (0)."
        },
        {
          "signature": "fn flowing(&self, now: f32) -> f32",
          "summary": "Seconds the current has flowed at `now` seconds of local time, 0 before it starts."
        }
      ]
    },
    {
      "name": "Circulation",
      "summary": "Double circulation: the heart's four chambers (right atrium and ventricle on the viewer's left, left atrium and ventricle on the right) with the lungs above and the body below, `scale` times its normal size (about 860 by 820 pixels) around `center` (units of `ui.space`). From `delay` the chambers appear and the vessels draw along the way the blood goes: right ventricle, pulmonary artery, lungs, pulmonary vein, left atrium, left ventricle, aorta, body, vena cava, right atrium. Then blood cells run round the loop at `speed` pixels a second, turning from `deoxygenated` to `oxygenated` in the lungs and back in the body, while the heart beats `bpm` times a minute, atria first. With `labels` the lungs, the body and the vessels are named.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/circulation/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/circulation.md",
      "scenes": [
        "Circulation"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Circulation-f1b6b45f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/circulation.rs#L118",
      "themed": true,
      "fields": [
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the chambers appear and the vessels begin to draw."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, -0.15)",
          "docs": "The middle of the heart, in units of `ui.space`."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Size factor on the figure; `1.0` is about 860 by 820 pixels."
        },
        {
          "name": "speed",
          "type": "f32",
          "default": "260.0",
          "docs": "Speed of the blood cells along the loop, in pixels per second."
        },
        {
          "name": "bpm",
          "type": "f32",
          "default": "70.0",
          "docs": "Heartbeats per minute; the atria contract first, then the ventricles."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Names the lungs, the body and the vessels when `true`."
        },
        {
          "name": "oxygenated",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "Colour of oxygen-rich blood (left side, aorta, pulmonary vein)."
        },
        {
          "name": "deoxygenated",
          "type": "Color",
          "default": "Color::hex(\"#4dabf7\")",
          "docs": "Colour of oxygen-poor blood (right side, vena cava, pulmonary artery)."
        },
        {
          "name": "chamber_color",
          "type": "Color",
          "default": "Color::hex(\"#2a1c2e\")",
          "docs": "Fill of the four heart chambers."
        },
        {
          "name": "bed_color",
          "type": "Color",
          "default": "Color::hex(\"#1b2735\")",
          "docs": "Fill of the capillary beds in the lungs and the body."
        },
        {
          "name": "gap_color",
          "type": "Color",
          "default": "theme.colors.background",
          "docs": "Colour of the gap cut into a vessel where another crosses it; match the background."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the lung, body and vessel names: family, size in pixels and weight."
        },
        {
          "name": "chamber_style",
          "type": "TextStyle",
          "default": "chamber_style",
          "docs": "The font of the chamber names (`RA`, `RV`, `LA`, `LV`): family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of all the text."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Click",
      "summary": "A cursor at `(x, y)` that clicks at `at` seconds: it presses, then a ring goes out. It fades in over `fade` seconds from the start of its container.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs.md",
      "scenes": [
        "Click"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Click-13ad6aa1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/assets/cursor.rs#L489",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "f32",
          "default": "960.0",
          "docs": "Horizontal position of the cursor in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "540.0",
          "docs": "Vertical position of the cursor in pixels of the canvas, down."
        },
        {
          "name": "at",
          "type": "f32",
          "default": "0.5",
          "docs": "Second of the click, local to the parent container."
        },
        {
          "name": "shape",
          "type": "CursorShape",
          "default": "CursorShape::Pointer",
          "docs": "Which cursor is drawn: arrow, pointer, I-beam, grab, grabbing or crosshair."
        },
        {
          "name": "style",
          "type": "CursorStyle",
          "default": "CursorStyle::Dark",
          "docs": "Colours of the cursor: `Dark` (black with a white outline) or `Light` (white with a black outline)."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "40.0",
          "docs": "Height in pixels of the 24 unit design."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds the cursor takes to fade in from the start of its container."
        },
        {
          "name": "look",
          "type": "ClickLook",
          "default": "ClickLook::themed(theme)",
          "docs": "How the click looks: the press depth and duration and the ring that goes out."
        }
      ],
      "methods": []
    },
    {
      "name": "ClockwiseTransform",
      "summary": "A morph whose points travel clockwise on arcs of `path_arc` radians (Manim's `ClockwiseTransform`, a half turn).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ClockwiseTransform"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ClockwiseTransform-5ad68226.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L141",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Shape",
          "default": null,
          "docs": "The shape it starts as; drawn until `delay` has passed."
        },
        {
          "name": "to",
          "type": "Shape",
          "default": null,
          "docs": "The shape it ends as."
        },
        {
          "name": "path_arc",
          "type": "f32",
          "default": null,
          "docs": "Negative turns clockwise."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Shape, to: Shape) -> Self",
          "summary": "From `from` to `to` on half turns in Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "CodeBlock",
      "summary": "Source code on a panel, coloured by `tokenize` for `language`, in a monospaced `style`, with line numbers, centred on `center` (units of `ui.space`). The panel is as wide as the longest line, or `width` pixels when set, and longer lines end with `…`. Tabs count as four spaces. `lines` lights one line (counted from 1, 0 for none) a step, one step every `step_time` seconds from `delay`, so it can follow another figure's trace with the same timing: the bar slides to the line and the other lines dim to `dim`. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/code-block/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/code-block.md",
      "scenes": [
        "CodeBlock"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CodeBlock-8ca2743b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/code.rs#L368",
      "themed": true,
      "fields": [
        {
          "name": "code",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The source text, one line per line; tabs count as four spaces."
        },
        {
          "name": "language",
          "type": "Language",
          "default": "Language::Rust",
          "docs": "The language, for keyword and comment colours."
        },
        {
          "name": "lines",
          "type": "Vec<usize>",
          "default": "Vec::new()",
          "docs": "The line lit at each step, counted from 1; 0 lights none. One step every `step_time` seconds."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each step takes; the bar slides to the next line within it."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the panel, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "0.0",
          "docs": "Width of the panel in pixels; 0 fits the longest line, and longer lines end with an ellipsis."
        },
        {
          "name": "padding",
          "type": "f32",
          "default": "28.0",
          "docs": "Space between the panel's edge and the text in pixels."
        },
        {
          "name": "line_numbers",
          "type": "bool",
          "default": "true",
          "docs": "Whether each line is numbered."
        },
        {
          "name": "dim",
          "type": "f32",
          "default": "0.55",
          "docs": "Opacity of the lines that are not lit while a line is lit."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": null,
          "docs": "The font: a monospaced family, size in pixels and weight."
        },
        {
          "name": "colors",
          "type": "CodeColors",
          "default": "CodeColors::themed(theme)",
          "docs": "Colours of the panel, the bar and each kind of token."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Collision1D",
      "summary": "Two carts, A and B, on a straight track that collide head on, in closed form: masses `m1` and `m2` kg, velocities `u1` and `u2` m/s before (positive to the right), centers `x1` and `x2` meters from the track's left end. `restitution` is 1 for an elastic collision and 0 for one where they stick together. The track starts at `track` (units of `ui.space`, `scale` units per meter) and is `track_length` meters long; a cart stops at its end. With `vectors` each cart carries its velocity, and with `momentum` bars under the track show both momenta and their sum, which stays the same through the collision. The track draws with `enter`, the carts and bars with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/collision-1d/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/collision-1d.md",
      "scenes": [
        "Collision1D"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Collision1D-68c421ce.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/collision.rs#L27",
      "themed": true,
      "fields": [
        {
          "name": "m1",
          "type": "f64",
          "default": "2.0",
          "docs": "Mass of cart A in kg."
        },
        {
          "name": "m2",
          "type": "f64",
          "default": "1.0",
          "docs": "Mass of cart B in kg."
        },
        {
          "name": "u1",
          "type": "f64",
          "default": "3.0",
          "docs": "Velocity of cart A before the collision in m/s; positive moves right."
        },
        {
          "name": "u2",
          "type": "f64",
          "default": "-1.0",
          "docs": "Velocity of cart B before the collision in m/s; positive moves right."
        },
        {
          "name": "x1",
          "type": "f64",
          "default": "2.0",
          "docs": "Center of cart A in meters from the track's left end at the start."
        },
        {
          "name": "x2",
          "type": "f64",
          "default": "8.0",
          "docs": "Center of cart B in meters from the track's left end at the start."
        },
        {
          "name": "restitution",
          "type": "f64",
          "default": "1.0",
          "docs": "Bounciness: 1 is an elastic collision, 0 makes the carts stick together."
        },
        {
          "name": "track",
          "type": "(f64, f64)",
          "default": "(-6.0, 0.0)",
          "docs": "Left end of the track, in units of `ui.space`."
        },
        {
          "name": "track_length",
          "type": "f64",
          "default": "12.0",
          "docs": "Length of the track in meters; a cart stops at its end."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the carts start moving."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "vectors",
          "type": "bool",
          "default": "true",
          "docs": "Shows each cart's velocity as an arrow with its value in m/s."
        },
        {
          "name": "momentum",
          "type": "bool",
          "default": "true",
          "docs": "Shows bars under the track for both momenta and their sum."
        },
        {
          "name": "bar_scale",
          "type": "f32",
          "default": "40.0",
          "docs": "Pixels of bar per kg·m/s."
        },
        {
          "name": "color_a",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of cart A, its velocity and its momentum bar."
        },
        {
          "name": "color_b",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of cart B, its velocity and its momentum bar."
        },
        {
          "name": "total_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the total momentum label."
        },
        {
          "name": "track_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the track, the wheels and the momentum axis."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the track and the velocity arrows in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the track draws in; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the track leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the carts and bars fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the carts and bars fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn cart_length(mass: f64) -> f64",
          "summary": "Meters long, a cart of `mass` kg: heavier carts are longer."
        },
        {
          "signature": "fn collision_time(&self) -> Option<f64>",
          "summary": "Seconds until the carts touch, or `None` when they never close in."
        },
        {
          "signature": "fn final_velocities(&self) -> (f64, f64)",
          "summary": "The velocities after the collision, from momentum and the restitution."
        },
        {
          "signature": "fn state(&self, t: f64) -> [(f64, f64); 2]",
          "summary": "Each cart's center in meters and velocity in m/s after `t` seconds."
        },
        {
          "signature": "fn momenta(&self, t: f64) -> (f64, f64)",
          "summary": "The momenta of A and B in kg·m/s after `t` seconds."
        }
      ]
    },
    {
      "name": "ColorCorrection",
      "summary": "A basic colour correction in one matrix: `brightness`, then `contrast`, then `saturation` (1 leaves each unchanged), then the hues turned by `hue` degrees.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "ColorCorrection"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ColorCorrection-178547cc.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L429",
      "themed": true,
      "fields": [
        {
          "name": "brightness",
          "type": "f32",
          "default": "1.0",
          "docs": "Brightness factor applied first; 1 unchanged."
        },
        {
          "name": "contrast",
          "type": "f32",
          "default": "1.1",
          "docs": "Contrast factor applied second, about mid grey; 1 unchanged."
        },
        {
          "name": "saturation",
          "type": "f32",
          "default": "1.2",
          "docs": "Saturation factor applied third; 1 unchanged, 0 grey."
        },
        {
          "name": "hue",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the hues are turned last."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ColorKey",
      "summary": "A chroma key: what has the hue of `color` (a green or blue screen) turns transparent. Colours whose share of that hue is within `tolerance` of the key's vanish, and `softness` is the width of the fade into opaque. Linear in the colour, so it works best on saturated screens; a grey `color` keys nothing.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "ColorKey"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ColorKey-ebc3b53d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L635",
      "themed": true,
      "fields": [
        {
          "name": "color",
          "type": "Color",
          "default": "Color::rgb(0, 255, 0)",
          "docs": "Colour of the screen to remove; a grey colour keys nothing."
        },
        {
          "name": "tolerance",
          "type": "f32",
          "default": "0.4",
          "docs": "0 to 1: how far from the key hue still turns fully transparent; larger removes more."
        },
        {
          "name": "softness",
          "type": "f32",
          "default": "0.2",
          "docs": "0 to 1: width of the fade from transparent to opaque at the edge of the key."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ColorStack",
      "summary": "Several colour matrices drawn as one: `matrices` in order, chained with `ColorMatrix::then` into one `feColorMatrix`, so the stack costs one filter. Nested colour effects clamp between steps and a stack does not; see `then`. The table effects (`Levels`, `Curves`, `Lut`, `ShadowsHighlights`, `ThermalVision`, `ColorKey`) do not reduce to a matrix: nest them around or inside the stack.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "ColorStack"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ColorStack-32367096.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L452",
      "themed": true,
      "fields": [
        {
          "name": "matrices",
          "type": "Vec<ColorMatrix>",
          "default": "Vec::new()",
          "docs": "The colour matrices, applied in order and drawn as one filter."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ComplexHomotopy",
      "summary": "`Homotopy` on complex numbers: `homotopy((re, im), t)` gives where the point `re + i im` is at `t` (Manim's `ComplexHomotopy`), in the units of `ui.space`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ComplexHomotopy"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ComplexHomotopy-0b88b145.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/homotopy.rs#L144",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape whose points move; drawn unchanged before `delay`."
        },
        {
          "name": "homotopy",
          "type": "fn((f64, f64), f64) -> (f64, f64)",
          "default": null,
          "docs": "Maps the point `(re, im)` in units of `ui.space` and the progress `t` from 0 to 1 to its new position."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, homotopy: fn((f64, f64), f64) -> (f64, f64)) -> Self",
          "summary": "Manim's 3 seconds, smooth."
        }
      ]
    },
    {
      "name": "ComplexityPlot",
      "summary": "Growth rates racing: the curves of `growths` drawn on axes `x_length` by `y_length` (units of `ui.space`) around `center`, `n` along `n_range` and the steps along `steps`. From `delay`, `n` sweeps from the start of its range to the end in `duration` seconds and every curve grows with it, a dot at its head; a curve that leaves the top stops there. A legend beside the axes lists each rate in its colour from `palette` (one colour per `Growth`, slowest first) with its steps at the current `n`. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/complexity-plot/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/complexity-plot.md",
      "scenes": [
        "ComplexityPlot"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ComplexityPlot-cb92162d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/complexity.rs#L143",
      "themed": true,
      "fields": [
        {
          "name": "growths",
          "type": "Vec<Growth>",
          "default": null,
          "docs": "The growth rates to race, slowest first; each gets the palette colour of its position."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before `n` begins to sweep."
        },
        {
          "name": "duration",
          "type": "f32",
          "default": "4.0",
          "docs": "Seconds `n` takes to sweep from the start of `n_range` to its end."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(-1.2, 0.0)",
          "docs": "The middle of the axes, in units of `ui.space`."
        },
        {
          "name": "x_length",
          "type": "f64",
          "default": "8.0",
          "docs": "Width of the x axis, in units of `ui.space`."
        },
        {
          "name": "y_length",
          "type": "f64",
          "default": "5.0",
          "docs": "Height of the y axis, in units of `ui.space`."
        },
        {
          "name": "n_range",
          "type": "Range",
          "default": "Range::new(0.0, 20.0, 5.0)",
          "docs": "The input size `n` along the x axis: minimum, maximum and tick step."
        },
        {
          "name": "steps",
          "type": "Range",
          "default": "Range::new(0.0, 100.0, 25.0)",
          "docs": "The number of steps along the y axis: minimum, maximum and tick step; a curve that passes the maximum stops at the top."
        },
        {
          "name": "legend",
          "type": "bool",
          "default": "true",
          "docs": "Whether each rate is listed beside the axes with its steps at the current `n`."
        },
        {
          "name": "palette",
          "type": "[Color; 8]",
          "default": null,
          "docs": "One colour per curve, used in the order of `growths`."
        },
        {
          "name": "axis_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the axes and their ticks."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "label_style",
          "docs": "The font of the axis labels and the rate names in the legend."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the step counts in the legend."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the legend text."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn n_at(&self, seconds: f32) -> f64",
          "summary": "`n` at `seconds` into the race."
        }
      ]
    },
    {
      "name": "ComplexPlane",
      "summary": "A `NumberPlane` of complex numbers (Manim `ComplexPlane`): the real part along x, the imaginary part along y, whose numbers are written `i`, `2i`, `-i`. Complex numbers are `(re, im)` pairs; `ComplexValueTracker` animates one.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "ComplexPlane"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ComplexPlane-a172c884.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/complex_plane.rs#L22",
      "themed": true,
      "fields": [
        {
          "name": "plane",
          "type": "NumberPlane",
          "default": "NumberPlane::themed(theme)",
          "docs": "The plane it draws; its axes give the ranges, size and center, with the real part along x and the imaginary part along y."
        }
      ],
      "methods": [
        {
          "signature": "fn n2p_in(&self, space: Space, z: (f64, f64)) -> Point",
          "summary": "The pixel of `z` in `space`."
        },
        {
          "signature": "fn n2p(&self, ui: &Ui, z: (f64, f64)) -> (f32, f32)",
          "summary": "The pixel of the complex number `z` (Manim `number_to_point`, `n2p`)."
        },
        {
          "signature": "fn p2n_in(&self, space: Space, p: Point) -> (f64, f64)",
          "summary": "The complex number at a pixel in `space`."
        },
        {
          "signature": "fn p2n(&self, ui: &Ui, x: f32, y: f32) -> (f64, f64)",
          "summary": "The complex number at a pixel (Manim `point_to_number`, `p2n`)."
        },
        {
          "signature": "fn label(&self, ui: &Ui, z: (f64, f64), decimals: usize) -> Label",
          "summary": "`z` written as `a+bi` up and right of its point, with `decimals` decimals."
        }
      ]
    },
    {
      "name": "Contrast",
      "summary": "Its children with more or less contrast (CSS `contrast()`): `amount` 1 unchanged, 0 flat grey.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Contrast"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Contrast-62d743fb.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L310",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.4)",
          "docs": "Contrast factor about mid grey: 1 unchanged, 0 flat grey, above 1 stronger."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ConvexHull",
      "summary": "The smallest convex polygon around `points` (Manim `ConvexHull`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "ConvexHull"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ConvexHull-af2c129c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/polygram.rs#L118",
      "themed": true,
      "fields": [
        {
          "name": "points",
          "type": "Vec<(f32, f32)>",
          "default": "vec![(0.0, 0.0), (100.0, 20.0), (60.0, 90.0), (20.0, 40.0)]",
          "docs": "The points to wrap, `(x, y)` in pixels of the canvas."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "CornerMarks",
      "summary": "Crop-mark corners around the rectangle `(x, y, width, height)`: an L of `arm` pixels at each corner, like the brackets around a viewfinder. With `enter` (such as `Create`) the marks draw on; without, they are one static path.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "CornerMarks"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CornerMarks-8fad2938.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/decor/corners.rs#L16",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left edge of the rectangle in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Top edge of the rectangle in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "0.0",
          "docs": "Width of the rectangle in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "0.0",
          "docs": "Height of the rectangle in pixels."
        },
        {
          "name": "arm",
          "type": "f32",
          "default": "24.0",
          "docs": "Length of each leg of a corner mark in pixels."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the marks."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Line width of the marks in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the marks draw on (such as `Create`); `None` shows them from the start."
        }
      ],
      "methods": [
        {
          "signature": "fn d(&self) -> String",
          "summary": "The four marks as SVG path data, clockwise from the top left."
        },
        {
          "signature": "fn draw(&self) -> Svgr",
          "summary": "The static marks (`enter` is ignored), as one `<path>`; it needs no `Ui`."
        }
      ]
    },
    {
      "name": "Counter",
      "summary": "A number that counts from `from` to `to` over `run_time` seconds, starting `delay` seconds into the container: `\"0\" -> \"12,480\"`. It is right aligned by default, so the digits stay in place while the number grows.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Counter"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Counter-bfc37422.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/counter.rs#L19",
      "themed": true,
      "fields": [
        {
          "name": "from",
          "type": "f64",
          "default": "0.0",
          "docs": "The value shown before `delay`."
        },
        {
          "name": "to",
          "type": "f64",
          "default": "0.0",
          "docs": "The value reached after `run_time`."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Position of the number's anchor, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "anchor",
          "type": "TextAnchor",
          "default": "TextAnchor::End",
          "docs": "Which point of the text sits at `x`: start, middle or end."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "0",
          "docs": "Digits after the decimal point."
        },
        {
          "name": "thousands",
          "type": "bool",
          "default": "true",
          "docs": "Groups the digits by three with commas."
        },
        {
          "name": "prefix",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "Text written before the number, such as a currency sign; empty for none."
        },
        {
          "name": "suffix",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "Text written after the number, such as a unit; empty for none."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before it begins to count."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.slow * 2.0",
          "docs": "Seconds the count takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.standard",
          "docs": "Easing of the count over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn value(&self, t: f32) -> f64",
          "summary": "The value `t` seconds into the container."
        },
        {
          "signature": "fn format(&self, value: f64) -> String",
          "summary": "The text shown for `value`."
        }
      ]
    },
    {
      "name": "CounterclockwiseTransform",
      "summary": "A morph whose points travel counterclockwise on arcs of `path_arc` radians (Manim's `CounterclockwiseTransform`, a half turn).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "CounterclockwiseTransform"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CounterclockwiseTransform-9eb26cdd.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L181",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Shape",
          "default": null,
          "docs": "The shape it starts as; drawn until `delay` has passed."
        },
        {
          "name": "to",
          "type": "Shape",
          "default": null,
          "docs": "The shape it ends as."
        },
        {
          "name": "path_arc",
          "type": "f32",
          "default": null,
          "docs": "Positive turns counterclockwise."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Shape, to: Shape) -> Self",
          "summary": "From `from` to `to` on half turns in Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "Cross",
      "summary": "Two lines from corner to corner of a box, scaled by `scale_factor` about its center (Manim `Cross`): red and thick.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Cross"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Cross-2f0a7834.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/matchers.rs#L60",
      "themed": true,
      "fields": [
        {
          "name": "around",
          "type": "Rect",
          "default": "Rect::ZERO",
          "docs": "The box the lines run across, in pixels of the canvas."
        },
        {
          "name": "scale_factor",
          "type": "f32",
          "default": "1.0",
          "docs": "Scales the lines about the box's center; 1 reaches the corners."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": null,
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": null,
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": null,
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "CubicBezier",
      "summary": "A cubic Bézier curve from `start` to `end` pulled by two handles (Manim `CubicBezier`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "CubicBezier"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CubicBezier-a59b7b81.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arcs.rs#L163",
      "themed": true,
      "fields": [
        {
          "name": "start",
          "type": "(f32, f32)",
          "default": "(0.0, 0.0)",
          "docs": "Where the curve starts, `(x, y)` in pixels of the canvas."
        },
        {
          "name": "start_handle",
          "type": "(f32, f32)",
          "default": "(60.0, -100.0)",
          "docs": "Control point pulling the curve away from `start`, in pixels."
        },
        {
          "name": "end_handle",
          "type": "(f32, f32)",
          "default": "(140.0, -100.0)",
          "docs": "Control point pulling the curve toward `end`, in pixels."
        },
        {
          "name": "end",
          "type": "(f32, f32)",
          "default": "(200.0, 0.0)",
          "docs": "Where the curve ends, `(x, y)` in pixels of the canvas."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Cursor",
      "summary": "A mouse cursor with its hotspot at `(x, y)` (the tip of the arrow, the middle of the I-beam). `size` is the height in pixels of the 24 unit design, `scale` grows or shrinks it about the hotspot (a press), `shadow` adds a soft shadow below it. The kit draws its own shapes; they are not the artwork of any operating system.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs.md",
      "scenes": [
        "Cursor"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Cursor-8aa7aa32.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/assets/cursor.rs#L132",
      "themed": true,
      "fields": [
        {
          "name": "shape",
          "type": "CursorShape",
          "default": "CursorShape::Arrow",
          "docs": "Which cursor is drawn: arrow, pointer, I-beam, grab, grabbing or crosshair."
        },
        {
          "name": "style",
          "type": "CursorStyle",
          "default": "CursorStyle::Dark",
          "docs": "Colours of the cursor: `Dark` (black with a white outline) or `Light` (white with a black outline)."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "960.0",
          "docs": "Horizontal position of the hotspot in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "540.0",
          "docs": "Vertical position of the hotspot in pixels of the canvas, down."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "40.0",
          "docs": "Height in pixels of the 24 unit design."
        },
        {
          "name": "scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Grows or shrinks the cursor about its hotspot; 1 is normal, below 1 is a press, 0 or less draws nothing."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "shadow",
          "type": "bool",
          "default": "true",
          "docs": "Adds a soft shadow below the cursor."
        }
      ],
      "methods": [
        {
          "signature": "fn draw(&self) -> Svgr",
          "summary": "The cursor without a `Ui`; nothing when it is invisible."
        }
      ]
    },
    {
      "name": "CursorPath",
      "summary": "A cursor that moves through timed points, in the order of their times. It leaves a point `travel` seconds before the next one is due (or at once when they are closer) and arrives on time, with `motion`. A point with `click` presses the cursor and sends out a ring when it arrives; `sfx::on_clicks` gives the sounds. The cursor fades in over `fade` seconds from the first point's time.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs.md",
      "scenes": [
        "CursorPath"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CursorPath-cd86d439.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/assets/cursor.rs#L383",
      "themed": true,
      "fields": [
        {
          "name": "points",
          "type": "Vec<CursorPoint>",
          "default": "Vec::new()",
          "docs": "The timed points the cursor passes through, in the order of their times; empty draws nothing."
        },
        {
          "name": "shape",
          "type": "CursorShape",
          "default": "CursorShape::Arrow",
          "docs": "Which cursor is drawn: arrow, pointer, I-beam, grab, grabbing or crosshair."
        },
        {
          "name": "style",
          "type": "CursorStyle",
          "default": "CursorStyle::Dark",
          "docs": "Colours of the cursor: `Dark` (black with a white outline) or `Light` (white with a black outline)."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "40.0",
          "docs": "Height in pixels of the 24 unit design."
        },
        {
          "name": "travel",
          "type": "f32",
          "default": "0.6",
          "docs": "Seconds a move takes, ending when the next point is due (shorter when the points are closer in time)."
        },
        {
          "name": "motion",
          "type": "CursorMotion",
          "default": "CursorMotion::default()",
          "docs": "How the cursor travels to the next point: a smooth ease or a spring, both arriving on time."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds the cursor takes to fade in from the first point's time."
        },
        {
          "name": "click",
          "type": "ClickLook",
          "default": "ClickLook::themed(theme)",
          "docs": "How a click looks: the press depth and duration and the ring that goes out."
        }
      ],
      "methods": [
        {
          "signature": "fn position(&self, t: f32) -> (f32, f32)",
          "summary": "Where the hotspot is at `t` seconds: the first point before it, the last after."
        },
        {
          "signature": "fn clicks(&self) -> impl Iterator<Item = f32>",
          "summary": "The times of the clicks, in seconds."
        }
      ]
    },
    {
      "name": "CurvedArrow",
      "summary": "An arrow along a circular arc that turns by `angle` from `(x1, y1)` to `(x2, y2)`, counterclockwise on screen for a positive angle (Manim `CurvedArrow`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "CurvedArrow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CurvedArrow-56d4547d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arrows.rs#L318",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "std::f32::consts::FRAC_PI_2",
          "docs": "Turn in radians of the arc from the start to the end, counterclockwise on screen for a positive value."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length in pixels of each tip from its point back along the shaft; shortened to fit a short arrow."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width in pixels of each tip across the shaft."
        },
        {
          "name": "tip_start",
          "type": "Option<ArrowTip>",
          "default": "None",
          "docs": "The tip at the start; `None` for none."
        },
        {
          "name": "tip_end",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the end; `None` for none."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::arrow(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "CurvedDoubleArrow",
      "summary": "An arrow along an arc with a tip at both ends (Manim `CurvedDoubleArrow`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "CurvedDoubleArrow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CurvedDoubleArrow-bba7b438.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arcs.rs#L79",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "std::f32::consts::FRAC_PI_2",
          "docs": "Turn in radians of the arc from the start to the end, counterclockwise on screen for a positive value."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length in pixels of each tip from its point back along the shaft; shortened to fit a short arrow."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width in pixels of each tip across the shaft."
        },
        {
          "name": "tip_start",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the start; `None` for none."
        },
        {
          "name": "tip_end",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the end; `None` for none."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::arrow(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Curves",
      "summary": "Tone curves: a smooth curve through `points` (input, output, both 0 to 1, sorted by input) on every colour channel, then the optional per-channel curves `red`, `green` and `blue`. The default is a gentle S curve that adds contrast.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Curves"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Curves-945747a5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L512",
      "themed": true,
      "fields": [
        {
          "name": "points",
          "type": "&[(f32, f32)]",
          "default": "&[(0.0, 0.0), (0.25, 0.2), (0.75, 0.82), (1.0, 1.0)]",
          "docs": "`(input, output)` pairs of the curve on every channel, both 0 to 1 and sorted by input; the default is a gentle S curve."
        },
        {
          "name": "red",
          "type": "Option<&[(f32, f32)]>",
          "default": null,
          "docs": "An extra curve applied to the red channel after `points`; `None` for none."
        },
        {
          "name": "green",
          "type": "Option<&[(f32, f32)]>",
          "default": null,
          "docs": "An extra curve applied to the green channel after `points`; `None` for none."
        },
        {
          "name": "blue",
          "type": "Option<&[(f32, f32)]>",
          "default": null,
          "docs": "An extra curve applied to the blue channel after `points`; `None` for none."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "CurvesAsSubmobjects",
      "summary": "A path split into its curves (Manim `CurvesAsSubmobjects`), each drawn on its own so `Write` draws them one after another. The stroke runs from the first to the last of `colors` along the curves, like Manim's `set_color_by_gradient`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "CurvesAsSubmobjects"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CurvesAsSubmobjects-1fc0857d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/dashed.rs#L106",
      "themed": true,
      "fields": [
        {
          "name": "path",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The path to split into its curves, in pixels of the canvas."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "vec![theme.colors.accent]",
          "docs": "The gradient along the curves; one colour paints them all."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shapes(&self) -> Vec<Shape>",
          "summary": "One shape per curve, in path order."
        }
      ]
    },
    {
      "name": "Cutout",
      "summary": "A filled shape with holes (Manim `Cutout`): `outer` with every path of `holes` cut out. The holes are turned against the outline, so they stay empty however they were drawn.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Cutout"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Cutout-cd5ec160.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/polygram.rs#L130",
      "themed": true,
      "fields": [
        {
          "name": "outer",
          "type": "BezPath",
          "default": "kurbo::Rect::new(-100.0, -100.0, 100.0, 100.0).to_path(TOLERANCE)",
          "docs": "The outline of the filled shape, in pixels of the canvas."
        },
        {
          "name": "holes",
          "type": "Vec<BezPath>",
          "default": "Vec::new()",
          "docs": "Paths cut out of `outer`; they stay empty however they were drawn."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "CyclicReplace",
      "summary": "Every shape moves on an arc to where the next one is, the last to the first (Manim's `CyclicReplace`, arcs of a quarter turn). The shapes keep their own paths.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "CyclicReplace"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/CyclicReplace-406b374b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L221",
      "themed": false,
      "fields": [
        {
          "name": "shapes",
          "type": "Vec<Shape>",
          "default": null,
          "docs": "The shapes; each moves to where the next one is, the last to the first."
        },
        {
          "name": "path_arc",
          "type": "f32",
          "default": null,
          "docs": "Radians of the arc each shape travels on; positive turns counterclockwise, 0 is a straight line."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shapes: Vec<Shape>) -> Self",
          "summary": "Manim's quarter turns in 1 second, smooth."
        },
        {
          "signature": "fn offset(&self, i: usize, p: f32) -> Vec2",
          "summary": "How far shape `i` has moved at progress `p`."
        }
      ]
    },
    {
      "name": "DashedLine",
      "summary": "A dashed straight line (Manim `DashedLine`); `dash` is the dash and gap length.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "DashedLine"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DashedLine-ce52d03d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L238",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "Some((12.0, 12.0))",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "DashedVMobject",
      "summary": "Dashes along any path, spaced by arc length (Manim `DashedVMobject`). See `dash_path`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "DashedVMobject"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DashedVMobject-4e8a5db2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/dashed.rs#L75",
      "themed": true,
      "fields": [
        {
          "name": "path",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The path to dash, in pixels of the canvas."
        },
        {
          "name": "num_dashes",
          "type": "usize",
          "default": "15",
          "docs": "Number of dashes along the path."
        },
        {
          "name": "dashed_ratio",
          "type": "f32",
          "default": "0.5",
          "docs": "Share of the path's length (0 to 1) that is dashes; the rest is gaps."
        },
        {
          "name": "dash_offset",
          "type": "f32",
          "default": "0.0",
          "docs": "Moves the pattern along the path, in dash-plus-gap lengths (0 to 1 wraps around)."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "DecimalMatrix",
      "summary": "A `Matrix` of numbers written with `num_decimal_places` places (Manim `DecimalMatrix`, one place by default). `matrix` gives the place and look; its `entries` are replaced.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "DecimalMatrix"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DecimalMatrix-8b980430.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/typed_matrix.rs#L92",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<Vec<f64>>",
          "default": "Vec::new()",
          "docs": "The numbers row by row; they replace the entries of `matrix`."
        },
        {
          "name": "num_decimal_places",
          "type": "usize",
          "default": "1",
          "docs": "Digits after the decimal point of each number."
        },
        {
          "name": "include_sign",
          "type": "bool",
          "default": "false",
          "docs": "Writes a `+` before positive numbers."
        },
        {
          "name": "matrix",
          "type": "Matrix",
          "default": "Matrix::themed(theme)",
          "docs": "The matrix that gives the place, gaps, font, brackets and animations; its `entries` are replaced by `values`."
        }
      ],
      "methods": [
        {
          "signature": "fn to_matrix(&self) -> Matrix",
          "summary": "The `Matrix` it draws, with the numbers written."
        }
      ]
    },
    {
      "name": "DecimalNumber",
      "summary": "Manim's `DecimalNumber`: a number that follows a `ValueTracker`, drawn so its digits do not jitter while it changes. Every digit gets a slot as wide as the widest digit of the font, so a number keeps its width while its digit count stays the same, and with `anchor: End` the digits stay in place across a carry (`9.99 -> 10.00`). The value is an `f32`, exact to about seven significant digits.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "DecimalNumber"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DecimalNumber-6b83f8b7.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/decimal.rs#L50",
      "themed": true,
      "fields": [
        {
          "name": "value",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "The `ValueTracker` whose value is written; it is read at every frame."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Position of the number's anchor, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "anchor",
          "type": "TextAnchor",
          "default": "TextAnchor::Start",
          "docs": "Which point of the number (with its unit) sits at `x`: start, middle or end."
        },
        {
          "name": "num_decimal_places",
          "type": "usize",
          "default": "2",
          "docs": "Digits after the decimal point."
        },
        {
          "name": "include_sign",
          "type": "bool",
          "default": "false",
          "docs": "A `+` before positive numbers."
        },
        {
          "name": "group_with_commas",
          "type": "bool",
          "default": "true",
          "docs": "`true` groups the digits by three with commas."
        },
        {
          "name": "unit",
          "type": "&str",
          "default": "\"\"",
          "docs": "Text written after the number, such as `\" kg\"`; empty for none."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": [
        {
          "signature": "fn format(&self, value: f64) -> String",
          "summary": "The text shown for `value`, with the unit."
        }
      ]
    },
    {
      "name": "DecimalTable",
      "summary": "A `Table` of numbers written with `num_decimal_places` places (Manim `DecimalTable`, one place by default). `table` gives the labels, place and look; its `rows` are replaced.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "DecimalTable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DecimalTable-730fcf6a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/typed_table.rs#L23",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<Vec<f64>>",
          "default": "Vec::new()",
          "docs": "The numbers row by row; they replace the `rows` of `table`."
        },
        {
          "name": "num_decimal_places",
          "type": "usize",
          "default": "1",
          "docs": "Digits after the decimal point of each number."
        },
        {
          "name": "include_sign",
          "type": "bool",
          "default": "false",
          "docs": "Writes a `+` before positive numbers."
        },
        {
          "name": "table",
          "type": "Table",
          "default": "Table::themed(theme)",
          "docs": "The table that gives the labels, place, font, lines and animations; its `rows` are replaced by `values`."
        }
      ],
      "methods": [
        {
          "signature": "fn to_table(&self) -> Table",
          "summary": "The `Table` it draws, with the numbers written."
        }
      ]
    },
    {
      "name": "DecisionSurface",
      "summary": "The partition of a 2D feature space by a decision tree (`ManimML`'s `DecisionTreeSurface`): every leaf's region of the box of `axes` filled in its class's colour at `opacity`, and the cuts of the splits drawn in `line_color`. `x_feature` and `y_feature` are the features along the axes; the tree should split on these two only. With the `reveal` of a `DecisionTreeDiagram` a cut appears with its split and a region with its leaf. Draw the `Axes` after it to keep their lines on top.",
      "feature": "ml",
      "page": "https://fframes-kit.pages.dev/docs/machine-learning/decision-trees/",
      "markdown": "https://fframes-kit.pages.dev/docs/machine-learning/decision-trees.md",
      "scenes": [
        "DecisionSurface"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DecisionSurface-590a3164.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/ml/decision_tree.rs#L511",
      "themed": true,
      "fields": [
        {
          "name": "tree",
          "type": "DecisionTree",
          "default": "DecisionTree::default()",
          "docs": "The splits and leaves whose partition is drawn."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The axes of the feature space to fill, mapping feature values to the canvas."
        },
        {
          "name": "x_feature",
          "type": "usize",
          "default": "0",
          "docs": "Index of the feature along the x-axis."
        },
        {
          "name": "y_feature",
          "type": "usize",
          "default": "1",
          "docs": "Index of the feature along the y-axis."
        },
        {
          "name": "reveal",
          "type": "Option<TreeReveal>",
          "default": "None",
          "docs": "A cut appears with its split and a region with its leaf; `None` shows everything."
        },
        {
          "name": "class_colors",
          "type": "Vec<Color>",
          "default": "class_colors(theme)",
          "docs": "Colour of each class, by class index, for the regions; a class past the end uses `line_color`."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "0.35",
          "docs": "0 transparent to 1 opaque, of the filled regions."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the cuts drawn for the splits."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "2.5",
          "docs": "Width in pixels of the cut lines."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "DecisionTreeDiagram",
      "summary": "A decision tree as `ManimML` draws it (`DecisionTreeDiagram`): each split a box with its test (`feature ≤ threshold`), each leaf a box with its class in that class's colour from `class_colors`, the root at the top, `level` pixels between levels and `gap` pixels between neighbouring leaves. The edge to the left child, the samples that pass the test, is labelled yes. The boxes are as wide as the longest text and at least `node_width`. With `reveal` the tree grows a level or a node at a time.",
      "feature": "ml",
      "page": "https://fframes-kit.pages.dev/docs/machine-learning/decision-trees/",
      "markdown": "https://fframes-kit.pages.dev/docs/machine-learning/decision-trees.md",
      "scenes": [
        "DecisionTreeDiagram"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DecisionTreeDiagram-d2be208e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/ml/decision_tree.rs#L299",
      "themed": true,
      "fields": [
        {
          "name": "tree",
          "type": "DecisionTree",
          "default": "DecisionTree::default()",
          "docs": "The splits and leaves to draw, with the feature and class names."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the tree, in units of `ui.space`."
        },
        {
          "name": "node_width",
          "type": "f32",
          "default": "190.0",
          "docs": "Minimum width in pixels of a node box; boxes grow to fit the longest text."
        },
        {
          "name": "node_height",
          "type": "f32",
          "default": "54.0",
          "docs": "Height in pixels of a node box."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "24.0",
          "docs": "Pixels between neighbouring node boxes."
        },
        {
          "name": "level",
          "type": "f32",
          "default": "110.0",
          "docs": "Pixels between one level of the tree and the next."
        },
        {
          "name": "reveal",
          "type": "Option<TreeReveal>",
          "default": "None",
          "docs": "Grows the tree a level or a node at a time; `None` shows it whole."
        },
        {
          "name": "class_colors",
          "type": "Vec<Color>",
          "default": "class_colors(theme)",
          "docs": "Colour of each class, by class index, for the leaf boxes; a class past the end uses `node_color`."
        },
        {
          "name": "node_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the split boxes' outline and of all node text."
        },
        {
          "name": "node_fill",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Fill colour of the node boxes (leaves mix in their class colour)."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the edges and their yes/no labels."
        },
        {
          "name": "text_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the node text and edge labels: family, size in pixels and weight."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "2.5",
          "docs": "Width in pixels of the node outlines and edges."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn layout_at(&self, middle: Point) -> Vec<Option<Rect>>",
          "summary": "The box of every node with the middle of the tree at `middle`, `node_width` pixels wide; `None` for the nodes not reached from the root."
        },
        {
          "signature": "fn layout(&self, ui: &Ui) -> Vec<Option<Rect>>",
          "summary": "The box of every node, in pixels, all as wide as the longest text needs and at least `node_width`."
        }
      ]
    },
    {
      "name": "Difference",
      "summary": "The area of `subject` outside `clip` (Manim `Difference`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Difference"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Difference-7250ffc9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/boolean.rs#L124",
      "themed": true,
      "fields": [
        {
          "name": "subject",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The path to cut from, in pixels of the canvas."
        },
        {
          "name": "clip",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The path cut out of `subject`."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "DiGraph",
      "summary": "A `Graph` whose edges point from their first vertex to their second (Manim `DiGraph`): each edge ends in a tip at the edge of its target, and the two edges of a pair that point both ways bend apart.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "DiGraph"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DiGraph-f5db138d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/graph_mobject.rs#L339",
      "themed": true,
      "fields": [
        {
          "name": "graph",
          "type": "Graph",
          "default": "Graph::themed(theme)",
          "docs": "The graph it draws; its edges point from their first vertex to their second."
        }
      ],
      "methods": [
        {
          "signature": "fn new(ui: &Ui, vertices: &[&str], edges: &[(usize, usize)]) -> Self",
          "summary": "A directed graph of these vertices and edges with the theme's look."
        }
      ]
    },
    {
      "name": "DnaHelix",
      "summary": "A DNA double helix seen from the side, the first base of `sequence` at the left, centred on `center` (units of `ui.space`). Each turn is `pitch` pixels long and ten base pairs; the strands are `radius` pixels from the axis and twist `spin` turns a second. The back of each strand is dimmer than its front.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/dna-helix/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/dna-helix.md",
      "scenes": [
        "DnaHelix"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DnaHelix-a976eae1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/dna.rs#L87",
      "themed": true,
      "fields": [
        {
          "name": "sequence",
          "type": "String",
          "default": "\"ATGCGTACCTGAATCGGATCCATGCAGTTA\".into()",
          "docs": "Bases read from the left, one pair per letter (`A`, `T`, `G`, `C`); the partner base is the complement."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the scan and unzip timings begin."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the helix, in units of `ui.space`."
        },
        {
          "name": "pitch",
          "type": "f32",
          "default": "340.0",
          "docs": "Pixels along the axis for one full turn (ten base pairs)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "80.0",
          "docs": "Pixels from the axis to each strand."
        },
        {
          "name": "spin",
          "type": "f32",
          "default": "0.12",
          "docs": "Twist of the helix, in turns per second."
        },
        {
          "name": "scan",
          "type": "bool",
          "default": "true",
          "docs": "A reading light passes along the pairs and writes the lit pair's letters when `true`."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.18",
          "docs": "Seconds the reading light spends on each pair."
        },
        {
          "name": "unzip_at",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Seconds after `delay` when the strands start to come apart; `None` keeps the helix closed."
        },
        {
          "name": "unzip_time",
          "type": "f32",
          "default": "3.0",
          "docs": "Seconds the unzipping takes to travel from the left to the right end."
        },
        {
          "name": "replicate",
          "type": "bool",
          "default": "true",
          "docs": "A new partner strand grows along each separated strand behind the fork when `true`."
        },
        {
          "name": "bases",
          "type": "BaseColors",
          "default": "BaseColors::default()",
          "docs": "Colour of each base letter's rung half."
        },
        {
          "name": "strand_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the two backbones."
        },
        {
          "name": "new_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the newly built strands while replicating."
        },
        {
          "name": "lit_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour the pair under the reading light is mixed toward."
        },
        {
          "name": "letter_style",
          "type": "TextStyle",
          "default": "letter_style",
          "docs": "The font of the lit pair's letters: family, size in pixels and weight."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "DnaHelix3D",
      "summary": "A DNA double helix in 3D, its axis across the image: `sequence` read from the left, each pair a rung of its two bases in `bases` colours between the two backbones in `strand_color`. It is rendered into a `width` x `height` pixel image around `center` (units of `ui.space`), seen from `elevation` degrees above, and turns `spin` degrees a second about its own axis. From `delay` the pairs build up from the left, one every `pair_time` seconds. The image fades with `enter` and `exit`.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/dna-helix-3d/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/dna-helix-3d.md",
      "scenes": [
        "DnaHelix3D"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DnaHelix3D-9704d4c8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/dna_3d.rs#L62",
      "themed": true,
      "fields": [
        {
          "name": "sequence",
          "type": "String",
          "default": "\"ATGCGTACCTGAATCGGATCCATG\".into()",
          "docs": "Bases read from the left, one pair per letter (`A`, `T`, `G`, `C`); the partner base is the complement."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first pair appears."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the image, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1500.0",
          "docs": "Width of the rendered image in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "560.0",
          "docs": "Height of the rendered image in pixels."
        },
        {
          "name": "spin",
          "type": "f32",
          "default": "40.0",
          "docs": "Rotation about the helix axis, in degrees per second."
        },
        {
          "name": "elevation",
          "type": "f32",
          "default": "12.0",
          "docs": "Angle of the camera above the helix, in degrees."
        },
        {
          "name": "pair_time",
          "type": "f32",
          "default": "0.12",
          "docs": "Seconds between one pair appearing and the next."
        },
        {
          "name": "bases",
          "type": "BaseColors",
          "default": "BaseColors::default()",
          "docs": "Colour of each base letter's rung half."
        },
        {
          "name": "strand_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the two sugar-phosphate backbones."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Doppler",
      "summary": "A source moving right from `start` (units of `ui.space`, `scale` units per meter) at `source_speed` m/s, sending out a wavefront every `period` seconds that spreads at `wave_speed` m/s. The fronts bunch up ahead of the source and spread out behind it; at or above the wave speed they pile into a cone. A front fades as it grows and is gone at `max_radius` meters. Listeners `ahead` and `behind` (meters from `start`) are marked, and with `labels` each shows the frequency it hears once the first front has reached it, with the source's own frequency above the source. The listeners draw with `enter`, the source and the fronts with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/doppler/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/doppler.md",
      "scenes": [
        "Doppler"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Doppler-064a0c78.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/doppler.rs#L28",
      "themed": true,
      "fields": [
        {
          "name": "start",
          "type": "(f64, f64)",
          "default": "(-4.0, 0.0)",
          "docs": "Where the source starts, in units of `ui.space`; meters below are measured from it."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "source_speed",
          "type": "f64",
          "default": "1.0",
          "docs": "Speed of the source to the right in m/s; at or above `wave_speed` the fronts pile into a cone."
        },
        {
          "name": "wave_speed",
          "type": "f64",
          "default": "3.0",
          "docs": "Speed the wavefronts spread at in m/s."
        },
        {
          "name": "period",
          "type": "f64",
          "default": "0.4",
          "docs": "Seconds between two wavefronts; the source's own frequency is its inverse."
        },
        {
          "name": "max_radius",
          "type": "f64",
          "default": "6.0",
          "docs": "Radius in meters where a front is gone; it fades out on the way."
        },
        {
          "name": "ahead",
          "type": "Option<f64>",
          "default": "Some(10.0)",
          "docs": "Listener in meters from `start`, to the right of the source; `None` for none."
        },
        {
          "name": "behind",
          "type": "Option<f64>",
          "default": "Some(-2.5)",
          "docs": "Listener in meters from `start`, to the left of the source; `None` for none."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the source's frequency above it and the frequency each listener hears once the first front reaches it."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the source starts moving."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "source_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the source and its frequency label."
        },
        {
          "name": "wave_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the wavefronts."
        },
        {
          "name": "listener_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the listener marks."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the wavefronts in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the listener marks draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the listener marks leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the source and the fronts fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the source and the fronts fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn source(&self, t: f64) -> f64",
          "summary": "Meters from `start`, the source after `t` seconds."
        },
        {
          "signature": "fn heard(&self, x: f64, t: f64) -> Option<f64>",
          "summary": "The frequency in Hz a listener at `x` meters from `start` hears while the source is where it is after `t` seconds: `f c / (c - v)` ahead of it, `f c / (c + v)` behind. `None` ahead of a source at or above the wave speed, where no front has come."
        },
        {
          "signature": "fn fronts(&self, t: f64) -> Vec<(f64, f64)>",
          "summary": "The emission time and the radius in meters of every front alive after `t` seconds, oldest first."
        }
      ]
    },
    {
      "name": "Dot",
      "summary": "A small filled circle that marks a point (Manim `Dot`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Dot"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Dot-459dd9da.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L101",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "8.0",
          "docs": "Radius in pixels."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "DotGrid",
      "summary": "Its children seen through a grid of round holes (Remotion's `dotGrid()`): dots `dot_size` units across, `grid_size` units apart, the first centred half a cell from the origin. With `invert` the dots are cut out of the children instead.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "DotGrid"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DotGrid-a4e212bf.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L244",
      "themed": true,
      "fields": [
        {
          "name": "dot_size",
          "type": "f32",
          "default": "16.0",
          "docs": "Diameter of each dot in the children's user units."
        },
        {
          "name": "grid_size",
          "type": "f32",
          "default": "20.0",
          "docs": "Distance between dot centers in user units; the first dot is half a cell from the origin."
        },
        {
          "name": "invert",
          "type": "bool",
          "default": "false",
          "docs": "`false` shows the children only through the dots; `true` cuts the dots out of them."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the grid covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask id when two grids share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content seen through the dots (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "DoubleArrow",
      "summary": "An arrow with a tip at both ends (Manim `DoubleArrow`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "DoubleArrow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DoubleArrow-a42e75d0.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arrows.rs#L242",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length in pixels of each tip from its point back along the shaft; shortened to fit a short arrow."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width in pixels of each tip across the shaft."
        },
        {
          "name": "tip_start",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the start; `None` for none."
        },
        {
          "name": "tip_end",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the end; `None` for none."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::arrow(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Drag",
      "summary": "The grabbing hand picks up its children at `from` at `start` seconds and carries them to `to` in `run_time` seconds. The open hand closes over `swap` seconds before the move and opens again after it; the children move with the cursor. The cursor fades in over `fade` seconds from the start of the container.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs.md",
      "scenes": [
        "Drag"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Drag-f82d950f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/assets/cursor.rs#L555",
      "themed": true,
      "fields": [
        {
          "name": "from",
          "type": "(f32, f32)",
          "default": "(760.0, 540.0)",
          "docs": "Where the cursor picks the children up, in pixels of the canvas; the children keep their own place there."
        },
        {
          "name": "to",
          "type": "(f32, f32)",
          "default": "(1160.0, 540.0)",
          "docs": "Where the cursor drops the children, in pixels of the canvas."
        },
        {
          "name": "start",
          "type": "f32",
          "default": "0.6",
          "docs": "Second the carry starts, local to the parent container; the hand closes just before."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "0.9",
          "docs": "Seconds the carry takes."
        },
        {
          "name": "motion",
          "type": "CursorMotion",
          "default": "CursorMotion::default()",
          "docs": "How the cursor travels from `from` to `to`: a smooth ease or a spring, arriving on time."
        },
        {
          "name": "style",
          "type": "CursorStyle",
          "default": "CursorStyle::Dark",
          "docs": "Colours of the cursor: `Dark` (black with a white outline) or `Light` (white with a black outline)."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "40.0",
          "docs": "Height in pixels of the 24 unit design."
        },
        {
          "name": "swap",
          "type": "f32",
          "default": "0.12",
          "docs": "Seconds the hand takes to close before the move and to open after it."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds the cursor takes to fade in from the start of its container."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "Box::new(|_| Svgr::empty())",
          "docs": "What is carried, drawn at its own place and moved by the cursor's offset (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn position(&self, t: f32) -> (f32, f32)",
          "summary": "Where the cursor, and the offset of the children from where they were, is at `t`."
        },
        {
          "signature": "fn grip(&self, t: f32) -> f32",
          "summary": "How closed the hand is at `t`, from 0 (open) to 1."
        }
      ]
    },
    {
      "name": "DrawOn",
      "summary": "Any `Shape` drawn on from the start of its path, the stroke reveal of an underline, a tick or a hand-drawn arrow. It is `Create` on a shape you built: give the shape a `stroke` (and no `fill` for a line).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "DrawOn"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DrawOn-59a70651.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/decor/draw_on.rs#L15",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape to draw; give it a `stroke` (and no `fill` for a line)."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the drawing takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the drawing over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(ui: &Ui, shape: Shape) -> Self",
          "summary": "`shape` with the theme's `Create` timing."
        }
      ]
    },
    {
      "name": "DropShadow",
      "summary": "The theme's `shadow.card` as a filter definition: the drop shadow under a card. Draw it once, then use `filter={shadow.url()}` on the card.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "DropShadow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/DropShadow-7efaa726.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/decor/filters.rs#L76",
      "themed": true,
      "fields": [
        {
          "name": "id",
          "type": "Cow<str>",
          "default": null,
          "docs": "The filter's id, unique in the frame."
        },
        {
          "name": "shadow",
          "type": "Shadow",
          "default": null,
          "docs": "The shadow the filter draws: colour (its alpha is the opacity), offset and blur."
        }
      ],
      "methods": [
        {
          "signature": "fn url(&self) -> String",
          "summary": "`url(#id)`, the value of a `filter` attribute."
        }
      ]
    },
    {
      "name": "Duotone",
      "summary": "Its children in two colours: dark tones turn `dark` and light tones `light`, mixed with the original by `amount`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Duotone"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Duotone-7cc3ae47.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L374",
      "themed": true,
      "fields": [
        {
          "name": "dark",
          "type": "Color",
          "default": "theme.colors.background",
          "docs": "Colour the dark tones turn."
        },
        {
          "name": "light",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour the light tones turn."
        },
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 the original to 1 fully two-coloured."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Editable",
      "summary": "A component with an editor key, see the module docs.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/advanced/editable-props-fframes-studio/",
      "markdown": "https://fframes-kit.pages.dev/docs/advanced/editable-props-fframes-studio.md",
      "scenes": [
        "Editable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Editable-32d05407.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/props.rs#L44",
      "themed": false,
      "fields": [
        {
          "name": "key",
          "type": "Cow<str>",
          "default": null,
          "docs": "The key the editor stores this component's values under."
        },
        {
          "name": "component",
          "type": "C",
          "default": null,
          "docs": "The component whose props the key makes editable."
        }
      ],
      "methods": [
        {
          "signature": "fn new(key: impl Into<Cow<str>>, component: C) -> Self",
          "summary": ""
        }
      ]
    },
    {
      "name": "Elbow",
      "summary": "Two lines that meet at a right angle, an L of `width` with its corner up and to the right of `(x, y)`, turned by `angle` about it (Manim `Elbow`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Elbow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Elbow-3000ce48.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/angles.rs#L267",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "X in pixels of the point the elbow is drawn from; its corner lies `width` up and to the right of it."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Y in pixels of the point the elbow is drawn from."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "27.0",
          "docs": "Length in pixels of each of the two lines."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Rotation in radians about `(x, y)`, counterclockwise on screen."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "ElectricField",
      "summary": "Manim-physics' `ElectricField`: an arrow at every grid point of `x_range` by `y_range` (units of `ui.space`) along the field of `charges`, `length(|E|)` units long and coloured by `|E|` from `colors[0]` at `min_magnitude` to the last colour at `max_magnitude`, like `ArrowVectorField`. Grid points closer than `clearance` units to a charge get no arrow. With `lines_per_charge` above 0 the field lines of `Field` are drawn too, and with `show_charges` every charge as a `ChargeGlow`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/electric-field-and-magnetic-field/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/electric-field-and-magnetic-field.md",
      "scenes": [
        "ElectricField"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ElectricField-6a1a8339.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/electro.rs#L168",
      "themed": true,
      "fields": [
        {
          "name": "charges",
          "type": "Vec<Charge>",
          "default": "Vec::new()",
          "docs": "The charges that make the field; each has a position in units of `ui.space` and a signed strength."
        },
        {
          "name": "x_range",
          "type": "Range",
          "default": "Range::new(-7.0, 7.0, 0.5)",
          "docs": "Grid columns of the arrows: `x` from min to max in steps, in units of `ui.space`; the field lines run half a unit beyond."
        },
        {
          "name": "y_range",
          "type": "Range",
          "default": "Range::new(-4.0, 4.0, 0.5)",
          "docs": "Grid rows of the arrows: `y` from min to max in steps, in units of `ui.space`; the field lines run half a unit beyond."
        },
        {
          "name": "arrows",
          "type": "bool",
          "default": "true",
          "docs": "Draws the arrow at every grid point."
        },
        {
          "name": "length",
          "type": "fn(f64) -> f64",
          "default": "sigmoid_length",
          "docs": "Length in units of `ui.space` of an arrow for a field of magnitude `|E|`."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "vec![theme.colors.muted, theme.colors.accent, theme.colors.highlight]",
          "docs": "Colour ramp of the arrows: the first colour at `min_magnitude`, the last at `max_magnitude`."
        },
        {
          "name": "min_magnitude",
          "type": "f64",
          "default": "0.0",
          "docs": "Field magnitude that gets the first colour of `colors`."
        },
        {
          "name": "max_magnitude",
          "type": "f64",
          "default": "2.0",
          "docs": "Field magnitude that gets the last colour of `colors`."
        },
        {
          "name": "clearance",
          "type": "f64",
          "default": "0.3",
          "docs": "Grid points closer than this to a charge, in units of `ui.space`, get no arrow."
        },
        {
          "name": "lines_per_charge",
          "type": "usize",
          "default": "0",
          "docs": "Field lines traced out of each charge; 0 draws none."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the field lines."
        },
        {
          "name": "show_charges",
          "type": "bool",
          "default": "true",
          "docs": "Draws every charge as a `ChargeGlow`."
        },
        {
          "name": "glow",
          "type": "bool",
          "default": "true",
          "docs": "Gives the charges a soft glow."
        },
        {
          "name": "charge_radius",
          "type": "f32",
          "default": "26.0",
          "docs": "Charge disc radius in pixels for a charge of 1."
        },
        {
          "name": "positive_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of positive charges."
        },
        {
          "name": "negative_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of negative charges."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the arrows and the field lines in pixels."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn at(&self, x: f64, y: f64) -> (f64, f64)",
          "summary": "The field at `(x, y)`: the sum of `q r̂ / r²` over `charges`."
        }
      ]
    },
    {
      "name": "ElementCard",
      "summary": "One element as a card `size` pixels high centred at `center` (units of `ui.space`): its atomic number, symbol, name, atomic mass, electron configuration and Pauling electronegativity, arranged by `layout` and tinted with the colour of its `Category` (or `color` without `category_colors`). manim-chemistry's `MElementObject`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/element-card/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/element-card.md",
      "scenes": [
        "ElementCard"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ElementCard-b571936e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/element_card.rs#L109",
      "themed": true,
      "fields": [
        {
          "name": "element",
          "type": "u32",
          "default": "6",
          "docs": "Atomic number of the element shown."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the card, in units of `ui.space`."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "320.0",
          "docs": "Height of the card in pixels; the `Square` layout is as wide, `Wide` is 2.2 times as wide, and the text scales with it."
        },
        {
          "name": "layout",
          "type": "CardLayout",
          "default": "CardLayout::Square",
          "docs": "How the facts are arranged: `Square` (stacked) or `Wide` (tile with a list beside it)."
        },
        {
          "name": "category_colors",
          "type": "bool",
          "default": "true",
          "docs": "Tints the card with the colour of the element's category; `false` uses `color`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Tint of the card's background and border when `category_colors` is `false`."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the name, mass, configuration and number."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "ElementTile",
      "summary": "One element as a tile `size` pixels wide centred at `center` (units of `ui.space`): its atomic number, symbol, name and atomic weight, tinted with the colour of its `Category` (or `color` without `category_colors`).",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/element-tile-and-periodic-table/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/element-tile-and-periodic-table.md",
      "scenes": [
        "ElementTile"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ElementTile-655f483a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/periodic.rs#L165",
      "themed": true,
      "fields": [
        {
          "name": "element",
          "type": "u32",
          "default": "6",
          "docs": "Atomic number of the element shown."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the tile, in units of `ui.space`."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "220.0",
          "docs": "Width and height of the tile in pixels; the text scales with it."
        },
        {
          "name": "details",
          "type": "bool",
          "default": "true",
          "docs": "Writes the name and atomic weight under the symbol; `false` for the number and symbol only."
        },
        {
          "name": "category_colors",
          "type": "bool",
          "default": "true",
          "docs": "Tints the tile with the colour of the element's category; `false` uses `color`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Tint of the tile's background and border when `category_colors` is `false`."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the number, name and weight."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Ellipse",
      "summary": "An ellipse in a `width` by `height` box (Manim `Ellipse`, Remotion `Ellipse`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Ellipse"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Ellipse-54da7e4b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L117",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "200.0",
          "docs": "Full width in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "100.0",
          "docs": "Full height in pixels."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Emboss",
      "summary": "A raised relief of repeated dashes pressed into its children (Remotion's `emboss()`): cells `size` units square, each holding a dash `line_width` wide, lit from `light_angle` (degrees counter-clockwise from the right, 135 the top left) so one side of each dash catches the light and the other falls into shadow. `depth` (0 to 1) is the height of the relief, `amount` (0 to 1) its strength, `angle` turns the pattern and `offset` scrolls it (animate it to move the relief). The source colours and transparency stay: the relief is a pattern over the `area` from the origin, masked by the children's alpha, so the children render twice.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Emboss"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Emboss-bc0da37a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/edges.rs#L385",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.7)",
          "docs": "0 to 1 strength of the relief. Animatable."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "26.0",
          "docs": "Side of one dash cell in the children's user units."
        },
        {
          "name": "line_width",
          "type": "f32",
          "default": "7.0",
          "docs": "Width of each dash in the children's user units."
        },
        {
          "name": "depth",
          "type": "f32",
          "default": "0.75",
          "docs": "0 to 1 height of the relief; deeper dashes catch more light and shade."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the dash pattern is turned."
        },
        {
          "name": "light_angle",
          "type": "f32",
          "default": "135.0",
          "docs": "Degrees counter-clockwise from the right that the light comes from: 135 is the top left."
        },
        {
          "name": "offset",
          "type": "f32",
          "default": "0.0",
          "docs": "Scrolls the pattern along its own horizontal axis, in user units; animate it to move the relief."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the relief covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask and pattern ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is embossed, by its alpha (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn facing(&self) -> [f32; 4]",
          "summary": "How much each side of a dash faces the light, -1 to 1: top, bottom, left and right in the pattern's own turned frame."
        }
      ]
    },
    {
      "name": "EnergyBars",
      "summary": "Bars of kinetic energy, potential energy and their sum, standing on `(x, y)` (pixels, the bottom left corner) and `height` pixels tall at `max` joules. Give them the values of the current frame, for example from `PendulumMotion::energy` at the same clock as the figure, and the exchange shows as one bar shrinking while the other grows with the total level. The frames draw with `enter`, the bars and labels fade with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/pendulum-and-energy-bars/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/pendulum-and-energy-bars.md",
      "scenes": [
        "EnergyBars"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/EnergyBars-d27e72ee.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/energy.rs#L23",
      "themed": true,
      "fields": [
        {
          "name": "kinetic",
          "type": "f64",
          "default": "0.0",
          "docs": "Kinetic energy in joules shown by the first bar."
        },
        {
          "name": "potential",
          "type": "f64",
          "default": "0.0",
          "docs": "Potential energy in joules shown by the second bar."
        },
        {
          "name": "max",
          "type": "f64",
          "default": "1.0",
          "docs": "Joules at which a bar is `height` pixels tall; larger values are clamped."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "1400.0",
          "docs": "Left edge of the first bar, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "820.0",
          "docs": "Bottom edge of the bars (their baseline), in pixels of the canvas."
        },
        {
          "name": "bar_width",
          "type": "f32",
          "default": "80.0",
          "docs": "Width of each bar in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "40.0",
          "docs": "Pixels between one bar and the next."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "420.0",
          "docs": "Height in pixels of a full bar and its frame."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes `KE`, `PE` and `E` at the foot of the three bars."
        },
        {
          "name": "kinetic_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the kinetic bar and its share of the total."
        },
        {
          "name": "potential_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the potential bar and its share of the total."
        },
        {
          "name": "total_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the labels."
        },
        {
          "name": "frame_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the outline frames of the bars."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the frames draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the frames leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the bars and labels fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the bars and labels fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "EnergyProfile",
      "summary": "A reaction's energy along its progress: a flat start at `reactants`, a hump up to `transition`, a flat end at `products` (energies in `unit`), drawn `width` by `height` pixels around `center` (units of `ui.space`) with an energy axis and a progress axis. With `labels` the levels are named and arrows mark the activation energy and the enthalpy change. A `catalyst` peak adds a lower, dashed path that draws at `catalyst_at` seconds. The axes and the path draw with `enter`; the arrows and labels with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/energy-profile/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/energy-profile.md",
      "scenes": [
        "EnergyProfile"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/EnergyProfile-ad1f5951.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/energy_profile.rs#L26",
      "themed": true,
      "fields": [
        {
          "name": "reactants",
          "type": "f64",
          "default": "50.0",
          "docs": "Energy of the reactants, the flat start of the path, in `unit`."
        },
        {
          "name": "transition",
          "type": "f64",
          "default": "150.0",
          "docs": "Energy at the top of the hump (the transition state), in `unit`; the activation energy is this less `reactants`."
        },
        {
          "name": "products",
          "type": "f64",
          "default": "10.0",
          "docs": "Energy of the products, the flat end of the path, in `unit`; the enthalpy change is this less `reactants`."
        },
        {
          "name": "catalyst",
          "type": "Option<f64>",
          "default": "None",
          "docs": "Energy at the top of a lower catalysed path, drawn dashed; `None` for no catalyst."
        },
        {
          "name": "catalyst_at",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start when the catalysed path draws."
        },
        {
          "name": "unit",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"kJ/mol\")",
          "docs": "Energy unit written after the `Ea` and `∆H` values."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the plot, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1100.0",
          "docs": "Width of the plot in pixels, axes included."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "620.0",
          "docs": "Height of the plot in pixels, axes included."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Draws the `Ea` and `∆H` arrows and the level and axis names; `false` for the bare path."
        },
        {
          "name": "axis_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the axes and the dashed level guide."
        },
        {
          "name": "path_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the energy path."
        },
        {
          "name": "catalyst_color",
          "type": "Color",
          "default": "Color::hex(\"#69db7c\")",
          "docs": "Colour of the catalysed path."
        },
        {
          "name": "arrow_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the `Ea` and `∆H` arrows."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the labels."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width in pixels of the energy path lines."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the axes and the path draw; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the axes and the path leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the arrows and labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the arrows and labels before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn activation(&self) -> f64",
          "summary": "The activation energy: the transition state over the reactants."
        },
        {
          "signature": "fn enthalpy(&self) -> f64",
          "summary": "The enthalpy change: the products less the reactants, negative when it releases heat."
        }
      ]
    },
    {
      "name": "EnzymeFit",
      "summary": "An enzyme meeting its substrate: the substrate drifts in and settles into the active site on top of the enzyme (`scale` times about 300 by 300 pixels, around `center` in units of `ui.space`). With `induced` the site starts wider and closes round the substrate as it binds (induced fit); without it the site already has the substrate's shape (lock and key). Then the bond between the substrate's two halves flashes and breaks, the two products leave, and an induced-fit site opens again. From `delay`: the substrate arrives over 0.6..1.8 s, binds over 2..2.8 s, its bond glows from 3.4 s and breaks at 4.8 s, and the products are gone by 6.2 s. With `labels` the parts are named, and `captions` tells each step underneath.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/enzyme-fit/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/enzyme-fit.md",
      "scenes": [
        "EnzymeFit"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/EnzymeFit-979c3052.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/enzyme.rs#L84",
      "themed": true,
      "fields": [
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the substrate starts to arrive."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the enzyme, in units of `ui.space`."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Size factor on the figure; `1.0` is about 300 by 300 pixels."
        },
        {
          "name": "induced",
          "type": "bool",
          "default": "true",
          "docs": "`true` for induced fit (the site starts wide and closes round the substrate); `false` for lock and key."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Names the enzyme, active site, substrate and products when `true`."
        },
        {
          "name": "captions",
          "type": "bool",
          "default": "true",
          "docs": "Tells each step in a line underneath when `true`."
        },
        {
          "name": "enzyme_color",
          "type": "Color",
          "default": "Color::hex(\"#7950f2\")",
          "docs": "Fill of the enzyme body."
        },
        {
          "name": "site_color",
          "type": "Color",
          "default": "Color::hex(\"#b197fc\")",
          "docs": "Colour the active site mixes toward while the substrate is bound."
        },
        {
          "name": "product_colors",
          "type": "[Color; 2]",
          "default": "[Color::hex(\"#ffa94d\"), Color::hex(\"#38d9a9\")]",
          "docs": "Colours of the two substrate halves, which become the two products."
        },
        {
          "name": "bond_color",
          "type": "Color",
          "default": "Color::hex(\"#ffe066\")",
          "docs": "Colour the bond between the halves glows before it breaks."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the part names: family, size in pixels and weight."
        },
        {
          "name": "caption_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the step captions: family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the names and captions."
        },
        {
          "name": "muted_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the secondary text (the model name and the leader lines)."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Epicycles",
      "summary": "A chain of turning circles whose end draws a closed path (Manim's `FourierCirclesScene`, the 3Blue1Brown Fourier series). `terms` come from `fourier`, largest first, and are placed with the series' center at `center` (units of `ui.space`, y up), `scale` units for one unit of the series. `turns` (a tracker) is how far the series has turned; the trace is what the end drew in the last `trace_length` turns (1 keeps one full turn, the whole drawing). The circles and vectors draw with `enter` and leave with `exit`; the trace stays, so wrap the figure in a fade to take it away too.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/epicycles/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/epicycles.md",
      "scenes": [
        "Epicycles"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Epicycles-fc55884a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/epicycles.rs#L102",
      "themed": true,
      "fields": [
        {
          "name": "terms",
          "type": "&[Term]",
          "default": "&[]",
          "docs": "The circles, largest first, from `fourier`; each has a frequency, an amplitude and a phase."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "Where the series' origin sits, in units of `ui.space` (y up)."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` for one unit of the series."
        },
        {
          "name": "turns",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "How far the series has turned, in full turns of its slowest circle; a tracker to animate."
        },
        {
          "name": "circles",
          "type": "bool",
          "default": "true",
          "docs": "Draws the outline of each circle when `true`."
        },
        {
          "name": "vectors",
          "type": "bool",
          "default": "true",
          "docs": "Draws the arm of each circle, from its centre to its rim, when `true`."
        },
        {
          "name": "circle_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the circle outlines."
        },
        {
          "name": "vector_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the arms."
        },
        {
          "name": "trace_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the path the end of the chain draws and of the dot at its head."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Line width in pixels of the circles and arms."
        },
        {
          "name": "trace_width",
          "type": "f32",
          "default": "theme.stroke.thick",
          "docs": "Line width in pixels of the trace."
        },
        {
          "name": "trace_length",
          "type": "f64",
          "default": "1.0",
          "docs": "How many turns of the end's path stay drawn; `1.0` keeps one full turn, the whole drawing."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the circles and arms appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the circles and arms leave at the end of its container; `None` stays (the trace stays regardless)."
        }
      ],
      "methods": []
    },
    {
      "name": "Equilibrium",
      "summary": "The concentrations of an `EquilibriumModel` as bars, `width` by `height` pixels around `center` (units of `ui.space`), reactants in `reactant_color` and products in `product_color`. The model's clock starts at `delay`. With `labels` each bar has its name under it and its concentration over it, and a line above compares `Q` with `K`: which way the reaction runs, or that it is at equilibrium. Up to `max` mol/L fits the height (the model's peak without one). The baseline draws with `enter`, the rest fades with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/equilibrium/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/equilibrium.md",
      "scenes": [
        "Equilibrium"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Equilibrium-1d7adf62.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/equilibrium.rs#L166",
      "themed": true,
      "fields": [
        {
          "name": "model",
          "type": "Option<&EquilibriumModel>",
          "default": "None",
          "docs": "The `EquilibriumModel` whose concentrations are drawn; `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start when the model's clock starts."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the bar area, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "900.0",
          "docs": "Width in pixels of the bar area, shared equally between the species."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "420.0",
          "docs": "Height in pixels of the bar area, the bar height at `max` mol/L."
        },
        {
          "name": "max",
          "type": "Option<f64>",
          "default": "None",
          "docs": "Concentration in mol/L that fills the full height; `None` uses the model's highest concentration."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes each species name and concentration and the `Q` against `K` line; `false` for bare bars."
        },
        {
          "name": "reactant_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the bars of reactants (negative coefficient)."
        },
        {
          "name": "product_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the bars of products (positive coefficient)."
        },
        {
          "name": "axis_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the baseline under the bars."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the names, concentrations and the `Q`/`K` line."
        },
        {
          "name": "equal_color",
          "type": "Color",
          "default": "Color::hex(\"#69db7c\")",
          "docs": "Colour of the `Q`/`K` line once the mixture is at equilibrium."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width in pixels of the baseline."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the baseline draws; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the baseline leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the bars and labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the bars and labels before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Evolve",
      "summary": "Its children revealed by an edge sweeping across the area (Remotion's `evolve()`): from the `direction` side, `progress` (0 hidden to 1 shown) of the way across, the edge softened over `feather` (0 to 1) of the area behind it.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Evolve"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Evolve-e6ef8250.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/reveal.rs#L114",
      "themed": true,
      "fields": [
        {
          "name": "progress",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.5)",
          "docs": "0 hidden to 1 fully shown: how far the edge has swept across the area. Animatable."
        },
        {
          "name": "direction",
          "type": "EvolveDirection",
          "default": "EvolveDirection::Left",
          "docs": "The side of the area the reveal starts from."
        },
        {
          "name": "feather",
          "type": "f32",
          "default": "0.1",
          "docs": "0 to 1 share of the area over which the edge softens behind `progress`; 0 for a hard edge."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the sweep covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is revealed (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn stops(&self, progress: f32) -> Vec<(f32, f32)>",
          "summary": "The mask along the sweep as `(offset, opacity)` stops at `progress`: shown up to `progress`, then a smoothstep down to hidden over `feather`."
        }
      ]
    },
    {
      "name": "Exclusion",
      "summary": "The area inside exactly one of `subject` and `clip` (Manim `Exclusion`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Exclusion"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Exclusion-3ffe15e9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/boolean.rs#L138",
      "themed": true,
      "fields": [
        {
          "name": "subject",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The first path, in pixels of the canvas."
        },
        {
          "name": "clip",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The second path; the overlap with `subject` is left empty."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Exposure",
      "summary": "Its children exposed brighter or darker by `stops`: every stop doubles the light.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Exposure"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Exposure-d9ee5678.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L391",
      "themed": true,
      "fields": [
        {
          "name": "stops",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.5)",
          "docs": "Photographic stops to brighten (positive) or darken (negative); each stop doubles the light."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "FadeTransform",
      "summary": "`from` fades out while it moves onto `to`, and `to` fades in from where `from` was (Manim's `FadeTransform`). With `stretch` each takes the other's box exactly; without, its height.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "FadeTransform"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FadeTransform-2ffa839e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L366",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Shape",
          "default": null,
          "docs": "The shape it starts as; drawn until `delay` has passed."
        },
        {
          "name": "to",
          "type": "Shape",
          "default": null,
          "docs": "The shape it ends as."
        },
        {
          "name": "stretch",
          "type": "bool",
          "default": null,
          "docs": "`true` stretches each shape to the other's box exactly; `false` scales by the height only."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Shape, to: Shape) -> Self",
          "summary": "Stretched, in Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "FadeTransformPieces",
      "summary": "`FadeTransform` piece by piece (Manim's `FadeTransformPieces`): piece `i` of `from` goes to piece `i` of `to`. Manim splits pieces until the counts match; here the pieces over the shorter list fade out or in where they are.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "FadeTransformPieces"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FadeTransformPieces-109c2b39.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L413",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Vec<Shape>",
          "default": null,
          "docs": "The pieces it starts as; piece `i` goes to piece `i` of `to`."
        },
        {
          "name": "to",
          "type": "Vec<Shape>",
          "default": null,
          "docs": "The pieces it ends as; extra pieces beyond the length of `from` fade in where they are."
        },
        {
          "name": "stretch",
          "type": "bool",
          "default": null,
          "docs": "`true` stretches each shape to the other's box exactly; `false` scales by the height only."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Vec<Shape>, to: Vec<Shape>) -> Self",
          "summary": "Stretched, in Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "FieldLines",
      "summary": "The field lines of `field`, drawing on together over `draw` seconds from `delay` seconds after the local start, each with an arrowhead at its middle. Then, with `test_charge`, a small positive charge follows that line at `speed` units a second. The charges are drawn as circles with their sign and draw with `enter`; the lines and the test charge fade with `parts_enter`. Without `field` nothing is drawn.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/field-lines/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/field-lines.md",
      "scenes": [
        "FieldLines"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FieldLines-24d33c1e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/field_lines.rs#L156",
      "themed": true,
      "fields": [
        {
          "name": "field",
          "type": "Option<&Field>",
          "default": "None",
          "docs": "The traced field to draw, built once in the video's constructor; `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the lines begin to draw."
        },
        {
          "name": "draw",
          "type": "f32",
          "default": "1.5",
          "docs": "Seconds the lines take to draw on, all together."
        },
        {
          "name": "arrows",
          "type": "bool",
          "default": "true",
          "docs": "Draws an arrowhead at the middle of each line."
        },
        {
          "name": "test_charge",
          "type": "Option<usize>",
          "default": "None",
          "docs": "Index of the line the small test charge follows after the lines are drawn; `None` for no test charge."
        },
        {
          "name": "speed",
          "type": "f64",
          "default": "1.5",
          "docs": "Speed of the test charge along its line in units of `ui.space` per second."
        },
        {
          "name": "charge_radius",
          "type": "f32",
          "default": "30.0",
          "docs": "Radius of the charge discs in pixels; the test charge is 0.4 times as big."
        },
        {
          "name": "positive_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of positive charges."
        },
        {
          "name": "negative_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of negative charges."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the field lines and their arrowheads."
        },
        {
          "name": "test_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the test charge."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the field lines in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the charges draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the charges leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the lines, signs and the test charge fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the lines and the test charge fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Fill",
      "summary": "A group covering the whole canvas, optionally on a background colour (Remotion's `AbsoluteFill`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades/",
      "markdown": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades.md",
      "scenes": [
        "Fill"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Fill-d69f144a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/time.rs#L185",
      "themed": true,
      "fields": [
        {
          "name": "background",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Colour painted behind the children; `None` for none."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "What it draws over the background, a closure taking the `Ui`."
        }
      ],
      "methods": []
    },
    {
      "name": "FitText",
      "summary": "One line of text at the largest size, up to `style.size`, that fits into `max_width` pixels. It shrinks by `step` pixels down to `min_size`, where it stays even if it is still too wide. Without a measurable font it keeps `style.size`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "FitText"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FitText-1aa030fc.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/fit.rs#L17",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The words, on one line."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "The anchor point on the baseline."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: its size in pixels is the largest size tried; family and weight are kept."
        },
        {
          "name": "max_width",
          "type": "f32",
          "default": "1600.0",
          "docs": "Widest the line may be, in pixels."
        },
        {
          "name": "min_size",
          "type": "usize",
          "default": "24",
          "docs": "Smallest font size in pixels it shrinks to, even if the text is still too wide."
        },
        {
          "name": "step",
          "type": "usize",
          "default": "4",
          "docs": "Pixels the font size shrinks by at each try (at least 1)."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "anchor",
          "type": "TextAnchor",
          "default": "TextAnchor::Start",
          "docs": "Which point of the text sits at `x`: start, middle or end."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": [
        {
          "signature": "fn size(&self, ui: &Ui) -> usize",
          "summary": "The font size the text is drawn at."
        }
      ]
    },
    {
      "name": "Flannel",
      "summary": "Plaid cloth printed on its children (Remotion's `flannel()`): wide and fine stripes of `stripe_color` across and down a `base_color` cloth, a check `size` units wide, shaded by the children's brightness and mixed in by `amount`. `softness` blurs the stripe edges. The children's alpha stays. Remotion's thread-level weave (a pixel-sized ripple) is left out. Drawn with an `feImage` of the plaid in a filter over the area.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Flannel"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Flannel-93822a42.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/textures.rs#L312",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.7)",
          "docs": "0 the children unchanged to 1 fully plaid, shaded by their brightness. Animatable."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "96.0",
          "docs": "Width in the children's user units of one wide check; the fine stripes repeat at half of it."
        },
        {
          "name": "softness",
          "type": "f32",
          "default": "0.18",
          "docs": "0 to 1 blur of the stripe edges; 0 is crisp."
        },
        {
          "name": "base_color",
          "type": "Color",
          "default": "Color::hex(\"#c92f3d\")",
          "docs": "Colour of the cloth between the stripes."
        },
        {
          "name": "stripe_color",
          "type": "Color",
          "default": "Color::hex(\"#241015\")",
          "docs": "Colour of the stripes; crossings are drawn darker."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the plaid covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is printed with plaid (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "FoodWeb",
      "summary": "A food web of `species` and the arrows of `eats` (`(prey, predator)` by name, pointing the way energy flows), laid out in trophic levels with the producers at the bottom (the longest chain of food sets each level), `level_gap` pixels between levels and `slot` pixels between neighbours, centred on `center` (units of `ui.space`). Each species is a pill coloured by its level from `level_colors`, and the levels are named at the left from `level_names`. From `delay` the levels appear from the bottom one every `level_time` seconds, the arrows into each level drawing as it does; with `flow` dots of energy then run along every arrow. Names in `eats` that are not in `species` are left out.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/food-web/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/food-web.md",
      "scenes": [
        "FoodWeb"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FoodWeb-ec024487.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/food_web.rs#L53",
      "themed": true,
      "fields": [
        {
          "name": "species",
          "type": "Vec<String>",
          "default": null,
          "docs": "Names of the species, each drawn as a pill."
        },
        {
          "name": "eats",
          "type": "Vec<(String, String)>",
          "default": "pairs .iter() .map(|&(a, b)| (a.to_owned(), b.to_owned())) .collect()",
          "docs": "`(prey, predator)` pairs by species name; each draws an arrow from prey to predator, the way energy flows."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the bottom level appears."
        },
        {
          "name": "level_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds between one trophic level appearing and the next above it."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.4, -0.35)",
          "docs": "The middle of the web, in units of `ui.space`."
        },
        {
          "name": "level_gap",
          "type": "f32",
          "default": "150.0",
          "docs": "Pixels between neighbouring trophic levels."
        },
        {
          "name": "slot",
          "type": "f32",
          "default": "230.0",
          "docs": "Pixels between neighbouring species on one level."
        },
        {
          "name": "flow",
          "type": "bool",
          "default": "true",
          "docs": "Dots of energy run along every arrow once it is drawn when `true`."
        },
        {
          "name": "level_colors",
          "type": "Vec<Color>",
          "default": null,
          "docs": "Fill of the species pills by trophic level, producers first; the last colour repeats for higher levels."
        },
        {
          "name": "level_names",
          "type": "Vec<String>",
          "default": null,
          "docs": "Names written at the left of each level, producers first; a level past the end has no name."
        },
        {
          "name": "arrow_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the arrows."
        },
        {
          "name": "flow_color",
          "type": "Color",
          "default": "Color::hex(\"#ffe066\")",
          "docs": "Colour of the energy dots."
        },
        {
          "name": "name_style",
          "type": "TextStyle",
          "default": "name_style",
          "docs": "The font of the species names: family, size in pixels and weight."
        },
        {
          "name": "level_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the level names: family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Colour of the species names."
        },
        {
          "name": "level_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the level names."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn levels(&self) -> Vec<usize>",
          "summary": "The trophic level of each of `species`: 0 for producers (they eat nothing here), otherwise one above the highest of their prey, so the longest food chain sets it. Feeding cycles stop climbing after one level per species."
        }
      ]
    },
    {
      "name": "FormulaView",
      "summary": "Draws a `Formula` (Manim's `MathTex` on screen).",
      "feature": "latex",
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/formulas/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/formulas.md",
      "scenes": [
        "FormulaView"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FormulaView-de6d0d88.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/latex/component.rs#L360",
      "themed": false,
      "fields": [
        {
          "name": "of",
          "type": "&Formula",
          "default": null,
          "docs": "The typeset formula to draw. A formula that was not typeset is drawn as plain `<text>` of its source."
        },
        {
          "name": "size",
          "type": "f32",
          "default": null,
          "docs": "Height in pixels of 10 pt text (the TeX default size)."
        },
        {
          "name": "x",
          "type": "f32",
          "default": null,
          "docs": "Position of the `anchor` point of the formula in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": null,
          "docs": "Position of the `anchor` point of the formula in pixels of the canvas."
        },
        {
          "name": "anchor",
          "type": "Anchor",
          "default": null,
          "docs": "The point of the formula's box at `(x, y)`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": null,
          "docs": "Replaces black, the color of everything the source does not color itself."
        },
        {
          "name": "color_map",
          "type": "&[(Part, Color)]",
          "default": null,
          "docs": "Colors of single parts, over `color` and the source's colors."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": null,
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": null,
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": null,
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": null,
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        },
        {
          "name": "emphasize",
          "type": "Option<Part>",
          "default": null,
          "docs": "The part `emphasis` applies to; the whole formula when `None`."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": null,
          "docs": "Names it when two of the same kind share a frame."
        }
      ],
      "methods": [
        {
          "signature": "fn new(of: &Formula) -> Self",
          "summary": ""
        },
        {
          "signature": "fn themed(self, t: &Theme) -> Self",
          "summary": "The same view with the theme's colors."
        },
        {
          "signature": "fn scale(&self) -> f64",
          "summary": "Pixels per TeX point."
        },
        {
          "signature": "fn transform(&self) -> Affine",
          "summary": "From TeX points to the canvas."
        },
        {
          "signature": "fn bounds(&self) -> Rect",
          "summary": "The box of the whole formula on the canvas, for a matcher around it."
        },
        {
          "signature": "fn part_bbox(&self, part: Part) -> Option<Rect>",
          "summary": "The box of a part on the canvas."
        },
        {
          "signature": "fn shapes(&self) -> Vec<Shape>",
          "summary": "One shape per glyph on the canvas, in drawing order."
        }
      ]
    },
    {
      "name": "FractalNoise",
      "summary": "Layered grey noise for clouds, smoke and organic textures (Remotion's `fractalNoise()`), drawn over its children where they are opaque and mixed in by `amount` (1 replaces the colours).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "FractalNoise"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FractalNoise-36f91d23.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/distort.rs#L150",
      "themed": true,
      "fields": [
        {
          "name": "fractal_type",
          "type": "FractalType",
          "default": "FractalType::Basic",
          "docs": "`Basic` for soft layered clouds, `Turbulent` for sharp ridges like smoke or marble veins."
        },
        {
          "name": "scale",
          "type": "f32",
          "default": "100.0",
          "docs": "Size of the largest cells in the children's user units; bigger is broader clouds."
        },
        {
          "name": "complexity",
          "type": "u32",
          "default": "6",
          "docs": "Number of layers of detail, 1 to 10; each is half the size and half the strength of the one before."
        },
        {
          "name": "evolution",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.0)",
          "docs": "Degrees that morph the texture in place; each full turn moves on to the next seed, cross-fading on the way. Animatable."
        },
        {
          "name": "cycle_evolution",
          "type": "bool",
          "default": "false",
          "docs": "`true` repeats the seeds after `cycle` turns of `evolution` so the texture loops."
        },
        {
          "name": "cycle",
          "type": "u32",
          "default": "1",
          "docs": "Turns of `evolution` after which the seeds repeat when `cycle_evolution` is on; at least 1."
        },
        {
          "name": "contrast",
          "type": "f32",
          "default": "1.0",
          "docs": "Stretches the greys about mid grey: 1 unchanged, 0 flat grey, above 1 harder."
        },
        {
          "name": "brightness",
          "type": "f32",
          "default": "0.0",
          "docs": "Added to the greys after `contrast`: 0 unchanged, positive lighter, negative darker (about -0.5 to 0.5)."
        },
        {
          "name": "offset_x",
          "type": "f32",
          "default": "0.0",
          "docs": "Horizontal shift of the texture in the children's user units."
        },
        {
          "name": "offset_y",
          "type": "f32",
          "default": "0.0",
          "docs": "Vertical shift of the texture in the children's user units."
        },
        {
          "name": "seed",
          "type": "u32",
          "default": "0",
          "docs": "Picks the texture; the same seed draws the same one."
        },
        {
          "name": "invert",
          "type": "bool",
          "default": "false",
          "docs": "`true` flips the greys, light for dark."
        },
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 the children unchanged to 1 the opaque pixels fully replaced by the noise. Animatable."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the noise covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter and mask ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the noise is drawn over, only where it is opaque (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn seeds(&self, evolution: f32) -> (u32, u32, f32)",
          "summary": "The two seeds `evolution` degrees cross-fades between, and how far it is from the first to the second."
        }
      ]
    },
    {
      "name": "FractionBar",
      "summary": "A bar of `width` x `height` pixels at `(x, y)` (top left) cut into `denominator` equal parts, of which the first `numerator` fill one after another. Bars of the same width stacked under each other show equal fractions lining up (`1/2`, `2/4`, `4/8`). The outline and the cuts draw with `enter`; with `label` the fraction is written left of the bar.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/fraction-bar-and-fraction-pie/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/fraction-bar-and-fraction-pie.md",
      "scenes": [
        "FractionBar"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FractionBar-2f35d20e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/fraction.rs#L37",
      "themed": true,
      "fields": [
        {
          "name": "numerator",
          "type": "usize",
          "default": "1",
          "docs": "Number of parts that fill."
        },
        {
          "name": "denominator",
          "type": "usize",
          "default": "2",
          "docs": "Number of equal parts the bar is cut into; `0` draws nothing."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "560.0",
          "docs": "Left edge of the bar, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "500.0",
          "docs": "Top edge of the bar, in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "800.0",
          "docs": "Width of the whole bar in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "80.0",
          "docs": "Height of the bar in pixels."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Fill of the filled parts."
        },
        {
          "name": "stroke",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the outline and the cuts."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Outline width in pixels."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first part fills."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.15",
          "docs": "Seconds between one part starting to fill and the next."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.base",
          "docs": "Seconds each part takes to fill."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::default()",
          "docs": "Easing of each part's fill over its run time."
        },
        {
          "name": "label",
          "type": "bool",
          "default": "true",
          "docs": "Writes the fraction left of the bar when `true`."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the fraction: family, size in pixels and weight."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the outline and the cuts appear; `None` shows them from the start."
        }
      ],
      "methods": []
    },
    {
      "name": "FractionPie",
      "summary": "A circle of `radius` pixels around `(cx, cy)` cut into `denominator` equal slices from the top, clockwise, of which the first `numerator` fill one after another. With `label` the fraction is written under the circle.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/fraction-bar-and-fraction-pie/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/fraction-bar-and-fraction-pie.md",
      "scenes": [
        "FractionPie"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FractionPie-43413a42.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/fraction.rs#L183",
      "themed": true,
      "fields": [
        {
          "name": "numerator",
          "type": "usize",
          "default": "1",
          "docs": "Number of slices that fill."
        },
        {
          "name": "denominator",
          "type": "usize",
          "default": "4",
          "docs": "Number of equal slices the circle is cut into; `0` draws nothing."
        },
        {
          "name": "cx",
          "type": "f32",
          "default": "960.0",
          "docs": "Centre of the circle, x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "540.0",
          "docs": "Centre of the circle, y in pixels of the canvas."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "200.0",
          "docs": "Radius of the circle in pixels."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Fill of the filled slices."
        },
        {
          "name": "stroke",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the outline and the cuts."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Outline width in pixels."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first slice fills."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.15",
          "docs": "Seconds between one slice starting to fill and the next."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.base",
          "docs": "Seconds each slice takes to fill."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::default()",
          "docs": "Easing of each slice's fill over its run time."
        },
        {
          "name": "label",
          "type": "bool",
          "default": "true",
          "docs": "Writes the fraction under the circle when `true`."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the fraction: family, size in pixels and weight."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the outline and the cuts appear; `None` shows them from the start."
        }
      ],
      "methods": []
    },
    {
      "name": "FreeBody",
      "summary": "A free-body diagram: a block at `center` (units of `ui.space`) with its `forces` drawn from its middle, `scale` units per newton. The arrows grow one after another from `delay` seconds after the local start, each over `grow` seconds and `stagger` seconds after the one before, with their names (and magnitudes, with `magnitudes`) at the tips. With `net` the sum of the forces follows as a dashed arrow, or `net = 0` under the block when they balance; `net_name` names it. The block draws with `enter`, the arrows and labels with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/free-body/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/free-body.md",
      "scenes": [
        "FreeBody"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FreeBody-f1733dad.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/free_body.rs#L52",
      "themed": true,
      "fields": [
        {
          "name": "forces",
          "type": "Vec<Force>",
          "default": "Vec::new()",
          "docs": "The forces on the block, each with a name and components in newtons (`y` up)."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the block, where the arrows start, in units of `ui.space`."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "0.5",
          "docs": "Units of `ui.space` per newton."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "160.0",
          "docs": "Side of the square block in pixels."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the first arrow starts to grow."
        },
        {
          "name": "grow",
          "type": "f32",
          "default": "0.6",
          "docs": "Seconds each arrow takes to grow."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.5",
          "docs": "Seconds between the start of one arrow and the next."
        },
        {
          "name": "net",
          "type": "bool",
          "default": "true",
          "docs": "Draws the sum of the forces as a dashed arrow after the others, or `net = 0` under the block when they balance."
        },
        {
          "name": "net_name",
          "type": "&str",
          "default": "\"net\"",
          "docs": "The name in the net force's label, \"net = 4 N\"."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes each force's name at its tip."
        },
        {
          "name": "magnitudes",
          "type": "bool",
          "default": "true",
          "docs": "Adds the magnitude in newtons to each label."
        },
        {
          "name": "block_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the block."
        },
        {
          "name": "force_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the force arrows that have no colour of their own."
        },
        {
          "name": "net_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the net force arrow and its label."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the force labels; the net force's label takes `net_color`."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the arrow shafts in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the block draws in; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the block leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the arrows and labels fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the arrows and labels fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn net_force(&self) -> (f64, f64)",
          "summary": "The sum of the forces in newtons."
        },
        {
          "signature": "fn start_of(&self, i: usize) -> f32",
          "summary": "Seconds after the local start when force `i` starts to grow; `forces.len()` gives the start of the net force."
        }
      ]
    },
    {
      "name": "Freeze",
      "summary": "Shows its children frozen at `at` seconds of their local time.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades/",
      "markdown": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades.md",
      "scenes": [
        "Freeze"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Freeze-67701e3c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/time.rs#L156",
      "themed": true,
      "fields": [
        {
          "name": "at",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds of the children's local time to show, whatever the frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "What it draws, frozen at `at`; a closure taking the `Ui`."
        }
      ],
      "methods": []
    },
    {
      "name": "FullScreenRectangle",
      "summary": "A rectangle over the whole 1920 x 1080 canvas (Manim `FullScreenRectangle`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "FullScreenRectangle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FullScreenRectangle-de3733b0.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/polygram.rs#L180",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "960.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "540.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "1080.0",
          "docs": "Height in pixels; the width is `height * aspect_ratio`."
        },
        {
          "name": "aspect_ratio",
          "type": "f32",
          "default": "16.0 / 9.0",
          "docs": "Width divided by height."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "FunctionGraph",
      "summary": "The graph of `f` from `x_range.0` to `x_range.1` on axes (Manim `axes.plot(f)`), usually built with `Axes::plot`. Its samples are cached; a function that is not finite somewhere leaves a gap there.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "FunctionGraph"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FunctionGraph-49a2e20e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/graph.rs#L172",
      "themed": true,
      "fields": [
        {
          "name": "f",
          "type": "Func",
          "default": "|x| x",
          "docs": "The function `y = f(x)` in data units; a plain `fn`, so its samples can be cached. Where it is not finite the graph has a gap."
        },
        {
          "name": "x_range",
          "type": "(f64, f64)",
          "default": "(-1.0, 1.0)",
          "docs": "The first and last `x` plotted, in data units."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The mapping of the axes the graph sits on (`axes.map(ui)`, or built by `Axes::plot`)."
        },
        {
          "name": "samples",
          "type": "usize",
          "default": "256",
          "docs": "Straight pieces of the sampled curve before smoothing."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        },
        {
          "signature": "fn point(&self, x: f64) -> (f32, f32)",
          "summary": "The pixel on the graph above `x` (Manim `input_to_graph_point`, `i2gp`)."
        }
      ]
    },
    {
      "name": "FunctionPlot",
      "summary": "Axes with a graph, its label and a tracer: a dot that follows a `ValueTracker` along the graph, a dashed line down to the x-axis and the point's coordinates (Manim's plot with an `always_redraw` dot). Build `graph` with `Axes::plot` on the same axes.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/function-plot/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/function-plot.md",
      "scenes": [
        "FunctionPlot"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/FunctionPlot-c92bfcf0.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/function_plot.rs#L21",
      "themed": true,
      "fields": [
        {
          "name": "axes",
          "type": "Axes",
          "default": "Axes::themed(theme)",
          "docs": "The axes the graph is drawn on."
        },
        {
          "name": "graph",
          "type": "FunctionGraph",
          "default": "FunctionGraph::themed(theme)",
          "docs": "The curve, built with `Axes::plot` on the same axes."
        },
        {
          "name": "label",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "Written next to the graph at `label_at`, empty for none."
        },
        {
          "name": "label_at",
          "type": "f64",
          "default": "0.0",
          "docs": "The x, in the axes' coordinates, where the label sits on the graph."
        },
        {
          "name": "label_direction",
          "type": "Anchor",
          "default": "Anchor::TopRight",
          "docs": "Which side of that point the label is placed on."
        },
        {
          "name": "label_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the label appears; `None` shows it from the start."
        },
        {
          "name": "tracer",
          "type": "Option<ValueTracker>",
          "default": "None",
          "docs": "`x` of the tracer, `None` for no tracer."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "2",
          "docs": "Decimals of the coordinates written at the tracer."
        },
        {
          "name": "tracer_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the tracer dot, its dashed line and its coordinates."
        },
        {
          "name": "tracer_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the tracer at the start; `None` for none."
        },
        {
          "name": "tracer_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the tracer before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "GasBox",
      "summary": "A box of gas: the particles of `motion` in a box whose middle is at `center` (units of `ui.space`, `scale` units per meter), drawn slow in `slow_color` and faster than the start's root mean square speed in `fast_color`, so heating turns the box to the fast colour. With `thermometer` a bar right of the box shows the temperature against the highest one, and with `labels` its factor over the start. The box and the thermometer's frame draw with `enter`, the particles and the level with `parts_enter`. Without `motion` nothing is drawn.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/gas-box/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/gas-box.md",
      "scenes": [
        "GasBox"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/GasBox-662ff21c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/gas.rs#L218",
      "themed": true,
      "fields": [
        {
          "name": "motion",
          "type": "Option<&GasMotion>",
          "default": "None",
          "docs": "The simulated particles to draw, built once in the video's constructor; `None` draws nothing."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the box, in units of `ui.space`."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the particles start to move."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "thermometer",
          "type": "bool",
          "default": "true",
          "docs": "Draws a bar right of the box that fills with the temperature, up to the highest one the motion reaches."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the temperature factor over the start (`T × 1.5`) above the thermometer."
        },
        {
          "name": "box_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the box walls and the thermometer frame and label."
        },
        {
          "name": "slow_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of particles at or below the start's root mean square speed."
        },
        {
          "name": "fast_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of faster particles and of the thermometer's level."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the box walls in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the box and the thermometer frame draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the box and the thermometer frame leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the particles and the level fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the particles and the level fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "GaussianEllipse",
      "summary": "A 2D normal distribution drawn as its ellipses of equal density (`ManimML`'s `GaussianDistribution`): a ring `sigmas` standard deviations from the mean for each entry, in `color`, each filled at `fill_opacity` (the inner rings stack up darker), the mean as a dot and, with `show_axes`, the principal axes out to the outer ring. On `axes`; draw the `Axes` after it. With `stagger` the rings appear one after the other from `start`, the innermost first.",
      "feature": "ml",
      "page": "https://fframes-kit.pages.dev/docs/machine-learning/normal-distributions-and-mcmc/",
      "markdown": "https://fframes-kit.pages.dev/docs/machine-learning/normal-distributions-and-mcmc.md",
      "scenes": [
        "GaussianEllipse"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/GaussianEllipse-4633b057.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/ml/probability.rs#L176",
      "themed": true,
      "fields": [
        {
          "name": "gaussian",
          "type": "Gaussian2D",
          "default": "Gaussian2D::default()",
          "docs": "The 2D normal distribution (mean and covariance) whose ellipses are drawn."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The axes to draw on, mapping data values to the canvas."
        },
        {
          "name": "sigmas",
          "type": "Vec<f64>",
          "default": "vec![1.0, 2.0, 3.0]",
          "docs": "Standard deviations from the mean at which a ring is drawn, one ring per entry."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the rings, their fill, the mean dot and the principal axes."
        },
        {
          "name": "fill_opacity",
          "type": "f32",
          "default": "0.12",
          "docs": "0 transparent to 1 opaque, of each ring's fill; inner rings stack up darker."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "2.5",
          "docs": "Width in pixels of the ring outlines; the mean dot scales with it."
        },
        {
          "name": "show_axes",
          "type": "bool",
          "default": "false",
          "docs": "Draws the principal axes of the distribution out to the outer ring."
        },
        {
          "name": "start",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start when the first ring begins to appear."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds between one ring appearing and the next, innermost first; 0 shows all rings from the start."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Gif",
      "summary": "An animated GIF in the box `(x, y, width, height)`, playing from `start` seconds of its container at `speed`. Each frame shows for its own delay (a delay under 20 ms is 100 ms, as in browsers); with `looping` it starts again, otherwise the last frame stays. It fades in over `fade` seconds. Decode the file once with `Gif::decode` and keep the `GifData` in the video. The editor (wasm32) draws a `placeholder` rectangle of the same size.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs.md",
      "scenes": [
        "Gif"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Gif-82eae3f6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/assets/gif.rs#L108",
      "themed": true,
      "fields": [
        {
          "name": "gif",
          "type": "&GifData",
          "default": "&NO_GIF",
          "docs": "The decoded GIF from `Gif::decode`; the default one draws nothing."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left edge of the box in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Top edge of the box in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "320.0",
          "docs": "Width of the box in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "320.0",
          "docs": "Height of the box in pixels."
        },
        {
          "name": "fit",
          "type": "GifFit",
          "default": "GifFit::Fill",
          "docs": "How the GIF fills the box: stretched, contained or covering."
        },
        {
          "name": "start",
          "type": "f32",
          "default": "0.0",
          "docs": "Second it starts playing, local to the parent container."
        },
        {
          "name": "speed",
          "type": "f32",
          "default": "1.0",
          "docs": "Playback speed; 1 is normal, 2 twice as fast."
        },
        {
          "name": "looping",
          "type": "bool",
          "default": "true",
          "docs": "Plays again and again; `false` keeps the last frame."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds it takes to fade in from `start`."
        },
        {
          "name": "placeholder",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Colour of the rectangle the editor draws in place of the GIF."
        }
      ],
      "methods": [
        {
          "signature": "fn decode(bytes: &[u8]) -> Result<GifData, GifError>",
          "summary": "Decodes every frame of a GIF file, composited onto the frames before it, and turns each into an image once. Call it in the video's constructor, not per frame."
        },
        {
          "signature": "fn frame_at(&self, t: f32) -> usize",
          "summary": "The frame shown at `t` seconds of the container."
        }
      ]
    },
    {
      "name": "Glow",
      "summary": "The theme's `shadow.glow` as a filter definition: a soft halo in the accent colour. Draw it once, then use `filter={glow.url()}` on what should glow.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "Glow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Glow-b0e89087.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/decor/filters.rs#L69",
      "themed": true,
      "fields": [
        {
          "name": "id",
          "type": "Cow<str>",
          "default": null,
          "docs": "The filter's id, unique in the frame."
        },
        {
          "name": "shadow",
          "type": "Shadow",
          "default": null,
          "docs": "The shadow the filter draws: colour (its alpha is the opacity), offset and blur."
        }
      ],
      "methods": [
        {
          "signature": "fn url(&self) -> String",
          "summary": "`url(#id)`, the value of a `filter` attribute."
        }
      ]
    },
    {
      "name": "Graph",
      "summary": "Vertices joined by edges (Manim `Graph`), placed by `layout` within `layout_scale` units of `center` (the layout is computed once and cached). Vertices are dots `radius` units wide; with `labels` they carry their names and grow to hold them. Edges are straight, or bent by `edge_bend` pixels. `vertex_styles` and `edge_styles` change single vertices and edges. `DiGraph` draws the same with tips on the edges.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "Graph"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Graph-a118b86f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/graph_mobject.rs#L56",
      "themed": true,
      "fields": [
        {
          "name": "vertices",
          "type": "Vec<Cow<str>>",
          "default": "Vec::new()",
          "docs": "The vertex names; edges refer to a vertex by its index here, and `labels` writes the names inside the dots."
        },
        {
          "name": "edges",
          "type": "Vec<(usize, usize)>",
          "default": "Vec::new()",
          "docs": "Pairs of vertex indices `(from, to)`; an edge to the same vertex or to a missing one is skipped."
        },
        {
          "name": "layout",
          "type": "GraphLayout",
          "default": "GraphLayout::default()",
          "docs": "How the vertices are placed: circular, spring, tree, shell and so on."
        },
        {
          "name": "layout_scale",
          "type": "f64",
          "default": "2.0",
          "docs": "How far from `center` the layout reaches, in units of `ui.space`."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the layout, in units of `ui.space`."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "false",
          "docs": "Writes each vertex's name inside its dot, which grows to hold it."
        },
        {
          "name": "radius",
          "type": "f64",
          "default": "0.1",
          "docs": "Radius of a vertex dot in units of `ui.space`."
        },
        {
          "name": "vertex_fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the vertex dots."
        },
        {
          "name": "vertex_stroke",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Outline colour of the vertex dots; `None` draws no outline."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the vertex names: family, size in pixels and weight."
        },
        {
          "name": "label_fill",
          "type": "Color",
          "default": "theme.colors.background",
          "docs": "Colour of the vertex names."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the edges and their tips."
        },
        {
          "name": "edge_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the edges in pixels."
        },
        {
          "name": "edge_bend",
          "type": "f64",
          "default": "0.0",
          "docs": "Pixels the middle of an edge bows to its left; 0 is straight."
        },
        {
          "name": "tip_length",
          "type": "f64",
          "default": "16.0",
          "docs": "Length of the arrow tip of a `DiGraph` edge in pixels."
        },
        {
          "name": "vertex_styles",
          "type": "Vec<VertexStyle>",
          "default": "Vec::new()",
          "docs": "Looks that replace the graph's for single vertices."
        },
        {
          "name": "edge_styles",
          "type": "Vec<EdgeStyle>",
          "default": "Vec::new()",
          "docs": "Looks that replace the graph's for single edges, and their labels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the vertices and edges appear (`Create`, `GrowFromCenter`, ..); `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the vertices and edges leave at the end of their container; `None` stays."
        },
        {
          "name": "labels_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade the vertex names and edge labels in at the start; `None` for none."
        },
        {
          "name": "labels_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade the vertex names and edge labels out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn new(ui: &Ui, vertices: &[&str], edges: &[(usize, usize)]) -> Self",
          "summary": "A graph of these vertices and edges with the theme's look and the spring layout."
        },
        {
          "signature": "fn layout_positions(&self) -> Arc<[(f64, f64)]>",
          "summary": "The layout's positions in units around the origin, computed once per layout, vertex count, edges and scale."
        },
        {
          "signature": "fn vertex_point(&self, space: Space, v: usize) -> Option<Point>",
          "summary": "Where vertex `v` is, in pixels of `space` (Manim `graphv.get_center()`)."
        }
      ]
    },
    {
      "name": "GraphMolecule",
      "summary": "Manim-chemistry's `GraphMolecule` with the animations of its `GMAnimationBuilder`: every atom of `structure` as a ring with its symbol, carbons too, and the bonds as lines (doubles and triples as two and three), around `center` (units of `ui.space`) with `bond_length` pixels between bonded atoms.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/graph-molecule/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/graph-molecule.md",
      "scenes": [
        "GraphMolecule"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/GraphMolecule-dc325d74.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/graph_anim.rs#L247",
      "themed": true,
      "fields": [
        {
          "name": "structure",
          "type": "Option<&Structure>",
          "default": "None",
          "docs": "The molecule to draw (from SMILES, a molfile or built by hand); `None` draws nothing."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the molecule's coordinates, in units of `ui.space`."
        },
        {
          "name": "bond_length",
          "type": "f32",
          "default": "110.0",
          "docs": "Pixels per bond length of the structure's coordinates."
        },
        {
          "name": "atom_radius",
          "type": "f32",
          "default": "24.0",
          "docs": "Radius in pixels of an atom ring, before the depth scaling of a turn."
        },
        {
          "name": "elevation",
          "type": "f32",
          "default": "15.0",
          "docs": "Degrees the view looks down from above the page: 0 is straight on, where atoms in line hide each other."
        },
        {
          "name": "rotations",
          "type": "Vec<BondRotation>",
          "default": "Vec::new()",
          "docs": "Turns of the part of the molecule beyond a bond; empty for none."
        },
        {
          "name": "recolors",
          "type": "Vec<Recolor>",
          "default": "Vec::new()",
          "docs": "Colour changes of atoms and bonds over time; empty for none."
        },
        {
          "name": "highlights",
          "type": "Vec<GroupHighlight>",
          "default": "Vec::new()",
          "docs": "Soft colour bands behind groups of atoms, fading in over time; empty for none."
        },
        {
          "name": "color_atoms",
          "type": "bool",
          "default": "true",
          "docs": "Colours each ring and symbol by its element; `false` uses `bond_color` for all."
        },
        {
          "name": "bond_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the bonds, and of the atoms when `color_atoms` is `false`."
        },
        {
          "name": "atom_fill",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Fill colour inside the atom rings."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width in pixels of the bonds and atom rings."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "GraphView",
      "summary": "A graph search: round nodes `radius` pixels with their names, `spacing` pixels between slots and `level` pixels between layers, centred on `center` (units of `ui.space`). It plays a `GraphTrace`, one step every `step_time` seconds from `delay`: the current node lights up, nodes waiting in the frontier take `colors.moved`, finished ones `colors.sorted`, the edge followed lights up and the search tree's edges thicken. A long edge bends round the nodes in its way, and the two edges of a pair that point both ways bend apart. With `curved` every edge is an arc. A backward edge of a directed graph (one that points up against the layers, or left within a layer) always curves, wide enough to pass beside the forward edges instead of over them. Weights sit on the middle of their edge, on a small `weight_fill` plate. Distances (Dijkstra) are written above the nodes, the frontier (`queue: A, B`) and the note under the graph. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/graph-graph-trace-and-graph-view/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/graph-graph-trace-and-graph-view.md",
      "scenes": [
        "GraphView"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/GraphView-229f12e2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/graph.rs#L355",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&GraphTrace>",
          "default": "None",
          "docs": "The recorded search steps to play (`GraphTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the graph, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "170.0",
          "docs": "Pixels between neighbouring node slots in a layer."
        },
        {
          "name": "level",
          "type": "f32",
          "default": "150.0",
          "docs": "Pixels between layers."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "34.0",
          "docs": "Radius of a node in pixels."
        },
        {
          "name": "frontier",
          "type": "bool",
          "default": "true",
          "docs": "Whether the frontier (`queue: A, B`) is written under the graph."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the graph."
        },
        {
          "name": "curved",
          "type": "bool",
          "default": "false",
          "docs": "Every edge an arc, not only the backward ones and the pairs."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the nodes in each state (current, waiting, finished)."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the edges."
        },
        {
          "name": "tree_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the edges of the search tree built so far."
        },
        {
          "name": "active_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the edge being followed."
        },
        {
          "name": "dist_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the distances written above the nodes."
        },
        {
          "name": "weight_fill",
          "type": "Color",
          "default": "theme.colors.background",
          "docs": "The plate behind a weight, so the edge does not run through the digits."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the node names and weights."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the distances, frontier and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Grayscale",
      "summary": "Its children in grey (CSS `grayscale()`): `amount` 1 fully grey.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Grayscale"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Grayscale-581c84c3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L342",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 unchanged to 1 fully grey."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Gridlines",
      "summary": "A square grid of lines over its children (Remotion's `gridlines()`): lines `line_width` units wide in `line_color`, `grid_size` units apart, over a `background_color` (transparent by default). `rotation` turns the grid about the middle of the area in degrees and `offset_x`, `offset_y` move it; with `mask_to_source_alpha` it covers only the opaque parts of the children (which then render twice). Remotion's `rotationX`, `rotationY` and `perspective` tilt the grid in 3D, which SVG cannot draw; they are not available.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Gridlines"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Gridlines-7ad2cd09.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L395",
      "themed": true,
      "fields": [
        {
          "name": "grid_size",
          "type": "f32",
          "default": "64.0",
          "docs": "Distance between line middles in the children's user units."
        },
        {
          "name": "line_width",
          "type": "f32",
          "default": "2.0",
          "docs": "Width of each line in user units; 0 draws none."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Colour of the lines."
        },
        {
          "name": "background_color",
          "type": "Color",
          "default": "Color::TRANSPARENT",
          "docs": "Colour filled between the lines; transparent shows the children."
        },
        {
          "name": "rotation",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the grid is turned about the middle of the area."
        },
        {
          "name": "offset_x",
          "type": "f32",
          "default": "0.0",
          "docs": "Horizontal shift of the grid in user units."
        },
        {
          "name": "offset_y",
          "type": "f32",
          "default": "0.0",
          "docs": "Vertical shift of the grid in user units."
        },
        {
          "name": "mask_to_source_alpha",
          "type": "bool",
          "default": "false",
          "docs": "`true` covers only the opaque parts of the children, which then render twice."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the grid covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip and mask ids when two grids share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the grid is laid over (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Halftone",
      "summary": "Its children printed as a grid of dots (Remotion's `halftone()`): a dot every `dot_spacing` units (`dot_size` when `None`), as large as `dot_size` where the children are black and shrinking to nothing where they are white or transparent (the other way round with `invert`). The grid is centred on the area, turned by `rotation` degrees clockwise and moved by `offset`. Dots are `dot_color` or, with `HalftoneColor::Source`, the children's colours; they replace the children.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Halftone"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Halftone-c9cd7e9a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/halftone.rs#L62",
      "themed": true,
      "fields": [
        {
          "name": "shape",
          "type": "HalftoneShape",
          "default": "HalftoneShape::Circle",
          "docs": "`Circle`, `Square`, or `Line` stripes as long as the area and as thick as a dot."
        },
        {
          "name": "dot_size",
          "type": "f32",
          "default": "20.0",
          "docs": "Width of the largest dot in the children's user units, reached where the children are black."
        },
        {
          "name": "dot_spacing",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Distance between dot centers in user units; `None` uses `dot_size`. Below `dot_size` later dots overdraw earlier ones."
        },
        {
          "name": "rotation",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the grid is turned clockwise about the middle of the area."
        },
        {
          "name": "offset",
          "type": "(f32, f32)",
          "default": "(0.0, 0.0)",
          "docs": "`(x, y)` shift of the grid in user units; it is taken off the centered position, so positive values move the dots left and up."
        },
        {
          "name": "color",
          "type": "HalftoneColor",
          "default": "HalftoneColor::Solid",
          "docs": "`Solid` paints the dots `dot_color`; `Source` takes the children's colours under each dot."
        },
        {
          "name": "dot_color",
          "type": "Color",
          "default": "Color::rgb(0xff, 0, 0)",
          "docs": "Colour of the dots when `color` is `Solid`; its alpha is kept."
        },
        {
          "name": "invert",
          "type": "bool",
          "default": "false",
          "docs": "`true` makes dots grow where the children are white instead of black."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the grid covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter and gradient ids when two halftones share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is printed as dots (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "HalftoneLinearGradient",
      "summary": "Dots growing along a gradient over its children (Remotion's `halftoneLinearGradient()`): a dot every `grid_size` units, centred on the area, `first_dot_size` wide at `first_stop` growing to `second_dot_size` at `second_stop` (0 to 1 across the area). Solid dots in `dot_color` are laid over the children, only over their opaque parts with `mask_to_source_alpha`; `HalftoneColor::Source` keeps the children only inside the dots.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "HalftoneLinearGradient"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/HalftoneLinearGradient-6863f281.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/halftone.rs#L282",
      "themed": true,
      "fields": [
        {
          "name": "first_dot_size",
          "type": "f32",
          "default": "0.0",
          "docs": "Dot width in user units at `first_stop`; 0 draws no dot there."
        },
        {
          "name": "second_dot_size",
          "type": "f32",
          "default": "40.0",
          "docs": "Dot width in user units at `second_stop`."
        },
        {
          "name": "first_stop",
          "type": "(f32, f32)",
          "default": "(0.0, 0.5)",
          "docs": "Where the gradient starts, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "second_stop",
          "type": "(f32, f32)",
          "default": "(1.0, 0.5)",
          "docs": "Where the gradient ends, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "grid_size",
          "type": "f32",
          "default": "24.0",
          "docs": "Distance between dot centers in user units; the grid is centered on the area."
        },
        {
          "name": "color",
          "type": "HalftoneColor",
          "default": "HalftoneColor::Solid",
          "docs": "`Solid` lays dots of `dot_color` over the children; `Source` keeps the children only inside the dots."
        },
        {
          "name": "dot_color",
          "type": "Color",
          "default": "Color::BLACK",
          "docs": "Colour of the dots when `color` is `Solid`."
        },
        {
          "name": "mask_to_source_alpha",
          "type": "bool",
          "default": "false",
          "docs": "`true` draws solid dots only over the opaque parts of the children."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the grid covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the dots are laid over (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn dots(&self) -> Vec<(f32, f32, f32)>",
          "summary": "The dots `(x, y, radius)`; a grid finer than `MAX_PATTERN_SHAPES` dots is drawn coarser."
        }
      ]
    },
    {
      "name": "HashTable",
      "summary": "A hash table: a column of numbered buckets, each `height` pixels tall and `gap` apart, with its chain of entries (`cell` pixels wide, `link` pixels apart) linked to its right, centred on `center` (units of `ui.space`). It plays a `HashTrace`, one step every `step_time` seconds from `delay`: the bucket a key hashes to lights up, the entries walked light up one by one, a found entry turns green, new entries slide in at the end of their chain and removed ones leave as the chain closes. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/hash-trace-and-hash-table/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/hash-trace-and-hash-table.md",
      "scenes": [
        "HashTable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/HashTable-82f8a1b3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/hash.rs#L224",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&HashTrace>",
          "default": "None",
          "docs": "The recorded steps to play (`HashTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.7",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the table, in units of `ui.space`."
        },
        {
          "name": "bucket",
          "type": "f32",
          "default": "64.0",
          "docs": "Width of a bucket in pixels."
        },
        {
          "name": "cell",
          "type": "f32",
          "default": "96.0",
          "docs": "Width of an entry in a chain in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "56.0",
          "docs": "Height of a bucket and of its entries in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "14.0",
          "docs": "Space between neighbouring buckets in pixels."
        },
        {
          "name": "link",
          "type": "f32",
          "default": "48.0",
          "docs": "Length of the arrow between a bucket and its first entry, and between entries, in pixels."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the table."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the entries in each state (walked, found, moved)."
        },
        {
          "name": "bucket_color",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Colour of a bucket at rest; the bucket a key hashes to takes `colors.compare`."
        },
        {
          "name": "link_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the arrows that link a chain."
        },
        {
          "name": "index_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the bucket numbers."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the keys in the entries."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the bucket numbers and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Heart",
      "summary": "A heart `height` tall and 1.1 times as wide (Remotion `Heart`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Heart"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Heart-f5015e92.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/remotion.rs#L124",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "200.0",
          "docs": "Height in pixels; the width is 1.1 times it."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Heatmap",
      "summary": "A grid of coloured cells on axes: `values` row by row, the first row at the top, covering `x_range` and `y_range` in data units. A cell's colour runs from `low` at `min` to `high` at `max` (the smallest and largest value when `None`). From `delay` the cells fade in as a wave from the top left corner, `stagger` seconds per step along the diagonal. Values that are not finite leave their cell empty.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/math/plots/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/plots.md",
      "scenes": [
        "Heatmap"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Heatmap-9be09279.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/plot/heatmap.rs#L21",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<Vec<f64>>",
          "default": "Vec::new()",
          "docs": "The cell values row by row, the first row at the top; a value that is not finite leaves its cell empty."
        },
        {
          "name": "x_range",
          "type": "(f64, f64)",
          "default": "(0.0, 1.0)",
          "docs": "Left and right edge of the grid in data units of the x-axis."
        },
        {
          "name": "y_range",
          "type": "(f64, f64)",
          "default": "(0.0, 1.0)",
          "docs": "Bottom and top edge of the grid in data units of the y-axis."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The mapping of the axes the grid sits on (`axes.map(ui)`)."
        },
        {
          "name": "low",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Colour of a cell at `min`."
        },
        {
          "name": "high",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of a cell at `max`."
        },
        {
          "name": "min",
          "type": "Option<f64>",
          "default": "None",
          "docs": "Value drawn in `low`; `None` takes the smallest value."
        },
        {
          "name": "max",
          "type": "Option<f64>",
          "default": "None",
          "docs": "Value drawn in `high`; `None` takes the largest value."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "2.0",
          "docs": "Pixels between the cells."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first cell begins to fade in."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.05",
          "docs": "Seconds each step along the diagonal waits after the one before it."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.base",
          "docs": "Seconds each cell takes to fade in."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::default()",
          "docs": "Easing of each cell's fade over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn color_at(&self, v: f64) -> Color",
          "summary": "The colour of value `v`."
        }
      ]
    },
    {
      "name": "Histogram",
      "summary": "Bars of `values` (one per bin, usually from `bin`) side by side from `range.0` to `range.1` on axes, standing on the x-axis. From `delay` they grow one after another, `stagger` seconds apart; `stagger: 0.0` grows them together. `gap` is the pixels between bars.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/math/plots/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/plots.md",
      "scenes": [
        "Histogram"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Histogram-9a7e9653.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/plot/histogram.rs#L47",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<f64>",
          "default": "Vec::new()",
          "docs": "The height of each bar in data units of the y-axis, one per bin (usually from `bin`); 0 or not finite draws no bar."
        },
        {
          "name": "range",
          "type": "(f64, f64)",
          "default": "(0.0, 1.0)",
          "docs": "Left and right edge of the first and last bin in data units of the x-axis."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The mapping of the axes the bars stand on (`axes.map(ui)`)."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "2.0",
          "docs": "Pixels between neighbouring bars."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the bars."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Outline colour of the bars; `None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Outline width in pixels."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first bar begins to grow."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.04",
          "docs": "Seconds each bar waits after the one before it; 0 grows them together."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.base",
          "docs": "Seconds each bar takes to grow."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.enter",
          "docs": "Easing of each bar's growth over its run time."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the bars appear once grown; `None` shows them as they are."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the bars leave at the end of their container; `None` stays."
        }
      ],
      "methods": [
        {
          "signature": "fn grown(&self, i: usize, t: f32) -> f32",
          "summary": "How far bar `i` has grown at `t`, from 0 to 1."
        }
      ]
    },
    {
      "name": "Homotopy",
      "summary": "Moves every point of the shape through `homotopy(x, y, t)` while `t` runs from 0 to 1 (Manim's `Homotopy`). Points are in the units of `ui.space`, `y` up; before the start the shape is at `t = 0`, after the end at `t = 1`. The path is cut into about `HOMOTOPY_SEGMENTS` pieces first, so straight lines bend.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "Homotopy"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Homotopy-6d979651.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/homotopy.rs#L84",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape whose points move; drawn unchanged before `delay`."
        },
        {
          "name": "homotopy",
          "type": "fn(f64, f64, f64) -> (f64, f64)",
          "default": null,
          "docs": "Maps a point `(x, y)` in units of `ui.space` (y up) and the progress `t` from 0 to 1 to its new position."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, homotopy: fn(f64, f64, f64) -> (f64, f64)) -> Self",
          "summary": "Manim's 3 seconds, smooth."
        },
        {
          "signature": "fn path_at(&self, space: Space, t: f32) -> BezPath",
          "summary": "The path at progress `t`."
        }
      ]
    },
    {
      "name": "HudLabel",
      "summary": "A small tracked label, like the annotations of an engineering drawing (\"01 / RENDER\"). `uppercase` turns the text to capitals.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "HudLabel"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/HudLabel-e8a6bedd.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/label.rs#L16",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The words; shown in capitals when `uppercase` is set."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Position of the text's anchor point, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the text."
        },
        {
          "name": "anchor",
          "type": "TextAnchor",
          "default": "TextAnchor::Start",
          "docs": "Which point of the text sits at `x`: start, middle or end."
        },
        {
          "name": "letter_spacing",
          "type": "f32",
          "default": "2.5",
          "docs": "Pixels between letters."
        },
        {
          "name": "uppercase",
          "type": "bool",
          "default": "true",
          "docs": "`true` writes the text in capitals."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": [
        {
          "signature": "fn draw(self) -> Svgr",
          "summary": "The label as a `<text>` element; it needs no `Ui`, so it can be drawn anywhere."
        }
      ]
    },
    {
      "name": "HueRotate",
      "summary": "Its children with their hues turned round the colour wheel by `degrees` (SVG `hueRotate`), Remotion's hue effect.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "HueRotate"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/HueRotate-79a4e79a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L331",
      "themed": true,
      "fields": [
        {
          "name": "degrees",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(90.0)",
          "docs": "Angle in degrees the hues are turned round the colour wheel."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ImplicitFunction",
      "summary": "The curve where `f(x, y) = 0` (Manim `ImplicitFunction`, `axes.plot_implicit_curve`), traced by marching squares on a grid `resolution` cells wide over `x_range` by `y_range`. Its points are in data units of `axes` when set, otherwise in units of `space`; build one with `ImplicitFunction::new` to take `ui.space`, or with `Axes::plot_implicit_curve`. The curve is traced once and cached.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "ImplicitFunction"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ImplicitFunction-ddd149a7.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/implicit.rs#L142",
      "themed": true,
      "fields": [
        {
          "name": "f",
          "type": "Implicit",
          "default": "|x",
          "docs": "The function of `(x, y)` whose zeros make the curve; a plain `fn`."
        },
        {
          "name": "x_range",
          "type": "(f64, f64)",
          "default": "(-7.1, 7.1)",
          "docs": "The left and right edge of the box searched, in data units of `axes` when set, otherwise in units of `space`."
        },
        {
          "name": "y_range",
          "type": "(f64, f64)",
          "default": "(-4.0, 4.0)",
          "docs": "The bottom and top edge of the box searched, in data units of `axes` when set, otherwise in units of `space`."
        },
        {
          "name": "resolution",
          "type": "usize",
          "default": "128",
          "docs": "Grid cells across `x_range`; a finer grid follows tighter turns."
        },
        {
          "name": "axes",
          "type": "Option<AxesMap>",
          "default": "None",
          "docs": "Axes whose data units the curve is in; `None` takes units of `space`."
        },
        {
          "name": "space",
          "type": "Space",
          "default": "Space::FULL_HD",
          "docs": "The coordinate system in units of which the curve is drawn when `axes` is `None`."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        },
        {
          "signature": "fn new(ui: &Ui, f: Implicit) -> Self",
          "summary": "The curve of `f` over Manim's frame, in `ui.space`, with the theme's paint."
        }
      ]
    },
    {
      "name": "Integer",
      "summary": "Manim's `Integer`: a `DecimalNumber` without decimals, rounded to the nearest whole number.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Integer"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Integer-2a84ecd9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/decimal.rs#L187",
      "themed": true,
      "fields": [
        {
          "name": "value",
          "type": "ValueTracker",
          "default": "d.value",
          "docs": "The `ValueTracker` whose value is written; it is read at every frame."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "d.x",
          "docs": "Position of the number's anchor, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "d.y",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "d.style",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "d.fill",
          "docs": "Colour of the text."
        },
        {
          "name": "anchor",
          "type": "TextAnchor",
          "default": "d.anchor",
          "docs": "Which point of the number (with its unit) sits at `x`: start, middle or end."
        },
        {
          "name": "include_sign",
          "type": "bool",
          "default": "d.include_sign",
          "docs": "`true` writes a `+` before positive numbers."
        },
        {
          "name": "group_with_commas",
          "type": "bool",
          "default": "d.group_with_commas",
          "docs": "`true` groups the digits by three with commas."
        },
        {
          "name": "unit",
          "type": "&str",
          "default": "d.unit",
          "docs": "Text written after the number, such as `\" kg\"`; empty for none."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "d.opacity",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": []
    },
    {
      "name": "IntegerMatrix",
      "summary": "A `Matrix` of whole numbers (Manim `IntegerMatrix`). `matrix` gives the place and look; its `entries` are replaced.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "IntegerMatrix"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/IntegerMatrix-7ee78357.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/typed_matrix.rs#L141",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<Vec<i64>>",
          "default": "Vec::new()",
          "docs": "The whole numbers row by row; they replace the entries of `matrix`."
        },
        {
          "name": "matrix",
          "type": "Matrix",
          "default": "Matrix::themed(theme)",
          "docs": "The matrix that gives the place, gaps, font, brackets and animations; its `entries` are replaced by `values`."
        }
      ],
      "methods": [
        {
          "signature": "fn to_matrix(&self) -> Matrix",
          "summary": "The `Matrix` it draws, with the numbers written."
        }
      ]
    },
    {
      "name": "IntegerTable",
      "summary": "A `Table` of whole numbers (Manim `IntegerTable`). `table` gives the labels, place and look; its `rows` are replaced.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "IntegerTable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/IntegerTable-1de5e559.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/typed_table.rs#L72",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<Vec<i64>>",
          "default": "Vec::new()",
          "docs": "The whole numbers row by row; they replace the `rows` of `table`."
        },
        {
          "name": "table",
          "type": "Table",
          "default": "Table::themed(theme)",
          "docs": "The table that gives the labels, place, font, lines and animations; its `rows` are replaced by `values`."
        }
      ],
      "methods": [
        {
          "signature": "fn to_table(&self) -> Table",
          "summary": "The `Table` it draws, with the numbers written."
        }
      ]
    },
    {
      "name": "Intersection",
      "summary": "The area inside all of `paths` (Manim `Intersection`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Intersection"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Intersection-55d42221.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/boolean.rs#L112",
      "themed": true,
      "fields": [
        {
          "name": "paths",
          "type": "Vec<BezPath>",
          "default": "Vec::new()",
          "docs": "The paths to intersect, in pixels of the canvas."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Interval",
      "summary": "The numbers from `from` to `to` marked on a number line: a thick segment with a filled dot at a closed end and a ring at an open one (`[a, b)` is `closed: (true, false)`). The line is drawn separately.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/number-point-and-interval/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/number-point-and-interval.md",
      "scenes": [
        "Interval"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Interval-76f6ff56.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/number_line.rs#L120",
      "themed": true,
      "fields": [
        {
          "name": "line",
          "type": "NumberLine",
          "default": "NumberLine::themed(theme)",
          "docs": "The number line the interval sits on; it only maps numbers to points and is not drawn by this component."
        },
        {
          "name": "from",
          "type": "f64",
          "default": "0.0",
          "docs": "The first end, as a number on `line`."
        },
        {
          "name": "to",
          "type": "f64",
          "default": "1.0",
          "docs": "The second end, as a number on `line`."
        },
        {
          "name": "closed",
          "type": "(bool, bool)",
          "default": "(true, true)",
          "docs": "Whether the `from` end and the `to` end are included: a filled dot when `true`, a ring when `false`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the segment and the end dots."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thick",
          "docs": "Segment width in pixels; a ring's outline is half of it."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "12.0",
          "docs": "Radius of the end dots and rings."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        }
      ],
      "methods": []
    },
    {
      "name": "Invert",
      "summary": "Its children as a negative (CSS `invert()`): `amount` 1 fully inverted.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Invert"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Invert-5172e656.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L352",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 unchanged to 1 fully inverted (0.5 is flat grey)."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "KenBurns",
      "summary": "An image of the video's media slowly pushed in from `from` seconds and drifted sideways, clipped to the box `(x, y, width, height)`, which it covers (`xMidYMid slice`). It fades in over `fade` seconds. The scale is `zoom + zoom_per_second * t` and the center moves `drift / 4` pixels a second, `t` seconds after `from`. A missing image draws nothing; `key` names the clip path when two are drawn in one frame.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "KenBurns"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/KenBurns-f46a4d8d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/media/ken_burns.rs#L16",
      "themed": true,
      "fields": [
        {
          "name": "image",
          "type": "&str",
          "default": "\"\"",
          "docs": "Name of the image in the video's media; a missing image draws nothing."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip path when two are drawn in one frame; `None` for none."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left edge of the box in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Top edge of the box in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1920.0",
          "docs": "Width of the box in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "1080.0",
          "docs": "Height of the box in pixels."
        },
        {
          "name": "from",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start the image appears and begins to push in."
        },
        {
          "name": "zoom",
          "type": "f32",
          "default": "1.06",
          "docs": "Scale of the image at `from`; 1 covers the box exactly."
        },
        {
          "name": "zoom_per_second",
          "type": "f32",
          "default": "0.02",
          "docs": "How much the scale grows each second after `from`."
        },
        {
          "name": "drift",
          "type": "f32",
          "default": "0.0",
          "docs": "Sideways drift: a quarter of it in pixels per second to the right, 0 stays; negative goes left."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "theme.motion.duration.base",
          "docs": "Seconds the image fades in over from `from`."
        }
      ],
      "methods": [
        {
          "signature": "fn at(&self, t: f32) -> (f32, f32)",
          "summary": "`(scale, center x)` at `t` seconds of the container."
        }
      ]
    },
    {
      "name": "Label",
      "summary": "One line of text whose box sits `buff` pixels from `(x, y)` in `direction`: `Top` puts it above the point, `TopRight` up and to the right, `Center` on it.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Label"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Label-68b0cfd5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/label.rs#L26",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The text, one line."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "X in pixels of the canvas of the point the text sits next to."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Y in pixels of the canvas of the point the text sits next to (y down)."
        },
        {
          "name": "direction",
          "type": "Anchor",
          "default": "Anchor::Right",
          "docs": "Which side of the point the text box sits on (`Top` above it, `TopRight` up and right, `Center` on it)."
        },
        {
          "name": "buff",
          "type": "f32",
          "default": "theme.spacing.sm",
          "docs": "Pixels between the point and the text's box."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn size(&self, ui: &Ui) -> (f32, f32)",
          "summary": "Width and height of the text's box, see `text_size`."
        },
        {
          "signature": "fn bounds(&self, ui: &Ui) -> Rect",
          "summary": "The box the text is drawn in, in pixels."
        }
      ]
    },
    {
      "name": "LabeledArrow",
      "summary": "An arrow with a label on it (Manim `LabeledArrow`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "LabeledArrow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LabeledArrow-dae523b8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/labeled.rs#L410",
      "themed": true,
      "fields": [
        {
          "name": "label",
          "type": "ShapeLabel",
          "default": "ShapeLabel::None",
          "docs": "Text or formula written with it; `ShapeLabel::None` for none."
        },
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length in pixels of each tip from its point back along the shaft; shortened to fit a short arrow."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width in pixels of each tip across the shaft."
        },
        {
          "name": "tip_start",
          "type": "Option<ArrowTip>",
          "default": "None",
          "docs": "The tip at the start; `None` for none."
        },
        {
          "name": "tip_end",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the end; `None` for none."
        },
        {
          "name": "label_position",
          "type": "f32",
          "default": "0.5",
          "docs": "Where along the line the label sits, 0 at the start to 1 at the end."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": null,
          "docs": "The label's font: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": null,
          "docs": "Colour of the label text."
        },
        {
          "name": "label_box",
          "type": "bool",
          "default": "true",
          "docs": "A box in the background colour behind the label, so the line does not cross it."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::arrow(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn path(&self) -> BezPath",
          "summary": "The line or arrow without its label."
        }
      ]
    },
    {
      "name": "LabeledDot",
      "summary": "A dot with a label inside (Manim `LabeledDot`). Without a `radius` it is `SMALL_BUFF` larger than half the label's longer side, as in Manim.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "LabeledDot"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LabeledDot-c6d48158.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/labeled.rs#L191",
      "themed": true,
      "fields": [
        {
          "name": "label",
          "type": "ShapeLabel",
          "default": "ShapeLabel::None",
          "docs": "The text or formula inside the dot; `ShapeLabel::None` for none."
        },
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Radius in pixels; `None` fits the label (half its longer side plus `SMALL_BUFF`)."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The label's font: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the label text."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Some(theme.colors.accent)",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "None",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": []
    },
    {
      "name": "LabeledLine",
      "summary": "A line with a label on it (Manim `LabeledLine`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "LabeledLine"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LabeledLine-45128fda.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/labeled.rs#L395",
      "themed": true,
      "fields": [
        {
          "name": "label",
          "type": "ShapeLabel",
          "default": "ShapeLabel::None",
          "docs": "Text or formula written with it; `ShapeLabel::None` for none."
        },
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "label_position",
          "type": "f32",
          "default": "0.5",
          "docs": "Where along the line the label sits, 0 at the start to 1 at the end."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": null,
          "docs": "The label's font: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": null,
          "docs": "Colour of the label text."
        },
        {
          "name": "label_box",
          "type": "bool",
          "default": "true",
          "docs": "A box in the background colour behind the label, so the line does not cross it."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn path(&self) -> BezPath",
          "summary": "The line or arrow without its label."
        }
      ]
    },
    {
      "name": "LabeledPolygram",
      "summary": "Closed polygons with a label where it fits best (Manim `LabeledPolygram`): at the point inside furthest from every edge, found to within `precision` pixels.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "LabeledPolygram"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LabeledPolygram-cf967e60.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/labeled.rs#L442",
      "themed": true,
      "fields": [
        {
          "name": "vertex_groups",
          "type": "Vec<Vec<(f32, f32)>>",
          "default": "Vec::new()",
          "docs": "One list of corner points `(x, y)` in pixels of the canvas per closed polygon."
        },
        {
          "name": "label",
          "type": "ShapeLabel",
          "default": "ShapeLabel::None",
          "docs": "The text or formula placed inside; `ShapeLabel::None` for none."
        },
        {
          "name": "precision",
          "type": "f32",
          "default": "1.0",
          "docs": "How closely in pixels the label point is found; smaller is exact but slower."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The label's font: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the label text."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "paint.fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "paint.stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "paint.stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn label_point(&self) -> Option<(f32, f32)>",
          "summary": "Where the label goes: the inside point furthest from the edges."
        }
      ]
    },
    {
      "name": "LaggedStart",
      "summary": "Starts each child `lag_ratio * run_time` seconds after the one before it (Manim's `LaggedStart`). Each child's time starts at its own start, so its enter animations run then; every child stays until the parent ends.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "LaggedStart"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LaggedStart-dca6adb5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/group.rs#L14",
      "themed": false,
      "fields": [
        {
          "name": "lag_ratio",
          "type": "f32",
          "default": null,
          "docs": "Fraction of `run_time` between two starts."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "The run time of one child's animation."
        },
        {
          "name": "children",
          "type": "Vec<Children>",
          "default": null,
          "docs": "One entry per child; each is a closure taking the `Ui`, started in order."
        }
      ],
      "methods": [
        {
          "signature": "fn map<T>(items: impl IntoIterator<Item = T>, f: impl Fn(&mut Ui, &T) -> Svgr) -> Self",
          "summary": "One child per item, drawn by `f` (Manim's `LaggedStartMap`), with Manim's lag ratio of 0.05 and children that run 1 second."
        }
      ]
    },
    {
      "name": "Leader",
      "summary": "A line from `from` to `to` with text at its end, on the side the line points to, and a dot on `from` when `dot` is above 0. The line draws with `enter` (`Create` from `from`), the text fades with `label_enter`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "Leader"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Leader-7e34df5d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/label.rs#L142",
      "themed": true,
      "fields": [
        {
          "name": "from",
          "type": "(f32, f32)",
          "default": "(0.0, 0.0)",
          "docs": "Where the line starts, `(x, y)` in pixels of the canvas; the dot sits here."
        },
        {
          "name": "to",
          "type": "(f32, f32)",
          "default": "(100.0, -60.0)",
          "docs": "Where the line ends and the text sits, `(x, y)` in pixels of the canvas."
        },
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The text at the end of the line."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the line and the dot."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dot",
          "type": "f32",
          "default": "6.0",
          "docs": "Radius of the dot on `from`, 0 for none."
        },
        {
          "name": "buff",
          "type": "f32",
          "default": "theme.spacing.xs",
          "docs": "Pixels between `to` and the text's box."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the line and dot appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the line and dot leave at the end of the container; `None` stays."
        },
        {
          "name": "label_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the text fades in; `None` shows it from the start."
        },
        {
          "name": "label_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the text fades out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn label(&self) -> Label",
          "summary": "The label at the end, placed on the side the line points to."
        }
      ]
    },
    {
      "name": "Letters",
      "summary": "A line of text drawn letter by letter, each letter with its own `LetterLook` from `look(index)`. `(x, y)` is the start of the baseline and `tracking` adds pixels after every letter. Letters at opacity 0 are left out. Without a measurable font the line is one `<text>` with the look of letter 0.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Letters"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Letters-ef6be6a5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/letters.rs#L38",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The line of text; each character is drawn on its own."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left of the first letter, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the letters."
        },
        {
          "name": "tracking",
          "type": "f32",
          "default": "0.0",
          "docs": "Extra pixels after every letter."
        },
        {
          "name": "look",
          "type": "Box<dyn Fn(usize) -> LetterLook>",
          "default": "Box::new(|_| LetterLook::default())",
          "docs": "Gives the `LetterLook` of letter `index`, counting from 0; letters at opacity 0 are not drawn."
        }
      ],
      "methods": []
    },
    {
      "name": "Levels",
      "summary": "Photoshop's levels on every colour channel: the `input` black and white points stretch to 0 and 1, `gamma` bends the mid tones (above 1 brighter), and the result lands between the `output` black and white points.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Levels"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Levels-c8d31b3e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L487",
      "themed": true,
      "fields": [
        {
          "name": "input",
          "type": "(f32, f32)",
          "default": "(0.08, 0.92)",
          "docs": "Black and white points of the input, 0 to 1; they stretch to 0 and 1."
        },
        {
          "name": "gamma",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.2)",
          "docs": "Mid-tone curve: above 1 brighter, below 1 darker, 1 unchanged."
        },
        {
          "name": "output",
          "type": "(f32, f32)",
          "default": "(0.0, 1.0)",
          "docs": "Black and white points of the result, 0 to 1; 0 and 1 stretch to them."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "LightLeak",
      "summary": "Light leaking into the camera, like Remotion's `<LightLeak>`: warm blobs of light flare up over the picture and fade out again within `length` seconds (the enclosing container's length when `None`), brightest at `opacity` in the middle. `seed` picks where the blobs are and how they drift, and `hue_shift` turns their colours round the colour wheel in degrees (180 for blue light). Drawn with radial gradients in screen blending, so it works on every backend; `size` is the area from the top left and `key` names the gradients when two leaks share a frame.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "LightLeak"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LightLeak-604ba946.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/light_leak.rs#L26",
      "themed": true,
      "fields": [
        {
          "name": "seed",
          "type": "u64",
          "default": "0",
          "docs": "Picks where the blobs sit and how they drift; the same seed gives the same leak."
        },
        {
          "name": "hue_shift",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the blob colours are turned round the colour wheel; 180 turns the warm light blue."
        },
        {
          "name": "length",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Seconds the leak takes to flare up and fade out, local to the parent container; `None` uses the container's length."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "0.85",
          "docs": "Peak opacity of the blobs, 0 transparent to 1 opaque, reached in the middle of the leak."
        },
        {
          "name": "size",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the leak covers from the top left, in pixels of the canvas."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the gradients when two leaks share a frame."
        }
      ],
      "methods": [
        {
          "signature": "fn flares(&self, progress: f32) -> Vec<Flare>",
          "summary": "The blobs at `progress` through the leak, 0 to 1. Each flares up and fades along a half sine from its own start, so they peak one after another."
        }
      ]
    },
    {
      "name": "LightTrail",
      "summary": "A streak of light trailing its children (Remotion's `lightTrail()`): copies of their silhouette in `color`, `distance` units long towards `direction` (degrees clockwise from the right, 180 to the left), each copy `decay` (0 to 1) as bright as the one before, added to the children at `intensity`. `samples` (1 to 64) sets how Remotion spaces the copies, so the falloff and brightness follow it; `threshold` (0 to 1) leaves out pixels less opaque than it. Drawn inside the `area` from the origin.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "LightTrail"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LightTrail-3821b46c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/light_leak.rs#L173",
      "themed": true,
      "fields": [
        {
          "name": "direction",
          "type": "f32",
          "default": "180.0",
          "docs": "Degrees clockwise from the right the trail points: 180 trails to the left."
        },
        {
          "name": "distance",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(80.0)",
          "docs": "Length of the trail in the children's user units; 0 or less draws none. Animatable."
        },
        {
          "name": "intensity",
          "type": "f32",
          "default": "1.0",
          "docs": "Brightness of the trail added to the children; 1 is Remotion's default, 0 draws none."
        },
        {
          "name": "decay",
          "type": "f32",
          "default": "0.9",
          "docs": "0 to 1: how bright each copy is compared with the one before it; lower fades faster."
        },
        {
          "name": "threshold",
          "type": "f32",
          "default": "0.0",
          "docs": "0 to 1: pixels less opaque than this leave no trail; 0 trails every pixel."
        },
        {
          "name": "samples",
          "type": "u32",
          "default": "32",
          "docs": "1 to 64: how Remotion spaces the copies; the falloff and brightness follow it."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Colour of the trail; its alpha scales the brightness."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the trail is drawn in from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that leaves the trail (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn gain(&self) -> f32",
          "summary": "How bright the trail of a solid silhouette is, before the colour's alpha: Remotion's sum of the sample weights over their count, times `intensity`."
        }
      ]
    },
    {
      "name": "Line",
      "summary": "A straight line from `(x1, y1)` to `(x2, y2)` (Manim `Line`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Line"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Line-054fadb6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L217",
      "themed": true,
      "fields": [
        {
          "name": "x1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y1",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "x2",
          "type": "f32",
          "default": "200.0",
          "docs": "End x in pixels of the canvas."
        },
        {
          "name": "y2",
          "type": "f32",
          "default": "0.0",
          "docs": "End y in pixels of the canvas (y down)."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "LinearGradient",
      "summary": "A gradient filling the area (Remotion's `linearGradient()`), from `start_color` at `start` to `end_color` at `end` (0 to 1 across the area). It replaces the layer, so it takes no children: put it inside a group with the layers it covers.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "LinearGradient"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LinearGradient-2ad8cad8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L763",
      "themed": true,
      "fields": [
        {
          "name": "start",
          "type": "(f32, f32)",
          "default": "(0.0, 0.5)",
          "docs": "Where the gradient starts, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "end",
          "type": "(f32, f32)",
          "default": "(1.0, 0.5)",
          "docs": "Where the gradient ends, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "start_color",
          "type": "Color",
          "default": "Color::BLACK",
          "docs": "Colour of the gradient at `start`, held before it."
        },
        {
          "name": "end_color",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Colour of the gradient at `end`, held after it."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the rectangle the gradient fills from the top left, in user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the gradient id when two gradients share a frame."
        }
      ],
      "methods": []
    },
    {
      "name": "LinearGradientTint",
      "summary": "Its children's colours pulled towards a gradient (Remotion's `linearGradientTint()`): the tint runs from `start_color` at `start` to `end_color` at `end` (0 to 1 across the area) and `amount` mixes it in, 0 unchanged and 1 the gradient's colours. The alpha stays. Drawn with an `feImage` of the gradient in a filter over the area.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "LinearGradientTint"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LinearGradientTint-4fac3238.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L689",
      "themed": true,
      "fields": [
        {
          "name": "start",
          "type": "(f32, f32)",
          "default": "(0.0, 0.5)",
          "docs": "Where the gradient starts, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "end",
          "type": "(f32, f32)",
          "default": "(1.0, 0.5)",
          "docs": "Where the gradient ends, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "start_color",
          "type": "Color",
          "default": "Color::BLACK",
          "docs": "Colour of the gradient at `start`, held before it."
        },
        {
          "name": "end_color",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Colour of the gradient at `end`, held after it."
        },
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.5)",
          "docs": "0 the children unchanged to 1 fully the gradient's colours; their alpha stays. Animatable."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the gradient covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is tinted (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "LinearProgressiveBlur",
      "summary": "Its children blurred more and more along a line (Remotion's `linearProgressiveBlur()`): `start_blur` at `start`, growing to `end_blur` at `end` (both 0 to 1 across the area), radii like Remotion's (a Gaussian of a third of them). Drawn as blurred copies under graded masks, one for every 6 units of radius and at most `MAX_BLUR_LEVELS`, so the children render up to nine times.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "LinearProgressiveBlur"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LinearProgressiveBlur-4b9a1d54.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/progressive_blur.rs#L157",
      "themed": true,
      "fields": [
        {
          "name": "start",
          "type": "(f32, f32)",
          "default": "(0.0, 0.5)",
          "docs": "Where the blur starts, as 0 to 1 fractions of `area` (x, y); it has `start_blur` there."
        },
        {
          "name": "end",
          "type": "(f32, f32)",
          "default": "(1.0, 0.5)",
          "docs": "Where the blur ends, as 0 to 1 fractions of `area` (x, y); it has `end_blur` there."
        },
        {
          "name": "start_blur",
          "type": "f32",
          "default": "0.0",
          "docs": "Blur radius at `start`, like Remotion's (a Gaussian of a third of it); 0 is sharp."
        },
        {
          "name": "end_blur",
          "type": "f32",
          "default": "50.0",
          "docs": "Blur radius at `end`, like Remotion's (a Gaussian of a third of it)."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the effect covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filters when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is blurred (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "LinearTransform",
      "summary": "A grid of lines and the two basis vectors moved by `matrix` (Manim's `LinearTransformationScene` with `ApplyMatrix`): from the identity to the matrix over `run_time` seconds after `delay`, over the untransformed grid drawn faintly. The grid has a line at every integer of `x_range` and `y_range`, in units of `ui.space` around `center`, and the moved grid is clipped to its box; `key` tells the clip paths of two transforms apart. With `show_matrix` the matrix is written at `matrix_at` (pixels).",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/linear-transform-and-vector-sum/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/linear-transform-and-vector-sum.md",
      "scenes": [
        "LinearTransform"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LinearTransform-9f8944ca.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/linear.rs#L46",
      "themed": true,
      "fields": [
        {
          "name": "matrix",
          "type": "Mat2",
          "default": "[[1.0, 1.0], [0.0, 1.0]]",
          "docs": "The 2x2 matrix to apply, row by row; its columns are where the basis vectors `i` and `j` end up."
        },
        {
          "name": "x_range",
          "type": "Range",
          "default": "Range::new(-4.0, 4.0, 1.0)",
          "docs": "The grid's x extent in units of `ui.space` from `center`, with a vertical line at every tick."
        },
        {
          "name": "y_range",
          "type": "Range",
          "default": "Range::new(-3.0, 3.0, 1.0)",
          "docs": "The grid's y extent in units of `ui.space` from `center`, with a horizontal line at every tick."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "Where the grid's origin sits, in units of `ui.space` (y up)."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the transformation begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "2.0",
          "docs": "Seconds the grid takes to move from the identity to `matrix`."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::default()",
          "docs": "Easing of the movement over its run time."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the moving grid lines; the untransformed grid is drawn faintly in the muted colour."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Grid line width in pixels."
        },
        {
          "name": "i_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the basis vector `i` (to `(1, 0)`)."
        },
        {
          "name": "j_color",
          "type": "Color",
          "default": "theme.colors.caption",
          "docs": "Colour of the basis vector `j` (to `(0, 1)`)."
        },
        {
          "name": "show_matrix",
          "type": "bool",
          "default": "true",
          "docs": "Writes `matrix` at `matrix_at` when `true`."
        },
        {
          "name": "matrix_at",
          "type": "(f32, f32)",
          "default": "(1600.0, 200.0)",
          "docs": "Where the written matrix sits, in pixels of the canvas."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the grids and the vectors appear."
        },
        {
          "name": "matrix_enter",
          "type": "Option<FadeIn>",
          "default": "Some(FadeIn::themed(theme))",
          "docs": "Fade in of the written matrix's entries; `None` shows them from the start."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip path when two transforms share a frame; `None` for the default."
        }
      ],
      "methods": []
    },
    {
      "name": "LinePlot",
      "summary": "A line through data points on axes (Manim `axes.plot_line_graph` without its dots; add a `ScatterPlot` for them). Straight segments, or a smooth curve with `smooth`. A point that is not finite breaks the line.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/math/plots/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/plots.md",
      "scenes": [
        "LinePlot"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LinePlot-61e02438.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/plot/line.rs#L8",
      "themed": true,
      "fields": [
        {
          "name": "points",
          "type": "Vec<(f64, f64)>",
          "default": "Vec::new()",
          "docs": "The `(x, y)` data points in data units of the axes; a point that is not finite breaks the line."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The mapping of the axes the line is drawn on (`axes.map(ui)`)."
        },
        {
          "name": "smooth",
          "type": "bool",
          "default": "false",
          "docs": "Draws a smooth curve through the points instead of straight segments."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Lines",
      "summary": "Stripes over its children (Remotion's `lines()`): bands `thickness` units wide in `colors` taken in turn, `gap` units of the children showing between them, running `direction`. `angle` turns them about the middle of the area in degrees and `offset` moves them across; with `mask_to_source_alpha` they cover only the opaque parts of the children (which then render twice).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Lines"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Lines-b86ae8e8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L492",
      "themed": true,
      "fields": [
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "PALE_BLUES.to_vec()",
          "docs": "Colours of the stripes, taken in turn; empty draws none."
        },
        {
          "name": "direction",
          "type": "LineDirection",
          "default": "LineDirection::Horizontal",
          "docs": "`Horizontal` stripes run left to right and stack downwards; `Vertical` ones run top to bottom."
        },
        {
          "name": "thickness",
          "type": "f32",
          "default": "40.0",
          "docs": "Width of each stripe in the children's user units; 0 draws none."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "0.0",
          "docs": "Width in user units of the children showing between stripes."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the stripes are turned about the middle of the area."
        },
        {
          "name": "offset",
          "type": "f32",
          "default": "0.0",
          "docs": "Moves the stripes across their direction, in user units."
        },
        {
          "name": "mask_to_source_alpha",
          "type": "bool",
          "default": "false",
          "docs": "`true` covers only the opaque parts of the children, which then render twice."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the stripes cover from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip and mask ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the stripes are laid over (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "LinkedList",
      "summary": "A linked list: each node a box with its value and a link cell, `node` by `height` pixels and `gap` apart, centred on `center` (units of `ui.space`). Links are arrows from the link cell to the next node; a link that points back to a node on the left dips under the nodes, and a node without a link shows a slash. It plays a `ListTrace`, one step every `step_time` seconds from `delay`: nodes slide to their places, new ones drop in, removed ones drop out, links fade as they change, and the pointers (`cur`, and `head` with `head`) sit above the nodes. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/linked-list-stack-and-queue/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/linked-list-stack-and-queue.md",
      "scenes": [
        "LinkedList"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LinkedList-0ecfdc0c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/list.rs#L464",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&ListTrace>",
          "default": "None",
          "docs": "The recorded steps to play (`ListTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the list, in units of `ui.space`."
        },
        {
          "name": "node",
          "type": "f32",
          "default": "120.0",
          "docs": "Width of a node in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "64.0",
          "docs": "Height of a node in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "60.0",
          "docs": "Space between neighbouring nodes in pixels, where the link arrows run."
        },
        {
          "name": "head",
          "type": "bool",
          "default": "true",
          "docs": "Whether the `head` pointer is shown above the first node."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the list."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the nodes in each state (visited, moved, found)."
        },
        {
          "name": "link_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the link arrows and the slash of a node without a link."
        },
        {
          "name": "pointer_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the pointer names (`cur`, `head`) above the nodes."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the values in the nodes."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the pointer names and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "LongShadows",
      "summary": "The alpha silhouette of its children turned into a solid shadow `length` units long towards `angle` (degrees clockwise from the right, 45 down and right), in `color` at `opacity` (Remotion's `longShadows()`): text and logos with long shadows, or a flat 3D extrusion. Drawn inside the `area` from the origin, so like Remotion the shadow stops at the canvas edge.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "LongShadows"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LongShadows-f59d54c0.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/edges.rs#L287",
      "themed": true,
      "fields": [
        {
          "name": "length",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(240.0)",
          "docs": "Length of the shadow in the children's user units; under 1 draws none, 255 or more is the practical limit. Animatable."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "45.0",
          "docs": "Degrees clockwise from the right the shadow points: 45 is down and right."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "Color::rgb(0x77, 0x77, 0x77)",
          "docs": "Colour of the shadow; its alpha multiplies `opacity`."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the shadow is drawn in from the top left, in the children's user units; it stops at the edge."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that casts the shadow, drawn on top of it (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Loop",
      "summary": "Repeats its children every `duration` seconds, `times` times or forever (`None`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades/",
      "markdown": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades.md",
      "scenes": [
        "Loop"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Loop-482b7757.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/time.rs#L110",
      "themed": true,
      "fields": [
        {
          "name": "duration",
          "type": "f32",
          "default": "1.0",
          "docs": "Seconds one repeat lasts."
        },
        {
          "name": "times",
          "type": "Option<usize>",
          "default": "None",
          "docs": "How many repeats before it stops showing; `None` for forever."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "What it repeats; a closure taking the `Ui` whose time restarts at 0 each repeat."
        }
      ],
      "methods": []
    },
    {
      "name": "LowerThird",
      "summary": "A name and a role next to an accent bar, the caption of a speaker. The bar grows first, then the name and the role slide in from behind it, `stagger` seconds apart, and all of it leaves in reverse order before the end of the container. `(x, y)` is the top left of the bar. With `background`, a plate as wide as the longer line sits behind the text (without a measurable font it is `min_width` wide).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "LowerThird"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/LowerThird-692ce2fb.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/lower_third.rs#L20",
      "themed": true,
      "fields": [
        {
          "name": "name",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The speaker's name, the larger first line."
        },
        {
          "name": "role",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The role or subtitle under the name; empty for none."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "96.0",
          "docs": "Left edge of the bar, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "820.0",
          "docs": "Top of the bar, in pixels of the canvas."
        },
        {
          "name": "name_style",
          "type": "TextStyle",
          "default": "theme.typography.heading",
          "docs": "The font of the name: family, size in pixels and weight."
        },
        {
          "name": "role_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the role: family, size in pixels and weight."
        },
        {
          "name": "name_fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the name."
        },
        {
          "name": "role_fill",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the role."
        },
        {
          "name": "bar",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the accent bar."
        },
        {
          "name": "bar_width",
          "type": "f32",
          "default": "6.0",
          "docs": "Width of the accent bar in pixels."
        },
        {
          "name": "background",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Colour of the plate behind the text; `None` for no plate."
        },
        {
          "name": "min_width",
          "type": "f32",
          "default": "400.0",
          "docs": "Least width in pixels of the text area on the plate, and its width when the font cannot be measured."
        },
        {
          "name": "padding",
          "type": "f32",
          "default": "theme.spacing.md",
          "docs": "Space between the bar and the text, and around the text on the plate."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the bar begins to grow."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "theme.motion.stagger.loose",
          "docs": "Seconds between the starts of the bar, the name and the role."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.enter",
          "docs": "Seconds each part takes to come in."
        },
        {
          "name": "exit",
          "type": "f32",
          "default": "theme.motion.duration.exit",
          "docs": "Seconds of the exit, which ends with the container; 0 never leaves."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.enter",
          "docs": "Easing of each part coming in."
        }
      ],
      "methods": [
        {
          "signature": "fn height(&self) -> f32",
          "summary": "Height of the bar: the two lines and the padding around them."
        }
      ]
    },
    {
      "name": "Lut",
      "summary": "A look-up table per colour channel: `red`, `green` and `blue` list the outputs for evenly spaced inputs from 0 to 1 (an empty list leaves the channel unchanged). An approximation of a LUT file: a `.cube` LUT maps colours in 3D, these tables map each channel on its own, so they hold curves and colour casts but not hue-dependent looks.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Lut"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Lut-a71bc74f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L539",
      "themed": true,
      "fields": [
        {
          "name": "red",
          "type": "&[f32]",
          "default": "&[0.05, 0.3, 0.62, 0.86, 1.0]",
          "docs": "Red outputs for evenly spaced inputs from 0 to 1; empty leaves red unchanged."
        },
        {
          "name": "green",
          "type": "&[f32]",
          "default": "&[0.02, 0.27, 0.56, 0.82, 0.97]",
          "docs": "Green outputs for evenly spaced inputs from 0 to 1; empty leaves green unchanged."
        },
        {
          "name": "blue",
          "type": "&[f32]",
          "default": "&[0.12, 0.3, 0.5, 0.72, 0.88]",
          "docs": "Blue outputs for evenly spaced inputs from 0 to 1; empty leaves blue unchanged."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "MagneticField",
      "summary": "Manim-physics' `MagneticField` in the page: on every grid point of `x_range` by `y_range` (units of `ui.space`) the field of `wires`. Where it lies mostly in the page it is an arrow `length(|B|)` units long, otherwise a circle `length(|B|)` units across with a dot (out of the page) or a cross (into it). Both are coloured by `|B|` from `colors[0]` at `min_magnitude` to the last colour at `max_magnitude`. Grid points closer than `clearance` units to a wire are left out. With `show_wires` a wire through the page is a disc with a dot or a cross, a segment is a thick line with an arrow along its current. `wires` is a plain prop, so the field follows wires computed from `ui.seconds()`. Everything fades with `enter` and `exit`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/electric-field-and-magnetic-field/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/electric-field-and-magnetic-field.md",
      "scenes": [
        "MagneticField"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MagneticField-84d64eef.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/magneto.rs#L89",
      "themed": true,
      "fields": [
        {
          "name": "wires",
          "type": "Vec<Wire>",
          "default": "Vec::new()",
          "docs": "The wires that make the field: a long wire through the page or a segment in it, each with a current."
        },
        {
          "name": "x_range",
          "type": "Range",
          "default": "Range::new(-7.0, 7.0, 0.5)",
          "docs": "Grid columns: `x` from min to max in steps, in units of `ui.space`."
        },
        {
          "name": "y_range",
          "type": "Range",
          "default": "Range::new(-4.0, 4.0, 0.5)",
          "docs": "Grid rows: `y` from min to max in steps, in units of `ui.space`."
        },
        {
          "name": "length",
          "type": "fn(f64) -> f64",
          "default": "sigmoid_length",
          "docs": "Size in units of `ui.space` of an arrow, or of the circle for a field out of or into the page, for a field of magnitude `|B|`."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "vec![theme.colors.muted, theme.colors.accent, theme.colors.highlight]",
          "docs": "Colour ramp: the first colour at `min_magnitude`, the last at `max_magnitude`."
        },
        {
          "name": "min_magnitude",
          "type": "f64",
          "default": "0.0",
          "docs": "Field magnitude that gets the first colour of `colors`."
        },
        {
          "name": "max_magnitude",
          "type": "f64",
          "default": "0.5",
          "docs": "Field magnitude that gets the last colour of `colors`."
        },
        {
          "name": "clearance",
          "type": "f64",
          "default": "0.3",
          "docs": "Grid points closer than this to a wire, in units of `ui.space`, get no mark."
        },
        {
          "name": "show_wires",
          "type": "bool",
          "default": "true",
          "docs": "Draws the wires: a disc with a dot or a cross for a wire through the page, a thick line with an arrow for a segment."
        },
        {
          "name": "wire_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the wires."
        },
        {
          "name": "wire_radius",
          "type": "f32",
          "default": "22.0",
          "docs": "Radius in pixels of the disc of a wire through the page."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the arrows and rings in pixels; wires are drawn three times as thick."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn at(&self, x: f64, y: f64) -> (f64, f64, f64)",
          "summary": "The field at `(x, y)`, see `magnetic_field`."
        }
      ]
    },
    {
      "name": "MarkupText",
      "summary": "Manim's `MarkupText`: one line with Pango-style tags, `\"a <b>bold</b> <span foreground='#ff5500'>word</span>\"`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "MarkupText"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MarkupText-f498668c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/markup.rs#L29",
      "themed": true,
      "fields": [
        {
          "name": "markup",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The text with Pango-style tags: `<b>`, `<i>`, `<u>` and `<span>`."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Position of the text's anchor point, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.heading",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the text outside any `<span>` colour."
        },
        {
          "name": "anchor",
          "type": "TextAnchor",
          "default": "TextAnchor::Start",
          "docs": "Which point of the text sits at `x`: start, middle or end."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": []
    },
    {
      "name": "MathTable",
      "summary": "A `Table` of typeset formulas (Manim `MathTable`), typeset beforehand with a `latex::TexEngine` like any `MathTex`. `size` is the height in pixels of 10 pt text, as in `FormulaView`; `table` gives the labels, place, lines and animations.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "MathTable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MathTable-280de55b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/typed_table.rs#L224",
      "themed": true,
      "fields": [
        {
          "name": "formulas",
          "type": "Vec<Vec<&Formula>>",
          "default": "Vec::new()",
          "docs": "The typeset formulas row by row, each centered in its cell."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "40.0",
          "docs": "Height in pixels of 10 pt text, as in `FormulaView`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the formulas."
        },
        {
          "name": "table",
          "type": "Table",
          "default": "Table::themed(theme)",
          "docs": "The table that gives the labels, place, lines and animations."
        }
      ],
      "methods": [
        {
          "signature": "fn to_mobject_table(&self, ui: &mut Ui) -> MobjectTable",
          "summary": "The `MobjectTable` it draws: every formula centered on the origin."
        }
      ]
    },
    {
      "name": "Matrix",
      "summary": "Entries in rows and columns between square brackets (Manim `Matrix`), centered on `(x, y)`. The brackets draw with `enter` (`Create`), the entries fade with `entries_enter`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "Matrix"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Matrix-bb87808c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/matrix.rs#L20",
      "themed": true,
      "fields": [
        {
          "name": "entries",
          "type": "Vec<Vec<Cow<str>>>",
          "default": "Vec::new()",
          "docs": "Row by row; a shorter row is padded with empty entries."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "960.0",
          "docs": "Horizontal middle of the matrix in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "540.0",
          "docs": "Vertical middle of the matrix in pixels of the canvas."
        },
        {
          "name": "buff",
          "type": "(f32, f32)",
          "default": "(theme.spacing.xl, theme.spacing.lg + theme.spacing.md)",
          "docs": "Pixels between the columns and between the rows (Manim `h_buff`, `v_buff`)."
        },
        {
          "name": "bracket_buff",
          "type": "f32",
          "default": "theme.spacing.lg",
          "docs": "Pixels between the entries and the brackets (Manim `bracket_h_buff`)."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the entries: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the entries."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "The brackets' colour."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the brackets in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the brackets appear (`Create`, ..); `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the brackets leave at the end of their container; `None` stays."
        },
        {
          "name": "entries_enter",
          "type": "Option<FadeIn>",
          "default": "Some(FadeIn::themed(theme))",
          "docs": "Fade the entries in at the start; `None` shows them from the start."
        },
        {
          "name": "entries_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade the entries out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn cell(&self, ui: &Ui, row: usize, column: usize) -> Option<Rect>",
          "summary": "The area of entry `(row, column)`, half the gaps around it (Manim `get_entries`), to put a highlight behind it. `None` outside the matrix."
        },
        {
          "signature": "fn bounds(&self, ui: &Ui) -> Option<Rect>",
          "summary": "The box around the brackets, to place what comes next to the matrix. `None` for a matrix without entries."
        }
      ]
    },
    {
      "name": "MatrixView",
      "summary": "The product of two matrices worked out entry by entry: `a`, `b` and `a b` side by side around `(x, y)`, with `×` and `=` between them. From `delay`, every `step` seconds the next entry of the product is written, row by row, while its row of `a` and column of `b` are highlighted; entries and highlights fade in over a third of a step. After the last entry the highlights fade out. Entries are written with at most `decimals` decimals.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/matrix-view/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/matrix-view.md",
      "scenes": [
        "MatrixView"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MatrixView-b12c4ce8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/matrix_view.rs#L27",
      "themed": true,
      "fields": [
        {
          "name": "a",
          "type": "Vec<Vec<f64>>",
          "default": "vec![vec![1.0, 2.0], vec![3.0, 4.0]]",
          "docs": "The left matrix, as rows of entries."
        },
        {
          "name": "b",
          "type": "Vec<Vec<f64>>",
          "default": "vec![vec![5.0, 6.0], vec![7.0, 8.0]]",
          "docs": "The right matrix, as rows of entries; its row count must equal the column count of `a`, otherwise nothing is drawn."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "960.0",
          "docs": "Horizontal middle of the three matrices, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "540.0",
          "docs": "Vertical middle of the matrices, in pixels of the canvas."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "theme.spacing.lg",
          "docs": "Pixels between the matrices and the signs."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.5",
          "docs": "Seconds after the container's start before the first entry is worked out."
        },
        {
          "name": "step",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each entry of the product takes; its row and column highlight meanwhile."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "2",
          "docs": "Most digits after the decimal point of the written entries."
        },
        {
          "name": "highlight",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the highlight on the current row of `a` and column of `b`."
        },
        {
          "name": "result_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the entries of the product."
        },
        {
          "name": "matrices_enter",
          "type": "Option<FadeIn>",
          "default": "Some(FadeIn::themed(theme))",
          "docs": "Fade in of the matrices; `None` shows them from the start."
        }
      ],
      "methods": []
    },
    {
      "name": "McmcChain",
      "summary": "A random-walk Metropolis-Hastings chain sampling the equal mixture of the normal distributions in `target` (`ManimML`'s MCMC scenes). It starts at `origin` and proposes steps drawn from a normal distribution `proposal` wide; a step is accepted with the probability `min(1, p(to) / p(from))`. The chain is the same for the same `seed`. With `run` it plays one step after another over the run's duration from its start: accepted moves extend the path in `accepted_color`, rejected proposals inside the axes stay as hollow marks in `rejected_color`, and the current state is a dot. On `axes`.",
      "feature": "ml",
      "page": "https://fframes-kit.pages.dev/docs/machine-learning/normal-distributions-and-mcmc/",
      "markdown": "https://fframes-kit.pages.dev/docs/machine-learning/normal-distributions-and-mcmc.md",
      "scenes": [
        "McmcChain"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/McmcChain-122955ac.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/ml/probability.rs#L298",
      "themed": true,
      "fields": [
        {
          "name": "target",
          "type": "Vec<Gaussian2D>",
          "default": "vec![Gaussian2D::default()]",
          "docs": "The normal distributions whose equal mixture the chain samples."
        },
        {
          "name": "origin",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The state the chain starts at, in data units of `axes`."
        },
        {
          "name": "proposal",
          "type": "f64",
          "default": "0.6",
          "docs": "Standard deviation of the random step proposed each time, in data units."
        },
        {
          "name": "steps",
          "type": "usize",
          "default": "60",
          "docs": "Number of steps (proposals) in the whole chain."
        },
        {
          "name": "seed",
          "type": "u64",
          "default": "1",
          "docs": "Seed of the chain; the same seed gives the same chain on every frame and machine."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The axes to draw on, mapping data values to the canvas."
        },
        {
          "name": "run",
          "type": "Option<ChainRun>",
          "default": "None",
          "docs": "When the steps play, and over how long; `None` shows the whole chain at once."
        },
        {
          "name": "accepted_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the path of accepted moves and of the current state dot."
        },
        {
          "name": "rejected_color",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "Colour of the hollow marks for rejected proposals."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "2.5",
          "docs": "Width in pixels of the path and the rejected marks."
        },
        {
          "name": "point_radius",
          "type": "f32",
          "default": "6.0",
          "docs": "Radius in pixels of the current state dot."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn chain(&self) -> Vec<McmcStep>",
          "summary": "The steps of the chain."
        }
      ]
    },
    {
      "name": "Mirror",
      "summary": "Its children reflected about a line (Remotion's `mirror()`): the part past `position` (0 to 1 across the area; the right, or the bottom with `MirrorDirection::Vertical`) shows the other side mirrored, or the other way round with `invert`. Where the mirrored side reaches past the area, Remotion stretches the edge pixels; here it stays transparent. The children render twice.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "EffectMirror"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/EffectMirror-e4a2a152.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/geometry.rs#L38",
      "themed": true,
      "fields": [
        {
          "name": "direction",
          "type": "MirrorDirection",
          "default": "MirrorDirection::Horizontal",
          "docs": "`Horizontal` reflects about a vertical line (left and right match), `Vertical` about a horizontal line."
        },
        {
          "name": "position",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.5)",
          "docs": "Where the mirror line is, 0 to 1 across the area (from the left, or from the top for `Vertical`). Animatable."
        },
        {
          "name": "invert",
          "type": "bool",
          "default": "false",
          "docs": "`false` keeps the near side and mirrors it onto the far side; `true` does the opposite."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the effect covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask and clip ids when two mirrors share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is mirrored (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "MitosisStages",
      "summary": "Mitosis: a cell `size` pixels from its centre to its side, centred on `center` (units of `ui.space`), going through the stages of `MitosisStage::ALL` from `delay`, each `stage_time` seconds long. In interphase its `chromosomes` lie loose in the nucleus; in prophase they condense into sister chromatids joined at the centromere, the nuclear envelope breaks down and the centrosomes move to the poles; in metaphase spindle fibres line them up in the middle; in anaphase the sisters are pulled to opposite poles; in telophase two nuclei form around them; in cytokinesis the cell pinches into two. Chromosomes come in homologous pairs of one length, coloured from `colors` by parent; where each lies in interphase comes from `seed`. With `label` the stage is named above.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/mitosis-stages/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/mitosis-stages.md",
      "scenes": [
        "MitosisStages"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MitosisStages-7898a7d8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/mitosis.rs#L125",
      "themed": true,
      "fields": [
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before interphase begins."
        },
        {
          "name": "stage_time",
          "type": "f32",
          "default": "1.6",
          "docs": "Seconds each stage lasts."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, -0.3)",
          "docs": "The middle of the cell, in units of `ui.space`."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "300.0",
          "docs": "Pixels from the cell's centre to its side (half the width)."
        },
        {
          "name": "chromosomes",
          "type": "usize",
          "default": "4",
          "docs": "Number of chromosomes in the cell; they come in homologous pairs of one length."
        },
        {
          "name": "arm",
          "type": "f32",
          "default": "30.0",
          "docs": "Pixels of the longest chromatid arm; the other pairs are shorter."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "vec![Color::hex(\"#ff8787\"), Color::hex(\"#74c0fc\")]",
          "docs": "Colours of the chromosomes by parent, alternating along the list; empty uses the palette's membrane colour."
        },
        {
          "name": "seed",
          "type": "u64",
          "default": "3",
          "docs": "Seed for where the chromosomes lie loose in interphase; the same seed gives the same layout."
        },
        {
          "name": "palette",
          "type": "CellPalette",
          "default": "CellPalette::default()",
          "docs": "Colours of the cytoplasm, membrane, nucleus and the other cell parts."
        },
        {
          "name": "spindle_color",
          "type": "Color",
          "default": "Color::hex(\"#ced4da\")",
          "docs": "Colour of the spindle fibres, asters and centrosomes."
        },
        {
          "name": "label",
          "type": "bool",
          "default": "true",
          "docs": "Names the current stage above the cell when `true`."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the stage name: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the stage name."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn stage_at(&self, seconds: f32) -> MitosisStage",
          "summary": "The stage shown `seconds` into the video."
        }
      ]
    },
    {
      "name": "MobjectMatrix",
      "summary": "A `Matrix` whose entries are drawn `Mobject`s (Manim `MobjectMatrix`), each in the middle of its cell; a column is as wide as its widest entry. `matrix` gives the place, gaps, brackets and animations; its `entries` are not used.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "MobjectMatrix"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MobjectMatrix-dae438d2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/typed_matrix.rs#L188",
      "themed": true,
      "fields": [
        {
          "name": "entries",
          "type": "Vec<Vec<Mobject>>",
          "default": "Vec::new()",
          "docs": "The drawn entries row by row, each in the middle of its cell; a shorter row is padded with empty ones."
        },
        {
          "name": "matrix",
          "type": "Matrix",
          "default": "Matrix::themed(theme)",
          "docs": "The matrix that gives the place, gaps, brackets and animations; its `entries` are not used."
        }
      ],
      "methods": [
        {
          "signature": "fn cell(&self, row: usize, column: usize) -> Option<Rect>",
          "summary": "The area of entry `(row, column)`, half the gaps around it. `None` outside the matrix."
        }
      ]
    },
    {
      "name": "MobjectTable",
      "summary": "A `Table` whose body cells are drawn `Mobject`s (Manim `MobjectTable`), each in the middle of its cell; the labels stay text. `table` gives the labels, place, lines and animations; its `rows` are not used.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "MobjectTable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MobjectTable-184f08f3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/typed_table.rs#L119",
      "themed": true,
      "fields": [
        {
          "name": "entries",
          "type": "Vec<Vec<Mobject>>",
          "default": "Vec::new()",
          "docs": "The drawn body cells row by row, each in the middle of its cell."
        },
        {
          "name": "table",
          "type": "Table",
          "default": "Table::themed(theme)",
          "docs": "The table that gives the labels, place, lines and animations; its `rows` are not used."
        }
      ],
      "methods": [
        {
          "signature": "fn cell(&self, ui: &Ui, row: usize, column: usize) -> Option<Rect>",
          "summary": "The area of body cell `(row, column)` between its lines. `None` outside the table."
        }
      ]
    },
    {
      "name": "Molecule",
      "summary": "A skeletal formula from a SMILES string (`\"CC(=O)O\"`), laid out by `chematic` and drawn like `Molecule2D`. The layout is computed once per string and kept for the rest of the process; an invalid string draws nothing (check it with `Structure::from_smiles`).",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/molecule-2d-and-molecule/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/molecule-2d-and-molecule.md",
      "scenes": [
        "Molecule"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Molecule-8a0c6a67.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/molecule.rs#L305",
      "themed": true,
      "fields": [
        {
          "name": "smiles",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"c1ccccc1\")",
          "docs": "The molecule as a SMILES string (`\"CC(=O)O\"`); an invalid string draws nothing."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "m.center",
          "docs": "The middle of the molecule's coordinates, in units of `ui.space`."
        },
        {
          "name": "bond_length",
          "type": "f32",
          "default": "m.bond_length",
          "docs": "Pixels per bond length of the laid-out structure."
        },
        {
          "name": "show_hydrogens",
          "type": "bool",
          "default": "m.show_hydrogens",
          "docs": "Writes the hydrogens and charge after a heteroatom's symbol (`OH`, `NH2`); `false` writes the symbol alone."
        },
        {
          "name": "color_atoms",
          "type": "bool",
          "default": "m.color_atoms",
          "docs": "Colours the labels of oxygen, nitrogen, sulfur, phosphorus and the halogens; `false` uses `bond_color` for all."
        },
        {
          "name": "bond_color",
          "type": "Color",
          "default": "m.bond_color",
          "docs": "Colour of the bonds, and of the labels of carbon and of every atom when `color_atoms` is `false`."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "m.stroke_width",
          "docs": "Width in pixels of the bond lines."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the bonds draw on; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the bonds leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the atom labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the atom labels before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Molecule2D",
      "summary": "A skeletal formula: the bonds of `structure` `bond_length` pixels long around `center` (units of `ui.space`), double bonds in rings drawn inside the ring, and the labels of the atoms that are not carbons, with their hydrogens and charges (`show_hydrogens`). The bonds draw on in order with `enter` (`Create` draws them one after the other), the labels with `parts_enter`. With `color_atoms` oxygen, nitrogen, sulfur, phosphorus and the halogens get their own colours. Without `structure` nothing is drawn.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/molecule-2d-and-molecule/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/molecule-2d-and-molecule.md",
      "scenes": [
        "Molecule2D"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Molecule2D-65056ef5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/molecule.rs#L242",
      "themed": true,
      "fields": [
        {
          "name": "structure",
          "type": "Option<&Structure>",
          "default": "None",
          "docs": "The molecule to draw (from SMILES, a molfile or built by hand); `None` draws nothing."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the molecule's coordinates, in units of `ui.space`."
        },
        {
          "name": "bond_length",
          "type": "f32",
          "default": "70.0",
          "docs": "Pixels per bond length of the structure's coordinates."
        },
        {
          "name": "show_hydrogens",
          "type": "bool",
          "default": "true",
          "docs": "Writes the hydrogens and charge after a heteroatom's symbol (`OH`, `NH2`); `false` writes the symbol alone."
        },
        {
          "name": "color_atoms",
          "type": "bool",
          "default": "true",
          "docs": "Colours the labels of oxygen, nitrogen, sulfur, phosphorus and the halogens; `false` uses `bond_color` for all."
        },
        {
          "name": "bond_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the bonds, and of the labels of carbon and of every atom when `color_atoms` is `false`."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width in pixels of the bond lines."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the bonds draw on; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the bonds leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the atom labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the atom labels before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Molecule3D",
      "summary": "A `Structure3D` as balls and sticks in CPK colours, rendered in 3D into a `width` x `height` pixel image around `center` (units of `ui.space`). The molecule turns `spin` degrees a second around the vertical axis, seen from `elevation` degrees above. The bonds listed in `highlight` (indices into `bonds`) turn `highlight_color` and glow over half a second from `highlight_at`. The image fades with `enter` and `exit`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/molecule-3d-and-orbital/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/molecule-3d-and-orbital.md",
      "scenes": [
        "Molecule3D"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Molecule3D-a4f2bf9a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/molecule_3d.rs#L186",
      "themed": true,
      "fields": [
        {
          "name": "structure",
          "type": "Option<&Structure3D>",
          "default": "None",
          "docs": "The atoms and bonds to draw, in ångström; `None` draws nothing."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the image, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "900.0",
          "docs": "Width in pixels of the rendered image."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "640.0",
          "docs": "Height in pixels of the rendered image."
        },
        {
          "name": "spin",
          "type": "f32",
          "default": "30.0",
          "docs": "Degrees per second the molecule turns around the vertical axis; 0 holds it still."
        },
        {
          "name": "azimuth",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the view starts turned around the vertical axis, before `spin` adds to it."
        },
        {
          "name": "elevation",
          "type": "f32",
          "default": "20.0",
          "docs": "Degrees the view looks down from above the molecule; 0 is level with it."
        },
        {
          "name": "highlight",
          "type": "Vec<usize>",
          "default": "Vec::new()",
          "docs": "Indices into the structure's `bonds` that turn `highlight_color` and glow; empty for none."
        },
        {
          "name": "highlight_at",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start when the highlight begins (it takes half a second)."
        },
        {
          "name": "bond_color",
          "type": "Color",
          "default": "Color::hex(\"#bfbfbf\")",
          "docs": "Colour of the bond sticks."
        },
        {
          "name": "highlight_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour the highlighted bonds turn to and glow in."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "MovingCamera",
      "summary": "The canvas seen through a camera frame (Manim's `MovingCameraScene`): `center` and `width` in units of `ui.space` say which part of the canvas fills the picture, `width` of `full_frame_width` showing it all. Both follow an `Anim`, so the camera can pan and zoom; `auto_zoom` gives the frame around some boxes. The children draw in canvas pixels as always.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "MovingCamera"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MovingCamera-56e6678e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/camera.rs#L44",
      "themed": false,
      "fields": [
        {
          "name": "center",
          "type": "Anim<(f32, f32)>",
          "default": null,
          "docs": "The point of the canvas at the middle of the picture, in units of `ui.space`; an `Anim` pans the camera."
        },
        {
          "name": "width",
          "type": "Anim<f32>",
          "default": null,
          "docs": "Width of the canvas shown, in units of `ui.space`; smaller zooms in, `full_frame_width` shows it all. An `Anim` zooms the camera."
        },
        {
          "name": "children",
          "type": "Children",
          "default": null,
          "docs": "What the camera looks at (a closure taking the `Ui`), drawn in canvas pixels."
        }
      ],
      "methods": [
        {
          "signature": "fn view(space: Space, center: (f32, f32), width: f32) -> Affine",
          "summary": "The map from canvas pixels to the picture for a frame at `center` `width` units wide."
        }
      ]
    },
    {
      "name": "MultiPendulum",
      "summary": "Manim-physics' `MultiPendulum` drawn: the chain of `motion` hanging from `pivot` (units of `ui.space`, `scale` units per meter), swinging from `delay` seconds after the local start. With `trail` the last bob leaves a trail like `TracedPath`, the last `trail_time` seconds of it (all of it with `None`). The ceiling draws with `enter`; the rods, bobs and trail fade with `parts_enter`. Without `motion` nothing is drawn.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/multi-pendulum/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/multi-pendulum.md",
      "scenes": [
        "MultiPendulum"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/MultiPendulum-77cd4fbd.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/multi_pendulum.rs#L159",
      "themed": true,
      "fields": [
        {
          "name": "motion",
          "type": "Option<&MultiPendulumMotion>",
          "default": "None",
          "docs": "The simulated chain to draw, built once in the video's constructor; `None` draws nothing."
        },
        {
          "name": "pivot",
          "type": "(f64, f64)",
          "default": "(0.0, 2.5)",
          "docs": "Where the first rod hangs from, in units of `ui.space`."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the chain is released."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "bob_radius",
          "type": "f32",
          "default": "18.0",
          "docs": "Radius of the bobs in pixels."
        },
        {
          "name": "trail",
          "type": "bool",
          "default": "true",
          "docs": "Leaves a trail behind the last bob."
        },
        {
          "name": "trail_time",
          "type": "Option<f32>",
          "default": "Some(3.0)",
          "docs": "Seconds of the trail that stay visible; `None` keeps all of it."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the rods, the pivot and the ceiling."
        },
        {
          "name": "bob_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the bobs."
        },
        {
          "name": "trail_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the trail."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the rods, the ceiling and the trail in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the ceiling draws in; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the ceiling leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the rods, bobs and trail fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the rods, bobs and trail fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "NamedMolecule",
      "summary": "A molecule by its common name (manim-chemistry's `NamedMolecule`), looked up in a table of about a hundred common molecules (`named_molecules`) and drawn like `Molecule`. Nothing is looked up over the network. A name that is not in the table draws nothing, and `inspect` warns about it.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/named-molecule/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/named-molecule.md",
      "scenes": [
        "NamedMolecule"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/NamedMolecule-3749f452.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/named.rs#L209",
      "themed": true,
      "fields": [
        {
          "name": "name",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"caffeine\")",
          "docs": "Common name of the molecule (`\"caffeine\"`, `\"glucose\"`); case, hyphens and underscores do not matter. A name not in the table draws nothing."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "m.center",
          "docs": "The middle of the molecule's coordinates, in units of `ui.space`."
        },
        {
          "name": "bond_length",
          "type": "f32",
          "default": "m.bond_length",
          "docs": "Pixels per bond length of the laid-out structure."
        },
        {
          "name": "show_hydrogens",
          "type": "bool",
          "default": "m.show_hydrogens",
          "docs": "Writes the hydrogens and charge after a heteroatom's symbol (`OH`, `NH2`); `false` writes the symbol alone."
        },
        {
          "name": "color_atoms",
          "type": "bool",
          "default": "m.color_atoms",
          "docs": "Colours the labels of oxygen, nitrogen, sulfur, phosphorus and the halogens; `false` uses `bond_color` for all."
        },
        {
          "name": "bond_color",
          "type": "Color",
          "default": "m.bond_color",
          "docs": "Colour of the bonds, and of the labels of carbon and of every atom when `color_atoms` is `false`."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "m.stroke_width",
          "docs": "Width in pixels of the bond lines."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the bonds draw on; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the bonds leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the atom labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the atom labels before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "NeuralNetwork",
      "summary": "A neural network as `ManimML` draws it: `layers` from left to right around `center` (units of `ui.space`), `spacing` pixels between neighbouring layers, each pair joined by the connection of its kind. Feed-forward layers are columns of neurons `node_radius` pixels round and `node_spacing` apart, with their activation function plotted above them. With `forward_pass` pulses run through the connections layer by layer and light the neurons as they arrive. `dropout` crosses out some hidden neurons for a while, and `changes` insert, remove and replace layers one after the other; a forward pass and a change should not run at the same time.",
      "feature": "ml",
      "page": "https://fframes-kit.pages.dev/docs/machine-learning/neural-network/",
      "markdown": "https://fframes-kit.pages.dev/docs/machine-learning/neural-network.md",
      "scenes": [
        "NeuralNetwork"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/NeuralNetwork-3afc7b13.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/ml/network.rs#L44",
      "themed": true,
      "fields": [
        {
          "name": "layers",
          "type": "Vec<Layer>",
          "default": null,
          "docs": "The layers from left to right; each neighbouring pair is joined by the connection of its kind."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the network, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "160.0",
          "docs": "Pixels between neighbouring layers."
        },
        {
          "name": "node_radius",
          "type": "f32",
          "default": "16.0",
          "docs": "Radius in pixels of a neuron."
        },
        {
          "name": "node_spacing",
          "type": "f32",
          "default": "52.0",
          "docs": "Pixels between neighbouring neurons of a feed-forward layer."
        },
        {
          "name": "cell",
          "type": "f32",
          "default": "14.0",
          "docs": "Size in pixels of one cell of a feature map or image."
        },
        {
          "name": "forward_pass",
          "type": "Option<ForwardPass>",
          "default": "None",
          "docs": "Pulses that run through the connections layer by layer and light the neurons; `None` for none."
        },
        {
          "name": "dropout",
          "type": "Option<Dropout>",
          "default": "None",
          "docs": "Crosses out some hidden neurons for a while; `None` for none."
        },
        {
          "name": "changes",
          "type": "Vec<TimedChange>",
          "default": "Vec::new()",
          "docs": "Layers inserted, removed or replaced one after the other over time; empty for none."
        },
        {
          "name": "node_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the neuron and layer outlines and of the text."
        },
        {
          "name": "node_fill",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Fill colour inside the neurons and boxes."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the connection lines."
        },
        {
          "name": "pulse_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the forward pass pulses and the neurons they light."
        },
        {
          "name": "positive_color",
          "type": "Color",
          "default": "Color::hex(\"#69db7c\")",
          "docs": "The outline of a positive example of a paired query or a triplet."
        },
        {
          "name": "negative_color",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "The outline of a negative example."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "2.5",
          "docs": "Width in pixels of the outlines and connection lines."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn layout_at(&self, middle: Point) -> Vec<LayerGeometry>",
          "summary": "Where every layer goes with the middle of the network at `middle`, in pixels: the layers as given, before any of `changes`."
        },
        {
          "signature": "fn layout(&self, ui: &Ui) -> Vec<LayerGeometry>",
          "summary": "Where every layer goes, in pixels, before any of `changes`."
        }
      ]
    },
    {
      "name": "Neuron",
      "summary": "A neuron lying across the frame, `length` pixels from its dendrites to its axon terminals, centred on `center` (units of `ui.space`): dendrites branching from the cell body, the axon wrapped in myelin with nodes of Ranvier between the segments, and the axon terminals. It grows in from `delay`, soma first; with `labels` each part is then named above or below it. At each time in `impulses` the cell body fires and the impulse jumps from node to node along the axon (`speed` pixels a second) to the terminals, which release neurotransmitter. The dendrites are placed from `seed`.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/neuron/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/neuron.md",
      "scenes": [
        "Neuron"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Neuron-233362a6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/neuron.rs#L145",
      "themed": true,
      "fields": [
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the neuron begins to grow; `impulses` are not shifted by it."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, -0.2)",
          "docs": "The middle of the neuron, in units of `ui.space`."
        },
        {
          "name": "length",
          "type": "f32",
          "default": "1320.0",
          "docs": "Pixels from the dendrite tips to the axon terminals."
        },
        {
          "name": "impulses",
          "type": "Vec<f32>",
          "default": "vec![4.6, 6.6]",
          "docs": "Times in seconds, from the container's start, when the cell body fires an impulse; empty for none."
        },
        {
          "name": "speed",
          "type": "f32",
          "default": "700.0",
          "docs": "Speed of the impulse along the axon, in pixels per second."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Names each part above or below it when `true`."
        },
        {
          "name": "seed",
          "type": "u64",
          "default": "5",
          "docs": "Seed for the shape of the dendrites and terminals; the same seed gives the same neuron."
        },
        {
          "name": "body_color",
          "type": "Color",
          "default": "Color::hex(\"#4dabf7\")",
          "docs": "Fill of the cell body, dendrites and axon."
        },
        {
          "name": "nucleus_color",
          "type": "Color",
          "default": "Color::hex(\"#1c4a7a\")",
          "docs": "Fill of the nucleus in the cell body."
        },
        {
          "name": "myelin_color",
          "type": "Color",
          "default": "Color::hex(\"#ffd8a8\")",
          "docs": "Fill of the myelin sheath segments."
        },
        {
          "name": "impulse_color",
          "type": "Color",
          "default": "Color::hex(\"#ffe066\")",
          "docs": "Colour of the travelling impulse and the released neurotransmitter."
        },
        {
          "name": "leader_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the leader lines and the dots that mark each named part."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the part names."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the part names: family, size in pixels and weight."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Noise",
      "summary": "Film grain over a `size` area from the top left: grey `feTurbulence` noise at `opacity`, drawn by every backend. `frequency` is the noise's base frequency (higher is finer) and `octaves` its detail. The same `seed` gives the same grain; with `animated` the seed moves on every frame so the grain flickers like film. `key` names the filter when two noises share a frame.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Noise"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Noise-bdf404ff.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/noise.rs#L17",
      "themed": true,
      "fields": [
        {
          "name": "seed",
          "type": "u32",
          "default": "0",
          "docs": "Seeds the grain; the same seed draws the same grain."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "0.12",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "frequency",
          "type": "f32",
          "default": "0.8",
          "docs": "Base frequency of the noise: higher is finer grain."
        },
        {
          "name": "octaves",
          "type": "u32",
          "default": "2",
          "docs": "Layers of detail added to the noise; more is richer and slower."
        },
        {
          "name": "animated",
          "type": "bool",
          "default": "true",
          "docs": "`true` moves the seed on every frame so the grain flickers like film; `false` keeps it still."
        },
        {
          "name": "size",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the grain area from the top left, in pixels of the canvas."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two noises share a frame."
        }
      ],
      "methods": [
        {
          "signature": "fn seed_at(&self, index: usize) -> u32",
          "summary": "The turbulence seed at local frame `index`."
        }
      ]
    },
    {
      "name": "NormalFit",
      "summary": "Samples stacking up into a histogram, then the normal curve that fits them (Manim's central limit theorem scenes). The first `shown` samples (a `ValueTracker`, so they can pour in) are binned into `bins` bars over `range` as a density, no taller than the top of the y range. The curve has the mean and spread of the samples shown so far and draws with `curve_enter` (a delayed `Create`); with `stats` the mean and standard deviation are written at `stats_at` (pixels).",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/normal-fit/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/normal-fit.md",
      "scenes": [
        "NormalFit"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/NormalFit-076344e4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/normal.rs#L65",
      "themed": true,
      "fields": [
        {
          "name": "samples",
          "type": "&[f64]",
          "default": "&[]",
          "docs": "The sample values to bin; only the first `shown` of them count."
        },
        {
          "name": "shown",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "How many of the samples are shown so far; a tracker, so they can pour in over time."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The axes (an `AxesMap`) the bars and the curve sit on; the bars are no taller than the top of its y range."
        },
        {
          "name": "range",
          "type": "(f64, f64)",
          "default": "(-3.0, 3.0)",
          "docs": "The values `(min, max)` the bars cover, in the axes' x units."
        },
        {
          "name": "bins",
          "type": "usize",
          "default": "24",
          "docs": "Number of bars the range is cut into; the bar heights are a density."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Fill of the bars."
        },
        {
          "name": "curve_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the fitted normal curve."
        },
        {
          "name": "curve_width",
          "type": "f32",
          "default": "theme.stroke.thick",
          "docs": "Width of the curve in pixels."
        },
        {
          "name": "curve_enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the curve appears; `None` shows it from the start."
        },
        {
          "name": "stats",
          "type": "bool",
          "default": "true",
          "docs": "Writes the mean and standard deviation of the samples shown at `stats_at` when `true`."
        },
        {
          "name": "stats_at",
          "type": "(f32, f32)",
          "default": "(1500.0, 300.0)",
          "docs": "Where the statistics are written, in pixels of the canvas."
        },
        {
          "name": "stats_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the statistics; `None` shows them from the start."
        }
      ],
      "methods": []
    },
    {
      "name": "NumberLine",
      "summary": "A horizontal number line (Manim `NumberLine`): `range` spread over `length` units centered on `center`, with ticks at every step and the `numbers` written below them. `NumberLine::unit_interval` is Manim's `UnitInterval`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "NumberLine"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/NumberLine-bfc8cc7b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/axes.rs#L257",
      "themed": true,
      "fields": [
        {
          "name": "range",
          "type": "Range",
          "default": "Range::new(-8.0, 8.0, 1.0)",
          "docs": "In axis units, see `Scaling`."
        },
        {
          "name": "scaling",
          "type": "Scaling",
          "default": "Scaling::Linear",
          "docs": "How values are spread along the line: `Linear` or `LogBase`; `range` is then in axis units (exponents)."
        },
        {
          "name": "length",
          "type": "f64",
          "default": "12.0",
          "docs": "Length in units of `ui.space`."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the line, in units of `ui.space`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the line, its tip and its ticks."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the line and the ticks in pixels."
        },
        {
          "name": "tips",
          "type": "bool",
          "default": "false",
          "docs": "Arrow tip at the right end."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length of the arrow tip in pixels."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width of the arrow tip in pixels."
        },
        {
          "name": "include_ticks",
          "type": "bool",
          "default": "true",
          "docs": "Draws a tick at every step of `range`."
        },
        {
          "name": "tick_size",
          "type": "f32",
          "default": "10.0",
          "docs": "Half the length of a tick, in pixels."
        },
        {
          "name": "numbers",
          "type": "Vec<f64>",
          "default": "Vec::new()",
          "docs": "Values written below their ticks (Manim `numbers_to_include`)."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "0",
          "docs": "Digits after the decimal point of the written numbers."
        },
        {
          "name": "number_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the numbers: family, size in pixels and weight."
        },
        {
          "name": "number_fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the numbers."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the line and its ticks appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the line and its ticks leave at the end of their container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played on the line while it is shown."
        },
        {
          "name": "numbers_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the numbers appear and go; the line itself uses `enter` and `exit`."
        },
        {
          "name": "numbers_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade the numbers out before the end of the container; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn unit_interval(t: &Theme) -> Self",
          "summary": "Manim's `UnitInterval`: 0 to 1 in tenths, 10 units long, 0, 0.5 and 1 written."
        },
        {
          "signature": "fn n2p_in(&self, space: Space, x: f64) -> Point",
          "summary": "The pixel of the number `x` in `space` (Manim `number_to_point`, `n2p`)."
        },
        {
          "signature": "fn n2p(&self, ui: &Ui, x: f64) -> (f32, f32)",
          "summary": "The pixel of the number `x` in `ui.space`."
        },
        {
          "signature": "fn p2n(&self, ui: &Ui, px: f32) -> f64",
          "summary": "The number at the pixel column `px` (Manim `point_to_number`, `p2n`)."
        },
        {
          "signature": "fn p2n_in(&self, space: Space, px: f64) -> f64",
          "summary": "The number at the pixel column `px` in `space`."
        }
      ]
    },
    {
      "name": "NumberPlane",
      "summary": "Axes over a grid of lines at every tick (Manim `NumberPlane`), filling Manim's whole frame by default. `faded_line_ratio` 2 adds a fainter line between two grid lines, 3 two of them.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "NumberPlane"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/NumberPlane-17523024.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/axes.rs#L797",
      "themed": true,
      "fields": [
        {
          "name": "axes",
          "type": "Axes",
          "default": null,
          "docs": "The axes drawn over the grid; they set the ranges, size, numbers and labels, and the grid lines follow their ticks."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the grid lines."
        },
        {
          "name": "line_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the grid lines in pixels."
        },
        {
          "name": "line_opacity",
          "type": "f32",
          "default": "0.45",
          "docs": "0 transparent to 1 opaque, for the grid lines at the ticks."
        },
        {
          "name": "faded_line_ratio",
          "type": "usize",
          "default": "1",
          "docs": "Grid lines per tick step: 1 draws none between ticks, 2 adds one fainter line between two ticks, 3 adds two."
        },
        {
          "name": "faded_opacity",
          "type": "f32",
          "default": "0.18",
          "docs": "0 transparent to 1 opaque, for the fainter lines between ticks."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the grid appears and goes; the axes use their own `enter` and `exit`."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the grid leaves at the end of its container; `None` stays."
        }
      ],
      "methods": []
    },
    {
      "name": "NumberPoint",
      "summary": "A dot on a number line at `value`, with `label` above it (Manim's `Dot(line.n2p(x))` with a `ValueTracker`). With `decimals` the value is written after the label: `label: \"x = \"` and `decimals: Some(1)` write `x = 2.5`. The line is drawn separately.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/number-point-and-interval/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/number-point-and-interval.md",
      "scenes": [
        "NumberPoint"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/NumberPoint-5d659dc0.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/number_line.rs#L21",
      "themed": true,
      "fields": [
        {
          "name": "line",
          "type": "NumberLine",
          "default": "NumberLine::themed(theme)",
          "docs": "The number line the dot sits on; it only maps numbers to points and is not drawn by this component."
        },
        {
          "name": "value",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "The number on `line` the dot marks; a tracker, so it can slide along the line."
        },
        {
          "name": "label",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "Text written above the dot; empty for none."
        },
        {
          "name": "decimals",
          "type": "Option<usize>",
          "default": "None",
          "docs": "Digits after the decimal point of the value written after the label; `None` writes the label only."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "12.0",
          "docs": "Radius of the dot in pixels."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Fill of the dot."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the label: family, size in pixels and weight."
        },
        {
          "name": "label_fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the label."
        },
        {
          "name": "buff",
          "type": "f32",
          "default": "theme.spacing.md",
          "docs": "Pixels between the dot and the label."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "OpticalBench",
      "summary": "Manim-physics' `Lens` and `Ray` on one axis: `lenses` on a horizontal axis at height `axis_y` from `x_range.0` to `x_range.1` (units of `ui.space`), and `rays` traced through them to `x_range.1`. With `focal_points` each lens's front and back focal points are dots labelled `F` and `F'`, found by tracing a parallel ray through the lens, so for a thick lens they sit at its focal distances from its surfaces, not from its middle. The rays draw on one after another from `delay` seconds after the local start (`ray_time` each, `stagger` apart). The axis and lenses draw with `enter`, the rays and labels with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/optical-bench-lens-and-ray/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/optical-bench-lens-and-ray.md",
      "scenes": [
        "OpticalBench"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/OpticalBench-a036ca3a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/lens.rs#L356",
      "themed": true,
      "fields": [
        {
          "name": "lenses",
          "type": "Vec<Lens>",
          "default": "Vec::new()",
          "docs": "The lenses on the axis, each with its position and shape."
        },
        {
          "name": "rays",
          "type": "Vec<Ray>",
          "default": "Vec::new()",
          "docs": "The rays traced through the lenses to the right end of `x_range`."
        },
        {
          "name": "axis_y",
          "type": "f64",
          "default": "0.0",
          "docs": "Height of the horizontal axis, in units of `ui.space`."
        },
        {
          "name": "x_range",
          "type": "(f64, f64)",
          "default": "(-7.0, 7.0)",
          "docs": "Left and right ends of the axis in units of `ui.space`; rays are traced up to the right end."
        },
        {
          "name": "focal_points",
          "type": "bool",
          "default": "true",
          "docs": "Marks each lens's front and back focal points with a dot."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes `F` and `F'` under the focal points."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the first ray begins to draw."
        },
        {
          "name": "ray_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each ray takes to draw."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.25",
          "docs": "Seconds between the start of one ray and the next."
        },
        {
          "name": "lens_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the lenses, the focal points and their labels."
        },
        {
          "name": "ray_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the rays."
        },
        {
          "name": "guide_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed axis."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the lens outlines in pixels; rays use the theme's thin width."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the axis and lenses draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the axis and lenses leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the rays and labels fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the rays and labels fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Orbit",
      "summary": "A planet on a Kepler orbit around a star at `focus` (units of `ui.space`): an ellipse of `semi_major` units and `eccentricity` with its closest point (perihelion) to the right of the star, gone around counterclockwise once every `period` seconds. `start` is where the planet is when its clock starts, as a fraction of the period after the perihelion. The planet is fast near the star and slow far from it. With `sweeps`, the first orbit shades that many sectors from the star, each swept in the same `sweep` fraction of the period, at even times around the orbit: Kepler's second law, equal areas in equal times. The orbit and the star draw with `enter`, the planet and the sectors with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/orbit/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/orbit.md",
      "scenes": [
        "Orbit"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Orbit-40f988b2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/orbit.rs#L28",
      "themed": true,
      "fields": [
        {
          "name": "focus",
          "type": "(f64, f64)",
          "default": "(1.5, 0.0)",
          "docs": "Where the star sits, one focus of the ellipse, in units of `ui.space`."
        },
        {
          "name": "semi_major",
          "type": "f64",
          "default": "3.5",
          "docs": "Half the long axis of the ellipse in units of `ui.space`."
        },
        {
          "name": "eccentricity",
          "type": "f64",
          "default": "0.6",
          "docs": "How stretched the ellipse is: 0 is a circle, close to 1 a thin ellipse."
        },
        {
          "name": "period",
          "type": "f64",
          "default": "5.0",
          "docs": "Seconds the planet takes for one orbit."
        },
        {
          "name": "start",
          "type": "f64",
          "default": "0.0",
          "docs": "Where the planet is when its clock starts, as a fraction of the period after the closest point to the star."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the planet starts to move."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "sweeps",
          "type": "usize",
          "default": "3",
          "docs": "Number of shaded sectors, swept at even times around the first orbit; 0 for none."
        },
        {
          "name": "sweep",
          "type": "f64",
          "default": "0.1",
          "docs": "Fraction of the period each sector takes to sweep, so each covers the same area."
        },
        {
          "name": "star_radius",
          "type": "f32",
          "default": "24.0",
          "docs": "Radius of the star in pixels."
        },
        {
          "name": "planet_radius",
          "type": "f32",
          "default": "13.0",
          "docs": "Radius of the planet in pixels."
        },
        {
          "name": "orbit_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed orbit ellipse."
        },
        {
          "name": "star_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the star."
        },
        {
          "name": "planet_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the planet."
        },
        {
          "name": "sweep_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the shaded sectors."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the orbit ellipse in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the orbit and the star draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the orbit and the star leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the planet and the sectors fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the planet and the sectors fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn semi_minor(&self) -> f64",
          "summary": "The semi-minor axis, `a √(1 - e²)`."
        },
        {
          "signature": "fn position(&self, t: f64) -> (f64, f64)",
          "summary": "The planet's offset from the star in units after `t` seconds of its clock."
        },
        {
          "signature": "fn sweep_start(&self, i: usize) -> f64",
          "summary": "Seconds of the planet's clock when sector `i` of `Orbit::sweeps` starts."
        }
      ]
    },
    {
      "name": "Orbital",
      "summary": "An atomic orbital in 3D, rendered into a `width` x `height` pixel image around `center` (units of `ui.space`): lobes of `size` (scene units, the axes reach 1.3 times as far) in `positive` and `negative` for the sign of the wave function, `d_z²` with its ring. The lobes grow and fade in over `grow` seconds from `delay`, then the view turns `spin` degrees a second seen from `elevation` degrees above. `axes` draws and labels x, y and z, and `label` names the orbital under the image.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/molecule-3d-and-orbital/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/molecule-3d-and-orbital.md",
      "scenes": [
        "Orbital"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Orbital-b811e60b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/orbital.rs#L95",
      "themed": true,
      "fields": [
        {
          "name": "kind",
          "type": "OrbitalKind",
          "default": "OrbitalKind::default()",
          "docs": "Which orbital: the `s`, `p` or `d` shape drawn."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the image, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "420.0",
          "docs": "Width in pixels of the rendered image."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "420.0",
          "docs": "Height in pixels of the rendered image."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "1.0",
          "docs": "Length of a lobe in scene units; the axes reach 1.3 times as far."
        },
        {
          "name": "positive",
          "type": "Color",
          "default": "Color::hex(\"#4dabf7\")",
          "docs": "Colour of the lobes where the wave function is positive."
        },
        {
          "name": "negative",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "Colour of the lobes where the wave function is negative."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "0.85",
          "docs": "0 transparent to 1 opaque, of the lobes once grown."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the lobes begin to grow and the view begins to turn."
        },
        {
          "name": "grow",
          "type": "f32",
          "default": "1.0",
          "docs": "Seconds the lobes take to grow and fade in."
        },
        {
          "name": "spin",
          "type": "f32",
          "default": "20.0",
          "docs": "Degrees per second the view turns around the vertical axis once `delay` has passed; 0 holds it still."
        },
        {
          "name": "azimuth",
          "type": "f32",
          "default": "30.0",
          "docs": "Degrees the view starts turned around the vertical axis, before `spin` adds to it."
        },
        {
          "name": "elevation",
          "type": "f32",
          "default": "20.0",
          "docs": "Degrees the view looks down from above the orbital; 0 is level with it."
        },
        {
          "name": "axes",
          "type": "bool",
          "default": "true",
          "docs": "Draws and labels the x, y and z axes; `false` for none."
        },
        {
          "name": "axis_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the axes and their letters."
        },
        {
          "name": "label",
          "type": "bool",
          "default": "true",
          "docs": "Writes the orbital's name under the image; `false` for none."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the name under the image."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Outline",
      "summary": "A solid outline `width` units wide around the opaque parts of its children (Remotion's `outline()`), in `color` at `opacity`. With `outline_only` the children are replaced by the filled silhouette in the outline colour. The filter region grows a tenth of the children's box on every side; wider outlines are cut there.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Outline"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Outline-76899f3c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/edges.rs#L34",
      "themed": true,
      "fields": [
        {
          "name": "width",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(8.0)",
          "docs": "Outline width in the children's user units. Animatable; the region grows a tenth of the box, so wider outlines are cut."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Colour of the outline; its alpha multiplies `opacity`."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "outline_only",
          "type": "bool",
          "default": "false",
          "docs": "`true` replaces the children with their silhouette filled in the outline colour; `false` draws the outline behind them."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Paper",
      "summary": "Paper texture on its children (Remotion's `paper()`): fibres, crumples, fine roughness and `fold_count` creases make a relief lit from the top right, which shades the picture and tints it between `color_back` (in the shade) and `color_front`, mixed in by `amount`. `contrast` is the strength of the light, `fiber`, `crumples`, `roughness` and `folds` the strength of each part and `fiber_size`, `crumple_size` their sizes, all relative to `scale` (the texture is `scale` times the area's height across five units). `seed` picks the texture and the creases.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Paper"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Paper-bc7e00c3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/textures.rs#L570",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 the children unchanged to 1 fully paper. Animatable."
        },
        {
          "name": "color_front",
          "type": "Color",
          "default": "Color::hex(\"#9fadbc\")",
          "docs": "Tint of the lit parts of the paper."
        },
        {
          "name": "color_back",
          "type": "Color",
          "default": "Color::WHITE",
          "docs": "Tint of the shaded parts of the paper."
        },
        {
          "name": "contrast",
          "type": "f32",
          "default": "0.3",
          "docs": "0 to 1 strength of the light that shades the relief."
        },
        {
          "name": "roughness",
          "type": "f32",
          "default": "0.4",
          "docs": "0 to 1 strength of the fine grain."
        },
        {
          "name": "fiber",
          "type": "f32",
          "default": "0.3",
          "docs": "0 to 1 strength of the fibres."
        },
        {
          "name": "fiber_size",
          "type": "f32",
          "default": "0.2",
          "docs": "Size of the fibres relative to `scale`."
        },
        {
          "name": "crumples",
          "type": "f32",
          "default": "0.3",
          "docs": "0 to 1 strength of the crumples."
        },
        {
          "name": "crumple_size",
          "type": "f32",
          "default": "0.35",
          "docs": "Size of the crumples relative to `scale`."
        },
        {
          "name": "folds",
          "type": "f32",
          "default": "0.65",
          "docs": "0 to 1 strength of the creases."
        },
        {
          "name": "fold_count",
          "type": "u32",
          "default": "5",
          "docs": "Number of creases; at most 64."
        },
        {
          "name": "seed",
          "type": "u32",
          "default": "6",
          "docs": "Picks the texture and where the creases lie."
        },
        {
          "name": "scale",
          "type": "f32",
          "default": "0.6",
          "docs": "Size of the texture: `scale` times the area's height spans five units."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the paper covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter and gradient ids when two papers share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is printed on paper (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Paragraph",
      "summary": "Text wrapped into lines of at most `width` pixels (`Frame::text_break_lines`), aligned inside that width. `(x, y)` is the start of the first baseline; lines are `style.line_height` apart and `\\n` starts a new one. Without a measurable font it is one unwrapped line.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Paragraph"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Paragraph-41491469.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/paragraph.rs#L18",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The words; `\\n` starts a new line."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left edge of the wrap box in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the first line in pixels of the canvas; later lines go below by the line height."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "800.0",
          "docs": "Width in pixels the text wraps into; lines are aligned inside it."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font: family, size in pixels, weight and line height."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the text."
        },
        {
          "name": "align",
          "type": "TextAlign",
          "default": "TextAlign::Left",
          "docs": "How the lines sit inside `width`: left, center or right."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": []
    },
    {
      "name": "ParametricFunction",
      "summary": "The curve `t -> f(t)` for `t` from `t_range.0` to `t_range.1` (Manim `ParametricFunction`), in data units of `axes` when set, otherwise in units of `space`. Build one with `ParametricFunction::new` to take `ui.space`, or with `Axes::plot_parametric`. Its samples are cached.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "ParametricFunction"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ParametricFunction-d3e584c4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/graph.rs#L203",
      "themed": true,
      "fields": [
        {
          "name": "f",
          "type": "Curve",
          "default": "|t| (theme.cos(), theme.sin())",
          "docs": "The curve `t -> (x, y)`; a plain `fn`. Its points are in data units of `axes` when set, otherwise in units of `space`."
        },
        {
          "name": "t_range",
          "type": "(f64, f64)",
          "default": "(0.0, std::f64::consts::TAU)",
          "docs": "The first and last `t` plotted."
        },
        {
          "name": "axes",
          "type": "Option<AxesMap>",
          "default": "None",
          "docs": "Axes whose data units the curve is in; `None` takes units of `space`."
        },
        {
          "name": "space",
          "type": "Space",
          "default": "Space::FULL_HD",
          "docs": "The coordinate system in units of which the curve is drawn when `axes` is `None`."
        },
        {
          "name": "samples",
          "type": "usize",
          "default": "256",
          "docs": "Number of straight pieces the sampled curve has before smoothing."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        },
        {
          "signature": "fn new(ui: &Ui, f: Curve, t_range: (f64, f64)) -> Self",
          "summary": "The curve of `f` over `t_range` in `ui.space`, with the theme's paint."
        },
        {
          "signature": "fn point(&self, t: f64) -> (f32, f32)",
          "summary": "The pixel of the curve at `t`."
        }
      ]
    },
    {
      "name": "Pattern",
      "summary": "Its children repeated in a grid of small copies (Remotion's `pattern()`). The copies are the children cut to `crop` (left, top, right and bottom insets in units) and scaled by `scale`, `gap_x` and `gap_y` units apart. The grid starts at `origin` moved by `offset_u`, `offset_v` (0 to 1 across the area). Each row is moved right by `row_offset` units more than the one above, starting over every `row_offset_every` rows (0 never), and each column down by `column_offset` units the same way; without `wrap` only the tiles right of and below the origin are drawn. It replaces the children, transparent between the tiles. The children render once and are reused with `<use>`, at most `MAX_TILES` times.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Pattern"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Pattern-aab8989b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/textures.rs#L45",
      "themed": true,
      "fields": [
        {
          "name": "scale",
          "type": "f32",
          "default": "0.1",
          "docs": "Size of each copy as a share of the cropped children; 0.1 makes copies a tenth as wide and tall. Smaller scales are drawn larger once they would pass `MAX_TILES` copies."
        },
        {
          "name": "crop",
          "type": "(f32, f32, f32, f32)",
          "default": "(0.0, 0.0, 0.0, 0.0)",
          "docs": "`(left, top, right, bottom)` insets in the children's user units that are cut off before copying."
        },
        {
          "name": "gap_x",
          "type": "f32",
          "default": "0.0",
          "docs": "Width in user units between copies side by side."
        },
        {
          "name": "gap_y",
          "type": "f32",
          "default": "0.0",
          "docs": "Height in user units between copies above each other."
        },
        {
          "name": "offset_u",
          "type": "f32",
          "default": "0.0",
          "docs": "Horizontal shift of the grid start as a 0 to 1 fraction of the area's width, added to `origin`."
        },
        {
          "name": "offset_v",
          "type": "f32",
          "default": "0.0",
          "docs": "Vertical shift of the grid start as a 0 to 1 fraction of the area's height, added to `origin`."
        },
        {
          "name": "row_offset",
          "type": "f32",
          "default": "0.0",
          "docs": "User units each row moves right more than the one above, restarting every `row_offset_every` rows."
        },
        {
          "name": "row_offset_every",
          "type": "u32",
          "default": "0",
          "docs": "Rows after which `row_offset` starts over; 0 never restarts it."
        },
        {
          "name": "column_offset",
          "type": "f32",
          "default": "0.0",
          "docs": "User units each column moves down more than the one before, restarting every `column_offset_every` columns."
        },
        {
          "name": "column_offset_every",
          "type": "u32",
          "default": "0",
          "docs": "Columns after which `column_offset` starts over; 0 never restarts it."
        },
        {
          "name": "origin",
          "type": "(f32, f32)",
          "default": "(0.0, 0.0)",
          "docs": "Where the grid starts, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "wrap",
          "type": "bool",
          "default": "true",
          "docs": "`true` fills the whole area; `false` draws only the copies right of and below the origin."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the copies fill from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip and tile ids when two patterns share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is copied (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn tiles(&self) -> (f32, Vec<(f32, f32)>)",
          "summary": "The scale the tiles are drawn at and the top left corner of every tile that reaches into the area."
        }
      ]
    },
    {
      "name": "Pendulum",
      "summary": "A pendulum hanging from `pivot` (units of `ui.space`, `scale` units per meter) that swings as `motion` says, from `delay` seconds after the local start. With `arc` the swing's reach is a dashed arc, with `angle_label` the angle from the vertical is written next to the pivot. The ceiling and the arc draw with `enter`, the rod and bob fade with `parts_enter`. Without `motion` nothing is drawn.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/pendulum-and-energy-bars/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/pendulum-and-energy-bars.md",
      "scenes": [
        "Pendulum"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Pendulum-7c44d7d4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/pendulum.rs#L92",
      "themed": true,
      "fields": [
        {
          "name": "motion",
          "type": "Option<&PendulumMotion>",
          "default": "None",
          "docs": "The simulated swing to draw, built once in the video's constructor; `None` draws nothing."
        },
        {
          "name": "pivot",
          "type": "(f64, f64)",
          "default": "(0.0, 2.5)",
          "docs": "Where the rod hangs from, in units of `ui.space`."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the pendulum is released."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "bob_radius",
          "type": "f32",
          "default": "28.0",
          "docs": "Radius of the bob in pixels."
        },
        {
          "name": "arc",
          "type": "bool",
          "default": "true",
          "docs": "Draws the reach of the swing as a dashed arc."
        },
        {
          "name": "angle_label",
          "type": "bool",
          "default": "true",
          "docs": "Writes the angle from the vertical, in degrees, beside the pivot."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the rod, the pivot, the ceiling and the angle label."
        },
        {
          "name": "bob_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the bob."
        },
        {
          "name": "guide_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed arc, the rest line and the angle arc."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the rod and the ceiling in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the ceiling and the arc draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the ceiling and the arc leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the rod and bob fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the rod and bob fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "PeriodicTable",
      "summary": "The periodic table: 118 tiles `cell` pixels wide, `gap` apart, centred at `center` (units of `ui.space`), the lanthanides and actinides in two rows under it. After `delay` the tiles rise in by atomic number, `stagger` seconds apart. From `highlight_at` the tiles outside group `highlight_group` (1 to 18) and outside `highlight_category` dim to `dim`. From `trend_at` a sweep runs left to right over `sweep` seconds and recolours the tiles by `trend`, from `low_color` to `high_color` (tiles without a value turn `muted`), and with `labels` a legend under the table gives the range.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/element-tile-and-periodic-table/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/element-tile-and-periodic-table.md",
      "scenes": [
        "PeriodicTable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PeriodicTable-0d28bd3d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/periodic.rs#L241",
      "themed": true,
      "fields": [
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the table, in units of `ui.space`."
        },
        {
          "name": "cell",
          "type": "f32",
          "default": "78.0",
          "docs": "Width and height in pixels of one tile."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "6.0",
          "docs": "Pixels between neighbouring tiles."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first tile rises in."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.01",
          "docs": "Seconds between one tile's rise and the next, by atomic number."
        },
        {
          "name": "highlight_group",
          "type": "Option<u32>",
          "default": "None",
          "docs": "Group (1 to 18) whose tiles stay bright while the others dim; `None` for no group."
        },
        {
          "name": "highlight_category",
          "type": "Option<Category>",
          "default": "None",
          "docs": "Category whose tiles stay bright while the others dim; `None` for no category."
        },
        {
          "name": "highlight_at",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start when the dimming begins."
        },
        {
          "name": "dim",
          "type": "f32",
          "default": "0.2",
          "docs": "Opacity from 0 to 1 that tiles outside the highlight fall to."
        },
        {
          "name": "trend",
          "type": "Option<Trend>",
          "default": "None",
          "docs": "Property the sweep recolours the tiles by, such as electronegativity; `None` for no sweep."
        },
        {
          "name": "trend_at",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start when the sweep begins."
        },
        {
          "name": "sweep",
          "type": "f32",
          "default": "1.2",
          "docs": "Seconds the recolouring takes to cross the table from left to right."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Draws a legend under the table giving the trend's range; `false` for none."
        },
        {
          "name": "low_color",
          "type": "Color",
          "default": "Color::hex(\"#4dabf7\")",
          "docs": "Colour of the lowest trend value."
        },
        {
          "name": "high_color",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "Colour of the highest trend value."
        },
        {
          "name": "muted",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of tiles that have no value for the trend."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the numbers, names and weights on the tiles."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn tile_center(&self, ui: &Ui, number: u32) -> Option<Point>",
          "summary": "The middle of element `number`'s tile, in pixels."
        }
      ]
    },
    {
      "name": "PhaseFlow",
      "summary": "Lets every point of the shape flow along the field `function(x, y) -> (dx, dy)` for `virtual_time` time units by the end (Manim's `PhaseFlow`), in the units of `ui.space`. The flow takes at most `PHASE_FLOW_STEPS` Runge-Kutta steps per point and frame.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "PhaseFlow"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PhaseFlow-8b3bd0aa.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/homotopy.rs#L184",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape whose points move; drawn unchanged before `delay`."
        },
        {
          "name": "function",
          "type": "fn(f64, f64) -> (f64, f64)",
          "default": null,
          "docs": "The vector field: gives the velocity `(dx, dy)` at `(x, y)`, in units of `ui.space` per time unit."
        },
        {
          "name": "virtual_time",
          "type": "f32",
          "default": null,
          "docs": "Time units of flow reached by the end of the run (1.0 is one unit of the field's time)."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape, function: fn(f64, f64) -> (f64, f64)) -> Self",
          "summary": "One time unit in 1 second, linear, like Manim."
        },
        {
          "signature": "fn flow(&self, x: f64, y: f64, time: f64) -> (f64, f64)",
          "summary": "Where the point `(x, y)` has flowed after `time` time units."
        }
      ]
    },
    {
      "name": "PhotoFrame",
      "summary": "An image of the video's media in a stroked frame with rounded corners; the image is clipped to the frame and covers it (`xMidYMid slice`). A missing image draws the frame alone. `key` names the clip path when two frames are drawn in one frame.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "PhotoFrame"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PhotoFrame-f3aea3e1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/decor/photo_frame.rs#L13",
      "themed": true,
      "fields": [
        {
          "name": "image",
          "type": "&str",
          "default": "\"\"",
          "docs": "Name of the image in the video's media; empty or missing draws the frame alone."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip path when two frames share a frame; `None` for none."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left edge of the frame in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Top edge of the frame in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "480.0",
          "docs": "Width of the frame in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "320.0",
          "docs": "Height of the frame in pixels."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "theme.radius.card",
          "docs": "Corner radius of the frame and the image clip in pixels."
        },
        {
          "name": "stroke",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the frame outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "12.0",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": []
    },
    {
      "name": "PhScale",
      "summary": "The pH scale as a bar of 15 cells in the colours of universal indicator, `width` by `height` pixels around `center` (units of `ui.space`). With `labels` the values sit under the cells and \"acidic\", \"neutral\" and \"basic\" under them. Each of `markers` (a name and its pH) points at its place above the bar; after `delay` they appear `stagger` seconds apart, in two rows so neighbours do not collide. A `pointer` marks a pH on the bar, for a value that changes. The cells draw with `enter`, the rest fades with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/titration-curve-and-ph-scale/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/titration-curve-and-ph-scale.md",
      "scenes": [
        "PhScale"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PhScale-0ffbee3f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/titration.rs#L313",
      "themed": true,
      "fields": [
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the bar, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1350.0",
          "docs": "Width of the bar in pixels, shared equally between the 15 cells."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "70.0",
          "docs": "Height of the bar in pixels."
        },
        {
          "name": "markers",
          "type": "Vec<(Cow<str>, f64)>",
          "default": "Vec::new()",
          "docs": "Names and their pH, each pointing at its place above the bar; empty for none."
        },
        {
          "name": "pointer",
          "type": "Option<f64>",
          "default": "None",
          "docs": "A pH to point at on the bar, for a value that changes; `None` for no pointer."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first marker appears."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.4",
          "docs": "Seconds between one marker appearing and the next."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the pH values under the cells and \"acidic\", \"neutral\" and \"basic\" under them; `false` for none."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the labels and marker names."
        },
        {
          "name": "pointer_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the pointer."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the cells draw; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the cells leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the labels, markers and pointer; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the labels, markers and pointer before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn point(&self, ui: &Ui, ph: f64) -> Point",
          "summary": "The pixel on the middle line of the bar at `ph`, the whole values at the cells' middles."
        }
      ]
    },
    {
      "name": "PhyloTree",
      "summary": "A phylogenetic tree from `newick`, growing from the root at the left, `width` pixels from the root to the leaves and `row` pixels between leaves, centred on `center` (units of `ui.space`). With branch lengths for every branch it is drawn to scale; without, as a cladogram with the leaves in a column. From `delay` the branches draw outward one level every `step` seconds, and each leaf's name appears when its branch arrives. Named inner nodes are traits shared by everything after them, written on the branch that leads to them. With `highlight` naming a node, its clade turns `highlight_color` at `highlight_at`.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/phylo-tree/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/phylo-tree.md",
      "scenes": [
        "PhyloTree"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PhyloTree-805f494b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/phylo.rs#L265",
      "themed": true,
      "fields": [
        {
          "name": "newick",
          "type": "String",
          "default": null,
          "docs": "The tree in Newick notation, e.g. `((a:1,b:1)c:2,d:3);`; branch lengths are optional."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first branches draw."
        },
        {
          "name": "step",
          "type": "f32",
          "default": "0.55",
          "docs": "Seconds each level of branches takes to draw outward."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(-0.7, -0.4)",
          "docs": "The middle of the tree, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1000.0",
          "docs": "Pixels from the root to the leaves."
        },
        {
          "name": "row",
          "type": "f32",
          "default": "66.0",
          "docs": "Pixels between neighbouring leaves."
        },
        {
          "name": "highlight",
          "type": "Option<String>",
          "default": "None",
          "docs": "Name of a node whose clade is highlighted; `None` for none."
        },
        {
          "name": "highlight_at",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after `delay` when the highlighted clade starts to turn `highlight_color`."
        },
        {
          "name": "branch_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the branches."
        },
        {
          "name": "highlight_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour the highlighted clade turns."
        },
        {
          "name": "trait_color",
          "type": "Color",
          "default": "Color::hex(\"#ffd43b\")",
          "docs": "Colour of the trait marks and names on the branches."
        },
        {
          "name": "name_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the leaf names: family, size in pixels and weight."
        },
        {
          "name": "trait_style",
          "type": "TextStyle",
          "default": "trait_style",
          "docs": "The font of the trait names: family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the leaf names."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Pie",
      "summary": "The `progress` (0 to 1) part of a disc, clockwise from the top turned by `rotation` radians clockwise (Remotion `Pie`). With `closed` false only the arc is drawn.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Pie"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Pie-b11d1799.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/remotion.rs#L152",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels."
        },
        {
          "name": "progress",
          "type": "f32",
          "default": "0.5",
          "docs": "Share of the disc drawn, 0 to 1 (clamped); 1 is the full circle."
        },
        {
          "name": "rotation",
          "type": "f32",
          "default": "0.0",
          "docs": "Radians the start turns clockwise from the top."
        },
        {
          "name": "closed",
          "type": "bool",
          "default": "true",
          "docs": "Joins the arc to the center with straight edges; `false` draws only the arc."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "PolarPlane",
      "summary": "A polar grid (Manim `PolarPlane`): circles every `radius_step` up to `radius_max` and `azimuth_step` spokes, `size` units across, with the radii written along the first spoke and the azimuths around the outside. Points are `(r, θ)`, θ in radians.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "PolarPlane"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PolarPlane-0fdc6b05.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/polar_plane.rs#L54",
      "themed": true,
      "fields": [
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle, in units of `ui.space`."
        },
        {
          "name": "size",
          "type": "f64",
          "default": "7.0",
          "docs": "The diameter of the outer circle, in units of `ui.space`."
        },
        {
          "name": "radius_max",
          "type": "f64",
          "default": "4.0",
          "docs": "The radius of the outer circle in units of radius; the grid is `size` units across, so this sets the scale of `(r, θ)` points."
        },
        {
          "name": "radius_step",
          "type": "f64",
          "default": "1.0",
          "docs": "Radius between two circles, in units of radius; also the step of the written radii."
        },
        {
          "name": "azimuth_step",
          "type": "usize",
          "default": "12",
          "docs": "Number of spokes."
        },
        {
          "name": "azimuth_units",
          "type": "AzimuthUnits",
          "default": "AzimuthUnits::PiRadians",
          "docs": "How the azimuths around the outside are written: in π or τ radians, degrees, gradians, or not at all."
        },
        {
          "name": "azimuth_offset",
          "type": "f64",
          "default": "0.0",
          "docs": "The angle of θ = 0 from the positive x-axis, in radians."
        },
        {
          "name": "azimuth_direction",
          "type": "AzimuthDirection",
          "default": "AzimuthDirection::Ccw",
          "docs": "Which way θ grows from `azimuth_offset`: counterclockwise or clockwise."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the circles and spokes."
        },
        {
          "name": "line_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the circles, spokes and axis lines in pixels."
        },
        {
          "name": "line_opacity",
          "type": "f32",
          "default": "0.45",
          "docs": "0 transparent to 1 opaque, for the circles and spokes; the outer circle and first spoke are always opaque."
        },
        {
          "name": "axis_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "The circle at `radius_max` and the spoke at θ = 0."
        },
        {
          "name": "radius_numbers",
          "type": "bool",
          "default": "true",
          "docs": "Writes the radii along the first spoke."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "0",
          "docs": "Digits after the decimal point of the written radii, and of degrees and gradians."
        },
        {
          "name": "number_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the radii and azimuths: family, size in pixels and weight."
        },
        {
          "name": "number_fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the radii and azimuths."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the circles and spokes appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the circles and spokes leave at the end of their container; `None` stays."
        },
        {
          "name": "labels_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the numbers appear and go; the grid uses `enter` and `exit`."
        },
        {
          "name": "labels_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade the numbers out before the end of the container; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn pr2pt_in(&self, space: Space, (r, theta): (f64, f64)) -> Point",
          "summary": "The pixel of the polar point `(r, θ)` in `space`."
        },
        {
          "signature": "fn pr2pt(&self, ui: &Ui, rt: (f64, f64)) -> (f32, f32)",
          "summary": "The pixel of the polar point `(r, θ)` (Manim `polar_to_point`, `pr2pt`)."
        },
        {
          "signature": "fn pt2pr_in(&self, space: Space, p: Point) -> (f64, f64)",
          "summary": "The polar point `(r, θ)` at a pixel in `space`, θ in `0..τ`."
        },
        {
          "signature": "fn pt2pr(&self, ui: &Ui, x: f32, y: f32) -> (f64, f64)",
          "summary": "The polar point at a pixel (Manim `point_to_polar`, `pt2pr`)."
        },
        {
          "signature": "fn azimuth_label(&self, k: usize) -> Option<String>",
          "summary": "The azimuth of spoke `k` written in `azimuth_units`, `None` without numbers."
        }
      ]
    },
    {
      "name": "Polygon",
      "summary": "A closed polygon through `points` (Manim `Polygon`, Remotion `Polygon`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Polygon"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Polygon-e8dee0b9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L260",
      "themed": true,
      "fields": [
        {
          "name": "points",
          "type": "Vec<(f32, f32)>",
          "default": "vec![(0.0, -100.0), (100.0, 100.0), (-100.0, 100.0)]",
          "docs": "Corner points `(x, y)` in pixels of the canvas, joined in order and closed."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Polygram",
      "summary": "Several closed polygons in one shape (Manim `Polygram`), one per group of vertices.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Polygram"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Polygram-3184aec7.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/polygram.rs#L32",
      "themed": true,
      "fields": [
        {
          "name": "vertex_groups",
          "type": "Vec<Vec<(f32, f32)>>",
          "default": null,
          "docs": "One list of corner points `(x, y)` in pixels of the canvas per closed polygon."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "PopulationCurve",
      "summary": "Population growth on axes of time against population, `x_length` by `y_length` (units of `ui.space`) around `center`. From `delay` the curves draw from 0 to `years` in `duration` seconds, a dot at each head; curves that leave the top stop there.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/population-curve/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/population-curve.md",
      "scenes": [
        "PopulationCurve"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PopulationCurve-82bb16a3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/population.rs#L73",
      "themed": true,
      "fields": [
        {
          "name": "model",
          "type": "PopulationModel",
          "default": "PopulationModel::Logistic",
          "docs": "Which curves: `Logistic`, `Exponential` or `PredatorPrey`."
        },
        {
          "name": "r",
          "type": "f64",
          "default": "0.8",
          "docs": "Growth rate per year (per unit of the time axis)."
        },
        {
          "name": "k",
          "type": "f64",
          "default": "1000.0",
          "docs": "Carrying capacity, the population a logistic curve levels off at; it also sets the height of the vertical axis."
        },
        {
          "name": "n0",
          "type": "f64",
          "default": "10.0",
          "docs": "Starting population at time 0."
        },
        {
          "name": "years",
          "type": "f64",
          "default": "15.0",
          "docs": "Length of the time axis; the curves run from 0 to `years`."
        },
        {
          "name": "compare",
          "type": "bool",
          "default": "true",
          "docs": "Draws the faded exponential curve beside a logistic one when `true`."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the curves begin to draw."
        },
        {
          "name": "duration",
          "type": "f32",
          "default": "5.0",
          "docs": "Seconds the curves take to draw from 0 to `years`."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(-0.8, -0.3)",
          "docs": "The middle of the axes, in units of `ui.space`."
        },
        {
          "name": "x_length",
          "type": "f64",
          "default": "8.5",
          "docs": "Width of the axes, in units of `ui.space`."
        },
        {
          "name": "y_length",
          "type": "f64",
          "default": "5.2",
          "docs": "Height of the axes, in units of `ui.space`."
        },
        {
          "name": "colors",
          "type": "[Color; 2]",
          "default": "[Color::hex(\"#69db7c\"), Color::hex(\"#ff8787\")]",
          "docs": "Colours of the first and the second curve; a faded comparison curve uses the second."
        },
        {
          "name": "axis_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the axes."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "label_style",
          "docs": "The font of the axis labels, numbers and legend: family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the legend and the carrying-capacity label."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn series(&self, count: usize) -> Vec<Vec<f64>>",
          "summary": "The populations at `count + 1` evenly spaced times from 0 to `years`: one series, or prey and then predators."
        }
      ]
    },
    {
      "name": "ProgressBar",
      "summary": "A bar that fills from the left: with `progress: None` it shows how far the container is through `ui.duration` (a video progress bar), otherwise the given value from 0 to 1. The filled part is never thinner than half a pixel, so it is visible from the start.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "ProgressBar"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ProgressBar-b9371738.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/progress.rs#L15",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "f32",
          "default": "96.0",
          "docs": "Left edge of the bar in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "1000.0",
          "docs": "Top of the bar in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1728.0",
          "docs": "Full width of the track in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "8.0",
          "docs": "Height of the bar in pixels."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "0.0",
          "docs": "Corner radius of the track and the filled part in pixels; 0 for square corners."
        },
        {
          "name": "track",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Colour of the unfilled track behind the bar."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the filled part."
        },
        {
          "name": "progress",
          "type": "Option<f32>",
          "default": "None",
          "docs": "How full the bar is, 0 to 1; `None` follows how far the container is through `ui.duration`."
        }
      ],
      "methods": []
    },
    {
      "name": "Projectile",
      "summary": "A ball launched at `speed` m/s and `angle` radians above the horizontal from `origin` (units of `ui.space`, `scale` units per meter), without drag, landing at the launch height. With `trace` its path draws behind it, with `vectors` it carries its velocity and the velocity's two components (`vector_scale` units per m/s), and with `peak` and `labels` the top of the arc and the landing point are marked with the height and the range. The flight starts `delay` seconds after the local start and the ball stays where it landed. The ground draws with `enter`, the rest fades with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/projectile/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/projectile.md",
      "scenes": [
        "Projectile"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Projectile-0aa43c99.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/projectile.rs#L28",
      "themed": true,
      "fields": [
        {
          "name": "origin",
          "type": "(f64, f64)",
          "default": "(-6.0, -2.5)",
          "docs": "Where the ball is launched from, in units of `ui.space`."
        },
        {
          "name": "speed",
          "type": "f64",
          "default": "10.0",
          "docs": "Launch speed in m/s."
        },
        {
          "name": "angle",
          "type": "f64",
          "default": "std::f64::consts::FRAC_PI_4",
          "docs": "Launch angle above the horizontal in radians."
        },
        {
          "name": "gravity",
          "type": "f64",
          "default": "GRAVITY",
          "docs": "Downward acceleration in m/s²; 0 or less gives no flight."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the ball is launched."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the flight over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "trace",
          "type": "bool",
          "default": "true",
          "docs": "Draws the path flown so far as a dashed line behind the ball."
        },
        {
          "name": "vectors",
          "type": "bool",
          "default": "true",
          "docs": "Draws the ball's velocity and its horizontal and vertical components as arrows until it lands."
        },
        {
          "name": "peak",
          "type": "bool",
          "default": "true",
          "docs": "Marks the top of the arc with a dot and a dashed drop line once the ball has passed it."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the height of the top and the range at the landing point (with `peak`)."
        },
        {
          "name": "vector_scale",
          "type": "f64",
          "default": "0.12",
          "docs": "Units of `ui.space` per m/s for the velocity arrows."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "14.0",
          "docs": "Radius of the ball in pixels."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the ball."
        },
        {
          "name": "velocity_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the velocity arrow."
        },
        {
          "name": "component_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the horizontal and vertical component arrows and the marks."
        },
        {
          "name": "trace_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed path."
        },
        {
          "name": "ground_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the ground line and the dashed drop line."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the velocity arrow in pixels; the other arrows and lines use the theme's thin width."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the ground draws in; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the ground leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the ball, path, arrows and labels fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the ball, path, arrows and labels fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn flight_time(&self) -> f64",
          "summary": "Seconds from the launch until the ball is back at the launch height; 0 when it is not thrown upward or there is no gravity."
        },
        {
          "signature": "fn position(&self, t: f64) -> (f64, f64)",
          "summary": "Meters from the launch point after `t` seconds of flight (`y` up), stopping at the landing."
        },
        {
          "signature": "fn velocity(&self, t: f64) -> (f64, f64)",
          "summary": "Velocity in m/s after `t` seconds of flight."
        },
        {
          "signature": "fn apex(&self) -> (f64, f64, f64)",
          "summary": "The time, horizontal distance and height of the top of the arc."
        },
        {
          "signature": "fn range(&self) -> f64",
          "summary": "Meters from the launch point to the landing point."
        }
      ]
    },
    {
      "name": "PunnettSquare",
      "summary": "A Punnett square crossing `parents` (genotypes such as `\"Pp\"` or `\"YyRr\"`, one to three genes), `scale` times its normal size around `center` (units of `ui.space`). The first parent's gametes run across the top and the second's down the side, each in a circle. Every cell is coloured by its phenotype from `phenotype_colors` (dominant first, as in `Punnett::phenotype_ratio`) and shows its genotype. Below, the genotype and phenotype ratios count up as the cells fill. Phenotypes are named from `traits`, one (dominant, recessive) pair of names per gene, or written as `P_` and `pp` without them.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/punnett-square/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/punnett-square.md",
      "scenes": [
        "PunnettSquare"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/PunnettSquare-9089f784.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/punnett.rs#L157",
      "themed": true,
      "fields": [
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the square appears."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the square, in units of `ui.space`."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Size factor on the figure; `1.0` is its normal size."
        },
        {
          "name": "parents",
          "type": "(String, String)",
          "default": "(\"Pp\".into(), \"Pp\".into())",
          "docs": "Genotypes of the first and second parent, e.g. `(\"Pp\", \"Pp\")` or `(\"YyRr\", \"YyRr\")`; the first runs across the top."
        },
        {
          "name": "traits",
          "type": "Vec<(String, String)>",
          "default": "vec![(\"purple\".into(), \"white\".into())]",
          "docs": "One `(dominant, recessive)` pair of phenotype names per gene; empty writes `P_` and `pp` instead."
        },
        {
          "name": "fill_time",
          "type": "f32",
          "default": "2.4",
          "docs": "Seconds the cells take to fill in, row by row."
        },
        {
          "name": "ratios",
          "type": "bool",
          "default": "true",
          "docs": "Counts up the genotype and phenotype ratios under the square when `true`."
        },
        {
          "name": "phenotype_colors",
          "type": "Vec<Color>",
          "default": null,
          "docs": "Cell colour by phenotype, dominant first; a phenotype past the end uses `muted_color`."
        },
        {
          "name": "grid_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the square's grid lines and gamete circle outlines."
        },
        {
          "name": "gamete_color",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Fill of the gamete circles."
        },
        {
          "name": "highlight_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour the outline of a cell flashes as it fills."
        },
        {
          "name": "cell_style",
          "type": "TextStyle",
          "default": "cell_style",
          "docs": "The font of the genotypes in the cells: family, size in pixels and weight."
        },
        {
          "name": "parent_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the parent genotypes and gametes: family, size in pixels and weight."
        },
        {
          "name": "ratio_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the ratio lines below the square: family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the genotypes and ratio text."
        },
        {
          "name": "muted_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the secondary text and of phenotypes without a colour in `phenotype_colors`."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Pythagoras",
      "summary": "The Pythagorean theorem: a right triangle with legs `a` (along x) and `b` (up), and a square on each side, outward. `corner` is the right angle in units of `ui.space`. Each square draws with its own `squares_enter` (stagger them with delays) and, with `labels`, shows its area at its center (`a² = 9`, `b² = 16`, `c² = 25`).",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/pythagoras/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/pythagoras.md",
      "scenes": [
        "Pythagoras"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Pythagoras-e59be004.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/pythagoras.rs#L21",
      "themed": true,
      "fields": [
        {
          "name": "a",
          "type": "f64",
          "default": "3.0",
          "docs": "Length of the leg along the x-axis, in units of `ui.space`."
        },
        {
          "name": "b",
          "type": "f64",
          "default": "4.0",
          "docs": "Length of the leg going up, in units of `ui.space`."
        },
        {
          "name": "corner",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The right angle's position, in units of `ui.space` (y up)."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Shows each square's area at its centre when `true`."
        },
        {
          "name": "triangle_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the triangle."
        },
        {
          "name": "colors",
          "type": "[Color; 3]",
          "default": "[theme.colors.accent, theme.colors.highlight, theme.colors.caption]",
          "docs": "The squares on `a`, `b` and the hypotenuse."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Outline width in pixels of the triangle and squares."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the triangle appears; `None` shows it from the start."
        },
        {
          "name": "squares_enter",
          "type": "[Option<EnterAnim>; 3]",
          "default": "[None, None, None]",
          "docs": "How each of the squares on `a`, `b` and the hypotenuse appears; `None` shows it from the start."
        },
        {
          "name": "labels_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the area labels; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn areas(&self) -> [f64; 3]",
          "summary": "The squares' areas: `a²`, `b²` and `c²`."
        }
      ]
    },
    {
      "name": "Queue",
      "summary": "A queue: boxes `width` by `height` pixels in a channel `capacity` boxes long, centred on `center` (units of `ui.space`), the front at the left, with `front` and `back` markers under the boxes. It plays a `ListTrace` (the first item is the front), one step every `step_time` seconds from `delay`: enqueued boxes slide in from the right, dequeued ones leave to the left and the rest move up. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/linked-list-stack-and-queue/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/linked-list-stack-and-queue.md",
      "scenes": [
        "Queue"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Queue-d3bc9807.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/list.rs#L955",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&ListTrace>",
          "default": "None",
          "docs": "The recorded steps to play (`ListTrace`, the first item is the front); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.7",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the channel, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "110.0",
          "docs": "Width of a box in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "80.0",
          "docs": "Height of a box in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "12.0",
          "docs": "Space between neighbouring boxes in pixels."
        },
        {
          "name": "capacity",
          "type": "usize",
          "default": "6",
          "docs": "How many boxes the channel holds; sets its length."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the queue."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the boxes in each state (visited, moved, found)."
        },
        {
          "name": "frame_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the channel's outline."
        },
        {
          "name": "marker_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the `front` and `back` markers."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the values in the boxes."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the markers and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "RadialProgressiveBlur",
      "summary": "Its children blurred more and more away from a point (Remotion's `radialProgressiveBlur()`): `start_blur` inside `start` (0 the centre to 1 the ellipse), growing to `end_blur` on and outside an ellipse round `center`, `width` by `height` (shares of the area) and turned `rotation` degrees. Radii are like Remotion's (a Gaussian of a third of them). Drawn as blurred copies under graded masks, one for every 6 units of radius and at most `MAX_BLUR_LEVELS`, so the children render up to nine times.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "RadialProgressiveBlur"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RadialProgressiveBlur-2804f7c9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/progressive_blur.rs#L225",
      "themed": true,
      "fields": [
        {
          "name": "center",
          "type": "(f32, f32)",
          "default": "(0.5, 0.5)",
          "docs": "Center of the ellipse as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1.0",
          "docs": "Width of the ellipse as a share of the area's width, 1 spanning it."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "1.0",
          "docs": "Height of the ellipse as a share of the area's height, 1 spanning it."
        },
        {
          "name": "rotation",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the ellipse is turned."
        },
        {
          "name": "start",
          "type": "f32",
          "default": "0.0",
          "docs": "0 to 1 share of the ellipse inside which the blur stays `start_blur`: 0 only at the centre, 1 all the way to the ellipse."
        },
        {
          "name": "start_blur",
          "type": "f32",
          "default": "0.0",
          "docs": "Blur radius inside `start`, like Remotion's (a Gaussian of a third of it); 0 is sharp."
        },
        {
          "name": "end_blur",
          "type": "f32",
          "default": "50.0",
          "docs": "Blur radius on and outside the ellipse, like Remotion's (a Gaussian of a third of it)."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the effect covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filters when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is blurred (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "RadialWave",
      "summary": "Manim-physics' `RadialWave`: circular waves from every point of `sources` (units of `ui.space`), `amplitude sin(k r - ω t)` each, summed where they meet. `wavelength` and `speed` are in units and units per second. In 2D the crests are rings in `color` and the troughs dashed rings in `trough_color` (with `troughs`), drawn inside `x_range` by `y_range`; where the rings of two sources cross the waves add up. With `front` (the default) the water is at rest at the start and the rings leave the sources on the figure's clock (`delay`, `time_scale`); without it they fill the area from the start.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/radial-wave/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/radial-wave.md",
      "scenes": [
        "RadialWave"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RadialWave-a0175948.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/waves_ii.rs#L31",
      "themed": true,
      "fields": [
        {
          "name": "sources",
          "type": "Vec<(f64, f64)>",
          "default": "vec![(0.0, 0.0)]",
          "docs": "The points the waves spread from, in units of `ui.space`."
        },
        {
          "name": "wavelength",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` between two crests."
        },
        {
          "name": "speed",
          "type": "f64",
          "default": "1.0",
          "docs": "Speed of the rings in units of `ui.space` per second."
        },
        {
          "name": "amplitude",
          "type": "f64",
          "default": "0.3",
          "docs": "Largest height of one wave in units of `ui.space`; it sets the height of the 3D surface."
        },
        {
          "name": "front",
          "type": "bool",
          "default": "true",
          "docs": "The water is at rest at the start and the rings leave the sources on the clock; off fills the area from the start."
        },
        {
          "name": "x_range",
          "type": "(f64, f64)",
          "default": "(-7.0, 7.0)",
          "docs": "Left and right edges of the area the rings are drawn in, in units of `ui.space`."
        },
        {
          "name": "y_range",
          "type": "(f64, f64)",
          "default": "(-4.0, 4.0)",
          "docs": "Bottom and top edges of the area the rings are drawn in, in units of `ui.space`."
        },
        {
          "name": "troughs",
          "type": "bool",
          "default": "true",
          "docs": "Draws the troughs as dashed rings, a quarter wavelength from the crests."
        },
        {
          "name": "show_sources",
          "type": "bool",
          "default": "true",
          "docs": "Draws a dot at each source."
        },
        {
          "name": "resolution",
          "type": "usize",
          "default": "96",
          "docs": "Pieces along each side of the 3D surface; ignored in 2D."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the waves begin."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the crest rings."
        },
        {
          "name": "trough_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the trough rings."
        },
        {
          "name": "source_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the source dots."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the crest rings in pixels; troughs use the theme's thin width."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn displacement(&self, x: f64, y: f64, t: f64) -> f64",
          "summary": "The height of the water at `(x, y)` after `t` seconds: the sum over the sources of `amplitude sin(k r - ω t)`, without the sources the front has not reached yet."
        }
      ]
    },
    {
      "name": "RayDiagram",
      "summary": "The principal rays of a thin lens or a mirror at `center` (units of `ui.space`) on a horizontal axis, from the tip of an object arrow `object_distance` units to its left and `object_height` tall: parallel to the axis then through the focal point, through the middle, and through the focal point then parallel. They draw on one after another from `delay` seconds after the local start (`ray_time` each, `stagger` apart) and run `reach` units past the optic; then the image forms where they meet, dashed with the rays' backward extensions when it is virtual. Lengths are units of `ui.space` (`focal` is the focal length). The axis, optic, focal points and object draw with `enter`, the rays and the image and the labels with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/ray-diagram-and-refraction/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/ray-diagram-and-refraction.md",
      "scenes": [
        "RayDiagram"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RayDiagram-3f98b269.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/optics.rs#L43",
      "themed": true,
      "fields": [
        {
          "name": "optic",
          "type": "Optic",
          "default": "Optic::Lens",
          "docs": "Whether the element is a thin lens or a spherical mirror."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the optic, where the axis crosses it, in units of `ui.space`."
        },
        {
          "name": "focal",
          "type": "f64",
          "default": "1.8",
          "docs": "Focal length in units of `ui.space`; negative for a diverging lens or a convex mirror."
        },
        {
          "name": "object_distance",
          "type": "f64",
          "default": "4.0",
          "docs": "Distance of the object from the optic, to its left, in units of `ui.space`."
        },
        {
          "name": "object_height",
          "type": "f64",
          "default": "1.2",
          "docs": "Height of the object arrow in units of `ui.space`."
        },
        {
          "name": "reach",
          "type": "f64",
          "default": "6.0",
          "docs": "How far the rays run past the optic, in units of `ui.space`."
        },
        {
          "name": "optic_height",
          "type": "f64",
          "default": "4.0",
          "docs": "Height of the drawn lens or mirror in units of `ui.space`."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the first ray begins to draw."
        },
        {
          "name": "ray_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each ray takes to draw."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.6",
          "docs": "Seconds between the start of one ray and the next."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes `F` under the focal points."
        },
        {
          "name": "optic_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the optic, the focal points and their labels."
        },
        {
          "name": "object_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the object arrow."
        },
        {
          "name": "image_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the image arrow."
        },
        {
          "name": "ray_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the rays."
        },
        {
          "name": "guide_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed axis and the mirror's hatching."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the optic and the object and image arrows in pixels; rays use the theme's thin width."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the axis, optic, focal points and object draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How those parts leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the rays, image and labels fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the rays, image and labels fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn image_distance(&self) -> Option<f64>",
          "summary": "The image distance from `1/d_o + 1/d_i = 1/f`: positive for a real image (right of a lens, left of a mirror), negative for a virtual one, `None` when the object is at the focal point and the rays leave parallel."
        },
        {
          "signature": "fn magnification(&self) -> Option<f64>",
          "summary": "The image's height over the object's, `-d_i / d_o`; negative when it is upside down."
        },
        {
          "signature": "fn image(&self) -> Option<(f64, f64)>",
          "summary": "The image's tip, in units from the optic, `y` up."
        }
      ]
    },
    {
      "name": "ReactionEquation",
      "summary": "A reaction being balanced: `unbalanced` (typeset from `Reaction::tex` without coefficients) turns into `balanced` (with them) at `delay` over `run_time`, the species sliding apart and the coefficients fading in. With `tally` and a `reaction` a line under it counts the atoms of each element on both sides, in `unequal_color` until they balance and `equal_color` after. The formulas are centred at `center` (units of `ui.space`), 10 pt as `size` pixels. The tally fades with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/reaction-equation/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/reaction-equation.md",
      "scenes": [
        "ReactionEquation"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ReactionEquation-673aab06.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/reaction.rs#L259",
      "themed": true,
      "fields": [
        {
          "name": "reaction",
          "type": "Option<&Reaction>",
          "default": "None",
          "docs": "The `Reaction` the atom tally counts and balances; `None` for no tally."
        },
        {
          "name": "unbalanced",
          "type": "Option<&Formula>",
          "default": "None",
          "docs": "The typeset equation before balancing (from `Reaction::typeset` with `false`); `None` shows only `balanced`."
        },
        {
          "name": "balanced",
          "type": "Option<&Formula>",
          "default": "None",
          "docs": "The typeset equation after balancing (from `Reaction::typeset` with `true`); `None` shows only `unbalanced`."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the equation, in units of `ui.space`."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "110.0",
          "docs": "Size of the equation: pixels for a 10 pt font, the tally sits `0.9 * size` pixels under the middle."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the equation turns into its balanced form."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "1.2",
          "docs": "Seconds the turn into the balanced equation takes; the tally switches halfway through."
        },
        {
          "name": "tally",
          "type": "bool",
          "default": "true",
          "docs": "Writes a line counting each element's atoms on both sides (`H  4 | 4`); `false` for none."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the equation."
        },
        {
          "name": "equal_color",
          "type": "Color",
          "default": "Color::hex(\"#69db7c\")",
          "docs": "Colour of an element's tally when both sides have the same count."
        },
        {
          "name": "unequal_color",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "Colour of an element's tally when the two sides differ."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the tally; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the tally before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Rect",
      "summary": "A rectangle, square corners unless `corner_radius` is set (Remotion `Rect`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Rect"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Rect-8c5facac.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/remotion.rs#L13",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "200.0",
          "docs": "Width in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "200.0",
          "docs": "Height in pixels."
        },
        {
          "name": "corner_radius",
          "type": "f32",
          "default": "0.0",
          "docs": "Radius of the rounded corners in pixels; 0 for square corners."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Rectangle",
      "summary": "A `width` by `height` rectangle (Manim `Rectangle`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Rectangle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Rectangle-3abc1aba.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L311",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "400.0",
          "docs": "Full width in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "200.0",
          "docs": "Full height in pixels."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "RecursionTree",
      "summary": "The tree of a recursion's calls: a node for each call, wide enough for the longest label and `height` pixels tall, `spacing` pixels between slots and `level` pixels between depths, centred on `center` (units of `ui.space`). It plays a `CallTrace`, one step every `step_time` seconds from `delay`: each call's node drops in under its caller, the open calls are outlined in `path_color` with the innermost lit, a returning call shows its result beside it in `colors.found`, and finished calls keep their result in `colors.sorted`. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/call-trace-call-stack-and-recursion-tree/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/call-trace-call-stack-and-recursion-tree.md",
      "scenes": [
        "RecursionTree"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RecursionTree-49c6f064.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/recursion.rs#L544",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&CallTrace>",
          "default": "None",
          "docs": "The recorded calls to play (`CallTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.6",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the tree, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "190.0",
          "docs": "Pixels between neighbouring node slots in a depth."
        },
        {
          "name": "level",
          "type": "f32",
          "default": "130.0",
          "docs": "Pixels between depths."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "60.0",
          "docs": "Height of a node in pixels."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the tree."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the nodes in each state (`colors.found` for a returning call, `colors.sorted` for a finished one)."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the edges between a call and its callees."
        },
        {
          "name": "path_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the outline of the open calls."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the call labels."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the results and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Refraction",
      "summary": "A ray meeting the flat boundary between two media at `point` (units of `ui.space`): it comes in from the upper left at `angle` radians from the normal through the upper medium (index `n1`) and bends into the lower one (`n2`) by Snell's law, `n1 sin θ1 = n2 sin θ2`. Past the critical angle it is reflected whole instead. With `reflection` the weak reflected ray is drawn as well. The rays draw on from `delay` seconds after the local start, the incoming one over `ray_time` seconds and then the others; with `labels` the angles and indices are written. Rays are `length` units long. The boundary, the normal and the media draw with `enter`, the rays and labels with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/ray-diagram-and-refraction/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/ray-diagram-and-refraction.md",
      "scenes": [
        "Refraction"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Refraction-b51b9ade.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/optics.rs#L419",
      "themed": true,
      "fields": [
        {
          "name": "point",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "Where the ray meets the boundary, in units of `ui.space`."
        },
        {
          "name": "n1",
          "type": "f64",
          "default": "1.0",
          "docs": "Refractive index of the upper medium, where the ray comes from."
        },
        {
          "name": "n2",
          "type": "f64",
          "default": "1.5",
          "docs": "Refractive index of the lower medium; the ray bends toward the normal when it is higher."
        },
        {
          "name": "angle",
          "type": "f64",
          "default": "0.7",
          "docs": "Angle of incidence in radians from the normal; past the critical angle the ray is reflected whole."
        },
        {
          "name": "length",
          "type": "f64",
          "default": "3.0",
          "docs": "Length of the rays in units of `ui.space`; the lower medium is that deep."
        },
        {
          "name": "reflection",
          "type": "bool",
          "default": "true",
          "docs": "Draws the weak reflected ray as well, when the ray is refracted."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the angles and the indices of the two media."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the incoming ray begins to draw."
        },
        {
          "name": "ray_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each ray takes to draw; the outgoing rays start when the incoming one is done."
        },
        {
          "name": "ray_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the rays."
        },
        {
          "name": "medium_color",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Colour of the lower medium."
        },
        {
          "name": "guide_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the boundary, the dashed normal and the angle arcs."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the index and angle labels."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the incoming and outgoing rays and the boundary in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the boundary, normal and media draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the boundary, normal and media leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the rays, angles and labels fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the rays, angles and labels fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn refraction_angle(&self) -> Option<f64>",
          "summary": "The angle of the refracted ray from the normal, or `None` past the critical angle."
        },
        {
          "signature": "fn critical_angle(&self) -> Option<f64>",
          "summary": "The angle of incidence past which the ray is reflected whole; only when `n1 > n2`."
        }
      ]
    },
    {
      "name": "RegionBlur",
      "summary": "Its children blurred inside a rectangle (Remotion's `regionBlur()`): from `top_left` to `bottom_right` (0 to 1 across the area), blurred by `radius` like Remotion's (a Gaussian of a third of it), the edge softened over `feather` units and the corners rounded by `roundness` (0 square to 1 fully round). The blurred copy is laid over the sharp children, so the children render twice.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "RegionBlur"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RegionBlur-ef9ee91e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/progressive_blur.rs#L84",
      "themed": true,
      "fields": [
        {
          "name": "top_left",
          "type": "(f32, f32)",
          "default": "(0.25, 0.25)",
          "docs": "Top left corner of the blurred rectangle, as 0 to 1 fractions of `area`."
        },
        {
          "name": "bottom_right",
          "type": "(f32, f32)",
          "default": "(0.75, 0.75)",
          "docs": "Bottom right corner of the blurred rectangle, as 0 to 1 fractions of `area`."
        },
        {
          "name": "radius",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(40.0)",
          "docs": "Blur radius like Remotion's (a Gaussian of a third of it); 0 or less shows the children unblurred. Animatable."
        },
        {
          "name": "feather",
          "type": "f32",
          "default": "0.0",
          "docs": "Width in `area` units over which the rectangle's edge softens; 0 for a hard edge."
        },
        {
          "name": "roundness",
          "type": "f32",
          "default": "0.0",
          "docs": "Corner rounding: 0 square to 1 fully round."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the effect covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filters when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is blurred inside the rectangle (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "RegularPolygon",
      "summary": "A regular polygon with `n` corners on a circle of `radius` (Manim `RegularPolygon`). `start_angle` is the first corner; `None` is Manim's default (right for an even `n`, top for an odd one).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "RegularPolygon"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RegularPolygon-298f3184.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L272",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels of the circle the corners lie on."
        },
        {
          "name": "n",
          "type": "usize",
          "default": "6",
          "docs": "Number of corners (at least 3)."
        },
        {
          "name": "start_angle",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Radians of the first corner, counterclockwise on screen from the right; `None` puts it on the right for an even `n`, at the top for an odd one."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "RegularPolygram",
      "summary": "A regular star polygon (Manim `RegularPolygram`): `num_vertices` corners on a circle of `radius`, each joined to the one `density` steps on. `start_angle` is the first corner; `None` is Manim's default (right for an even count, top for an odd one).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "RegularPolygram"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RegularPolygram-9ac85d5a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/polygram.rs#L65",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels."
        },
        {
          "name": "num_vertices",
          "type": "usize",
          "default": "5",
          "docs": "Number of corners on the circle (at least 3)."
        },
        {
          "name": "density",
          "type": "usize",
          "default": "2",
          "docs": "How many corners on each corner joins to; 2 on 5 corners draws a pentagram."
        },
        {
          "name": "start_angle",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Radians of the first corner, counterclockwise on screen from the right; `None` puts it on the right for an even count, at the top for an odd one."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "ReplacementTransform",
      "summary": "`Transform` that draws `to` itself once the morph has finished (Manim's `ReplacementTransform`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ReplacementTransform"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ReplacementTransform-556737d9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform.rs#L87",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Shape",
          "default": null,
          "docs": "The shape it starts as; drawn until `delay` has passed."
        },
        {
          "name": "to",
          "type": "Shape",
          "default": null,
          "docs": "The shape it ends as."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Shape, to: Shape) -> Self",
          "summary": "From `from` to `to` in Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "RiemannRectangles",
      "summary": "Rectangles of width `dx` from `x_range.0` to `x_range.1`, each as high as `f` at its left edge, center or right edge (Manim `get_riemann_rectangles`). Below the x-axis for negative values.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under.md",
      "scenes": [
        "RiemannRectangles"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RiemannRectangles-69f74c8e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/graph.rs#L267",
      "themed": true,
      "fields": [
        {
          "name": "f",
          "type": "Func",
          "default": "|x| x",
          "docs": "The function whose value at the left edge, center or right edge gives each rectangle's height, in data units."
        },
        {
          "name": "x_range",
          "type": "(f64, f64)",
          "default": "(0.0, 1.0)",
          "docs": "The first and last `x` the rectangles cover, in data units."
        },
        {
          "name": "dx",
          "type": "f64",
          "default": "0.1",
          "docs": "Width of each rectangle in data units."
        },
        {
          "name": "sample_at",
          "type": "SampleAt",
          "default": "SampleAt::Left",
          "docs": "Where `f` is read for a rectangle's height: its left edge, center or right edge."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The mapping of the axes the rectangles stand on (`axes.map(ui)`)."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "paint.fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "paint.stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "paint.stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        },
        {
          "signature": "fn sum(&self) -> f64",
          "summary": "The Riemann sum: the signed area of the rectangles, in data units."
        }
      ]
    },
    {
      "name": "RiemannSum",
      "summary": "Riemann rectangles that get finer: `rects` is drawn with each width of `dxs` in turn, `hold` seconds each, cross-fading to the next over `crossfade` seconds, from `delay`. `sum` writes the Riemann sum after its text with `decimals`, fading with the rectangles. Build `rects` with `Axes::riemann_rectangles`.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/riemann-sum-and-area-under.md",
      "scenes": [
        "RiemannSum"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RiemannSum-4d8aa677.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/calculus.rs#L288",
      "themed": true,
      "fields": [
        {
          "name": "rects",
          "type": "RiemannRectangles",
          "default": "RiemannRectangles::themed(theme)",
          "docs": "The rectangles, built with `Axes::riemann_rectangles`; their width is replaced by each of `dxs` in turn."
        },
        {
          "name": "dxs",
          "type": "Vec<f64>",
          "default": "vec![0.5, 0.25, 0.1]",
          "docs": "Rectangle widths, in the x units of the axes, shown one after the other (finer each time)."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first set of rectangles appears."
        },
        {
          "name": "hold",
          "type": "f32",
          "default": "1.0",
          "docs": "Seconds each set of rectangles stays before the next begins to replace it."
        },
        {
          "name": "crossfade",
          "type": "f32",
          "default": "theme.motion.duration.base",
          "docs": "Seconds one set takes to fade into the next."
        },
        {
          "name": "sum",
          "type": "Option<Label>",
          "default": "None",
          "docs": "Text written beside the rectangles followed by the Riemann sum; `None` for no number."
        },
        {
          "name": "decimals",
          "type": "usize",
          "default": "3",
          "docs": "Digits after the decimal point of the sum."
        }
      ],
      "methods": []
    },
    {
      "name": "RightAngle",
      "summary": "The square mark of a right angle between two lines (Manim `RightAngle`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "RightAngle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RightAngle-5740a0af.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/angles.rs#L262",
      "themed": true,
      "fields": [
        {
          "name": "line1",
          "type": "Segment",
          "default": "((0.0, 0.0), (200.0, 0.0))",
          "docs": "The first line as two points `((x1, y1), (x2, y2))` in pixels of the canvas; the mark starts from it."
        },
        {
          "name": "line2",
          "type": "Segment",
          "default": "((0.0, 0.0), (0.0, -200.0))",
          "docs": "The second line, in the same form; the mark turns to it."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "ANGLE_RADIUS",
          "docs": "Radius of the mark in pixels, about where the lines cross."
        },
        {
          "name": "quadrant",
          "type": "(f32, f32)",
          "default": "(1.0, 1.0)",
          "docs": "Which half of each line the mark sits on: `1` along its direction, `-1` against."
        },
        {
          "name": "other_angle",
          "type": "bool",
          "default": "false",
          "docs": "Marks the other angle, clockwise from the first line to the second."
        },
        {
          "name": "elbow",
          "type": "bool",
          "default": null,
          "docs": "A square corner instead of an arc."
        },
        {
          "name": "dot",
          "type": "bool",
          "default": "false",
          "docs": "A dot inside the mark, `dot_distance` of the way out from the corner."
        },
        {
          "name": "dot_radius",
          "type": "f32",
          "default": "5.0",
          "docs": "Radius of the dot in pixels."
        },
        {
          "name": "dot_distance",
          "type": "f32",
          "default": "0.55",
          "docs": "How far out the dot sits, as a fraction of the mark's radius (0 at the corner, 1 on the mark)."
        },
        {
          "name": "dot_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the dot."
        },
        {
          "name": "label",
          "type": "ShapeLabel",
          "default": "ShapeLabel::None",
          "docs": "A label beside the mark, `label_buff` beyond its radius."
        },
        {
          "name": "label_buff",
          "type": "f32",
          "default": "3.0 * SMALL_BUFF",
          "docs": "Pixels between the mark's radius and the label."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The label's font: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the label text."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Some(theme.colors.accent)",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn value(&self) -> f32",
          "summary": "The angle the mark spans in radians, always positive (Manim `get_value`)."
        },
        {
          "signature": "fn path(&self) -> BezPath",
          "summary": "The mark alone: an arc, or a square corner."
        }
      ]
    },
    {
      "name": "RigidWorld",
      "summary": "The bodies of `motion` where they are `delay` seconds after the local start (times `time_scale`), Manim-physics' `SpaceScene`. Each body is its own shape, filled with `fill_color` (its own `color` if it has one, `fixed_color` when fixed) and outlined, a circle with a radius that shows it turning. `draw` replaces that for the bodies it returns something for. Everything fades with `enter` and `exit`. Without `motion` nothing is drawn.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/rigid-world/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/rigid-world.md",
      "scenes": [
        "RigidWorld"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RigidWorld-b2f3e4d1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/rigid.rs#L349",
      "themed": true,
      "fields": [
        {
          "name": "motion",
          "type": "Option<&RigidMotion>",
          "default": "None",
          "docs": "The simulated bodies to draw, built once in the video's constructor; `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the simulation starts to play."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "draw",
          "type": "Option<DrawBody>",
          "default": "None",
          "docs": "Draws a body in your own way: a closure given its `BodyView` that returns the picture, or `None` to leave it to the default shape."
        },
        {
          "name": "fill_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Fill of a body that has no colour of its own."
        },
        {
          "name": "fixed_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Fill of fixed bodies such as walls."
        },
        {
          "name": "stroke_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the outline, and of the radius that shows a circle turning."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Outline width in pixels."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Rings",
      "summary": "Concentric rings over its children (Remotion's `rings()`): rings `thickness` units wide in `colors` taken in turn, `gap` units of the children showing between them, round `center` (0 to 1 across the area). `offset` moves the rings outwards (animate it to make them expand); with `mask_to_source_alpha` they cover only the opaque parts of the children (which then render twice). Draws at most `MAX_RINGS` rings.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Rings"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Rings-e80d3a7c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L574",
      "themed": true,
      "fields": [
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "PALE_BLUES.to_vec()",
          "docs": "Colours of the rings, taken in turn from the middle outwards; empty draws none."
        },
        {
          "name": "center",
          "type": "(f32, f32)",
          "default": "(0.5, 0.5)",
          "docs": "Middle of the rings as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "thickness",
          "type": "f32",
          "default": "40.0",
          "docs": "Width of each ring in the children's user units; 0 draws none."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "0.0",
          "docs": "Width in user units of the children showing between rings."
        },
        {
          "name": "offset",
          "type": "f32",
          "default": "0.0",
          "docs": "Moves the rings outwards in user units; animate it to make them expand."
        },
        {
          "name": "mask_to_source_alpha",
          "type": "bool",
          "default": "false",
          "docs": "`true` covers only the opaque parts of the children, which then render twice."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the rings cover from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip and mask ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the rings are laid over (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn bands(&self) -> Vec<(i64, f32, f32)>",
          "summary": "The rings that reach into the area: their index in the colour cycle and their inner and outer radius, from the middle outwards."
        }
      ]
    },
    {
      "name": "RoughenEdges",
      "summary": "The edge of its children roughened like torn paper (Remotion's `roughenEdges()`): `amount` 0 to 1, `border` how far the edge moves in and out, `scale` the size of the noise (smaller is finer) and `seed` the pattern; derive the seed from the frame to animate the edge. The alpha is blurred, shifted by `feTurbulence` noise and cut at a threshold, so the edge stays smooth at any scale.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "RoughenEdges"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RoughenEdges-a6ae6eb2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/edges.rs#L137",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 unchanged to 1 fully roughened. Animatable."
        },
        {
          "name": "border",
          "type": "f32",
          "default": "26.5",
          "docs": "How far the edge moves in and out, in the children's user units; 0 or less leaves it unchanged."
        },
        {
          "name": "scale",
          "type": "f32",
          "default": "0.07",
          "docs": "Size of the noise that tears the edge, 0.01 to 4: smaller is finer."
        },
        {
          "name": "seed",
          "type": "f32",
          "default": "231.2",
          "docs": "Picks the tear pattern (rounded to a whole number); derive it from the frame to animate the edge."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "RoundedRectangle",
      "summary": "A rectangle with round corners (Manim `RoundedRectangle`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "RoundedRectangle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/RoundedRectangle-7f0e8ee4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L349",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "400.0",
          "docs": "Full width in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "200.0",
          "docs": "Full height in pixels."
        },
        {
          "name": "corner_radius",
          "type": "f32",
          "default": "theme.radius.md",
          "docs": "Radius of the rounded corners in pixels; 0 for square corners."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "SampleSpace",
      "summary": "A rectangle of probabilities (Manim `SampleSpace`): `columns` split it left to right by their `p`, and each column's `rows` split it top to bottom, so the area of a cell is the probability of both. Probabilities that do not add up to 1 are scaled so they fill the rectangle. A row is coloured by its index in `colors`, a column without rows by its own.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "SampleSpace"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SampleSpace-beda76de.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/sample_space.rs#L62",
      "themed": true,
      "fields": [
        {
          "name": "columns",
          "type": "Vec<SampleColumn>",
          "default": "Vec::new()",
          "docs": "The strips from left to right, each as wide as its probability and divided into rows from the top."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f64",
          "default": "6.0",
          "docs": "In units of `ui.space`."
        },
        {
          "name": "height",
          "type": "f64",
          "default": "4.0",
          "docs": "Height of the rectangle in units of `ui.space`."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "vec![theme.colors.accent, theme.colors.highlight, theme.colors.muted]",
          "docs": "Fill colours of the rows by their index (a column without rows uses its own index); repeats when there are fewer than rows, and an empty list uses `stroke`."
        },
        {
          "name": "fill_opacity",
          "type": "f32",
          "default": "0.75",
          "docs": "0 transparent to 1 opaque, for the cell fills."
        },
        {
          "name": "stroke",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the cell outlines and the braces."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the cell outlines in pixels."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the row and column labels: family, size in pixels and weight."
        },
        {
          "name": "label_fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the row and column labels."
        },
        {
          "name": "brace_depth",
          "type": "f32",
          "default": "18.0",
          "docs": "How far the brace under a column bulges, in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the cells appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the cells leave at the end of their container; `None` stays."
        },
        {
          "name": "labels_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the labels and braces appear and go; the cells use `enter` and `exit`."
        },
        {
          "name": "labels_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade the labels and braces out before the end of the container; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn bounds_in(&self, space: Space) -> Rect",
          "summary": "The whole rectangle in pixels of `space`."
        },
        {
          "signature": "fn cells_in(&self, space: Space) -> Vec<(Rect, Vec<Rect>)>",
          "summary": "The pixel rectangle of every column and of every cell in it, `(column, cells)`."
        }
      ]
    },
    {
      "name": "Saturation",
      "summary": "Its children more or less saturated (SVG `saturate`): `amount` 1 unchanged, 0 grey.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Saturation"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Saturation-67eeef6c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L321",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.6)",
          "docs": "Saturation factor: 1 unchanged, 0 grey, above 1 more saturated."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Scale",
      "summary": "Its children scaled by `scale` about the middle of the area (Remotion's `scale()`), only across with `vertical` off and only up and down with `horizontal` off. Cut to the area.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Scale"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Scale-f892dc9e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/geometry.rs#L308",
      "themed": true,
      "fields": [
        {
          "name": "scale",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "Scale factor about the middle of the area: 1 unchanged, 2 twice as big. Animatable; negative values count as 0."
        },
        {
          "name": "horizontal",
          "type": "bool",
          "default": "true",
          "docs": "`false` leaves the width unscaled."
        },
        {
          "name": "vertical",
          "type": "bool",
          "default": "true",
          "docs": "`false` leaves the height unscaled."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the result is cut to from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip id when two scales share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is scaled (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Scanlines",
      "summary": "Horizontal CRT lines over its children (Remotion's `scanlines()`). Each line `thickness` units tall, one every `spacing` units, lights the picture and the gaps darken it, so the average brightness stays: `amount` is the strength, 0 unchanged. The light is added to every channel, or with `premultiply` scales the colours, which follows the picture's brightness more closely. `offset` scrolls the lines (animate it for a rolling screen). Keep the lines at least two output pixels apart, finer lines alias. The children render twice, their alpha stays.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Scanlines"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Scanlines-ef5a45c2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L161",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.15)",
          "docs": "0 unchanged to 1 full strength of the lines. Animatable."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "4.0",
          "docs": "Distance between the middles of two lines in the children's user units; keep it at least 2 output pixels or it aliases."
        },
        {
          "name": "thickness",
          "type": "f32",
          "default": "1.0",
          "docs": "Height of each lit line in user units; at most `spacing`."
        },
        {
          "name": "offset",
          "type": "f32",
          "default": "0.0",
          "docs": "Scrolls the lines down by this many user units; animate it for a rolling screen."
        },
        {
          "name": "premultiply",
          "type": "bool",
          "default": "false",
          "docs": "`true` scales the colours instead of adding light to every channel, which follows the picture's brightness more closely."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the lines cover from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter and mask ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the lines are laid over (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ScatterPlot",
      "summary": "Dots at data points on axes. From `delay` they grow in one after another, `stagger` seconds apart, each over `run_time`. Points that are not finite are left out.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/math/plots/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/plots.md",
      "scenes": [
        "ScatterPlot"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ScatterPlot-484c5e4d.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/plot/scatter.rs#L18",
      "themed": true,
      "fields": [
        {
          "name": "points",
          "type": "Vec<(f64, f64)>",
          "default": "Vec::new()",
          "docs": "The `(x, y)` data points in data units of the axes; a point that is not finite is left out."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The mapping of the axes the dots sit on (`axes.map(ui)`)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "9.0",
          "docs": "Radius of a grown dot in pixels."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Fill colour of the dots."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first dot begins to grow."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "0.03",
          "docs": "Seconds each dot waits after the one before it."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds each dot takes to grow."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.enter",
          "docs": "Easing of each dot's growth over its run time."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "Applied to all the dots once they have grown."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the dots leave at the end of their container; `None` stays."
        }
      ],
      "methods": [
        {
          "signature": "fn grown(&self, i: usize, t: f32) -> f32",
          "summary": "How far dot `i` has grown at `t`, from 0 to 1."
        }
      ]
    },
    {
      "name": "SceneFade",
      "summary": "Fades its children in at the start and out at the end of the enclosing `Sequence` or scene (`ui.duration`). Without a known end only the fade in runs. A 0 length skips that fade.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/transitions/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/transitions.md",
      "scenes": [
        "SceneFade"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SceneFade-43efa230.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/transitions/scene_fade.rs#L16",
      "themed": true,
      "fields": [
        {
          "name": "fade_in",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds of the fade in."
        },
        {
          "name": "fade_out",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds of the fade out, ending with `ui.duration`."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.standard",
          "docs": "Easing of the fades over their lengths."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "What it fades; a closure taking the `Ui`."
        }
      ],
      "methods": [
        {
          "signature": "fn new(ui: &Ui, children: Children) -> Self",
          "summary": "Fades of the theme's `motion.duration.fast` with its standard easing."
        },
        {
          "signature": "fn opacity(&self, t: f32, length: Option<f32>) -> f32",
          "summary": "Opacity at `t` seconds of a container that lasts `length` seconds."
        }
      ]
    },
    {
      "name": "Schematic",
      "summary": "Symbols wired together. `symbols` are drawn as they are (their `enter` and `exit` aside) and `wires` connect their terminals at right angles through the corners each one gives; there is no automatic routing. Where three or more conductors meet (a terminal with two wires, or a wire ending on another) a junction dot is drawn with `junctions`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/symbol-and-schematic/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/symbol-and-schematic.md",
      "scenes": [
        "Schematic"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Schematic-f1d8bb06.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/schematic.rs#L492",
      "themed": true,
      "fields": [
        {
          "name": "symbols",
          "type": "Vec<Symbol>",
          "default": "Vec::new()",
          "docs": "The parts of the circuit, each placed with its own position, rotation and label."
        },
        {
          "name": "wires",
          "type": "Vec<Connection>",
          "default": "Vec::new()",
          "docs": "The wires between terminals or points, in order; a wire with a missing terminal is left out."
        },
        {
          "name": "current_at",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Seconds of local time when the current starts to flow and bulbs light up; `None` for no current."
        },
        {
          "name": "current_speed",
          "type": "f32",
          "default": "160.0",
          "docs": "Speed of the current dots in pixels per second, before each wire's own `current` factor."
        },
        {
          "name": "dot_spacing",
          "type": "f32",
          "default": "56.0",
          "docs": "Pixels between two current dots along a wire."
        },
        {
          "name": "junctions",
          "type": "bool",
          "default": "true",
          "docs": "Draws a dot where three or more conductors meet."
        },
        {
          "name": "wire_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the wires and junction dots."
        },
        {
          "name": "dot_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the current dots."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the wires in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the wires and symbols draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the wires and symbols leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the labels, current dots and glow fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the labels, current dots and glow fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn pin(&self, pin: Pin) -> Option<(f64, f64)>",
          "summary": "Where `pin` is, in units of `ui.space`."
        },
        {
          "signature": "fn route(&self, wire: &Connection) -> Option<Vec<(f64, f64)>>",
          "summary": "The corners of `wire` from its start to its end, in units of `ui.space`, or `None` when one of its ends does not resolve."
        },
        {
          "signature": "fn unresolved(&self) -> Vec<usize>",
          "summary": "The indices of the wires with an end that names a missing symbol or terminal."
        },
        {
          "signature": "fn flowing(&self, now: f32) -> f32",
          "summary": "Seconds the current has flowed at `now`, 0 before it starts or without it."
        },
        {
          "signature": "fn junctions(&self) -> Vec<(f64, f64)>",
          "summary": "The points where three or more conductors meet, in units of `ui.space`: the ends of wires, counting a terminal as one conductor and a wire that runs on through the point as two."
        }
      ]
    },
    {
      "name": "ScreenRectangle",
      "summary": "A rectangle in a screen's proportions (Manim `ScreenRectangle`): 16:9, half the canvas tall, in its middle.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "ScreenRectangle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ScreenRectangle-d98024d6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/polygram.rs#L161",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "960.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "540.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "540.0",
          "docs": "Height in pixels; the width is `height * aspect_ratio`."
        },
        {
          "name": "aspect_ratio",
          "type": "f32",
          "default": "16.0 / 9.0",
          "docs": "Width divided by height."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Secant",
      "summary": "The secant of `f` through `x` and `x + dx`, extended `extend` pixels past both points, with dots on them and, when `legs` is set, the dashed `dx` and `dy` legs (Manim's `get_secant_slope_group`). As `dx` goes to 0 it turns into the tangent.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/tangent-and-secant/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/tangent-and-secant.md",
      "scenes": [
        "Secant"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Secant-16faf54c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/calculus.rs#L143",
      "themed": true,
      "fields": [
        {
          "name": "f",
          "type": "Func",
          "default": "|x| x",
          "docs": "The function, taking x in the axes' coordinates and returning y."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The axes (an `AxesMap`) the function sits on; turns graph coordinates into canvas points."
        },
        {
          "name": "x",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "The x, in the axes' coordinates, of the first point; a tracker so it can slide along the graph."
        },
        {
          "name": "dx",
          "type": "ValueTracker",
          "default": "1.0.into()",
          "docs": "The distance from `x` to the second point, in the axes' x units; as it goes to 0 the secant becomes the tangent."
        },
        {
          "name": "extend",
          "type": "f32",
          "default": "120.0",
          "docs": "Pixels the line runs past each of the two points."
        },
        {
          "name": "legs",
          "type": "bool",
          "default": "true",
          "docs": "Draws the dashed `dx` and `dy` legs of the slope triangle when `true`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the secant line and its dots."
        },
        {
          "name": "legs_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed legs."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Line width in pixels; the legs draw at half of it."
        },
        {
          "name": "dot",
          "type": "f32",
          "default": "10.0",
          "docs": "Radius in pixels of the dots on the two points; `0` for no dots."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        }
      ],
      "methods": []
    },
    {
      "name": "Sector",
      "summary": "A slice of a disc from `start_angle` by `angle` (Manim `Sector`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Sector"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Sector-ffae562a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L188",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels."
        },
        {
          "name": "start_angle",
          "type": "f32",
          "default": "0.0",
          "docs": "Where the slice starts, in radians counterclockwise on screen from the right (0 is right)."
        },
        {
          "name": "angle",
          "type": "f32",
          "default": "std::f32::consts::FRAC_PI_2",
          "docs": "How far the slice turns, in radians; counterclockwise on screen for a positive value."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Sequence",
      "summary": "Shows its children from `from` seconds on, for `duration` seconds or until the parent ends. Inside, time starts at 0 and `ui.duration` is the sequence's length.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades/",
      "markdown": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades.md",
      "scenes": [
        "Sequence"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Sequence-c55dbbba.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/time.rs#L27",
      "themed": true,
      "fields": [
        {
          "name": "from",
          "type": "f32",
          "default": "0.0",
          "docs": "Start in the parent's local seconds."
        },
        {
          "name": "duration",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Length in seconds; `None` runs until the parent ends."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "What it shows; a closure taking the `Ui`, whose time starts at 0 at `from`."
        }
      ],
      "methods": []
    },
    {
      "name": "SequenceDiagram",
      "summary": "A sequence diagram: `participants` as boxes along the top, `spacing` pixels apart, with dashed lifelines below, centred on `center` (units of `ui.space`). From `delay` it sends one of `messages` every `step_time` seconds, `row` pixels below the one before: a packet travels from the sender's lifeline to the receiver's in the first `travel` of the step, drawing the arrow behind it, and the label appears above it, cut with `…` to fit between the lifelines. A message to the sender itself loops out to the right. The message being sent is in `active_color`, earlier ones in `message_color`; replies are dashed. With `numbers` the labels are numbered. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/sequence-diagram/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/sequence-diagram.md",
      "scenes": [
        "SequenceDiagram"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SequenceDiagram-6ae641c4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/sequence.rs#L79",
      "themed": true,
      "fields": [
        {
          "name": "participants",
          "type": "Vec<String>",
          "default": "Vec::new()",
          "docs": "Names of the participants, left to right; each is a box on top of a dashed lifeline."
        },
        {
          "name": "messages",
          "type": "Vec<Message>",
          "default": "Vec::new()",
          "docs": "The messages in sending order, one per step; each goes between two participants."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first message is sent."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "1.0",
          "docs": "Seconds between the start of one message and the start of the next."
        },
        {
          "name": "travel",
          "type": "f32",
          "default": "0.6",
          "docs": "Fraction of `step_time`, 0..1, a packet takes to travel from sender to receiver."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the diagram, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "420.0",
          "docs": "Pixels between neighbouring lifelines."
        },
        {
          "name": "row",
          "type": "f32",
          "default": "76.0",
          "docs": "Pixels between one message and the next below it."
        },
        {
          "name": "numbers",
          "type": "bool",
          "default": "true",
          "docs": "Whether the message labels are numbered."
        },
        {
          "name": "box_color",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Fill of the participant boxes."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the lifelines and the box outlines."
        },
        {
          "name": "message_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the arrows of messages already sent."
        },
        {
          "name": "active_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the message being sent."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the participant names and the message labels."
        },
        {
          "name": "name_style",
          "type": "TextStyle",
          "default": "name_style",
          "docs": "The font of the participant names."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the message labels."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Series",
      "summary": "Children one after the other, each for its own number of seconds. Each item starts `overlap` seconds before the previous one ends, so both show during the overlap.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades/",
      "markdown": "https://fframes-kit.pages.dev/docs/basics/time-containers-and-fades.md",
      "scenes": [
        "Series"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Series-29964794.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/time.rs#L65",
      "themed": false,
      "fields": [
        {
          "name": "items",
          "type": "Vec<(f32, Children)>",
          "default": null,
          "docs": "`(seconds, children)` in play order."
        },
        {
          "name": "overlap",
          "type": "f32",
          "default": null,
          "docs": "Seconds each item overlaps the one before it; 0 plays them back to back."
        }
      ],
      "methods": []
    },
    {
      "name": "ShaderNoise",
      "summary": "Film grain on the GPU: a grey value per `scale` pixel cell at `opacity`, over a `size` area from the top left. The same `seed` gives the same grain; with `animated` it moves on every frame. Only the Skia backend runs shaders: the CPU backend draws nothing and the editor a placeholder, so use `Noise` where those matter.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "ShaderNoise"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ShaderNoise-a59dcd5e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/noise.rs#L132",
      "themed": true,
      "fields": [
        {
          "name": "seed",
          "type": "u32",
          "default": "0",
          "docs": "Seeds the grain; the same seed draws the same grain."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "0.12",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "scale",
          "type": "f32",
          "default": "2.0",
          "docs": "Side of one grain cell in pixels of the canvas; at least 1."
        },
        {
          "name": "animated",
          "type": "bool",
          "default": "true",
          "docs": "`true` moves the seed on every frame so the grain flickers; `false` keeps it still."
        },
        {
          "name": "size",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the grain area from the top left, in pixels of the canvas."
        }
      ],
      "methods": []
    },
    {
      "name": "ShadowsHighlights",
      "summary": "Shadows and highlights: `shadows` lifts the dark tones (up to a sixth at 1) and `highlights` pulls the light tones down, through a curve on every channel. An approximation: the real effect looks at each pixel's neighbourhood, this curve only at the pixel's own value.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "ShadowsHighlights"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ShadowsHighlights-1db2af54.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L565",
      "themed": true,
      "fields": [
        {
          "name": "shadows",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.6)",
          "docs": "How much the dark tones are lifted, 0 to 1 (up to a sixth of the range)."
        },
        {
          "name": "highlights",
          "type": "f32",
          "default": "0.3",
          "docs": "How much the light tones are pulled down, 0 to 1 (up to a sixth of the range)."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ShowPassingFlash",
      "summary": "A piece of the outline `time_width` long runs along it once; nothing is drawn before or after (Manim's `ShowPassingFlash`). Draw the shape itself separately to keep it. A shape without an outline flashes in its fill colour.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ShowPassingFlash"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ShowPassingFlash-c13a4126.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/indicate_ii.rs#L127",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape; its outline is what the effect draws (its fill colour is used if it has no stroke), the shape itself is not drawn."
        },
        {
          "name": "time_width",
          "type": "f32",
          "default": null,
          "docs": "Length of the flash as a fraction of the outline's length."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape) -> Self",
          "summary": "Along `shape` in Manim's 1 second, smooth, a tenth of it long."
        }
      ]
    },
    {
      "name": "ShowPassingFlashWithThinningStrokeWidth",
      "summary": "`n_segments` passing flashes over each other: the head is wide, the tail thins out behind it (Manim's `ShowPassingFlashWithThinningStrokeWidth`). The widest is the shape's stroke width (at least 2).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "ShowPassingFlashWithThinningStrokeWidth"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ShowPassingFlashWithThinningStrokeWidth-3cc1606b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/indicate_ii.rs#L172",
      "themed": false,
      "fields": [
        {
          "name": "shape",
          "type": "Shape",
          "default": null,
          "docs": "The shape; its outline is what the effect draws (its fill colour is used if it has no stroke), the shape itself is not drawn."
        },
        {
          "name": "n_segments",
          "type": "usize",
          "default": null,
          "docs": "How many flashes are layered; more make a smoother taper (at least 2)."
        },
        {
          "name": "time_width",
          "type": "f32",
          "default": null,
          "docs": "Length of the longest, thinnest flash as a fraction of the outline's length."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(shape: Shape) -> Self",
          "summary": "Along `shape` in Manim's 1 second, smooth, 10 segments, a tenth of it long."
        },
        {
          "signature": "fn segments(&self) -> Vec<(f32, f32)>",
          "summary": "`(stroke width, time width)` of every flash that draws something: Manim's widths from 0 to the widest against time widths from `time_width` to 0, without the ends."
        }
      ]
    },
    {
      "name": "Shrinkwrap",
      "summary": "Its children shrink-wrapped in plastic (Remotion's `shrinkwrap()`): glossy glints on `feTurbulence` wrinkles, brightest at `highlight_intensity`, a stretched highlight along the edges facing the top left at `edge_tension`, all scaled by `amount` (0 unchanged). `wrinkle_density` from 0 (broad folds) to 1 (tight texture) and `seed` pick the wrinkles. Remotion also displaces the picture along the wrinkles; that needs `feDisplacementMap`, which the CPU backend draws wrongly, so it is left out.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Shrinkwrap"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Shrinkwrap-9c51771e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/edges.rs#L191",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 unchanged to 1 full strength of every wrap effect. Animatable."
        },
        {
          "name": "highlight_intensity",
          "type": "f32",
          "default": "0.75",
          "docs": "Brightness of the glossy glints on the wrinkles; 0 for none."
        },
        {
          "name": "wrinkle_density",
          "type": "f32",
          "default": "0.42",
          "docs": "0 broad folds to 1 tight texture."
        },
        {
          "name": "edge_tension",
          "type": "f32",
          "default": "0.45",
          "docs": "0 to 1 strength of the stretched highlight along the edges that face the top left."
        },
        {
          "name": "seed",
          "type": "u32",
          "default": "0",
          "docs": "Picks the wrinkle pattern."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Skew",
      "summary": "Its children slanted (Remotion's `skew()`): `x` degrees along the horizontal, then `y` along the vertical, like CSS `skewX` and `skewY`, about `origin` (0 to 1 across the area). Cut to the area.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Skew"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Skew-ba606906.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/geometry.rs#L255",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(20.0)",
          "docs": "Degrees of slant along the horizontal, like CSS `skewX`. Animatable."
        },
        {
          "name": "y",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.0)",
          "docs": "Degrees of slant along the vertical, like CSS `skewY`, applied after `x`. Animatable."
        },
        {
          "name": "origin",
          "type": "(f32, f32)",
          "default": "(0.5, 0.5)",
          "docs": "Fixed point of the slant, as 0 to 1 fractions of `area` (x, y); `(0.5, 0.5)` is the middle."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the result is cut to from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip id when two skews share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is slanted (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Slide",
      "summary": "One slide of a `Deck`: a layout that builds in, then holds.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/slides/slides/",
      "markdown": "https://fframes-kit.pages.dev/docs/slides/slides.md",
      "scenes": [
        "SlidesTitle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SlidesTitle-602bb413.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/slides/slide.rs#L19",
      "themed": false,
      "fields": [
        {
          "name": "key",
          "type": "&str",
          "default": null,
          "docs": "The slide's stable name: its scene name in a deck, the key of its clips in fframes Studio's timeline and of its stops. Unique in a deck; keep it when the slide changes."
        },
        {
          "name": "layout",
          "type": "SlideLayout",
          "default": null,
          "docs": "What the slide shows."
        },
        {
          "name": "build",
          "type": "Option<f32>",
          "default": null,
          "docs": "Seconds the build-in takes. `None` keeps the layout's own timing; a value stretches or squeezes it to that length, and 0 shows every part from the first frame."
        },
        {
          "name": "hold",
          "type": "f32",
          "default": null,
          "docs": "Seconds the built slide stays before it ends, 1 by default."
        },
        {
          "name": "notes",
          "type": "Option<&str>",
          "default": null,
          "docs": "Speaker notes, for presenting; not drawn."
        },
        {
          "name": "backdrop",
          "type": "Backdrop",
          "default": null,
          "docs": "What is drawn behind the layout, `Backdrop::Plain` (the theme's background) by default."
        },
        {
          "name": "footer",
          "type": "Option<SlideFooter>",
          "default": null,
          "docs": "A label and page number along the bottom; `None` for none. `Deck::footer` sets one on every slide but title pages."
        }
      ],
      "methods": [
        {
          "signature": "fn new(key: &str, layout: SlideLayout) -> Self",
          "summary": "A slide with the layout's own build-in, a hold of 1 second, no notes, a plain backdrop and no footer."
        },
        {
          "signature": "fn build_seconds(&self) -> f32",
          "summary": "Seconds the build-in takes: `build`, or the layout's own timing without one."
        },
        {
          "signature": "fn seconds(&self) -> f32",
          "summary": "Seconds the slide lasts: its build-in plus its hold."
        },
        {
          "signature": "fn reveal_times(&self) -> Vec<f32>",
          "summary": "Seconds into the slide when each bullet of a `SlideLayout::Bullets` is fully in, one per item in order; empty for the other layouts. A presenter stops at these."
        },
        {
          "signature": "fn notes(&self) -> Option<&str>",
          "summary": "The speaker notes."
        }
      ]
    },
    {
      "name": "SmoothedVectorizedHomotopy",
      "summary": "`Homotopy` whose path gets smooth handles after every step (Manim's `SmoothedVectorizedHomotopy`), for maps that would leave corners.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "SmoothedVectorizedHomotopy"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SmoothedVectorizedHomotopy-47f61aee.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/homotopy.rs#L127",
      "themed": false,
      "fields": [
        {
          "name": "homotopy",
          "type": "Homotopy",
          "default": null,
          "docs": "The homotopy to play; its path is smoothed after every step."
        }
      ],
      "methods": []
    },
    {
      "name": "SortVisualizer",
      "summary": "A sort as bars, `width` by `height` pixels around `center` (units of `ui.space`), each as tall as its value. It plays an `ArrayTrace` from `ArrayTrace::bubble`, `insertion`, `merge` or `quick`, one step every `step_time` seconds from `delay`: the compared bars light up, moved bars slide to their new place, and bars in their final place turn `colors.sorted`. `name` is written above the bars with the comparisons and moves so far; `values` writes each value under its bar and `notes` the step under the figure. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/sort-visualizer/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/sort-visualizer.md",
      "scenes": [
        "SortVisualizer"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SortVisualizer-2acf90ab.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/sort.rs#L30",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&ArrayTrace>",
          "default": "None",
          "docs": "The recorded steps to play (an `ArrayTrace` of a sort); `None` draws nothing."
        },
        {
          "name": "name",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "Name of the algorithm written above the bars; empty for none."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.25",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the figure, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "900.0",
          "docs": "Width of the bars area in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "420.0",
          "docs": "Height in pixels of the tallest bar."
        },
        {
          "name": "values",
          "type": "bool",
          "default": "true",
          "docs": "Whether each value is written under its bar."
        },
        {
          "name": "counts",
          "type": "bool",
          "default": "true",
          "docs": "Whether the comparisons and moves so far are counted next to the name."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the bars."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": null,
          "docs": "Colours of the bars in each state (compared, moved, sorted)."
        },
        {
          "name": "muted",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the counts, the values and the notes."
        },
        {
          "name": "name_style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the algorithm name."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the values, counts and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Spark",
      "summary": "A sparkle: `points` sharp points joined by curves that pass `inner` times the size from the center (Remotion's star with rounded inner corners).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Spark"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Spark-b2f0575c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/remotion.rs#L190",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "100.0",
          "docs": "Distance in pixels from the center to each point."
        },
        {
          "name": "points",
          "type": "usize",
          "default": "4",
          "docs": "Number of points (at least 2)."
        },
        {
          "name": "inner",
          "type": "f32",
          "default": "0.2",
          "docs": "Distance of the curves' control point from the center as a fraction of `size`; smaller gives thinner points."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Speckle",
      "summary": "Small holes punched through its children (Remotion's `speckle()`): a share `density` of the cells of a grid gets a round hole `size` units across. `randomness` moves the holes off the cell centres and varies their size (0 keeps a regular grid). One cell is 2.5 holes wide; a grid finer than about 20,000 holes is drawn coarser.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Speckle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Speckle-09533492.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/textures.rs#L216",
      "themed": true,
      "fields": [
        {
          "name": "density",
          "type": "f32",
          "default": "0.08",
          "docs": "0 to 1 share of the grid cells that get a hole."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "4.0",
          "docs": "Diameter of a hole in the children's user units; one cell is 2.5 holes wide."
        },
        {
          "name": "randomness",
          "type": "f32",
          "default": "1.0",
          "docs": "0 to 1: how far holes move off the cell centers and vary in size; 0 keeps a regular grid."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the holes cover from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask id when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the holes are punched through (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn holes(&self) -> Vec<(f32, f32, f32)>",
          "summary": "The holes: their centres and radii."
        }
      ]
    },
    {
      "name": "SpectrumBars",
      "summary": "One rounded bar per value, spread over `width` from `x`. A value becomes `value * gain` pixels, kept between `min_height` and `max_height`; NaN draws the shortest bar. Pass the values of `spectrum` (often `.step_by(n)` or `center_spectrum_low_frequencies`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "SpectrumBars"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SpectrumBars-9ecb0420.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/audio/spectrum.rs#L42",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<f32>",
          "default": "Vec::new()",
          "docs": "One bar per value, left to right; empty draws nothing."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left edge of the bars in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Vertical anchor of the bars in pixels of the canvas: their middle with `BarAlign::Center`, their foot with `BarAlign::Bottom`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1920.0",
          "docs": "Width in pixels the bars are spread over."
        },
        {
          "name": "bar_width",
          "type": "f32",
          "default": "24.0",
          "docs": "Width of one bar in pixels."
        },
        {
          "name": "gain",
          "type": "f32",
          "default": "60.0",
          "docs": "Pixels of bar height per unit of value."
        },
        {
          "name": "min_height",
          "type": "f32",
          "default": "24.0",
          "docs": "Shortest bar in pixels; also used for NaN."
        },
        {
          "name": "max_height",
          "type": "f32",
          "default": "720.0",
          "docs": "Tallest bar in pixels."
        },
        {
          "name": "radius",
          "type": "Option<f32>",
          "default": "None",
          "docs": "`None` rounds the ends fully (half the bar width)."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the bars."
        },
        {
          "name": "align",
          "type": "BarAlign",
          "default": "BarAlign::Center",
          "docs": "Whether the bars grow up and down from `y` or only up."
        }
      ],
      "methods": [
        {
          "signature": "fn height(&self, value: f32) -> f32",
          "summary": "The height in pixels a value is drawn at."
        }
      ]
    },
    {
      "name": "SpringMass",
      "summary": "A block on a horizontal spring fixed to a wall at `wall` (units of `ui.space`, the middle of the spring's end; `scale` units per meter), oscillating as `motion` says from `delay` seconds after the local start. The block rests `rest_length` meters from the wall, marked by a dashed line. With `plot`, the displacement so far is drawn on those axes (time in seconds along x, meters up y) with a dot at the current value, so the oscillation and its graph move together; show the axes yourself. The wall and floor draw with `enter`, the rest fades with `parts_enter`. Without `motion` nothing is drawn.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/spring-mass/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/spring-mass.md",
      "scenes": [
        "SpringMass"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SpringMass-0339f9ad.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/spring.rs#L93",
      "themed": true,
      "fields": [
        {
          "name": "motion",
          "type": "Option<&SpringMotion>",
          "default": "None",
          "docs": "The simulated oscillation to draw, built once in the video's constructor; `None` draws nothing."
        },
        {
          "name": "wall",
          "type": "(f64, f64)",
          "default": "(-6.0, 1.5)",
          "docs": "Where the spring is fixed to the wall (the middle of its end), in units of `ui.space`."
        },
        {
          "name": "rest_length",
          "type": "f64",
          "default": "3.0",
          "docs": "Meters from the wall to the block's near side at rest; the dashed line marks it."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the local start before the block is let go."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "coils",
          "type": "usize",
          "default": "10",
          "docs": "Number of turns of the zigzag that draws the spring."
        },
        {
          "name": "block_size",
          "type": "f32",
          "default": "110.0",
          "docs": "Side of the square block in pixels."
        },
        {
          "name": "plot",
          "type": "Option<AxesMap>",
          "default": "None",
          "docs": "Axes to plot the displacement on as the block moves (time in seconds along x, meters along y); `None` for no plot. Draw the axes yourself."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the spring, the wall and the floor."
        },
        {
          "name": "block_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the block."
        },
        {
          "name": "plot_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the displacement plot and its dot."
        },
        {
          "name": "guide_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed rest line."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the spring, the wall, the floor and the plot in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the wall, floor and rest line draw in; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the wall, floor and rest line leave at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the spring, block and plot fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the spring, block and plot fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Square",
      "summary": "A square with sides of `side_length` (Manim `Square`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Square"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Square-c32538c5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L331",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "side_length",
          "type": "f32",
          "default": "200.0",
          "docs": "Length of each side in pixels."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Stack",
      "summary": "A stack: boxes `width` by `height` pixels piled up from the bottom of a container that holds `capacity` of them, centred on `center` (units of `ui.space`), with a `top` marker beside the top box. It plays a `ListTrace` (the last item is the top), one step every `step_time` seconds from `delay`: pushed boxes drop in from above, popped ones rise out. With `indices` (manim-dsa's `add_indexes`) each box has its index left of the container, 0 at the bottom, and `label` (`add_label`, empty for none) is written under it. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/linked-list-stack-and-queue/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/linked-list-stack-and-queue.md",
      "scenes": [
        "Stack"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Stack-96baf98c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/list.rs#L718",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&ListTrace>",
          "default": "None",
          "docs": "The recorded steps to play (`ListTrace`, the last item is the top); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.7",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the container, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "220.0",
          "docs": "Width of a box in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "60.0",
          "docs": "Height of a box in pixels."
        },
        {
          "name": "gap",
          "type": "f32",
          "default": "10.0",
          "docs": "Space between neighbouring boxes in pixels."
        },
        {
          "name": "capacity",
          "type": "usize",
          "default": "5",
          "docs": "How many boxes the container holds; sets its height."
        },
        {
          "name": "indices",
          "type": "bool",
          "default": "false",
          "docs": "Whether each box has its index left of the container, 0 at the bottom."
        },
        {
          "name": "label",
          "type": "&str",
          "default": "\"\"",
          "docs": "Text written under the container; empty for none."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the stack."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the boxes in each state (visited, moved, found)."
        },
        {
          "name": "frame_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the container's outline."
        },
        {
          "name": "marker_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the `top` marker."
        },
        {
          "name": "index_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the indices."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the label under the container."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the values in the boxes."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the marker, indices and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Star",
      "summary": "A star with `n` points (Manim `Star`, Remotion `Star`). The first point is at the top; `inner_radius` is where the edges meet between the points.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Star"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Star-a9ca121e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L372",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "n",
          "type": "usize",
          "default": "5",
          "docs": "Number of points (at least 2)."
        },
        {
          "name": "outer_radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels of the points."
        },
        {
          "name": "inner_radius",
          "type": "f32",
          "default": "38.2",
          "docs": "Radius in pixels of the notches between the points."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Starburst",
      "summary": "Rays of colour from a point (Remotion's `starburst()`): `rays` (2 to 100) wedges round `origin` (0 to 1 across the area), coloured with `colors` in turn and turned `rotation` degrees clockwise; the first ray starts on the left. `smoothness` (0 to 1) blends each ray into the next over that share of a ray. It replaces the layer, so it takes no children.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Starburst"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Starburst-ed36bcd5.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/light_leak.rs#L302",
      "themed": true,
      "fields": [
        {
          "name": "rays",
          "type": "u32",
          "default": "12",
          "docs": "Number of wedges round `origin`, 2 to 100."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "vec![theme.colors.accent, theme.colors.background]",
          "docs": "Colours of the wedges, used in turn; empty draws nothing."
        },
        {
          "name": "rotation",
          "type": "f32",
          "default": "0.0",
          "docs": "Degrees the rays are turned clockwise; the first ray starts on the left."
        },
        {
          "name": "smoothness",
          "type": "f32",
          "default": "0.0",
          "docs": "0 to 1: the share of a ray over which it blends into the next; 0 for hard edges."
        },
        {
          "name": "origin",
          "type": "(f32, f32)",
          "default": "(0.5, 0.5)",
          "docs": "Where the rays meet, as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the rays fill from the top left, in pixels of the canvas."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip id when two starbursts share a frame."
        }
      ],
      "methods": [
        {
          "signature": "fn wedges(&self) -> Vec<(f32, f32, usize)>",
          "summary": "The rays as `(start, end, colour index)`, in degrees clockwise from the right."
        }
      ]
    },
    {
      "name": "StateMachine",
      "summary": "A state machine running over its input: round states `radius` pixels (accepting ones with a second ring), `spacing` pixels between columns and `level` pixels between rows, centred on `center` (units of `ui.space`), an arrow into the start state, labelled transitions (loops above their state, pairs that point both ways bent apart) and the input as a tape underneath. It plays a `MachineTrace`, one step every `step_time` seconds from `delay`: a token travels along the transition taken while the tape's symbol lights up, the current state lights up, and at the end it turns `colors.found` when the input is accepted or `reject_color` when not. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/machine-machine-trace-and-state-machine/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/machine-machine-trace-and-state-machine.md",
      "scenes": [
        "StateMachine"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/StateMachine-141e50b6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/machine.rs#L224",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&MachineTrace>",
          "default": "None",
          "docs": "The recorded steps to play (`MachineTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.9",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the machine, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "240.0",
          "docs": "Pixels between columns of states."
        },
        {
          "name": "level",
          "type": "f32",
          "default": "170.0",
          "docs": "Pixels between rows of states."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "40.0",
          "docs": "Radius of a state in pixels."
        },
        {
          "name": "tape",
          "type": "bool",
          "default": "true",
          "docs": "Whether the input is drawn as a tape under the machine."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the machine."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the states in each state of the run (`colors.found` for an accepted input)."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the transitions and the arrow into the start state."
        },
        {
          "name": "active_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the transition being taken, its label and the travelling token."
        },
        {
          "name": "reject_color",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "Colour of the current state when the input is rejected."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the state names and the tape symbols."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the transition labels and notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "StatesOfMatter",
      "summary": "Particles in a box changing state, from `from` to `to` over `duration` seconds after `at`: in a solid they vibrate on a lattice at the bottom, in a liquid they wander past each other and in a gas they fly across the whole box and bounce off its walls. Between two states the motions blend, and the particles turn from `cold_color` to `hot_color`. `columns` by `rows` particles of `radius` pixels sit in a `width` by `height` pixel box around `center` (units of `ui.space`). Positions are a function of the time and `seed` only, so every frame renders on its own and the same everywhere. With `labels` the state, or the change under way, is written under the box. The box draws with `enter`, the particles and the label fade with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/states-of-matter/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/states-of-matter.md",
      "scenes": [
        "StatesOfMatter"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/StatesOfMatter-6246045e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/states.rs#L85",
      "themed": true,
      "fields": [
        {
          "name": "seed",
          "type": "u64",
          "default": "1",
          "docs": "Seed of the particles' motion; the same seed gives the same picture on every frame and machine."
        },
        {
          "name": "columns",
          "type": "usize",
          "default": "8",
          "docs": "Particles per row of the starting lattice."
        },
        {
          "name": "rows",
          "type": "usize",
          "default": "4",
          "docs": "Rows of particles in the starting lattice."
        },
        {
          "name": "from",
          "type": "MatterState",
          "default": "MatterState::Solid",
          "docs": "State the particles start in."
        },
        {
          "name": "to",
          "type": "MatterState",
          "default": "MatterState::Gas",
          "docs": "State the particles end in."
        },
        {
          "name": "at",
          "type": "f32",
          "default": "1.0",
          "docs": "Seconds after the container's start when the change begins."
        },
        {
          "name": "duration",
          "type": "f32",
          "default": "4.0",
          "docs": "Seconds the change from `from` to `to` takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the box, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "760.0",
          "docs": "Width of the box in pixels."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "520.0",
          "docs": "Height of the box in pixels."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "18.0",
          "docs": "Radius of a particle in pixels."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the state, or the change under way, under the box; `false` for none."
        },
        {
          "name": "box_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the box outline."
        },
        {
          "name": "cold_color",
          "type": "Color",
          "default": "Color::hex(\"#4dabf7\")",
          "docs": "Colour of the particles in a solid; they blend to `hot_color` as the state warms."
        },
        {
          "name": "hot_color",
          "type": "Color",
          "default": "Color::hex(\"#ff6b6b\")",
          "docs": "Colour of the particles in a gas."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the state label."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width in pixels of the box outline."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the box draws; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the box leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the particles and the label; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the particles and the label before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn level(&self, seconds: f32) -> f64",
          "summary": "The particles' level at `seconds`: 0 a solid, 1 a liquid, 2 a gas."
        },
        {
          "signature": "fn positions(&self, seconds: f32) -> Vec<Vec2>",
          "summary": "The particles' centres at `seconds`, from the box's middle in pixels (y down)."
        }
      ]
    },
    {
      "name": "StreamLines",
      "summary": "Lines that follow a `VectorField` (Manim `StreamLines`): from every grid point, moved by a seeded `noise_factor`, a point moves along the field in steps of `dt` for `virtual_time`, until it leaves the grid by more than `padding` units. Each line takes the colour of the field's magnitude at its middle.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "StreamLines"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/StreamLines-99737856.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/stream_lines.rs#L55",
      "themed": true,
      "fields": [
        {
          "name": "field",
          "type": "VectorField",
          "default": "VectorField::themed(theme)",
          "docs": "The vector field the lines follow, with the box of grid points they start from and the colour by length."
        },
        {
          "name": "dt",
          "type": "f64",
          "default": "0.05",
          "docs": "Seconds of virtual time per step of a line."
        },
        {
          "name": "virtual_time",
          "type": "f64",
          "default": "3.0",
          "docs": "Seconds of virtual time each line is followed for; with `dt` it sets how long the lines get."
        },
        {
          "name": "max_anchors_per_line",
          "type": "usize",
          "default": "100",
          "docs": "Most points kept per line; longer runs keep every n-th point."
        },
        {
          "name": "padding",
          "type": "f64",
          "default": "3.0",
          "docs": "Units of `ui.space` outside the field's box a line may wander before it ends."
        },
        {
          "name": "n_repeats",
          "type": "usize",
          "default": "1",
          "docs": "How many lines start from every grid point."
        },
        {
          "name": "noise_factor",
          "type": "Option<f64>",
          "default": "None",
          "docs": "How far, in units, a start moves from its grid point; `None` is half the grid step."
        },
        {
          "name": "seed",
          "type": "u64",
          "default": "0",
          "docs": "Seed of the start offsets and of where each line begins its flow; the same seed gives the same picture."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the lines in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "flow",
          "type": "Option<Flow>",
          "default": "None",
          "docs": "A piece of every line that runs along it, over and over; `None` draws the whole lines."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the lines appear when there is no `flow` (`Create`, ..); `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the lines leave at the end of their container; `None` stays."
        }
      ],
      "methods": [
        {
          "signature": "fn lines(&self) -> Arc<[(f64, f64)]>",
          "summary": "The traced lines in units of `ui.space`, separated by a `(NaN, NaN)` point."
        }
      ]
    },
    {
      "name": "Succession",
      "summary": "Each child starts when the one before it has run `run_time` seconds (Manim's `Succession`, a `LaggedStart` with `lag_ratio` 1).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "Succession"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Succession-a98cb5a9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/group.rs#L97",
      "themed": false,
      "fields": [
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds each child runs before the next one starts."
        },
        {
          "name": "children",
          "type": "Vec<Children>",
          "default": null,
          "docs": "The children in order; each is a closure taking the `Ui`."
        }
      ],
      "methods": []
    },
    {
      "name": "SurroundingRectangle",
      "summary": "A rectangle `buff` outside a box (Manim `SurroundingRectangle`), in the highlight colour.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "SurroundingRectangle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SurroundingRectangle-a8ce1abf.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/matchers.rs#L22",
      "themed": true,
      "fields": [
        {
          "name": "around",
          "type": "Rect",
          "default": "Rect::ZERO",
          "docs": "The box it is drawn around, in pixels of the canvas."
        },
        {
          "name": "buff",
          "type": "f32",
          "default": "SMALL_BUFF",
          "docs": "Gap in pixels between the box and the rectangle."
        },
        {
          "name": "corner_radius",
          "type": "f32",
          "default": "0.0",
          "docs": "Radius of the rounded corners in pixels; 0 for square corners."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": null,
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": null,
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": null,
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "SvgPath",
      "summary": "One path given as SVG path data (Manim `VMobjectFromSVGPath`), in canvas pixels as written: `SvgPath { path: paths::parse_path(\"M0 0 L100 0\")?, ..ui.defaults() }`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "SvgPath"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SvgPath-8d51321b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/svg_import.rs#L372",
      "themed": true,
      "fields": [
        {
          "name": "path",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The path as SVG path data, in pixels of the canvas as written."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "SvgShape",
      "summary": "An SVG drawing as a shape (Manim `SVGMobject`). Parse the file once with `SvgShape::parse` and keep it; a clone shares the parts. The drawing is centered on `(cx, cy)` and scaled to `height`. Every path keeps the file's paint unless `fill` or `stroke` replace it; `fill_part`, `stroke_part` and `only` change single parts. Text and images in the file are not drawn (convert text to paths before export) and a gradient is drawn in its first stop's colour; `inspect` warns about them.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "SvgShape"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/SvgShape-04de744c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/svg_import.rs#L194",
      "themed": true,
      "fields": [
        {
          "name": "parts",
          "type": "Arc<Vec<SvgPart>>",
          "default": "Arc::default()",
          "docs": "The paths of the file with their paint, from `SvgShape::parse`; clones share them."
        },
        {
          "name": "cx",
          "type": "f32",
          "default": "960.0",
          "docs": "Center x in pixels of the canvas the drawing is placed on."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "540.0",
          "docs": "Center y in pixels of the canvas the drawing is placed on (y down)."
        },
        {
          "name": "height",
          "type": "Option<f32>",
          "default": "Some(270.0)",
          "docs": "The drawn height; `None` keeps the file's size and position."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Replaces the fill of every filled part."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Replaces the outline color of every outlined part."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        },
        {
          "name": "unsupported",
          "type": "Arc<Vec<String>>",
          "default": "Arc::default()",
          "docs": "What the file holds that is not drawn as it is; `inspect` lists it."
        }
      ],
      "methods": [
        {
          "signature": "fn parse(svg: &str) -> Result<Self, SvgError>",
          "summary": "The paths of `svg` with the default placement: 270 px tall in the middle of the canvas."
        },
        {
          "signature": "fn part(&self, key: impl Into<PartKey>) -> Option<&SvgPart>",
          "summary": "The first part that `key` names."
        },
        {
          "signature": "fn fill_part(self, key: impl Into<PartKey>, color: Color) -> Self",
          "summary": "Fills the parts that `key` names with `color`."
        },
        {
          "signature": "fn stroke_part(self, key: impl Into<PartKey>, color: Color) -> Self",
          "summary": "Outlines the parts that `key` names in `color`, keeping their width (2 px when they had no outline)."
        },
        {
          "signature": "fn only(self, keep: impl Fn(usize, &SvgPart) -> bool) -> Self",
          "summary": "Keeps the parts for which `keep(index, part)` is true. Indexes stay those of the file for the closure, not for later calls."
        },
        {
          "signature": "fn shapes(&self) -> Vec<Shape>",
          "summary": "Every part placed on the canvas with its paint."
        }
      ]
    },
    {
      "name": "Swap",
      "summary": "Two shapes trade places on arcs (Manim's `Swap`, a `CyclicReplace` of two).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "Swap"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Swap-c6d833a3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L278",
      "themed": false,
      "fields": [
        {
          "name": "first",
          "type": "Shape",
          "default": null,
          "docs": "The shape that moves to where `second` is."
        },
        {
          "name": "second",
          "type": "Shape",
          "default": null,
          "docs": "The shape that moves to where `first` is."
        },
        {
          "name": "path_arc",
          "type": "f32",
          "default": null,
          "docs": "Radians of the arc each shape travels on; positive turns counterclockwise, 0 is a straight line."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(first: Shape, second: Shape) -> Self",
          "summary": "Manim's quarter turns in 1 second, smooth."
        }
      ]
    },
    {
      "name": "Symbol",
      "summary": "A circuit symbol, Manim-circuit's `Resistor`, `Capacitor` and the rest: `kind` drawn at `at` (units of `ui.space`), turned `rotation` degrees counterclockwise, `size` units from its middle to a terminal. `terminal` gives where a wire attaches. The label is drawn beside it, on the other side with `flip_label`; an empty one is not drawn. The symbol draws with `enter`, the label and a bulb's glow (`lit`, 0 to 1) fade with `parts_enter`. A `Schematic` wires symbols together.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/symbol-and-schematic/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/symbol-and-schematic.md",
      "scenes": [
        "Symbol"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Symbol-1b7d8ad4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/schematic.rs#L108",
      "themed": true,
      "fields": [
        {
          "name": "kind",
          "type": "SymbolKind",
          "default": "SymbolKind::Resistor",
          "docs": "Which part to draw: resistor, capacitor, inductor, source, ground, op-amp, battery, switch, bulb or diode."
        },
        {
          "name": "at",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the symbol, in units of `ui.space`."
        },
        {
          "name": "rotation",
          "type": "f64",
          "default": "0.0",
          "docs": "Degrees counterclockwise to turn the symbol around its middle."
        },
        {
          "name": "size",
          "type": "f64",
          "default": "0.6",
          "docs": "Units of `ui.space` from the middle to a terminal."
        },
        {
          "name": "label",
          "type": "&str",
          "default": "\"\"",
          "docs": "Text drawn beside the symbol; empty for none."
        },
        {
          "name": "flip_label",
          "type": "bool",
          "default": "false",
          "docs": "Puts the label on the opposite side of the symbol."
        },
        {
          "name": "lit",
          "type": "f32",
          "default": "0.0",
          "docs": "Glow of a bulb from 0 (off) to 1 (full); other symbols ignore it."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the symbol's lines and fills."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the label."
        },
        {
          "name": "glow_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of a bulb's glow."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Line width in pixels; the battery's short plate is 2.5 times as thick."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the symbol draws in; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the symbol leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the label and the bulb's glow fade in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the label and the bulb's glow fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn terminal(&self, name: &str) -> Option<(f64, f64)>",
          "summary": "Where the terminal `name` is, in units of `ui.space`; `None` for a name the kind does not have."
        },
        {
          "signature": "fn lever_angle(&self, now: f32) -> f64",
          "summary": "The angle of a switch's lever at `now` seconds, from open (35°) to closed (0)."
        }
      ]
    },
    {
      "name": "Table",
      "summary": "Text in rows and columns with lines between them (Manim `Table`), centered on `(x, y)`. `col_labels` go above the columns and `row_labels` left of the rows, in `label_style`. The lines draw with `enter` (`Create`), the text fades with `entries_enter`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "Table"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Table-8e66d634.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/table.rs#L170",
      "themed": true,
      "fields": [
        {
          "name": "rows",
          "type": "Vec<Vec<Cow<str>>>",
          "default": "Vec::new()",
          "docs": "The body, row by row; a shorter row is padded with empty cells."
        },
        {
          "name": "col_labels",
          "type": "Vec<Cow<str>>",
          "default": "Vec::new()",
          "docs": "Labels above the columns, empty for none."
        },
        {
          "name": "row_labels",
          "type": "Vec<Cow<str>>",
          "default": "Vec::new()",
          "docs": "Labels left of the rows, empty for none."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "960.0",
          "docs": "Horizontal middle of the table in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "540.0",
          "docs": "Vertical middle of the table in pixels of the canvas."
        },
        {
          "name": "buff",
          "type": "(f32, f32)",
          "default": "(theme.spacing.xl, theme.spacing.lg + theme.spacing.md)",
          "docs": "Pixels between the columns and between the rows (Manim `h_buff`, `v_buff`); the lines run through the middle of them."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font of the body cells: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the body cells' text."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "TextStyle { weight: 600, ..theme.typography.body }",
          "docs": "The font of the row and column labels: family, size in pixels and weight."
        },
        {
          "name": "label_fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the row and column labels."
        },
        {
          "name": "line_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the lines between the cells."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Width of the lines in pixels."
        },
        {
          "name": "outer_lines",
          "type": "bool",
          "default": "false",
          "docs": "Draws the frame around the table too (Manim `include_outer_lines`)."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the lines appear (`Create`, ..); `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the lines leave at the end of their container; `None` stays."
        },
        {
          "name": "entries_enter",
          "type": "Option<FadeIn>",
          "default": "Some(FadeIn::themed(theme))",
          "docs": "Fade the text in at the start; `None` shows it from the start."
        },
        {
          "name": "entries_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade the text out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn cell(&self, ui: &Ui, row: usize, column: usize) -> Option<Rect>",
          "summary": "The area of body cell `(row, column)` between its lines (Manim `get_cell`), to put a highlight behind it. `None` outside the table."
        }
      ]
    },
    {
      "name": "Tangent",
      "summary": "The tangent of `f` at `x`, `length` pixels long and centered on the point, with a dot on the point when `dot` is above 0 (Manim's `TangentLine`). `x` is a `ValueTracker`, so the line can slide along the graph.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/tangent-and-secant/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/tangent-and-secant.md",
      "scenes": [
        "Tangent"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Tangent-7f81e61a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/calculus.rs#L72",
      "themed": true,
      "fields": [
        {
          "name": "f",
          "type": "Func",
          "default": "|x| x",
          "docs": "The function, taking x in the axes' coordinates and returning y."
        },
        {
          "name": "axes",
          "type": "AxesMap",
          "default": "AxesMap::default()",
          "docs": "The axes (an `AxesMap`) the function sits on; turns graph coordinates into canvas points."
        },
        {
          "name": "x",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "The x, in the axes' coordinates, of the point of tangency; a tracker so it can slide along the graph."
        },
        {
          "name": "length",
          "type": "f32",
          "default": "400.0",
          "docs": "Length of the line in pixels."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the line and its dot."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Line width in pixels."
        },
        {
          "name": "dot",
          "type": "f32",
          "default": "10.0",
          "docs": "Radius in pixels of the dot on the point; `0` for no dot."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        }
      ],
      "methods": []
    },
    {
      "name": "TangentialArc",
      "summary": "The arc of `radius` that touches two lines (Manim `TangentialArc`): the first from `line1.0` to `line1.1`, the second likewise. Of the four corners where the lines cross, `corner` picks the one on the side of each line's direction (`1`) or against it (`-1`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "TangentialArc"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TangentialArc-f8412de7.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arcs.rs#L117",
      "themed": true,
      "fields": [
        {
          "name": "line1",
          "type": "((f32, f32), (f32, f32))",
          "default": "((0.0, 0.0), (200.0, 0.0))",
          "docs": "The first line as two points `((x1, y1), (x2, y2))` in pixels of the canvas."
        },
        {
          "name": "line2",
          "type": "((f32, f32), (f32, f32))",
          "default": "((0.0, 0.0), (0.0, 200.0))",
          "docs": "The second line, in the same form."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "50.0",
          "docs": "Radius of the arc in pixels."
        },
        {
          "name": "corner",
          "type": "(f32, f32)",
          "default": "(1.0, 1.0)",
          "docs": "Which of the four corners where the lines cross the arc fills: for each line `1` is the side of its direction, `-1` against it."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "TangentLine",
      "summary": "A line of `length` touching `path` at `alpha` of its length (Manim `TangentLine`). On axes, `kits::math::Tangent` draws the tangent of a function.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "TangentLine"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TangentLine-1e03dc08.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/angles.rs#L293",
      "themed": true,
      "fields": [
        {
          "name": "path",
          "type": "BezPath",
          "default": "BezPath::new()",
          "docs": "The path to touch, in pixels of the canvas."
        },
        {
          "name": "alpha",
          "type": "f32",
          "default": "0.5",
          "docs": "Where along the path's length the line touches it, 0 (start) to 1 (end)."
        },
        {
          "name": "length",
          "type": "f32",
          "default": "135.0",
          "docs": "Length of the line in pixels, centered on the point where it touches."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "TextPath",
      "summary": "Text drawn as glyph outlines, so `Create`, `Write` and `DrawBorderThenFill` can draw it (Manim's `Text` as a `VMobject`). `(x, y)` is the start of the baseline.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "TextPath"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TextPath-5e4a74de.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text_outline.rs#L177",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "&str",
          "default": "\"\"",
          "docs": "The text to draw."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Start of the baseline in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: a family from the video's media, its size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Some(theme.colors.title)",
          "docs": "Colour of the inside of the glyphs; `None` leaves it empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Colour of the glyph outlines; `None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears (`Create`, `Write`, `DrawBorderThenFill`, ..); `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn parts(&self, ctx: &FFramesContext) -> Option<Vec<Shape>>",
          "summary": "One shape per glyph, or `None` when the font has no file in the media."
        },
        {
          "signature": "fn bounds(&self, ctx: &FFramesContext) -> Rect",
          "summary": "The box of the inked glyphs, descenders included (what Manim measures around text), or the estimated box when the font has no file in the media."
        }
      ]
    },
    {
      "name": "TextReveal",
      "summary": "A line whose words or letters fade in one after another while they move by `shift` into place. Unit `i` starts `delay + i * stagger` seconds into the container and takes `run_time`. `(x, y)` is the start of the baseline. Without a measurable font the whole line fades in as unit 0.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "TextReveal"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TextReveal-6526ed72.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/reveal.rs#L30",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The words or letters that fade in; the whole line is drawn as one when the font cannot be measured."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left of the line, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "by",
          "type": "RevealBy",
          "default": "RevealBy::Word",
          "docs": "Whether it reveals word by word or letter by letter."
        },
        {
          "name": "shift",
          "type": "(f32, f32)",
          "default": "(0.0, 24.0)",
          "docs": "Canvas units, `y` down: `(0.0, 24.0)` rises 24 units into place."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first unit begins."
        },
        {
          "name": "stagger",
          "type": "f32",
          "default": "theme.motion.stagger.tight",
          "docs": "Seconds between the starts of two units."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "theme.motion.duration.enter",
          "docs": "Seconds each unit takes to fade and move into place."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "theme.motion.easing.enter",
          "docs": "Easing of each unit over its run time."
        }
      ],
      "methods": []
    },
    {
      "name": "ThermalVision",
      "summary": "Its children as a thermal camera sees them: the luminance mapped onto `palette`, cold to hot, evenly spaced (the default is `THERMAL_PALETTE`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "ThermalVision"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ThermalVision-3b3e2df4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L601",
      "themed": true,
      "fields": [
        {
          "name": "palette",
          "type": "&[Color]",
          "default": "&THERMAL_PALETTE",
          "docs": "Colours the luminance is mapped onto, evenly spaced from cold (dark) to hot (light); empty maps to black and white."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "ThreeDView",
      "summary": "Manim's `ThreeDScene`: 3D objects seen by a camera on a sphere around `frame_center`, in one image over the canvas of `ui.space`, with 2D drawn on top.",
      "feature": "3d",
      "page": "https://fframes-kit.pages.dev/docs/three-d/three-d-view/",
      "markdown": "https://fframes-kit.pages.dev/docs/three-d/three-d-view.md",
      "scenes": [
        "ThreeDView"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ThreeDView-f14d51c7.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/three/view.rs#L53",
      "themed": true,
      "fields": [
        {
          "name": "phi",
          "type": "f32",
          "default": "0.0",
          "docs": "Angle of the camera from the `z` axis in radians; 0 looks straight down on the `xy` plane."
        },
        {
          "name": "theta",
          "type": "f32",
          "default": "-FRAC_PI_2",
          "docs": "Angle of the camera around the `z` axis from the `x` axis in radians; -90 degrees is the default."
        },
        {
          "name": "distance",
          "type": "f32",
          "default": "20.0",
          "docs": "How far the camera sits from `frame_center` in Manim units; changes the perspective, not the lens."
        },
        {
          "name": "focal_distance",
          "type": "f32",
          "default": "20.0",
          "docs": "Distance in Manim units at which the lens shows the canvas's height; the plane through `frame_center` lines up with `ui.space` when `distance` matches."
        },
        {
          "name": "zoom",
          "type": "f32",
          "default": "1.0",
          "docs": "Zoom of the lens; above 1 shows less of the scene."
        },
        {
          "name": "frame_center",
          "type": "Point3",
          "default": "(0.0, 0.0, 0.0)",
          "docs": "The point the camera orbits and looks at, in Manim units `(x, y, z)`."
        },
        {
          "name": "ambient_rotation",
          "type": "f32",
          "default": "0.0",
          "docs": "Radians per second `theta` turns; 0 keeps the camera still."
        },
        {
          "name": "objects",
          "type": "Vec<Box<dyn Object3D>>",
          "default": "Vec::new()",
          "docs": "The 3D objects drawn in the image, in order."
        },
        {
          "name": "fixed_in_frame",
          "type": "Option<Children>",
          "default": "None",
          "docs": "Drawn over the picture in canvas pixels, not moved by the camera (a closure taking the `Ui`); `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn camera(&self, space: Space, seconds: f32) -> Camera",
          "summary": "The camera `seconds` into the view."
        },
        {
          "signature": "fn projector(&self, ui: &Ui) -> Projector",
          "summary": "The projector of the picture at `ui`'s time."
        }
      ]
    },
    {
      "name": "Tile",
      "summary": "Its children repeated across the area like tiles, every other copy mirrored so the edges meet (Remotion's `tile()`): the copies of `rect` (x, y, width, height) are laid side by side with `horizontal` and above and below with `vertical`. Remotion finds the rectangle from the opaque pixels; here it is given, as fframes cannot measure the children. At most `MAX_TILES` copies are drawn, each twice: a slightly larger one under the exact ones hides the seams between them. The children render twice.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Tile"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Tile-51fab1c2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/geometry.rs#L135",
      "themed": true,
      "fields": [
        {
          "name": "rect",
          "type": "(f32, f32, f32, f32)",
          "default": "(640.0, 360.0, 640.0, 360.0)",
          "docs": "The `(x, y, width, height)` rectangle of the children that is repeated, in the children's user units; it stays where it is."
        },
        {
          "name": "horizontal",
          "type": "bool",
          "default": "true",
          "docs": "`true` repeats the rectangle side by side across the area."
        },
        {
          "name": "vertical",
          "type": "bool",
          "default": "true",
          "docs": "`true` repeats the rectangle above and below across the area."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the copies fill from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask, clip and tile ids when two tiles share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is tiled (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn copies(&self) -> Vec<(i64, i64)>",
          "summary": "The copies as (column, row) counted from the original, at most `MAX_TILES`."
        }
      ]
    },
    {
      "name": "Tint",
      "summary": "Its children in shades of `color`, mixed with the original by `amount`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Tint"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Tint-a28c5952.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L362",
      "themed": true,
      "fields": [
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour the picture is tinted with; the picture turns shades of it."
        },
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.8)",
          "docs": "0 the original to 1 fully tinted."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Title",
      "summary": "Manim's `Title`: a line of text centered on `x` near the top, over an underline `underline_width` wide, or as wide as the text with `match_underline_width_to_text` (and a measurable font).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Title"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Title-c0476731.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/title.rs#L17",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The title words."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "960.0",
          "docs": "Horizontal center of the title and its underline, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "130.0",
          "docs": "The baseline."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the text."
        },
        {
          "name": "include_underline",
          "type": "bool",
          "default": "true",
          "docs": "`true` draws a line under the text."
        },
        {
          "name": "match_underline_width_to_text",
          "type": "bool",
          "default": "false",
          "docs": "`true` makes the underline as wide as the text instead of `underline_width` (when the font can be measured)."
        },
        {
          "name": "underline_width",
          "type": "f32",
          "default": "1720.0",
          "docs": "Width of the underline in pixels."
        },
        {
          "name": "underline_buff",
          "type": "f32",
          "default": "28.0",
          "docs": "Pixels from the baseline down to the underline."
        },
        {
          "name": "underline_stroke",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the underline."
        },
        {
          "name": "underline_stroke_width",
          "type": "f32",
          "default": "3.0",
          "docs": "Thickness of the underline in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": []
    },
    {
      "name": "TitrationCurve",
      "summary": "The pH of a `Titration` as the base is added on `axes` (mL across, pH up): from `delay` over `run_time` seconds the base pours in at a constant rate up to `until` mL and the curve draws along with a dot at the current pH. When it gets there the equivalence point is marked with guides to both axes; for a weak acid the half-equivalence point too, where the pH equals the pKa. Show the axes yourself. Everything fades with `parts_enter`.",
      "feature": "chemistry",
      "page": "https://fframes-kit.pages.dev/docs/chemistry/titration-curve-and-ph-scale/",
      "markdown": "https://fframes-kit.pages.dev/docs/chemistry/titration-curve-and-ph-scale.md",
      "scenes": [
        "TitrationCurve"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TitrationCurve-5a351a50.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/chemistry/titration.rs#L110",
      "themed": true,
      "fields": [
        {
          "name": "titration",
          "type": "Titration",
          "default": "Titration::default()",
          "docs": "The acid and base being titrated, whose pH the curve follows."
        },
        {
          "name": "axes",
          "type": "Option<AxesMap>",
          "default": "None",
          "docs": "The axes to draw on, mL across and pH up (`c2p` maps data to the canvas); `None` draws nothing."
        },
        {
          "name": "until",
          "type": "f64",
          "default": "50.0",
          "docs": "Millilitres of base added when the pour ends, the right end of the curve."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the base begins to pour."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "4.0",
          "docs": "Seconds the pour takes, at a constant rate, from none to `until` mL."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Names the equivalence point (and the half-equivalence point of a weak acid) when the curve reaches it; `false` for none."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the curve and its moving dot."
        },
        {
          "name": "marker_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the dots on the marked points."
        },
        {
          "name": "guide_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed guides from a marked point to both axes."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the labels."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width in pixels of the curve and the guides."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the curve and its marks; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the curve and its marks before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn added_at(&self, seconds: f32) -> f64",
          "summary": "The base added by `seconds`, in mL."
        },
        {
          "signature": "fn ph_at(&self, seconds: f32) -> f64",
          "summary": "The pH at `seconds`, for a `PhScale` pointer or a readout."
        }
      ]
    },
    {
      "name": "TracedPath",
      "summary": "The line a moving point has drawn so far (Manim's `TracedPath`). `point(t)` is where the point is `t` local seconds in, in canvas units; the line runs through it at every frame from `delay` (or the last `dissipating_time` seconds) up to now. The trail is sampled again every frame, at most `MAX_TRACE_SAMPLES` times, on a fixed grid of times so the old part does not shimmer.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "TracedPath"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TracedPath-4b6f7f5c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/traced_path.rs#L23",
      "themed": true,
      "fields": [
        {
          "name": "point",
          "type": "&dyn Fn(f32) -> (f32, f32)",
          "default": "&origin",
          "docs": "Where the point is `t` local seconds in, in pixels of the canvas."
        },
        {
          "name": "stroke",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the line."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the line in pixels."
        },
        {
          "name": "dissipating_time",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Seconds of trail to keep; `None` keeps it all."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Local second where the trail starts."
        }
      ],
      "methods": [
        {
          "signature": "fn times(&self, now: f32, fps: usize) -> Vec<f32>",
          "summary": "The times sampled at `now` with `fps` frames per second: the start, every frame on the grid since, and `now`."
        }
      ]
    },
    {
      "name": "Trail",
      "summary": "The children at earlier local times behind themselves, each copy fainter, like Remotion's `<Trail>`. `samples` copies (at most `MAX_SAMPLES`) are `spacing` seconds apart; the newest has `opacity` and they fade out linearly behind it. Before the local start there is nothing to repeat, so the trail grows in.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Trail"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Trail-d4d81050.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/motion_blur.rs#L23",
      "themed": true,
      "fields": [
        {
          "name": "samples",
          "type": "usize",
          "default": "6",
          "docs": "Number of earlier copies, at most `MAX_SAMPLES`; each one renders the children again."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "0.05",
          "docs": "Seconds between one copy and the next, going back in time from the newest."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "0.5",
          "docs": "Opacity of the newest copy, 0 transparent to 1 opaque; older copies fade out linearly behind it."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that leaves the trail (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn copy(&self, i: usize) -> (f32, f32)",
          "summary": "How far back copy `i` (from 1, the newest) is and how opaque."
        }
      ]
    },
    {
      "name": "Transcription",
      "summary": "Transcription: the DNA of `coding` (its coding strand on top, the template strand below it, base pairs meeting in the middle) with RNA polymerase moving along it from `delay`, one base every `base_time` seconds, `spacing` pixels apart, centred on `center` (units of `ui.space`). Where it is the strands open into a bubble and the template base it reads lights up; the matching mRNA base (`U` for `T`) drops into the mRNA row below. At the end the polymerase lets go and the bubble closes. With `labels` the rows are named.",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/transcription/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/transcription.md",
      "scenes": [
        "Transcription"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Transcription-3a8a776e.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/expression.rs#L165",
      "themed": true,
      "fields": [
        {
          "name": "coding",
          "type": "String",
          "default": "\"ATGGCTTCGAAATGGTAA\".into()",
          "docs": "The coding strand, written 5' to 3' with the letters `A`, `T`, `G`, `C`; the template strand is its complement and the mRNA copies it with `U` for `T`."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the polymerase begins to move."
        },
        {
          "name": "base_time",
          "type": "f32",
          "default": "0.35",
          "docs": "Seconds the polymerase spends on each base."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the DNA, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "52.0",
          "docs": "Pixels between neighbouring bases along the strand."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Names the strands, the mRNA and the polymerase when `true`."
        },
        {
          "name": "bases",
          "type": "BaseColors",
          "default": "BaseColors::default()",
          "docs": "Colour of each base letter."
        },
        {
          "name": "strand_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the DNA backbones."
        },
        {
          "name": "rna_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the mRNA backbone."
        },
        {
          "name": "polymerase_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the RNA polymerase and its label."
        },
        {
          "name": "lit_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour the template base being read mixes toward."
        },
        {
          "name": "base_style",
          "type": "TextStyle",
          "default": "base_style",
          "docs": "The font of the base letters: family, size in pixels and weight."
        },
        {
          "name": "label_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the row names: family, size in pixels and weight."
        },
        {
          "name": "label_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the row names."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Transform",
      "summary": "Morphs `from` into `to`: path, paint and width (Manim's `Transform`). Before it starts it draws `from`, after it ends the morphed shape, which looks like `to`. The prelude calls it `Morph`, because `Transform` there is the SVG transform.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "Transform"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Transform-1eb4cb74.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform.rs#L46",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Shape",
          "default": null,
          "docs": "The shape it starts as; drawn until `delay` has passed."
        },
        {
          "name": "to",
          "type": "Shape",
          "default": null,
          "docs": "The shape it ends as."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Shape, to: Shape) -> Self",
          "summary": "From `from` to `to` in Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "TransformAnimations",
      "summary": "Runs `from_anim` on `from` and `to_anim` on `to` at once while one shape morphs into the other (Manim's `TransformAnimations`): the shape and its look go from the first animation's to the second's over `run_time`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "TransformAnimations"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TransformAnimations-7eab6b60.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L616",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Shape",
          "default": null,
          "docs": "The shape it starts as; drawn until `delay` has passed."
        },
        {
          "name": "from_anim",
          "type": "EnterAnim",
          "default": null,
          "docs": "The enter animation applied to `from` while it morphs."
        },
        {
          "name": "to",
          "type": "Shape",
          "default": null,
          "docs": "The shape it ends as."
        },
        {
          "name": "to_anim",
          "type": "EnterAnim",
          "default": null,
          "docs": "The enter animation applied to `to` while it morphs."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Shape, from_anim: EnterAnim, to: Shape, to_anim: EnterAnim) -> Self",
          "summary": "In Manim's 1 second, smooth; time the two animations to run over the same second."
        }
      ]
    },
    {
      "name": "TransformFromCopy",
      "summary": "A morph of `from` into `to` while `from` stays where it is (Manim's `TransformFromCopy`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "TransformFromCopy"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TransformFromCopy-bf8a7911.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L96",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Shape",
          "default": null,
          "docs": "The shape it starts as; drawn until `delay` has passed."
        },
        {
          "name": "to",
          "type": "Shape",
          "default": null,
          "docs": "The shape it ends as."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Shape, to: Shape) -> Self",
          "summary": "From `from` to `to` in Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "TransformMatchingShapes",
      "summary": "Pieces of `from` that have the same shape as pieces of `to` move there, the others fade out while the rest of `to` fades in (Manim's `TransformMatchingShapes`). Shapes match by `shape_key`, as in Manim, wherever they are and whatever their size. Manim transforms all pieces of one key as a group; here they pair in order.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/geometry-animations.md",
      "scenes": [
        "TransformMatchingShapes"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TransformMatchingShapes-0ed27a17.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/animate/transform_ii.rs#L528",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "Vec<Shape>",
          "default": null,
          "docs": "The pieces it starts as; each moves to the piece of `to` with the same shape."
        },
        {
          "name": "to",
          "type": "Vec<Shape>",
          "default": null,
          "docs": "The pieces it ends as; those with no match in `from` fade in."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before it begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the animation takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the animation over its run time."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: Vec<Shape>, to: Vec<Shape>) -> Self",
          "summary": "In Manim's 1 second, smooth."
        }
      ]
    },
    {
      "name": "TransformMatchingTex",
      "summary": "One formula into another (Manim's `TransformMatchingTex`). Parts with the same `\\part{..}` label match first, then `{{ }}` parts with the same source, then glyphs outside parts with the same outline. Matched glyphs move to their new place (a part with a different number of glyphs morphs as one shape), the rest of `from` fades out and the rest of `to` fades in. Before the start it draws `from`, after the end `to`.",
      "feature": "latex",
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/formulas/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/formulas.md",
      "scenes": [
        "TransformMatchingTex"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TransformMatchingTex-22eb35a8.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/latex/matching.rs#L201",
      "themed": false,
      "fields": [
        {
          "name": "from",
          "type": "FormulaView",
          "default": null,
          "docs": "The formula that is shown before the start and that its matched glyphs leave."
        },
        {
          "name": "to",
          "type": "FormulaView",
          "default": null,
          "docs": "The formula that is shown after the end and that its matched glyphs arrive at."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": null,
          "docs": "Seconds after the container's start before the transform begins."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": null,
          "docs": "Seconds the transform takes."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": null,
          "docs": "Easing of the transform over its run time."
        },
        {
          "name": "match_tokens",
          "type": "bool",
          "default": null,
          "docs": "Match glyphs outside parts by their token (text and occurrence, `2#1`), then by outline. Needs Typst formulas; with others it warns and matches as without."
        }
      ],
      "methods": [
        {
          "signature": "fn new(from: FormulaView, to: FormulaView) -> Self",
          "summary": "From `from` to `to` in Manim's 1 second, smooth."
        },
        {
          "signature": "fn shapes_at(&self, p: f32) -> Vec<Shape>",
          "summary": "The shapes `p` of the way from `from` to `to`."
        },
        {
          "signature": "fn matching(&self) -> (usize, usize, usize)",
          "summary": "Glyph counts: (matched pairs of groups, glyphs fading out, glyphs fading in)."
        }
      ]
    },
    {
      "name": "TransitionSeries",
      "summary": "Sequences one after another with transitions between them (Remotion's `<TransitionSeries>`). A transition overlaps its two sequences by its duration, so the series is shorter than its sequences by the sum of the transitions. A transition longer than one of its sequences is shortened to it; a transition that is first, last, or next to another transition is skipped. `inspect` warns about both.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/transitions/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/transitions.md",
      "scenes": [
        "TransitionSeries"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TransitionSeries-f2a72933.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/transitions/series.rs#L33",
      "themed": false,
      "fields": [
        {
          "name": "key",
          "type": "Option<&str>",
          "default": null,
          "docs": "Makes the ids of the transitions' clip paths unique when two series share a frame."
        },
        {
          "name": "items",
          "type": "Vec<TransitionItem>",
          "default": null,
          "docs": "Sequences and the transitions between them, in play order."
        }
      ],
      "methods": [
        {
          "signature": "fn sequence(seconds: f32, children: Children) -> TransitionItem",
          "summary": "A sequence item."
        },
        {
          "signature": "fn lengths(&self) -> Vec<SeriesLength>",
          "summary": "The lengths of the items, for `audio_fades`."
        },
        {
          "signature": "fn audio_fades(&self, fps: usize) -> Vec<AudioFade>",
          "summary": "Where each sequence plays and how long its audio fades at `fps`, see `audio_fades`."
        },
        {
          "signature": "fn transition(timing: Timing, presentation: impl Presentation) -> TransitionItem",
          "summary": "A transition item."
        }
      ]
    },
    {
      "name": "Translate",
      "summary": "Its children moved by `x` and `y` (Remotion's `xyTranslate()`), or with `uv` by those shares of the area, 1 the full width or height (Remotion's `uvTranslate()`). Cut to the area.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Translate"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Translate-bb5fdef6.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/geometry.rs#L362",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.0)",
          "docs": "Horizontal shift in the children's user units (right is positive), or with `uv` a share of the area's width. Animatable."
        },
        {
          "name": "y",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.0)",
          "docs": "Vertical shift in the children's user units (down is positive), or with `uv` a share of the area's height. Animatable."
        },
        {
          "name": "uv",
          "type": "bool",
          "default": "false",
          "docs": "`true` reads `x` and `y` as shares of the area's width and height (1 is the full size); `false` as user units."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the result is cut to from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the clip id when two translates share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is moved (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Translation",
      "summary": "Translation: the mRNA `mrna` along the bottom, `spacing` pixels a base, with its codons from the start codon underlined, centred on `center` (units of `ui.space`). From `delay` a ribosome reads one codon every `codon_time` seconds: the tRNA with the matching anticodon drops in carrying its amino acid, the growing chain moves over onto it and the tRNA before it leaves. At the stop codon the chain is released and the ribosome falls apart. The chain so far is written under the mRNA (`Met-Ala-Ser`).",
      "feature": "biology",
      "page": "https://fframes-kit.pages.dev/docs/biology/translation/",
      "markdown": "https://fframes-kit.pages.dev/docs/biology/translation.md",
      "scenes": [
        "Translation"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Translation-7b3e690c.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/biology/expression.rs#L400",
      "themed": true,
      "fields": [
        {
          "name": "mrna",
          "type": "String",
          "default": "\"GCCAUGGCUUCGAAAUGGUAAGC\".into()",
          "docs": "The mRNA written with `A`, `U`, `G`, `C`; the ribosome starts at its first `AUG` and stops at a stop codon."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the ribosome begins to read."
        },
        {
          "name": "codon_time",
          "type": "f32",
          "default": "1.2",
          "docs": "Seconds the ribosome spends on each codon."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the mRNA, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "44.0",
          "docs": "Pixels between neighbouring bases along the mRNA."
        },
        {
          "name": "bases",
          "type": "BaseColors",
          "default": "BaseColors::default()",
          "docs": "Colour of each base letter."
        },
        {
          "name": "strand_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the mRNA backbone."
        },
        {
          "name": "ribosome_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the ribosome."
        },
        {
          "name": "trna_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the tRNA molecules."
        },
        {
          "name": "amino_color",
          "type": "Color",
          "default": "Color::hex(\"#9775fa\")",
          "docs": "Fill of the amino acid circles."
        },
        {
          "name": "base_style",
          "type": "TextStyle",
          "default": "base_style",
          "docs": "The font of the base letters: family, size in pixels and weight."
        },
        {
          "name": "amino_style",
          "type": "TextStyle",
          "default": "amino_style",
          "docs": "The font of the amino acid names on the circles: family, size in pixels and weight."
        },
        {
          "name": "chain_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the chain written under the mRNA: family, size in pixels and weight."
        },
        {
          "name": "text_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the codon marks, amino acid outlines and chain text."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "TreeView",
      "summary": "A binary tree: round nodes `radius` pixels with their values, `spacing` pixels between neighbouring slots and `level` pixels between depths, centred on `center` (units of `ui.space`). It plays a `TreeTrace`, one step every `step_time` seconds from `delay`: the nodes a step looks at light up, the path to them is outlined, nodes slide to their new places as the tree changes (swapped heap nodes pass each other), new nodes drop in and removed ones fade. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/tree-trace-and-tree-view/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/tree-trace-and-tree-view.md",
      "scenes": [
        "TreeView"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TreeView-5603e712.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/tree.rs#L603",
      "themed": true,
      "fields": [
        {
          "name": "trace",
          "type": "Option<&TreeTrace>",
          "default": "None",
          "docs": "The recorded steps to play (`TreeTrace`); `None` draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the first step."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each step of the trace takes."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the tree, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "100.0",
          "docs": "Pixels between neighbouring node slots in a depth."
        },
        {
          "name": "level",
          "type": "f32",
          "default": "120.0",
          "docs": "Pixels between depths."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "30.0",
          "docs": "Radius of a node in pixels."
        },
        {
          "name": "notes",
          "type": "bool",
          "default": "true",
          "docs": "Whether the step's note is written under the tree."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the nodes in each state (looked at, moved, found)."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the edges between nodes."
        },
        {
          "name": "path_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the outline of the path to the nodes a step looks at."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the values in the nodes."
        },
        {
          "name": "small_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the notes."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Triangle",
      "summary": "An equilateral triangle pointing up, its corners on a circle of `radius` (Manim `Triangle`, Remotion `Triangle`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Triangle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Triangle-efc13bf2.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/basic.rs#L294",
      "themed": true,
      "fields": [
        {
          "name": "cx",
          "type": "f32",
          "default": "0.0",
          "docs": "Center x in pixels of the canvas."
        },
        {
          "name": "cy",
          "type": "f32",
          "default": "0.0",
          "docs": "Center y in pixels of the canvas (y down)."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "100.0",
          "docs": "Radius in pixels of the circle the corners lie on."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "TvSignalOff",
      "summary": "Its children replaced by television test bars (Remotion's `tvSignalOff()`), mixed in by `amount` (0 to 1) inside the children's alpha: seven colour bars, a row of thin bars, white running into a dark ramp and a grey scale. The bars are drawn over the children, so semi-transparent parts mix a little differently from Remotion. The children render twice.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "TvSignalOff"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TvSignalOff-3e93fddf.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/reveal.rs#L232",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 the children only to 1 fully test bars, inside the children's alpha. Animatable."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the test picture from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that the test bars replace (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn bars(&self) -> Vec<(f32, f32, f32, f32, Color)>",
          "summary": "The flat parts of the test picture as `(x, y, w, h, colour)`."
        }
      ]
    },
    {
      "name": "TypeAt",
      "summary": "A text cursor that clicks into a field and the `Typewriter` that then types there. The cursor sits just left of the text's start, fades in over `fade` seconds from the start of the container and clicks `lead` seconds before the typing starts (the typewriter's `delay`), so the delay should be at least `fade + lead`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/cursors-emoji-sound-effects-and-gi-fs.md",
      "scenes": [
        "TypeAt"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/TypeAt-8918c502.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/assets/cursor.rs#L655",
      "themed": true,
      "fields": [
        {
          "name": "typewriter",
          "type": "Typewriter",
          "default": "Typewriter { delay: 0.9, ..Typewriter::themed(theme) }",
          "docs": "The text that is typed after the click; its `x`, `y` and `delay` place the cursor and time the click."
        },
        {
          "name": "shape",
          "type": "CursorShape",
          "default": "CursorShape::IBeam",
          "docs": "Which cursor is drawn; the I-beam by default."
        },
        {
          "name": "style",
          "type": "CursorStyle",
          "default": "CursorStyle::Dark",
          "docs": "Colours of the cursor: `Dark` (black with a white outline) or `Light` (white with a black outline)."
        },
        {
          "name": "size",
          "type": "f32",
          "default": "40.0",
          "docs": "Height in pixels of the 24 unit design; also sets how far left of the text the cursor sits."
        },
        {
          "name": "lead",
          "type": "f32",
          "default": "0.4",
          "docs": "Seconds the click comes before the typing starts."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "theme.motion.duration.fast",
          "docs": "Seconds the cursor takes to fade in from the start of its container."
        },
        {
          "name": "click",
          "type": "ClickLook",
          "default": "ClickLook::themed(theme)",
          "docs": "How the click looks: the press depth and duration and the ring that goes out."
        }
      ],
      "methods": [
        {
          "signature": "fn cursor_at(&self) -> (f32, f32)",
          "summary": "Where the cursor's hotspot is: left of the start of the text, at its middle."
        },
        {
          "signature": "fn click_at(&self) -> f32",
          "summary": "The second of the click."
        }
      ]
    },
    {
      "name": "Typewriter",
      "summary": "Types its text one character at a time, `chars_per_second` from `delay` seconds into the container, with a cursor after the last character (Manim's `TypeWithCursor`). The cursor is steady while typing and blinks every `blink` seconds once the text is complete. With `erase` it deletes the text again at the same rate, from the end, finishing `erase` seconds before the end of the container (Manim's `UntypeWithCursor`). `(x, y)` is the start of the baseline. Without a measurable font there is no cursor.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Typewriter"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Typewriter-b0fc3a72.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/typewriter.rs#L20",
      "themed": true,
      "fields": [
        {
          "name": "text",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The words that are typed."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left of the text, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.body",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the text."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before typing begins."
        },
        {
          "name": "chars_per_second",
          "type": "f32",
          "default": "24.0",
          "docs": "Characters typed (and erased) per second."
        },
        {
          "name": "cursor",
          "type": "Option<Color>",
          "default": "Some(theme.colors.accent)",
          "docs": "`None` draws no cursor."
        },
        {
          "name": "cursor_width",
          "type": "f32",
          "default": "3.0",
          "docs": "Cursor width in pixels; its height is the font size."
        },
        {
          "name": "blink",
          "type": "f32",
          "default": "0.5",
          "docs": "Seconds the cursor is on, then off, after typing; 0 keeps it on."
        },
        {
          "name": "erase",
          "type": "Option<f32>",
          "default": "None",
          "docs": "Seconds before the end of the container when the erasing is done; `None` keeps the text."
        }
      ],
      "methods": [
        {
          "signature": "fn typed(&self, t: f32) -> usize",
          "summary": "Characters typed `t` seconds into the container."
        },
        {
          "signature": "fn shown(&self, t: f32, end: Option<f32>) -> usize",
          "summary": "Characters shown `t` seconds into a container that ends at `end` seconds: typed, less the erased ones."
        },
        {
          "signature": "fn cursor_on(&self, t: f32) -> bool",
          "summary": "Whether the cursor shows `t` seconds into the container; it is steady while erasing."
        },
        {
          "signature": "fn cursor_on_until(&self, t: f32, end: Option<f32>) -> bool",
          "summary": "`cursor_on` in a container that ends at `end` seconds."
        }
      ]
    },
    {
      "name": "Underline",
      "summary": "A line `buff` below a box, as wide as it (Manim `Underline`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Underline"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Underline-7bf62e58.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/matchers.rs#L83",
      "themed": true,
      "fields": [
        {
          "name": "around",
          "type": "Rect",
          "default": "Rect::ZERO",
          "docs": "The box it is drawn around, in pixels of the canvas."
        },
        {
          "name": "buff",
          "type": "f32",
          "default": "SMALL_BUFF",
          "docs": "Gap in pixels between the bottom of the box and the line."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::outline(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::outline(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "Union",
      "summary": "The area inside any of `paths` (Manim `Union`).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Union"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Union-f262db8a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/boolean.rs#L100",
      "themed": true,
      "fields": [
        {
          "name": "paths",
          "type": "Vec<BezPath>",
          "default": "Vec::new()",
          "docs": "The paths to combine, in pixels of the canvas."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::solid(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::solid(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "UnitCircle",
      "summary": "The unit circle at a tracked angle: the radius to the point, its cosine along the x-axis and its sine up to the point, the angle's arc and, with `labels`, their values (`cos 0.71`, `sin 0.71`, `45°`). `center` and `radius` are in units of `ui.space`, `angle` in radians counterclockwise. The circle and its axes draw with `enter`, the rest fades with `parts_enter`.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/unit-circle/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/unit-circle.md",
      "scenes": [
        "UnitCircle"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/UnitCircle-a8261d0a.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/unit_circle.rs#L26",
      "themed": true,
      "fields": [
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the circle, in units of `ui.space` (y up)."
        },
        {
          "name": "radius",
          "type": "f64",
          "default": "3.0",
          "docs": "Radius of the circle, in units of `ui.space`."
        },
        {
          "name": "angle",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "The angle in radians, counterclockwise from the positive x-axis; a tracker to animate."
        },
        {
          "name": "labels",
          "type": "bool",
          "default": "true",
          "docs": "Writes the cosine, the sine and the angle in degrees when `true`."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the circle, its axes, the radius and the arc."
        },
        {
          "name": "cos_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the cosine segment along the x-axis."
        },
        {
          "name": "sin_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the sine segment up to the point."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Line width in pixels."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the circle and its axes appear; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the circle and its axes leave at the end of its container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the radius, cosine, sine, arc and labels; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out of the radius, cosine, sine, arc and labels; `None` for none."
        }
      ],
      "methods": []
    },
    {
      "name": "Variable",
      "summary": "Manim's `Variable`: `label = value`, the value a `DecimalNumber` that follows a `ValueTracker`. `(x, y)` is the start of the label on the baseline; the label stays in place and the number grows to the right. For a value computed from time, pass `value: f(ui.seconds()).into()` in `render_frame`, which runs every frame.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/text-and-formulas/text/",
      "markdown": "https://fframes-kit.pages.dev/docs/text-and-formulas/text.md",
      "scenes": [
        "Variable"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Variable-dd4aa3ee.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/text/decimal.rs#L264",
      "themed": true,
      "fields": [
        {
          "name": "label",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "The name written before the ` = `."
        },
        {
          "name": "value",
          "type": "ValueTracker",
          "default": "0.0.into()",
          "docs": "The `ValueTracker` whose value is written; it is read at every frame."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left of the label, in pixels of the canvas; the number follows it."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Baseline of the text, in pixels of the canvas."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.heading",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the label and the `=`."
        },
        {
          "name": "value_fill",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "The color of the number; the label and `=` take `fill`."
        },
        {
          "name": "num_decimal_places",
          "type": "usize",
          "default": "2",
          "docs": "Digits after the decimal point."
        },
        {
          "name": "unit",
          "type": "&str",
          "default": "\"\"",
          "docs": "Text written after the number, such as `\" kg\"`; empty for none."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": []
    },
    {
      "name": "VariableBox",
      "summary": "A variable as manim-dsa draws it (`MVariable` with `add_label`): its `name` above a box with its value, centred on `center` (units of `ui.space`). The box is `width` by `height` pixels and widens to fit a longer value. `values` holds the value of each step, the first one at the start; the value changes every `step_time` seconds from `delay`, like the steps of the other figures, so it can follow a trace in step. On a change the old value rises out of the box, the new one rises in, the box flashes `colors.compare` and resizes. The whole figure fades with `enter` and `exit`.",
      "feature": "cs",
      "page": "https://fframes-kit.pages.dev/docs/computer-science/variable-box/",
      "markdown": "https://fframes-kit.pages.dev/docs/computer-science/variable-box.md",
      "scenes": [
        "VariableBox"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/VariableBox-f6591dcb.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/cs/variable.rs#L29",
      "themed": true,
      "fields": [
        {
          "name": "name",
          "type": "&str",
          "default": "\"\"",
          "docs": "Name written above the box."
        },
        {
          "name": "values",
          "type": "Vec<String>",
          "default": "Vec::new()",
          "docs": "The value at each step, as text; the first shows at the start. Empty draws nothing."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the value first changes."
        },
        {
          "name": "step_time",
          "type": "f32",
          "default": "0.8",
          "docs": "Seconds each value is shown before the next."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the box, in units of `ui.space`."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "120.0",
          "docs": "Smallest width of the box in pixels; it widens to fit a longer value."
        },
        {
          "name": "height",
          "type": "f32",
          "default": "80.0",
          "docs": "Height of the box in pixels."
        },
        {
          "name": "colors",
          "type": "CellColors",
          "default": "CellColors::themed(theme)",
          "docs": "Colours of the box; it flashes `colors.compare` when the value changes."
        },
        {
          "name": "name_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the name above the box."
        },
        {
          "name": "value_style",
          "type": "TextStyle",
          "default": "value_style",
          "docs": "The font of the value in the box."
        },
        {
          "name": "name_style",
          "type": "TextStyle",
          "default": "theme.typography.caption",
          "docs": "The font of the name."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn value_at(&self, seconds: f32) -> Option<&str>",
          "summary": "The value `seconds` into the video: the first value before `delay`, the last after the last step. `None` without values."
        }
      ]
    },
    {
      "name": "VariationalAutoencoder",
      "summary": "A variational autoencoder as `ManimML` draws it (`VariationalAutoencoder`): the image `input`, the feed-forward layers of the `encoder` (neurons per layer), the latent space with its Gaussian, the `decoder` and the image `output`, `size` cells square. The latent box shows a cloud of `points` points for `seed`, the Gaussian's 1σ and 2σ rings in `ring_color`, and the code of this image in `pulse_color`: the point `μ + L·epsilon` of the Gaussian, `epsilon` in units of the standard normal distribution. With `forward_pass` the pulses run from the input to the output and the point appears when they reach the latent space.",
      "feature": "ml",
      "page": "https://fframes-kit.pages.dev/docs/machine-learning/variational-autoencoder/",
      "markdown": "https://fframes-kit.pages.dev/docs/machine-learning/variational-autoencoder.md",
      "scenes": [
        "VariationalAutoencoder"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/VariationalAutoencoder-ecfbc00b.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/ml/vae.rs#L28",
      "themed": true,
      "fields": [
        {
          "name": "input",
          "type": "&str",
          "default": "\"\"",
          "docs": "File name of the input image in the media folder."
        },
        {
          "name": "output",
          "type": "&str",
          "default": "\"\"",
          "docs": "File name of the reconstructed output image in the media folder."
        },
        {
          "name": "size",
          "type": "usize",
          "default": "8",
          "docs": "Width and height of the images in cells, for the convolution-style maps."
        },
        {
          "name": "encoder",
          "type": "Vec<usize>",
          "default": "vec![5, 3]",
          "docs": "Neurons in each feed-forward layer of the encoder, from the input towards the latent space."
        },
        {
          "name": "decoder",
          "type": "Vec<usize>",
          "default": "vec![3, 5]",
          "docs": "Neurons in each feed-forward layer of the decoder, from the latent space towards the output."
        },
        {
          "name": "points",
          "type": "usize",
          "default": "120",
          "docs": "Number of points in the cloud drawn in the latent box."
        },
        {
          "name": "seed",
          "type": "u64",
          "default": "1",
          "docs": "Seed of the point cloud; the same seed gives the same cloud on every frame and machine."
        },
        {
          "name": "epsilon",
          "type": "(f64, f64)",
          "default": "(1.3, -0.7)",
          "docs": "Noise of this image's latent point, in units of the standard normal distribution (the point is the mean plus the noise scaled by the Gaussian)."
        },
        {
          "name": "center",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "The middle of the network, in units of `ui.space`."
        },
        {
          "name": "spacing",
          "type": "f32",
          "default": "130.0",
          "docs": "Pixels between neighbouring layers."
        },
        {
          "name": "node_radius",
          "type": "f32",
          "default": "16.0",
          "docs": "Radius in pixels of a neuron."
        },
        {
          "name": "node_spacing",
          "type": "f32",
          "default": "46.0",
          "docs": "Pixels between neighbouring neurons of a layer."
        },
        {
          "name": "cell",
          "type": "f32",
          "default": "14.0",
          "docs": "Size in pixels of one cell of an image."
        },
        {
          "name": "forward_pass",
          "type": "Option<ForwardPass>",
          "default": "None",
          "docs": "Pulses that run from the input to the output; the latent point appears when they reach it. `None` for none."
        },
        {
          "name": "node_color",
          "type": "Color",
          "default": "theme.colors.text",
          "docs": "Colour of the neuron and box outlines and of the text."
        },
        {
          "name": "node_fill",
          "type": "Color",
          "default": "theme.colors.surface",
          "docs": "Fill colour inside the neurons and boxes."
        },
        {
          "name": "edge_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the connection lines."
        },
        {
          "name": "pulse_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the pulses and of this image's latent point."
        },
        {
          "name": "ring_color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the Gaussian's 1σ and 2σ rings in the latent box."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "2.5",
          "docs": "Width in pixels of the outlines and connection lines."
        },
        {
          "name": "enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in at the start; `None` for none."
        },
        {
          "name": "exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "Fade out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn layers(&self) -> Vec<Layer>",
          "summary": "The layers from the input image to the output image."
        },
        {
          "signature": "fn latent_index(&self) -> usize",
          "summary": "The place of the latent space among `layers`."
        }
      ]
    },
    {
      "name": "Vector",
      "summary": "An arrow from `(x, y)` by `(dx, dy)` (Manim `Vector`, which starts at the origin).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/shapes.md",
      "scenes": [
        "Vector"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Vector-27588fb9.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/shapes/arrows.rs#L206",
      "themed": true,
      "fields": [
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Start x in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "0.0",
          "docs": "Start y in pixels of the canvas (y down)."
        },
        {
          "name": "dx",
          "type": "f32",
          "default": "200.0",
          "docs": "Horizontal offset in pixels from the start to the tip; positive is right."
        },
        {
          "name": "dy",
          "type": "f32",
          "default": "0.0",
          "docs": "Vertical offset in pixels from the start to the tip; positive is down."
        },
        {
          "name": "tip_length",
          "type": "f32",
          "default": "24.0",
          "docs": "Length in pixels of each tip from its point back along the shaft; shortened to fit a short arrow."
        },
        {
          "name": "tip_width",
          "type": "f32",
          "default": "20.0",
          "docs": "Width in pixels of each tip across the shaft."
        },
        {
          "name": "tip_start",
          "type": "Option<ArrowTip>",
          "default": "None",
          "docs": "The tip at the start; `None` for none."
        },
        {
          "name": "tip_end",
          "type": "Option<ArrowTip>",
          "default": "Some(ArrowTip::TriangleFilled)",
          "docs": "The tip at the end; `None` for none."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).fill",
          "docs": "`None` leaves the inside empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "Paint::arrow(theme).stroke",
          "docs": "`None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "Paint::arrow(theme).stroke_width",
          "docs": "Outline width in pixels."
        },
        {
          "name": "dash",
          "type": "Option<(f32, f32)>",
          "default": "None",
          "docs": "Dash and gap lengths of the outline."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How it appears; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How it leaves at the end of its container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": "None",
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played while it is shown."
        }
      ],
      "methods": [
        {
          "signature": "fn shape(&self) -> Shape",
          "summary": "The path and paint as a `Shape`."
        }
      ]
    },
    {
      "name": "VectorSum",
      "summary": "Vectors added tip to tail (Manim's vector addition): every vector starts at `origin`, then moves over `run_time` seconds after `delay` to the tip of the one before, and the resultant from `origin` to the last tip draws with `resultant_enter` (a `Create` delayed past the move). Vectors are in units of `ui.space`; `labels` are written at the middle of the vectors, on their left, and `resultant_label` on the side of the resultant away from them.",
      "feature": "math",
      "page": "https://fframes-kit.pages.dev/docs/math/linear-transform-and-vector-sum/",
      "markdown": "https://fframes-kit.pages.dev/docs/math/linear-transform-and-vector-sum.md",
      "scenes": [
        "VectorSum"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/VectorSum-469bbb6f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/math/linear.rs#L251",
      "themed": true,
      "fields": [
        {
          "name": "vectors",
          "type": "Vec<(f64, f64)>",
          "default": "Vec::new()",
          "docs": "The vectors `(dx, dy)` in units of `ui.space` (y up), added in order tip to tail."
        },
        {
          "name": "origin",
          "type": "(f64, f64)",
          "default": "(0.0, 0.0)",
          "docs": "Where the first vector starts and the resultant begins, in units of `ui.space`."
        },
        {
          "name": "colors",
          "type": "Vec<Color>",
          "default": "Vec::new()",
          "docs": "Colours of the vectors in turn; empty for the theme's accent and highlight."
        },
        {
          "name": "labels",
          "type": "Vec<Cow<str>>",
          "default": "Vec::new()",
          "docs": "Text for each vector in turn, written at its middle; a vector without one has none."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the vectors begin to move into place."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "1.5",
          "docs": "Seconds the vectors take to move to the tip of the one before."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::default()",
          "docs": "Easing of the move over its run time."
        },
        {
          "name": "resultant",
          "type": "bool",
          "default": "true",
          "docs": "Draws the sum from `origin` to the last tip when `true`."
        },
        {
          "name": "resultant_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the resultant."
        },
        {
          "name": "resultant_label",
          "type": "Cow<str>",
          "default": "Cow::Borrowed(\"\")",
          "docs": "Text written beside the resultant; empty for none."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How each vector appears; `None` shows them from the start."
        },
        {
          "name": "resultant_enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the resultant appears; `None` shows it from the start."
        },
        {
          "name": "labels_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "Fade in of the vector labels; `None` for none."
        },
        {
          "name": "resultant_label_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "The resultant's label also fades with this, to wait for the resultant."
        }
      ],
      "methods": [
        {
          "signature": "fn total(&self) -> (f64, f64)",
          "summary": "The sum of the vectors."
        }
      ]
    },
    {
      "name": "VenetianBlinds",
      "summary": "Its children shown through blinds that open (Remotion's `venetianBlinds()`): `slats` strips across the area, each showing a band from its middle that is `progress` (0 hidden to 1 open) of the strip wide.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "VenetianBlinds"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/VenetianBlinds-5f54f982.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/reveal.rs#L30",
      "themed": true,
      "fields": [
        {
          "name": "progress",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.5)",
          "docs": "0 hidden to 1 fully open: the share of each slat's width that shows. Animatable."
        },
        {
          "name": "direction",
          "type": "BlindsDirection",
          "default": "BlindsDirection::Vertical",
          "docs": "Whether the slats stand upright side by side or lie one above the other."
        },
        {
          "name": "slats",
          "type": "u32",
          "default": "12",
          "docs": "Number of strips across the area; at least 1."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the blinds cover from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the mask when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content shown through the blinds (a closure taking the `Ui`)."
        }
      ],
      "methods": [
        {
          "signature": "fn bands(&self, progress: f32) -> Vec<(f32, f32, f32, f32)>",
          "summary": "The open bands as `(x, y, w, h)` at `progress`."
        }
      ]
    },
    {
      "name": "VGroup",
      "summary": "Shapes moved and animated together (Manim `VGroup`). Build one from the `shape()` of shape components, line them up with `VGroup::arrange` or `VGroup::arrange_in_grid` and draw it with one `enter`, `exit` and `emphasis`.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "VGroup"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/VGroup-15cbfeb3.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/vgroup.rs#L16",
      "themed": false,
      "fields": [
        {
          "name": "parts",
          "type": "Vec<Shape>",
          "default": null,
          "docs": "The shapes drawn together, in pixels of the canvas."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": null,
          "docs": "How the parts appear together; `None` shows them from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": null,
          "docs": "How the parts leave together at the end of their container; `None` stays."
        },
        {
          "name": "emphasis",
          "type": "Option<Emphasis>",
          "default": null,
          "docs": "An emphasis animation (`Indicate`, `Wiggle`, ..) played on the parts while they are shown."
        }
      ],
      "methods": [
        {
          "signature": "fn new(parts: Vec<Shape>) -> Self",
          "summary": ""
        },
        {
          "signature": "fn bounds(&self) -> Option<Rect>",
          "summary": "The box around every part, `None` for an empty group."
        },
        {
          "signature": "fn shift(self, dx: f64, dy: f64) -> Self",
          "summary": "Moves every part by `(dx, dy)` pixels (Manim `shift`)."
        },
        {
          "signature": "fn move_to(self, x: f64, y: f64) -> Self",
          "summary": "Moves the group so the center of its box is at `(x, y)` (Manim `move_to`)."
        },
        {
          "signature": "fn arrange(self, direction: Anchor, buff: f64) -> Self",
          "summary": "Lines the parts up one after another in `direction`, `buff` pixels apart, around the group's current center (Manim `arrange(direction, buff)`)."
        },
        {
          "signature": "fn arrange_in_grid(self, columns: usize, buff: (f64, f64)) -> Self",
          "summary": "Puts the parts in rows of `columns` cells (Manim `arrange_in_grid`), around the group's current center. `buff` is `(between columns, between rows)`."
        }
      ]
    },
    {
      "name": "Vibrance",
      "summary": "Its children with gentler extra saturation than `Saturation`; see `ColorMatrix::vibrance` for how it approximates vibrance.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Vibrance"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Vibrance-75b77500.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L417",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.8)",
          "docs": "Extra saturation, gentler than `Saturation`: 1 saturates half as much as `Saturation` at 2; 0 unchanged."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Vignette",
      "summary": "Darkened edges round its children (Remotion's `vignette()`). The middle up to `radius` stays clear, then the vignette grows over `feather` to `amount` (both 0 to 1, where 1 is the edge of the area seen from `center`). `roundness` 1 makes it an ellipse with the area's proportions and 0 a rectangle; in between the two shapes are mixed (Remotion mixes the distances, so the in-between shapes differ a little). `mode` lays `color` over the edges, also where the children are transparent, or fades the children out towards them. The curve is a smoothstep sampled at 16 points and drawn with gradients, so it costs no filter.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "Vignette"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Vignette-8f673e50.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/patterns.rs#L826",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.5)",
          "docs": "0 to 1 strength of the vignette at full darkness. Animatable."
        },
        {
          "name": "radius",
          "type": "f32",
          "default": "0.65",
          "docs": "0 to 1 distance from `center` up to which the picture stays clear, where 1 is the edge of the area."
        },
        {
          "name": "center",
          "type": "(f32, f32)",
          "default": "(0.5, 0.5)",
          "docs": "Middle of the clear area as 0 to 1 fractions of `area` (x, y)."
        },
        {
          "name": "feather",
          "type": "f32",
          "default": "0.35",
          "docs": "0 to 1 width over which the vignette grows from clear to full `amount`, after `radius`."
        },
        {
          "name": "roundness",
          "type": "f32",
          "default": "1.0",
          "docs": "0 a rectangle to 1 an ellipse with the area's proportions."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "Color::BLACK",
          "docs": "Colour laid over the edges in `Color` mode."
        },
        {
          "name": "mode",
          "type": "VignetteMode",
          "default": "VignetteMode::Color",
          "docs": "`Color` lays `color` over the edges, also where the children are transparent; `Alpha` fades the children out towards them."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the vignette covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the gradient and mask ids when two vignettes share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content that is darkened (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "Wave",
      "summary": "A wave along `length` meters of a medium whose left end is at `origin` (units of `ui.space`, `scale` units per meter), travelling right at `speed` m/s. With `front`, the medium is at rest at the start and the wave leaves the left end on the figure's clock; without it the whole length moves from the start. `marker` (meters from the left end) picks out one point of the medium, which shows that the medium oscillates in place while the wave passes. The axis draws with `enter`, the medium fades with `parts_enter`.",
      "feature": "physics",
      "page": "https://fframes-kit.pages.dev/docs/physics/wave/",
      "markdown": "https://fframes-kit.pages.dev/docs/physics/wave.md",
      "scenes": [
        "Wave"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Wave-1d553763.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/kits/physics/wave.rs#L43",
      "themed": true,
      "fields": [
        {
          "name": "kind",
          "type": "WaveKind",
          "default": "WaveKind::Transverse",
          "docs": "What the wave shows: a transverse wave, a longitudinal one, a standing wave or two waves added."
        },
        {
          "name": "origin",
          "type": "(f64, f64)",
          "default": "(-6.0, 0.0)",
          "docs": "Left end of the medium, on its resting line, in units of `ui.space`."
        },
        {
          "name": "length",
          "type": "f64",
          "default": "12.0",
          "docs": "Length of the medium in meters."
        },
        {
          "name": "scale",
          "type": "f64",
          "default": "1.0",
          "docs": "Units of `ui.space` per meter."
        },
        {
          "name": "amplitude",
          "type": "f64",
          "default": "0.8",
          "docs": "Largest displacement in meters; a standing wave reaches twice this."
        },
        {
          "name": "wavelength",
          "type": "f64",
          "default": "4.0",
          "docs": "Meters between two crests."
        },
        {
          "name": "speed",
          "type": "f64",
          "default": "2.0",
          "docs": "Speed the wave travels right at in m/s."
        },
        {
          "name": "second_wavelength",
          "type": "f64",
          "default": "3.0",
          "docs": "Meters between two crests of the second wave of a `Superposition`."
        },
        {
          "name": "second_amplitude",
          "type": "f64",
          "default": "0.5",
          "docs": "Largest displacement in meters of the second wave of a `Superposition`."
        },
        {
          "name": "front",
          "type": "bool",
          "default": "true",
          "docs": "The medium is at rest at the start and the wave leaves the left end on the clock; off makes the whole length move from the start."
        },
        {
          "name": "marker",
          "type": "Option<f64>",
          "default": "None",
          "docs": "Meters from the left end of one point of the medium to highlight, which shows it oscillates in place; `None` for none."
        },
        {
          "name": "particles",
          "type": "usize",
          "default": "48",
          "docs": "Particles of a longitudinal wave."
        },
        {
          "name": "band",
          "type": "f64",
          "default": "1.2",
          "docs": "Meters tall, the lines that stand for the particles of a longitudinal wave."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the wave begins."
        },
        {
          "name": "time_scale",
          "type": "f32",
          "default": "1.0",
          "docs": "Speed of the motion over local time; 2 runs twice as fast, 1 is real time."
        },
        {
          "name": "color",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the wave, or of the first wave of a `Superposition`."
        },
        {
          "name": "second_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the second wave of a `Superposition` and of the nodes of a standing wave."
        },
        {
          "name": "marker_color",
          "type": "Color",
          "default": "theme.colors.title",
          "docs": "Colour of the highlighted point and of the summed wave of a `Superposition`."
        },
        {
          "name": "guide_color",
          "type": "Color",
          "default": "theme.colors.muted",
          "docs": "Colour of the dashed axis and of a standing wave's envelope."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the wave line in pixels; the other lines use the theme's thin width."
        },
        {
          "name": "enter",
          "type": "Option<EnterAnim>",
          "default": "None",
          "docs": "How the axis draws in; `None` shows it from the start."
        },
        {
          "name": "exit",
          "type": "Option<ExitAnim>",
          "default": "None",
          "docs": "How the axis leaves at the end of the container; `None` stays."
        },
        {
          "name": "parts_enter",
          "type": "Option<FadeIn>",
          "default": "None",
          "docs": "How the medium fades in; `None` for none."
        },
        {
          "name": "parts_exit",
          "type": "Option<FadeOut>",
          "default": "None",
          "docs": "How the medium fades out before the end; `None` for none."
        }
      ],
      "methods": [
        {
          "signature": "fn displacement(&self, x: f64, t: f64) -> f64",
          "summary": "The displacement in meters of the medium `x` meters from the left end after `t` seconds: up for the transverse kinds, to the right for the longitudinal one."
        },
        {
          "signature": "fn envelope(&self, x: f64) -> f64",
          "summary": "The largest displacement of a standing wave at `x`, `2A sin(kx)`."
        },
        {
          "signature": "fn harmonic(self, n: u32) -> Self",
          "summary": "The standing wave of the `n`th harmonic of a string `length` meters long, fixed at both ends: Manim-physics' `StandingWave(n, length)`, `n` half wavelengths along it."
        },
        {
          "signature": "fn nodes(&self) -> Vec<f64>",
          "summary": "The nodes of a standing wave, every half wavelength from the left end, in meters."
        }
      ]
    },
    {
      "name": "Waveform",
      "summary": "The audio spectrum (or any values) as a filled smooth wave over a baseline, like the layered waves of an audio announcement. See `wave_path` for the geometry.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/data-audio-decoration-and-media.md",
      "scenes": [
        "Waveform"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/Waveform-6b248ab1.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/audio/waveform.rs#L89",
      "themed": true,
      "fields": [
        {
          "name": "values",
          "type": "Vec<f32>",
          "default": "Vec::new()",
          "docs": "The wave heights, spread evenly between the start and the end of the baseline; empty gives a flat line."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "0.0",
          "docs": "Left end of the baseline in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "1080.0",
          "docs": "The baseline."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1920.0",
          "docs": "Length of the baseline in pixels."
        },
        {
          "name": "gain",
          "type": "f32",
          "default": "1200.0",
          "docs": "Pixels of wave height per unit of value."
        },
        {
          "name": "max_height",
          "type": "f32",
          "default": "600.0",
          "docs": "Highest the wave rises over the baseline, in pixels."
        },
        {
          "name": "fill",
          "type": "Option<Color>",
          "default": "Some(theme.colors.accent)",
          "docs": "Colour of the area under the wave; `None` leaves it empty."
        },
        {
          "name": "stroke",
          "type": "Option<Color>",
          "default": "None",
          "docs": "Colour of the outline; `None` draws no outline."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.thin",
          "docs": "Outline width in pixels."
        },
        {
          "name": "opacity",
          "type": "f32",
          "default": "1.0",
          "docs": "0 transparent to 1 opaque."
        }
      ],
      "methods": []
    },
    {
      "name": "WhiteBalance",
      "summary": "Its children warmer or colder: `temperature` from -1 (blue) to 1 (orange) and `tint` from -1 (green) to 1 (magenta).",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "WhiteBalance"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/WhiteBalance-7d9b1ad4.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/color.rs#L402",
      "themed": true,
      "fields": [
        {
          "name": "temperature",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(0.5)",
          "docs": "-1 cold (blue) to 1 warm (orange)."
        },
        {
          "name": "tint",
          "type": "f32",
          "default": "0.0",
          "docs": "-1 green to 1 magenta."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter when two effects of this kind share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "ui::no_children()",
          "docs": "The content the filter is applied to (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "WhiteNoise",
      "summary": "Grey static over its children (Remotion's `whiteNoise()`): TV static, signal loss, snow. `amount` mixes it in, 0 unchanged and 1 the visible pixels fully replaced; the children's alpha stays. `seed` picks the pattern: derive it from the frame (`ui.frame.index as u32`) to make the static move. `grain` is the size of a speck in units: keep it at least two output pixels (2 for a full-size render, more for a scaled down one), since finer noise aliases and each backend samples it differently. Drawn with `feTurbulence` over the `area` from the origin; the children render twice.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/motion/effects/",
      "markdown": "https://fframes-kit.pages.dev/docs/motion/effects.md",
      "scenes": [
        "WhiteNoise"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/WhiteNoise-b90671bf.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/effects/distort.rs#L62",
      "themed": true,
      "fields": [
        {
          "name": "amount",
          "type": "Anim<f32>",
          "default": "Anim::Fixed(1.0)",
          "docs": "0 the children unchanged to 1 the visible pixels fully replaced by static. Animatable."
        },
        {
          "name": "seed",
          "type": "u32",
          "default": "0",
          "docs": "Picks the pattern; derive it from the frame (`ui.frame.index as u32`) to make the static move."
        },
        {
          "name": "grain",
          "type": "f32",
          "default": "2.0",
          "docs": "Size of a speck in the children's user units; keep it at least 2 output pixels or it aliases."
        },
        {
          "name": "area",
          "type": "(f32, f32)",
          "default": "(1920.0, 1080.0)",
          "docs": "Width and height of the area the static covers from the top left, in the children's user units."
        },
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names the filter and mask ids when two of these effects share a frame."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "no_children()",
          "docs": "The content the static is drawn over, only where it is opaque (a closure taking the `Ui`)."
        }
      ],
      "methods": []
    },
    {
      "name": "WordCaptions",
      "summary": "TikTok-style captions: the page of `pages` that plays now, centred on `(x, y)` and wrapped into `width` pixels, with the word being said in `highlight`, scaled by `pop`. Times are milliseconds of the container. A page that needs more than `max_lines` lines is shrunk until it fits. Between pages and after the last one nothing is drawn.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays/",
      "markdown": "https://fframes-kit.pages.dev/docs/media-and-overlays/overlays.md",
      "scenes": [
        "WordCaptions"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/WordCaptions-71c58692.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/overlay/word_captions.rs#L106",
      "themed": true,
      "fields": [
        {
          "name": "pages",
          "type": "Vec<TikTokPage>",
          "default": "Vec::new()",
          "docs": "The pages of words, each with its own timing, as made by `tiktok_pages`; one shows at a time."
        },
        {
          "name": "x",
          "type": "f32",
          "default": "960.0",
          "docs": "Horizontal center of the caption, in pixels of the canvas."
        },
        {
          "name": "y",
          "type": "f32",
          "default": "860.0",
          "docs": "Vertical center of the caption block, in pixels of the canvas."
        },
        {
          "name": "width",
          "type": "f32",
          "default": "1400.0",
          "docs": "Width in pixels the words wrap into."
        },
        {
          "name": "max_lines",
          "type": "usize",
          "default": "2",
          "docs": "Most lines a page may take; a longer page is shrunk until it fits."
        },
        {
          "name": "style",
          "type": "TextStyle",
          "default": "theme.typography.title",
          "docs": "The font: family, size in pixels and weight."
        },
        {
          "name": "fill",
          "type": "Color",
          "default": "theme.colors.caption",
          "docs": "Colour of the words that are not being said."
        },
        {
          "name": "highlight",
          "type": "Color",
          "default": "theme.colors.accent",
          "docs": "Colour of the word being said."
        },
        {
          "name": "pop",
          "type": "f32",
          "default": "1.12",
          "docs": "The size of the word being said, 1 for none."
        },
        {
          "name": "fade",
          "type": "f32",
          "default": "0.08",
          "docs": "Seconds a word takes to light up and to fade back."
        },
        {
          "name": "uppercase",
          "type": "bool",
          "default": "false",
          "docs": "`true` writes every word in capitals."
        },
        {
          "name": "pill",
          "type": "Option<Color>",
          "default": "None",
          "docs": "A rounded box behind the page, in this colour."
        },
        {
          "name": "pill_opacity",
          "type": "f32",
          "default": "0.75",
          "docs": "Opacity of the `pill`, 0 transparent to 1 opaque."
        },
        {
          "name": "padding",
          "type": "f32",
          "default": "24.0",
          "docs": "Space between the text and the edge of the pill."
        },
        {
          "name": "entrance",
          "type": "PageEntrance",
          "default": "PageEntrance::Pop",
          "docs": "How a page comes in over `enter` seconds."
        },
        {
          "name": "enter",
          "type": "f32",
          "default": "0.15",
          "docs": "Seconds of the entrance."
        },
        {
          "name": "exit",
          "type": "f32",
          "default": "0.1",
          "docs": "Seconds the page takes to fade out before the next one starts, or the last one ends."
        }
      ],
      "methods": []
    },
    {
      "name": "ZoomedInset",
      "summary": "Manim's `ZoomedScene`: the children, and a second, magnified copy of what is inside `frame` drawn in `display` (both pixel boxes), with the frame outlined and the display bordered. The display pops out of the frame over `run_time` after `delay` (Manim's `get_zoomed_display_pop_out_animation`); a `run_time` of 0 shows it at once. The children render twice.",
      "feature": null,
      "page": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems/",
      "markdown": "https://fframes-kit.pages.dev/docs/layout-and-shapes/coordinate-systems.md",
      "scenes": [
        "ZoomedInset"
      ],
      "clips": [
        "https://fframes-kit.pages.dev/media/scenes/ZoomedInset-ea1e881f.mp4"
      ],
      "source": "https://github.com/khanhthanhdev/fframes-kit/blob/main/fframes-kit/src/explain/camera.rs#L101",
      "themed": true,
      "fields": [
        {
          "name": "key",
          "type": "Option<&str>",
          "default": "None",
          "docs": "Names it when two of the same kind share a frame."
        },
        {
          "name": "frame",
          "type": "Rect",
          "default": "Rect::new(929.625, 509.625, 990.375, 570.375)",
          "docs": "The part of the canvas that is magnified."
        },
        {
          "name": "display",
          "type": "Rect",
          "default": "Rect::new(1447.5, 67.5, 1852.5, 472.5)",
          "docs": "Where the magnified copy is drawn."
        },
        {
          "name": "frame_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the outline of `frame`."
        },
        {
          "name": "border_color",
          "type": "Color",
          "default": "theme.colors.highlight",
          "docs": "Colour of the border of `display`."
        },
        {
          "name": "stroke_width",
          "type": "f32",
          "default": "theme.stroke.regular",
          "docs": "Width of the frame outline and the display border in pixels."
        },
        {
          "name": "background",
          "type": "Color",
          "default": "theme.colors.background",
          "docs": "Fills the display under the copy."
        },
        {
          "name": "delay",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds after the container's start before the display begins to pop out of the frame."
        },
        {
          "name": "run_time",
          "type": "f32",
          "default": "0.0",
          "docs": "Seconds the display takes to pop out of the frame; 0 shows it at once at `delay`."
        },
        {
          "name": "rate_func",
          "type": "RateFunc",
          "default": "RateFunc::Smooth",
          "docs": "Easing of the pop-out over its run time."
        },
        {
          "name": "children",
          "type": "Children",
          "default": "Box::new(|_| Svgr::empty())",
          "docs": "What is drawn and magnified (a closure taking the `Ui`); it renders twice."
        }
      ],
      "methods": [
        {
          "signature": "fn display_at(&self, p: f32) -> Rect",
          "summary": "Where the display is at progress `p` of the pop-out."
        },
        {
          "signature": "fn zoom(&self, p: f32) -> Affine",
          "summary": "The map from canvas pixels to the display at progress `p`: `frame` onto the display."
        }
      ]
    }
  ]
}
