Foundation-free Swift implementation of W3C SVG 2 specification.
swift-w3c-svg provides a literal encoding of the W3C SVG 2 specification in Swift, following the specification's chapter structure with zero external dependencies.
This package implements the W3C SVG 2 specification with namespaced types that directly map to SVG 2 chapters:
- Types (Chapter 4): Basic data types - Length, Color, Transform, ViewBox âś“
- Document (Chapter 5): SVG, Group, Defs, Symbol, Use âś“
- Styling (Chapter 6): CSS and presentation (infrastructure ready)
- Geometry (Chapter 7): Positioning and sizing properties (infrastructure ready)
- Coordinates (Chapter 8): Coordinate systems and transforms (infrastructure ready)
- Paths (Chapter 9): Path elements and data (infrastructure ready)
- Shapes (Chapter 10): Circle, Rectangle, Ellipse, Line, Polyline, Polygon âś“
- Text (Chapter 11): Text content elements (infrastructure ready)
- Embedded (Chapter 12): Embedded content (infrastructure ready)
- Painting (Chapter 13): Fill, stroke, markers (infrastructure ready)
- PaintServers (Chapter 14): LinearGradient, RadialGradient, Stop, Pattern âś“
- Scripting (Chapter 15): Interactivity and events (infrastructure ready)
- Linking (Chapter 16): Hyperlinks and views (infrastructure ready)
Add to your Package.swift:
dependencies: [
.package(url: "https://github.com/swift-standards/swift-w3c-svg", from: "0.1.0")
]import W3C_SVG
// Create shapes using W3C_SVG2 namespace
let circle = W3C_SVG2.Shapes.Circle(cx: 50, cy: 50, r: 40)
let rect = W3C_SVG2.Shapes.Rectangle(x: 10, y: 10, width: 100, height: 80)
let ellipse = W3C_SVG2.Shapes.Ellipse(cx: 100, cy: 50, rx: 80, ry: 40)
let line = W3C_SVG2.Shapes.Line(x1: 0, y1: 0, x2: 100, y2: 100)
// Rounded rectangle
let rounded = W3C_SVG2.Shapes.Rectangle(x: 10, y: 10, width: 100, height: 80, rx: 5, ry: 5)// Length values with units
let pixels = W3C_SVG2.Types.Length.px(100) // "100px"
let percent = W3C_SVG2.Types.Length.percentage(50) // "50%"
let ems = W3C_SVG2.Types.Length.em(2.5) // "2.5em"
// Color values
let red = W3C_SVG2.Types.Color.named("red")
let hex = W3C_SVG2.Types.Color.hex("FF0000")
let rgb = W3C_SVG2.Types.Color.rgb(r: 255, g: 0, b: 0)
let rgba = W3C_SVG2.Types.Color.rgba(r: 255, g: 0, b: 0, a: 0.5)
// Transform functions
let translate = W3C_SVG2.Types.Transform.translate(x: 10, y: 20)
let rotate = W3C_SVG2.Types.Transform.rotate(angle: 45)
let scale = W3C_SVG2.Types.Transform.scale(x: 2, y: 3)
// ViewBox
let viewBox = W3C_SVG2.Types.ViewBox(width: 100, height: 200)Following the Swift Standards Package Organization Process:
- Empty enums for namespaces -
W3C_SVG2cannot be instantiated - Literal spec encoding - File organization matches SVG 2 chapter structure
- Zero external dependencies - Foundation-free implementation
- Sendable & Equatable - Swift 6 concurrency support
- Comprehensive documentation - W3C SVG 2 section references throughout
- macOS 15+
- iOS 18+
- tvOS 18+
- watchOS 11+
- Swift 6.2+
- W3C SVG 2 Specification
- Direct mapping from specification chapters to Swift namespaces
- Each type includes W3C section reference in documentation
Apache License 2.0
// Create a path let path = Path(d: "M10 10 L90 90")
### Value Types
```swift
// SVGLength with units
let pixels = SVGLength.px(100)
let percentage = SVGLength.percentage(50)
let em = SVGLength.em(2.5)
print(pixels.stringValue) // "100px"
print(percentage.stringValue) // "50%"
// SVGColor
let hex = SVGColor.hex("#FF5733")
let rgb = SVGColor.rgb(r: 255, g: 87, b: 51)
let named = SVGColor.named("red")
print(hex.stringValue) // "#FF5733"
print(rgb.stringValue) // "rgb(255,87,51)"
// SVGViewBox
let viewBox = SVGViewBox(width: 100, height: 200)
print(viewBox.stringValue) // "0 0 100 200"
// Create transforms
let translate = SVGTransform.translate(x: 10, y: 20)
let rotate = SVGTransform.rotate(angle: 45)
let scale = SVGTransform.scale(x: 2.0, y: 2.0)
print(translate.stringValue) // "translate(10 20)"
print(rotate.stringValue) // "rotate(45)"
// Use in group
let group = G(transform: translate)
// Or multiple transforms
let multiGroup = G(transform: [translate, rotate, scale])// Linear gradient
let gradient = LinearGradient(
id: "myGradient",
x1: "0%",
y1: "0%",
x2: "100%",
y2: "100%"
)
// Radial gradient
let radial = RadialGradient(
id: "radialGrad",
cx: "50%",
cy: "50%",
r: "50%"
)
// Gradient stop
let stop = Stop(
offset: "50%"
)// Ellipse
let ellipse = Ellipse(cx: 100, cy: 50, rx: 80, ry: 40)
// Line
let line = Line(x1: 0, y1: 0, x2: 100, y2: 100)
// Polygon
let triangle = Polygon(
points: "50,0 100,100 0,100"
)
// Polyline
let polyline = Polyline(
points: "0,0 50,50 100,0"
)// Text
let text = Text(
x: 10,
y: 20,
content: "Hello SVG"
)
// Text span
let tspan = TSpan(
x: 10,
y: 30,
dx: 5,
dy: 10
)// Definitions container
let defs = Defs()
// Symbol for reusable graphics
let symbol = Symbol(
id: "mySymbol",
viewBox: "0 0 100 100"
)
// Use element to reference symbols
let use = Use(
href: "#mySymbol",
x: 50,
y: 50
)
// Clip path
let clipPath = ClipPath(
id: "myClip"
)
// Mask
let mask = Mask(
id: "myMask",
x: 0,
y: 0,
width: 100,
height: 100
)// Fill rules
let fillRule: SVGFillRule = .evenodd // or .nonzero
// Line caps
let lineCap: SVGLineCap = .round // .butt, .square
// Line joins
let lineJoin: SVGLineJoin = .miter // .round, .bevel
// Text anchors
let anchor: SVGTextAnchor = .middle // .start, .end
// Display
let display: SVGDisplay = .none // .inline, .blockAll SVG elements conform to SVGElementType:
public protocol SVGElementType {
static var tagName: String { get }
static var isSelfClosing: Bool { get }
}The package includes type-safe value types:
SVGPoint: 2D point (x, y)SVGSize: Size (width, height)SVGRect: Rectangle (x, y, width, height)SVGViewBox: ViewBox (minX, minY, width, height)SVGColor: Color values (named, hex, rgb, rgba)SVGLength: Lengths with units (px, %, em, ex, etc.)SVGTransform: Transformations (translate, rotate, scale, skew, matrix)
All types are:
Sendablefor Swift 6.0 concurrencyEquatablefor value comparisons- Immutable with
letproperties
- swift-svg: A Swift package for type-safe SVG generation.
- swift-svg-printer: A Swift package for rendering SVG to String or bytes.
- Swift 6.0+
- macOS 14+ / iOS 17+ / Linux
This package is licensed under the Apache 2.0 License. See LICENSE for details.
Contributions are welcome! Please feel free to submit a Pull Request.
For issues, questions, or contributions, please visit the GitHub repository.