# QGIS to MapLibre property compatibility map (QGIS2VectorTiles v3.9).
#
# Rendered by assets/guide.js on compatibility.html. Each property:
#   qgis_prop      the QGIS setting, as named in the QGIS interface
#   maplibre_prop  the MapLibre style property it becomes ("N/A" if none)
#   supported      "Yes" (as in QGIS), "Partial" (with limits) or "No"
#   data_driven    "Yes" if per-feature values (field or expression) reach
#                  the web map
#   notes          what to know; the search also looks here, so name the
#                  property's usual synonyms
#
# How conversion works, in short: rule filters, geometry generators, label
# text and data-defined values are computed by QGIS during the export (any
# QGIS expression works) and written into the tiles; the web style then
# reads them. A property is data-driven on the web only if the style reads
# it per feature.

categories:
  - name: "Project and layers"
    properties:
      - qgis_prop: "Visible vector layers"
        maplibre_prop: "source-layer"
        supported: "Yes"
        data_driven: "No"
        notes: "Every visible vector layer, from any provider (files, PostGIS, SpatiaLite, WFS, temporary layers). Raster, mesh, point cloud and vector tile layers are skipped."
      - qgis_prop: "Layer order"
        maplibre_prop: "layers (order)"
        supported: "Yes"
        data_driven: "No"
        notes: "The style draws layers in the Layers panel order, top layer on top."
      - qgis_prop: "Layer CRS / project CRS"
        maplibre_prop: "N/A"
        supported: "Yes"
        data_driven: "No"
        notes: "Any CRS. Data is reprojected to Web Mercator (EPSG:3857), the web map's projection. Sizes in map units follow the project CRS."
      - qgis_prop: "Project background color"
        maplibre_prop: "background-color"
        supported: "Yes"
        data_driven: "No"
        notes: "Becomes the style's background layer. The viewers' basemap switcher can show a basemap above it."
      - qgis_prop: "Layer scale-dependent visibility"
        maplibre_prop: "minzoom / maxzoom"
        supported: "Yes"
        data_driven: "No"
        notes: "Minimum and maximum scales become zoom ranges. Each layer is written only to the tiles of its own zoom range."
      - qgis_prop: "Layer opacity"
        maplibre_prop: "fill-opacity / line-opacity / icon (sprite)"
        supported: "Yes"
        data_driven: "No"
        notes: "Multiplied into the opacity of each of the layer's symbols."
      - qgis_prop: "Layer blending mode"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "MapLibre has no blending modes (multiply, overlay, darken...): layers draw with normal blending."
      - qgis_prop: "Feature blending mode"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not available in MapLibre; features draw with normal blending."
      - qgis_prop: "Draw effects (drop shadow, inner / outer glow, blur, colorize)"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Paint effects on layers, fills, lines and labels are not converted."
      - qgis_prop: "Symbol levels"
        maplibre_prop: "layers (order)"
        supported: "Yes"
        data_driven: "No"
        notes: "Rendering passes keep their order, e.g. all road casings under all road fills."
      - qgis_prop: "Temporal properties / time controller"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "All features are exported regardless of time settings."
      - qgis_prop: "Feature attributes (Included Fields)"
        maplibre_prop: "feature properties"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Included Fields keeps none, all or only the visible fields. They show in the viewers' popups and search."

  - name: "Renderers (symbology types)"
    properties:
      - qgis_prop: "Single symbol"
        maplibre_prop: "layer per symbol layer"
        supported: "Yes"
        data_driven: "No"
        notes: "Each symbol layer becomes one or more MapLibre layers."
      - qgis_prop: "Categorized"
        maplibre_prop: "match on q2vt_rule"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Every checked category. Categories differing only in colors or sizes share one MapLibre layer."
      - qgis_prop: "Graduated"
        maplibre_prop: "match on q2vt_rule"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Every active class (range) is exported, like categories. Classes are fixed at export: a class's limits are not recomputed on the web."
      - qgis_prop: "Rule-based"
        maplibre_prop: "filter / minzoom / maxzoom"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Nested rules, ELSE rules, rule filters (any QGIS expression, evaluated during the export) and rule scale ranges are all supported."
      - qgis_prop: "Point displacement"
        maplibre_prop: "N/A"
        supported: "Partial"
        data_driven: "No"
        notes: "The renderer inside it is exported; the displacement of overlapping points is not."
      - qgis_prop: "Point cluster"
        maplibre_prop: "N/A"
        supported: "Partial"
        data_driven: "No"
        notes: "The renderer inside it is exported for every point; points are not clustered."
      - qgis_prop: "Inverted polygons"
        maplibre_prop: "N/A"
        supported: "Partial"
        data_driven: "No"
        notes: "The renderer inside it is exported, but polygons are drawn normally, not inverted."
      - qgis_prop: "Merged features"
        maplibre_prop: "N/A"
        supported: "Partial"
        data_driven: "No"
        notes: "The renderer inside it is exported; touching features are not dissolved into one."
      - qgis_prop: "Heatmap"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not converted; the layer's symbology is skipped (its labels are still exported)."
      - qgis_prop: "2.5D"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not converted; the layer's symbology is skipped."
      - qgis_prop: "No symbols"
        maplibre_prop: "N/A"
        supported: "Yes"
        data_driven: "No"
        notes: "Nothing is drawn, as in QGIS; the layer's labels are still exported."

  - name: "Fill symbol layers (polygons)"
    properties:
      - qgis_prop: "Simple fill: fill color"
        maplibre_prop: "fill-color"
        supported: "Yes"
        data_driven: "Yes"
        notes: "RGBA colors, including transparency. A data-defined color (field or expression) is computed per feature."
      - qgis_prop: "Simple fill: fill style (brush)"
        maplibre_prop: "fill-color"
        supported: "Partial"
        data_driven: "No"
        notes: "Solid and No brush are exact. Hatch styles become a solid fill; use a Line pattern fill for hatching."
      - qgis_prop: "Simple fill: stroke color"
        maplibre_prop: "line-color"
        supported: "Yes"
        data_driven: "Yes"
        notes: "The outline is exported as its own line layer (polygon boundary), so it gets every line property: color, width, style, join."
      - qgis_prop: "Simple fill: stroke width"
        maplibre_prop: "line-width"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Exported as a real line layer, so any outline width works (MapLibre's own fill outline is always 1 px)."
      - qgis_prop: "Simple fill: stroke style"
        maplibre_prop: "line-dasharray"
        supported: "Yes"
        data_driven: "No"
        notes: "Solid, dash, dot, dash dot and dash dot dot outlines. No pen removes the outline."
      - qgis_prop: "Simple fill: join style"
        maplibre_prop: "line-join"
        supported: "Yes"
        data_driven: "No"
        notes: "Bevel, miter and round."
      - qgis_prop: "Simple fill: offset"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Fill offsets (x, y) are ignored."
      - qgis_prop: "Symbol opacity"
        maplibre_prop: "fill-opacity"
        supported: "Yes"
        data_driven: "Yes"
        notes: "The symbol's opacity slider, separate from the color's own transparency. A data-defined opacity (0-100) is converted to MapLibre's 0-1."
      - qgis_prop: "Point pattern fill"
        maplibre_prop: "fill-pattern"
        supported: "Yes"
        data_driven: "No"
        notes: "Drawn by QGIS as a seamless pattern image (distance, displacement, marker) in the sprite."
      - qgis_prop: "Line pattern fill (hatching)"
        maplibre_prop: "fill-pattern"
        supported: "Yes"
        data_driven: "No"
        notes: "Drawn as a seamless pattern image, at its angle and distance."
      - qgis_prop: "SVG fill"
        maplibre_prop: "fill-pattern"
        supported: "Yes"
        data_driven: "No"
        notes: "The SVG is drawn as a repeating pattern image at its width."
      - qgis_prop: "Raster image fill"
        maplibre_prop: "fill-pattern"
        supported: "Yes"
        data_driven: "No"
        notes: "The image repeats at its width. Feature-relative placement is not kept: the pattern is aligned to the map."
      - qgis_prop: "Random marker fill"
        maplibre_prop: "fill-pattern"
        supported: "Partial"
        data_driven: "No"
        notes: "Drawn as a repeating tile of scattered markers: the same layout repeats instead of a new random layout per feature."
      - qgis_prop: "Gradient fill"
        maplibre_prop: "fill-color"
        supported: "Partial"
        data_driven: "No"
        notes: "MapLibre fills can't vary inside a feature: drawn in the gradient's mean color (two colors or color ramp)."
      - qgis_prop: "Shapeburst fill"
        maplibre_prop: "fill-color"
        supported: "Partial"
        data_driven: "No"
        notes: "Drawn in the mean of its colors, without the burst from the edges."
      - qgis_prop: "Centroid fill"
        maplibre_prop: "icon-image"
        supported: "Yes"
        data_driven: "No"
        notes: "At the visible polygon's centroid or a point on surface. Force inside, every part and clipping are supported."
      - qgis_prop: "Outline: simple line / marker line / hashed line / other line layers"
        maplibre_prop: "line-* / icon-*"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Line symbol layers in a fill symbol are exported on the polygon boundary, with the same support as in line symbols (see Line symbol layers)."

  - name: "Line symbol layers"
    properties:
      - qgis_prop: "Simple line: stroke color"
        maplibre_prop: "line-color"
        supported: "Yes"
        data_driven: "Yes"
        notes: "RGBA colors and data-defined colors."
      - qgis_prop: "Simple line: stroke width"
        maplibre_prop: "line-width"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Millimeters, points, pixels and inches convert to pixels; map units and meters scale with the zoom. A data-defined width keeps its QGIS unit."
      - qgis_prop: "Simple line: stroke style (dash, dot...)"
        maplibre_prop: "line-dasharray"
        supported: "Yes"
        data_driven: "No"
        notes: "Dash, dot, dash dot and dash dot dot presets."
      - qgis_prop: "Simple line: custom dash pattern"
        maplibre_prop: "line-dasharray"
        supported: "Yes"
        data_driven: "No"
        notes: "Dash and gap lengths in mm, points, pixels or map units. Dash offset, aligning and corner tweaks are not supported."
      - qgis_prop: "Simple line: cap style"
        maplibre_prop: "line-cap"
        supported: "Yes"
        data_driven: "No"
        notes: "Flat (butt), square and round."
      - qgis_prop: "Simple line: join style"
        maplibre_prop: "line-join"
        supported: "Yes"
        data_driven: "No"
        notes: "Bevel, miter and round."
      - qgis_prop: "Simple line: offset"
        maplibre_prop: "line-offset"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Positive offsets go right of the line direction, as in QGIS; map-unit offsets scale with the zoom."
      - qgis_prop: "Simple line: trim lines / draw line only inside polygon"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Trimming the start or end of lines and drawing outlines only inside polygons are not supported."
      - qgis_prop: "Symbol opacity"
        maplibre_prop: "line-opacity"
        supported: "Yes"
        data_driven: "Yes"
        notes: "The symbol's opacity slider; a data-defined opacity (0-100) is converted to 0-1."
      - qgis_prop: "Marker line: interval placement"
        maplibre_prop: "symbol-placement: line, symbol-spacing"
        supported: "Yes"
        data_driven: "No"
        notes: "Markers repeat along the line at the interval; Rotate marker to follow line direction is supported."
      - qgis_prop: "Marker line: on first vertex / last vertex / central point"
        maplibre_prop: "icon-image, icon-rotate"
        supported: "Yes"
        data_driven: "No"
        notes: "The markers are drawn exactly at those points and turned with the line, e.g. arrowheads at line ends."
      - qgis_prop: "Marker line: on every vertex / inner vertices"
        maplibre_prop: "icon-image"
        supported: "Partial"
        data_driven: "No"
        notes: "Markers are drawn exactly on the vertices, but not turned with the line."
      - qgis_prop: "Marker line: on every segment center / curve points"
        maplibre_prop: "symbol-placement: line-center"
        supported: "Partial"
        data_driven: "No"
        notes: "Approximated by one marker in the middle of each line."
      - qgis_prop: "Marker line: offset / offset along line"
        maplibre_prop: "icon-offset"
        supported: "Partial"
        data_driven: "No"
        notes: "The offset from the line is kept; the offset along the line is not."
      - qgis_prop: "Hashed line"
        maplibre_prop: "icon-image (hash), symbol-spacing"
        supported: "Yes"
        data_driven: "No"
        notes: "Each hash is drawn by QGIS and repeated at the interval. Other placements become one hash in the middle."
      - qgis_prop: "Raster line"
        maplibre_prop: "line-pattern"
        supported: "Yes"
        data_driven: "No"
        notes: "The image repeats along the line at the line's width."
      - qgis_prop: "Lineburst"
        maplibre_prop: "line-color"
        supported: "Partial"
        data_driven: "No"
        notes: "Drawn as a plain line in the mean of its two colors (line gradients need GeoJSON sources in MapLibre)."
      - qgis_prop: "Arrow"
        maplibre_prop: "line-color, line-width"
        supported: "Partial"
        data_driven: "No"
        notes: "Drawn as a plain line of the arrow's fill color and width, without the arrow head."
      - qgis_prop: "Interpolated line / filled line"
        maplibre_prop: "line-color, line-width"
        supported: "Partial"
        data_driven: "No"
        notes: "Drawn as a plain line of the layer's color and width; widths or colors interpolated along the line are not kept."
      - qgis_prop: "Linear referencing"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "The measure labels along the line are not drawn."

  - name: "Marker symbol layers (points)"
    properties:
      - qgis_prop: "Simple marker / SVG marker / font marker / raster image marker / ellipse / filled marker"
        maplibre_prop: "icon-image"
        supported: "Yes"
        data_driven: "No"
        notes: "Every marker is drawn by QGIS into the icon sprite, so it looks exactly as in QGIS, sharp on every screen."
      - qgis_prop: "Marker size"
        maplibre_prop: "icon-size"
        supported: "Yes"
        data_driven: "Yes"
        notes: "A data-defined size scales the icon per feature, relative to the marker's own size."
      - qgis_prop: "Marker size in map units / meters"
        maplibre_prop: "icon-size (zoom curve)"
        supported: "Yes"
        data_driven: "No"
        notes: "The icon grows with the zoom to keep its size on the ground, as in QGIS."
      - qgis_prop: "Marker rotation (angle)"
        maplibre_prop: "icon-rotate"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Static and data-defined rotation. Icons rotate with the map."
      - qgis_prop: "Marker offset / anchor point"
        maplibre_prop: "icon-image"
        supported: "Yes"
        data_driven: "No"
        notes: "Drawn into the icon around its point, so an offset or anchored marker keeps its place."
      - qgis_prop: "Marker color, stroke, shape (data-defined)"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Icons are drawn once, so per-feature marker colors and shapes don't apply. Use categories or rules instead."
      - qgis_prop: "Symbol opacity"
        maplibre_prop: "icon-image"
        supported: "Yes"
        data_driven: "No"
        notes: "Drawn into the icon, multiplied by the layer opacity."
      - qgis_prop: "Overlapping markers"
        maplibre_prop: "icon-allow-overlap"
        supported: "Yes"
        data_driven: "No"
        notes: "Markers always draw, even when they overlap, as in QGIS."

  - name: "Geometry generators and rules"
    properties:
      - qgis_prop: "Geometry generator (symbol layer)"
        maplibre_prop: "source-layer"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Any expression, computed by QGIS during the export; the resulting geometries go into the tiles."
      - qgis_prop: "Geometry generator (labels)"
        maplibre_prop: "source-layer"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Label geometry generators are computed during the export, like symbol ones."
      - qgis_prop: "Rule filter expressions"
        maplibre_prop: "N/A (applied in the export)"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Any QGIS expression, evaluated by QGIS during the export: only matching features reach each rule's data."
      - qgis_prop: "Expressions using @map_scale"
        maplibre_prop: "minzoom / maxzoom"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Evaluated at each zoom level's scale, in filters, labels, data-defined properties and generators."
      - qgis_prop: "Other map variables (@zoom_level, @map_extent, @map_rotation...)"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Only @map_scale is resolved per zoom; other map variables have no map to read during the export."

  - name: "Data-defined properties"
    properties:
      - qgis_prop: "Data-defined override (field or expression)"
        maplibre_prop: "[\"get\", \"q2vt_property_...\"]"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Computed by QGIS per feature (any expression) and stored in the tiles. Applies to properties marked data-driven."
      - qgis_prop: "Data-defined colors"
        maplibre_prop: "fill-color / line-color / text-color / text-halo-color"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Exported with their transparency (alpha)."
      - qgis_prop: "Data-defined widths, sizes and offsets"
        maplibre_prop: "line-width / line-offset / text-size / text-halo-width / icon-size"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Converted from their QGIS unit (millimeters, points, map units...) to pixels, as the static value is."
      - qgis_prop: "Data-defined opacity"
        maplibre_prop: "fill-opacity / line-opacity / text-opacity"
        supported: "Yes"
        data_driven: "Yes"
        notes: "QGIS's 0-100 is converted to MapLibre's 0-1."
      - qgis_prop: "Data-defined properties not listed as data-driven"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "E.g. data-defined label position (X/Y), show label, font family, dash pattern or marker shape: the static value is used."

  - name: "Label text and font"
    properties:
      - qgis_prop: "Value (field or expression)"
        maplibre_prop: "text-field"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Any field or expression; the label text is computed by QGIS during the export. Line breaks in the text are kept."
      - qgis_prop: "Font family and style"
        maplibre_prop: "text-font"
        supported: "Yes"
        data_driven: "No"
        notes: "Glyphs are made from your installed fonts, only for the characters used. Missing characters come from another font, as in QGIS."
      - qgis_prop: "Bold / italic"
        maplibre_prop: "text-font"
        supported: "Partial"
        data_driven: "No"
        notes: "Exact when the font has a matching style (e.g. Arial Bold). Synthetic bold or italic of a font without that style is not reproduced."
      - qgis_prop: "Underline / strikethrough / kerning"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not available for MapLibre labels."
      - qgis_prop: "Size"
        maplibre_prop: "text-size"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Points, millimeters, pixels and inches; map units scale with the zoom. A data-defined size keeps its QGIS unit."
      - qgis_prop: "Color"
        maplibre_prop: "text-color"
        supported: "Yes"
        data_driven: "Yes"
        notes: "RGBA colors and data-defined colors."
      - qgis_prop: "Opacity"
        maplibre_prop: "text-opacity"
        supported: "Yes"
        data_driven: "Yes"
        notes: "The text format's opacity; data-defined opacity (0-100) is converted."
      - qgis_prop: "Letter spacing"
        maplibre_prop: "text-letter-spacing"
        supported: "Yes"
        data_driven: "No"
        notes: "Absolute spacing (in the text size's unit) and percentage spacing."
      - qgis_prop: "Word spacing"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "MapLibre has no word spacing."
      - qgis_prop: "Type case (capitalization)"
        maplibre_prop: "text-transform"
        supported: "Partial"
        data_driven: "No"
        notes: "All uppercase and all lowercase. Title case, first letter capital and small caps are not supported."
      - qgis_prop: "Line height"
        maplibre_prop: "text-line-height"
        supported: "Partial"
        data_driven: "No"
        notes: "Percentage line height is exact; an absolute line height falls back to the font's normal spacing."
      - qgis_prop: "Multiline alignment"
        maplibre_prop: "text-justify"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Left, center, right; Follow label placement is centered."
      - qgis_prop: "Wrap lines to (characters)"
        maplibre_prop: "text-max-width"
        supported: "Partial"
        data_driven: "No"
        notes: "Approximated: MapLibre wraps by width (about half an em per character), not by character count."
      - qgis_prop: "Wrap on character"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not supported; use a line break in the label expression instead."
      - qgis_prop: "Right-to-left text (Hebrew, Arabic)"
        maplibre_prop: "text-field"
        supported: "Yes"
        data_driven: "No"
        notes: "Shown in reading order, Arabic with joined letters (MapLibre's RTL text plugin; OpenLayers uses the browser)."
      - qgis_prop: "Text orientation (vertical) / HTML formatting"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Vertical text and HTML-formatted labels are not supported."

  - name: "Label buffer, background, shadow and callouts"
    properties:
      - qgis_prop: "Buffer size"
        maplibre_prop: "text-halo-width"
        supported: "Partial"
        data_driven: "Yes"
        notes: "Exact up to a fifth of the text size, the widest halo MapLibre draws cleanly; wider buffers are capped."
      - qgis_prop: "Buffer color"
        maplibre_prop: "text-halo-color"
        supported: "Yes"
        data_driven: "Yes"
        notes: "RGBA colors and data-defined colors."
      - qgis_prop: "Buffer opacity / pen join / blend mode / fill buffer interior"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Only the buffer color (with its transparency) is used."
      - qgis_prop: "Background: marker symbol"
        maplibre_prop: "icon-image, icon-text-fit"
        supported: "Partial"
        data_driven: "No"
        notes: "The marker is drawn as an icon behind the label, stretched around the text when the size type is Buffer; its offset and rotation are kept."
      - qgis_prop: "Background: rectangle / square / ellipse / circle / SVG"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "These label background shapes are not drawn."
      - qgis_prop: "Shadow"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Label drop shadows are not drawn."
      - qgis_prop: "Callouts"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Leader lines from labels to features are not drawn."

  - name: "Label placement"
    properties:
      - qgis_prop: "Points: Around point"
        maplibre_prop: "text-variable-anchor, text-radial-offset"
        supported: "Yes"
        data_driven: "No"
        notes: "The label tries positions around the point, above right first, at the label distance. OpenLayers uses the first position only."
      - qgis_prop: "Points: Cartographic (ordered positions)"
        maplibre_prop: "text-variable-anchor"
        supported: "Yes"
        data_driven: "No"
        notes: "Positions are tried in the QGIS position priority order. OpenLayers uses the first position only."
      - qgis_prop: "Points: Offset from point (quadrant, offset X/Y)"
        maplibre_prop: "text-anchor, text-offset"
        supported: "Yes"
        data_driven: "No"
        notes: "The quadrant and the X/Y offset are kept."
      - qgis_prop: "Label distance"
        maplibre_prop: "text-radial-offset / text-offset"
        supported: "Yes"
        data_driven: "No"
        notes: "Distance from points (around point) and from lines (above / below)."
      - qgis_prop: "Lines: Parallel / Curved"
        maplibre_prop: "symbol-placement: line"
        supported: "Yes"
        data_driven: "No"
        notes: "Labels follow the line; the maximum angle between curved characters is kept."
      - qgis_prop: "Lines: Above line / Below line / On line"
        maplibre_prop: "text-offset"
        supported: "Yes"
        data_driven: "No"
        notes: "Labels sit above, below or on the line, at the label distance."
      - qgis_prop: "Lines: Line orientation dependent position"
        maplibre_prop: "N/A"
        supported: "Partial"
        data_driven: "No"
        notes: "Labels are kept upright: above stays above the line on screen."
      - qgis_prop: "Lines: Horizontal"
        maplibre_prop: "symbol-placement: point"
        supported: "Partial"
        data_driven: "No"
        notes: "Placed as a horizontal point label on the line."
      - qgis_prop: "Repeat distance"
        maplibre_prop: "symbol-spacing"
        supported: "Yes"
        data_driven: "No"
        notes: "Line labels repeat at the distance (in screen units)."
      - qgis_prop: "Polygons: Offset from centroid / Around centroid"
        maplibre_prop: "text-anchor / text-variable-anchor"
        supported: "Yes"
        data_driven: "No"
        notes: "The centroid of the whole or of the visible polygon (Centroid of, data-definable), with Force point inside polygon."
      - qgis_prop: "Polygons: Horizontal / Free (angled)"
        maplibre_prop: "symbol-placement: point"
        supported: "Partial"
        data_driven: "No"
        notes: "The label is placed horizontally at the polygon's interior point (pole of inaccessibility). Free placement is not angled."
      - qgis_prop: "Polygons: Using perimeter / Using perimeter (curved)"
        maplibre_prop: "symbol-placement: line"
        supported: "Yes"
        data_driven: "No"
        notes: "Labels follow the polygon outline, with the line placement options (above / below / on line)."
      - qgis_prop: "Polygons: Outside polygons"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not supported."
      - qgis_prop: "Label every part of multi-part features"
        maplibre_prop: "N/A (applied in the export)"
        supported: "Yes"
        data_driven: "No"
        notes: "Off: only the largest part is labeled, as in QGIS. On: every part."
      - qgis_prop: "Rotation"
        maplibre_prop: "text-rotate"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Static and data-defined label rotation."
      - qgis_prop: "Merge connected lines / minimum feature size / limit number of labels"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not supported."

  - name: "Label rendering and priority"
    properties:
      - qgis_prop: "Label scale-dependent visibility"
        maplibre_prop: "minzoom / maxzoom"
        supported: "Yes"
        data_driven: "No"
        notes: "Also rule scale ranges in rule-based labeling."
      - qgis_prop: "Rule-based labeling"
        maplibre_prop: "filter / minzoom / maxzoom"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Nested label rules and filters. Labels show only where their features' symbols are drawn, as in QGIS."
      - qgis_prop: "Priority"
        maplibre_prop: "symbol-sort-key"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Higher-priority labels are placed first when labels collide; data-defined priority works per feature."
      - qgis_prop: "Allow overlaps without penalty (show all labels)"
        maplibre_prop: "text-allow-overlap"
        supported: "Yes"
        data_driven: "No"
        notes: "Labels draw even where they overlap others. Allow overlaps if required is treated as no overlap."
      - qgis_prop: "Obstacles (features act as obstacles for labels)"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "MapLibre avoids collisions between labels and icons, but lines and polygons don't push labels away."
      - qgis_prop: "Remove duplicate labels"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not converted; the web viewers rely on their own label collision, which hides labels that would overlap."
      - qgis_prop: "Data-defined show / hide label"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Not applied; use a rule filter to hide labels instead."

  - name: "Units"
    properties:
      - qgis_prop: "Millimeters / points / pixels / inches"
        maplibre_prop: "pixels"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Converted to screen pixels (96 DPI)."
      - qgis_prop: "Map units / meters at scale"
        maplibre_prop: "zoom curve (interpolate)"
        supported: "Yes"
        data_driven: "Yes"
        notes: "Sizes in map units or meters keep their ground size at every zoom level."
      - qgis_prop: "Map unit scale (minimum / maximum size limits)"
        maplibre_prop: "N/A"
        supported: "No"
        data_driven: "No"
        notes: "Size limits on map-unit sizes are ignored."
      - qgis_prop: "Percentage"
        maplibre_prop: "text-line-height"
        supported: "Partial"
        data_driven: "No"
        notes: "Supported for label line height only."
