Declaring a 3D chart
Load this card when a task adds or changes a three-dimensional chart: a
Chart3D mark or composition, Chart3DChannel, Chart3DScale,
Chart3DGuide or Chart3DView. Load the chart card first: its
shared rules on output placement, snapshots, typed text, interaction and
fallback apply to 3D charts too. This card holds only the 3D rules, generated
from the 3D chart specification, the
3D chart summary and the
3D chart annotation rows,
which own them. Renderer rules (camera evaluation, gestures, controls, picking
and 3D accessibility) are on the client runtime card.
Order of work
- Keep the 3D namespace separate from the 2D one and put the chart on output
data (
chart3d.data.*,chart3d.boundary.*,chart3d.snapshot.*,annot.chart3d.*). - Choose the primitive by geometry, never by family name (
chart3d.family.*,chart3d.mark.*,chart3d.bar.*,chart3d.line.*,chart3d.stem.*), and for surfaces and wireframes supply the topology (chart3d.uv.*,chart3d.topology.*). - Bind direct scalar row fields to channels (
chart3d.channel.*) and declare scales and guides only to override or share them (chart3d.scale.*,chart3d.guide.*). - Set the initial camera with one
Chart3DViewper physical scene, without inventing gesture modes (chart3d.view.*,annot.chart3d-view.*,chart3d.no-gesture-modes). - Keep visible text typed, respect the limits, and leave to the App whatever
it can compute (
chart3d.l10n.*,chart3d.limits.*,chart3d.exclusion.*). - Compile with the Studio MCP
compile_schematool and fix every reported rule.
Rules to apply
Studio does not check these rules. Each is quoted from its owner.
1. Purpose and compatibility boundary
Owner: 3d.md#1-purpose-and-compatibility-boundary
chart3d.app-owns-calculation: A Libertas protocol response or subscription-data payload may carry a server-prepared three-dimensional chart. The App remains responsible for every domain calculation, including sampling functions, calculating contours, projecting data, grouping series, and selecting topology. The client resolves scales, constructs the declared primitives, lays out guides, presents an accessible camera, and preserves the ordinary typed-data view.chart3d.boundary.scale-id-namespace: aChart3DScale.idnever resolves to aChartScale.id, even when their spelling is identical;chart3d.fallback.older-clients: An older client does not recognizeChart3DasChart, so it never enters its two-dimensional renderer. An unsupported 3D presentation follows the shared chart failure policy; the protocol response itself remains accepted.chart3d.data.no-hub-handling: The Hub has no chart renderer and needs no 3D-specific message, persistence, cache, or runtime-value handling. It transports the validated attributes and existing typed values through the ordinary schema and protocol paths.
3.1 Unit charts
Owner: 3d.md#31-unit-charts
chart3d.data.hidden-row-allowed: A row field may carryHidden=true. It is chart data, not presentation: the client keeps it in the retained row value, so a custom chart request can CopyFrom it.
3.3 Protocol Union wrappers
Owner: 3d.md#33-protocol-union-wrappers
chart3d.data.source-tree-authoritative: The complete selected variant remains the authoritative source tree even when the renderer projects its one chart field. Hidden context is never cloned away.chart3d.data.title-from-variant: The selectedResponseorSubscriptionDatavariant's localized name and description supply the overall chart title and description, even when the chart payload is a child field. Child charts within a composition retain their own localized names and descriptions.
3.4 Complete snapshots
Owner: 3d.md#34-complete-snapshots
chart3d.snapshot.replace: Every response, and every complete subscription snapshot, replaces the prior chart snapshot. A subscription report may instead extend or update the working value through the shared mechanisms described in the 2D snapshot rule. Clients do not otherwise join, patch, or merge rows, grids, series, or topology. An empty list is a valid empty chart when its schema is valid. A data-changing interaction sends an ordinary typed protocol request and receives another complete snapshot. Snapshot replacement does not imply presentation-camera reset; Section 8.2 defines camera continuity.
4.1 Primitive marks
Owner: 3d.md#41-primitive-marks
chart3d.mark.structural-roles:tooltip,detail,key,row, andcolumnare available to every mark.orderis meaningful forlineand for deterministic independent-mark paint and hit-test ties. Surface and wireframe topology is owned byx,yoru,v, not by list order; anorderbinding does not change mesh connectivity.
Point and line
Owner: 3d.md#point-and-line
chart3d.line.paths:pointandlineuse the mapped location(x,y,z). A null or non-finite required coordinate suppresses a point and breaks a line path. Line rows are partitioned first by facet and then by the composite rawdetailidentity. List order is the default vertex order; anorderbinding sorts ascending within each path with source order retained for ties.chart3d.point.axis-kinds: Each of x, y, and z may independently be continuous, categorical, or an explicitly discrete numeric/temporal position. A categorical point axis uses a point scale unless explicitly banded; the renderer never coerces its localized label back into geometry.chart3d.point.shape-tokens: The first four are camera-facing symbols; the final four are plot-space 3D primitives.circleis the default. An automatic shape scale assigns categories in canonical raw-domain order, cycles through this list, and repeats fromcircleonly after exhausting it. An identity shape must be one of these tokens; it is never a platform class, path, model, image, or URL. One client cannot substitute a native-only shape or change this assignment order.chart3d.point.size:sizeis a finite non-negative relative magnitude. Zero suppresses a point or stem-tip marker without removing its row from tooltips or accessibility. An automatic size scale preserves authored zero and chooses a responsive positive output range for positive values from the plot dimensions, available display area, and accessibility settings. The schema imposes no fixed projected-radius range. Numeric identity size is likewise finite and non-negative. For a camera-facing symbol it controls projected size; for a volumetric symbol it controls plot-space diameter and therefore participates in perspective. The resolved shape determines that interpretation consistently on every client. This permits both screen-stable Bubble 3D symbols and volume-calibrated solid symbols without making either model mandatory.
Bar
Owner: 3d.md#bar
chart3d.bar.legacy-baseline: The value axis may be x, y, or z. When its secondary is present, both endpoints are explicit and either order is valid. Otherwise the client uses the resolved scale base plane: zero when zero is representable and included in the resolved domain, or the lower resolved domain boundary otherwise. The sole continuous axis identifies the value axis, so this form may point along x, y, or z without another orientation property.chart3d.bar.sparse-column: Each base axis may be continuous or discrete. A band base starts with its full domain-slot bandwidth. An explicit point-scale base, or a continuous base without a secondary, derives a centered interval from adjacent distinct mapped positions in the same facet/detail group. Its available width is the smallest positive mapped gap to either neighbor, or the sole gap at an endpoint. An isolated position uses one tenth of the mapped axis length. Scalepaddingis then applied to that band, point, or inferred continuous interval. A continuous base with a matching secondary instead uses the authored interval, and padding has no effect on it.z2is the authored baseline. Withoutz2, the baseline is the same resolved scale base plane described above. Positive log domains, all-positive or all-negative linear domains, and temporal domains remain valid withoutz2; they use their lower resolved boundary.chart3d.bar.size-shape:sizeon a bar is a finite non-negative per-row multiplier applied to both base extents after explicit/inferred extent and padding resolution; zero produces a degenerate bar without removing its source row, and the multiplier never changes the value endpoint or baseline. Automatic shape scales use the portable bar-shape orderbox,cylinder,pyramid,sphere, cycling only after all four. Identity bar shapes use the same four-token catalog; the primitive is aligned between the baseline and value endpoint and scaled to the two resolved base extents. The default isbox.
4.2 Appearance applicability
Owner: 3d.md#42-appearance-applicability
chart3d.appearance.color-default:colorsupplies the mark-default paint: point fill and boundary, line, wireframe, and stem stroke, or bar and surface fill. Explicitfillorstrokeoverrides that component. Stroke metadata alone never creates a boundary when neitherstrokenor an applicablecolorresolves one.chart3d.appearance.stem-marker: Forstem,sizeandshapedescribe a marker at the tip, whilefillandfillOpacitydescribe that marker's interior. The stem segment remains the stroke component. A renderer with no native impulse-marker primitive constructs the same result from a segment and point marker; that lowering is not visible in schema or interaction semantics.
5. Chart3DChannel
Owner: 3d.md#5-chart3dchannel
-
chart3d.channel.canonical-order: The value is a comma-separated set of roles. Studio deduplicates and emits them in this order:Textx,x2,y,y2,z,z2,u,v, color,fill,stroke,opacity,fillOpacity,strokeOpacity, size,shape,strokeWidth,strokeDash, tooltip,detail,order,key,row,columnThe vocabulary is:
Group Roles Meaning Position x,x2,y,y2,z,z2Three primary coordinates and paired endpoints. Surface topology u,vParameter-grid adjacency; not visual scales. Paint color,fill,strokeDefault paint or explicit component paint. Paint strength opacity,fillOpacity,strokeOpacityOverall or component alpha. Symbol/stroke size,shape,strokeWidth,strokeDashPoint/bar geometry or path appearance. Inspection tooltipValues included in the typed inspector. Structure detail,order,keySeries grouping, path/paint order, and stable row identity. Facet row,columnSmall-multiple partitioning.
5.3 Identity, order, and missing values
Owner: 3d.md#53-identity-order-and-missing-values
chart3d.identity.raw-values: Grouping, uniqueness, category domains, series identity, and key identity use canonical raw typed values, never localized labels. Floating negative zero is canonicalized to positive zero for identity. Non-finite values cannot become keys or topology indices.chart3d.identity.unique-keys: A non-nullkeyis unique within its unit, facet, and detail tuple. Duplicate keys invalidate 3D presentation. Without a key, a source row index is identity only for the current complete snapshot.chart3d.identity.null-values: Null or non-finite required point/bar/stem coordinates suppress that row. They break line paths. For surface and wireframe they remove the vertex and every incident face or edge. Null optional appearance uses the theme-native default. Null tooltips are omitted.
6. Chart3DScale
Owner: 3d.md#6-chart3dscale
-
chart3d.scale.extends-chart-scale:Chart3DScalestarts with theChartScaleproperty and type vocabulary, adds portable logarithm-base control, automatic-domain growth, and 3D bar-basepadding, and participates only in aChart3Dtree:Textproperty-order = id,type,logBase,min,max,mid,zero,reverse, growMin,growMax,padding type = linear | log | symlog | sqrt | time | utc | ordinal | band | point | identity -
chart3d.scale.infer-number: ordinary Number and TimeOnly positions uselinear; -
chart3d.scale.infer-temporal: DateOnly and DateTime positions usetime; -
chart3d.scale.infer-categorical: categorical point/line/point-cloud positions usepoint; -
chart3d.scale.infer-bar-base: discrete bar bases useband, continuous sparse-column bases keep their continuous position scale; -
chart3d.scale.infer-paint: categorical paint and shape useordinal; and -
chart3d.scale.infer-numeric-appearance: numeric paint, opacity, size, and stroke width uselinear.
6.1 Shared scales
Owner: 3d.md#61-shared-scales
chart3d.shared-scale.no-concat: A same-spelledChartScale.idis unrelated. A scale never crosses a concat pane. Compatible scales in one flattened layer may share one guide.
7.1 Placement
Owner: 3d.md#71-placement
chart3d.guide.value-candidates:valueforx,y,zcreates candidates at the target coordinate of eligible rows.chart3d.guide.detail-none:nonewithtarget=detailsuppresses an otherwise requested detail guide.
7.2 Components and inference
Owner: 3d.md#72-components-and-inference
chart3d.guide.inference: Without an explicit declaration, every non-identity primary binding hassource=scalewith defaults. Identity appearance hassource=none. One or moredetailbindings infer one compositesource=valueseries legend with default components. An explicit detail guide configures that legend or suppresses it withsource=none; it never creates separate legends for individual fields of the composite detail tuple.
7.3 Position-guide cadence and thinning
Owner: 3d.md#73-position-guide-cadence-and-thinning
chart3d.cadence.tickstep-tickcount:tickStepis an authored semantic cadence and therefore bypasses the automatic ladder. It generates only values aligned to that interval in the native convention defined above; it does not synthesize a non-aligned domain endpoint.tickCountcannot accompanytickStep. WithouttickStep,tickCountonly lowers the automatic tier's viewport-derived candidate capacity; it never asks for exactly that many values, invents evenly spaced samples, or replaces the required nondegenerate terminal endpoint pair. ThustickCount=1does not turn a nondegenerate automatic guide into a one-label summary: if its essential terminal candidates cannot fit, ordinary guide fallback applies.
7.5 Layer ownership
Owner: 3d.md#75-layer-ownership
chart3d.guide.no-text: Guide text comes from existing typed/localized sources. NoChart3DGuideproperty contains user-visible text.
8. Chart3DView
Owner: 3d.md#8-chart3dview
chart3d.view.canonicalization: Azimuth canonicalization produces the equivalent value in-180 <= azimuth < 180; for example,180becomes-180. Elevation remains an arbitrary finite schema value for wire compatibility, but the client clamps the effective authored/default elevation and every transient update to the closed[-90,90]degree interval before camera evaluation. Values below-90therefore behave as-90, and values above90behave as90; the authored schema value itself is not rewritten. An orthographic view acceptsfovfor portable shared declarations but ignores it. Omitted properties use the defaults without being inserted into final schema JSON.
8.2 Camera semantics
Owner: 3d.md#82-camera-semantics
chart3d.view.coordinates: The data coordinate system is right-handed with positive z as up. After scale mapping, x, y, and z span a fitted plot box whose world dimensions have the normalizedaspectX:aspectY:aspectZratio. The default remains a cube. Target coordinates use this normalized post-scale space: each axis cube runs from 0 to 1, the default0.5,0.5,0.5is its center, and finite targets outside the box are permitted.chart3d.view.zoom-fit: Atzoom=1, the complete resolved plot box fits in the available scene after title, guide, and safe-area layout. Perspective usesfovas its vertical field of view. Orthographic projection ignores perspective foreshortening and derives its fitted extent from the same box. Near and far clipping planes are bounded renderer-derived values and are not schema inputs.chart3d.view.snapshot-continuity: A complete data snapshot does not by itself reset presentation state. The client preserves transient camera orientation, zoom, and target while the presentation-root identity and effectiveChart3DViewremain compatible. It resets only on an explicit user reset, an authored view change, an incompatible presentation root, or a non-finite retained target. Presentation-root identity is the selected response field path plus its effective chart/composition schema, not the current row contents.
8.3 Universal client action vocabulary
Owner: 3d.md#83-universal-client-action-vocabulary
chart3d.view.no-mode: There is no camera-operationmode, interactionmode, selected rotate-versus-move state, or corresponding schema/wire variable. Pointer count selects the continuous action, and each tap-only or accessibility control names its action explicitly. The existing preview-versus-full-screen navigation state alone determines whether direct chart manipulation is active.
9. Surface and wireframe topology
Owner: 3d.md#9-surface-and-wireframe-topology
chart3d.topology.explicit: Surface topology is explicit and resource-safe. The client never triangulates an arbitrary point cloud, runs Delaunay construction, infers nearest neighbors, or executes a formula.chart3d.topology.groups: Rows are partitioned first by facet and then by the composite rawdetailidentity. Each group independently defines one grid.
9.1 Rectangular height grid
Owner: 3d.md#91-rectangular-height-grid
chart3d.grid.unique-pairs: every present ordered x/y pair has at most one source row;chart3d.grid.holes: a missing pair is an explicit hole, while a duplicate pair invalidates the complete 3D chart; andchart3d.grid.non-uniform: x and y spacing may be non-uniform.chart3d.grid.null-z: This form represents an ordinary height mapz=f(x,y)without copying x/y into separate index fields. A row with a null or non-finite z retains its unique grid slot but contributes no finite vertex, so its incident cells form a hole under Section 9.3.
9.2 Parameter grid
Owner: 3d.md#92-parameter-grid
chart3d.uv.numbers: both are required finite ordinary Numbers (see scalar compatibility and surface requirements);chart3d.uv.domains: each distinct raw domain is sorted by canonical numeric ordering and may be negative, fractional, non-uniform, or sparse;chart3d.uv.unique:(u,v)is unique within the facet/detail group;chart3d.uv.positions: x, y, and z remain arbitrary continuous positions and need not form a height function; andchart3d.uv.holes: a missing(u,v)pair creates a hole rather than causing neighbor inference.chart3d.uv.app-computes: This form represents non-separable, curvilinear, folded, or parameterized surfaces. The App computes the sample coordinates;u,vdescribe only adjacency.
9.3 Cells
Owner: 3d.md#93-cells
chart3d.cells.list-order: List order does not affect cells. It remains the stable source order for tooltips, accessibility, and equal hit-test ties.
10. Supported families
Owner: 3d.md#10-supported-families
-
chart3d.family.recipes(judgment): The supported family names are recipes over the closed primitive set, not additional tokens: -
chart3d.family.contours(judgment):Family V1 representation Contours on surface A layerwithsurfacefollowed by server-emittedlinechildren; contour identity/level uses typeddetailand tooltip fields -
chart3d.family.waterfall(judgment):Family V1 representation Waterfall/spectrum 3D linewith onedetailidentity per trace and anorderfield along each spectrum -
chart3d.family.math-surface(judgment):Family V1 representation Arbitrary mathematical surface App code evaluates and samples the function, then emits surface; parametric functions useu,v -
chart3d.family.no-client-calculation: There are intentionally nobubble,contour,pointCloud,waterfall, or formula-expression tokens. Contours are not calculated by the client. An App that changes a formula or sampling density returns another complete typed snapshot.
11. Localization and visible text
Owner: 3d.md#11-localization-and-visible-text
chart3d.l10n.no-wording: NoChart3D*property contains user-visible wording.chart3d.l10n.missing-labels: Localized labels never replace raw identity, change topology, merge categories, or affect ordering. A missing optional label is omitted. A missing essential category/object/formatted-text label invokes the chart failure policy in §12.6 for the complete 3D presentation rather than exposing an internal token.
12.1 Inspection and protocol boundary
Owner: 3d.md#121-inspection-and-protocol-boundary
chart3d.interaction.inspection-boundary: In Chart Explorer, a tap on eligible visible geometry invokesinspect.at; a tap on empty scene space invokesinspect.clear. Movement beyond the native touch-slop threshold cancels the pending tap. Inspection and tooltips retain the originalScriptValue. The projected chart also retains its complete response, carrier, or selected Union variant so hidden transaction fields remain available to typedNextRequestandCopyFromhandling. Inspection is transient presentation state for the current snapshot; the tap itself never sends a protocol request.chart3d.interaction.camera-no-request: Camera movement is presentation-only. It does not send a protocol request, change the selected row, modify source values, or create a persistent App state. A data-changing control uses the normal typed protocol interaction and replaces the snapshot.
12.5 Visible and accessible controls
Owner: 3d.md#125-visible-and-accessible-controls
chart3d.a11y.not-sole-carrier(judgment): Depth, perspective, lighting, or color can never be the only carrier of domain meaning.
12.6 Fallback
Owner: 3d.md#126-fallback
chart3d.fallback.shared-policy: The shared chart failure policy applies to all 3D presentation failures, including unknown future marks, channels, scale/view properties, guide tokens, and unsupported valid features.
13. Security and resources
Owner: 3d.md#13-security-and-resources
chart3d.limits.no-schema-caps: All metadata and data are untrusted, butChart3Dadds no fixed schema-validity cap for composition depth, unit count, facets, guides, tooltip fields, source rows, point-cloud points, surface vertices, cells, or line vertices. Neither an ECharts-GL nor a SciChart-compatible shape becomes invalid merely because it crosses a Libertas-only count. The enclosing ScriptValue transport owns payload admission, and each client applies its ordinary configurable memory, work, text, and native-renderer budgets. Exceeding a runtime budget causes cancellation and invokes the chart failure policy in §12.6; it never retroactively makes the schema or protocol response invalid.chart3d.limits.no-executable: The contract admits no executable expressions, arbitrary field paths, HTML, URLs, remote images, shader text, material programs, platform objects, model assets, client-side joins, client topology inference, or arbitrary JSON option blobs.
14. Validation
Owner: 3d.md#14-validation
chart3d.validation.layers: Studio checks the full schema contract after language extraction and dependency resolution. Clients check the effective schema and returned values when presenting a chart. Invalid or unsupported presentation follows the chart failure policy; it does not alter the response payload.
16. Deliberate exclusions
Owner: 3d.md#16-deliberate-exclusions
chart3d.exclusion.compute-in-app(judgment): If an App can compute a feature and return explicit typed rows and existing 3D primitives, it does so. A future schema extension is warranted only for a portable presentation or interaction capability that cannot be expressed safely that way.
3D charts
Owner: presentation.md#3d-charts
chart3d.no-gesture-modes(judgment): Do not invent a camera or gesturemode, encode touch mappings in response data, or add sensitivity or control-label fields.orbit,pan, andzoomEnabledonly gate independent client capabilities. The preview is gesture-neutral; Explore 3D chart opens full-screen Chart Explorer, whose fixed client vocabulary maps one-finger drag to Rotate, two-finger translation to Move, and pinch/spread to Zoom. Tap-only and accessibility actions expose Rotate, Move, Zoom, and Reset separately, without a Rotate/Move selector.
Rules Studio enforces
Studio rejects a source that breaks one of these rules. The owner holds the full rule.
1. Purpose and compatibility boundary
Owner: 3d.md#1-purpose-and-compatibility-boundary
chart3d.data.no-mixed-node: A node never carries both aChart3D*and aChart*attribute
2. Source and generated syntax
Owner: 3d.md#2-source-and-generated-syntax
chart3d.syntax.canonical-once: Each node carries at most one of each Chart3D attribute; the nearest replaces the whole valuechart3d.syntax.kind-not-type: Chart3DScale source uses kind; a source type property is rejected
3.1 Unit charts
Owner: 3d.md#31-unit-charts
chart3d.data.unit-shape: A 3D unit chart is a List of row Tables whose direct scalar fields carry the channelschart3d.data.hidden-row-field: A Hidden row field carries noChart3DChannel,Chart3DScaleorChart3DGuidechart3d.data.carrier: A carrier Table holds exactly one non-hidden List field; every other field is Hidden
3.2 Compositions
Owner: 3d.md#32-compositions
chart3d.compose.children: Every visible 3D composition child carries Chart3D, at least one; others are Hidden
3.3 Protocol Union wrappers
Owner: 3d.md#33-protocol-union-wrappers
chart3d.data.union-wrapper: A wrapping Union variant holds exactly one chart field; every sibling carries Hidden
4. Chart3D
Owner: 3d.md#4-chart3d
chart3d.mark.one-token: Chart3D holds exactly one mark or composition token
4.1 Primitive marks
Owner: 3d.md#41-primitive-marks
chart3d.mark.xyz-required: Every primitive 3D mark requires one x, one y and one z bindingchart3d.mark.point:pointforbids secondary and topology channelschart3d.mark.line:lineforbids secondary and topology channelschart3d.mark.surface:surfaceandwireframetake pairedu,vor none, and no secondary endpoints
Point and line
Owner: 3d.md#point-and-line
chart3d.line.unordered-needs-order: A 3Dlineon an Unordered List must declareorder
Bar
Owner: 3d.md#bar
chart3d.bar.forms: A 3D bar is an explicit cuboid, a continuous-z sparse column, or the two-band shorthandchart3d.bar.cuboid: An explicit cuboid uses six continuous positions whose secondaries match their primaries
Stem
Owner: 3d.md#stem
chart3d.stem.geometry:stemtakes onlyz2as a secondary, no topology, and a continuousz
4.2 Appearance applicability
Owner: 3d.md#42-appearance-applicability
chart3d.appearance.closed: Each 3D mark accepts only the appearance roles in its table row
4.3 Compositions
Owner: 3d.md#43-compositions
chart3d.compose.layer-children: A 3D layer holds units or layers, never a direct concat
5.1 Multiplicity
Owner: 3d.md#51-multiplicity
chart3d.channel.singletons: Onlytooltipanddetailmay repeat across fields of one 3D unitchart3d.channel.multi-role: A field withChart3DScalehas exactly one scale-bearing role, and never bothuandvchart3d.channel.secondary-topology: Secondaries need their primary and own no scale;uandvown no scale or guide
5.2 Scalar compatibility
Owner: 3d.md#52-scalar-compatibility
chart3d.channel.scalar-compat: Each 3D role accepts only the scalar types in the compatibility tablechart3d.channel.surface-continuous:surfaceandwireframeneed continuousx,yandzpositionschart3d.channel.unit-format: Paired endpoints and shared 3D scales use the same PhysicalUnit and Format
6. Chart3DScale
Owner: 3d.md#6-chart3dscale
chart3d.scale.properties: Chart3DScale keys are unique;logBaseonly withlog;paddingonly on a bar basechart3d.scale.growth:growMinandgrowMaxare non-negative and only on a continuousx,yorzscalechart3d.scale.identity:identityscales apply only to literal appearance values, never positions, facets or topologychart3d.scale.domains: 3D scale bounds,zero, log and sqrt restrictions matchChartScale
6.1 Shared scales
Owner: 3d.md#61-shared-scales
chart3d.shared-scale.auto-layer: Unnamedx,y,zscales in one 3D layer share automatically and must be compatiblechart3d.shared-scale.explicit-id: 3D scales sharing anidmust be compatible and must not conflict on domain orlogBase
7. Chart3DGuide
Owner: 3d.md#7-chart3dguide
chart3d.guide.properties: Chart3DGuide needstargetandsource;tickCountandtickStepare exclusive x/y/z scale options
7.1 Placement
Owner: 3d.md#71-placement
chart3d.guide.scale-placement: A scale or none guide sits on the field owning its target primary rolechart3d.guide.label-field:valueandspanguides sit on a guide-label field without scale-bearing roleschart3d.guide.span: A 3Dspanguide targetsx,yorzand needs the matching secondarychart3d.guide.detail-value: Adetailvalue guide sits on adetailfield; one detail guide per unitchart3d.guide.appearance-sources: Appearance and facet 3D guides accept only sourcescaleornone
7.2 Components and inference
Owner: 3d.md#72-components-and-inference
chart3d.guide.components: A 3D guide declares only its kind's components;source=nonedeclares none
7.5 Layer ownership
Owner: 3d.md#75-layer-ownership
chart3d.guide.shared-merge: Explicit guides on one shared 3D scale group must be identicalchart3d.guide.one-axis-per-layer: A 3D layer shows at most onex, oneyand onezguide
8. Chart3DView
Owner: 3d.md#8-chart3dview
chart3d.view.unique-canonical:Chart3DViewholds unique named properties in canonical orderchart3d.view.projection:projectionisperspective(default) ororthographicchart3d.view.aspect:aspectX,aspectY,aspectZare positive ratios, default1,1,1chart3d.view.target:targetX,targetY,targetZare finite normalized coordinates, default0.5chart3d.view.azimuth:azimuthis any finite degrees, canonicalized modulo 360, default45chart3d.view.elevation:elevationis any finite degrees, clamped by the client to [-90,90], default30chart3d.view.zoom:zoomis a positive finite scalar, default1chart3d.view.fov:fovis vertical degrees with 0 < fov < 180, default45chart3d.view.orbit:orbitis a Boolean, defaulttruechart3d.view.pan:panis a Boolean, defaulttruechart3d.view.zoom-enabled:zoomEnabledis a Boolean, defaulttrue
8.1 Placement
Owner: 3d.md#81-placement
chart3d.view.placement: A layer root owns its oneChart3DView; concat roots give inherited defaultschart3d.view.invalid-elsewhere:Chart3DViewon a row field, hidden field, function or layer child is rejected