Manual
The document
OverviewGrammarDocument headerSyntax cheatsheet Scene Step
Content
Text blocks
Paragraph Heading 1 Heading 2 Heading 3 Heading 4 List
Maths
Equation Maths
Tables & images
Table Image
Formatting
Bold Italics Inline Code Highlight
Text colours
Links & references
Link Footnote Icon Internote Reference
ValueWhere inline content works
Narrative only
Note Definition Example Task Divider
Graph pane
Graph
Curves & areas
Curve Integral
Data marks
Scatter Histogram
Fits
Fit Residuals
Surfaces
Contour Heatmap
Marks
Line Segment Vector Point Polygon Text
Shapes
Circle Square Rectangle Triangle Star Diamond Hexagon
Axis furniture
Axis label Axis Brace
Expressions
Code pane
Code Lines
Animation & interaction
Cues that wrap content
Cue Draw cue Trace cue Highlight cue Spotlight cue Type cue
Cues on a value
Value cue Zoom cue
Anchors & timing Parameter
Advanced features
Data Let Define Preset Include If For Ignore
Reference
All constructs A–ZAttribute types
Concepts
IdentifiersBody & detailDerived attributes
Guidance
The narrative contractWhat earns a place on the canvasParameter or cueHonest numbersCode demonstrates, never computesAuthor-attached data only
?
  1. Reference
  2. Concepts
  3. Identifiers

Identifiers

How `#id` names a construct, and the two ways to reach what it names.

#Naming a construct

Any construct may carry an identifier, written with # in its head before the implicit value: curve#flight, canvas.graph#projectile, @data#islands, @preset#accent. It is universal — even directives with no use for one accept it — because a uniform rule with harmless cases beats a per-construct list of what may be named.

#One namespace, document-wide

Every #id in a document shares a single namespace, and identifiers resolve in both directions: a reference may point at something declared later. Two constructs claiming the same id is a collision, reported as an error — @preset#apple and curve#apple cannot coexist.

#Bindings

A binding is a reference written bare — #flight, or with a member, #islands.area. It is never resolved to a value at compile time: the pointer survives into the renderer, and whatever consumes it decides what to do with it.

continue: #earlier-pane
cue.trace{ point(x: 0; y: 0) }(path: #flight)
table(data: #islands; columns: island, area)
text(label: #fit.slope)

Because nothing is resolved early, a binding is live — it reflects animated attributes, reader-set parameters and derived values as they change. Liveness is not something a binding declares; it is simply what remains when compile-time resolution is absent.

#Substitutions

{{ }} is the other way to reach a value, and it is a different mechanism entirely: a preprocessor that splices text into the source before parsing. That is why it works identically in prose, attribute values and code bodies.

{{z-expected}}          an @let constant
{{#survey.area}}        a dataset column, spliced as a comma list
{{#flight.colour}}      a plain, unanimated attribute
A value that varies at render time cannot be substituted. {{#fit.slope}} is a compile error, and so is any animated or reader-manipulated attribute — a snapshot frozen into the document would disagree with what the reader is looking at. Those must be reached by a binding instead.

#Member access

The . sigil reaches into whatever the identifier names: a dataset's column (#islands.area), a construct's attribute (#flight.colour), or a derived value (#fit.slope). It is the same operation as namespace access in a type name like canvas.graph — reaching into a container for something it holds — and the language draws no distinction between the two.

  • Column references must be fully qualified. There is no bare-column shorthand, because attribute values are unquoted and label: island must stay the literal string.
  • Existence is proven at compile time even though values are not — a reference to a construct or member that does not exist is an error, so the renderer never meets a dangling pointer.
On this page
Naming a constructOne namespace, document-wideBindingsSubstitutionsMember access
PrivacyTermsContact Support
Identifiers · Internote