Skip to content

seanghay/sone

Repository files navigation

Sone A declarative Canvas layout engine for JavaScript with advanced rich text support.

Tests install size

  • Declarative API
  • Flex Layout
  • Squircle
  • Text Justification
  • Table
  • Rich Text Rendering
  • Composable
  • Output as SVG, PDF, Image

Overview

  • This project uses skia-canvas if you encounter an installation issue, please follow the skia-canvas instruction
  • Node.js 16+ or equivalent
npm install sone
import { Column, Span, sone, Text } from "sone";

function Document() {
  return Column(
    Text("Hello, ", Span("World").color("blue").weight("bold"))
      .size(44)
      .color("black"),
  )
    .padding(24)
    .bg("white");
}

// save as buffer
const buffer = await sone(Document()).jpg();

// save to file
import fs from "node:fs/promises";

await fs.writeFile("image.jpg", buffer);

More examples can be found at test/visual directory

Font Registration

import { Font } from 'sone';

if (!Font.has("NotoSansKhmer")) {
  await Font.load('NotoSansKhmer', "test/font/NotoSansKhmer.ttf");
}

Next.js

To make it work with Next.js, update your config file:

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  serverExternalPackages: ["skia-canvas"],
  webpack: (config, options) => {
    if (options.isServer) {
      config.externals = [
        ...config.externals,
        { "skia-canvas": "commonjs skia-canvas" },
      ];
    }
    return config;
  },
};

export default nextConfig;

Acknowledgements

License

Apache-2.0

Seanghay's Optimized Nesting Engine

About

A declarative Canvas layout engine for JavaScript with advanced rich text support.

Topics

Resources

License

Stars

Watchers

Forks