Shared style replacement (13.3)
// @gis-api 0.5-session
// @permissions ["project.read", "map.write"]
import { map } from 'sqsmap';
map.setStyle('https://www.sqsmap.com/sdk/sqsmap-core/style-registry-assets/styles/style.json', { diff: false });
await map.sqs.flush();
export default await map.getProjection();
setStyle returns the map and chains with camera writes. Authoritative queries wait for earlier shared writes. setStyle(null) clears the style basemap. HTTP(S), custom-protocol URLs and the inline scope below are connected. Current matching shared SDK map.setStyle attempts an atomic diff when diff is omitted or true; false requests full replacement. See the style-diff guide for source compatibility, live URL comparisons and resource-root fallback. Desktop application integration must be checked separately from standalone native SDK acceptance. Unknown options and invalid URLs report invalid arguments without modifying the existing basemap.
Desktop and web hosts with a matching SDK implement this facade. Standalone native modules support the same syntax. Desktop style loading currently requires an empty or WebMercator business view; other GIS coordinate systems reject explicitly. The mobile script host remains under development rather than a permanent platform difference. See native resources and browser requests. Older npm SDKs explicitly reject the missing entry. Command confirmation does not mean downloads are complete.
Attribution queries
Shared scripts use const credits = await map.sqs.getAttributions(). text is complete plain text; items retain source, instance and referencing-layer provenance. Reads do not move the camera, poll resources or change command/event sequences. Style-wide credit remains; enabled layers use inclusive minzoom and exclusive maxzoom, with unreferenced sources omitted. Opacity, feature filters and tile readiness do not remove credits.
The standalone SDK uses await view.getAttributions(); native libraries use sqsm_map_attributions_json (runtime bit8192, output may be freed after map destruction). Shared GeoJSON/style credits agree; host imagery, terrain and offline scope is covered in map sources and attribution. Mobile application script hosts still need integration.
Raw credits must be strings of at most4KiB UTF-8. HTML is stripped and entities decoded once; credits are no longer clipped to180characters. Complete JSON is limited to64KiB; RESOURCE_LIMIT preserves the map and previous snapshots. Returned snapshots are immutable historical data. Applications provide provider-required links. See the exact portable-attributions.js.
Attribution changes are connected: map.on("sqs.attributionschange", event => ...) receives a deeply frozen event.attributions snapshot. Pump/frame samples may coalesce; there is no initial replay, so listen before querying. Budget errors use context=attributions; recovery notifies again. Stop/destruction clean up; 128 pending notices/256KiB fail explicitly. Complete HTML/CSS and the same portable event input.
Vector style sources now support url or inline tiles, TMS, source zoom limits and bounds overrides. See tiled vector style sources. Shared named sources support GeoJSON, image/video/canvas, raster, MVT and raster-dem. See source guides, media and elevation and hillshade for supported properties and layer combinations. GeoJSON promoteId is connected; vector-tile promoteId and MLT remain unavailable. These are distinct capabilities.
Standard raster styles now have planar painting (styleRasterPlanarSources:true). Shared raster sources and planar/pitched/globe imagery lifecycle are connected in07.7/16; remaining raster properties and DEM continue in tasks. See raster style sources.
Standard imagery now supports the shared globe projection. Cross-host planar pitch and terrain draping remain active work. Tile fading uses raster-fade-duration, defaults to 300ms, and accepts 0 for immediate display. Complete HTML and a shared script are in the imagery guide.
Inline style transactions (08.4 in progress)
Version 8 inline objects are being connected to shared GeoJSON sources and circle/line/fill layers using the live-edit validators. All sources, layers and display plans must succeed before replacing the shared registry; failure preserves the map. Sources receive new instance identities, old requests are cancelled and stale responses cannot replace new data. Scene controllers remain map-owned; old bindings follow stale-identity handling. Inputs and snapshots are bounded to4MiB. Complete basemap/business registry unification, other style types, final cross-host acceptance of standard events and mobile hosting remain in progress; this scope is not complete MapLibre style support.
Style snapshots and standard events
await map.getStyle() returns the validated current style together with editable shared sources/layers, including name, metadata and current data. URL documents not yet admitted return CAPABILITY_UNAVAILABLE. Duplicate IDs between the basemap and shared registry return CONFLICT rather than losing one side. Snapshots are bounded to4MiB; shared GeoJSON snapshots can be imported again.
styledata reports style document state changes; style.load reports admission of the current document and its dependencies, not completion of every viewport tile or presentation. Validated inline documents notify styledata then style.load. URL admission first reports pending status and finishes within the same generation when dependencies are ready. Events contain dataType=style and deeply frozen styleState (generation, revision, loaded). Validation failures emit no event and do not advance a generation. No initial replay: subscribe before querying. Clearing the basemap preserves shared layers for compatibility; complete URL/shared registry unification remains in progress.
Shared type expressions (08.5)
Supports MapLibre-style boolean/number/string/object assertions with ordered candidates, array item-type/length assertions, typeof,properties and get/has with optional objects and string-name expressions. Syntax follows the official expression reference; the shared Rust evaluator is independently implemented without the MapLibre runtime.
map.setPaintProperty('places-layer','circle-color',
['case',['boolean',['feature-state','selected'],false],'#ff00ff','#0000ff']);
map.setPaintProperty('places-layer','circle-radius',
['number',['get','height',['object',['literal',{height:18}]]],6]);
await map.sqs.flush({render:true});
Assertions do not coerce numeric strings. They select the first candidate of the requested type and short-circuit later evaluation; failure uses existing paint defaults/warnings or explicit query-filter errors. array supports value,type/value,type/length/value forms with string/number/boolean item types and nonnegative integer lengths up to65536. Array typeof results include item type/length, e.g.array<number, 2>; mixed items use value. get returns null for missing keys,has distinguishes missing from present null,and invalid object inputs fail explicitly.
This describes JSON types; collator supports Unicode search comparisons for five locales; complete locale coverage, the full format/image value system and remaining expressions stay in subsequent tasks; text-field supports format text sections with font-scale/text-color, complete PBF text-font stacks, top/center/bottom vertical-align, registered RGBA image sections and case/coalesce/match/let/var combinations, described in formatted text, font stacks, section alignment and RGBA image sections. Images use pixelRatio dimensions and retain RGBA color multiplied by text-opacity; missing images are actual null, SDF sections reject and a top-level text-field image must be wrapped in format. Existing node/depth,source and display budgets apply; feature-state is paint-only. GeoJSON/shared MVT use identical semantics; setStyle(URL) basemaps retain their separate expression scope. The complete HTML and portable script include selection,ordering,views,queries,credits and disposal.
Variable scope (08.6)
Shared paint,filter and query expressions support let/var. Variables are visible in the let result; inner bindings shadow outer ones. Binding values resolve only enclosing-scope variables. Bindings evaluate on demand,so unused runtime errors do not execute. Names use nonempty ASCII letters/digits/underscores,up to256 bytes. Unbound names and invalid structures reject before mutation.
map.setPaintProperty('places-layer','circle-color',
['let','selected',['boolean',['feature-state','selected'],false],
['case',['var','selected'],'#ff00ff','#0000ff']]);
map.setPaintProperty('places-layer','circle-radius',
['let','large',18,['step',['zoom'],6,4,['var','large']]]);
await map.sqs.flush({render:true});
Camera zoom may drive a terminal step/interpolate inside outer let expressions; it cannot appear in binding values or other positions. Shared layers continue reevaluating actual zoom. Each evaluation permits8192 steps/64 levels; AST limits remain1024 nodes/32 levels. Budget failures use existing paint defaults/warnings; layer/query filters report RESOURCE_LIMIT and mutations leave no partial layer/reference.
The complete HTML and portable script include all buttons,credits and cleanup through native and real WASM main-thread/strict Worker. Implementation is independent against the public expression specification,without MapLibre code. Remaining operators and complete layer types continue in tasks.
Shared global state: map.setGlobalStateProperty / map.getGlobalState, inline state defaults and global-state expressions. Global state.
Shared icon-image supports availability-aware typed images, reported by commonIconImageExpressions=true. Missing image values are actual null for coalesce; plain strings and empty strings keep their existing semantics. Lexical/lazy scope and the8192-step budget are reused; RGBA/SDF parameters and queries remain unchanged. Only attempted names contribute missing notices, and native/WASM image candidates validate before commit. See icon image expressions. Patterns, downloads, URL-style expression domains and3D remain outside this capability.
Shared planar fill patterns
fill-pattern supports uniform and feature properties/get/feature-state RGBA selection, reported separately by commonFillPatternsUniform and commonFillPatternsPerFeature. Typed image/coalesce, lexical/lazy branches, integer zoom, and global state remain supported; fall back within the name for absent state. Missing images hide only affected features and report actual visible demand. Property/state/image candidates validate before commit and preserve old state/identity on failure; holes, original feature order, and world phase remain intact. Transitions, complete line-pattern combinations, 3D/globe, and per-pixel alpha picking remain unsupported. See fill patterns.
SDF fill patterns are reported by commonFillPatternsSdf. Register with sdf:true; image alpha stores distance (.5 boundary), fill-color is the foreground, and color alpha multiplies fill-opacity. Transparent foreground is excluded from geometry queries. RGBA behavior, holes/order/world phase remain preserved. See fill patterns. Transitions/complete line-pattern combinations/3D/globe/texture-alpha picking remain pending.
Shared planar solid lines accept explicit line-cap/line-join/line-miter-limit/line-round-limit: three caps/joins and finite0..16 limits, reported by commonLineTopologySolid. Expression support is commonLineTopologyLayoutExpressions: existing property/global-state/integer-zoom and type/lexical/lazy expressions resolve per feature; layout rejects feature-state and zoom requires top-level step/numeric interpolate (let wrapping accepted). Omitting them preserves legacy fast-line boundaries. Dash/gradient/animation/3D/globe/media combinations reject; query envelopes are conservative rather than pixel-exact. See solid line topology.
Shared fill and line feature draw order (08.55)
commonLayerSortKeys provides shared planar fill-sort-key / line-sort-key. After filtering, actual displayed features draw in stable ascending finite numeric-key order; larger values cover smaller ones, and ties including ±0 retain source order. Within a layer, queryRenderedFeatures follows actual topmost order. IDs, properties, filter indices and MVT deduplication stay intact. Keys support properties/global-state/type/lexical/lazy expressions. Sort-key layout rejects feature-state and interpolate; zoom requires top-level step (outer let allowed), uses floor(zoom), and needs explicit planar Web Mercator. Each expression allows 32 levels/1024 nodes/8192 steps; candidates allow 100000 displayed features/2000000 estimated nodes.
Solid-color and RGBA/SDF fills, ordinary/dashed lines and explicit solid-line topology are supported. Explicit topology with dashes and animation/gradient/3D/globe/media combinations still reject. Failure retains sources, global values, camera, frame and identities. See feature draw order for complete examples, the 24-check portable script and HTML. Device acceptance and formal release remain pending.
Shared solid line-offset: commonLineOffsetSolid, CSS pixels/default0, signed line travel sides and polygon outer/hole insets. Numeric/property/state/global/lexical/lazy/fractional zoom, absolute128 and actual-extrusion2048 budgets. Nonzero dash/gradient/animation/pitch3D/globe/media reject; zero retains legacy paths/limits. Candidate failure preserves source/state/global/camera/identities, with conservative actual-extrusion queries rather than pixel picking. See the line-offset guide and30-check portable script.
Shared planar solid-line translation
line-translate is a uniform two-number CSS-pixel paint vector, defaulting to 0,0. line-translate-anchor accepts map/viewport and defaults to map. Constants, global-state, explicit uniform object get/has, type/lexical/lazy and continuous-zoom expressions are supported; feature properties and feature-state are unsupported. Map anchors rotate with candidate bearing; viewport anchors preserve screen directions. Original components are limited to absolute 128 and final extrusion with width/caps/joins/offset to 2048 CSS pixels. Actual nonzero dash/gradient/animation/pitch3D/globe/media combinations reject; zero retains previous paths. Capability: commonLineTranslateSolid.
Queries clip to the actual viewport before inverse per-layer translation, preserving source/feature IDs, properties and sorting with conservative hit semantics. MVT coverage includes incoming neighbors and unknown feature size bounds even when cached samples exist. The full-map visible tile cap remains 64. Source/global/paint/camera/viewport candidates are checked before commit, retaining previous state and queues on failure.
Shared planar solid-line casing
line-gap-width is a finite nonnegative CSS number, defaulting to0, with property/state/global, type/lexical/lazy and fractional-zoom expressions. Positive gap uses outer width g+2w and side thickness w; zero width leaves no casing. Real transparency reveals lower layers without erasing them. Per-original-feature4x stencil avoids repeated alpha at corners and GeometryCollection crossings, preserving interleaved zero/positive-gap sorting. Capability:commonLineGapSolid.
w<=24, g<=128, one million combined inner/outer worst-case vertices (400 per input point) and2048 CSS-pixel actual offset/translate extrusion; combined two-million node/depth32/nodes1024/steps8192 budgets remain. Render targets include MSAA/stencil and three aligned readback buffers, checked conservatively at64 bytes per physical pixel with512 MiB; only nonzero gaps introduce this constraint. MVT includes unknown dynamic gap/width/offset/join envelopes even without translation;64-tile budget failures retain source/state/camera/queues. Queries remain conservative and may hit transparent gaps. Actual nonzero dash/gradient/animation/pitch3D/globe/media combinations reject.
Shared uniform planar RGBA line patterns
commonLinePatternsUniform: uniform per-layer image/coalesce/global/explicit object/lexical/lazy/integer-zoom selection preserves property/state/continuous-zoom width/opacity and filtering/sorting. The complete image height covers actual width; period=width×imageW/imageH. RGBA colors multiply opacity, transparent pixels reveal lower layers and line-color does not tint. Width0 paints nothing. Only default butt/stable miter≤2 is connected; nonzero offset/translate/gap, SDF/self-crossings/reversals/explicit topology/dash/gradient/animation/pitch3D/globe/media reject. See line patterns for dimensions, combined static/animation budgets, missing images, rollback and conservative queries. Check capability with the matching SDK version.
Shared planar solid-line distance softness
The core has implemented and pushed commonLineBlurSolid: line-blur accepts a finite nonnegative CSS value in 0..16, with default 0 retaining previous paths and budgets. Property/state/global, type, lexical/lazy and continuous-zoom expressions are supported. True outline distance attenuates inward; butt/square transverse ends only clip, square extension sides stay soft, and round ends soften radially. Real coverage union composites color/opacity once per original feature. IDs, filtering/sorting, all three caps/joins and stable offset/translate combinations remain preserved.
Unchanged resident and candidate blur channels share at most 256 drawable records, including zero-blur records in mixed layers. Each positive original-feature group allows 256 true outline edges. ROI physical pixels multiplied by soft edges allow 100 million comparisons; CPU scans/splitting/stability share two million. Actual vertices including ROI quads allow one million, combined extrusion including AA allows 2048 CSS pixels, targets plus geometry/outline/uniform resources share 512 MiB, and full-map MVT retains 64 tiles. Nonadjacent overlaps, self-crossings, unstable geometry and positive gap/line-pattern/dash/gradient/animation/pitch3D/globe/media combinations reject explicitly. Failed candidates retain previous state, display, queues and identities. Five CPU tests, one actual GPU case and the targeted WASM check passed. The same 27 script checks and actual pixels passed native/main/Worker acceptance. Matching development SDK 0.3.0-dev.3da09ace passed member size/SHA, Linux/Android/JNI and 22 recent portable-script checks. Formal release, devices and other combinations remain pending. See distance softness.
Shared per-feature RGBA line patterns
commonLinePatternsPerFeature extends one-layer line-pattern selection through actual filtered/stably sorted property/get/match values, typed image/coalesce, type/lexical/lazy, global and integer-zoom expressions. Source/ID/properties, true width/aspect period and opacity remain preserved. Paint feature-state selection is a SqsMap shared extension, without claiming that the MapLibre specification declares this combination. A/B/A materials draw as A/B/A, without regrouping across another material. Missing or fully transparent images hide only affected records; transparent stripes retain conservative geometry hits. Only attempted missing names emit notices.
Each layer accepts at most 4096 input materials and ordered records; identical W/H/RGBA materials deduplicate. Joint static/animation limits remain 32 layers/4096 paths/100000 actual generated vertices/256MiB and ten-million CSS distance per path. Each unique texture rounds upward to 64KiB pages and adds a 48-byte uniform/256-byte binding reserve; a shared 64-byte sampler, 64 bytes per ordered record and all vertices also count. Candidate 100000 displayed features/two-million estimated nodes and existing expression limits remain. Nonzero offset/translate/gap/blur, explicit topology, SDF/dash/gradient/animation, pitched/globe/media combinations still reject. MVT phase starts at 0 per decoded path; cross-tile merging is not implemented.
Three CPU cases, the same final actual GPU case and targeted WASM checks passed. The same 33-check contract and real blue/green/transparent pixels pass native/main/Worker. Numeric coalesce now skips baked absent-global literal-null inputs, preserving legal lazy fallback; initial logs are retained. Consult SDK acceptance for the matching development version. Mobile GIS/iOS/devices, external platforms, complete styles, formal release/deployment remain pending. See per-feature patterns.
Shared GeoJSON line gradients
commonLineGradients adds planar line-gradient for noncluster GeoJSON LineString/MultiLineString sources with explicit lineMetrics:true. Progress is original Mercator part distance in 0..1; a closed part keeps its 0/1 seam. Clipping/camera/DPR/offset/translate do not renormalize it. Direct progress input to step/interpolate/LAB/HCL, including legal let aliases, supports existing curves and uniform color/type/lexical/lazy/global expressions. Gradient property/state/zoom/spatial reads and other progress arithmetic/conditional jumps reject. Width/opacity retain property/state/global/continuouszoom; all caps/joins and stable offset/translate are connected. line-color and its alpha neither tint nor hide gradients.
Each layer allows 32 step cuts/33 bands and 257 RGBA8 color samples per nonzero interval. sRGB is reconstructed within the band and decoded to linear output; alpha is unchanged. A cut selects its right band without cross-step filtering. Quantization and nonlinear/LAB/HCL reconstruction errors exist; no universal 1/255 bound or MapLibre pixel identity is claimed. Candidate ramps share two-million estimated nodes. Pattern/gradient/animation jointly retain 32 layers/4096 paths/100000 actual vertices/256MiB and ten-million CSS length per path. Accounting includes 24-byte vertices, RGBA32Float color/metadata textures each rounding up to 64KiB, a 48-byte uniform/256-byte binding reserve and 64 bytes per path draw. A path allows 5000 original nodes; same-feature part triangle pairs allow two-million checks per candidate layer.
Same-feature overlapping coverage, self-crossing/reversed/unstable meshes reject; different features retain sorted compositing. Query bounds are conservative true topology; partial transparency can hit, full-transparent ramps or width/opacity0 cannot. Gap/blur, dash/pattern/animation, MVT/media, pitched3D/globe remain unsupported. Failed source/state/global/paint/camera/viewport/DPR/output/resource candidates preserve state/frame/queue/identity. Previous native effects gradient APIs remain separate.
Three CPU cases, the same final actual GPU and targeted WASM checks passed. The same 32-check contract and real smooth/step/original-clipped-position/multipart-progress/single-alpha pixels passed native/main/Worker; the initial WGSL reserved-local-name log is retained. Consult SDK acceptance for the matching development version. Mobile GIS/iOS/devices, external platforms, complete styles and formal release/deployment remain pending. See line progress and gradients.
Shared static circle styles
Capability commonCircleStyles connects circle-blur, circle-translate/anchor, circle-sort-key and circle-pitch-scale/alignment alongside existing fill and independent outer stroke. Blur accepts representable finitef32 values, using relative inward radial smoothstep; negative values add no extra falloff, AA remains, and no convolution is used. Blur retains property/feature-state/global/continuous zoom. Translation/enums use uniform evaluation; components allow±128 CSS pixels. Defaults are blur0, translation0,0/map anchor, map scale and viewport alignment.
Map alignment follows the map plane or local globe tangent; viewport alignment faces the screen. Map scale changes with camera distance; viewport scale keeps screen size. Four combinations share actual projective drawing/clipping/query footprints, near/far clipping, back-facing globe-center rejection and business-layer ordering without depth writes. Queries retain original source/ID and visible outer-stroke bounds; hollow interiors may hit, without per-pixel alpha picking. Finite circle-sort-key values draw in stable ascending order, retaining source order on ties. Layout rejects state/interpolate; top-level step (optionally let-wrapped) uses floor(zoom), including actual pitched Mercator/globe zoom. Older fill/line restrictions remain.
All circle candidates allow100000 records/two million new-parameter node estimates. Visible layers separately allow100000 filtered Point/MultiPoint original instances, including offscreen/transparent/zero-radius entries; drawable glyphs allow100000. Each glyph costs84 CPU plus240 GPU bytes for six vertices; each contiguous layer range adds64 bytes. Complete candidates plus unchanged resident circles share256MiB. Source/state/global/paint/layout/camera/viewport/DPR and tile coverage validate before publication, preserving old state/frame/queue/identities on failure. New-circle CSS sRGB colors always decode into linear for one composition; alpha is unchanged. Native SRGB/browser UNORM RGB storage differs; acceptance retains raw samples and normalizes RGB only, without claiming pixel identity over arbitrary older backgrounds. Complete transitions/terrain draping, mobile GIS/iOS/devices and formal release remain pending.
commonStyleRegistry identifies the supported shared object/URL registry subset; see Shared style registry and resources. URLs use the same registry validation as objects, with glyphs/sprites and known relative resource slots. The existing separate compatibility basemap entry remains available.
Incremental style defaults and state
Diff compares the live registry. Compatible sources retain identity, cache, pending requests and raster fade time; data updates follow existing setData state rules. Structural changes replace sources and invalidate old handles. Glyphs/sprite root changes fall back to full replacement. New global defaults retain explicit runtime overrides; null removes an override and restores the current default. Invalid candidates do not publish partial source, layer or event changes. Flush confirms writes; source resources and final map rendering have separate readiness states. Scripts relying on the earlier full replacement default should explicitly pass {diff:false}.
Shared planar composition capability
When a matching SDK reports commonPlanarLayerComposition:true, the shared Mercator view with zero pitch/roll and no terrain/extrusion combines media, backgrounds, labels, heat and supported static line/fill effects in complete layer order. This capability supersedes earlier media-combination exclusions only within that shared planar scope. Custom line animation, tilted/globe/terrain views and other unsupported material combinations retain their respective limits. Reordering and compatible diff preserve identities, caches, pending requests and fade clocks; material, geometry and texture budgets are validated before publication. See planar layer composition.
Shared line symbols (commonLineSymbols)
A matching development SDK returning commonLineSymbols=true supports symbol-placement=line/line-center for original GeoJSON/MVT line parts in the shared planar Mercator view (zero pitch/roll, no terrain/extrusion). symbol-spacing defaults to 250 CSS pixels; text-max-angle to 45 degrees; text-keep-upright/icon-keep-upright to true/false. map/auto follows road tangents, viewport lays out the whole label horizontally, and viewport-glyph places text centers along the curve while keeping glyph axes oriented to the viewport. Explicit multiline labels reject. Existing PBF, RGBA/SDF, format, image fitting, sorting, collision and optional-group semantics apply; text that cannot fit follows text-optional and cannot leave an icon when that text is required.
Actual glyph quads and original feature/part/source identities drive placement, collision and queries. Generated anchors never modify source data. Invalid resolved symbol paint in a line candidate explicitly rejects and retains the previous frame; existing point fallback semantics remain. Legal glyph fallback keeps its existing contract. An asynchronous candidate exceeding actual template/glyph budgets rejects; legal fallback is not presented as a resource failure. MVT uses original-part arc lengths and half-open target ownership, preserving parent fallback and world copies. Radial extent relative to an anchor is limited to 1024 CSS pixels; unknown tile coverage expands by that bound while retaining 64-tile/32-request limits. Cross-tile geometry stitching, a globally consistent repetition phase along the entire road, complex shaping, tilted/globe/terrain line placement, device/external-platform acceptance and formal release remain pending.
Common paint transitions and planar playback/media
With a matching core exposing commonPaintTransitions, root transition and property-transition objects support the42 implemented uniform numeric/color/vec2 properties. Duration/delay default to300/0ms and each is bounded by3600000. Per-property fields independently override root values; controls affect subsequent retargets. Reads expose target declarations while display/query share actual-time samples. Interrupted priors keep their original clocks; compatible/no-op diffs retain identities and applicable timelines. Data/feature-state targets remain immediate. Image/dash/pattern crossfade, layout/enums/nonzeroLight and unsupported properties do not gain transitions. The current/candidate history budget, failure declaration/display distinction and full property table are documented inCommon paint transitions.
Only zero-pitch/roll Mercator views allow the newly accepted simple playback-line/media composition, with real layer order and original scene owner/playback clock. Paint writes, including controls, to a playing or paused layer retaining its visual returnCONFLICT until playback is stopped; starting playback on a layer with an active paint curve also conflicts. Other layers may transition. Existing topology/offset/gap/blur/pattern/gradient/globe/terrain animation restrictions remain. Older references to pending complete transitions do not exclude this conditional uniform-property batch; image crossfade and full style support remain pending. External platforms, devices, mobileGIS/iOS and formal publication still require acceptance.