From 6ff0c2f652ea79da1957aa4dfda76459fa0428b3 Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Sat, 14 Jun 2025 23:48:34 +0300 Subject: [PATCH 1/8] feat: enhance ImageLayer and MorphLayer to support corner-specific radius --- package.json | 2 +- src/structures/components/ImageLayer.ts | 33 +++++++++++++++---------- src/structures/components/MorphLayer.ts | 32 +++++++++++++++--------- src/types/types.d.ts | 4 ++- src/utils/utils.ts | 5 +++- test/test.ts | 19 +++++++++++--- 6 files changed, 64 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index d9ab2f9..8e46eea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nmmty/lazycanvas", - "version": "0.5.2", + "version": "0.6.0", "description": "A simple way to interact with @napi-rs/canvas in an advanced way!", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/structures/components/ImageLayer.ts b/src/structures/components/ImageLayer.ts index 172d078..3316064 100644 --- a/src/structures/components/ImageLayer.ts +++ b/src/structures/components/ImageLayer.ts @@ -1,5 +1,5 @@ import { BaseLayer, IBaseLayer, IBaseLayerMisc, IBaseLayerProps } from "./BaseLayer"; -import { ScaleType, Centring, LayerType } from "../../types"; +import {ScaleType, Centring, LayerType, radiusCorner} from "../../types"; import { Canvas, loadImage, SKRSContext2D, SvgCanvas } from "@napi-rs/canvas"; import { centring, @@ -12,6 +12,7 @@ import { } from "../../utils/utils"; import { defaultArg, LazyError, LazyLog } from "../../utils/LazyUtil"; import { LayersManager } from "../managers/LayersManager"; +import {Link} from "../helpers"; /** * Interface representing an Image Layer. @@ -54,7 +55,7 @@ export interface IImageLayerProps extends IBaseLayerProps { /** * The radius of the image. */ - radius: ScaleType; + radius: { [corner in radiusCorner]?: ScaleType }; }; } @@ -94,18 +95,17 @@ export class ImageLayer extends BaseLayer { * Sets the size of the image. * @param width {ScaleType} - The width of the image. * @param height {ScaleType} - The height of the image. - * @param radius {ScaleType} - The radius of the image (optional). + * @param radius {{ [corner in radiusCorner]?: ScaleType }} - The radius of the image (optional). * @returns {this} The current instance for chaining. */ - setSize(width: ScaleType, height: ScaleType, radius?: ScaleType): this { + setSize(width: ScaleType, height: ScaleType, radius?: { [corner in radiusCorner]?: ScaleType }): this { this.props.size = { width: width, height: height, - radius: radius || 0, + radius: radius || { all: 0 }, }; return this; } - /** * Draws the Image Layer on the canvas. * @param ctx {SKRSContext2D} - The canvas rendering context. @@ -124,10 +124,17 @@ export class ImageLayer extends BaseLayer { }); const h = parcer.parse(this.props.size.height, defaultArg.wh(w), defaultArg.vl(true)); - const r = parcer.parse(this.props.size.radius, defaultArg.wh(w / 2, h / 2), defaultArg.vl(false, true)); let { x, y } = centring(this.props.centring, this.type, w, h, xs, ys); - if (debug) LazyLog.log('none', `ImageLayer:`, { x, y, w, h, r }); + const rad: { [corner in radiusCorner]?: number } = {}; + if (typeof this.props.size.radius === 'object' && this.props.size.radius !== Link) { + for (const corner in this.props.size.radius) { + // @ts-ignore + rad[corner] = parcer.parse(this.props.size.radius[corner], defaultArg.wh(w / 2, h / 2), defaultArg.vl(false, true)); + } + } + + if (debug) LazyLog.log('none', `ImageLayer:`, { x, y, w, h, rad }); ctx.save(); transform(ctx, this.props.transform, { width: w, height: h, x, y, type: this.type }); @@ -138,13 +145,13 @@ export class ImageLayer extends BaseLayer { image.width = w; image.height = h; if (!image) throw new LazyError('The image could not be loaded'); - if (r) { + if (Object.keys(rad).length > 0) { ctx.beginPath(); ctx.moveTo(x + (w / 2), y); - ctx.arcTo(x + w, y, x + w, y + (h / 2), r); - ctx.arcTo(x + w, y + h, x + (w / 2), y + h, r); - ctx.arcTo(x, y + h, x, y + (h / 2), r); - ctx.arcTo(x, y, x + (w / 2), y, r); + ctx.arcTo(x + w, y, x + w, y + (h / 2), rad.rightTop || rad.all || 0); + ctx.arcTo(x + w, y + h, x + (w / 2), y + h, rad.rightBottom || rad.all || 0); + ctx.arcTo(x, y + h, x, y + (h / 2), rad.leftBottom || rad.all || 0); + ctx.arcTo(x, y, x + (w / 2), y, rad.leftTop || rad.all || 0); ctx.closePath(); ctx.clip(); ctx.drawImage(image, x, y, w, h); diff --git a/src/structures/components/MorphLayer.ts b/src/structures/components/MorphLayer.ts index 9e200d2..fdf8f37 100644 --- a/src/structures/components/MorphLayer.ts +++ b/src/structures/components/MorphLayer.ts @@ -1,5 +1,5 @@ import { BaseLayer, IBaseLayer, IBaseLayerMisc, IBaseLayerProps } from "./BaseLayer"; -import { ColorType, ScaleType, Centring, LayerType } from "../../types"; +import {ColorType, ScaleType, Centring, LayerType, radiusCorner} from "../../types"; import { Canvas, SKRSContext2D, SvgCanvas } from "@napi-rs/canvas"; import { drawShadow, @@ -12,6 +12,7 @@ import { } from "../../utils/utils"; import { defaultArg, LazyError, LazyLog } from "../../utils/LazyUtil"; import { LayersManager } from "../managers/LayersManager"; +import {Link} from "../helpers"; /** * Interface representing a Morph Layer. @@ -49,7 +50,7 @@ export interface IMorphLayerProps extends IBaseLayerProps { /** * The radius of the Morph Layer. */ - radius: ScaleType; + radius: { [corner in radiusCorner]?: ScaleType }; }; /** @@ -114,14 +115,14 @@ export class MorphLayer extends BaseLayer { * Sets the size of the Morph Layer. * @param width {ScaleType} - The width of the Morph Layer. * @param height {ScaleType} - The height of the Morph Layer. - * @param radius {ScaleType} - The radius of the Morph Layer (optional). + * @param radius {{ [corner in radiusCorner]?: ScaleType }} - The radius of the Morph Layer (optional). * @returns {this} The current instance for chaining. */ - setSize(width: ScaleType, height: ScaleType, radius?: ScaleType): this { + setSize(width: ScaleType, height: ScaleType, radius?: { [corner in radiusCorner]?: ScaleType }): this { this.props.size = { width: width, height: height, - radius: radius || 0, + radius: radius || { all: 0 }, }; return this; } @@ -188,23 +189,30 @@ export class MorphLayer extends BaseLayer { }); const h = parcer.parse(this.props.size.height, defaultArg.wh(w), defaultArg.vl(true)); - const r = parcer.parse(this.props.size.radius, defaultArg.wh(w / 2, h / 2), defaultArg.vl(false, true)); + + const rad: { [corner in radiusCorner]?: number } = {}; + if (typeof this.props.size.radius === 'object' && this.props.size.radius !== Link) { + for (const corner in this.props.size.radius) { + // @ts-ignore + rad[corner] = parcer.parse(this.props.size.radius[corner], defaultArg.wh(w / 2, h / 2), defaultArg.vl(false, true)); + } + } let { x, y } = centring(this.props.centring, this.type, w, h, xs, ys); let fillStyle = await parseFillStyle(ctx, this.props.fillStyle); - if (debug) LazyLog.log('none', `MorphLayer:`, { x, y, w, h, r }); + if (debug) LazyLog.log('none', `MorphLayer:`, { x, y, w, h, rad }); ctx.save(); transform(ctx, this.props.transform, { width: w, height: h, x, y, type: this.type }); ctx.beginPath(); - if (r) { + if (Object.keys(rad).length > 0) { ctx.moveTo(x + (w / 2), y); - ctx.arcTo(x + w, y, x + w, y + (h / 2), r); - ctx.arcTo(x + w, y + h, x + (w / 2), y + h, r); - ctx.arcTo(x, y + h, x, y + (h / 2), r); - ctx.arcTo(x, y, x + (w / 2), y, r); + ctx.arcTo(x + w, y, x + w, y + (h / 2), rad.rightTop || rad.all || 0); + ctx.arcTo(x + w, y + h, x + (w / 2), y + h, rad.rightBottom || rad.all || 0); + ctx.arcTo(x, y + h, x, y + (h / 2), rad.leftBottom || rad.all || 0); + ctx.arcTo(x, y, x + (w / 2), y, rad.leftTop || rad.all || 0); } else { ctx.rect(x, y, w, h); } diff --git a/src/types/types.d.ts b/src/types/types.d.ts index 091d963..093287f 100644 --- a/src/types/types.d.ts +++ b/src/types/types.d.ts @@ -94,4 +94,6 @@ export interface Transform { y: number; }; matrix: DOMMatrix2DInit; -} \ No newline at end of file +} + +export type radiusCorner = 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom' | 'all'; \ No newline at end of file diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 092a034..2a719cd 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -390,7 +390,10 @@ export function resizeLayers(layers: Array, ratio: number) { layer.props.size.width = resize(layer.props.size.width, ratio) as ScaleType; layer.props.size.height = resize(layer.props.size.height, ratio) as ScaleType; if ('radius' in layer.props.size) { - layer.props.size.radius = resize(layer.props.size.radius, ratio) as ScaleType; + for (const corner in layer.props.size.radius) { + // @ts-ignore + layer.props.size.radius[corner] = resize(layer.props.size.radius[corner], ratio) as ScaleType; + } } } diff --git a/test/test.ts b/test/test.ts index 8a2899e..35e9e4c 100644 --- a/test/test.ts +++ b/test/test.ts @@ -23,7 +23,7 @@ canvas.manager.layers.add( .setID('morph') .setPosition('25%', 200) .setColor("rgb(0, 200, 0)") - .setSize(250, 250, 0) + .setSize(250, 250) .setFilters(Filters.blur(10)) .setRotate(45), new MorphLayer() @@ -32,7 +32,14 @@ canvas.manager.layers.add( .setSource('bezier') .setSpacing(-200), 200) .setColor("rgba(255, 0, 14, 1)") - .setSize(200, 200, 60), + .setSize(200, 200, + { + all: 30, + rightTop: 40, + rightBottom: 50, + leftTop: 20, + leftBottom: 10 + }), new TextLayer() .setText("Hello, World!") .setPosition(300, 500) @@ -60,7 +67,13 @@ canvas.manager.layers.add( .setMultiline(true, 200, 500), new ImageLayer() .setPosition('70%', '25%') - .setSize(200, 200, 60) + .setSize(200, 200, { + all: 30, + rightTop: 40, + rightBottom: 50, + leftTop: 20, + leftBottom: 10 + }) .setSrc("https://i.pinimg.com/1200x/f3/32/19/f332192b2090f437ca9f49c1002287b6.jpg"), new BezierLayer() .setID('bezier') From 0a3dfbfc3709e794f291e254fbe5c6a0f87a5675 Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Mon, 16 Jun 2025 22:57:01 +0300 Subject: [PATCH 2/8] feat: optimize animation frame rate and enhance MorphLayer usage in groups --- src/structures/components/ClearLayer.ts | 7 ++++- src/structures/components/Group.ts | 35 +++++++++++++++++++++++- src/structures/managers/RenderManager.ts | 23 +++------------- test/animation.ts | 21 ++++++++++---- test/centring.ts | 4 +-- test/logo.ts | 6 ++-- 6 files changed, 64 insertions(+), 32 deletions(-) diff --git a/src/structures/components/ClearLayer.ts b/src/structures/components/ClearLayer.ts index 712c4cc..191a66d 100644 --- a/src/structures/components/ClearLayer.ts +++ b/src/structures/components/ClearLayer.ts @@ -1,4 +1,4 @@ -import { ScaleType, LayerType, AnyCentring } from "../../types"; +import {ScaleType, LayerType, AnyCentring, AnyGlobalCompositeOperation} from "../../types"; import { Canvas, SKRSContext2D, SvgCanvas } from "@napi-rs/canvas"; import { LayersManager } from "../managers/LayersManager"; import { parser, centring } from "../../utils/utils"; @@ -69,6 +69,11 @@ export interface IClearLayerProps { * The centring type of the layer. */ centring: AnyCentring; + + /** + * Don't use, this is just for compatibility. + */ + globalComposite: AnyGlobalCompositeOperation; } /** diff --git a/src/structures/components/Group.ts b/src/structures/components/Group.ts index 5ad96de..3369a7e 100644 --- a/src/structures/components/Group.ts +++ b/src/structures/components/Group.ts @@ -1,5 +1,8 @@ -import { AnyLayer, LayerType } from "../../types"; +import {AnyGlobalCompositeOperation, AnyLayer, LayerType} from "../../types"; import { generateID } from "../../utils/utils"; +import {Canvas, SKRSContext2D, SvgCanvas} from "@napi-rs/canvas"; +import {LayersManager} from "../managers/LayersManager"; +import {LazyLog} from "../../utils/LazyUtil"; /** * Interface representing a group of layers. @@ -29,6 +32,18 @@ export interface IGroup { * The layers contained within the group. */ layers: Array; + + /** + * + */ + props?: IGroupProps; +} + +export interface IGroupProps { + /** + * Don't use, this is just for compatibility. + */ + globalComposite: AnyGlobalCompositeOperation; } /** @@ -60,6 +75,8 @@ export class Group implements IGroup { */ layers: Array; + props?: IGroupProps; + /** * Constructs a new Group instance. * @param opts {Object} - Optional parameters for the group. @@ -72,6 +89,7 @@ export class Group implements IGroup { this.visible = opts?.visible || true; this.zIndex = opts?.zIndex || 1; this.layers = []; + this.props = {} as IGroupProps; } /** @@ -161,6 +179,21 @@ export class Group implements IGroup { return this.layers.length; } + public async draw(ctx: SKRSContext2D, canvas: Canvas | SvgCanvas, manager: LayersManager, debug: boolean) { + for (const subLayer of this.layers) { + if (debug) LazyLog.log('info', `Rendering ${subLayer.id}...\nData:`, subLayer.toJSON()); + if (subLayer.visible) { + if ('globalComposite' in subLayer.props && subLayer.props.globalComposite) { + ctx.globalCompositeOperation = subLayer.props.globalComposite; + } else { + ctx.globalCompositeOperation = 'source-over'; + } + await subLayer.draw(ctx, canvas, manager, debug); + ctx.shadowColor = 'transparent'; + } + } + } + /** * Converts the group to a JSON representation. * @returns {IGroup} The JSON representation of the group. diff --git a/src/structures/managers/RenderManager.ts b/src/structures/managers/RenderManager.ts index 48bf291..8dfb189 100644 --- a/src/structures/managers/RenderManager.ts +++ b/src/structures/managers/RenderManager.ts @@ -90,25 +90,10 @@ export class RenderManager implements IRenderManager { private async renderLayer(layer: AnyLayer | Group): Promise { if (this.debug) LazyLog.log('info', `Rendering ${layer.id}...\nData:`, layer.toJSON()); if (layer.visible) { - if (layer instanceof Group) { - for (const subLayer of layer.layers) { - if (subLayer.visible) { - if ('globalComposite' in subLayer.props && subLayer.props.globalComposite) { - this.lazyCanvas.ctx.globalCompositeOperation = subLayer.props.globalComposite; - } else { - this.lazyCanvas.ctx.globalCompositeOperation = 'source-over'; - } - await subLayer.draw(this.lazyCanvas.ctx, this.lazyCanvas.canvas, this.lazyCanvas.manager.layers, this.debug); - } - } - } else { - if ('globalComposite' in layer.props && layer.props.globalComposite) { - this.lazyCanvas.ctx.globalCompositeOperation = layer.props.globalComposite; - } else { - this.lazyCanvas.ctx.globalCompositeOperation = 'source-over'; - } - await layer.draw(this.lazyCanvas.ctx, this.lazyCanvas.canvas, this.lazyCanvas.manager.layers, this.debug); - } + this.lazyCanvas.ctx.globalCompositeOperation = layer.props?.globalComposite || 'source-over'; + + await layer.draw(this.lazyCanvas.ctx, this.lazyCanvas.canvas, this.lazyCanvas.manager.layers, this.debug); + this.lazyCanvas.ctx.shadowColor = 'transparent'; } return this.lazyCanvas.ctx; diff --git a/test/animation.ts b/test/animation.ts index 716e767..e85979d 100644 --- a/test/animation.ts +++ b/test/animation.ts @@ -11,14 +11,23 @@ const canvas = new LazyCanvas({ debug: true }) .animated() canvas.manager.animation.setFrameRate(60) - .setClear(true, 30) + .setClear(true, 20) -for (let i = 0; i < 200; i++) { +for (let i = 0; i < 100; i++) { canvas.manager.layers.add( - new MorphLayer() - .setPosition(100 + i, 100 + i) - .setColor(`hsl(${Math.ceil(i * 1.5)}, 100%, 50%)`) - .setSize(200, 200, 0) + new Group() + .add( + new MorphLayer() + .setPosition(100 + i * 2, 100 + i * 2) + .setColor(`hsl(${Math.ceil(i * 1.5)}, 100%, 50%)`) + .setSize(200, 200, { all: 100 - i / 2 }), + new MorphLayer() + .setPosition(100 + i * 2, 100 + i * 2) + .setColor(`hsl(${Math.ceil(300 - (i * 1.5))}, 100%, 50%)`) + .setSize(200, 200, { all: 100 - i / 2 }) + .setFilled(false) + .setStroke(1, "round", "round") + ) ) } diff --git a/test/centring.ts b/test/centring.ts index 5e903b0..2418b6a 100644 --- a/test/centring.ts +++ b/test/centring.ts @@ -10,12 +10,12 @@ arr.forEach( async (item, index) => { new MorphLayer() .setPosition(200, 200) .setColor("rgb(0, 200, 0)") - .setSize(200, 200, 0) + .setSize(200, 200) .setCentring(Centring.Center), new MorphLayer() .setPosition(200, 200) .setColor("rgba(255, 0, 14, 0.5)") - .setSize(200, 200, 60) + .setSize(200, 200, { all: 60 }) .setCentring(item as Centring), ) diff --git a/test/logo.ts b/test/logo.ts index 8f62c89..8f473b7 100644 --- a/test/logo.ts +++ b/test/logo.ts @@ -25,12 +25,12 @@ canvas.manager.layers.add( pattern ) ) - .setSize(200, 200, 100) + .setSize(200, 200, { all: 100 }) .setShadow('#000000', 10), new MorphLayer() .setPosition(105, 105) .setColor("#ff8a8a") - .setSize(200, 200, 100) + .setSize(200, 200, { all: 100 }) .setFilled(false) .setStroke(2.5, "round", "round"), ) @@ -41,7 +41,7 @@ for (let i = 1; i < 5; i += 1) { new MorphLayer() .setPosition(105, 105) .setColor("#ff8a8a") - .setSize(185 - (20 * i - (i > 2 ? (i) : 0)), 185 - (20 * i - (i > 2 ? (i) : 0)), 47.5 - (5 * i + (i > 2 ? (i * 0.25) : 0))) + .setSize(185 - (20 * i - (i > 2 ? (i) : 0)), 185 - (20 * i - (i > 2 ? (i) : 0)), { all: 47.5 - (5 * i + (i > 2 ? (i * 0.25) : 0)) }) .setFilled(false) .setStroke(2.5, "round", "round") .setRotate(45 + (15 * i)), From 518f578283fd6faa84152045e0521fe9778f3ffc Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Mon, 14 Jul 2025 03:20:30 +0300 Subject: [PATCH 3/8] feat: enhance gradient functionality --- package.json | 3 +- src/structures/components/BezierLayer.ts | 2 +- src/structures/components/ImageLayer.ts | 10 +- src/structures/components/LineLayer.ts | 6 +- src/structures/components/MorphLayer.ts | 2 +- src/structures/components/Path2DLayer.ts | 2 +- src/structures/components/QuadraticLayer.ts | 2 +- src/structures/components/TextLayer.ts | 7 +- src/structures/helpers/Gradient.ts | 198 +++++++++++++++++--- src/structures/managers/RenderManager.ts | 2 +- src/utils/utils.ts | 155 ++++++++------- test/gradient.ts | 83 ++++++++ test/test.ts | 198 ++++++++++++-------- 13 files changed, 465 insertions(+), 205 deletions(-) create mode 100644 test/gradient.ts diff --git a/package.json b/package.json index 8e46eea..4e390e4 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "text": "tsc ./test/text.ts && node ./test/text.js", "animation": "tsc ./test/animation.ts && node ./test/animation.js", "iotest": "tsc ./test/iotest.ts && node ./test/iotest.js", + "gradient": "tsc ./test/gradient.ts && node ./test/gradient.js", "doc": "tsx docgen.ts", "font": "tsc ./scripts/font-gen.ts && node ./scripts/font-gen.js", "build": "tsc" @@ -33,7 +34,7 @@ }, "homepage": "https://github.com/NMMTY/LazyCanvas#readme", "dependencies": { - "@napi-rs/canvas": "^0.1.68", + "@napi-rs/canvas": "^0.1.72", "gifenc": "^1.0.3", "js-yaml": "^4.1.0", "path": "^0.12.7", diff --git a/src/structures/components/BezierLayer.ts b/src/structures/components/BezierLayer.ts index a12b1fe..f78bfde 100644 --- a/src/structures/components/BezierLayer.ts +++ b/src/structures/components/BezierLayer.ts @@ -205,7 +205,7 @@ export class BezierLayer extends BaseLayer { }); const { max, min, center, width, height } = getBoundingBoxBezier([ { x: xs, y: ys }, { x: cp1x, y: cp1y }, { x: cp2x, y: cp2y }, { x: xe, y: ye } ]); - let fillStyle = await parseFillStyle(ctx, this.props.fillStyle); + let fillStyle = await parseFillStyle(ctx, this.props.fillStyle, { debug, layer: { width, height, x: min.x, y: min.y, align: 'none' }, manager }); if (debug) LazyLog.log('none', `BezierLayer:`, { xs, ys, cp1x, cp1y, cp2x, cp2y, xe, ye, max, min, center, width, height, fillStyle }); diff --git a/src/structures/components/ImageLayer.ts b/src/structures/components/ImageLayer.ts index 3316064..90918fd 100644 --- a/src/structures/components/ImageLayer.ts +++ b/src/structures/components/ImageLayer.ts @@ -137,14 +137,16 @@ export class ImageLayer extends BaseLayer { if (debug) LazyLog.log('none', `ImageLayer:`, { x, y, w, h, rad }); ctx.save(); - transform(ctx, this.props.transform, { width: w, height: h, x, y, type: this.type }); - drawShadow(ctx, this.props.shadow); - opacity(ctx, this.props.opacity); - filters(ctx, this.props.filter); let image = await loadImage(this.props.src); image.width = w; image.height = h; if (!image) throw new LazyError('The image could not be loaded'); + + transform(ctx, this.props.transform, { width: w, height: h, x, y, type: this.type }); + drawShadow(ctx, this.props.shadow); + opacity(ctx, this.props.opacity); + filters(ctx, this.props.filter); + if (Object.keys(rad).length > 0) { ctx.beginPath(); ctx.moveTo(x + (w / 2), y); diff --git a/src/structures/components/LineLayer.ts b/src/structures/components/LineLayer.ts index fcef6d2..3c2522d 100644 --- a/src/structures/components/LineLayer.ts +++ b/src/structures/components/LineLayer.ts @@ -189,9 +189,9 @@ export class LineLayer extends BaseLayer { ye: { v: this.props.endPoint.y, options: defaultArg.vl(true) }, }); - let width = xe - xs; - let height = ye - ys; - let fillStyle = await parseFillStyle(ctx, this.props.fillStyle); + let width = Math.abs(xe - xs); + let height = Math.abs(ye - ys); + let fillStyle = await parseFillStyle(ctx, this.props.fillStyle, { debug, layer: { width, height, x: Math.min(xs, xe), y: Math.min(ys, ye), align: 'none' }, manager }); if (debug) LazyLog.log('none', `LineLayer:`, { xs, ys, xe, ye, width, height }); diff --git a/src/structures/components/MorphLayer.ts b/src/structures/components/MorphLayer.ts index fdf8f37..481bb39 100644 --- a/src/structures/components/MorphLayer.ts +++ b/src/structures/components/MorphLayer.ts @@ -199,7 +199,7 @@ export class MorphLayer extends BaseLayer { } let { x, y } = centring(this.props.centring, this.type, w, h, xs, ys); - let fillStyle = await parseFillStyle(ctx, this.props.fillStyle); + let fillStyle = await parseFillStyle(ctx, this.props.fillStyle, { debug, layer: { width: w, height: h, x: xs, y: ys, align: this.props.centring }, manager }); if (debug) LazyLog.log('none', `MorphLayer:`, { x, y, w, h, rad }); diff --git a/src/structures/components/Path2DLayer.ts b/src/structures/components/Path2DLayer.ts index fad0590..48c1392 100644 --- a/src/structures/components/Path2DLayer.ts +++ b/src/structures/components/Path2DLayer.ts @@ -347,7 +347,7 @@ export class Path2DLayer extends BaseLayer { async draw(ctx: SKRSContext2D, canvas: Canvas | SvgCanvas, manager: LayersManager, debug: boolean): Promise { ctx.beginPath(); ctx.save(); - let fillStyle = await parseFillStyle(ctx, this.props.fillStyle); + let fillStyle = await parseFillStyle(ctx, this.props.fillStyle, { debug, manager }); transform(ctx, this.props.transform, { width: 0, height: 0, x: 0, y: 0, type: this.type }); opacity(ctx, this.props.opacity); ctx.globalCompositeOperation = this.props.globalComposite; diff --git a/src/structures/components/QuadraticLayer.ts b/src/structures/components/QuadraticLayer.ts index 1fe9acb..cf5972b 100644 --- a/src/structures/components/QuadraticLayer.ts +++ b/src/structures/components/QuadraticLayer.ts @@ -200,7 +200,7 @@ export class QuadraticLayer extends BaseLayer { }); const { max, min, center, width, height } = getBoundingBoxBezier([ { x: xs, y: ys }, { x: cx, y: cy }, { x: xe, y: ye } ]); - let fillStyle = await parseFillStyle(ctx, this.props.fillStyle); + let fillStyle = await parseFillStyle(ctx, this.props.fillStyle, { debug, layer: { width, height, x: min.x, y: min.y, align: 'none' }, manager }); if (debug) LazyLog.log('none', `BezierLayer:`, { xs, ys, cx, cy, xe, ye, max, min, center, width, height, fillStyle }); diff --git a/src/structures/components/TextLayer.ts b/src/structures/components/TextLayer.ts index bdb5483..0264726 100644 --- a/src/structures/components/TextLayer.ts +++ b/src/structures/components/TextLayer.ts @@ -397,11 +397,14 @@ export class TextLayer extends BaseLayer { drawShadow(ctx, this.props.shadow); opacity(ctx, this.props.opacity); filters(ctx, this.props.filter); + ctx.textAlign = this.props.align; ctx.letterSpacing = `${this.props.letterSpacing}px`; ctx.wordSpacing = `${this.props.wordSpacing}px`; if (this.props.baseline) ctx.textBaseline = this.props.baseline; if (this.props.direction) ctx.direction = this.props.direction; + + let fillStyle = await parseFillStyle(ctx, this.props.fillStyle, { debug, layer: { width: w, height: h, x, y, align: 'none' }, manager }); if (this.props.multiline.enabled) { const words = this.props.text.split(' '); @@ -432,11 +435,11 @@ export class TextLayer extends BaseLayer { } for (let line of lines) { - this.drawText(this.props, ctx, await parseFillStyle(ctx, this.props.fillStyle), line.text, line.x, line.y, w); + this.drawText(this.props, ctx, fillStyle, line.text, line.x, line.y, w); } } else { ctx.font = `${this.props.font.weight} ${this.props.font.size}px ${this.props.font.family}`; - this.drawText(this.props, ctx, await parseFillStyle(ctx, this.props.fillStyle), this.props.text, x, y, w); + this.drawText(this.props, ctx, fillStyle, this.props.text, x, y, w); } ctx.closePath(); ctx.restore(); diff --git a/src/structures/helpers/Gradient.ts b/src/structures/helpers/Gradient.ts index 4f98f9d..9b87283 100644 --- a/src/structures/helpers/Gradient.ts +++ b/src/structures/helpers/Gradient.ts @@ -1,5 +1,8 @@ -import { AnyGradientType, FillType, GradientType, StringColorType } from "../../types"; +import { AnyCentring, AnyGradientType, Centring, FillType, GradientType, StringColorType, ScaleType } from "../../types"; import { SKRSContext2D } from "@napi-rs/canvas"; +import { LazyLog, LazyError, defaultArg } from "../../utils/LazyUtil"; +import { parser } from "../../utils/utils"; +import { LayersManager } from "../managers/LayersManager"; /** * Interface representing a gradient. @@ -24,6 +27,8 @@ export interface IGradient { * The color stops for the gradient. */ stops: Array; + + angle?: number; } /** @@ -48,22 +53,17 @@ export interface GradientPoint { /** * The x-coordinate of the point. */ - x: number; + x: ScaleType; /** * The y-coordinate of the point. */ - y: number; + y: ScaleType; /** * The radius of the point (optional, used for radial gradients). */ r?: number; - - /** - * The starting angle of the point (optional, used for conic gradients). - */ - startAngle?: number; } /** @@ -90,6 +90,7 @@ export class Gradient implements IGradient { */ stops: Array; + angle?: number; /** * Constructs a new Gradient instance. * @param opts {Object} - Optional properties for the gradient. @@ -121,6 +122,26 @@ export class Gradient implements IGradient { return this; } + /** + * Sets the points of the gradient. + * @param points {GradientPoint[]} - The points to set for the gradient. + * @returns {this} The current instance for chaining. + */ + setPoints(...points: GradientPoint[]): this { + this.points = points; + return this; + } + + /** + * Removes points from the gradient by their indexes. + * @param indexes {number[]} - The indexes of the points to remove. + * @returns {this} The current instance for chaining. + */ + removePoints(...indexes: number[]): this { + this.points = this.points.filter((_, index) => !indexes.includes(index)); + return this; + } + /** * Adds color stops to the gradient. * @param stops {GradientColorStop[]} - The color stops to add to the gradient. @@ -132,49 +153,105 @@ export class Gradient implements IGradient { } /** - * Draws the gradient on a canvas context. - * @param ctx {SKRSContext2D} - The canvas rendering context. - * @returns {CanvasGradient} The created gradient. + * Sets the color stops of the gradient. + * @param stops {GradientColorStop[]} - The color stops to set for the gradient. + * @returns {this} The current instance for chaining. */ - draw(ctx: SKRSContext2D): CanvasGradient { + setStops(...stops: GradientColorStop[]): this { + this.stops = stops; + return this; + } + + /** + * Removes color stops from the gradient by their indexes. + * @param indexes {number[]} - The indexes of the color stops to remove. + * @returns {this} The current instance for chaining. + */ + removeStops(...indexes: number[]): this { + this.stops = this.stops.filter((_, index) => !indexes.includes(index)); + return this; + } + + setAngle(angle: number): this { + this.angle = angle; + return this; + } + + draw(ctx: SKRSContext2D, opts: { debug?: boolean, layer?: { width: number, height: number, x: number, y: number, align: AnyCentring }, manager?: LayersManager } = { debug: false }): CanvasGradient { let gradientData = this.toJSON(); let gradient; + + if (opts.debug) LazyLog.log('none', `Gradient:`, gradientData); + + const parse = parser(ctx, ctx.canvas, opts.manager); + + const { x0, y0, x1, y1 } = parse.parseBatch({ + x0: { v: gradientData.points[0]?.x || 0 }, + y0: { v: gradientData.points[0]?.y || 0, options: defaultArg.vl(true) }, + x1: { v: gradientData.points[1]?.x || 0 }, + y1: { v: gradientData.points[1]?.y || 0, options: defaultArg.vl(true) } + }) + + if (opts.debug) LazyLog.log('none', `Gradient points:`, { x0, y0, x1, y1 }); + switch (gradientData.type) { case GradientType.Linear: case "linear": - gradient = ctx.createLinearGradient( - gradientData.points[0].x, - gradientData.points[0].y, - gradientData.points[1].x, - gradientData.points[1].y - ); + if (gradientData.type === "linear" && (gradientData.angle || gradientData.angle === 0) && opts.layer) { + const { width, height, x, y, align } = opts.layer; + + const cx = this.getPosition(x, width, align, 'x'); + const cy = this.getPosition(y, height, align, 'y'); + + const [p1, p2] = this.getLinearGradientPoints(cx, cy, width, height, gradientData.angle); + + gradient = ctx.createLinearGradient(p1.x, p1.y, p2.x, p2.y); + } else { + gradient = ctx.createLinearGradient( + x0, + y0, + x1 || x0, + y1 || y0 + ); + } break; case GradientType.Radial: case "radial": gradient = ctx.createRadialGradient( - gradientData.points[0].x, - gradientData.points[0].y, + x0, + y0, gradientData.points[0].r || 0, - gradientData.points[1].x || gradientData.points[0].x, - gradientData.points[1].y || gradientData.points[0].y, + x1 || x0, + y1 || y0, gradientData.points[1].r || 0 ); break; case GradientType.Conic: case "conic": gradient = ctx.createConicGradient( - gradientData.points[0].startAngle || 0, - gradientData.points[0].x, - gradientData.points[0].y + (gradientData.angle || 0) * (Math.PI / 180), + x0, + y0 ); break; default: - gradient = ctx.createLinearGradient( - gradientData.points[0].x, - gradientData.points[0].y, - gradientData.points[1].x, - gradientData.points[1].y - ); + if ((gradientData.angle || gradientData.angle === 0) && opts.layer) { + const { width, height, x, y, align } = opts.layer; + + const cx = this.getPosition(x, width, align, 'x'); + const cy = this.getPosition(y, height, align, 'y'); + + const [p1, p2] = this.getLinearGradientPoints(cx, cy, width, height, gradientData.angle); + + gradient = ctx.createLinearGradient(p1.x, p1.y, p2.x, p2.y); + } else { + gradient = ctx.createLinearGradient( + x0, + y0, + x1 || x0, + y1 || y0 + ); + } break; } for (let stop of gradientData.stops) { @@ -193,6 +270,65 @@ export class Gradient implements IGradient { type: this.type, points: this.points, stops: this.stops, + angle: this.angle }; } + + private getLinearGradientPoints(cx: number, cy: number, w: number, h: number, angleInDegrees: number) { + const angle = angleInDegrees * (Math.PI / 180); + const x1 = cx; + const y1 = cy - h / 2; + const x2 = cx; + const y2 = cy + h / 2; + + const cos = Math.cos(angle); + const sin = Math.sin(angle); + + const x1r = cx + (x1 - cx) * cos - (y1 - cy) * sin; + const y1r = cy + (x1 - cx) * sin + (y1 - cy) * cos; + const x2r = cx + (x2 - cx) * cos - (y2 - cy) * sin; + const y2r = cy + (x2 - cx) * sin + (y2 - cy) * cos; + + return [ + { x: x1r, y: y1r }, + { x: x2r, y: y2r } + ]; + } + + private getPosition(pos: number, side: number, align: AnyCentring, type: 'x' | 'y' = 'x'): number { + switch (align) { + case Centring.StartTop: + case "start-top": + return type === 'x' ? pos + (side / 2) : pos + (side / 2); + case Centring.Start: + case "start": + return type === 'x' ? pos + (side / 2) : pos; + case Centring.StartBottom: + case "start-bottom": + return type === 'x' ? pos + (side / 2) : pos - (side / 2); + case Centring.CenterTop: + case "center-top": + return type === 'x' ? pos : pos - (side / 2); + case Centring.Center: + case "center": + return type === 'x' ? pos : pos; + case Centring.CenterBottom: + case "center-bottom": + return type === 'x' ? pos: pos - (side / 2); + case Centring.EndTop: + case "end-top": + return type === 'x' ? pos - (side / 2) : pos + (side / 2); + case Centring.End: + case "end": + return type === 'x' ? pos - (side / 2) : pos; + case Centring.EndBottom: + case "end-bottom": + return type === 'x' ? pos - (side / 2) : pos - (side / 2); + case Centring.None: + case "none": + return type === 'x' ? pos + (side / 2) : pos + (side / 2); + default: + throw new LazyError(`Invalid centring type: ${align}`); + } + } } \ No newline at end of file diff --git a/src/structures/managers/RenderManager.ts b/src/structures/managers/RenderManager.ts index 8dfb189..dcba92a 100644 --- a/src/structures/managers/RenderManager.ts +++ b/src/structures/managers/RenderManager.ts @@ -1,6 +1,6 @@ import { AnyExport, AnyLayer, Export } from "../../types"; import { LazyCanvas } from "../LazyCanvas"; -import { Canvas, SKRSContext2D, SvgCanvas } from "@napi-rs/canvas"; +import { Canvas, SKRSContext2D, SvgCanvas, ImageData } from "@napi-rs/canvas"; import { Group } from "../components"; import { LazyLog } from "../../utils/LazyUtil"; // @ts-ignore diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 2a719cd..1d47789 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -13,7 +13,7 @@ export function generateID(type: string) { let percentReg = /^(\d+)%$/; let pxReg = /^(\d+)px$/; let canvasReg = /^(vw|vh|vmin|vmax)$/; -let linkReg = /^(link-w|link-h|link-x|link-y)-([A-Za-z0-9_]+)-(\d+)$/; +let linkReg = /^(link-w|link-h|link-x|link-y)-([A-Za-z0-9_]+)-(\d+(.\d+)?)$/; let hexReg = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; let rgbReg = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/; @@ -25,102 +25,94 @@ export function isColor(v: ColorType) { return typeof (v === 'string' && (hexReg.test(v) || rgbReg.test(v) || rgbaReg.test(v) || hslReg.test(v) || hslaReg.test(v))) || v instanceof Gradient || v instanceof Pattern; } -export function parseToNormal(v: ScaleType, ctx: SKRSContext2D, canvas: Canvas | SvgCanvas, layer: { width: number, height: number } = { width: 0, height: 0 }, options: { vertical?: boolean, layer?: boolean } = { vertical: false, layer: false }, manager?: LayersManager): number { - if (typeof v === 'number') { - return v; - } else if (typeof v === 'string') { +export function parseToNormal( + v: ScaleType, + ctx: SKRSContext2D, + canvas: Canvas | SvgCanvas, + layer: { width: number; height: number } = { width: 0, height: 0 }, + options: { vertical?: boolean; layer?: boolean } = { vertical: false, layer: false }, + manager?: LayersManager +): number { + if (typeof v === 'number') return v; + + if (typeof v === 'string') { if (percentReg.test(v)) { - console.log(options, layer, canvas.width, canvas.height, parseFloat(v)); - return (parseFloat(v) / 100) * (options.layer ? (options.vertical ? layer.height : layer.width) : (options.vertical ? canvas.height : canvas.width )); - } else if (pxReg.test(v)) { - return parseFloat(v); - } else if (canvasReg.test(v)) { - if (v === 'vw') { - return (options.layer ? layer.width : canvas.width); - } else if (v === 'vh') { - return (options.layer ? layer.height : canvas.height); - } else if (v === 'vmin') { - return (options.layer ? Math.max(layer.width, layer.height) : Math.min(canvas.width, canvas.height)); - } else if (v === 'vmax') { - return (options.layer ? Math.max(layer.width, layer.height) : Math.max(canvas.width, canvas.height)); + const base = options.layer + ? options.vertical ? layer.height : layer.width + : options.vertical ? canvas.height : canvas.width; + return (parseFloat(v) / 100) * base; + } + if (pxReg.test(v)) return parseFloat(v); + + if (canvasReg.test(v)) { + const base = options.layer ? layer : canvas; + switch (v) { + case 'vw': return base.width; + case 'vh': return base.height; + case 'vmin': return Math.min(base.width, base.height); + case 'vmax': return Math.max(base.width, base.height); } - } else if (linkReg.test(v)) { - let match = v.match(linkReg) as RegExpMatchArray; + } + if (linkReg.test(v)) { + const match = v.match(linkReg) as RegExpMatchArray; if (!manager) return 0; - let anyLayer = manager.get(match[2], true); - + const anyLayer = manager.get(match[2], true); if (!anyLayer || anyLayer instanceof Group || anyLayer instanceof Path2DLayer) return 0; - const parcer = parser(ctx, canvas, manager); + const parserInstance = parser(ctx, canvas, manager); + const additionalSpacing = parseInt(match[3]) || 0; switch (match[1]) { - case 'link-w': - if (anyLayer instanceof LineLayer || anyLayer instanceof BezierLayer || anyLayer instanceof QuadraticLayer) { - return anyLayer.getBoundingBox(ctx, canvas, manager).width + (parseInt(match[3]) || 0); - } else if (anyLayer instanceof TextLayer) { - return anyLayer.measureText(ctx, canvas).width + (parseInt(match[3]) || 0); - } else { - return (parcer.parse(anyLayer.props.size.width) || 0) + (parseInt(match[3]) || 0); - } - case 'link-h': - if (anyLayer instanceof LineLayer || anyLayer instanceof BezierLayer || anyLayer instanceof QuadraticLayer) { - return anyLayer.getBoundingBox(ctx, canvas, manager).height + (parseInt(match[3]) || 0); - } else if (anyLayer instanceof TextLayer) { - return anyLayer.measureText(ctx, canvas).height + (parseInt(match[3]) || 0); - } else { - return (parcer.parse(anyLayer.props.size.height, defaultArg.wh(parcer.parse(anyLayer.props.size.width)), defaultArg.vl(true)) || 0) + (parseInt(match[3]) || 0); - } - case 'link-x': - return (parcer.parse(anyLayer.props.x) || 0) + (parseInt(match[3]) || 0); - case 'link-y': - return (parcer.parse(anyLayer.props.y, defaultArg.wh(), defaultArg.vl(true)) || 0) + (parseInt(match[3]) || 0); + case 'link-w': return getLayerWidth(anyLayer, ctx, canvas, manager, parserInstance) + additionalSpacing; + case 'link-h': return getLayerHeight(anyLayer, ctx, canvas, manager, parserInstance) + additionalSpacing; + case 'link-x': return parserInstance.parse(anyLayer.props.x) + additionalSpacing; + case 'link-y': return parserInstance.parse(anyLayer.props.y) + additionalSpacing; } } - } else if (v instanceof Link) { - if (!manager) return 0; + } - let anyLayer = manager.get(v.source, true); + if (v instanceof Link) { + if (!manager) return 0; + const anyLayer = manager.get(v.source, true); if (!anyLayer || anyLayer instanceof Group || anyLayer instanceof Path2DLayer) return 0; - const parcer = parser(ctx, canvas, manager); + const parserInstance = parser(ctx, canvas, manager); + const additionalSpacing = parserInstance.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0; switch (v.type) { - case LinkType.Width: - case 'width': - if (anyLayer instanceof LineLayer || anyLayer instanceof BezierLayer || anyLayer instanceof QuadraticLayer) { - return anyLayer.getBoundingBox(ctx, canvas, manager).width + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - } else if (anyLayer instanceof TextLayer) { - return anyLayer.measureText(ctx, canvas).width + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - } else { - return (parcer.parse(anyLayer.props.size.width) || 0) + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - } - case LinkType.Height: - case 'height': - if (anyLayer instanceof LineLayer || anyLayer instanceof BezierLayer || anyLayer instanceof QuadraticLayer) { - return anyLayer.getBoundingBox(ctx, canvas, manager).height + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - } else if (anyLayer instanceof TextLayer) { - return anyLayer.measureText(ctx, canvas).height + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - } else { - return (parcer.parse(anyLayer.props.size.height, defaultArg.wh(parcer.parse(anyLayer.props.size.width)), defaultArg.vl(true)) || 0) + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - } - case LinkType.X: - case 'x': - return (parcer.parse(anyLayer.props.x) || 0) + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - case LinkType.Y: - case 'y': - return (parcer.parse(anyLayer.props.y) || 0) + (parcer.parse(v.additionalSpacing, defaultArg.wh(layer.width, layer.height), defaultArg.vl(options.vertical, options.layer)) || 0); - default: - return 0; + case LinkType.Width: return getLayerWidth(anyLayer, ctx, canvas, manager, parserInstance) + additionalSpacing; + case LinkType.Height: return getLayerHeight(anyLayer, ctx, canvas, manager, parserInstance) + additionalSpacing; + case LinkType.X: return parserInstance.parse(anyLayer.props.x) + additionalSpacing; + case LinkType.Y: return parserInstance.parse(anyLayer.props.y) + additionalSpacing; } - } else { - return 0; } + return 0; } +function getLayerWidth(anyLayer: AnyLayer, ctx: SKRSContext2D, canvas: Canvas | SvgCanvas, manager: LayersManager, parserInstance: any): number { + if (anyLayer instanceof LineLayer || anyLayer instanceof BezierLayer || anyLayer instanceof QuadraticLayer) { + return anyLayer.getBoundingBox(ctx, canvas, manager).width; + } + if (anyLayer instanceof TextLayer) { + return anyLayer.measureText(ctx, canvas).width; + } + return anyLayer instanceof Path2DLayer ? 0 : parserInstance.parse(anyLayer.props.size.width) || 0; +} + +function getLayerHeight(anyLayer: AnyLayer, ctx: SKRSContext2D, canvas: Canvas | SvgCanvas, manager: LayersManager, parserInstance: any): number { + if (anyLayer instanceof LineLayer || anyLayer instanceof BezierLayer || anyLayer instanceof QuadraticLayer) { + return anyLayer.getBoundingBox(ctx, canvas, manager).height; + } + if (anyLayer instanceof TextLayer) { + return anyLayer.measureText(ctx, canvas).height; + } + return anyLayer instanceof Path2DLayer ? 0 : parserInstance.parse(anyLayer.props.size.height) || 0; +} + export function parser(ctx: SKRSContext2D, canvas: Canvas | SvgCanvas, manager?: LayersManager) { return { parse(v: ScaleType, layer: { width: number, height: number } = defaultArg.wh(), options: { vertical?: boolean, layer?: boolean } = defaultArg.vl()) { @@ -159,12 +151,12 @@ export function filters(ctx: SKRSContext2D, filters: string) { } } -export function parseFillStyle(ctx: SKRSContext2D, color: ColorType) { +export function parseFillStyle(ctx: SKRSContext2D, color: ColorType, opts: { debug?: boolean, layer?: { width: number, height: number, x: number, y: number, align: AnyCentring }, manager?: LayersManager }) { if (!ctx) throw new LazyError('The context is not defined'); if (!color) throw new LazyError('The color is not defined'); if (color instanceof Gradient || color instanceof Pattern) { - return color.draw(ctx); + return color.draw(ctx, opts); } return color; } @@ -251,6 +243,7 @@ export function centring(centring: AnyCentring, type: LayerType, width: number, case LayerType.Morph: case LayerType.Clear: x -= width / 2; + y -= height; break; } return { x, y }; @@ -277,9 +270,6 @@ export function centring(centring: AnyCentring, type: LayerType, width: number, return { x, y }; case Centring.StartBottom: case "start-bottom": - return { x, y }; - case Centring.StartTop: - case "start-top": switch (type) { case LayerType.Image: case LayerType.Morph: @@ -288,6 +278,9 @@ export function centring(centring: AnyCentring, type: LayerType, width: number, break; } return { x, y }; + case Centring.StartTop: + case "start-top": + return { x, y }; case Centring.End: case "end": switch (type) { @@ -306,6 +299,7 @@ export function centring(centring: AnyCentring, type: LayerType, width: number, case LayerType.Morph: case LayerType.Clear: x -= width; + y -= height; break; } return { x, y }; @@ -316,7 +310,6 @@ export function centring(centring: AnyCentring, type: LayerType, width: number, case LayerType.Morph: case LayerType.Clear: x -= width; - y -= height; break; } return { x, y }; diff --git a/test/gradient.ts b/test/gradient.ts new file mode 100644 index 0000000..e60f697 --- /dev/null +++ b/test/gradient.ts @@ -0,0 +1,83 @@ +import { + Centring, + Exporter, + FontsList, + Gradient, + GradientType, + Group, + LazyCanvas, + Link, + MorphLayer, + TextLayer +} from "../src"; + +const canvas = new LazyCanvas({ debug: true }) + .create(800, 780); + +canvas.manager.layers.add( + new MorphLayer() + .setPosition('50%', '50%') + .setColor("rgb(255, 255, 255)") + .setSize(800, 800), + ...[ + { centring: Centring.None, offset: { x: -0.5, y: -0.5 } }, + { centring: Centring.StartTop, offset: { x: -0.5, y: -0.5 } }, + { centring: Centring.Start, offset: { x: -0.5, y: 0 } }, + { centring: Centring.StartBottom, offset: { x: -0.5, y: 0.5 } }, + { centring: Centring.CenterTop, offset: { x: 0, y: 0.5 } }, + { centring: Centring.Center, offset: { x: 0, y: 0 } }, + { centring: Centring.CenterBottom, offset: { x: 0, y: 0.5 } }, + { centring: Centring.EndTop, offset: { x: 0.5, y: -0.5 } }, + { centring: Centring.End, offset: { x: 0.5, y: 0 } }, + { centring: Centring.EndBottom, offset: { x: 0.5, y: 0.5 } } + ].flatMap((centring, index) => { + + const layers = (c: { centring: Centring, offset: { x: number, y: number }}, ind: number) => { + return new Group() + .setID(`gradient-test-${ind}`) + .add( + ...[0, 45, 90, 135, 180, 225, 270, 315].flatMap((angle, index) => { + return [ + new MorphLayer() + .setPosition(50 + 70 * index + 60 * c.offset.x, 50 + 70 * ind + 60 * c.offset.y) + .setSize(60, 60, { all: 5 }) + .setCentring(c.centring) + .setColor( + new Gradient() + .setType(GradientType.Linear) + .addStops({ offset: 0, color: "#ff8a8a" }, { offset: 1, color: "#8aff8a" }) + .setAngle(angle) + ) + .setID(`gradient${angle}deg${ind}`), + ] + }), + ) + } + return [ + layers(centring, index), + new TextLayer() + .setText(`${centring.centring}`) + .setPosition(690, 50 + index * 70) + .setColor("#000") + .setBaseline('middle') + .setFont(FontsList.GeistMono_Black(20)) + .setAlign('center') + ] + }), + ...[0, 45, 90, 135, 180, 225, 270, 315].flatMap((angle) => { + return [ + new TextLayer() + .setPosition(new Link() + .setSource(`gradient${angle}deg9`) + .setType('x') + .setSpacing(-30), `link-y-gradient${angle}deg9-40`) + .setColor("#000") + .setAlign('center') + .setText(`${angle}°`) + .setFont(FontsList.GeistMono_Regular(25)) + ] +}) +) + + +new Exporter(canvas).export('png', { name: 'test', saveAsFile: true }) \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index 35e9e4c..210b166 100644 --- a/test/test.ts +++ b/test/test.ts @@ -12,7 +12,7 @@ import { BezierLayer, QuadraticLayer, Link, - Path2DLayer + Path2DLayer, FontsList, Group } from "../src"; const canvas = new LazyCanvas({ debug: true }) @@ -20,84 +20,126 @@ const canvas = new LazyCanvas({ debug: true }) canvas.manager.layers.add( new MorphLayer() - .setID('morph') - .setPosition('25%', 200) - .setColor("rgb(0, 200, 0)") - .setSize(250, 250) - .setFilters(Filters.blur(10)) - .setRotate(45), - new MorphLayer() - .setPosition(new Link() - .setType('x') - .setSource('bezier') - .setSpacing(-200), 200) - .setColor("rgba(255, 0, 14, 1)") - .setSize(200, 200, - { - all: 30, - rightTop: 40, - rightBottom: 50, - leftTop: 20, - leftBottom: 10 + .setPosition('50%', '50%') + .setColor("rgb(255, 255, 255)") + .setSize(800, 800), + new Group() + .setID('rotation-test') + .add( + new TextLayer() + .setText('rotation') + .setPosition(690, 60) + .setColor("#000") + .setBaseline('middle') + .setFont(FontsList.GeistMono_Black(35)) + .setAlign('center'), + ...[0, 45, 90, 135, 180, 225, 270, 315].flatMap((angle) => { + return [ + new MorphLayer() + .setPosition(50 + 70 * (angle / 45), 50) + .setColor("rgba(0, 0, 0, 0.8)") + .setSize(60, 20, { all: 5 }) + .setRotate(angle) + .setCentring('center') + .setID(`${angle}deg`), + new TextLayer() + .setPosition(`link-x-${angle}deg-0`, `link-y-${angle}deg-60`) + .setColor("#000") + .setAlign('center') + .setText(`${angle}°`) + .setFont(FontsList.GeistMono_Regular(25)) + ]; + }), + ), + new Group() + .setID('filter-test') + .add( + new TextLayer() + .setText('filters') + .setPosition(690, 175) + .setColor("#000") + .setBaseline('middle') + .setFont(FontsList.GeistMono_Black(35)) + .setAlign('center'), + new ImageLayer() + .setPosition(65, 175) + .setSize(90, 90) + .setSrc("https://i.pinimg.com/736x/e8/4a/62/e84a620bd3535da1cd11590057ee7678.jpg"), + new ImageLayer() + .setPosition(165, 175) + .setSize(90, 90) + .setSrc("https://i.pinimg.com/736x/e8/4a/62/e84a620bd3535da1cd11590057ee7678.jpg") + .setFilters(Filters.grayscale(100)), + new ImageLayer() + .setPosition(265, 175) + .setSize(90, 90) + .setSrc("https://i.pinimg.com/736x/e8/4a/62/e84a620bd3535da1cd11590057ee7678.jpg") + .setFilters(Filters.sepia(100)), + new ImageLayer() + .setPosition(365, 175) + .setSize(90, 90) + .setSrc("https://i.pinimg.com/736x/e8/4a/62/e84a620bd3535da1cd11590057ee7678.jpg") + .setFilters(Filters.invert(100)), + new ImageLayer() + .setPosition(465, 175) + .setSize(90, 90) + .setSrc("https://i.pinimg.com/736x/e8/4a/62/e84a620bd3535da1cd11590057ee7678.jpg") + .setFilters(Filters.invert(100)), + ), + new Group() + .setID('gradient-test') + .add( + new TextLayer() + .setText('gradient') + .setPosition(690, 330) + .setColor("#000") + .setBaseline('middle') + .setFont(FontsList.GeistMono_Black(35)) + .setAlign('center'), + ...[0, 45, 90, 135, 180, 225, 270, 315].flatMap((angle) => { + return [ + new MorphLayer() + .setPosition(50 + 70 * (angle / 45), 260) + .setSize(60, 60, { all: 5 }) + .setCentring('center') + .setColor( + new Gradient() + .setType(GradientType.Linear) + .addStops({ offset: 0, color: "#ff8a8a" }, { offset: 1, color: "#8aff8a" }) + .setAngle(angle) + ) + .setID(`gradient${angle}deg`), + new MorphLayer() + .setPosition(`link-x-gradient${angle}deg-0`, `link-y-gradient${angle}deg-70`) + .setSize(60, 60, { all: 5 }) + .setCentring('center') + .setColor( + new Gradient() + .setType(GradientType.Conic) + .setAngle(angle) + .addStops({ offset: 0, color: "#8a8aff" }, { offset: 1, color: "#ff8aff" }) + .setPoints({ x: `link-x-gradient${angle}deg-0`, y: `link-y-gradient${angle}deg-70` }) + ), + new MorphLayer() + .setPosition(`link-x-gradient${angle}deg-0`, `link-y-gradient${angle}deg-140`) + .setSize(60, 60, { all: 5 }) + .setCentring('center') + .setColor( + new Gradient() + .setType(GradientType.Radial) + .addStops({ offset: 0, color: "#8abfff" }, { offset: 1, color: "#8affe0" }) + .setPoints({ x: `link-x-gradient${angle}deg-${angle * 0.1}`, y: `link-y-gradient${angle}deg-140`, r: 5 }, + { x: `link-x-gradient${angle}deg-0`, y: `link-y-gradient${angle}deg-140`, r: 60 }) + ), + new TextLayer() + .setPosition(`link-x-gradient${angle}deg-0`, `link-y-gradient${angle}deg-200`) + .setColor("#000") + .setAlign('center') + .setText(`${angle}°`) + .setFont(FontsList.GeistMono_Regular(25)) + ] }), - new TextLayer() - .setText("Hello, World!") - .setPosition(300, 500) - .setColor("hsl(10, 40%, 50%)") - .setFont("GeistMono", 50, FontWeight.Regular) - .setShadow('#000000', 10, 10, 10) - .setWordSpacing(10) - .setLetterSpacing(10) - .setRotate(45), - new TextLayer() - .setText("Lazy Canvas") - .setPosition(100, 400) - .setColor( - new Gradient() - .setType(GradientType.Radial) - .addPoints( - { x: 155, y: 455, r: 10 }, - { x: 150, y: 450, r: 100 } - ).addStops( - { offset: 0, color: "#ffffff" }, - { offset: 1, color: "rgba(100, 200, 100, 0)" } - ) - ) - .setFont("Geist", 50, FontWeight.Thin) - .setMultiline(true, 200, 500), - new ImageLayer() - .setPosition('70%', '25%') - .setSize(200, 200, { - all: 30, - rightTop: 40, - rightBottom: 50, - leftTop: 20, - leftBottom: 10 - }) - .setSrc("https://i.pinimg.com/1200x/f3/32/19/f332192b2090f437ca9f49c1002287b6.jpg"), - new BezierLayer() - .setID('bezier') - .setPosition('link-x-quadratic-0', 400) - .setControlPoints({ x: 400, y: 450 }, { x: 600, y: 650 }) - .setEndPosition(600, 600) - .setColor("rgb(0, 200, 0)") - .setStroke(5, "round", "round", [20, 10], 0, 10), - new QuadraticLayer() - .setID('quadratic') - .setPosition(400, 400) - .setControlPoint(700, 500) - .setEndPosition(600, 600) - .setColor("rgb(255, 59, 0)") - .setStroke(5, "round", "round", [20, 10], 0, 10), - new LineLayer() - .setPosition(200, 400) - .setEndPosition(600, 600) - .setColor("rgb(0, 200, 0)") - .setStroke(5, "round", "round", [20, 10], 0, 10), - new Path2DLayer() - .setPath('M 50 600 L 150 700 L 250 600 Z') - .setColor("rgb(255, 59, 0)") - .setStroke(5, "round", "round", [20, 10], 0, 10) + ), ) new Exporter(canvas).export('png', { name: 'test', saveAsFile: true }) From 1a1f3786536881e3cd8acef66c9a4b5944f33019 Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Mon, 14 Jul 2025 21:55:10 +0300 Subject: [PATCH 4/8] feat: implement property validation for layer classes and add YAMLReader for file handling --- src/index.ts | 3 +- src/structures/components/BaseLayer.ts | 25 +++++--- src/structures/components/BezierLayer.ts | 25 +++++++- src/structures/components/ClearLayer.ts | 23 +++++--- src/structures/components/ImageLayer.ts | 19 +++++- src/structures/components/LineLayer.ts | 27 ++++++++- src/structures/components/MorphLayer.ts | 28 ++++++++- src/structures/components/Path2DLayer.ts | 23 ++++++++ src/structures/components/QuadraticLayer.ts | 25 +++++++- src/structures/components/TextLayer.ts | 62 ++++++++++++-------- src/structures/helpers/Gradient.ts | 7 +++ src/structures/helpers/index.ts | 1 + src/structures/helpers/readers/JSONReader.ts | 6 +- src/structures/helpers/readers/YAMLReader.ts | 49 ++++++++++++++++ src/utils/utils.ts | 6 +- test/iotest.ts | 4 +- test/test.ts | 2 +- 17 files changed, 274 insertions(+), 61 deletions(-) create mode 100644 src/structures/helpers/readers/YAMLReader.ts diff --git a/src/index.ts b/src/index.ts index 4f37171..f55409b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -41,7 +41,8 @@ export { Link, ILink, Exporter, - JSONReader + JSONReader, + YAMLReader } from "./structures/helpers"; export { Filters } from "./helpers/Filters"; diff --git a/src/structures/components/BaseLayer.ts b/src/structures/components/BaseLayer.ts index 64f135c..dea4383 100644 --- a/src/structures/components/BaseLayer.ts +++ b/src/structures/components/BaseLayer.ts @@ -63,7 +63,7 @@ export interface IBaseLayerProps { /** * The filter effects applied to the layer. */ - filter: string; + filter?: string; /** * The opacity of the layer, ranging from 0 to 1. @@ -83,7 +83,7 @@ export interface IBaseLayerProps { /** * The shadow properties of the layer. */ - shadow: { + shadow?: { /** * The color of the shadow. */ @@ -181,11 +181,7 @@ export class BaseLayer { this.zIndex = misc?.zIndex || 1; this.visible = misc?.visible || true; this.props = props ? props : {} as T; - if (!this.props.x) this.props.x = 0; - if (!this.props.y) this.props.y = 0; - if (!this.props.opacity) this.props.opacity = 1; - if (!this.props.centring) this.props.centring = Centring.Center; - if (!this.props.transform) this.props.transform = {} as Transform; + this.props = this.validateProps(this.props); } /** @@ -347,4 +343,19 @@ export class BaseLayer { props: this.props, }; } + + protected validateProps(data: T): T { + return { + ...data, + x: data.x || 0, + y: data.y || 0, + centring: data.centring || Centring.Center, + filter: data.filter || '', + opacity: data.opacity || 1, + filled: data.filled || false, + fillStyle: data.fillStyle || '#000000', + transform: data.transform || {}, + globalComposite: data.globalComposite || 'source-over', + }; + } } \ No newline at end of file diff --git a/src/structures/components/BezierLayer.ts b/src/structures/components/BezierLayer.ts index f78bfde..f200cfa 100644 --- a/src/structures/components/BezierLayer.ts +++ b/src/structures/components/BezierLayer.ts @@ -96,8 +96,7 @@ export class BezierLayer extends BaseLayer { constructor(props?: IBezierLayerProps, misc?: IBaseLayerMisc) { super(LayerType.BezierCurve, props || {} as IBezierLayerProps, misc); this.props = props ? props : {} as IBezierLayerProps; - if (!this.props.fillStyle) this.props.fillStyle = '#000000'; - this.props.centring = Centring.None; + this.props = this.validateProps(this.props); } /** @@ -262,4 +261,26 @@ export class BezierLayer extends BaseLayer { return { ...data, props: copy } as IBezierLayer; } + + /** + * Validates the properties of the Bezier layer. + * @param data {IBezierLayerProps} - The properties to validate. + * @returns {IBezierLayerProps} The validated properties. + */ + protected validateProps(data: IBezierLayerProps): IBezierLayerProps { + return { + ...super.validateProps(data), + centring: data.centring || Centring.None, + controlPoints: data.controlPoints || [{x: 0, y: 0}, {x: 0, y: 0}], + endPoint: data.endPoint || {x: 0, y: 0}, + stroke: { + width: data.stroke?.width || 1, + cap: data.stroke?.cap || 'butt', + join: data.stroke?.join || 'miter', + dashOffset: data.stroke?.dashOffset || 0, + dash: data.stroke?.dash || [], + miterLimit: data.stroke?.miterLimit || 10, + } + }; + } } \ No newline at end of file diff --git a/src/structures/components/ClearLayer.ts b/src/structures/components/ClearLayer.ts index 191a66d..c45daf7 100644 --- a/src/structures/components/ClearLayer.ts +++ b/src/structures/components/ClearLayer.ts @@ -115,14 +115,8 @@ export class ClearLayer implements IClearLayer { this.type = LayerType.Clear; this.zIndex = misc?.zIndex || 1; this.visible = misc?.visible || true; - this.props = props ? props : { - x: 0, - y: 0, - size: { - width: 0, - height: 0 - } - } as IClearLayerProps; + this.props = props ? props : {} as IClearLayerProps; + this.props = this.validateProps(this.props); } /** @@ -236,4 +230,17 @@ export class ClearLayer implements IClearLayer { props: copy, }; } + + protected validateProps(props: IClearLayerProps): IClearLayerProps { + return { + x: props.x || 0, + y: props.y || 0, + size: { + width: props.size?.width || 0, + height: props.size?.height || 0 + }, + centring: props.centring || 'none', + globalComposite: props.globalComposite || 'source-over' + } + } } \ No newline at end of file diff --git a/src/structures/components/ImageLayer.ts b/src/structures/components/ImageLayer.ts index 90918fd..74e20df 100644 --- a/src/structures/components/ImageLayer.ts +++ b/src/structures/components/ImageLayer.ts @@ -76,7 +76,7 @@ export class ImageLayer extends BaseLayer { constructor(props?: IImageLayerProps, misc?: IBaseLayerMisc) { super(LayerType.Image, props || {} as IImageLayerProps, misc); this.props = props ? props : {} as IImageLayerProps; - this.props.centring = Centring.Center; + this.props = this.validateProps(this.props); } /** @@ -179,4 +179,21 @@ export class ImageLayer extends BaseLayer { return { ...data } as IImageLayer; } + + /** + * Validates the properties of the Image Layer. + * @param data {IImageLayerProps} - The properties to validate. + * @returns {IImageLayerProps} The validated properties. + */ + protected validateProps(data: IImageLayerProps): IImageLayerProps { + return { + ...super.validateProps(data), + src: data.src || '', + size: { + width: data.size?.width || 0, + height: data.size?.height || 0, + radius: data.size?.radius || { all: 0 } + } + } + } } \ No newline at end of file diff --git a/src/structures/components/LineLayer.ts b/src/structures/components/LineLayer.ts index 3c2522d..e763abd 100644 --- a/src/structures/components/LineLayer.ts +++ b/src/structures/components/LineLayer.ts @@ -100,8 +100,7 @@ export class LineLayer extends BaseLayer { constructor(props?: ILineLayerProps, misc?: IBaseLayerMisc) { super(LayerType.Line, props || {} as ILineLayerProps, misc); this.props = props ? props : {} as ILineLayerProps; - if (!this.props.fillStyle) this.props.fillStyle = '#000000'; - this.props.centring = Centring.None; + this.props = this.validateProps(this.props); } /** @@ -234,4 +233,28 @@ export class LineLayer extends BaseLayer { return { ...data, props: copy } as ILineLayer; } + + /** + * Validates the properties of the Line Layer. + * @param data {ILineLayerProps} - The properties to validate. + * @returns {ILineLayerProps} The validated properties. + */ + protected validateProps(data: ILineLayerProps): ILineLayerProps { + return { + ...super.validateProps(data), + centring: data.centring || Centring.None, + endPoint: { + x: data.endPoint?.x || 0, + y: data.endPoint?.y || 0, + }, + stroke: { + width: data.stroke?.width || 1, + cap: data.stroke?.cap || 'butt', + join: data.stroke?.join || 'miter', + dashOffset: data.stroke?.dashOffset || 0, + dash: data.stroke?.dash || [], + miterLimit: data.stroke?.miterLimit || 10, + }, + } + } } \ No newline at end of file diff --git a/src/structures/components/MorphLayer.ts b/src/structures/components/MorphLayer.ts index 481bb39..0e15cca 100644 --- a/src/structures/components/MorphLayer.ts +++ b/src/structures/components/MorphLayer.ts @@ -106,9 +106,7 @@ export class MorphLayer extends BaseLayer { constructor(props?: IMorphLayerProps, misc?: IBaseLayerMisc) { super(LayerType.Morph, props || {} as IMorphLayerProps, misc); this.props = props ? props : {} as IMorphLayerProps; - if (!this.props.fillStyle) this.props.fillStyle = '#000000'; - if (!this.props.filled && this.props.filled !== false) this.props.filled = true; - this.props.centring = Centring.Center; + this.props = this.validateProps(this.props); } /** @@ -255,4 +253,28 @@ export class MorphLayer extends BaseLayer { return { ...data, props: copy } as IMorphLayer; } + + /** + * Validates the properties of the Morph Layer. + * @param data {IMorphLayerProps} - The properties to validate. + * @returns {IMorphLayerProps} The validated properties. + */ + protected validateProps(data: IMorphLayerProps): IMorphLayerProps { + return { + ...super.validateProps(data), + size: { + width: data.size?.width || 100, + height: data.size?.height || 100, + radius: data.size?.radius || {all: 0}, + }, + stroke: { + width: data.stroke?.width || 1, + cap: data.stroke?.cap || 'butt', + join: data.stroke?.join || 'miter', + dashOffset: data.stroke?.dashOffset || 0, + dash: data.stroke?.dash || [], + miterLimit: data.stroke?.miterLimit || 10, + }, + }; + } } \ No newline at end of file diff --git a/src/structures/components/Path2DLayer.ts b/src/structures/components/Path2DLayer.ts index 48c1392..d82a621 100644 --- a/src/structures/components/Path2DLayer.ts +++ b/src/structures/components/Path2DLayer.ts @@ -74,6 +74,7 @@ export class Path2DLayer extends BaseLayer { this.zIndex = misc?.zIndex || 1; this.visible = misc?.visible || true; this.props = props ? props : {} as IPath2DLayerProps; + this.props = this.validateProps(this.props); } @@ -383,4 +384,26 @@ export class Path2DLayer extends BaseLayer { props: this.props }; } + + /** + * Validates the properties of the Path2D Layer. + * @param data {IPath2DLayerProps} - The properties to validate. + * @returns {IPath2DLayerProps} The validated properties. + */ + protected validateProps(data: IPath2DLayerProps): IPath2DLayerProps { + return { + ...super.validateProps(data), + path2D: data.path2D || new Path2D(), + stroke: { + width: data.stroke?.width || 1, + cap: data.stroke?.cap || 'butt', + join: data.stroke?.join || 'miter', + dashOffset: data.stroke?.dashOffset || 0, + dash: data.stroke?.dash || [], + miterLimit: data.stroke?.miterLimit || 10 + }, + loadFromSVG: data.loadFromSVG || false, + clipPath: data.clipPath || false + }; + } } diff --git a/src/structures/components/QuadraticLayer.ts b/src/structures/components/QuadraticLayer.ts index cf5972b..fd83144 100644 --- a/src/structures/components/QuadraticLayer.ts +++ b/src/structures/components/QuadraticLayer.ts @@ -96,8 +96,7 @@ export class QuadraticLayer extends BaseLayer { constructor(props?: IQuadraticLayerProps, misc?: IBaseLayerMisc) { super(LayerType.QuadraticCurve, props || {} as IQuadraticLayerProps, misc); this.props = props ? props : {} as IQuadraticLayerProps; - if (!this.props.fillStyle) this.props.fillStyle = '#000000'; - this.props.centring = Centring.None; + this.props = this.validateProps(this.props); } /** @@ -243,4 +242,26 @@ export class QuadraticLayer extends BaseLayer { return { ...data, props: copy } as IQuadraticLayer; } + + /** + * Validates the properties of the Quadratic Layer. + * @param data {IQuadraticLayerProps} - The properties to validate. + * @returns {IQuadraticLayerProps} The validated properties. + */ + protected validateProps(data: IQuadraticLayerProps): IQuadraticLayerProps { + return { + ...super.validateProps(data), + centring: data.centring || Centring.None, + controlPoints: data.controlPoints || [{ x: 0, y: 0 }], + endPoint: data.endPoint || { x: 0, y: 0 }, + stroke: { + width: data.stroke?.width || 1, + cap: data.stroke?.cap || 'butt', + join: data.stroke?.join || 'miter', + dashOffset: data.stroke?.dashOffset || 0, + dash: data.stroke?.dash || [], + miterLimit: data.stroke?.miterLimit || 10, + } + } + } } \ No newline at end of file diff --git a/src/structures/components/TextLayer.ts b/src/structures/components/TextLayer.ts index 0264726..30d8883 100644 --- a/src/structures/components/TextLayer.ts +++ b/src/structures/components/TextLayer.ts @@ -109,27 +109,27 @@ export interface ITextLayerProps extends IBaseLayerProps { /** * The baseline of the text. */ - baseline: AnyTextBaseline; + baseline?: AnyTextBaseline; /** * The direction of the text. */ - direction: AnyTextDirection; + direction?: AnyTextDirection; /** * The spacing between letters. */ - letterSpacing: number; + letterSpacing?: number; /** * The spacing between words. */ - wordSpacing: number; + wordSpacing?: number; /** * The stroke properties of the text. */ - stroke: { + stroke?: { /** * The width of the stroke. */ @@ -179,25 +179,7 @@ export class TextLayer extends BaseLayer { constructor(props?: ITextLayerProps, misc?: IBaseLayerMisc) { super(LayerType.Text, props || {} as ITextLayerProps, misc); this.props = props ? props : {} as ITextLayerProps; - this.props.align = TextAlign.Left; - this.props.font = { - family: 'Geist', - size: 16, - weight: FontWeight.Regular, - }; - this.props.fillStyle = '#ffffff'; - this.props.filled = true; - this.props.multiline = { - enabled: false, - spacing: 1.1, - }; - this.props.size = { - width: 'vw', - height: 0, - } - this.props.centring = Centring.Center; - this.props.wordSpacing = 0; - this.props.letterSpacing = 0; + this.props = this.validateProps(this.props); } /** @@ -399,8 +381,8 @@ export class TextLayer extends BaseLayer { filters(ctx, this.props.filter); ctx.textAlign = this.props.align; - ctx.letterSpacing = `${this.props.letterSpacing}px`; - ctx.wordSpacing = `${this.props.wordSpacing}px`; + if (this.props.letterSpacing) ctx.letterSpacing = `${this.props.letterSpacing}px`; + if (this.props.wordSpacing) ctx.wordSpacing = `${this.props.wordSpacing}px`; if (this.props.baseline) ctx.textBaseline = this.props.baseline; if (this.props.direction) ctx.direction = this.props.direction; @@ -487,4 +469,32 @@ export class TextLayer extends BaseLayer { return { ...data, props: copy } as ITextLayer; } + + /** + * Validates the properties of the Text Layer. + * @param props {ITextLayerProps} - The properties to validate. + * @returns {ITextLayerProps} The validated properties. + */ + protected validateProps(props: ITextLayerProps): ITextLayerProps { + return { + ...super.validateProps(props), + text: props.text || "", + font: { + family: props.font?.family || "Arial", + size: props.font?.size || 16, + weight: props.font?.weight || FontWeight.Regular, + }, + multiline: { + enabled: props.multiline?.enabled || false, + spacing: props.multiline?.spacing || 1.1, + }, + size: { + width: props.size?.width || "vw", + height: props.size?.height || 0, + }, + align: props.align || TextAlign.Left, + fillStyle: props.fillStyle || "#000000", + filled: props.filled !== undefined ? props.filled : true, + }; + } } diff --git a/src/structures/helpers/Gradient.ts b/src/structures/helpers/Gradient.ts index 9b87283..b4ee488 100644 --- a/src/structures/helpers/Gradient.ts +++ b/src/structures/helpers/Gradient.ts @@ -28,6 +28,9 @@ export interface IGradient { */ stops: Array; + /** + * The angle of the gradient (optional, used for linear gradients). + */ angle?: number; } @@ -90,6 +93,9 @@ export class Gradient implements IGradient { */ stops: Array; + /** + * The angle of the gradient (optional, used for linear gradients). + */ angle?: number; /** * Constructs a new Gradient instance. @@ -100,6 +106,7 @@ export class Gradient implements IGradient { this.type = opts?.props?.type || GradientType.Linear; this.points = opts?.props?.points || []; this.stops = opts?.props?.stops || []; + this.angle = opts?.props?.angle || 0; } /** diff --git a/src/structures/helpers/index.ts b/src/structures/helpers/index.ts index 47b82c8..bd20ba5 100644 --- a/src/structures/helpers/index.ts +++ b/src/structures/helpers/index.ts @@ -4,3 +4,4 @@ export * from "./Gradient"; export * from "./Link"; export * from "./Pattern"; export * from "./readers/JSONReader"; +export * from "./readers/YAMLReader"; \ No newline at end of file diff --git a/src/structures/helpers/readers/JSONReader.ts b/src/structures/helpers/readers/JSONReader.ts index 3b9445f..59e64ac 100644 --- a/src/structures/helpers/readers/JSONReader.ts +++ b/src/structures/helpers/readers/JSONReader.ts @@ -56,7 +56,7 @@ export class JSONReader { if (opts?.debug) LazyLog.log("info", "Reading JSON...\nOptions:", data.options, "\nAnimation:", data.animation, "\nLayers Number:", data.layers.length, "\nLayers:", data.layers); - const layers = JSONReader.layersParse(data.layers); + const layers = JSONReader.layersParse(data.layers, opts); const canvas = new LazyCanvas({ settings: data, debug: opts?.debug }) .create(data.options.width, data.options.height); @@ -100,7 +100,7 @@ export class JSONReader { visible: layer.visible, } if (layer.type === LayerType.Group) { - return new Group(misc).add(...layer.layers.map((l: any) => this.layerParse(l))); + return new Group(misc).add(...layer.layers.map((l: any) => this.layerParse(l, { id: l.id, zIndex: l.zIndex, visible: l.visible }))); } else { return this.layerParse(layer, misc); } @@ -154,7 +154,6 @@ export class JSONReader { case 'gradient': return new Gradient({ props: layer.props.fillStyle as IGradient }); case 'pattern': - console.log('Pattern:', layer.props.fillStyle); return new Pattern() .setType((layer.props.fillStyle as IPattern).type) .setSrc(typeof (layer.props.fillStyle as IPattern).src === 'string' ? (layer.props.fillStyle as IPattern).src : this.read((layer.props.fillStyle as IPattern).src as unknown as IOLazyCanvas)); @@ -162,6 +161,7 @@ export class JSONReader { return layer.props.fillStyle; } } else if ('fillStyle' in layer.props) { + console.log(layer.type, layer); return layer.props.fillStyle || '#000000'; } else { return '#000000'; diff --git a/src/structures/helpers/readers/YAMLReader.ts b/src/structures/helpers/readers/YAMLReader.ts new file mode 100644 index 0000000..86fefd5 --- /dev/null +++ b/src/structures/helpers/readers/YAMLReader.ts @@ -0,0 +1,49 @@ +import { JSONReader } from "./JSONReader"; +import * as _yaml from 'js-yaml'; +import { IOLazyCanvas, LazyCanvas } from "../../LazyCanvas"; +import * as fs from "fs"; +import { LazyError, LazyLog } from "../../../utils/LazyUtil"; +import * as path from "path"; + +export class YAMLReader { + + /** + * Reads a YAML string and converts it to a LazyCanvas object. + * @param data - The YAML string to read. + * @param opts - Optional parameters for debugging. + * @returns A Promise that resolves to a LazyCanvas object. + */ + public static read(data: string, opts?: { debug?: boolean }): LazyCanvas { + const yamlContent = _yaml.load(data) as unknown as IOLazyCanvas + if (opts?.debug) { + LazyLog.log('info', 'YAML content loaded:', yamlContent); + } + if (typeof yamlContent === 'object' && yamlContent !== null) { + return JSONReader.read(yamlContent, opts); + } else { + throw new LazyError("Invalid YAML content: Expected an object."); + } + } + + /** + * Reads a YAML file and converts it to a LazyCanvas object. + * @param filePath - The path to the YAML file. + * @param opts - Optional parameters for debugging. + * @returns A Promise that resolves to a LazyCanvas object. + * @throws LazyError if the file does not exist or has an invalid extension. + */ + public static readFile(filePath: string, opts?: { debug?: boolean }): LazyCanvas { + if (!fs.existsSync(filePath)) { + throw new LazyError(`File not found: ${filePath}`); + } + const ext = path.extname(filePath).toLowerCase(); + if (ext !== '.yaml' && ext !== '.yml') { + throw new LazyError(`Invalid file extension: ${ext}. Expected .yaml or .yml.`); + } + const data = fs.readFileSync(filePath, 'utf8'); + if (opts?.debug) { + LazyLog.log('info', `Reading YAML file: ${filePath}`); + } + return this.read(data, opts); + } +} \ No newline at end of file diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 1d47789..461abd9 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -139,13 +139,13 @@ export function drawShadow(ctx: SKRSContext2D, shadow: any) { } } -export function opacity(ctx: SKRSContext2D, opacity: number) { +export function opacity(ctx: SKRSContext2D, opacity: number = 1) { if (opacity < 1) { ctx.globalAlpha = opacity; } } -export function filters(ctx: SKRSContext2D, filters: string) { +export function filters(ctx: SKRSContext2D, filters: string | null | undefined) { if (filters) { ctx.filter = filters; } @@ -390,7 +390,7 @@ export function resizeLayers(layers: Array, ratio: number) { } } - if ('stroke' in layer.props) { + if ('stroke' in layer.props && layer.props.stroke) { layer.props.stroke.width = resize(layer.props.stroke.width, ratio) as number; } diff --git a/test/iotest.ts b/test/iotest.ts index 326e250..2e8204d 100644 --- a/test/iotest.ts +++ b/test/iotest.ts @@ -1,3 +1,3 @@ -import { JSONReader, Exporter } from "../src" +import { YAMLReader, Exporter } from "../src" -new Exporter(JSONReader.readFile('./test.json', { debug: true })).export('png', { name: 'iotest', saveAsFile: true }) \ No newline at end of file +new Exporter(YAMLReader.readFile('./test.yaml', { debug: false })).export('png', { name: 'iotest', saveAsFile: true }) \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index 210b166..9340d8f 100644 --- a/test/test.ts +++ b/test/test.ts @@ -142,5 +142,5 @@ canvas.manager.layers.add( ), ) -new Exporter(canvas).export('png', { name: 'test', saveAsFile: true }) +new Exporter(canvas).export('yaml', { name: 'test', saveAsFile: true }) From d326a036df23f6dbbcab4d7d9e090a88c21e9bb1 Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Tue, 15 Jul 2025 22:27:25 +0300 Subject: [PATCH 5/8] feat: add post-build script for type definition file handling --- package.json | 6 +++--- scripts/post-build.ts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 scripts/post-build.ts diff --git a/package.json b/package.json index 4e390e4..0289262 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nmmty/lazycanvas", - "version": "0.6.0", + "version": "0.6.0-dev.f33019", "description": "A simple way to interact with @napi-rs/canvas in an advanced way!", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -13,8 +13,8 @@ "iotest": "tsc ./test/iotest.ts && node ./test/iotest.js", "gradient": "tsc ./test/gradient.ts && node ./test/gradient.js", "doc": "tsx docgen.ts", - "font": "tsc ./scripts/font-gen.ts && node ./scripts/font-gen.js", - "build": "tsc" + "font": "tsx ./scripts/font-gen.ts", + "build": "tsc && tsx ./scripts/post-build.ts" }, "repository": { "type": "git", diff --git a/scripts/post-build.ts b/scripts/post-build.ts new file mode 100644 index 0000000..0f45050 --- /dev/null +++ b/scripts/post-build.ts @@ -0,0 +1,32 @@ +import * as fs from 'fs'; +import * as path from 'path'; + +const sourceDir = './src'; +const destinationDir = './dist'; + +function postBuild(source: string, destination: string, extension: string): void { + if (!fs.existsSync(source)) { + console.error(`Source directory "${source}" does not exist.`); + return; + } + + if (!fs.existsSync(destination)) { + fs.mkdirSync(destination, { recursive: true }); + } + + const items = fs.readdirSync(source); + + items.forEach(item => { + const sourcePath = path.join(source, item); + const destinationPath = path.join(destination, item); + + if (fs.statSync(sourcePath).isDirectory()) { + postBuild(sourcePath, destinationPath, extension); + } else if (item.endsWith(extension)) { + fs.copyFileSync(sourcePath, destinationPath); + console.log(`Moved: ${sourcePath} -> ${destinationPath}`); + } + }); +} + +postBuild(sourceDir, destinationDir, '.d.ts'); \ No newline at end of file From 321c2e7aa08412de08bfcb34758c5ed1bfd36b4f Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Fri, 25 Jul 2025 00:08:03 +0300 Subject: [PATCH 6/8] fix: default filled property set to true --- src/structures/components/BaseLayer.ts | 2 +- test/test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/structures/components/BaseLayer.ts b/src/structures/components/BaseLayer.ts index dea4383..31b9324 100644 --- a/src/structures/components/BaseLayer.ts +++ b/src/structures/components/BaseLayer.ts @@ -352,7 +352,7 @@ export class BaseLayer { centring: data.centring || Centring.Center, filter: data.filter || '', opacity: data.opacity || 1, - filled: data.filled || false, + filled: data.filled || true, fillStyle: data.fillStyle || '#000000', transform: data.transform || {}, globalComposite: data.globalComposite || 'source-over', diff --git a/test/test.ts b/test/test.ts index 9340d8f..210b166 100644 --- a/test/test.ts +++ b/test/test.ts @@ -142,5 +142,5 @@ canvas.manager.layers.add( ), ) -new Exporter(canvas).export('yaml', { name: 'test', saveAsFile: true }) +new Exporter(canvas).export('png', { name: 'test', saveAsFile: true }) From 1d5786684b8ca8d543a4533b2b64f8d093b1e426 Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Fri, 15 Aug 2025 16:44:26 +0300 Subject: [PATCH 7/8] fix: default filled property set to true --- .npmignore | 2 +- eslint.config.js => eslint.config.mjs | 0 package.json | 3 +- src/helpers/Utlis.ts | 108 +++++++++++++++++++++++ src/index.ts | 4 + src/structures/components/MorphLayer.ts | 11 +-- src/structures/components/Path2DLayer.ts | 11 +-- src/structures/components/TextLayer.ts | 11 +-- test/animation.ts | 1 - test/logo.ts | 2 - test/test.ts | 3 +- 11 files changed, 120 insertions(+), 36 deletions(-) rename eslint.config.js => eslint.config.mjs (100%) create mode 100644 src/helpers/Utlis.ts diff --git a/.npmignore b/.npmignore index 252158b..aba128f 100644 --- a/.npmignore +++ b/.npmignore @@ -11,4 +11,4 @@ docgen.ts tsconfig.json package-lock.json -eslint.config.js +eslint.config.mjs diff --git a/eslint.config.js b/eslint.config.mjs similarity index 100% rename from eslint.config.js rename to eslint.config.mjs diff --git a/package.json b/package.json index 0289262..d9ce16f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nmmty/lazycanvas", - "version": "0.6.0-dev.f33019", + "version": "0.6.0", "description": "A simple way to interact with @napi-rs/canvas in an advanced way!", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -45,6 +45,7 @@ "@hitomihiumi/micro-docgen": "^0.3.0", "@types/js-yaml": "^4.0.9", "@types/node": "^22.10.2", + "@typescript-eslint/utils": "^8.39.1", "ava": "^6.2.0", "eslint": "^9.23.0", "eslint-config-neon": "^0.2.7", diff --git a/src/helpers/Utlis.ts b/src/helpers/Utlis.ts new file mode 100644 index 0000000..0d18ace --- /dev/null +++ b/src/helpers/Utlis.ts @@ -0,0 +1,108 @@ +import { Group, LineLayer } from "../structures/components"; +import { ColorType } from "../types"; + +const Utils = { + grid(size: { x: number, y: number }, opts?: gridOptions): Group { + + if (size.x === undefined || size.y === undefined) { + throw new Error("Size must have x and y properties"); + } + + if (opts === undefined) opts = {}; + + if (opts.cellWith === undefined) opts.cellWith = 10; + if (opts.cellHeight === undefined) opts.cellHeight = 10; + if (opts.startX === undefined) opts.startX = 0; + if (opts.startY === undefined) opts.startY = 0; + if (opts.endX === undefined) opts.endX = size.x; + if (opts.endY === undefined) opts.endY = size.y; + if (opts.color === undefined) opts.color = 'rgba(0, 0, 0, 0.5)'; + if (opts.lineWidth === undefined) opts.lineWidth = 1; + + const options = { ...opts } as unknown as gridOptionsNormalized; + + return new Group() + .setID(`grid-${options.cellWith}-${options.cellHeight}-${options.startX}-${options.startY}-${options.endX}-${options.endY}`) + .add( + ...Array.from({ length: Math.ceil((options.endX - options.startX) / options.cellWith) }, (_, i) => { + const x = options.startX + i * options.cellWith; + return new LineLayer() + .setPosition(x, options.startY) + .setEndPosition(x, options.endY) + .setColor(options.color) + .setStroke(options.lineWidth); + }), + ...Array.from({ length: Math.ceil((options.endY - options.startY) / options.cellHeight) }, (_, i) => { + const y = options.startY + i * options.cellHeight; + return new LineLayer() + .setPosition(options.startX, y) + .setEndPosition(options.endX, y) + .setColor(options.color) + .setStroke(options.lineWidth); + }) + ) + }, + box(start: { x: number, y: number }, end: { x: number, y: number }, opts?: options): Group { + if (start.x === undefined || start.y === undefined || end.x === undefined || end.y === undefined) { + throw new Error("Start and end must have x and y properties"); + } + + if (opts === undefined) opts = {}; + + if (opts.color === undefined) opts.color = 'rgba(0, 0, 0, 0.5)'; + if (opts.lineWidth === undefined) opts.lineWidth = 1; + + return new Group() + .setID(`box-${start.x}-${start.y}-${end.x}-${end.y}`) + .add( + new LineLayer() + .setPosition(start.x, start.y) + .setEndPosition(end.x, start.y) + .setColor(opts.color) + .setStroke(opts.lineWidth), + new LineLayer() + .setPosition(end.x, start.y) + .setEndPosition(end.x, end.y) + .setColor(opts.color) + .setStroke(opts.lineWidth), + new LineLayer() + .setPosition(end.x, end.y) + .setEndPosition(start.x, end.y) + .setColor(opts.color) + .setStroke(opts.lineWidth), + new LineLayer() + .setPosition(start.x, end.y) + .setEndPosition(start.x, start.y) + .setColor(opts.color) + .setStroke(opts.lineWidth) + ); + } + +} + +interface options { + color?: ColorType; + lineWidth?: number; +} + +interface gridOptions extends options { + cellWith?: number; + cellHeight?: number; + startX?: number; + startY?: number; + endX?: number; + endY?: number; +} + +interface gridOptionsNormalized { + cellWith: number; + cellHeight: number; + startX: number; + startY: number; + endX: number; + endY: number; + color: ColorType; + lineWidth: number; +} + +export { Utils } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index f55409b..3b6e3f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -70,3 +70,7 @@ export type { Transform, Extensions } from "./types"; + +export { + Utils +} from "./helpers/Utlis"; \ No newline at end of file diff --git a/src/structures/components/MorphLayer.ts b/src/structures/components/MorphLayer.ts index 0e15cca..941f755 100644 --- a/src/structures/components/MorphLayer.ts +++ b/src/structures/components/MorphLayer.ts @@ -157,16 +157,7 @@ export class MorphLayer extends BaseLayer { dashOffset: dashOffset || 0, miterLimit: miterLimit || 10, }; - return this; - } - - /** - * Sets whether the Morph Layer should be filled or stroked. - * @param filled {boolean} - If true, the layer will be filled; otherwise, it will be stroked. - * @returns {this} The current instance for chaining. - */ - setFilled(filled: boolean): this { - this.props.filled = filled; + this.props.filled = false; // Ensure filled is false when stroke is set return this; } diff --git a/src/structures/components/Path2DLayer.ts b/src/structures/components/Path2DLayer.ts index d82a621..3341f18 100644 --- a/src/structures/components/Path2DLayer.ts +++ b/src/structures/components/Path2DLayer.ts @@ -190,16 +190,7 @@ export class Path2DLayer extends BaseLayer { dashOffset: dashOffset || 0, miterLimit: miterLimit || 10, }; - return this; - } - - /** - * Sets whether the Path2D Layer should be filled or stroked. - * @param filled {boolean} - If true, the layer will be filled; otherwise, it will be stroked. - * @returns {this} The current instance for chaining. - */ - setFilled(filled: boolean): this { - this.props.filled = filled; + this.props.filled = false; // Ensure filled is false when stroke is set return this; } diff --git a/src/structures/components/TextLayer.ts b/src/structures/components/TextLayer.ts index 30d8883..16cd881 100644 --- a/src/structures/components/TextLayer.ts +++ b/src/structures/components/TextLayer.ts @@ -301,16 +301,7 @@ export class TextLayer extends BaseLayer { dashOffset: dashOffset || 0, miterLimit: miterLimit || 10, }; - return this; - } - - /** - * Sets whether the text layer should be filled or stroked. - * @param filled {boolean} - If true, the layer will be filled; otherwise, it will be stroked. - * @returns {this} The current instance for chaining. - */ - setFilled(filled: boolean): this { - this.props.filled = filled; + this.props.filled = false; // Ensure filled is false when stroke is set return this; } diff --git a/test/animation.ts b/test/animation.ts index e85979d..c678cb5 100644 --- a/test/animation.ts +++ b/test/animation.ts @@ -25,7 +25,6 @@ for (let i = 0; i < 100; i++) { .setPosition(100 + i * 2, 100 + i * 2) .setColor(`hsl(${Math.ceil(300 - (i * 1.5))}, 100%, 50%)`) .setSize(200, 200, { all: 100 - i / 2 }) - .setFilled(false) .setStroke(1, "round", "round") ) ) diff --git a/test/logo.ts b/test/logo.ts index 8f473b7..94b1db8 100644 --- a/test/logo.ts +++ b/test/logo.ts @@ -31,7 +31,6 @@ canvas.manager.layers.add( .setPosition(105, 105) .setColor("#ff8a8a") .setSize(200, 200, { all: 100 }) - .setFilled(false) .setStroke(2.5, "round", "round"), ) ); @@ -42,7 +41,6 @@ for (let i = 1; i < 5; i += 1) { .setPosition(105, 105) .setColor("#ff8a8a") .setSize(185 - (20 * i - (i > 2 ? (i) : 0)), 185 - (20 * i - (i > 2 ? (i) : 0)), { all: 47.5 - (5 * i + (i > 2 ? (i * 0.25) : 0)) }) - .setFilled(false) .setStroke(2.5, "round", "round") .setRotate(45 + (15 * i)), ) diff --git a/test/test.ts b/test/test.ts index 210b166..ed6f057 100644 --- a/test/test.ts +++ b/test/test.ts @@ -12,7 +12,7 @@ import { BezierLayer, QuadraticLayer, Link, - Path2DLayer, FontsList, Group + Path2DLayer, FontsList, Group, Utils } from "../src"; const canvas = new LazyCanvas({ debug: true }) @@ -140,6 +140,7 @@ canvas.manager.layers.add( ] }), ), + Utils.grid({ x: 800, y: 800 }, { lineWidth: 0.5, cellWith: 40, cellHeight: 40 }) ) new Exporter(canvas).export('png', { name: 'test', saveAsFile: true }) From 47079fe96b51f10c8b80a22193e3929ce4aa8108 Mon Sep 17 00:00:00 2001 From: hitomihiumi Date: Sun, 21 Sep 2025 04:02:28 +0300 Subject: [PATCH 8/8] 0.6.0 --- .github/workflows/deploy.yml | 57 + .gitignore | 6 +- .vercelignore | 38 + apps/docs/.eslintrc.json | 8 + apps/docs/.gitignore | 38 + apps/docs/LICENSE | 17 + apps/docs/README.md | 87 ++ apps/docs/biome.json | 30 + apps/docs/next.config.mjs | 64 + apps/docs/package.json | 41 + apps/docs/public/fonts/Inter.ttf | Bin 0 -> 415072 bytes apps/docs/public/images/cover.jpg | Bin 0 -> 71310 bytes apps/docs/public/trademark/icon-dark.svg | 13 + apps/docs/public/trademark/icon-light.svg | 13 + apps/docs/src/app/(docs)/[...slug]/page.tsx | 157 +++ apps/docs/src/app/(docs)/layout.tsx | 16 + apps/docs/src/app/api/navigation/route.ts | 7 + apps/docs/src/app/api/og/fetch/route.ts | 98 ++ apps/docs/src/app/api/og/generate/route.tsx | 133 +++ apps/docs/src/app/api/og/proxy/route.ts | 45 + apps/docs/src/app/changelog/layout.tsx | 20 + apps/docs/src/app/changelog/page.tsx | 130 ++ apps/docs/src/app/error.tsx | 31 + apps/docs/src/app/icon.ico | 13 + apps/docs/src/app/layout.tsx | 181 +++ apps/docs/src/app/not-found.tsx | 15 + apps/docs/src/app/page.tsx | 172 +++ apps/docs/src/app/roadmap/layout.tsx | 20 + apps/docs/src/app/roadmap/page.tsx | 156 +++ apps/docs/src/app/robots.ts | 12 + apps/docs/src/app/sitemap.ts | 16 + apps/docs/src/app/utils/formatDate.ts | 36 + apps/docs/src/app/utils/getNavigation.ts | 149 +++ apps/docs/src/app/utils/utils.ts | 495 ++++++++ .../src/content/LazyCanvas/BasicUsage.mdx | 184 +++ .../Classes/Components/BaseLayer.mdx | 212 ++++ .../Classes/Components/BezierLayer.mdx | 299 +++++ .../Classes/Components/ClearLayer.mdx | 133 +++ .../LazyCanvas/Classes/Components/Group.mdx | 138 +++ .../Classes/Components/ImageLayer.mdx | 254 ++++ .../Classes/Components/LineLayer.mdx | 287 +++++ .../Classes/Components/MorphLayer.mdx | 267 +++++ .../Classes/Components/Path2DLayer.mdx | 449 +++++++ .../Classes/Components/QuadraticLayer.mdx | 308 +++++ .../Classes/Components/TextLayer.mdx | 387 ++++++ .../LazyCanvas/Classes/Components/meta.json | 1 + .../Classes/General/AnimationManager.mdx | 102 ++ .../Classes/General/FontsManager.mdx | 193 +++ .../Classes/General/LayersManager.mdx | 200 ++++ .../LazyCanvas/Classes/General/LazyCanvas.mdx | 147 +++ .../Classes/General/PluginManager.mdx | 134 +++ .../Classes/General/RenderManager.mdx | 85 ++ .../LazyCanvas/Classes/General/meta.json | 1 + .../LazyCanvas/Classes/Helpers/Exporter.mdx | 76 ++ .../LazyCanvas/Classes/Helpers/Font.mdx | 84 ++ .../LazyCanvas/Classes/Helpers/Gradient.mdx | 167 +++ .../LazyCanvas/Classes/Helpers/JSONReader.mdx | 87 ++ .../LazyCanvas/Classes/Helpers/Link.mdx | 72 ++ .../LazyCanvas/Classes/Helpers/Pattern.mdx | 72 ++ .../LazyCanvas/Classes/Helpers/YAMLReader.mdx | 45 + .../LazyCanvas/Classes/Helpers/meta.json | 1 + .../src/content/LazyCanvas/Classes/meta.json | 1 + .../src/content/LazyCanvas/QuickStart.mdx | 24 + .../src/content/LazyCanvas/enums/Centring.mdx | 12 + .../content/LazyCanvas/enums/ColorSpace.mdx | 12 + .../src/content/LazyCanvas/enums/Export.mdx | 12 + .../src/content/LazyCanvas/enums/FillType.mdx | 12 + .../content/LazyCanvas/enums/FontWeight.mdx | 12 + .../enums/GlobalCompositeOperation.mdx | 12 + .../content/LazyCanvas/enums/GradientType.mdx | 12 + .../LazyCanvas/enums/LayerScaleType.mdx | 12 + .../content/LazyCanvas/enums/LayerType.mdx | 12 + .../src/content/LazyCanvas/enums/LineCap.mdx | 12 + .../src/content/LazyCanvas/enums/LineJoin.mdx | 12 + .../src/content/LazyCanvas/enums/LinkType.mdx | 12 + .../content/LazyCanvas/enums/PatternType.mdx | 12 + .../content/LazyCanvas/enums/TextAlign.mdx | 12 + .../content/LazyCanvas/enums/TextBaseline.mdx | 12 + .../LazyCanvas/enums/TextDirection.mdx | 12 + .../src/content/LazyCanvas/enums/meta.json | 1 + .../interfaces/GradientColorStop.mdx | 14 + .../LazyCanvas/interfaces/GradientPoint.mdx | 14 + .../interfaces/IAnimationManager.mdx | 14 + .../interfaces/IAnimationOptions.mdx | 14 + .../LazyCanvas/interfaces/IBaseLayer.mdx | 14 + .../LazyCanvas/interfaces/IBaseLayerMisc.mdx | 14 + .../LazyCanvas/interfaces/IBaseLayerProps.mdx | 14 + .../LazyCanvas/interfaces/IBezierLayer.mdx | 14 + .../interfaces/IBezierLayerProps.mdx | 14 + .../LazyCanvas/interfaces/IClearLayer.mdx | 14 + .../interfaces/IClearLayerProps.mdx | 14 + .../content/LazyCanvas/interfaces/IFont.mdx | 14 + .../content/LazyCanvas/interfaces/IFonts.mdx | 14 + .../LazyCanvas/interfaces/IFontsManager.mdx | 14 + .../LazyCanvas/interfaces/IGradient.mdx | 14 + .../content/LazyCanvas/interfaces/IGroup.mdx | 14 + .../LazyCanvas/interfaces/IGroupProps.mdx | 12 + .../LazyCanvas/interfaces/IImageLayer.mdx | 14 + .../interfaces/IImageLayerProps.mdx | 14 + .../LazyCanvas/interfaces/ILayersManager.mdx | 14 + .../LazyCanvas/interfaces/ILazyCanvas.mdx | 14 + .../interfaces/ILazyCanvasOptions.mdx | 14 + .../interfaces/ILazyCanvasPlugin.mdx | 14 + .../LazyCanvas/interfaces/ILineLayer.mdx | 14 + .../LazyCanvas/interfaces/ILineLayerProps.mdx | 14 + .../content/LazyCanvas/interfaces/ILink.mdx | 14 + .../LazyCanvas/interfaces/IMorphLayer.mdx | 14 + .../interfaces/IMorphLayerProps.mdx | 14 + .../LazyCanvas/interfaces/IOLazyCanvas.mdx | 14 + .../LazyCanvas/interfaces/IPath2DLayer.mdx | 14 + .../interfaces/IPath2DLayerProps.mdx | 14 + .../LazyCanvas/interfaces/IPattern.mdx | 14 + .../LazyCanvas/interfaces/IPluginHooks.mdx | 14 + .../LazyCanvas/interfaces/IPluginManager.mdx | 14 + .../LazyCanvas/interfaces/IQuadraticLayer.mdx | 14 + .../interfaces/IQuadraticLayerProps.mdx | 14 + .../LazyCanvas/interfaces/IRenderManager.mdx | 14 + .../LazyCanvas/interfaces/ITextLayer.mdx | 14 + .../LazyCanvas/interfaces/ITextLayerProps.mdx | 14 + .../LazyCanvas/interfaces/Transform.mdx | 12 + .../content/LazyCanvas/interfaces/meta.json | 1 + apps/docs/src/content/LazyCanvas/meta.json | 1 + .../content/LazyCanvas/types/AnyCentring.mdx | 11 + .../LazyCanvas/types/AnyColorSpace.mdx | 11 + .../content/LazyCanvas/types/AnyExport.mdx | 11 + .../content/LazyCanvas/types/AnyFilter.mdx | 11 + .../types/AnyGlobalCompositeOperation.mdx | 11 + .../LazyCanvas/types/AnyGradientType.mdx | 11 + .../src/content/LazyCanvas/types/AnyLayer.mdx | 11 + .../content/LazyCanvas/types/AnyLineCap.mdx | 11 + .../content/LazyCanvas/types/AnyLineJoin.mdx | 11 + .../content/LazyCanvas/types/AnyLinkType.mdx | 11 + .../LazyCanvas/types/AnyPatternType.mdx | 11 + .../content/LazyCanvas/types/AnyTextAlign.mdx | 11 + .../LazyCanvas/types/AnyTextBaseline.mdx | 11 + .../LazyCanvas/types/AnyTextDirection.mdx | 11 + .../content/LazyCanvas/types/AnyWeight.mdx | 11 + .../content/LazyCanvas/types/ColorType.mdx | 11 + .../content/LazyCanvas/types/Extensions.mdx | 11 + .../content/LazyCanvas/types/JSONLayer.mdx | 11 + .../src/content/LazyCanvas/types/Point.mdx | 14 + .../content/LazyCanvas/types/PointNumber.mdx | 14 + .../content/LazyCanvas/types/ScaleType.mdx | 11 + .../LazyCanvas/types/StringColorType.mdx | 11 + .../src/content/LazyCanvas/types/meta.json | 1 + .../content/LazyCanvas/types/radiusCorner.mdx | 11 + .../content/LazyCanvas/variables/Filters.mdx | 24 + .../LazyCanvas/variables/FontsList.mdx | 105 ++ .../content/LazyCanvas/variables/Utils.mdx | 14 + .../content/LazyCanvas/variables/meta.json | 1 + apps/docs/src/content/meta.json | 5 + apps/docs/src/product/CustomTable.module.scss | 5 + apps/docs/src/product/CustomTable.tsx | 162 +++ apps/docs/src/product/Footer.tsx | 38 + apps/docs/src/product/Header.tsx | 198 ++++ apps/docs/src/product/PageList.tsx | 120 ++ apps/docs/src/product/Providers.tsx | 43 + apps/docs/src/product/RouteGuard.tsx | 58 + apps/docs/src/product/Sidebar.module.scss | 19 + apps/docs/src/product/Sidebar.tsx | 377 ++++++ apps/docs/src/product/index.ts | 6 + apps/docs/src/product/mdx.tsx | 248 ++++ apps/docs/src/resources/changelog.js | 3 + apps/docs/src/resources/custom.css | 17 + apps/docs/src/resources/icons.ts | 89 ++ apps/docs/src/resources/index.ts | 20 + apps/docs/src/resources/once-ui.config.js | 171 +++ apps/docs/src/resources/roadmap.js | 183 +++ apps/docs/tsconfig.json | 28 + docgen.ts | 27 - package.json | 63 +- packages/lazycanvas/.gitignore | 7 + .npmignore => packages/lazycanvas/.npmignore | 0 LICENSE => packages/lazycanvas/LICENSE | 0 ReadMe.md => packages/lazycanvas/ReadMe.md | 0 packages/lazycanvas/docgen.ts | 67 ++ .../lazycanvas/eslint.config.mjs | 0 packages/lazycanvas/package.json | 60 + packages/lazycanvas/resources/BasicUsage.mdx | 184 +++ packages/lazycanvas/resources/QuickStart.mdx | 24 + .../resources}/fonts/Geist-Black.ttf | Bin .../resources}/fonts/Geist-Bold.ttf | Bin .../resources}/fonts/Geist-ExtraBold.ttf | Bin .../resources}/fonts/Geist-ExtraLight.ttf | Bin .../resources}/fonts/Geist-Light.ttf | Bin .../resources}/fonts/Geist-Medium.ttf | Bin .../resources}/fonts/Geist-Regular.ttf | Bin .../resources}/fonts/Geist-SemiBold.ttf | Bin .../resources}/fonts/Geist-Thin.ttf | Bin .../resources}/fonts/GeistMono-Black.ttf | Bin .../resources}/fonts/GeistMono-Bold.ttf | Bin .../resources}/fonts/GeistMono-Light.ttf | Bin .../resources}/fonts/GeistMono-Medium.ttf | Bin .../resources}/fonts/GeistMono-Regular.ttf | Bin .../resources}/fonts/GeistMono-SemiBold.ttf | Bin .../resources}/fonts/GeistMono-Thin.ttf | Bin .../resources}/fonts/GeistMono-UltraBlack.ttf | Bin .../resources}/fonts/GeistMono-UltraLight.ttf | Bin .../lazycanvas/resources}/fonts/LICENSE.txt | 0 .../lazycanvas/resources}/logo.svg | 0 .../lazycanvas/scripts}/FontsGenerate.md | 0 .../lazycanvas/scripts}/font-gen.ts | 0 .../lazycanvas/scripts}/post-build.ts | 0 packages/lazycanvas/scripts/post-docgen.ts | 38 + .../lazycanvas/src}/helpers/Filters.ts | 0 .../lazycanvas/src}/helpers/Fonts.ts | 0 .../lazycanvas/src}/helpers/FontsList.ts | 0 .../lazycanvas/src}/helpers/Utlis.ts | 0 packages/lazycanvas/src/helpers/index.ts | 3 + packages/lazycanvas/src/index.ts | 6 + .../lazycanvas/src}/structures/LazyCanvas.ts | 101 +- .../src}/structures/components/BaseLayer.ts | 32 +- .../src}/structures/components/BezierLayer.ts | 42 +- .../src}/structures/components/ClearLayer.ts | 30 +- .../src}/structures/components/Group.ts | 21 +- .../src}/structures/components/ImageLayer.ts | 28 +- .../src}/structures/components/LineLayer.ts | 40 +- .../src}/structures/components/MorphLayer.ts | 40 +- .../src}/structures/components/Path2DLayer.ts | 122 +- .../structures/components/QuadraticLayer.ts | 44 +- .../src}/structures/components/TextLayer.ts | 77 +- .../src}/structures/components/index.ts | 0 .../src}/structures/helpers/Exporter.ts | 59 +- .../src}/structures/helpers/Font.ts | 8 +- .../src}/structures/helpers/Gradient.ts | 25 +- .../src}/structures/helpers/Link.ts | 10 +- .../src}/structures/helpers/Pattern.ts | 10 +- .../src/structures/helpers/index.ts | 7 + .../structures/helpers/readers/JSONReader.ts | 24 +- .../structures/helpers/readers/YAMLReader.ts | 8 +- .../structures/managers/AnimationManager.ts | 22 +- .../src}/structures/managers/FontsManager.ts | 29 +- .../src}/structures/managers/LayersManager.ts | 47 +- .../src/structures/managers/PluginManager.ts | 372 ++++++ .../src}/structures/managers/RenderManager.ts | 52 +- .../src/structures/managers/index.ts | 5 + .../lazycanvas/src}/types/enum.ts | 0 .../lazycanvas/src}/types/index.ts | 2 +- .../lazycanvas/src}/types/types.d.ts | 0 .../lazycanvas/src}/utils/LazyUtil.ts | 0 .../lazycanvas/src}/utils/utils.ts | 14 +- .../lazycanvas/test}/animation.ts | 0 .../lazycanvas/test}/centring.ts | 0 .../lazycanvas/test}/gradient.ts | 0 {test => packages/lazycanvas/test}/iotest.ts | 0 {test => packages/lazycanvas/test}/logo.ts | 0 {test => packages/lazycanvas/test}/test.ts | 0 {test => packages/lazycanvas/test}/text.ts | 0 packages/lazycanvas/tsconfig.json | 26 + packages/micro-docgen/.gitignore | 9 + packages/micro-docgen/.npmignore | 15 + packages/micro-docgen/.prettierrc | 9 + packages/micro-docgen/CODE_OF_CONDUCT.md | 128 ++ packages/micro-docgen/CONTRIBUTING.md | 100 ++ packages/micro-docgen/LICENSE | 23 + packages/micro-docgen/README.md | 45 + packages/micro-docgen/bin/index.js | 5 + .../examples/awesome-widgets/README.md | 15 + .../classes/Awesome Widgets/ButtonWidget.md | 25 + .../docs/classes/Awesome Widgets/Widget.md | 30 + .../examples/awesome-widgets/docs/docs.json | 1 + .../docs/types/Awesome Widgets/WidgetProps.md | 10 + .../examples/awesome-widgets/generator.ts | 24 + .../examples/awesome-widgets/src/index.ts | 6 + .../awesome-widgets/src/widgets/Button.ts | 26 + .../awesome-widgets/src/widgets/Widget.ts | 32 + .../examples/awesome-widgets/tsconfig.json | 9 + .../micro-docgen/examples/markdown/README.md | 17 + .../markdown/docs/Welcome/Introduction.md | 17 + .../classes/Markdown Example/MyLibrary.mdx | 27 + .../examples/markdown/generator.ts | 23 + .../examples/markdown/lib/MyLibrary.ts | 45 + .../examples/markdown/lib/index.ts | 1 + .../examples/markdown/tsconfig.json | 9 + packages/micro-docgen/micro-docgen.json | 10 + packages/micro-docgen/package.json | 58 + packages/micro-docgen/scripts/generate.ts | 42 + packages/micro-docgen/src/cli/index.ts | 40 + packages/micro-docgen/src/docs.ts | 1041 +++++++++++++++++ .../src/generators/MarkdownGenerator.ts | 344 ++++++ packages/micro-docgen/src/generators/index.ts | 1 + packages/micro-docgen/src/index.ts | 5 + .../src/serializers/AbstractSerializer.ts | 7 + .../src/serializers/ClassSerializer.ts | 249 ++++ .../src/serializers/FunctionSerializer.ts | 69 ++ .../src/serializers/TypesSerializer.ts | 101 ++ .../micro-docgen/src/serializers/index.ts | 4 + packages/micro-docgen/src/utils/helpers.ts | 278 +++++ packages/micro-docgen/src/utils/index.ts | 3 + packages/micro-docgen/src/utils/json.ts | 7 + packages/micro-docgen/src/utils/links.ts | 85 ++ packages/micro-docgen/src/utils/md.ts | 98 ++ packages/micro-docgen/tsconfig.json | 22 + plugins/example/.gitignore | 2 + plugins/example/Hooks.md | 449 +++++++ plugins/example/ReadMe.md | 373 ++++++ plugins/example/package.json | 39 + plugins/example/src/index.ts | 161 +++ plugins/example/test/test.ts | 91 ++ .../example/tsconfig.json | 0 pnpm-workspace.yaml | 3 + src/index.ts | 76 -- src/structures/helpers/index.ts | 7 - vercel.json | 19 + 304 files changed, 15163 insertions(+), 617 deletions(-) create mode 100644 .github/workflows/deploy.yml create mode 100644 .vercelignore create mode 100644 apps/docs/.eslintrc.json create mode 100644 apps/docs/.gitignore create mode 100644 apps/docs/LICENSE create mode 100644 apps/docs/README.md create mode 100644 apps/docs/biome.json create mode 100644 apps/docs/next.config.mjs create mode 100644 apps/docs/package.json create mode 100644 apps/docs/public/fonts/Inter.ttf create mode 100644 apps/docs/public/images/cover.jpg create mode 100644 apps/docs/public/trademark/icon-dark.svg create mode 100644 apps/docs/public/trademark/icon-light.svg create mode 100644 apps/docs/src/app/(docs)/[...slug]/page.tsx create mode 100644 apps/docs/src/app/(docs)/layout.tsx create mode 100644 apps/docs/src/app/api/navigation/route.ts create mode 100644 apps/docs/src/app/api/og/fetch/route.ts create mode 100644 apps/docs/src/app/api/og/generate/route.tsx create mode 100644 apps/docs/src/app/api/og/proxy/route.ts create mode 100644 apps/docs/src/app/changelog/layout.tsx create mode 100644 apps/docs/src/app/changelog/page.tsx create mode 100644 apps/docs/src/app/error.tsx create mode 100644 apps/docs/src/app/icon.ico create mode 100644 apps/docs/src/app/layout.tsx create mode 100644 apps/docs/src/app/not-found.tsx create mode 100644 apps/docs/src/app/page.tsx create mode 100644 apps/docs/src/app/roadmap/layout.tsx create mode 100644 apps/docs/src/app/roadmap/page.tsx create mode 100644 apps/docs/src/app/robots.ts create mode 100644 apps/docs/src/app/sitemap.ts create mode 100644 apps/docs/src/app/utils/formatDate.ts create mode 100644 apps/docs/src/app/utils/getNavigation.ts create mode 100644 apps/docs/src/app/utils/utils.ts create mode 100644 apps/docs/src/content/LazyCanvas/BasicUsage.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/BaseLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/BezierLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/ClearLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/Group.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/ImageLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/LineLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/MorphLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/Path2DLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/QuadraticLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/TextLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Components/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/Classes/General/AnimationManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/General/FontsManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/General/LayersManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/General/LazyCanvas.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/General/PluginManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/General/RenderManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/General/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/Exporter.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/Font.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/Gradient.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/JSONReader.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/Link.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/Pattern.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/YAMLReader.mdx create mode 100644 apps/docs/src/content/LazyCanvas/Classes/Helpers/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/Classes/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/QuickStart.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/Centring.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/ColorSpace.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/Export.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/FillType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/FontWeight.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/GlobalCompositeOperation.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/GradientType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/LayerScaleType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/LayerType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/LineCap.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/LineJoin.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/LinkType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/PatternType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/TextAlign.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/TextBaseline.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/TextDirection.mdx create mode 100644 apps/docs/src/content/LazyCanvas/enums/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/GradientColorStop.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/GradientPoint.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IAnimationManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IAnimationOptions.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IBaseLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IBaseLayerMisc.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IBaseLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IBezierLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IBezierLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IClearLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IClearLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IFont.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IFonts.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IFontsManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IGradient.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IGroup.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IGroupProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IImageLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IImageLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ILayersManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ILazyCanvas.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ILazyCanvasOptions.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ILazyCanvasPlugin.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ILineLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ILineLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ILink.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IMorphLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IMorphLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IOLazyCanvas.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IPath2DLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IPath2DLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IPattern.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IPluginHooks.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IPluginManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IQuadraticLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IQuadraticLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/IRenderManager.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ITextLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/ITextLayerProps.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/Transform.mdx create mode 100644 apps/docs/src/content/LazyCanvas/interfaces/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyCentring.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyColorSpace.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyExport.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyFilter.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyGlobalCompositeOperation.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyGradientType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyLineCap.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyLineJoin.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyLinkType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyPatternType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyTextAlign.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyTextBaseline.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyTextDirection.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/AnyWeight.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/ColorType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/Extensions.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/JSONLayer.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/Point.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/PointNumber.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/ScaleType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/StringColorType.mdx create mode 100644 apps/docs/src/content/LazyCanvas/types/meta.json create mode 100644 apps/docs/src/content/LazyCanvas/types/radiusCorner.mdx create mode 100644 apps/docs/src/content/LazyCanvas/variables/Filters.mdx create mode 100644 apps/docs/src/content/LazyCanvas/variables/FontsList.mdx create mode 100644 apps/docs/src/content/LazyCanvas/variables/Utils.mdx create mode 100644 apps/docs/src/content/LazyCanvas/variables/meta.json create mode 100644 apps/docs/src/content/meta.json create mode 100644 apps/docs/src/product/CustomTable.module.scss create mode 100644 apps/docs/src/product/CustomTable.tsx create mode 100644 apps/docs/src/product/Footer.tsx create mode 100644 apps/docs/src/product/Header.tsx create mode 100644 apps/docs/src/product/PageList.tsx create mode 100644 apps/docs/src/product/Providers.tsx create mode 100644 apps/docs/src/product/RouteGuard.tsx create mode 100644 apps/docs/src/product/Sidebar.module.scss create mode 100644 apps/docs/src/product/Sidebar.tsx create mode 100644 apps/docs/src/product/index.ts create mode 100644 apps/docs/src/product/mdx.tsx create mode 100644 apps/docs/src/resources/changelog.js create mode 100644 apps/docs/src/resources/custom.css create mode 100644 apps/docs/src/resources/icons.ts create mode 100644 apps/docs/src/resources/index.ts create mode 100644 apps/docs/src/resources/once-ui.config.js create mode 100644 apps/docs/src/resources/roadmap.js create mode 100644 apps/docs/tsconfig.json delete mode 100644 docgen.ts create mode 100644 packages/lazycanvas/.gitignore rename .npmignore => packages/lazycanvas/.npmignore (100%) rename LICENSE => packages/lazycanvas/LICENSE (100%) rename ReadMe.md => packages/lazycanvas/ReadMe.md (100%) create mode 100644 packages/lazycanvas/docgen.ts rename eslint.config.mjs => packages/lazycanvas/eslint.config.mjs (100%) create mode 100644 packages/lazycanvas/package.json create mode 100644 packages/lazycanvas/resources/BasicUsage.mdx create mode 100644 packages/lazycanvas/resources/QuickStart.mdx rename {resources => packages/lazycanvas/resources}/fonts/Geist-Black.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-Bold.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-ExtraBold.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-ExtraLight.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-Light.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-Medium.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-Regular.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-SemiBold.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/Geist-Thin.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-Black.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-Bold.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-Light.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-Medium.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-Regular.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-SemiBold.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-Thin.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-UltraBlack.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/GeistMono-UltraLight.ttf (100%) rename {resources => packages/lazycanvas/resources}/fonts/LICENSE.txt (100%) rename {resources => packages/lazycanvas/resources}/logo.svg (100%) rename {scripts => packages/lazycanvas/scripts}/FontsGenerate.md (100%) rename {scripts => packages/lazycanvas/scripts}/font-gen.ts (100%) rename {scripts => packages/lazycanvas/scripts}/post-build.ts (100%) create mode 100644 packages/lazycanvas/scripts/post-docgen.ts rename {src => packages/lazycanvas/src}/helpers/Filters.ts (100%) rename {src => packages/lazycanvas/src}/helpers/Fonts.ts (100%) rename {src => packages/lazycanvas/src}/helpers/FontsList.ts (100%) rename {src => packages/lazycanvas/src}/helpers/Utlis.ts (100%) create mode 100644 packages/lazycanvas/src/helpers/index.ts create mode 100644 packages/lazycanvas/src/index.ts rename {src => packages/lazycanvas/src}/structures/LazyCanvas.ts (65%) rename {src => packages/lazycanvas/src}/structures/components/BaseLayer.ts (89%) rename {src => packages/lazycanvas/src}/structures/components/BezierLayer.ts (86%) rename {src => packages/lazycanvas/src}/structures/components/ClearLayer.ts (85%) rename {src => packages/lazycanvas/src}/structures/components/Group.ts (87%) rename {src => packages/lazycanvas/src}/structures/components/ImageLayer.ts (86%) rename {src => packages/lazycanvas/src}/structures/components/LineLayer.ts (85%) rename {src => packages/lazycanvas/src}/structures/components/MorphLayer.ts (85%) rename {src => packages/lazycanvas/src}/structures/components/Path2DLayer.ts (67%) rename {src => packages/lazycanvas/src}/structures/components/QuadraticLayer.ts (84%) rename {src => packages/lazycanvas/src}/structures/components/TextLayer.ts (83%) rename {src => packages/lazycanvas/src}/structures/components/index.ts (100%) rename {src => packages/lazycanvas/src}/structures/helpers/Exporter.ts (70%) rename {src => packages/lazycanvas/src}/structures/helpers/Font.ts (92%) rename {src => packages/lazycanvas/src}/structures/helpers/Gradient.ts (91%) rename {src => packages/lazycanvas/src}/structures/helpers/Link.ts (86%) rename {src => packages/lazycanvas/src}/structures/helpers/Pattern.ts (86%) create mode 100644 packages/lazycanvas/src/structures/helpers/index.ts rename {src => packages/lazycanvas/src}/structures/helpers/readers/JSONReader.ts (89%) rename {src => packages/lazycanvas/src}/structures/helpers/readers/YAMLReader.ts (87%) rename {src => packages/lazycanvas/src}/structures/managers/AnimationManager.ts (79%) rename {src => packages/lazycanvas/src}/structures/managers/FontsManager.ts (85%) rename {src => packages/lazycanvas/src}/structures/managers/LayersManager.ts (76%) create mode 100644 packages/lazycanvas/src/structures/managers/PluginManager.ts rename {src => packages/lazycanvas/src}/structures/managers/RenderManager.ts (79%) create mode 100644 packages/lazycanvas/src/structures/managers/index.ts rename {src => packages/lazycanvas/src}/types/enum.ts (100%) rename {src => packages/lazycanvas/src}/types/index.ts (55%) rename {src => packages/lazycanvas/src}/types/types.d.ts (100%) rename {src => packages/lazycanvas/src}/utils/LazyUtil.ts (100%) rename {src => packages/lazycanvas/src}/utils/utils.ts (97%) rename {test => packages/lazycanvas/test}/animation.ts (100%) rename {test => packages/lazycanvas/test}/centring.ts (100%) rename {test => packages/lazycanvas/test}/gradient.ts (100%) rename {test => packages/lazycanvas/test}/iotest.ts (100%) rename {test => packages/lazycanvas/test}/logo.ts (100%) rename {test => packages/lazycanvas/test}/test.ts (100%) rename {test => packages/lazycanvas/test}/text.ts (100%) create mode 100644 packages/lazycanvas/tsconfig.json create mode 100644 packages/micro-docgen/.gitignore create mode 100644 packages/micro-docgen/.npmignore create mode 100644 packages/micro-docgen/.prettierrc create mode 100644 packages/micro-docgen/CODE_OF_CONDUCT.md create mode 100644 packages/micro-docgen/CONTRIBUTING.md create mode 100644 packages/micro-docgen/LICENSE create mode 100644 packages/micro-docgen/README.md create mode 100644 packages/micro-docgen/bin/index.js create mode 100644 packages/micro-docgen/examples/awesome-widgets/README.md create mode 100644 packages/micro-docgen/examples/awesome-widgets/docs/classes/Awesome Widgets/ButtonWidget.md create mode 100644 packages/micro-docgen/examples/awesome-widgets/docs/classes/Awesome Widgets/Widget.md create mode 100644 packages/micro-docgen/examples/awesome-widgets/docs/docs.json create mode 100644 packages/micro-docgen/examples/awesome-widgets/docs/types/Awesome Widgets/WidgetProps.md create mode 100644 packages/micro-docgen/examples/awesome-widgets/generator.ts create mode 100644 packages/micro-docgen/examples/awesome-widgets/src/index.ts create mode 100644 packages/micro-docgen/examples/awesome-widgets/src/widgets/Button.ts create mode 100644 packages/micro-docgen/examples/awesome-widgets/src/widgets/Widget.ts create mode 100644 packages/micro-docgen/examples/awesome-widgets/tsconfig.json create mode 100644 packages/micro-docgen/examples/markdown/README.md create mode 100644 packages/micro-docgen/examples/markdown/docs/Welcome/Introduction.md create mode 100644 packages/micro-docgen/examples/markdown/docs/classes/Markdown Example/MyLibrary.mdx create mode 100644 packages/micro-docgen/examples/markdown/generator.ts create mode 100644 packages/micro-docgen/examples/markdown/lib/MyLibrary.ts create mode 100644 packages/micro-docgen/examples/markdown/lib/index.ts create mode 100644 packages/micro-docgen/examples/markdown/tsconfig.json create mode 100644 packages/micro-docgen/micro-docgen.json create mode 100644 packages/micro-docgen/package.json create mode 100644 packages/micro-docgen/scripts/generate.ts create mode 100644 packages/micro-docgen/src/cli/index.ts create mode 100644 packages/micro-docgen/src/docs.ts create mode 100644 packages/micro-docgen/src/generators/MarkdownGenerator.ts create mode 100644 packages/micro-docgen/src/generators/index.ts create mode 100644 packages/micro-docgen/src/index.ts create mode 100644 packages/micro-docgen/src/serializers/AbstractSerializer.ts create mode 100644 packages/micro-docgen/src/serializers/ClassSerializer.ts create mode 100644 packages/micro-docgen/src/serializers/FunctionSerializer.ts create mode 100644 packages/micro-docgen/src/serializers/TypesSerializer.ts create mode 100644 packages/micro-docgen/src/serializers/index.ts create mode 100644 packages/micro-docgen/src/utils/helpers.ts create mode 100644 packages/micro-docgen/src/utils/index.ts create mode 100644 packages/micro-docgen/src/utils/json.ts create mode 100644 packages/micro-docgen/src/utils/links.ts create mode 100644 packages/micro-docgen/src/utils/md.ts create mode 100644 packages/micro-docgen/tsconfig.json create mode 100644 plugins/example/.gitignore create mode 100644 plugins/example/Hooks.md create mode 100644 plugins/example/ReadMe.md create mode 100644 plugins/example/package.json create mode 100644 plugins/example/src/index.ts create mode 100644 plugins/example/test/test.ts rename tsconfig.json => plugins/example/tsconfig.json (100%) create mode 100644 pnpm-workspace.yaml delete mode 100644 src/index.ts delete mode 100644 src/structures/helpers/index.ts create mode 100644 vercel.json diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..94483f7 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,57 @@ +name: Deploy to Vercel + +on: + push: + branches: + - main + - master + paths: + - 'apps/docs/**' + pull_request: + branches: + - main + - master + paths: + - 'apps/docs/**' + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build docs + run: pnpm --filter docs build + + - name: Deploy to Vercel + uses: amondnet/vercel-action@v25 + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-org-id: ${{ secrets.ORG_ID }} + vercel-project-id: ${{ secrets.PROJECT_ID }} + working-directory: ./apps/docs + vercel-args: '--prod' + if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') + + - name: Deploy Preview to Vercel + uses: amondnet/vercel-action@v25 + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-org-id: ${{ secrets.ORG_ID }} + vercel-project-id: ${{ secrets.PROJECT_ID }} + working-directory: ./apps/docs + if: github.event_name == 'pull_request' diff --git a/.gitignore b/.gitignore index e7faeaf..935355d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ -/.idea -/dist /node_modules -/public -/resources/img -/package-lock.json +pnpm-lock.yaml \ No newline at end of file diff --git a/.vercelignore b/.vercelignore new file mode 100644 index 0000000..336c5ff --- /dev/null +++ b/.vercelignore @@ -0,0 +1,38 @@ +# Dependencies +node_modules +.pnp +.pnp.js + +# Testing +coverage + +# Next.js +.next/ +out/ + +# Production +build/ +dist/ + +# Misc +.DS_Store +*.tsbuildinfo + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Vercel +.vercel + +# Other packages in monorepo +packages/ +plugins/ +!apps/docs/ diff --git a/apps/docs/.eslintrc.json b/apps/docs/.eslintrc.json new file mode 100644 index 0000000..e506540 --- /dev/null +++ b/apps/docs/.eslintrc.json @@ -0,0 +1,8 @@ +{ + "extends": "next/core-web-vitals", + "rules": { + "react-hooks/exhaustive-deps": "off", + "react-hooks/rules-of-hooks": "off", + "@next/next/no-img-element": "off" + } +} diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore new file mode 100644 index 0000000..f053e5b --- /dev/null +++ b/apps/docs/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +package-lock.json \ No newline at end of file diff --git a/apps/docs/LICENSE b/apps/docs/LICENSE new file mode 100644 index 0000000..d475385 --- /dev/null +++ b/apps/docs/LICENSE @@ -0,0 +1,17 @@ +Creative Commons Attribution-NonCommercial 4.0 International +CC BY-NC 4.0 + +By using this work, you agree to the following terms: + +You are free to: +- **Share** — copy and redistribute the material in any medium or format +- **Adapt** — remix, transform, and build upon the material + +Under the following conditions: +- **Attribution** — You must give appropriate credit, provide a link to the license, and indicate if changes were made. +- **NonCommercial** — You may not use the material for **commercial purposes**. + +No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +Full license text available at: +[creativecommons.org](https://creativecommons.org/licenses/by-nc/4.0/legalcode) \ No newline at end of file diff --git a/apps/docs/README.md b/apps/docs/README.md new file mode 100644 index 0000000..8a2d758 --- /dev/null +++ b/apps/docs/README.md @@ -0,0 +1,87 @@ +# Magic Docs + +Magic Docs by Once UI is a simple, modern, MDX-based documentation system built with Next.js. It automatically generates navigation based on the MDX files in the content directory. It comes with a built-in roadmap and changelog. + +View the demo [here](https://docs.once-ui.com). + +![Magic Docs](public/images/cover.jpg) + +## Getting started + +**1. Clone the repository** +``` +git clone https://github.com/once-ui-system/magic-docs.git +``` + +**2. Install dependencies** +``` +npm install +``` + +**3. Run dev server** +``` +npm run dev +``` + +**4. Edit config** +``` +src/resources/once-ui.config.js +``` + +**5. Create documentation pages** +``` +Add new .mdx files to src/content/ +``` + +Read the full documentation [here](https://docs.once-ui.com/magic-docs/quick-start). + +## Features + +### Once UI +- All tokens, components & features of [Once UI](https://once-ui.com) available through NPM + +### SEO +- Automatic open-graph and X image generation with next/og +- Automatic schema and metadata generation based on the content file + +### Pages +- Roadmap: when enabled, task progress is displayed in the homepage +- Changelog: when enabled, last changes are displayed in the homepage + +### Design +- Responsive layout optimized for all screen sizes +- Timeless design without heavy animations and motion +- Endless customization options through [Once UI](https://docs.once-ui.com/once-ui/contexts/themeProvider) +- Light and dark mode support with system preference detection + +### Navigation +- Organized documentation structure with nested categories +- Searchable content with command palette (Cmd+K / Ctrl+K) +- Automatically generated, responsive sidebar + +Magic Docs was built with [Once UI](https://once-ui.com) for [Next.js](https://nextjs.org). It requires Node.js v18.17+. + +## Creators + +Lorant One: [Threads](https://www.threads.net/@lorant.one) / [LinkedIn](https://www.linkedin.com/in/lorant-one/) + +## Get involved + +- Join the Design Engineers Club on [Discord](https://discord.com/invite/5EyAQ4eNdS) and share your project with us! +- Deployed your docs? Share it on the [Once UI Hub](https://once-ui.com/hub) too! We feature our favorite apps on our landing page. + +## Magic Docs + +This project is built with [Magic Docs](https://once-ui.com/products/magic-docs). Build your own documentation with Magic Docs for free! + +## License + +Distributed under the CC BY-NC 4.0 License. +- Attribution is required. +- Commercial usage is not allowed. +- You can extend the license to [Dopler CC](https://dopler.app/license) by purchasing a [Once UI Pro](https://once-ui.com/pricing) license. + +See `LICENSE.txt` for more information. + +## Deploy with Vercel +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fonce-ui-system%2Fmagic-docs&project-name=magic-docs&repository-name=magic-docs&redirect-url=https%3A%2F%2Fgithub.com%2Fonce-ui-system%2Fmagic-docs&demo-title=Magic%20Docs&demo-description=Showcase%20your%20designers%20or%20developer%20portfolio&demo-url=https%3A%2F%2Fdemo.magic-docs.com&demo-image=%2F%2Fraw.githubusercontent.com%2Fonce-ui-system%2Fmagic-docs%2Fmain%2Fpublic%2Fimages%2Fcover.jpg) \ No newline at end of file diff --git a/apps/docs/biome.json b/apps/docs/biome.json new file mode 100644 index 0000000..a46611a --- /dev/null +++ b/apps/docs/biome.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100 + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { "recommended": true } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs new file mode 100644 index 0000000..e3e9b64 --- /dev/null +++ b/apps/docs/next.config.mjs @@ -0,0 +1,64 @@ +/** @type {import('next').NextConfig} */ +import withMDX from '@next/mdx' + +const withMDXConfig = withMDX({ + extension: /\.mdx?$/, + options: { + remarkPlugins: [], + rehypePlugins: [], + }, +}) + +const nextConfig = { + sassOptions: { + compiler: "modern", + silenceDeprecations: ["legacy-js-api"], + }, + pageExtensions: ["ts", "tsx", "md", "mdx"], + transpilePackages: ["next-mdx-remote"], + output: 'standalone', + experimental: { + serverMinification: true, + serverActions: { + bodySizeLimit: '2mb', + }, + // Optimize package imports for react-icons + optimizePackageImports: ['react-icons'], + }, + // Configure image optimization + images: { + formats: ['image/avif', 'image/webp'], + remotePatterns: [ + { + protocol: 'https', + hostname: '**', + }, + ], + }, + // Reduce webpack cache size + webpack: (config, { dev, isServer }) => { + // Only enable source maps in development + if (!dev) { + config.devtool = false; + } + + // Optimize bundle size + config.optimization = { + ...config.optimization, + moduleIds: 'deterministic', + }; + + // Disable persistent caching in production to reduce size + if (!dev) { + config.cache = false; + } + + return config; + }, + // Disable webpack cache in production + generateBuildId: async () => { + return `build-${Date.now()}`; + }, +}; + +export default withMDXConfig(nextConfig); diff --git a/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 0000000..9634faa --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,41 @@ +{ + "name": "@once-ui-system/docs", + "version": "2.0.0", + "scripts": { + "dev": "next dev", + "build": "rimraf .next/cache && next build", + "start": "next start", + "lint": "next lint", + "export": "next export", + "deploy": "vercel --prod", + "deploy:preview": "vercel" + }, + "dependencies": { + "@mdx-js/loader": "^3.1.0", + "@next/mdx": "^15.3.1", + "@once-ui-system/core": "^1.4.31", + "@once-ui-system/docs": "link:", + "classnames": "^2.5.1", + "eslint": "^9.21.0", + "eslint-config-next": "15.3.1", + "gray-matter": "^4.0.3", + "next": "15.3.1", + "next-mdx-remote": "^5.0.0", + "react": "19.0.0", + "react-dom": "19.0.0", + "react-icons": "^5.2.1", + "sass": "^1.77.6", + "sharp": "^0.33.4" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "19.0.1", + "@types/react-dom": "19.0.2", + "rimraf": "^6.0.1", + "typescript": "^5" + }, + "overrides": { + "@types/react": "19.0.1", + "@types/react-dom": "19.0.2" + } +} diff --git a/apps/docs/public/fonts/Inter.ttf b/apps/docs/public/fonts/Inter.ttf new file mode 100644 index 0000000000000000000000000000000000000000..15e908f2369fa5d21d9465604ba876934317666f GIT binary patch literal 415072 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�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°5f7E99gJX}y6i4F%1>oVM z1Al{?(UGGiIM^bcwy>_t$&p-ph4#ZiVE(@fzg@DaCUU+yNd{SBuBLSv`QEJhSX0Trpt#7Tm4}- zzt?_V+vW;!-6li{$j=mt!xfB(zM9bnk3x0!jORsjyiDFF{wRzDQ^=kMv4XzYgBNUU=`$`iwmz?A&77x63yJ z7Z~dHG6Gk~&a~{QKRR`2*|fv;yH)$>+v^6@)()tBT~l$6Z)|`4@=)XcP|y8-S|Y}GH}2=P|K9bfe&6+}d;A?1ElF#4?ZpZJ zmUI{Nk7M>hvi0?hC?bnjnGHvaf@C$%$D-<@zzpIzIFIQ{% zkq{DbXr?)og#v94)JI^xY4dOq2Pz-{tU}ex3xW57{CmApPzjO92Rxj}fJlm0LZ|}* z=6nFjO&iU^>cCq2s8RM+hgihu z+=7u6{qte2gYU_YT7fIZH522xzWwnleUBmEyf1yEWvUU#5S{E8iymVyIu+?lty=91 zuk^5D?x#KsyNjEg$WNVG2i}g`NkT)Nis7UF9IR{d<@YkZJ>0?H5u(# zi*+%K<`urax+ejxn+FglGLY}X&-gxk3;S?B--n+$GOyl;@ZtY~oke*+p|Jc&5N73n z<-bpp@9n$40x5og7r4A;(OwgIxz&O-#L^ z)XWCX2Hu)T_)VlO%hC6{w&VQa-EjlsLz6;^rhKiv^T<<*`IIacRAaog6I#7+Gk-ra ztCKKIIkWM8e8c57g?PKEzVB zcPffS`4luT%o*?emzMAPJ?xk0hZlCJeiow(6!s!Ep-W;_g5D2Be>dgfCehm&e>@@% zj6+)N$Qw$ufA@%$7D3o-ak-r3uzi`;o>)g|j`OsPu(lq>wTEzx{I`p7iTtL9$Op7gyx_8f4u9cZFL3qtte5uPYA@FfCWMZwzU{kB zLHhHiAcIbb?Yoo@T_vXN{H(yJf|EnHU~lBSKlTehFfjPSRe9PV$4LZLg1_H8#!3eq zW7QjX>|k-*w^O@=weHRfu0v>dZ^w(5Pa5q$>1lVa^9U<*J&tw$5ZVnqBJ#nxth(vnK_eT#Ep(?qfkMKnQEdxc*(I8hGi z5e91!a4iu+jkt{n7S4%>jyJ;*CBjLF*Qs}Ch|{^Att=R{;m!q1%gUC{ziY$b{5I{L zWrc)jFSf6B?AQC?*zf5>sy1A^;2O{GuhaK(r@7gw zt#Qq8weq>y>1x%VceNUQ6x(-V1WR0x{$J;2jC9a3M%(p=Kd^w`{~lB6cv$`lc;+u$ z$A2|+=GwKh*Q{+_vu5Tx`RmrUH8a+%p4ql~#%e4$5ixG3#6hM7Xj1^4Ea9LiA-IfH z!$HQuU7*-h;;3v9*Y92EPkVkeiTYsgl@S zZwA+-Gq`#Ln71&(rXw0m(LVfK`-t5^jBNqJ|4a`)Xwp7sQKlgya&t$}AJ%}-qK=bp z^+8@vKlJHJeFTPu;=1;m{*2M0Y=yv05fC&CC5!~OPZ+46kwP{A7~Sje0cdL+i-3y@ z4e5rEo9M`p*wEN+!QBAKs;87PGzO$H;5sL$aaF*1m;iw1G4e9+Ft6X;@$;)K*9`R% zOJ09n8|)qLg|;d`iFRFPrmu)$&+sp1JS-Yg&7%z^oKQtvD^wdZ=q=tmy}Y4`MQu~ft<(V zLnRX+eR#C-Rl?q{l;QH8^;d&SuP66;xDHH*x6^~klI<-#cyefm^*|6z?8 z{YH*B0uFP_yD=Dt4tbXpnJR|hy7KNX6!>4tyTPFR*Y0D!^O;V)5_5L%MnCo_y~GR3 zmyjWFR^j(E;AJN2GDQgeejdMDblxT&n@Ip(gp?s|g5uVlkBClsvN-|Jg%p`W0}Tg7 zp1=&;kv)#`dsqUc4CgS`>)UUoP0nVN!28zVeJOZfhmVbjw{RaDGV+mEq7luA;+=hL zaLQ4Vqd+M|Td%#tQpLh=wWHD|?HDy6S)C%@XL^_K8*mK#0OiseHylC{HHqwJ(kOo< z{PqtBPJpil60^8B2KWU9nuFvKg+=A%MMdx^yYs_Srl!onLoyJI`B$7YRL2DQZ&Cns z97IPp>6RRKv%nUbcWCduj&jzNgQjsfBew~9<_VF^5lt2 z^53dA>7ChJMV-N7q4{}BiZWGVeiDRH#e{UIcZ0T_BAZ}%@KOEHF(2f8>F5!l5iv=W zIWXQ57t=i|0{GkA5&{!CTIGL@R)LvKx?216MB~nJk0Q9Z;qdtTa*D^7#>R0dgbBqQ z3gJO%f&5k#+D#G1o2uB>^z=*wv!|uk&b^7+KS(|&eSo>}fhjk;IMbb>9bOkqXoJE) zSPRp=ECB@wSzaNoN%AOPUtfP;|6l}Zli8QK1GG6{gjbOEcG6j&GXk|wyXT(jTmIjv zkJOl6^?gVB%WKv*gVz@#Oorz?7zAk9DBK8o5}@eAevG3RxhnO(Qnn3p;*lH49fsrK z@lwQDT)!BCjx6y&*Wp1&o&ibpmYlpA%Chb&_6y&%sc9@r=xFe~&~*bFdh<0!V>E;F zI6Z{Y;=%4Yf#%0ECni}kfpt*9>!^^gO(v;Hf%Ae%sxte++<@goa2mcn%stR5Gsupo zRe9H3L|)CiwWz){7Me`JY3Q0vmDZ4ZV9)dQvn)NmcFr=Qt-Ix2!0hRPQ~HjL=ZPlb@n z&lOlOBqY`%$!jNNI?SXH9NTUtA^j7A}}q@Ub`~ z$YGE)aqbj4cKAIo3*Px)#6#Kx^kUXU`<}lX=a2LeI|m(tpOD10a@W-BA!S3T_E=8Qd2i@7Bjfbnw;Edr$l0>#L>Qo zFU35RB$yuPb8wdn^?JSzXq=5Apx@Uiqlc+S2oZ^va8I@q<1mEu%+p4AoS95J9>3%9 zC)uKf7lw~5VJy9>*e)yIuiO6C6HjgaljR&+KC|ZOh8v4gP#N03-DrEHk;5?nr>?v0 zu_%D84OmqalqpC79!J!4X%ehk60~4(dI>sBuU(|>L~>wayvG-o83@eeHDRQvGZKnP zrDx>q!s_&)V~2mXU;!)J)pq-F<@;U*OC~*CGgDi0&hn?tPt86um2%w+&tomO@U{Gz z5PyxeJWF24QlT4=+%XFnax~OCXE%+sS4^R>qzo;WXUyU5Z|Cbm~ z7Bl*$n?@(}?wufyVY6!M=H1vkAwCuTbH^&GB|G;?~kJQXSP<$9>yyW zV@$ZspTj>XR`7Vt!ngr~PP7|GDj?JV_X9UnCQqkJ(j;HN31N&z#am)yAZrE%ha%F> z&ka+F40$#ShZg2=eSkd6A#WH0ugk*^mS=5`-OWn3iG#LHn6)cC$Fy7OoxLk)>uzy= z|HbNi-+p_^ck-P5SPgl#U$}@457(yw9Dq22daml ze%Cxs^_cL8n8h~W$O1M(ara+bBYb^qcweb=oRe&50~1ED8g@=Oq3gSVj|=C#>+0&~+r7{3S>N9tU7Zyq4` zaUDea5hLX~XtclBwMCATw!dKvKqLg%GdfVKjoi2y!Lf8!iBA2|yQs zaZ~^f?G}Ko*+Jxu0Z~l0vIR44+`9F~rCaX#?EF1H-gc+f{_s2&ux8HebvG~ik@Z;j z)s7ustOj+D$NTS-CtxZPq6l@^Fl=;Fm#uJ~bzL+#- zVYGCD?TDFF)p$0O-Nlw@hX-o=i&niIn;jjMB~NI7@Z34}$Hi~VUibm(!V(t!5wAe{ z6Vye9B#A8Uv!K<0d583E)7Z#s7}xE=mSAs5^XV{n@b4Yj+&pq*ON%VEJLR1dd9Z%@ zM4Hn!$V4uzy%@n(oDdbr!4@c3g*pShh$s#eX#vIvF%f|gfvRs5t-xS7xsCfsfc@sAaEXpQWU`WRfRpL#w}@HS_Bl_Eh^` z_H>1IQ`^@Qv{Lr;gfEsXx;#=VrOrWK1?BbL4=6(IOV+&q`_iRAl$`NO35|H+m1R3iH5ONX*g#;L#DTo%U!lG{|i&Ea6&oaeE zmZiMa-b+4B@9>tVqJ`&m*&`XO9wd%=c%$w=tfTpRSuGlY9jpsg#5ltBgO@i@|51+L z_J~%xT`5*C1;)|yy3WOlQ`{wfwPN!60{|8vUBT9M$OzXI!@QYJZ*eTti|OnnmAM&D zNqArWf8@Ole3#?f_+8P%zx#K;UjKi+-aDU;^Ei&{@pC?0 z*Li(vR`}=BPO;C(oLBc0=3hSpbMilV2Ig-bfnmWeJB3r<7d~?M#6CZ2eAXE|jRm+4 zb+QrY+xnXs&Zn$SWml#;4AbcmhxP>9l67lGGLL&n@ZJ+zCy}&$x0tpjYt^wfA?Zu& z({>#|(u_9LmD@G4k^Fr- z+dgAuPHd*~-c&8GV+N?(p|`kh{&8J9r@Z<))$+|yRqDpECQxghW;|BTOy=DJt?08d z_fj{vdMvkTmcg(W;raAUXk{_}+tfC=n3wq@kES2*9yQ{%Jzh9>>N>U@`adrf)NfA7 zkR;V7eH3p?h4*VW@6d?ZlLyR=3vZW^P`^|VyRUZFp%G@PuHyXcoE#g8rB*?I4%?g% z@`H!DBf=U9-#D}egU|Q$bs4YFP0ZotiN2Y0)7YCHdE}Zb97o3}qUv_?_d z)KMcZSo+?wXAd2^Z|a$;hdoe|9JJqv`EBgC#D3(zv){ZK4<@rF`r!@k>tMf$bJ)B} zopW>c>L*ucj~RYh(PhI^TeNT5uiZ?$L{i4gj8W6>m~-X2xfufn#)mdvu|Crn)@S;^ za4cB1X-GfSIz3}B$HMNCF&9l5IJ;|jyWzbCH)#-Dw#nX)yK`=YtJa(w?UGO8yr3m^ zjIZrdQA#G*b`R%+V!*$Cm8iNazE3;*RxJ;xGFht<=iD^tWOZJf>`|%hJA}4=;Jg99 zOe-x+IJ0HYlB(^9otC=Oe{rAJ9rL61dHkH4&boH_wP)Ql=%UMV2d3I19uwT%eBhnmG4C}iO+i< zeEiU>s?YNW4=rA|@KCay<3rcV!@BJ7wteT0#&obn8yu0QKlEo^_EX{fuX*5k`y|o9 zL#lk?y2beY)}gknS@RNp^KAFQYeIfsQ}6dd#~FXf^;Yt{we=e-oFuf_>2aNn0mI`o z{IuCNdvj?{W77@#9c-}&fBEZ{39?Q0gHDg*+r<=5Z5!P-rpOsz-1gYxhmPwy^0eYM z%}z=i6Q9-}9q8|&uQIpe{69LbJqGm4wtrH0nxAz!ZQ0;62=+$61F>n1{$~9V`v$FTkSbmV z4m~OU$GfvCZQP*CQhJX&vvpj0+_(YxX?@Nbbiycg=NXyfW7>A=f7--zVq$Pyx|s~q zF4*R6B0ZDiLwyuFDOcORiM=N6GB_+M?&vK0ek7A3e{@yY;k2e$UaGC%r>?8g?blkR zws-%!>p9o8jA_!ijmglLA6#(BB|jt;^zU~i`y#UTd56XC{@52SJE)dxmO34mo<7K&Ecy$d66vVD+~KKGbfrtM|F3pP;jWgZeEW=={i-m(Ni3m+|YIog56@;T=qri7F=KUl{p<_ z2Nmj`S&Osnu4eXeQEE>*4lk(*cr#P zIJMkcJF?LUC2zyy(|mxl6M;mFYqjuT~6@u z_$Ny-*w_E<*r&bhnm509MA9v-dpd7kJ9A~+z__bNT^?%p+coED=i3(*xEJ84Y*<{? z<-B8(e&O4zWQcrLFltFCe0~4=gQFrI418rb&))HZ0{r#M4>3#IJa7N{U-m~l7|IV8 z+CPmhbdy!8vzGI2zjXg!rX&4`5neAD=9kD2|0Q@3w#X3g3#gGHfB0AXn2meMa?u}o zr2k?4Kv(I0B<>Jd^d~NsW4t$|$KkwhC16 zh(PWiz}g&({tj;r#~vA;pAE_d8pxu+p}IKh6r}m{*@j}a;gAez&=%O12JK1rhjEmh zUc21NSsnjL*2?J9+1|@-So<(M>Rev?jsBKpDo(F`3BI-EghiorE#WKV9Rrtz@>>!< zPdW?o^`*>NQpY?eY2-g_%4LXomu(sV*)SBQ%MfP~+$}@u^wrjyt816n)v5EvRLYtE zJ!(HavYv|_cLn>UA#{TX=)v(H22=1YWXEk$JIP%rY4vI6VM(#D7Je`c#-Han`~`kX zbhV`H&AM`DA^Y@SsI57i$65i-I}+hN#xctKd%RYh3;&4P_5VaJkb=HWoU2E2+EM8v z%l=Qtt*xU8+3?46exJwj$>Uu9jPu$f+(X!a{oCo#2J5qx`IGOVx`7z(Tiw|I^_(F~ zy!G6hNPArSULWknBhwF=e?qEU7d)ot%dzfhGWx&FQ`k9+bMNoiB2(Ql>dimNd_=wN zV8j1Otc|1an%4ey5T}bKj61%p!9YL|06F-Q!C>?%KgfQ z{0=r43+Hg$Z(!erba)pXT3RpTrc3TWVw}u$R&(wC?^1B2eLq!Fj>K&wBmNgDz_x+{ zzTjlzf5LfOMg;jK6xOHzBK)gu@P^R7Y4F$E*Whj$!Ee?G8wO6QlW{g<=YNl(rnS6b zx=Dn7kKeB!2yY`K&bK`ZSec=K@}yvhj6Xpl+$Q*KDGY`6>7zpK`MsUr;D8j=QCsaC zsQs-z?SEL8@6JVMzC=)F%P*@#W`ye8RWENt-C1Tq0ew#5wfDek=d9ZI2%m!ILOe{k z)5;MpfPJuuw5cPQ7e?L&(xbuZoJ0BzuysS&{Mvi4HOn-TI9qNWmg6nNtzL_*^M>`u zS#>0}3;vvz1~!cy>(lpOZ7j5D^Qkmo1^SDbhYXcVchfN#xAv{?mcn5BqKxD7n?#s1 zVHbRXoNaepDl<&8`Z)5JN;iFJZFx|C6~}VuzvsyPYvZh$&he@(Jv#rd(tdlcooM8% zIERnqi=)y#kHHq^|>^7Z5BAYW#Q5Hha<0f)1TuPr1lZQb{746 zkWhZGJc0aPrhn~ogj2zm<<(L9D{aAoAoH1+`R_5r?ayyo5^c}6@~ZxxbHq{ww6)BJ z+Iu~FU4Jhz^<`#pNTy!4E^Mm5uYF6Ga~_2-;||AXh4MzSqQd8J&ynYYJBahZ1Fq#G z^ZyI+y#FK{v|;TWf%7~24uW<=@%lW%*+;~Ka(|Vk|5xx={FUs#&k&8OW$|FXd`g!>4OCF}|VDU;f({*#Q=$9?BKcMbAc zw227aUDDU>LVp5ZoL}iP{Di(D=^1#J_Esm}8?gP6a=0F9Z95rX-wLL?dyk^8E&Yo- z(DMMt_j9lzy8Kvdd`;i-B(`G}@w2Hjl=P4IZHRv>X9dn8>?fURZ!KbW#pazGIG1g1 z!*5j$w&P?Xu@#P`zU+oC%%l;}H zNZrG~$>{qZi1R4Pxpluw{Kf`#qs`fRw{fMxXcm?JC37-LeziLl|r(l(P zG245I40l^g%%AVYwUy3#_Ioe3r#bhXf4%vXvYhLD zj{kS^o51gYdC`Wo``xh;<9#EY{4U%pI>?!akI{o1ul?{H=kl?T#dg12huef} zjCbeBDb7u#$4XkDHP_jbGRDi6zJU>3x5x(jWM9iV?-)7BjztB>-s~7%CD6ZY)LI66 zU(4mROP6{rrLe&yuIUzXz4J}&4~NI~CS!9pwi;s7V(%SOWisc}m2M(-dTKFopraAX}D|0nhCz-Ot4b8durhViR1 zd4O@P2W;qfWxexxGMsz=aN@&>Pv9Oj93~h?9)JO`A;c8IDU6R5!IZ#>?C(Fz{He_C zE-iR|d679@qV#_GUT=_hZQML7MGm9eY{Ni1Qf@J?$?6a<6V^DN%1y9}_;W|g|DCMP zm(@Ww$W~_>jO00%eh?vZ^>E0SQKU!d9x}(7AalH8nG<-9KEx4erm-({lw7FS$R+SV zfNkVFf565M^K4yNFio8E^lTX7rgAQ&5?(0x!Rzp3h?fX0Prx(qP$;zJcfxJ(->LJy zd6Vgf2c^V9zv2w%Qr?}Kh@BBK(NC9Bi;cT&WTeaNkh@PtdZ}C&Cjj>``bD$p%d9pZ z$u(-L3^MCD{#%1A;$AYHbwWqE=g2+oH*%YIl6+)NtbK!YpV-<`)PLzS>L78cC zC4(@-%$E#3SvsRP16?!G3AHt5dR^S@gDm-`I4D2U*3k<{kCAaYfqJ%Vg(UD>*~wfc zr!}X$(-*W5Qfq^L#~6t za2rhKp1ss;mRksK|Np`^s7DXwnv*5PoF)U9#Z1@7$?05ogG?*NjH97D$I22V*`!nG zXQb$tPy&226>yw%cNa*I_WSO z#5!R^$WQYV$p2Qd{Zzs}@CGv9OSbowoNUV)%tJm}o@#W0Jk=yhp7I}-Zh>Wz5oinT zxyOXbK)r|i+zfe;aHW2V^->P7#>?ZXA?MHl$K_sr71vIVj5jyPL>_frpud%gw#TaJ|$b5=gHRkxPK21uRp~~ z7kR8v7m9lWwk7I{^&Fc2wQLsZmH z?1pg}F7Y{B^9w`V>f9jLTJ)kns88GQ$a#%F#p~z8ZF@R2kNsD3!ohYo^QFNtfZ)6- za_1oYqtgT`GDmbrqcs`Ckxpy?7Ik(_^)sgd2N6$6Y&maBWTu}Xd5%;(w z=WFWcXX@usf?;U>#LiWlqvlwToU1r8?lz*W54Qh87{obhtlo~D)AyoJUAva!b%{M@ zjJxJDW?Kf2*TwDFbKUr|J-(r_-udM1s~?-S^@9A>*kx!u)%wEuV7bg<&x@mB3~yKc zINxEN^}3G;?KoPnobiMs$E@(LZhR^zysN09xK8bJI~HEpuY>kN6ue2@Yf%eAv7WzT=TK>U(C3t-7akuBuQTLT4v^TD$&vqD_uE*xPePvN2=KHyZ zBDiN9%YK>9aXQx>EmN>P(Y=B`i=}|^8sB%g zAvs=ine5*Y>=WF_dt}#8md$v=X!5iCGrGAjxWY*!h&08kX8dd^wQ}@ZZZ|Dhhw^cmOj|C3?Y_YsCBwbvh>w;T{;e{{f}RC-JcoJV z0^W|EZJILf(T;t$jxmLfawC1H#Gt-0G9TF-_dI#hspfcmK>zPOxrlk3QD%o+uSYQ+ zM&DXz$$KVR)^o3TxWPNzU+j43VQOCqw(;!!+0Osld%3-D+VNlJsr|RfdsLcpPA{_e ze*XuKK~pJca49-&lBvP5T*fgQ{!TqRE>d4VH2-YJJMDcwcs(-4%Kj)g^7;&3m!WGi zc+Y(nJ=hD5W!dp8#U`7X`0pJJ)K* z^g?6nc09>m>%lQ9uKVDzKJwbP_qF=_<`MUR;JxfIblKlGJ6`-H``>OO_Y>|F!8r@( zTWs3nZ*AJTY3Q z-U6uRoLwZX*>|mY2C7Y?VeH3B^6qB5uu?h&4oD~N#lhbz=NbAq%=@v;H*+6-*qH_geBM=dsPPT(4f< z1^v!{WtJXRyMy{gPE*b$#t31uccaXp&s7Llh#c%iI0vqUt0BKGe&7Sj==Mk~X`a-q zVLu*hEOOvG*ah#vOXS-+ya*Y@>X{6;BFn1PHQS&KJONgQH^FM20jrD8kkl*%dV4j~ zS(%JCZuj%#cTETALizcSS7)atjJy-AFX~-MuZR7SZo+^*uo*?49V-^w@3ionl%=ka z*kGTPz9zp<4biax280+-I1wgM_HrGE+LPV`{Q$WG6>t{z8v*MP)+`6M>%fQb8C1hv z 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 OjmHWL#ayG2%l$8Kz(UFZ literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/cover.jpg b/apps/docs/public/images/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d34e95ef42b6cb9a1879f0306e6ab3172cc585d3 GIT binary patch literal 71310 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

EWnt0b<)W7yKSRwvipq|1gvu7>E_79MOrN zGf`{(sUCJ30I3Cv5G0Kp5%cJIdFbH7XIWfnBcc2)%TgOjZ*o#|Mt%(SeHk9QY{5`b z_kA_ewEKaD((f<_XW90AXeL@S)c0WI(>_*aXp4>nG?D=#B#3G$KHWHE_SF2KB33=r zF$P9>xpc{j9=Vv!6rCd;WkEFcZJH0Z9<n`7K!`lp*)_qSU^Rn+X8MPs&o|tYn*6%g8L?%bnA@s9Vk=!3 zcFNiRKA!uyjb)K454JyS!2L!)&jQnJ;V5-Lg)zIS%#m$;_&vuOgD zt@9Q*bizqBOU0>wOwO|C!DD3BG+xhwl^h|*4!$xM$r9qzuxBn-txL}h&TqKa+&Yf5}uK$DNyPu~=BhQ4BYhw&dvB&C)Ge-(Th({T(44YZyTGw0R zr6g^4jWvjFEXR0S7ON7->wv>Ugo|&co z=n6&vRN0PD+ zf$uyTw00d3b1e>?WjBLfC4xoaCv#}foy_Q{mjp(>oNz}qlPFtU%7Za z1G5S4m3&r(d)2cQI`J)`UKz_KV_}v98bpa!PL7gz2dx8FHDXH-9^U<~#J=pC6Pp2? zMK3bWvrSWL;gV9fVuROpvQ%-(T+vvyNzQB(o5MCNL|gZI=#4mA`MLXyFD@vh=CZ4rKlK{YCx5{8F1rwgHnAPX1l8@a z(j~jupRZ7nFS)M^$X=JNHHOujE<6k6Po+CP?U-kf*7h;dDLEbVytE%I$&oA^bTirJ*5F|Oi<>L0VBQ(X0DeW2+ z)U#tNKs&UKW>aVRGAy2^6J(CzxC>OkGrMQBe3#gU)4`<|rdL@2ZXV=h3489OQy;6o zFJV-YgVT@3I~Lr_i>Jgpl4=qm6O}}lZK`+xq%CJf9gj~?v=&%hy-T>Vk>#heBw6)& zdOFSR#_ZD6%x7*62QnuSTQol*CxJVR@ zh{$g^c{{(e*x%@AeA+5;F=I4V_|lv+Bwsr5>yVPU&k|FY+xWW7;p1YmwTDmDx~z_a zbT%u8QQSPntRB=csjcx14x<=xh1btZ<%y7_>uv%3&URpomG8OJc-op)aETQc=XIA& zpBLdIfH#{O?MSy(>rAJX6w85xF#Gc!Zt3o z2#0nqNJwiB1>09R#5XS8Jp<5>>;Wg(4x@e3J@v_v(UE~=CpL!{Krq~(>>^cbrnBHQ z;emyDN&w^NL+SkkE>qud`#(%Sx*1#RvQ4A$G~`lyAT|+ND>IKS9kbL$P5L(3HdiV4 zVSFLh|?H|t%DrIVnntJ zK>F0VT06(uN~sE*SN8i^t@}tiixgf%wp+Xu%u>D)g@^;3h?|~)b8hKPzZT~_M|uYs zroS1Xc-=iG7Tlme>ZG^5uTODIA5-lpyZ=rlNenVs{dI}kW1-RLeY@tZtT7%i7wKoO z4LDN812dIG2R4N&O=$J*LQxAo|57fb=f>Y-`Sk&DBKLNWVujhRmSQhMX4m46uKtkU z@c{6Md>uGI&Ppzkg za*6qiUNqS`y8^g>ceTXHG}}GfGtjL-`<@!}S$F5g*&9Aac5TJS-o#c*s8sV^s1|v? zvsz-#1$G!qZ-*@voBi8G?xre@G|)cP5@A*P@m zpgwfZQcw5XE1vV6o163KOn2P-6Z4zz!)Lj+ixbcv52aJPb3P1yV4clnI~zEX7pf(8 zR`c!dyDI7&x6xvQg!k=w8GSsFYfgGDyI~oZz}WwW)=``!ajGUKRWa=wp`hQLjyp75 zva5;+p8_aCH{V%ssi{Xh)LwhjqFWk8?N1htz!# zeQceCPs>$N_v&>)KdT)?ov(_zT-6wWHY+H@38X&~K9!bBCoW50VJsfK5iqdRCB@pF zHKoOJ)2ik%;C_UvLRbu?SkuY~CPpTfM_K7|vMFHR@UbRh>@wwA@`}6=s_!qB&i?F2KDb+afKb>v9~^rhUl8c2DafQNh?r&w+=eM{+HNkakOES{^>Nu1thrtpFXfMTuu28ANG z0?$dNq`h_;yM)4G9~!D{-GfUcXhGRvRtm61$sS+qzdZ@=gozt`AYEjeTu)GFixUlU zsB=_KYAbLwxzRGS0ybqHP17uNZ@UWhExCMQK=xz=j5&1axlH~$!vU2h$%BF4_;v1k zmp<8M2Di@FLTXTjjSDokZ_mxm{r0W0xw*0#F7PXxb9HIrn7 z(}}YWIP44o3g9?BS0D7NnHEY=@knS7X(dN;kxJof~Y;G|bT~bk1|oaEYuvAixdavxmP6vI>A>2Maxl zcleZ5+=m(A3>7ynG1IW^!1AS>pu%(P_7V&Reec|vmW-nnHgJQ)L8C9$Szt31^Z!*I z%RlQ%E*kRbol~ z9m-W|oy*n*yuWHyh5Qq@{v(OJWzl%9%cDUdbw^om!)f+L!V0jXrDgCp`JJWFTBuD; z4NVOV)a)3NLz=jsGut-A;#6g$xIsAnKQgOVP_QS5JQ_R|@=NS{b>VtA#b0^6vEcn- z+@6*U(mfI>DK#}U{$47HL^@g#v>Uq5zBoY_L6yxwgwym-X8bS7V+J%|$7aXZoAB_Y87po5b zOX>Fo6&Y==XzOVKW5`ssBIQtWgH~=Je55#(Y}~O-+p|Ym*`Y)3O3qBWw9XCjLidh5 zzUApU2`l>&pZ8Jt=(UCc|A*e1Mr5+N50y6=+DD09rw9Ffu61{@Gc!CvrQ@eow^n(` z-SWneT&1I)+TySvEMqg;GJ$q8ezeB=ycK7ewh1i8?ne0eSHB8f-ch0$HB%727aLw*!5{kmq3!cY^v%yz?he)oRcotxK3~hd z8M-3&bG!eF(Dp+XDMJN(IZz;LC>iZisON;3Il(SG^WH%DxAju|`!2`F#Ke<~bXNTh z%vWy4X=I2dgrlwR@rsb)KA2V2U*vd>-L&X}lEHB<8t{Q*(mCI0-k{|+|5~NBen!VD zt(vyXkkGO#?=Ju9+n2pAU;yTp+ce&HJ&;u&izM2Yo;Sbj@1NpUv|HC9q$lFs3o zk$KO{NZE}egH&Mn;9@&h#=GYnnfE+%O0V|d;d?p$lToQ54K7DJHh zvU#xL`2rEpyv*Z6Ba_ zhjvBtgzD~E5NSBeJhjfQTUvQI@S8v3X2UyLV2;ghyD%@3Wbp2>+l{9cY{fV2{!TpK zrl6WY-s69^SL=skV{dws7AyY2@Qib30S9hhM|%(n7wWmGfZ7#*wAtR1x+DM6z!1GW z%`Z=qzO0-{9S-`^th}G^HGS#VE5ATy8p~ftJ4_r3^?18Ew4@T%61!sO6ic|{YL`N$kr?>adnb{FqTc(4k%hQ&3+t$ZvBnj!`?VMd@h|%!5A`$#s zjvchgwpJ~KCJr}mJ+05*vCFlX{Iwg!dd|0ZS?fpo4CBW>>g;Qc<-M=Y(puT(`R1x< zqgCUnghb5}C;byVC#1gRFeMz~rTN3kT80(})LqlwE=v{FXH#NgT3jhHIG0-2{^@@> zlAk>*^ngzwirJD+S-bi)>@KmVxXW|Ro1PtR84Pf6yf?i3jUX*8r+!0x_h<)XYWm=>M zeKguaW$>S!A<%%9e<%N}{c!3IPs<%}JlVU-wl7QA%KL_nAM=ijJF2{|ZbqwjpWBUh zP1V#)hv$3e17Q?Dt#JUlUiDq?(dgcXRbZJa!5#WCJ=ev}vC9(O2J9V8;S_$*^6!BpMQW7-5PL!o&UPDtLo|e>_-#5d!de z2m6M-sNxXuo4upWE)aSU#sn1cqhJb%23hR=ML=Aw!V0(&t+U`3 z1R&!99tBT$eiqg4p}pXux4? zMixc@R2K3X>@It|8p81MJlq&SMt**{7DXh>5Q&iIE`YU0$ZzKXk7JxS15+!w?ZC!F zMn@vC0=fr9WY9ubB3cA;;W!A-pg<8!Il)05J)v+s6lmA;LAF%C3lGv1aOj=-=N6tz zL1O<8;FbU$?AnI^59P%%p8rMJuE2)u-}xU3Jk4bacB%abKqg){#r_WjVTz3){ts(m z6z5C)|3KhykWtTS{v!iV^a2~cs{a5eZt|^lB5M==gCNP|Xpx-yi+_QD)iEBCufIXO zkOCQxzyM&zBhnR^$`+af50G7^HvtEPzA&{nAC`qc@DZTeo+`l2mG^LOmykK2p%8f6Tnwzthn07{6F6bNboFlWeK+Mnwe|mLv_*p( z!g+Od4YqB@=ZE_R5Mf2JP5T2CA_fgW(J{QD*c&`{qh%C?3;X+#X%QeC0Oc?q6xay~ zwX;_P$h&Rr&r~8gp9s~(OAwHI$7?ZoTLpaDHy2b%j^u-&HDp?DZl z#VRfO=Ozrj=iI!R8^69)7-QN#oq!iAwjJ##U_V{LTF~7s%Qa@uGBSD?{KnQ;)rjJf zh5$~ez}}-3r337~n`T$uZJVnZs)>-%H;zPenUqa0`*d@hNZ`h{eWPC*@5)q$ln{D( zMZ8=YUE?mzwN{1DgTod?;@BJvp8C8|!5gh?qY$@K9z^hv$5V*bRrW zF0n?qrHNsi+iD@3XIm^xK3)z?4GsDc&@9`a@CXgAV18F(g$mDggw2QT_3tejR=W>r zMskw@Vzm-0WK)#m|HE=%V_s%qt%{m#q70iTG$H_Ax}p?qE%IQ??V&nxowV5D1G2_M zB79KAuEp}mw>>Lb{9)O@X`a3(&bsE#bpcEYtiV9a1U#ti=h|!?;^vmFdAU7wN!fPl zgMQ>zA~X}|QT2f7cJp)3zE;9&_tAw*RHeY?Q;GVK`Brdegqv3gBd-8V&2r4mbCfem zD>q~ow04jbTvSiH%HSb!5FIUmCn6(~&ppe@_R1&;TlZsP?wb|u`kgznt^l%-A##hr zseZ61*&?TCagHBGCDGqe2{!(>u%psyOyXGW?7#5U3*vvb?6~uG5R zisdx@2M;5nz{`V&cSxe(yA)mpGW!yNhXIJlHc0q~7jVYofzVpx{KpWqx_A{b3fAV>sYEB=ZZkrU`64jEfqF#vH!gFJ{3Y-jw_&}G(?6H7rGJ+fVRDUa8!5YtA+;YF-M(7&z5b-GZ zoE^KWpS63)5c^NTz_W|+T*kkJ6OKEcm;CQN?2RD#{{Rr2NZY?K@Q^Y->wjnf^#1@5 zP$_t;zc2s{wf{pD2@wAy21MZ2mEZjr7f2&Q|Kr~@Fj+wVrh3ZAf3kuYd9YUXMv~26 zAkIfX_QTQ0b|Qqq^hgiGiST7l8#fir)ovn*KsJGl;cxneq`rQ6OV)qoVl>G+v!;X>O`VAHRZNB=PC}1Y7qfKEx;vr&TIy`$X9I zJe-XP#gFa!+?e0^f=A!7g+&~|5D&dT4(k2J_J%yqKrkm7y=DyPa&E)}fM4UiE$G<@ z50`!w;O6E=b%PYN-dFZ~cH5x#Y!6vT*?KP#5Q&g*IHw{RHduSVK0UJi?G?5$1I&4Z z0zL+U(TLdkv})T2dPFuDd5);dX+eZtTBD{Wuj!!|0TVAk-igf!`|_YHbUSb5m|)+hLN10Js={t#>3bueK-c|+8nYc~m4(YHW-2O4;=%sz<1~ELGpsi<+Eww03 zP5YQ4H^N{$ejn{V8hOanl&JXa)puBjlvr-8IHsrz9^QJ4@Vk|dJUumx!tk^gSD0X- z-00gws`HzTF~?3kHr+H%-8Tg6RRFNf@g2>M7llgOEU|nbR7Hr0Og?vu%X4{l7|#tr zTRVNOllm4?=e|z8<*09ffz=<$qrI=D`|%hU@x7kVJ?q&BoambkxAOE3IV1FPiipQs zy8>suKR|29u^)d@XnlKzO+x>E$?=xWrieox&wxY4@f1}eKoweaJ=hiqRgAtar*q;5 zPlBmp(I?_R**|>Df1R4V@9SQoe2*gbA1DatPLx_SXzpxM#LWWeHGAXFl9c?OC6s0#ItXV5`*kX) ze(vi)v_?AOe)FZsE_L4r1si4e=wHb1PX#CC*-r&HP+cEqkq#; zwYVbS!li@JSQI@SaB6+|yM3uA>+UR~jb$Fi>A$&Y+^xF({tL13Xu0IKmF)oeErwTNFHJ_?D%8sndwXFcSIR-8^y#Xk|14XDZesM0$VHc%{dVAnoo zTdL?H!csjn(v)&0=d02Mex(=Q9p0B_>jYJ^zUDP{ zR74kb=yfsfLG7cekrtC1xwa%rZ_@t4G!hD$o{17Ns>RFogZ_x5L@s4NLG^xUxQ6R`?-V&fSNQCO zgr-X4n#)|TTVJ@HT%#I>D|s1v-%nQ1IPOCUFSXlPCj8AJl6#D!&ghiWhYLnq%#3GB z{7)VjHi-`Hig@iBkQwFSd$mmc?Wvn(ruU{_9_JeSdMG#g-w8U z>D4owFPjS7K3e8oetp^#+cD{zH8f#f{VK_$r}H6Sk`asg!sXZDFRT%qq;L2e_cvb) zbBL5Zp@muZ!kVdKCo5@hnEYpK7Wqa?pVO235BbDeZ#cb1BF8uN%_S}AY-{VUc1@~B z+`lF%ckLMXd6lS<6!qNqvX9e7$vm2#S8a{5;|NlkIY?k+G5lCW=N0hHXa#(Tud@tA ze3MT)oA+)@&{kp{V6u)0ig7Ad(VSrK4)*2S+r?laS z;jYF~-#65WM{oBy;=c-9Z7}bUyx`{S!PR+KZQhrz_Rhwu<%!&Kp1!HYNo2%=5wtjL;@fplS!~%jMgD9mx z_iZZ6x%Z3P;YdmCB_(gi(G{=)hT`GNhbw?-{=|3k0agAnEA`?TouHj}46MJ6(sQEi zY?>sSo{wCp{$L>ym75%-6LXDro46QL`*rRGrJ zpnW~>i@7VZ$2bMKF>!^4mw298k#>q@Mg-J4$Q>J%H+pAqIzCSP`VvdKL1$Z-k_A5( zr^=*SLsML#Ssh3J+xXW%9S!Idk+ZYs1RQL?cFA55eq66)S;v9fF}IsZX(hONv#fLU zX7=&&c6B0Dx^!imxl~_1b+NQ4vPntRE{{Cm709u9OLL;qjuWl9yDAPYy#0RC_H4Qw z{bT=4aibFkTW=G=Y?9rMhfgk7mpY`BeFnL)qQ|a%rs$Se1v15t_HQvF zWliSZZy`Lo>)(*0sb=W-?c#`QdM6ebi0q)yzn zs%xJ*SAAW>{n+iUukIEbRg;&nG$R+gvn{8?Yb*+y&bkZVSmJy%t<-jDPBXf)pyWk) zNkK_eotEG(pUuP1GdV2{dc+L!Fzvgqcme(>%={1`@x;!v;=9uY6rX#@aLA&r?#|Ar z>OPg&+2s9XOy@vV+=;*q6Ulpp-`rp8T7BtmVdT&KzBjVUQ$D?q{_&;!ti6tPXO}YX zJ$EbT-oBDA;o9cD_L*msF08*g^TqbS7THe!>sAc4j-y3IMdkKRDIbjlCFQq7nr8H! z%8k?9b1!;0xU4u}*Lz34@#fRZ*KI7qtLdm0M{p)Zuk;<|@#MWysTVEo=3Wn>uB*&& z^;z1NxYz7B1CgsdQgGF8X>0JI6E7+`w(mM9U^|(WV|l3J)9y{#ykBDd(R+;?a<3D< zuD`YdKCgg;`8;T*ijKc-!8aeIDz5}225Seta`W-XOO954cuFi+{?l=rz8=e?e)V^I z-iEHPG?PAKL2~wg>d@6`qvx9LzgC=o@9wvf!e_)K&`qI8N5@%z@7o{g0_O(ITjmz5 zJe4OE$ivZVDY86*|P;Y98wpG z??}DMQChV8?D1UT;iO#J0-1G+iF|GHkR|oeIr>nPApMtE;A1g!ok*M4ZFBB&XuEUj z3Anp^lF{&GUw4Z>CYM8TC&3x@L344hl&Ms*_qQF7bmCq6&VCwe`{tqU|5k;zA*3!h zHb}Fmqh;Rygi5|qr;tv`6eNk?QY1YD{XRqjWziZ`9g1T+#Y~aNC|bbFe=S z)qhmvlx7+kUGmmMtapQWA4}@9#x?V6hhI!I)jVq~>pIuBX27CC+&i?r!vEo8;)X7i z+TQc}&lquIpM!V@c=s8li%odm5lRv|+D9#V_~=Ie&4HU@lA_r=_|Qf>b#ukOH*fC0 zW526RdsM6@X>X_a@wv6{p01y(Y)xZY`7?xbM#O6`2ek)1zSq^bugdeVw!D$I@S_oW zdO@&cO4^yl4HQ|&VH1q}`f!bszV(Y=eNDz1N>~T%Oy1nz|8`d9TuQJ&y+Gr&5U=?? zj)E7s1TXYlDP%HKHl6(tiY`u9KU#@RHLc54`kC@B7 zIq!j7P~=%Ae`@QIU85^{+Bt=zu78S?(zkEj`ry%z)GXQOALSYRZpE*Eh3&$Nxp3Wd zwq%N2&~8h6mw)DGS9#W(ZHKSzw>wbX!PuMKJ(~LTTI`TSa3^}kkIrwoUsL2}uD2w! zGV@fb%GS%88OygdEwVT2i5oB$HZBxh=zfd$-PzdI#{`T9Wme66-JVdv1J!%3S2uVp zA5ytwusL}>N9^M3+_j(Qc-Ng%$vgYf{>zcbTd!rSNBnY=N_W1nSKR$gtjORh_A-^z zeykwH+={3{rx`-7k)c#5lDWU`Z~&>R+Hg z7c-HUOkOG!yL>hoxE%KylNe~BQEMHCI>KAM#c+TxldGQzU*Gnc>;2LV->G(wzN&FN zssfj!MES70MTxTP67hT>P;K|+00okn|6^YodDHrBmrv-+C>lx>Po8{xcZ8%X-XU&v z>GDqN(_;=l%zwDwD11r2keicrwdUzsW1PEOLSc)w9C4R&0dARUzpo)~TdPi*3a%-r z&*Apm5iWe|T;BT*SzQsymez)g-kLAn|x7ZO@0x+=8H5{F0D)WT&jsy7*D>~ zWn|jzt#2g1$6E3^Iy(MrkH1LR^tkJ5rf2TsO#xG~m+h5C_cJ$_n_~IHQhtQb_P)>2 z{IG7{k^I)lT1?Ru854CqzEd5Cw2t{d_cj^N%bqF$RE{k-)}$(v}xSEFtl$|Uzr4a;%(M!~eD0Uwu9DOV?nLCZ~d z2@L2sd}EFM+-p3&@slP0$ii2VYnf*+V0k@wvZe1cIw^sGZX~50&=SODh`Qw_y?!`wEx_Z^tI$+`Gj17z<|)_ov~QMfHyg?Xt#1z|h75KX zXr1>B)t#F(T-tU|Rpt2Rsc2n0ms+iL*+0K!JNacv4uzLtIQGyiD|Te;U;EvIKYyqb zS6ESCuVFPVNPS{2V@&roO*pvt?4XHymfYQMXELuE##wc%YTg%i^5M>QxHq@i^}Nz~ z<+~&L6-6~it}sgn)}5@j>)+IL@WVG_nb%+6NsE13vvwN){8+~HX8SK0(;s&T8Hn$` zON|PXMQB~Cxr&wW!!`*`WeoVbXO1$qwhVUf*RoCzkQzHZd&@B(qEISn=^LGyTU)68 zy64takxp@*?~-9s2}^pcYMbj@)0G?Tq|+r_x8}y2mu(F?erWAchqfQiUO56OrKbk$ zO>`@YKKTZQ2-Apmc2sHKYj?4^Q2~pNmHob-{B|toJ}3!axb)oq=D?=$Cz1k|kFfoP z_`Ik4IZ3uNwf&f?msgsPJv88g28_M5&~|4cPHKF#r_a;%@LlyC^Ur18$t8`_qC z>JR^AGnSy^4k6pbt#o7ukA1Om2#3F0&i)vp!&-?aS}!k<6ri&UrTWE!c|gNfXvcYOWh*PiYpcK@uH7D9wuM4 z#jSuY7~1`r>Wt(S@Hm9Gs*La}u8ZJNJZdvgiK2Y(TEe9JzK-bQ)m6Q5r?XLb+Ii_r z<(J&sev|w0`F)cI-`Xeb&tlQcZX}=UcvZ3Gu>=3*W32}tGvp6j4<`nG4=O26Z|`>x z95^#{y;IguRQ|&S-CQD}P?N+GT>-<7y=ew^wz=M(*-x$BAd1ow9-NJs!56Y3U;p@Q zvjP_1xtDHbg+J>a^&gA5xTdLZ(}kJOa2EML!mSB-?QVWcbgM=|GNWni##x5s+mMZc zIn&Z_wmkK*Ll)IHrN|F7tCjapo}D6XcNZ~h=U0{M_pDTa$6qaamyRYg`lqAhFNB=9 zWXSg@VtZOzj7q(Zdhp9>sjIlJYwrBo5kGUo+ic)UK+Fo@D_a5B4&74t4@tbWzMhYd zDipmyDU7Lbf6U}O*S*nqdYkJDFCLSp`_fDKT2QI{_G8VrQ&{KaCLZLb7q)yIwc+#n zfhZ-7@72$Zz77BX$0Wyu3F~5q3F&K^8l>(x>+qW6VRoflxZjS^rri4nxGgKKE8khq zxwlN+;5tJ;rL>`!8t|*`2Y=6T?_NW?xT?|9PMNr4U$?_AfD~F{-=y^DXd5h&Q?Tll75-ovWfOczto?15?S;?!I8GPc)k{k$qb1OhJmsZv&CSDO$D_Vq zA0#|obHrB$rWBv=|5|9@G=CZm=wDts-!K)Nx87Y#;_1mGn6+`0w1^oIYiH^1jxQ(Sxm;`@c^fGje^dyCMDT z-U;J{G1@ha>t8?wgk%(p9nX*J=I#4|{JNRY$Y+4H6`{ySr-$?gS43g1fuB1q%?|-Q793 z9xS-K9m2ugEoiXJ$$jo~zwh38*P3_cn{Tc8W7g``-Mec4s;jH2t9RAjwaeI5%K4ls z#g?E*W>{o%#f9f!waO7S`=va_5E#udQbF$1XiCU`&qD5^8p*yUQ#r+8o`Yr0L%F{w zKqUz4H=Y!{RCnBkNTp-G@{{u`d?}hK;B^`_FJU^M8G>%k)pA9@gb^^TN9vAypm0Aw z;1cH<(DW##QIjj$lKLC!!A|tL%Z>ka<|d%g^;KR|o>y7Nt*oz=bH@xrTku8BWxw68 zKI4X!Y!4%StHa&(ZmHr?WV;;bb@KB^_$jQ3{sq-rhSe;4r@Lm>JSiQI3RCFSuF~XU znIjGq;ef~BMbVc)d&tP&ruk?*ye0v>^bKULXu;!IEq%CdgWsw^5IrrFi1VxDM~gta znY4dwRfae1Ab{K`Qqr3g6DQRKiY(FgzwTgOL~JtMC+|W`9R-B$BAn(!_?N+_!!hXn zQg?%HkYRN8oM<=X{U+UfhVk{Ns}LKeO-1m|$z^}-9O)eC2C=%oaEdU`1dY?1kU8Ts zZe8>J=`6nd-C6vGlG8IUyz;LuJ$j6f1;dLI5l}f;5p~a#%LcsuFnn$j4Q=;`0{NfU`s&rI;s-c+tMB~qK@89 zDw?D_G2E=?W}^+{7A7JdPt?L=``p2#(PrFhZ61Ize`}Ag68wE#uydqUB!y48zH8*H zXIM1yhSPcY(eboKbewzeBRtX-Cd9gyP9GxoEtYOfmmc$Y&XCC4bAHUzAz3WBEp05; zUCrNsJ8SrkK9S;0G|$4y<;OIy)bf+Hni8R;3wbhq3E$Sf)|sxN0_&p!|LOPev{7+= zT+G)vH}ZO3h_oky;;fPJ8!8kstD-}K*OG~s0E@&UV+mbb^ajpt(YtbV$P=$sYOok{ za5Lf&PW!D+Q#JGF#fyUax>oP9K>SFPZGWPMPAtY83@NuAcU!OBqhoMRQ2F2*b z9M$6x5GIevy$*sdGqHfM1ErTq3_5zv4w*)#?v)iEh+A0MQy~>;G6CxA%nU z=Q0bEA)tWBg`_@y)w(B|9GqHU^BoHUtnqzhJ-KS}0;{yg#cU6wT6wjKaV;@S7_{jvGdn}nV+3Z&sgR;0 zeSJb1r6_P7ilpOW{rO4fN~+@TKFX7vUq_N-9s-KT9Y|wt{ES+^3SLBh=DkB%be}zt z%pABV7q6i~*zKV0+Lb47=t-%eJwgugQWX=RM-p@zR5v({Cs|0qSr`I=PO*9C$j` z{V%~q{t+y6_}3>Q@ zdI6a=Pz@qX-S@;uBQ1iC8ubHF!PX~@aMWY~yF+i!&=rC|E^N0Y3QnF^qO*np3Jnsm z#gY#nn;z!PX$#X9L^o|_ZqeerJYyYieMtRh?bz+~KN(b-94=OD+)!6;Oa}P4T5?Ym z#NgKz?w+>=29qmp$RkfeqUHmW=QCr`z#KT5K*y`Ki8SSdnnYL zD=zcnDF(WZmdNc*apbWmnnC$H8%1Oz*Foz?O~j05ALYTf$l(@)IXeU6_Cf}}At+;u zHMYLw6<7G^I(jzvmJ0J+>2@*CNXpT(Xh-U@^!EBEVEZ(rlT?8`{4$KL1xgl5OhGR8 z6Zz2{Bl{_z7jkTzgdir#;fPu8mzXdTExq-%etV=rKF+Z%3=2;FW@malr|ebkS}A;t zBNutP9GCJaPwe;aDWRayH6?{yi^TiRN^QU;T~(<`3HbIDp9XH{=*bT;F8#~U(yDay z_1DS+H3(CFu;fgv=@VY@qAWYHMLBxc9L*?3@f?-_CCw+Q^?8mn4N3+w?b_XMn-}EE zsPKc-QzSg%^oiW+i(WrA&2f(h+Pm5kL^5t{?nweV90->RqSpq?3au5?aA+lZPZn>y;>l*2c1>7mR6X<}-L;ccj89PvUL|cYq^``GpB__lDx9T~LHINJlI?a@284L(D73E8 z)oy-sxEqLiot#BVWs1wGn3Kc@C05VYeUA$tK|0MHcn8>Za>Ajdd9wA=$>X*T)sy2? zFt?f8>uF7-bcDupCGt-j?l~FDScG?_%Jj}H~rtb@8jfuLro4E&ZA*NL_J~l-%z}`dRG^3R~Rj~k*VMT@sMab z+lY4ihDiEgu@>tRp&AQfW&dKp)6=B%x$XGqy7iv@G<9~O&D{C^*fB9cJCkwC>8d>& z*I18w?mVJW9EWJ2!uZQu!mM`q0+Ez2Q530Qchch?KqQE7I+V*w`+{5R4NNH5n0@`On)K1!_65Ky%w23|9W!JRR&?>-5h zFJijH;9I-;c2&Vy8BCWU)5BwoEs1qM5trRkX4RXX2O49Vuw(Ta!JUpNmQFE@UgI~y z-{4<8YhoW|gm}<$%Bjc8I`*`Ez|c0s5niU+!Fb@3oIX*$@#xo^FY;t04aUx-)!$$} zBOt14Q9oyVxoq|#ae7Oyv{umqSQK)w^D46rh@HDj@kF`PZc=bJa8!n(=#bQCF0&=i z826XV$dJwcjyKn&TzaH_6H8~?AbCWWpV>>a+PtTaR%3mZ+Pwna#yA zv3A(^0DYT#*D`>VRz;rNj9YyYYEDeC82YTFdQCjA&RGdl!5hQ8IRcia=XvlKqCtm5 zqy=5XFBbPet>a0Hh@z`IlVSR`f>!I`crkDrzX;EK^uyZvrX~_G^`M$1-)Ff(jxW>g z7&2`i;u~bmToA})Z=N+g0$V&jO5=Bn1kw9K)hD&-P6&2I2!70*qR4>T{%0CIJX7BZUech3uV~8O6 z`NfAN@*ZXG!&Cg`Ka}5BRH1TNb~aj%a2Vng51X68nrXJK%iFXHmGGW<6|v51=SfkN z_K4y2X*bv7w`x9hh5jM}A#W6x^1}0?zw#vIx%NVl6&AZ*5q{he{wOAVl81qXCexw2 zI%)T`ZC@R2krDOIbmF1X$u;`6W%ZXRF(&_qEydY`UktuLK;|jhdqv>G*L>?3Z0(0| zE+yd3jyH{|u*?8WuH|qj$U0@hN{eFLJt6p~O^qU>qlLU>E3BPq(&Hp1)RI*PlL{gP zq(B}MNxuWNvyG`IkKq)n#?d=GupC8_iQ~_odulqwB+bb`d+!kS;3Kto#?8CHqT&&& zhM)uNmLg)u*w8NA#(3I#LSGkXs)3u$-`oYDSDcX(F_x+_#$41z|Dj{<_Gwb1 zN3S{)@Iv{a5rg?rVpi3YjHLa}|A^^2$jj4Uz7#U?-e5qP*5vxo(OZKw&lg}gUwdN< zPzzI2vk2PheD@owa`7x@FlO~G?Ok#vKEuf&RnrTM>nPy8JeOui zi!`A|${VtH1-Fc1>vqL1Tey&hUTkgZ6vJ%&;SQ(flCA?xYmFt$2+Gtg+?k&gpbq!h zny`xLGJU7hX%=x8)6bgYpVvKcEnlO6k#2RNL)(4cf`zWT=3QmD17C2b0s%_Kg7C|s zG9)>~30DtnV-U})5jW$y<&t$H=cMS=-{^pSQ{dqUcX?f{Z%)Gu2*L3LYwCM;O73iR1jZc6eq%sKK5SWw}DjGt+$6lvVPCxW`SZXSjY<-GI5QwJe43Ily&tEks5{HfC+k7nmq>~4(X)2l?5%`x4w*#k%C!&rpW6Ws+;ah{e#;m%j2&W_x> z^X+3#R+hQFhF2P8wX0TF8wg54BL$>tq5KpinLB5?(zD$1w##mZ7w&|tDO7Sk zI}w=aX^*4ag&RkDe%1k{>qj1UOZENV2@7$11=u2l&u$*~CKyrUAK>E|6S^~?vx?W= z(Vd!XMH#+@+Wb;Z!JkO^T>TWy9!?-K2hS`I` zkgJVBGU5jf^ohEeqUly3R-0i-WR4%lmhKG4Epy^)+p+D!%y}kS93Odg#pkY;iQ{6$ zJGxn;4m&e%4UBfAHgaUv`6R>)I3#+lH7%7wiL*IjL5b`mq?YFYxVeTb-8}2?kf#^b z+!_+u3(s-NM3&eT6_E;l3T2gw!YF1yQ?`wIFj$dXa%-y+JayD3dy{=e0r_QjR;?;(8;RWdc*xfKu;N1Mg-$fBLdLE| zYi*}2qu$w`_)4>Pl~2W_=<+}xRQfPhnx>FQd^?C?x3zsAI1lNHuCdJeN^)L%@;jcC z@VD8a;gNeXgZ6{OZ4*$l1kPQGXp)7F1U}8}r;EGyeT8%9qoWrKZrAp`PgNwBUrv~d~!E=LAb(x2hW({AzR zDz9>v*Bi$k98(`6Aey(guW8o+Q3HeclT34J3WjL`-x6RI3-z;tiL zUl+)S$~q-s2zu5Yz9t}~dIUKi?!KzIq-OQ+r8VR`!t93KQ8Eh;{-YFaW0J~#M+JQ? zn9c)_!fV^&<|tX?BU^~kUyt+i_$O^hdQGuT%RNT^vWf%haG#0d6mUk}(o$t}C zJzDOF_G5W|Y`BV#l7?=@MFdLv%5W(S!wvLdBgBV~jvDeF%l(2W+Bl6P4Dby2nF)lJ zTH-U+-)akI!5D?VcxKlp1=mEC*gi{mq;pVzi1cGz?`!AF)V?|A&D3D|DHeNn#L}=N z)4goK^?DpI=3f(Yvs??T9FtOA2Jc%F0W%4KNpX($Rbn2g?je3K4WFYIod>`&Z`Y4V z_@S9sq=DblrchFbv)QgL$V=v}0^eBI337j~0-Da(6`&buzL z5~6mjHnjCzx|iNiYRpw-uH_VGmC-xgP~vOcTD~Cg&pr!rv}$$>aY^&V?r+5e(^kqe z35aDU=x~bR4*iDu;eh%Q9k7SA*?ndZ@p8m0n@e*f7_ns)7j)JnRlNz8SM!mMNN4%3#Xaw%P%9kE6>sN`Kk}t6uLu&2 z^7z>6(Is|c9|p0UUmhx*qagzL&o*McB4@P_^ORa3^YX8hnivZ9LUo@)Xd}i1a*dNW zBR8W2!+|hSY^1WWK0dkAM~H~9PjPU+p=@rHF68vAhgT(voJsdWvic~aCDpi$9_+GEWQ#|Rrz6; z%h!1&lWszZIsPv_!s+#t-y2SJ=n;>2FKyaiYdtQlo%KdA=)e0vz9zbP8ox+{80>}R z?!ErJ9a72PCWA`Y#;nLD%{3dB(PyF=A56lZT51h1adS#+CA5|j8dBNNv{)<*Xs$NB za|xiW{^K3lW@Cf?H&piG{S(DpcNb*FP>=kjV&*s0cd6%-a6ShI>La?>QQFf4lTf+h z8;TekpV(+Oxpmn2nr8k&lTw)giUb+ehJ{DorLx93lld()Ws^@BKbH5h-{>%Xe8IL2 z;*h%x6$RqZ1JvHKh2Ml^wSk=*?>p)q(z%pIdX&iy;Y`9fn9i4tFwas9T@E@X#WaLm z5FR2~%YxcW)>?cM_D^KjMv;nd9Rxj|#h|T|W4A>pWP1oMe!&Mfzfdb|P0==Xwx1q! zgrvg$IO|Mb_AakM11(8x6ElwzgmaqaoeDc&;9F^Ca_Klk@VRB~?F0J+yzgJrNq#Ir z+kzF7%A8qvmxPnndLp2HOm>C@WHJ}Mc!u4a@#-}$UZ5a*RR$xReoQfUxOp3rCyBiA zOY!J?w88_k^3EE*{CvqgP^D)j?EapG!@oW|(Kh&Y4JM2$M&dIsw7rEHBMvb+f=DVL zV!sXI+b6!Wq0Q5EG9y;5nmEEuLFU^z7pebYAEc;Nvx`RKjL3aHLD4`Xz^C7%zE|#; zyEwb3Hnf{**%O^0&tIGZ^az=fsM^FnI^^Rp^F3=(L^cN(v5}@YN*Az|I1{en_)Wo} zm%q{3z*;?NKh?a~isf>{917m;NK~0nR z`k5!nz*A$M*ua*?UsB0G#cV^oYNcAAyGo8j24f4js^~uZwB8d5$Vg|pdVOl&8~n-s zMVIQnduHH`&IO*+FxF*TraEB1X=Q#KDKZc(Xu^B>YjfnMKE( z4OeSQQ;$eA1`!MnMp1VcNEG@>l#9VXoCQbiJ?-9+g1wK&?u*tj*nNyW*-8TH!n=_3 zR-vki?jyNH=#y0E@mm&nxhC4w;kf!`@3)vMcKuvKh<`>~ngM&q>5KPlm9_~X z-R*WqS(CgxO;aMWY_hQ!X2QA9J0E-F0V4gii7d*{E&UbPP4r6OfolDtSLWm0kOK%2 zR@V^DwHa!6(U#ZP-H{iNV7Sa*!@0e}$X6y0a+9xT*6pd3lM#=fkfr>(PgLvhMQD3T z_i22&X=Psun?0lQK9bKgj7ztgITR&n+65u?3=qN>Czck*26WW-3_>JnaxH8AFkO^` zIC!{luxJr|9=a@zQMdOU*b(vI6W&BjJdKn}YO;VD&lKOWTJz{YvANDMUv09q=fnJf zO%Z#Eo#nD`HB@zZN`z5uSb)Tg~29a%;e?(`oEOJME z!7`#%hIOJQW}In47SI(SmsAuZDx;gdA;oVQW$Fn--72uv(c!}y@UgwkFTUTE7}7`> zL;@vZZaUaRzb_hlq>a$LzbA+pnvUkfgPy!#k%|)OwsQ4GW|iyg!^Nkr zpu0I$lFJt5@|%eKjgU0WEnV+(vEF2R!L9;5iQ)O<7HWn1hSPVzRUWn|BW@48(5sSxJ5D8DnUT`a z^-owA`wH5%pYLA2w6>(~E0f5lavjcgFr!^M`O^^0^8a!bC75m}$9aye(d4_1OBoR* zjFpKArp6UX_%s+nvzwRj?lJ$%^|`ICG{bATw(g){!zf2I96en+)POS04t)&|((!;9 z%vh~uq<7RXMvRkCg5>U-!(VpKVj5G&)VuTB+h40RM3|TZ2CvRHEr&<%?Xpb=Md<>Q z;t~|d!;v=DBoB5Ac4CY5mQ0*K0gHY@?Dsa~t!|-($uVg1a7f6sU(`g|B1Jd~KF6ct z>o-$g6#caDHP-bhzs>eEdTs!YjGjY6gh!smkf^sMb|eOdBT*gsO1YGVLQKN1uFkhx zXGJM?_P#}I(4cKi@PWC~SaH;)uM@@nf1muU`&Y^)E1=O+ z^g&(wF1y^GXNdoe|Hq`7#(xJZ^}qh0|Hz~oTx)gG5Aw+H|J_CQ|4L;v|8K6>|CLPs z-6sBSZLI&+Cba%pzW*NjUpJh;>!jZP#Ow}!yYMfJn$%x4_0P~M-7m|+fe!$@^%f-~ zf2P5|B3oAeEp+9t6slYPV)_pf@t^6Z{+F@;!Te7$|G!S^zh?fA=l+fT_q>)@|9jT$ z|2t&lKi~5|n9ct?*uTr@Kd}EB$?kuAVl69=qkn45zPswr7xy1zz2gbZ9sGu_{fp@n z%tdv}YyC^$J!mCB>$T_U1Of>#^1E$8{|9A9_K!G<+qhHo@AdHihzb|}1FI50A^$<{ zXYv;x#+TtgDH{E{IE{nwO$V6y-G+gvP&_bC8rAb`I+#6&cEqpvOxa%U{!8i3U2yYtM9cpZ0HML#793FrF_h1B;& z2|^bCpYHN26?p@Q%$fWt7)|JM-Yufo{26J!($6r-aAM|e@-yr*L)ZP=0khhuT?O*% z|5vb86%zOlhgEf9OCksR z0MP$R;a~jsdLRYMfq$m^uh1%V?0;nmruOe!;o-kZWVUJ zx38IYU+mWdv{iU)E}f6KH+PO|;mH*|VCHP=4CQKi{pdR2ZZc2t|C?kcodLx5rJ`$b zP5*yB*6FhH*ESfE+WEdaU%z|^Lj(tIxH5_YmAB+Y4cQ-*w`~8q_$d8@iu!X=b((Au zEQ=>!wRw_hYlM5s70nhH&h{01S15Pf{@N&dM*QoxvXMhwMUD?jeK2Paz_h9>kIYMP zsFt@QZ|pzHT%EmV^6&vOT&ejG;G+wu5ES&H$#}J4G<}BSdQa1pBzZ#TTo*(v68#5V zq3mkULK`ZUfMn+XsI}{~ryQ=FN?{3e1n{v)*=A4Qvc@GcDX!da7Sv+7IJe)-p2Trb zr)4l@6BbnRdeN3z?NN^@Y`BZ%6zZ$Ku~+nhozd=)b`63Tavd(sWK>qpt9cr-P-0(0@=S|ZHjM2lla!_?Pu7PAYP z({*?mYH+{XMhEYF0@}ri9-F6T`S?$<=Ce1M$5Dth*yxKq5*CM?6=O+vya}=DS(8_9NZKC6FJuH)nStfNFlck=Kl0ZostA{{hp(?7`C?vg2 zm}+EIkHAhg!XiJlK$72*jRtrrKDb`F*<$(y;3!Y*eM zHUj(Q{ZRpp!+GSg+0fSEB&MV?judAoEM~lS10AD|k z7CSH4w3!yR;2+z}6dLz@5qIPBX9#MSdR=wKzaM_l4&ETItVZCO-I-N_*$_$cwDm*5 z=!K@nrUHnKPMmR@`r*_c_MV^RA`}C$5q-E#CkiM)MJ^6a@`yxQ6NUSJ$4C{#^>H*B z%_4cM-wLO!Vn#w&r?hIcq2IJn-;kNq%HmDu))1v?K}_ysYfM_*b3TqUj4}R(+OFX0 zkll&7m8YL8@Kf1nX+3+AWfP}o%ioP@4lstjPsLC&hIMck(j9k-ukuS*`3M&tbYuWy z4KZx3WwXaD6Za=s703A`7UlvU!}%^(-T0UE#iuz3w{Zm#V?jlC>0G`(_-Uu4sdD^O z#&eUlOHxkr7F*T6y_fAo8cAAN(+xdplp-wx6!ls{3NzV&!}K6KpKB#jhVgCJLN;QHo`%32ih zBob^atcGlKb-io$PL86*Ynqq^Qc>UAIgU4a_hiRFwNamkd_5b)&0V;Q4?e$KadD$R ze+sfHB);X;O!$eE87XKjN{@%xP|&7^8q-xO_gRXnLsyq|*C|4hmo^!$NB9RHPAGJ$ z#}I=L@7#SG_O1E#ArlN~HThspXKlfos@HAg+t7QQ1kgunvE1;p!lka-%an zAuilNR@D~UOW|6#6`J3L|9g$Z^UDuOAD7;`5MaqJCrN5z;qp4anUL97$o=JCe>+l$yeNB3{Y1u!X$|tMU1C zn6z3I5C-looVA|e0MVyb7afC?%QALOPC!u`|EhYW0sYcG2wT%n+SE6Fna4>Dor5eA z1nduY2V$*1-ZUYtbkL~B$bZqIAmlDO(MgT+YR&W;m*7w-j=dc74uww#tiRh9d?`Hm zY^jz*F9|Nd+}Tw_`u@Frft`(=ZI5$WFfC!4$MmtG%oaw&GbhcHi;JB#{6UPl@2tzJ z7P;lNF!SyQ`nO4aeZmnaV|YrCb{3(D6UTe0h#@(?LOFhVx! zXlW;BZ3@h!;0gC^q=Z)9VXamOqvYr#_uLs+NEGb8`gD zQ#Sq@Upt5Ma_j2t>b6pvk~e!uYJIVELXQ2aNY?q)U%P;Q8 z<3C^Fjp1#X3i|o!k-jcyfZukTS9sxNgYZ*5CY`>1G?z1t+knZHj)OVQ{SehbEx6(( z>9MT}Za4LG8q~VW^8Y4we5W1QXNx~`##bOFhE_{kLAtuk(Xe(Kw)&Ilunr0 z4C&!6JCeLYt;z5qRNb;g8PCStGXf2V#$5ZzV1*{oR&x%OJnwsX63DtPw1IU5-14ItU2$tyM?ra%ryiCp z0!|VPX$9>gB0>GbiVX5T`(kh0CFIrWjaAR0aIoXPY%oMd6KIHctJ zLGRb3NQ={m@rDE=y158D^MyB2*X6iH(Io85bGMHro3)gCPrHRP5I=_?_6RT5>VUy( zy0opn_SP`xd%$*R-8~VaMY}4i@9tB z#ZZ3&x9MQJ>k){9t{Cjqm?)-vmb#Zq=Q5@q&i5rvn|w|cz?k@%ZJ@uY#{zCo9}&VK+H7Ro3naiw5f>LVvCnVYQM$JrFkt`mX#iR>BMr#Np(h*$O&8J2P#O3@?=7 zgchHoJ5W8j9=GO#1|v+20hsfRf$X!{NUfm!R)`M!8I8Xr(lVa#O%zG z5XLx-i(nDZ!NJ8R5W4ySvdNW<*N;^ec7nIud~4ZozPl7f)gSLpu)#g&^&axf&|371 z*=D{5qW*bW4>?P>5Sx6fjp+f^Q1}^ZuPAv^AQ?{7EBWnd(9;mgLOT9 zxz%~uDVZW}oCXOdd172Qqp|*Us;uz6!QMEf#z@`pHM$hsU=DwOU!=|@+RhM=yr402 z2$mwoT}H|Cy9Eh$$-5_GP0|e96CH1nC1A_TK~Dtq@h-%`1JC))g=Ru`;*d<)qBuKiqGF>E zq+pl~(JP*RFNRlArbZHm(O+ny-;|m}=-po|0>Hf2FOr+*q0Ougv+TEmNv3u?4CxcG zjE@*w{IlCFAWQ9~xx?F`HL?>DYR;xzC5r>h)%>2vbgyj6S&x|7%VeF-$Ltx!m)3Y7 z^@xd(3n&-Gi64ahBO4PUiwzE)Xd8yY5rAF2-Zv8xY{XX$a(;~q)pJ<2fDPS@vzpCkbY zc~-uPCyx`qp_&{IwyA_-%OkbZzvg=;Do7Mdx0h5G&og80t(NZ*C^4pqxIk4@g$1*& zqL5KJ?M!2necX`AUyOE=_jbhXPmb7C_aIpy7nUeA(N}QLPSyd&c)Vsuuc&!0JTo(f z=pd@=ttq@6EtaGi68kL7VuMDuupj3oyBOgvo3m)s8Ixhn&&@Y)_a2FT%*x zng6HZ8DCtMvz4YLU^4L==%u>k~NPMGPWVkt&?S=(IC= zDB=N=l!8Ak-O3ZY3^Dtp#qg43GuBWXj)&fy!}z(tckr5k2s!4UGrnx*#<-!{1{H$X zN;~mkmEsd2o@*fMihI(04a)^QN|E_EEVF(wEvzEWyk-bkFD+HFJ-?JJYt|$PFes8W z2(%;#PMaZM72P+e8J;TrhJx4$k>2=-;;wPs({9fj^LgWEwN89I!j|5ge0yr$&b+4N z5q5q4^Q|nzxjob&Kyi`F40Jo5CQHsr!tlWxd2+3CI!J(QY1fC9>i)&-OWSHIh@jl@eMq$(#3J)mn^?>fw&vQ;Yqag@II{OAxdTr z_yMxLB;44$j0pfkWXa)4;W=T;H)q@@q3O|F4JC8x8rs7ovGy5Ske9~MDitBD`IBUd z%p~`$CG26RCQoI1)>Pp#Mw!``_nez}uLr9Wc&Op>BITKgT0mOTeKs|!_t9ldzVO(u zYc)QO&FTk3ijC9EYbJ@jf#Jv$S*G*ZN-fgtpqH`rr z#h-0S3S>PvEo)iGINfhb_0k&-o$y@@vC^Y185Q|@-`H7EF2x-FA%#%sosq3Z&=~Ts z?Z%Yd5UsEJ9`Sx8(?dHCl1~!mdiW<+TY;K&;rVNa#VHMiSPR|}(5UKg?Wrf6a(a%m<% zkN%#?l1^+pJX`3-gha`%0#k|bZKBvBw}ghQq&FYdo=`qjr@rC>CW{A4jz6sJyf@Gr zro(br0%8q!z*zlKD(Fbx-06V0+PJTqh|(9rkDxE3zncPV+vctQ^ zMWdE&`Ia^}75lvrh7o^z=Zh!$q^Ig?r)*y-o@Q79*u-HU1|}k&m2cOHwkn71+7rC1 z=0hVS6iScqu6nqp{U9NJ)|QZR;&JZ8Pi^+gE^lq~V^3b`9~0X@12g@3L4q=@^?mF! z`I=%d0;%0EV4@?{r+`{NVE35e;yKjooWv7y+|Ow}Awz(UHD0EB)B{uB=^2e#XnbpF zoUEpU1InX)Q|b0PpXI9Vbs)pl*~PaCT?V-HmdgN`3kH>>*bA!8X0IwEd09#?l^IKi z;e#Zlp;iOz5(T(ujOx%U9NR>mZVyx&&-x7mIj7Wwm9PU6?;+oV?j7f6D!+n%jlhq| zaspgSH^A#FBFp&+`sj1bwiTCQa;qXO5I+Ftp~zD44If^UYp^zlwmOj4IQ=yHZ;r0R z>B1Sr7Uz~QM*E-n-zFK`%vSIEg(pa3@qO(T*GF)s4b6az>z5kB2R9|Kd8v-{EmowRu52B1*01eyM3PYROeN!^#gZ1{C`<&+-L?bQkH^Ro zpVw>=1#IxxDg-ISi7#qI4#!R+o5Q&oxWfyh8q~~u>plw|>EW!h7Wc9vAAvLFg&Q2R zcfB26CiMxeW-cKs!JIv^9a5DEz5=r8Jof;_LFmM`W?vo;H4W!)s=wSJFM}|Bpd>x{ z^pEu1XFYPNHjXo&zifr%3ZJ1{kYGhTb`=}wEgMwb{Y>9Q*yOn3+FN4iBrAnOnkyllZtbbFGmO4tN#aW|fgpAiC4CY?e}2xeD5`r0%GcA8#|o z9Cc;R->upW+?Mh4!ST!XbfxlLbb*gXR6(G@9EnVPeN{W%?Z}zmZ;F-)XRp;@8+9nf z+#!aE@9qm^5{C^E+Rn&`U>Qg{5Ut_~KocqYOE~iR3Ol2`!?d6AZt0%_9>fqq<4^pO zka7&!kXR&XY5IH9&cH|_GZh^jC6+)cc~zDW381auvsLA{O9?r)^|=Z!qNx#8>oSxEiQv6eEa&sacBnhi5gOg-N1l zLgg|=ehg({!*^tHm@xhP0bWyjV>HCeoNzEaRP^WfF@&T5N48lVX)&$;w}^g=hOAwK z=MfD}89nkF%8cYQY&H_oz$Q$ly!AREoz`e9CroR8D_eeXHk1`3Jrv2}WXd4mLj${S zJxlnTDfM3}x=J*v9}^N2OnrRUhN0`6vq{_yk2KqTXC<7;$g~#c;rTW9bV4({%k;fi zC%n>ZT4r2V`?-U~wRSo(dbqtUoz0zTuxm((QDd(%Tjw2X?9bV#0w*{sER*1^hO@tgs7y?Js4U;t%KeZhwxF@Sj)N(`!f2Mr z4>R=PS}?3=TJ=!#a?~!II$QCH+Kc34)dnx~0iYWCaT)hsoGC+6vY%GJ!?rB{?^%M`gF}hhj zmoy8{T=Ytv&-JS9&xs84OD(~-(UigP7C5_P-ji|_BUfvZbrM91)NsnOVCucd=SJpt zoGaoKj6|EE1gAr9U@@$3NB6B!2b-|pCVc^f_VK)13sxC1PuQgtH&MhfLV1LGSokA& zdj%>$34{L@z8}N-FGroYWvQS>X_H`8KJ1>8WzM<*o|rol*i6!O@uUV)Mv$y4e+Kj2VALLcqKT)Rab*ML$*_b?BjrO>=Y!H^O3Wgwq3lM zEg=$9eRz^1upy?|7OBJo3dSsgqKNYLLX0YHuyn-MHw#_$_$HHu&$XL(YZV^~I-lltiSA|a-5Qo3Xlz{;((C?|=(R&ODkH_)j`Y%ED0I#A!y4C@Y;hHHihPj1NL**&x zk2|#6l`?zyV4FZEaecse@(x+)@UmG5`Qa0QptW#^*l47je2v{Yt%;>=pqMmGMLsG> z+eMTxe{K?i92*_ z(qt8_Y1GUN^-)iXoC$OufW5%o`q;ceqOrZFYdQ1q-sV7Lhz7jBkUN>}_2=g*@(N zIvZu367pFl{GgEHJ}sEzTL|)}>%`MjBAzxl?>#d896KM{Iy*nx4Kf=#+*PUKU`Q<;XOtn1(9GA)h!l)mqs2#lELt9z z$ntI--`cU>5!aR9_{mGoKRo&=E>{lniswYdI zRzL)pV97*jwcdpIU5AQh;)tzOMvsQhQoV%rD({^`Zfn4_Es0fK-##5HvA|w@o|HtD zzGS_ziAAg`l^~lI-o8kYgnrxSC=v{+;=<3kO5H>6l?~-d@GW4vVZPp9XzYLHkSJTikK6vK^gp_bqBD1nM}vBJPAHC4U%=G-OhC&x;R^ps zD)r~13>TjGY(rmp@Xx86CF2(r_KoLhO%yAP;|gc?{z=3)cKzW|2RBiznR$}7QCr5& zCA}otYP#uxEtnnN$>WzB6N|T<8cS&yQUX&6ZR!c)pL@J7ZRO|Pd_+hE_RDPU{inJ5xHjuaZyI)ow;3ur9h^8^kj_M{f*#^(zhwG^4hUnBdK@( zSir=v>ltr$oLUCoiXdqGI-EeKZS#rX29@WQ+bU#nV2CsNM|8Y%h@E%E1N4P^MC*c4 zu3%KJjhVU=mc;F~PHl$ zer@f)t?KHUs_vPFey-=b{k|UyGG8BiBhCeVtnOiu1@y7C{eN$?ru=(}^Y<|HZ_tnW z`>pZ6_kqp+{$MlK-=E0*fBMolUO%LFwTD@X1@i)5am1z{@}~adF0bziv!k3z{v&F{ zH9#wqf4oXdql9C`wA$MNhk^D&KXG<$mVR<=8{5Jpo|Kd(NZdDpmP)EoP*|VLQ7l0zcZQcHvs@K(MZHj3X$4noGja9-gih2cr;#6;YDO<#pP$x$4lpL6jBA$+&EGQmQ6{El2NnEKVypJi~B6$~CG!gSdK%_|TTXto8-&{jPf<6o?;W~B z1}H8(Ud&yfQH(3k4GM?lG6;iJmkhEgTANyyw$?E}j}cogiwEKiOl1Zp=^4U>v@ZXR z!4xYV`wFdjt>ArZ^Bmje_~xcDktuiPG_#A3DYq-Pa0IB>NOUxIG-B4d+t zwO>E0=hqN$MRL}quP zA&aZVbMD|#K1{~3{hUjM{?)1Hrs~eW3PziT7akV;YVd=2^)RjD!p0dJ#V*=Mr%cpL zL`Q=#-&KAPhwftn@fOhm|Fo&Qn7@Iq!5ud6lIoWZyRBvn3Z2Jb-H8xTrP1nm>iUUm zIA)V$tIn2N%hC6hgo{>9h@Yh^CvnX161bg!P{=^fc%83PT389c2(1behFPMlbNV;Q zjcS6vS*#=qAtD-~?@h}0{A~||`gR*HE7305Yr6I~3cX$t`~-Z}4*YL9g3Q@syxtrc z)r&+Jkwl#FeXOkS|1#`Usl=RSNvv!7=sEzXlafh)I+qayXN?soFdSGv(Ef@VVM3Vo zpQleB{HD_L)OpNi`fi3bD4V<=I&d~5(RIjAQ-A!ABUX9J5Z{Hl!DlMDGFx`pah1rrd|ncVv(PK*g-S@cpwK84dcosw<}MGG%y$mR8sK{ z8ffr%MvCJOXSXmd+-}2!y;YC2me}QIHnfErqBHMOTd`geTuf)6eZ+gOv^JIQu#TRh z2>YNk9LuPFLUHgP?7c|4go@h+c*3c|0B2WK*N0|qXZ7VopP{0=iY7+%)I5eE>z?S$ zIyD7bls;7zzI#+$qAY@jPRfb4Dofic8o;(MU9JKt`7%fV`Rkhy-tyim2a z?D{pPa>CBS&V!dsR%Fklv^n9<4B~#NdEHdzGh>Nj6h5OTI1yr&&30 zz`L=1?}_Jq>um-cejmw}-8}2L`$gE#Yr`wRPb z*neQWPxf4XYL?(Y$K>Oc~snk5mH|)L`hkBFf)H<+zEE>se_seYkpa_Y+gzXZl8+Lg# zl3#VcSXns&n3dSS@5t7}7bD6d&cx#1wU@Eo_jI(<3kyq5-eu_eFOo| zT%>118 z%>BN8dk%2v&oH#GY*#0DuN`M<+29{PJiIave&D;f?nVaicc7!t=&u18Hy;!8Kl3r} z=j;15H<}}}Kczfrjf4Z}`cgpVLvfRSKHA2R{{5p`e!DD?TuX#)!tGd0v53o~bZ47Q)FqoZuTdx%h@Qo1XuN=B920g@X2D za&%Q|yqpv7@%6-4c+VvnY&2p$(?&ilB8SV(LGKKuRk~sW)8eKsrcrW*-WuqD?uyPv z=n&oDmE5&b#>P_1CxCFWGWJ~fxr=QL6m$tyerDvS-m|BM5E7I~*!B2vaN6gS zY^lj~j|fm-49+K^wz(wNO*c)?j|11j!r$$oI!hfju)sRiWP!HvTT`rQk_p5=xU%{k zvH;MpI?zEAGJDoCT8`!5d^%mjNQdSD+p+tN*(9Fh+Qwdlu>I_pssC@MNqbDHd8Yvf zoCql{R|KZ<$4Bj(?`|T^V{4_!-vw{e1;uFmM}vx9A+r0R_h?THdJEC zX=g#TfoC1q(SEO&zoSyp9LnZg)R8P_z&qmdN2SM^QU_Z*NfN;Wsn)ZmbKZ}3Ik^b7 zG~*WtBa!#`?-ECHc#TGoL9UO5Q{{x)lNJK%a`73t`y!+sx5%XKo{yZv;IF)0w-4~ zR#iHBhE(M35CV7H0~solko~Iel$mLj-l{?#Oq*)~TCepA>4d--u0eeX_^^hTnu{Q6MWEKKh zQy8PXW%bN+qc%y=r)2Wn_ zhytg97Sfs(@N!2!{<%`#M=ZU;+r7epuOGLv+8xZfOsQV87S++2ZH43Mf4;bl zU82{&tpasM(?t6-rpu&}QdFXI2MRudzP@=Wy5ftKzpqxIE1?Y74kVkPYhf8Dcsh11 zL4|p$5j#UDCk7mUKI@s>4T??Gw8)D^p0zie*!&~4CCfMSf)i_FeF!?qhDnxZc46EY zjP9A5S;FU@q8TP3@ZLw%zwCaQ`eqr`wJmsyp1J}4&12`_w_+6OUXz<}_jICv+f9QI z!4K@Zb}iwnu}{C(8k>>AQ9?q+ln}TWHgOPDwiqH5*Dn&;NDhCSr0QmGs&U!2{^ARxy&WP4iYjA5_-itSe3j z@|An-2f_cgp-(8NPVhy?_MQf|oW2#rq7e61G34vWrs%qcp%TZSiX{>-Sw+gEGgx{G zg0(`iN;QBfpiyy_cBoD*x|PS)Rd+bNw4r2QP`dvDmoBiBg0;1!FOKV1BE7i<(K4o- zF$(m`Dg$Cn1gj!{aIF)Mlk+rP4lNuLMl4d?TBlchbtC__3IoVY9vyB7|3qbQ%u!>vHX?J$4@C}?Ft+~^= zotAap&{`R}5tMPW2G$SgEpjFJYJ_M`uvTy@Oa`)g7)Ds$1*^PS4TY6(2Z%+HsgL-7 zm}EvG-kEiQPaT+ z7t#4D<3Cz_6jY0sioh(IXH+kOic+k%Yc5Amky{8s)AzFSF7HccSHB%|e}2d|^o(FklV)m99q&Cq3IBLnI6`Pa$H#kom>yHF#F0sauZ1rc8pY>zkAMz zxLDrU1G9qbhl<2}t@5^+Yfa|)-g0F4(W_Jwbb*s|0-(rZy6{H(LtpPSj_brgON?C8 zbq%mH^M60tcG;XZWYMkhoYfJkDm;t~@!xBe6P$)m;^IkB6KInM8iLJLe12 zyIT71woIk^EA{xN4fjv{T6_Fc^cNn3X33pbA;+TgZQq~Nej~EFeFh>Qi{64B#!s|s zp)I%m(3I~k^N~vM30V7Q7O%h$^vW+Tutv(WEs$xBxJDZk&(S&Gn-&*0v?pdei=|4y zaKgYPAp7xEPQVxHnCel~pdGVTY!-4irFlJ$^&@D1Iruq#EkS_$1JH&g=l}dj@s!$@ z_5C|74~12N3ag@6c6)P2-Y;1kh6mWYRMkY%CZRMdAa=lj*Pw$)33C)hs*+`N&fzD< zNiH?E7FmA)-KTx7imt3k*tI(->Qy+)c;N-l5wa5qysh>n_HFy|gI=!PMsyuxKk$d$ z&j>QCzil^h=vqX?6|wrCTZ~+~)(guW^5FM%?SnXBxD(rF-wegJj%W~ibA+czbe&7o zZH#A~!k}G6>GYO7zKaFzn7N#J>0}3=|I9qjYQG5Kja>0LBb|SxKVYEXKIUi*ypC*P zQ*W1C+cW~q+qLX$6DC6d3IPPHsve|eTOyb34VFSTHv4XRghl#d4l(VYgHO*qDX|P6 z_fvbpK{M1GjvkYu$0?+{i|?iEN&LG%#oad?l(o`!?>%0 z1oOan8H6`|G;@vjY5_v~!ig!SDmf2l!G&{Saar8nqY}M)5Azf?tmmxxHCc%)VNeIe zN07x5K#N!-Mv|?tmqxXo;7XpU`GcS>8JLlgTuFt4n~P`g@i_BiuTCmV6x+yr`>*5C zc1npVFF`|Ud^VA$5%+U716YVodY+pv9cM`NRpd%4^!)m3(By`i^zdKcvVCT@$|}lOr{`{o7QW zMrV6CV}));ipEu`tt_H0I~x0{}}nT zUI|6g1A`WW|F!yx^A)pqXof!k=nZ1Gm?%c`x&GB@ZZ1}4ww8JHX@%jD$;s{UgE3W4 zG7I~JaKbD^oqj2Hs6!w-^&=mD^7>}3P}+Gayv-V7FET#*k1p?-CT3AS{;2Xg2MQRt<9y#Qb$ zZF47qH?SEm1@wsWDhTJPlj6>Lick}r3JTQ~hJk-XZ}p>xg4jjJHlA5RexyQPJo(V9 z=2nryk%qtCym$9Fs^ZI^qzhLbuN>FWzK7cw%2DtBl57z}1kKmHA4pYqU99mURq>(< zfc=wxovWjAtj2bZPPD4Epxvu>|=U^SB+{gKsc~G;g!jK#{&#t9zplQB!VekZ%>`~~42o>jEHyTZwSLi0vUJ zpy_}w^zD5AWvkNlH|qymD0rd5?H+zXy#M>JwL1(kjIYy=6kf2`B6lwK)|wl|mFxI6 zlM^H0ETkN2h|)2-W1*AdHaf+V&}XdU$v?2BHqN_EV}3Zg?J7QAeEn2fw3Z=zHI`Zi zla1bGoGoo__L3<-EMT^=6edV(h*EJ3;r@XUtlm91C)WQJhmH=G^^^ZmS2F3bE6Xyl zGrb+lEfQwVz>|XP$J_U5-u>%3(1JFresZUm)f?TfvJ{4sBYjxhTfH@n!k$&dXBwaB zE2`SYf1DnAC*)EQOufhhgV2FawP5BCQ8{Pr2{X(3!>CheQ@qJF4Oorp0wZJzs?5JO zi3WHi^!m9|in_0pT(#%1M@44(Ne(tbD{oVEg?OijrpO0)&fG|&GgIR11I2!A`cb7I z<5Ks-@cgc6N)=e%y!YXFTOLt2s<$jjzk-QHX^Z-q zM5=fbW>G5iO1TEx{cRx50{GeL$(EL}nzY7~@;?&vc^#>Tj}s-Uifwa?UWWIH{`_4s z+0Agj$Joe2fA>QsR01M_3T`g;N4glg#N6zb9Z|&-q6!S$Vd}n=`CnwB74_`SBs=#X zHj;l=--Bll8?sl)Ib{YHN?iSXM_lcdvhv_W!b9|LQLnp>04+MLarfwO!6j6dFMPae z=$}b%z*Kjo+@lxR*_SjC!n$Y>-KSWj!vT%2AEsp$8GxxWrt|LHK2<}q!kxLzc#`@Z zOuTL9emg;5xO$?{AD_C1XmKn;Z|Ke@cqsCM zYmgKsXUEJ3{my8P{rdi9hVPq%M1%HkJN!E{y}T~{l#SEA?6=`3>|%AT>8AF2v9}XO z^#w4cC>ZCStx^iR`;pAwDOt6DQDE;shqR7J$=xbM+b`a+*g0`@G8Ous6QkRbuk?`b zjf##YdNwC(nnAX)ldt*SCg1z@xTxD^2W?L9E~q{RCoPyTO-nT zf^mLAB#jwY!byAP1BQ?GOhF2XD6+#O<_|5R7jzWX4~7VNpUCrCG{1ZJp)1sVH!vKo^3+4$#)n-<@#jxt>`0-ldc^}Fl*hORu5E1hc^0rohrpIOHYcu0O5+z{GpsJT3jr>d)4}mI0-UJQT(tAuu9bKAEhBIcspI8Sy zT9#F1Q6OrNV%Qmr|QsC5R57MOb;*S`$mup%bxwLe%>U|wUeuJ zYTY(RuPNB&=A3s)p20iF;a6>;Xg^I{WDLU~TqL7;1n83E`J1{< zmLINA(O*{sKGf=wia@1l)GK_Qk$3TzQ!~!mPe=kt1B=f4_uR{uo}N!sz(^q$hCr>> zrl52qOK7$BX?68Y2P!9$+q_ONLMYGo;kJ%+8Uu#a0Vn!wxbXn)Tfj|qc8akePO>@s znk(gT`2zbJSSd#MBml5U(fxcpD0TN7I{zDW!e@5iV!hfRpS!e5^UWa!<{r3jIh1Z# z>>70cO@2Z{BZCU7n5Y3MKxX^#dcF$pExA zk%8-;nohYkFVaOBul0nkOfYjGk9vE!3SVgz@$e_@kS&d&YoTKFMgbV@gl!k_FfPV;Dj+;Tr5!BP!3*nZnf2NXoj z7|X|-0IHSNQX=Vfo@9gaM)pz~-B6-MZf^u5Q_8oAq^7%{c#>d%*|Do2@{A6}de@D4 z*1~unHGx~07Mq5UZ+s|8PX>uR`he6!%AtmU!v>*GanK&rIhwONNCR4=jEADfPc_<| zu_vxGl`xFN@Wg|hWrBc}KH-(Fg0~-pa0`3%j>m`Tv}|81T8D_H0^!2ORS0j~`ysceGn+)v8uJ43%rqsNG*VG>K|U0A z;^LUJPJQ6y62kR6keGe?3T^tSXsIi7hAI85X{VCa@NrPOteOM&x={-Oib#_^F6;B& zrVb|Ri^P+IVeI7Ma+$DRl)%ic4i`#&P0UH z)O$12!WDns4-*$M1z>D@3cgx4>~(dBD?H$W zBG&`3Hujmegy{Z=8U-GCLc_pVWeXoyJV^LcL3tg-P$Sb?Dk->Mc#10E2vBKf;FQ-@ zOo0jK!}%AU{IN zg9I%TNX&Lno!$5NU8QPXp+zDsuF&*FAUqoPm3MyYdH|6R`S~@2%v^`Nyp4F@Uq zIDN>Uk=ea=ys!3}qQ1>K^jY<)yLL<>5}3P#L>(E)W_!kSnh+T*LLj+I4kQJ1jN|)H zBI;1rOxSz{Qrs|6vBx}tA$s3$vMNqXR57yVctlAD`J=ce_^lj)*?8KUcTNMH6kJ7 zPoG=$4V(qyrlbD|{K>Ie;$LF7qziI^Q^N}&1+2?wR&gBOgz1Wa{9Kbt!B;Xg$tK(- zbo%xu=jYef>3#`nIpfHMup{a^lq!~~spq2jD?jcvf7X4d81!EJl~-%OTi;StXuRz9 z0e!@o_v;*cK?T;Ne0_@NN6YTkrCKCMFUvFC=_bG7fjsX=jOp66gM%p-=YbV~3NHuWQk%byGgQ`V9oWVyoa2j=a6*!MvWrcplS9t*s>Mx>57+5# z?Z{R*uQ&~s(h1&3m5Xw#&9xBqJ%N@Tf5)eWZ8$}elO+i8k4iJamXpv>9!yX%-4kOh zE35hgjU4)nRhK0o3sF^3J=cn3P_E(&LA4R7kZZRPsn|spCs+;n&O8tdJYPFLB4Sn4 zQQ5O~4S6ng&Lg3f{_qE_zhxG zqd;9w-bFUe;yI~ej=B5qRqc;r`1~VQ>#4L(hSn1~8M20KLx)-Smr?{7UtVtY6M6Pt z%P@gYh<06EmG%Z=Wz~j6o5Ezo7E>8vM}sPbKh^cwPQN&f8NOvQ;3lYh5^D%uQ+9HQ z#_iivS9jXRZmGbyiCx0D^v)@ps$G6}9OF^9JaiA1&CIMfA0iyBFk~0r$&=EV+iqKe z_RGYspIl`A5qTmYP_9=_1zhx?jVziC&-U6|S^WXVJ}w4>>h|767%U1bspQCin?B`T zxJ5R*5{bCXX$hoT(Ph zMFxTsXZnJ47q=JS+k^Ypd4*jOF1PG#@X-B_@2)3EtO7beh5R>KTa-|l9i-CY+QN~UR55#Xl??8JY3F&%^GfUpK zBhJI6xV||MZ`Zaw#wN~Zh$bC-BF+>YNAs8;7vzueMU`aHQp%ldguKlM9i7ApZdMwN z+IFec(+jt@w3;d4z>lOgbjT`S$@lOhL36rp|L4>=v*;?%8my^aqEAZX)oQB*MAwaJ zLt@z-v!^&-0?G8aD^#LIX04;9f)<@agBI&<*EGNJ0*mJT!VU+OY1Y@!05>*yhF7X( zh+m+cI>=~>GMqu$L~!*C9T0E7L%K{Dk6U$ZN)XdYvcG$V*G%?sWx8%D%V(|LW z_#WPTTjBHnZ2z8vV*Pk^aI|CQPBL8g{v%oU7`Ujhd0I=a!PsDR$pF;s4O6ZO?7s1%F^J&FdCxz1W2hd`|1RsFec*c@nB6*vP_jCi!N*U=~wH4}nnCq`AME6lUm%Pwo zHf2+rkxZr$VX);{laSn0YENVs&-x-YG~NwJA2F{5b&EBl0sEL0o|MV5R(jA-rT8<+@}-T=*I;b;bh$^S;ZyuM>Y<06U;;X)sdh2mg3iEai-dWG&8MjE)xn=DdyC4`J`glP zn|(zf@VgrP+W1z=Rf!QXp7Dh6i=+H_^%lt=KW*MInR8&95=io;-QOXrFu*xxjEpQU zEMb@Vd*Y@j!IJW~nL0ikhXSOOfJ06P-Ca>F-N-T04rzJY2r43Com=blVV$l}{}~sN zh5;VdW!9RzR-n7MJMG(f9s@#D2WU{h*7Mn9#==XVr~wvDCvD;a$xU06^-A$q6D)Pa zeM!+FO9IVKpos&@=T8P@za>vw^&XKQQ=$FNHuCDD1~M91m);9<8G(q`+1YX(&%j-n zhJl9t5bGsXL#3{+)#j;Hp&GKUI`IZq6si4oLsG+9elE^dGOcOY=zHDytwG!wT9-;C zX6PiPtVCN8P-dt;??5$KnDh#9KQsom)%Sz)0=V8+~#_`T) z>$TtJ`sdnw1CT8q!!t#(+p|3GM9XEK3nG(M8)jJw`k|E2%p^TVI78F30QR`bd!yv@ znyO9=T<@}!eGWU-vE1)9EH;r{YYPb7YV*sAlyoU!w*IF!sUayV3oGg1;^kD>LYPKv zY5H?ro>rGG-%klw_2w_3C)9$4UcIGIYX9pt^@4)>s!{I|CkW;1^wsSqVCjwp;>30e z#Qjd3j8KrX{&75h!KGr$Xybv5VD`HkUDR8I2BUpjrA`N(7mdK0(r$`n~4HAc{4cbp9Hr_)IP3|w#Fz~80Wp<1>2>+&}5 z+qB;*)84hMUtB7lG z)T8S4f}e_J3977ElYh+Am4ys_m;e1leH(vQ^YeXqv#$#uT6?ymDc-1jk*tZGP+oj@ z-NZs}qqI9p#D*&wmaM^LeEY3Gv^lqPwgZnRZFekJRD_3-U*DxINvR3Kp%Pjp*w7AT zQnC*2NP6K(gn)%@{@O16&@e|2C3rM9rQ!(n?ahxo3Oj=gbZL@QG3cJBkO;&uaBj8! z;+#0B=0g5CN@?35*Onhx)ES;OWI#0i5PCfW)D3U9LxayPnI|(uyL1}H+FBDCq{Fh| zsIC)_gCwfX+050oA{*Mtp_1_<7kNm5;L*EzOvRiZKg|nTo!SCDJ z3ugxo+ZZPehX-Lb${kGci|gf|Is+~KV+@j;zY2En>M9Gqh6IryL!Q$Ri`kK(;IzTY zF;o+^e3pBK03(=*Ci$k37@Ew&_X-A?{|$=2A8??z2wnXvO?T}A$$n7*@|FkUu4}SWaLa2uXAOd2n45 z$fDJjaQUD!zIu82ViVgJ2-p-DykvgBm-yGmsuWo+i)&;6y zy74GPI=*Vpkb(EH2)Ki`-G#{!)!uYlM_d5j8#R^*-gsbw`{Xb%^@u(hn6!hF`2;gz zDxV`C!YZwH2(q}?H_OPcX}+1$c2^O}ZhC+mFmuB{v6LF7d$EGuKnDJK54CZS^-@bqOAq`YYQ_E500d(J5$p*=+Ksfc@3)gITm(RvMGxTGpzo_ zfL^WkSF*ftg1|~iI0b*!xP7b4y=nVrZdp6tFx-*&u4`7<9t#a#JDQf{U$KJq3R4#V z9}5TCTK>gdL5!wJ6mRo@yg^yn66^ITzFC=%B*LL6RDx7Ks80ApmVWgm3i#Bx!Fq3P zxgq$gv{LW-oJ(SS!s8qC1Zf3{ZnRffBvN@ZxY$Qmv4ww^8~jP^Y=L9>^H` zNp|Ex_W!0iDCxZ#(^rG9Qgh(PFJs|YPtttALVJ4{B}xmUL;$93>0*pmksIYdFda!h z3?j-x$1c{8zsG1zvDvq++TiHXr}@+y82rozPN1$&J`?z+w{D8gIPw{j{F%J^>~fmg z`&pk5$5;*=MR~$MV^09)pJp!*nF6Y-hC26u;7ogq{j;4QbTSZpqVz#~w$VVwjvNO` zKN{vesOkYL(v#6CH3ky0-IWI)&9=AIpmQO2o*`t}_Pz!0SogZtZSyg?AO%vo&5qqR zZ?W_91$@R=r4C5eMsqzIwMS$5L$vL1IO|mWyT&GH^aFLANC+}bYhSKxrLp&KP|b>- zY&lVU{CXo3h|-TjqfEikszZC>Rz)~!g_Ohm`wrgcO!BqrIcS36ojCgJQ940_l)2-h zVIYR4XT^Xlkjv2S(nz3xLl#Cq9>m);3QQ5^>7ZNAO=svz-7U+Tk0Bj~|I+zMvqaF8 zCnUCgC*Ht1*@U9sJXAUOet!?b2wY4pmG*kymfA_zH(A)Xsd_u*tLeu_IZD9(4@^$; ziUTQJ-Q}UB0CSLgxBXJK_M-RnYSzlG&+05pCynzJB~LD;C}s3}S)5S$Az93ZT2+`L zynQ&XjqKCpz?=I;Gj;zMUMq$P+05Mr6+~Wq^)dqu-I5o*m;VqV=Bry9pAi+%)JC#q z=s)O)ul=6I$+51L^Y>|i?c%?(&_HKhF{R&qn@UQ(VUn9uJJ8FGH+5`Qa8!I-qzBAQ zdbt{rd+tw-N|S>(E?k&up0U@OtJwl<773yMJIyJ=I1rVK^oEku6jbB0x@%D@*r9doOC3V9W)*; z_kHX)JySVfGxQaJ(Q5{*woO_3N_ZX7EYHCcdiF}h%?Vmf0ych1rft%}sJpFb1!!IQ zt`M*bT_CD3w2A(I$@SL{!%$JbXWn>~Pc|o4=2R{DWSosJ76|~lkR>FPa;Lnx#aSw` zUosG@va4KeqiatRxTREpQfJAa&#p}Dt}tUk_8OI?FGUeZg-OAIzX>O`KV zkTb9x8!SPVOqQHd7SBBmy`1`plH{_kcr;{zvp}~Z8*kJ?ztMeWa_&ENV7hkK0UoR0 zArXflM|9M#X^LSL!wzfm>M;TZu3Y2`@VanYLuKuQTWNC#cGJ)ghJNvs3F7gjAd;>{ zUVpLiHN`BBZi987nj!ZDUDT3k*>`Rj)rcxW%ZPT$7psq^JoUu*ei23|89s!4cPsv; z>Y?~B{4n^ia$D+MXZ7RUV`u~^Dy4A+f_znWgxPkIu6PVo5vFSjH~fN>F$#ijI|_X8 zKSG12Paa!_+sbA>T1FI#F!+-bD!bDT%t)_HXzE<&=4;XC#Aw-v0@eza;rTz%yvEFBU)NHB|D< zTQ4$$QMUSS=v#I{$DgPx0gp%yNUUL|V_8&tEX_~6HWIZW7KtA}ueUHvpjE{)C$2^< zV(1SrX)h!VsR}zk#W3gJDMm87;5x7=aQj4QwY!yvp7_`Khw}L!xe1}%=0v$zIrK2J zY$(`&I81oAcK zTl3TMRl5;%)I^XZl!^A3C|;ydu(jqbtO>34U4N1~#kY(A*!2r_kG2iK;@Zff>-kYn z!gC%X+N~lb`^M!Hp|rCBXU$45h{%5)xKl0Wxvv^-9=AtOCmg`)HvqXH7xJ1s8@gob zHNMxT8*mn>SQj#*>x1$WX1ZN!AKWD*Xe5afkD8eT`JdS3|c zw<^l#Sy%kML=mDkKq95^dA0KaSi_4#n3Q1kp!Yo7HDTfg*w_eZvMtdY)ifMqm2y8+ zpu{~&zABQ6^PNf?i?T-k;8)k5QWxYgWf;gNPvKl7p^jgp`01lT(qP3uFr1G9zrlY4 z1_>y}#0wyu!}n3@g-qHkFx%7kjC4+ePK5=sj&+%JpYV9`zLdY49Q`%n^nZiOFj!3b zN8Q_vlY%D2MP7wg75>9n+4~dk0%^Z^V?z}?55BH3utIJPR;ky@=7!#ew3h>qEUz*# zx#}A}aY|dE3>5oB+8j3LpwVav*Bj|E*?QVzTveK#PGjzqUfESeV9J3id_l9pXIux8 zCOx`?$txR58x$BM_@DUKqb$zJE18d@qgQ4v9XX=8tjkhI@VB}-fl>ugbZrSfUpr%A z@rtowGscpYV7#H;c65W@5?^I&=M`!YablO44R{0=H9IQ06NBX(_;wO4F6{-Hq&!sOT}_v}O(3R#lCm+7>p@@A`Xx;V zn%k`3hlJ{?cTHR)h6ni~hOtVs5hHh5UtdE=ZxJ?uCDgbR&udWHTzW<$oF&gz&Xbn_ z=?nep?qJl>lrqMUaI)6cUhtwW#p#c?6?F^X^BCmn(%|Ly?U=OkS=9-HBX%wF&#qW% z6)fRGc@`LfceHRx5oDt63Xw^1R~xh>OB{+|H1f$Fw@4~sV0}#wKEX$Xm9ztY(u~zG zDExQ*NfAPWgkMAF5waecw^}Fg185%elNO|XCMcm@Ia(DBcFK_bJe$a@-4*ZX2?E}d&9IN z1+6@(XUB-wUoh8)EIW`Hnob=2s7y$V5V{@$pKj;*@%lV30oB4=Uyf%4S4}8Kw$m_c zC&ni_w#p*>!YtP(-*b^r2~Bwh5U*DS4A~U?*JAxYEG5)<%^}0|V@b{MY+_y4+SZocTk939>dL$n#pjR_BHJO!IM$qtZox~6t<+6kE=}?7g#MBqef=cK~%G6^-k#OIbm>7TZD(nrEW2V z4p_doPcQ$#IIRx!iBHs8nhID+r>&DxrB$8VbfiNQ4)XThCkOVMDFtiDk(9E|bjrx% z$K8nzRIj?R+xmY9*8C);7BTS3&z@D`bt7U&s9-mOQ^oRTQGv`Aw`TX4tSRg$H%y2y zG{^q~1424|-jR>-tij{ujG>Q_l#w})s|g-d&%axJ*=fu!h^C_lx3$J@g0kXf8P}(} z08~dwf){XQ5J)Cfij8YDjytF?K_bA07$LyJZpckBJa+l3hlwmKlotrn?7+~Y)$ODB zAG2#tV1W0(2{}^1P}V4tY6GvUOG+}bIUX58PgU}-hGQEvvhnH%V~XhUG)1VwQGa;B z>Vj@_l{Ep>A`8h@sJJuu((i!~pG#XM@PuJxpVZ=Uc<7&Ujtcx3Aw?>9Xy--xrUH^j z0)C4-bXq2{4CpVYk66f^F_z{TCF!1WjH~Gsmjuv%w&58^_4r zC=sC+5U7~A)mk(eP@8bcquXV29fLqH#LY?L`p_dc#>05HjoR@Q0zt3eluSE#g9Olj z+}0*&C**#!9kK6@(ieA+I@{98bXMNk0qI*CE4Gyoe&#>l6f048{gs}PBHuN&!auC9 zX5C@-Dalcg+5YKBadtP75nWF7F?~6Ba+Inc7;e*z^?osa8Ea1`Wk{={DmTD_1F+;7OzT$lTU4&jNB4xxUs>{Uj@I~7B>+v4h)UR~?oU0P;s zv^@ierGYMu#=oAX6WZF}G1I}5MRh@a%zA%fQHs>--&3M_$I<4&)v1$~W%4*$Ni zS6oB!Edzarq6Ic1=T}%7KgD(>DT#gnZ8V_sjm-cEb*+_py@57vc0x$8mX@Z0NUbjf zfu!KhhD@J`wY@I!NrX|HrKLZVHUP@Z+-fia%pya-Xq$>4LYlZ zC_qPP$HkdGiGD{4GCN+=T{RvoY4MO6>CZHawW4}1 zN%;K~#PW(O3H4IZ<>CD1O;<#?;VH$eB64QUI_B9r=4peaAy)Y{%1WZ2|JHE4(i}Zh3a`}#FnsjE_(Kwrh(Bw?6o8fi@UWZ?CTQD z7!2YVI{f?Uq37sg##r9>i5e%bBR_C5slH?LgdB_QBYDWAUL}Nd-m!W7!chmr+8-NA zTz2v=pOu6FmBzm{^SL29k4g+Y`_HO2&o-l)mK1yWUf6_-eLZlRaax^vWndeF(C z1Q_#Y)VB<-HO36mbBf{ZAw<_Uy%uL$Ki?aO*s|-ilUa$h8YO+zFxlC3h`+U(=UvRh zIqcHqlOGbSMx&nJIf6-pKpTc@7Fw$F3k+5-BLoI-ab}bTf zqY*>}5o*zu=6`NvaLJY92{wn$t?)D!7K(3Z;9@IvYw;l#{8YeoL$#cEU8D(wxVl%)?TS>K#+c3Nf3CMx6csjwc{ zGu?`dEWNax^^HM_C&{#lmyri<=b|q*7at#&Z;%=Sv|Pv>^*@$=FUThXnCU?w00rRd z1QMKiS&~5#UfY=(=&xQ7tj-7N$S1PKx}ux}6hocq6f-&=21ub!If z?&_(k&+4<16!Dd#CQlB!6OP9-t?Xe_7VNemH6{r7ZJHFpQNrYMD!Dr9qJ;Q;t>}DT zE#IzAsz4hv`cC<#+9<}$2*N0nrN%geRO;S?k>*$R5AtUGUaf<=!SZ*b|Q`HBB-Q7VnU$&aGXg@w2GUxybF->GQ)26%?i!T?islq1N!)@}bscxU> zZG3y;nRu|Ax0u&k=Yn6^wI!cH1CDWxf4(#j7Cidko*BY&G71GPB!&mQNpj9NX08~N z6!H+1H6E6qlp`&@hD!P$ zgucGnbzTh*|NHV&YQlbCJ`AydB?g=d;IPTT$n<5|yvpntP^+8zwqIb}OWs8g@+!Sh zV+3XzKHUhdR2hJ2Vq__hxFH3F5711EU`Vq3Z;J3Q@nr@0Uvp$ZqwLd;KftL_E*6e( zg>oUv6!8`DLna7j4jI?i`gig4dYqT@M{9?7Cfy(QDJl)?e=9A@UdL`EU(VT|oMea( z*MOKWd?~!C8n(h-CFD~Vg-ELVHyC|EKvW>AQ5{M{ZO)@h)Qk=7~u8Ar(}=ynr(PKiUd9j)j2-xco-8*6C0X7!tzdKvxW%;xt=9bY== zoSNuO<;W@p(!-RJR7A))1}D!D>@Kd&=b=wMH^fqGtV>eBkw-6rrV8sHSmaZpz!fu# z#Mt%+_ZsJ?nFDaO&6DI!go=mQE%aaVX~e|fbdr}&KgM#hF~b-6jrm;}`z0BM=I4Ft zW4Jc+XWqYqwrXToZ4p@-GEY2o0{+j){dd^lqxXk8K^TG7TP)zd(L}Qu)pS&E=KkMt+Z)^5uCq8_%UW0r-R1pQFMlsuYafotz?|+ zIcFDD`GmgwIqtFNF8k>KY*%fz`R?V+)L$wQ5q??43WWe1H>t~&m(+<;42j(R1`p8(K)4vA<4U!m$ICNyjPvV za_b6+rNGcY7cy;HK3y$L^y|uhqs#xH6X@djBK;#XiTkUp@LlN$*CPJ_$`BFTIQA3b zA}05ph3sBEU!K*gU5hvcOyAn)J{K!EuW?N?Bk5w82^$O8TDVCsW`7^mOO`a%aWeF| zoR9>U;a!Zsm*=BrlAvR<;Oo{L;jD^R)X@t?0MS|(s$piqS3(&6U)p(;E(30CEU z&z_fxu{f&9nA}}gQntyk9!}Omsq@l=fjsQtvZq$`((aEXeR~J*K80q|Auy zNeaeFyp!Sdej-L>;LYd%VpV}%24gH4V|B*5apR$ZwiV6ES|G}8n6a^vJ2Olg_O7=T zK?nhe)jSm6>!Xt1%0|j^5I(*3EC1eJQzXde&*@&dxUa`KQNkC9p2|<GR*WYL^k0S+`D|IMTjnV$=rjZWv{h*ENHL5Z4&G3Iubu^LLJ zD4r;H%r!2QNZ=}M{|1@2s!a9q;*O23{HQNprB52{1&Kfh6MwL^EX&#E{$+Qbbb=d^j5l0`eFE>ti^~p5_UM0lclbc}hbTSXopz(LK69 zP6MmoV45AR6U$T~ur74kkPbQx$cZvqnBcj&IlF1F3U>({T%v%}t1^Cc!BVp^2ua~N zniPBVgX0zcT>X4sdS&Up9vgq69>qAM4ckMc!hE6zPnfuzC{&gVOakTjs`3)7AWkEA z#^s*t=47?~X`t4Q9dPq_(L7~{p_p8*2;iW+5-~_S;RzM_D8LCbK;J;%1kGQgzQj3NB|i6f8_gjQEdI zVA;ry{mF_jJD?mRo&?BP&IOH$qH*P9FKq-d3qf;NFKan&t8HREW7>&HA1?o8K3t`8 z#x9zo+jJQ@7^w^?1@7bo#3Kns@scG2LbDp>dCO$to4y)g$pO0zcA06gT?SZ%P-f0u ziQ^&C$l}DwKltL0O@n+HhosQWsnl`wu`PU@w8!;cWvhn88q<;zjeNO}qFi4hJuUBu z8q6u8I6P+~=)IoB1iy_u+24-Y%)05NdhbSZ@mCoWOA-zR$poS5iuykRC}4wADvf?P z1OTH1e7%+hN`XWPnvx2rAaLqs^Cf%Ps@BS)lH1W#_3JP3J3+GKZh@}}(AMZ#s<5!3 zf}ldLAn%#s&@|PcN%(By4Y7krICa>V?#xv3>*3DSC>Xs0&8qLxw($+ zL$}8bJNb`GFkmZ8IU;RzM?UFYi8aM=BG$8!H=MA&+}Nvvu|^viMS?5s z4Fj@2A;>2ZJW%t;7Ux5Im^Ob$+ntt@kkGXj%+nbO>25G}NNi(~hQ;9?FmRWE`)0|W z;QHwVwwq6D6+m|$CO}SDs}@RdJlP32Q*~&Nc&`` zTMqGwSZOy2jterwv?)Hs%uVmiP0yXpl?4*B5Rkl;6;2K^E)N4JFG>CZiZAx{O}8(# z&&gm%TonMZz>MNeDdJDXeFWAF&{P(Ed)lIK7+D+{7W~FJ9?uBgmm}t&jKpqT{zuTik zGmvM`k?8W)lcE$h(XEtY@A4icLM0{ODFO499ZSJ}J~B%H5dbUz zu;CAyH#Tu3HWv`NPbgRY$ruW1{p9cOjlhc#mM0UIgrST^Yx-^SKTkR)1_)3fY3H?sZn=4=0<9w*ELD>)w1Z zxT^Frt^QK6{&LLKp+)wBd?oKJSVHa;*qsf?T404*x+I2;2PgX4{lPOz&nf;va;+w0|AX zqy9+WEbj6@opt}P{tySS?2Ei z6L2(zMv%UVzxI1S5J7%O|FD63mOuD54M;im;f9Qo#-Z?G<@*ia^F(j=$6wBW$s!bl zffl@*9&x0Lj-B4OuiUds7gM^uZ#N783MPL4DP+HU-);cEv_VUKl4?3Sbr2mnc%L0# zdns(YrSZ6Lc_j8c(=YFRn|=W9P3422yV_&F`O)jG&zIZ%ukWAd0>x^z5)RI;kbL=; zCTuQ4BH9WCP^vsk-WJFiz l%tKs!vJXA2*AS&@Matk9F=eku`Kr*@Kk}%4xQ2k`NzeQFNu!Ye+af@j*`2E!Q4!(Rfqxr>v*n(u z<995FOahkfr{W=6C9q#$ceX@G1b!Vu$D8(&=~5XF#@HOL63DkxiFu9?x|i#|=u6+; zn)MSNpoLXgon6!Fyt`BJ6QDkuM|$5 z81vs+MqY*U;p8%Znue+%{a6sY=qDeVfW~H}s_`l1#iKS^wP}e?XqoTkN>nSUIMR^! z&?UPveN#Zye=GTKcP+SO;41|9;`gwH|Hn|af*i@3Q2yooc*i%60h&-`*5}HliPR+Y zXw<*oQ?WfcdcoD6OjSUf9(-s4e`X2YXO2XY1Z?jN#z3(9J)1SO++kw=26BvScAs&c5PH`knzyLNzbMPw#ll5w<*wJ7wO7Vtt}fCy z8FIXXhPX)(B_@uvSI$+9O$<*}=O7_(TxOneYyCQ9*8GhfowM5Z)n~<&zS|vy+tOr@ z2Pzgjn|O}qSF)JtokYUpyyq_lx zjUZVWrL$J6UO2_Pl3pGO%mZ9(V~i@4i;oPPd`(MzgV#DVF5a^t=dLd%6@2#ON}dO} z+W;ziR6ghv8v!(h`iFEyZaT>a?<~QfI1Q;Fkt7=0S}=(EhLo(53)_u37+XS!iY^P!KCN!}P);44HS4DK zDVGBx0OOcQi6gdD?sGt)Zh8wUQv0V6_#xy z_eB+wx6}l5l>LPeJeTFN+@*f~7lFYiUTrYANvy&cC$D7!&lGo-j4xwq*)}Ecte^n2)Gf>yxg$ z(5zvG%hR-x$Zs*hRf9)63pL=NyEOGVV`jjGk$kZjZn}bFx+tHvCB9WEt@V}_A#FLJN-*cX1@%{ zVMWMPW4U>zOXJ-p6V=q z3l6BFzW_ptC7!64H{!ZUrH_U95fFDNYAKh6v_q|;jFhvjrluxa>#3)Q%Zs#hLQGr6 zK_8OVX@1V4H!N7{!91?meNF@n`al|-<14Vrt$s=?vFJ;hdpk~5pzv$>5GqN&QwAOc z>3-}R21)qfkVZmM{)79S}WuR$W$aC@WLQU&LHu_@#i7o(w+As z4-t1c$6re1MYob7_Z z$d!|2SFq}4GnkF=V{c|8Y)`7%kMnB4<(}*5LL>c9iIe=8nE6#BUQV+jZ0!Bn1$#|G zEZE@tG+ngP0iqy@A2_V%pYfKA>i4)FigK+*4)>fn?@XQ-`Q^;;BKZk5K00R2k?HMh zB%3p}LU*mxU%#c8`Tpzcfk6Fn>FN(_5z*`~VG;?wm1k885`Jc(Jgt;JVypnAVMfaO z$!Fr7nQ;fRu`iV`5QocCUQZiuQC%7hUdhb6)%Q+Qrb@~kU*mq~rfY@W{Sg-au?#x| za?}Y3dXQX`0a?_9UOggi5A-8S__dbF?*pmCfaSn*fYLCFNw4AXDHhe0qbg`>hZlkO ziX4)_d+AFaf~Da7uAC@1ktv)H3H4O+IKb-TZfd*M_yw$rbwwH$-r2-_)V-jNvon?s z%vS*~*kizCRt)BvQC;nA>?!{OF!S)LD>v>>OXuv#vUALW-7vY6*pGqdhpI_8AsQFN zg^He0%7KSC_J38X?C*-&lLdrYlarXu6K*e|b9XX}oJYG&GNH>1B*{H#HZ@e+Dn?Sx zumz%UM_;Eaj~WTSD);7=N__=$ADSbB-dl`N?jg*X)_c=g@XsT<-~MLtv?z5ateQfJ z>k~X<3WKx%ARx(F1Xp?gSB3xxt*C?;ut@lnshvVw&SDs*sg#yDAZebMk+DI@BWEt7 z#mECiRFwIR0d6ho*o>}bbpgB&fb*y=e}Oc_1hXRDB1c1-6tvQKjKbb;MWIb)5PzJY|> zGU?Fagm8Q`@<3dG%-Tn@JNX%wJ*okfjus?j8>VO@>Fs^9fV6UYp$ho1>*(!{D+gFalV~6%4hTI0`|EjHGD!OyBa#zNMk%6 zvMOaTB@lk0>slX@0$rw-SYcg=XhY6c_x`WS%7`4_l;E|&S44AjfFuKGLy!W(s1An< zw+Ppv7jsoL%UB_cM4|lbwcNYGR81a{$Dx?}TV-W%!hU2eaWUv{0^I zKF;nYk06L8(-&v0LZx`(+xm8Hj79t}KPs+6ujX7y5g#zA(yDF&6>FKJ>!cRp9^*E}if;$CotJVL*OHozPI?yG9qa7JrS0kFp^PxOoeCa@YuULY z3xY`(DO>UoY{W|fQAh#IUXy9Ap$$>nf4J=E#JcUb{+3OqyUB+fy=<}SJ~wH%vqYle zP=R#lMQL+34b&$lvWN};3xofC$ZAMj=gq=G%S+W^6xk(uA>_TXVKEQGNeZrsvqXxv zr45@Ew|92=8O{&Ms`o?<&M2F>LW5DL#p5FrQ+*S)16B#~(;DkZ^VmF-V7I=oA|K2O z(Vf|Y#i7jchU4QggpjPE&e>n(^e_RdM8KsDNHqIFt@sdssrUkLLKNy53JCet+SuBB z)L{qpNsJ;C_jZx5z``1hjH&IO2-S|M-Tm_L^Wl#u&o^+wNSIYDv_6-ciU}nFVOTUw z3A+|DtwJt$=r+_{POUG#3C@Nb^;h2N?rjEgW1(>W5&X`N)?7Pi0?86AsGoxdJBv!72C*EfNr);7NMmiKoLX z!Yu0Mn6T#(NhUCe<0)n{66V&%6&<8C$zVbvyfmch4t7QO5%j|@IyB}9x=>zzkx!E_ zcU4^fLEn;835K7R?S@r_6=5`a@a~sw+3Qy%c90^^ zUSf)W*s@(mg=CVGqE+2MwYfl68Uw0ggAvz$98F96J)(p|gQB)0{cg9PzWvF&{q2gB z6y)#vK>b~cm2vJEe2UO~R8p_&vm|iBoc*o*9!CspM?16G{!+aP_EP2KXdjj6woZNd zKsU9SVXH+h$3URycjJlMeE=Wp5HyOt`lbLB!HQ|hF|}Ea?3>G1EX(4abRxyCCL%D! zHDC4*f(@8@W&Qmat5Q=fzadJ}a=NsN_lmRBPS}qAb2HrzB>r5~5m~Dd2CL&^$rx(! zMX6^vc0LQgtV`2>)JeK?lV)SjjPbUhBb>{c_S+Y&IH(Y(bk=0lg<%g-J2*|SMzXUP zECdLu%TkmRrkE;PsjD&{A7vVJPRC`sq)vC=+bl=P&8>krRW_S1ejgVc@YffwcbYVS zB^o{ng2+rnj zsXcXaTGNVtao*zmdrGSMGzt`oyn3W6;3tiq+u$nwmg4x63T!wJMDSsd{gX4kEMpCo|_+6*@;PQ zMW)L3C$!BoPMq5_Rl6BiTat|C*ib?Qx#(d}1?%FKB{jdRg$0jMKdpxLk89|`>OKfU zHchKasEd9471NTm(JUHCE{}e=-=Qt3Oy1*`su4;pP}TtEd651Y4WdxP?X~s`GRoSS zV~~-aL3PTGmectptvgI(aaxx@!}Y_#)s(>sDToIx?wnD9L$m-9s!XAqTcqD9te-JV zrVYKlC!8>#b!8x*RUq=s;Hw^=NOX2(p5Ki2kfPs+Nb7%7oHFXJQ#N~SZiF|9+)tv1 zYPGuI7&bH7Ft^hhE;dSVr8SO`fgbg`1XZoXXsu~IH`ow#&5z~o$o}=MNdKgb1Pg_K znUOuehw*Y#ack(5O%ABT}`ebwF9W{xZvW5%^mH5~OG_8yOLBL#Si| zr!{_IJhZMg;4DhqB`|F4_gYvahGmOQFUykoL}P#mj;0vdU7+xakX6ps z%UF6$ScRNE|HxDoJ80I)I(42j(>R=NtaIwZFgA6CT!TX6*z{Gpj)9~)7plAUtXj?Y za46_#-E{naK!dwZ2KLyo4o3rYnN*e1U*9UMz*}MxvJe3VV#e zqKy8)xkE#L`tjJ$a?%r7ofE@FHm@Ijp&N5x-I-1U?3he}i|(Mmx@EtsubPSnduto{ zr@3OcRq6*DlB*uwm28W~`*M@Mt2V@8IWn}KMDEESh4dcpeU&I@^QxAx=X7;;_I7i{ zr0PLy3YGchBt%bY*wI|;%+N%#r~(Txy3tXoLZ!ppMS zJ1v}~4WTplwX=QdTkqSc&-=6NiTg_ZsSFZzL$p#lR|`pEVGG%OYpKHC)x8_2dO35M znjt|r5ENEDeEnhjO4HI1EH4AGE&fZBUP0YzBv#y^E1~8(qbL_+p{_8fYG-IaBf6ni z%Z%6fKBSR1+X6yrBgx-~K$%{xNhws*TB@qTv%pk!+@ViNNWhBJ`8^$t?^&WbZQHC1 zd*e?NHqv|a>7usSP}k?@o7%=zUmsIotpt`Y36_80w?t5Bh7Wq%ACz<@`B$vfzmT} zgIz*>WG#3qE#Kzv;K+-8;KUm8a(?Yo$T*rihK)yU3%EyDiiokSFalY{XWoox4YohN zu-lgj%%@L44rMi{Po351jICD2Y~cAgvH4ZPRm|-;HmzxzuDy9y-K2qlQ7&iehms|0 z$PQ+E+@#!0sbAy0L6M269r7ezLgeDOVN-Z^Vab<3=Tb@5>hVr{it-hCOvTJmRK9_F zpE|dloaeQ!vl<#*7R{^7eQ~qKP+j*U$_U%+i z6W}kt>edxv_j?t6|0@j5lVDf-m^|cyPxOU=;U~NU+#(~RZ`O_?(kz3`+Fa*8?*&~t zDQve1P21X^!aLWTf#g7r@XfSbpa8eF9FtwRo?yZ++2W^DSS4+;YcN-9bU{Q zz^j>&S_B?;rTq9NSJR4(^xZGbaeVwTZ^SpqpJGuN zgU@f#HLdjftax(O=GBMER@czJ4I6W~X9!41GD+37>gW#(o>1J68=KHczqVz$>XL&D z`d@5?4bu&Gcz2(;>DzqV?JE#U1RZ-Q2##pvET<89skhL^K`58@rMwt|A}AT6@K{&XWiFOsDr6oTK9i z)Fh_;Xg4d4Hv3UKIKewKJ4`<`!wcIvVN>%L&-fJC6lKQsWtsMqBR_%rpgLoB535Qq8d5AEv{}2 zB~R7XRJ=ygdJVoH_O5udURmAWE9j3B^IT*Nr>!!&GP+zuVTa>h$0HDvi}}xk$+1d< zNn1=w?*;Vl%-WfjyKdoVa(L7sXVd!oOmdiK9U{}Z_z2=(@ zC5pOXk$R<9cAHrz?-eRDE2B&Ga-@#%)d?@O%`od0yjfBFj%zRrDUxY;_Gdq+JKl8? zOtNeU*=KrX{{9hP`YeCp52U7~-Kd3UjGNY#N$?WS!NgN1Rf~1K%@a#H=k$Y%qb}J- zY3ac9s&TTEuQLr7&H=(XpYvyjg-MY?pPjMQBHRe{kxmx+AQq)Z4%3|IST2j)s<+w&y<$xQs*Nd#+dh579*Q7AurHfN$B=%BrMWz zi_R-4UAC~I<#WBxx+iq7h-tq1vy5(#HMuau&R1CdL_yBkHauzqPWK7s5+?|V@|sJCq!gI6AFU1j&fThkc3*OxFZBzB=KTPhAq5V}q?%F)eW3CsOA zlI46@%jR6eZYSYd%qaUD{!RSVWsTQbnW;Q$1DZA`qvaQ5wey^p%T!7t;bH4Ob#DYG z+_iq)ed!r={m4bj% z@9ZnF?~;`diuW2R)*V?Rn`Yby)W1KE_}(8=7`Hm=tRf?aeh})W`z#ot-+2_^*i83| zfChnS<258?Y!2AN0-U70yOS6#LM;U53xrs{R9Sc4?ETdJcO*h*&dkU<{9wvx$ST5q zV8F#nXOYm+SFw`)m$ShOiF_RiuTz|0met5VmG&Ht#P7To0B*SypHzfz93RO!LO1%)})|4ZO#0SdhH9G zgYwo7`Wc5JrJX?wU@K)aR9zBUd0IoCjtcv_PM;PAOP@9M;L(oR@QeA0uL0gAYPO>B z^eVnT2t+7$!d7(wFteZXd9f&KvEE9H7}`?oIW*Uv{dfAxW3A(}lT9zhquYf;pq>WI zu`Ope=95Cb&F!zBV8M>aU}cBrm@%&1fOto8dniu7uyw@$M({`jCjMjX^SHyt$==E? zhgnKtI=M&tHJ$?%k{Bh^@rO;}g%s$sj}e;cAq3hmn4D-WMy#BW~*p<*bD2F(5>?+_bWKd=x?kKqTTP zdejOk&_X`YEm!?vo{G@~bhkoenuYud2eRZShTUG}p$_eqG+V(k!Cd3edFR3|H)t5% z<_n!mR!^k-#U?-Yg66m@S*XB9^aZ)lNRCD6R`px2M5^0RNUIlSp1_O*#jo?`B0k&^ zx`X}=&z0MY7;RCdYH5bv;^na&QbZk^6cU^mGkjf9lX4@DO8TL56H^e=E0DE}TxR5- zk}q-By~fH>b?DuQL3R{%hH-Uehc>UVvf2mGWf53v0ui)@n+s91nl+4TTM}T?*Z4_4 zCs|szOkDQnR>t2QlQZe=kk0w1w8+FRz2MU68VN>nuS1`pTUN%hL;ph4SIa*zG?_*Nvz!UaTeW-&?V`H8q7;I0MA zpr%0e$+~#(0@(B+av7%9hYYcOz`PM5>``<}|MY+60T!--3pcO;Ha7K>!$Dn9pAtS! zmgKo2tGOm-KIT#%O~s4^z_I!EAePSs(?bHhc8)3_4CtSJ*-S8}<=DhWa(~DG<+_Qp z$b#IX2Dr1dC}8i@-M6;lJAOaJRv+KQ?FPqctd)aYR(Qu9&W8h-PtCZo+y$d_u&B=4 zhBkPie?vU#RT*+fw!`pqbYIyWKa)5iWz3tF(KM}|Sk|_mF_!o_=xCXQIn{U{D0L$# z3WSVXUS`vlW$j~A%J(4%I2V*idN~7Tw(odE0*rD(b zDVpN^j)>HNF~-9rc2;})T~@weg;Mz3caDxgS}+E`we)Y3dFkl8^DwViI;nHWK4t}T z>)W51;sbt+MyYObAGa~avO=K3*n_oPCX&Jmf*;#o^oYDW3eh8@nCcac@Mj2O>xl5l2cKAA+>GyGWfZzCfi#-qPM-EAC)(-cfGBB!RCeC8* zu(RlTdMeL)pMS?NwQ+--g=E?bYpucZ3Wk1?MsJ$wFdlOZPxu$|@G@IQI>=XF^FTy?yArM)&sB_ufzg zOEwv+J4tm%s55w#^}^YzE`&02F7HX+sTEF(Yr`WsghCb((L8R+`SF{tBg2X$tJL@o%%38R&okdAbW21;oBdXK zb-=gzG~X?tPES+_tUk&n(A**xQ%O-tNKq)%J+aBM9bOX7`pM{CL8a~uI%GL2l6yeS z2c25>HI9C7<s%) zMR+6xd_()AMk(EoRQuobK1e_|fPW1!OcmFFN*+!_WL}E^Y2Wmo!R?=bc_vR(OWA&< zIFtKmRkKOiO+`gB$D6s_L0V01Xm*y&g1J0aKv+z^Z2ItG`j_}=>o)1h_3O`DWPCgP zz9sgaE%k{35!uPm`nI}24kPmP9Ks(+)^3^KdXD>_(>3yL6lskjDb`+jI$=x3x`!JE zI?O1Qe{9hjCf67H>M$gBaoZDPrW@gjT70L*O9>^R@a)CbUi48YR(oQm4{p z(pt2oHx z)z7iToU@1ygEXBcr1o257I6_-H&%FFDr|n!F{5Vj;I~aLuc`LZnVtew;FoTEj+ ztE)7I*S{yD30BiO>|R#m;s=76w6?BIAzH8ZJg#Jrnfbi_f)kDeqF7s%L1Db+JG z^MlIV)yqm(VGQX#&2u2Qf{&xL=y0@Bagi|cE8{n!ICU57&udF)U5(MlyggnI;uuyi zEXROmm_-K`DdAVUvL-Ql<)-kB1%DUc@3QW!$;(X^J9%&I1wW}aW*2=N=6p>0okg^o zY)u1A_}xdo4$3($$|hmfB8lVj=)S&{nP0@Wmz&gSR$8<>F=s_laH<2Dx{*_i%huRq zRUEWOWjOUa(84$-6Y-OWgvz`r368=3pE(%A9nq)B_~QLiES+ke16y9)U6RGZVyhY` zrHsPgaOr(Mc#+M%0qnib*W${;#fhH5sNPCjDE@ZAc8X)Cv$g5iBB36=5S^I3W5n|3 zt$A_{@7cS6RAC@ciuePt3I-e$o=~+ohKRk@cKTlq4{&^qcPxQV{NCB3a~=xpIbsRe zN)-cQMK-{4eLGOKm<(c683AZqw|9e9wa7)3V6> ziL}MbDiE3BOi1G={w$l9(NvURfFO`9CE+P1BPv*+xepe^R^Yb^EvdI~JRZWPed@3k zm`E`B6?XlV6*qxxB6Ai%24o7)iEFupVswt&!kwG4>8(E1eI>Jv(-zG3_H>3cu4A6e!D!&-G&?l|g1o59MDY*dTtW!Rm0yUzs zSr#Hvgxf>oa(W@sl5qtUxinwE&6e6X?fH=g(YuE^yXoq_XULOVh;6|;IBFzuQWZbC z5+z>HAgabhV55u4e||+$^#=yIW~0h`XCXEqgs(A|2Ravz>-?+AO*(Nd@9X=^6yPoJ zlmbsyM!@z6hgrCM+7HygWzv3&0_rRvFaw@g3UIxWg{KYprw>609{~vo0SOZU3GEpg z!qW#42_IP<1&@G+mWx|L(hOCK9>k+z?w@Y8uBML#uho#+mk~Y4cXx}|L0K%Tv(Bt`JcO1*y>0BdtWsB)5ZV({P#)Ihilvo z>dx1GLBAh<-1lBboId?@FKEeyS8lX%(m@KKO#kP>uad0EOazssOZ@M(@Op+}e}ZGC zWoDaSuycl`S$;*MD^n}rY2!mypV4{i&Up`0nKo?=<7m05)wzA*9Zj`*e}bLPC=b@; zRhi^g(?h6 z@Z9z0`1Ad~uUn57DmSW`c>}xyq027SB6>?T6N-y&ccM`qZ$#t=QlE*x0JAy}XzJaN zgti6-J&aJ z{W(Lq>nNQ`;c+6o++kR$UC*%6HII7){CV4L`qCApCh2=lI>Uv_zgCXKOoFYuOz+Ki zl-yk=2i)#u6yAgC8OqU(8qN|0n@C1`M>Of8J{P9SQYr-n@vyPsZv3?O-&%CJCnKPX zk-gL$DlEs+aj4eM;bA9#X^X^qW&=yzn7K$&Pe>$5tNdwuYo)Q!q#;XW;Wtz$43$nv z){ym>Gx{BLsN#JQ_xLWClK<=;nS2_bLv`hbTH4SyCux!(~dnzO=aKjt8-jl6o1scdC7+kDHN zB0{0HmHxMEg|kjdO2$GC#X^oQs+hBKE69LIG}36!q9)ABkdd)8tS}Mm-^+Kn|pyD3{h%9er!1 zA0*obKz8Jvm7yp*J)*Xs+UOQQ!2`xTLY5cGa3DSmtJ&*mg>9S3PNcvlJF1N?wvPZ$%_?F9!( z-S4mX_WG=+FVcg%{y~^B^oe~uoqCVgefBHs;LkIYmhI8NR;*Jl=;1hwk<5y~fT;M^t*p?&@rN9l6_%iAPPd9W$zOsXgVp~#4 z_ia~3^=-LdisEJlq4&yIaK{8KhFrMPVMQU)15IdM#o%W80(6N3pi78|XedaC$f$__ zp-cEk$an-?lImtOwA>PebQ&l;!Mx^fA&I}Ah!OG=G4kTJE^J|ueyN;6=Ea&aJ3Li0 zvl|rt;mey+q{U(lX{peY->|5PBJLlm|d8;)W?^Q?bRQ-bhZP==+fR>*(%YG5f@JtF%J0_e? zJNU~}v6sc{RDR0In7wQx@7(lfe9p0>`o|^DTc$-{qu${{li1m-^dIqz*}h>N9p80C z2vt~2;~nHOi49mS3S!=uDw&@B`mBQEvs9Tg9dKww9C4ZGs;Hy*`|9Jzh z^5ScKHN1g-SsoTe4ZYA}?4UJ_rw`@<2-xqrnN5U-5fO^a#L|!qe$NW2`F^8G6fm{e#cVNi5se=P_sOpnRPr0EgEO( zP}%}Zvblgp#ZBx>6=m>bCqLRxo6E+gM%}oKcR#;QtLQ#jo|We8@;&C4 zJId!(GzZ!KgTPDKVR(~EHW-Iyn(fWg!m<0y(Q|A5VDU}#g49=S#{-$&E-cgR*Z(a4 EFFM3hAOHXW literal 0 HcmV?d00001 diff --git a/apps/docs/public/trademark/icon-dark.svg b/apps/docs/public/trademark/icon-dark.svg new file mode 100644 index 0000000..7751103 --- /dev/null +++ b/apps/docs/public/trademark/icon-dark.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/docs/public/trademark/icon-light.svg b/apps/docs/public/trademark/icon-light.svg new file mode 100644 index 0000000..7751103 --- /dev/null +++ b/apps/docs/public/trademark/icon-light.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/docs/src/app/(docs)/[...slug]/page.tsx b/apps/docs/src/app/(docs)/[...slug]/page.tsx new file mode 100644 index 0000000..b79d70a --- /dev/null +++ b/apps/docs/src/app/(docs)/[...slug]/page.tsx @@ -0,0 +1,157 @@ +import { notFound } from "next/navigation"; +import { getPages, getAdjacentPages } from "@/app/utils/utils"; +import { formatDate } from "@/app/utils/formatDate"; +import { Column, Heading, Icon, Row, Media, Text, Card, HeadingNav, Meta, Schema, Button } from "@once-ui-system/core"; +import { baseURL, layout, schema } from "@/resources"; +import { CustomMDX } from "@/product/mdx"; +import { Metadata } from "next"; +import React from "react"; + +export async function generateMetadata({ + params, +}: { + params: Promise<{ slug: string[] }>; +}): Promise { + const routeParams = await params; + const slugPath = routeParams.slug ? routeParams.slug.join('/') : ''; + + const docs = await getPages(); + const doc = docs.find((doc) => doc.slug === slugPath); + + if (!doc) return {}; + + return Meta.generate({ + title: doc.metadata.title + " – " + schema.name, + description: doc.metadata.summary, + baseURL, + path: `/${doc.slug}`, + type: "article", + publishedTime: doc.metadata.updatedAt, + image: doc.metadata.image || `/api/og/generate?title=${encodeURIComponent(doc.metadata.title)}&description=${encodeURIComponent(doc.metadata.summary)}`, + }); +} + +export default async function Docs({ + params, + }: { params: Promise<{ slug: string[] }> }) { + const routeParams = await params; + const slugPath = routeParams.slug.join('/'); + + let doc = getPages().find((doc) => doc.slug === slugPath); + + if (!doc) { + notFound(); + } + + const { prevPage, nextPage } = getAdjacentPages(slugPath, 'section'); + + // Determine section title - use "Docs" for top-level elements + const sectionTitle = routeParams.slug.length === 1 && !routeParams.slug[0].includes('/') + ? "Docs" + : routeParams.slug[0] + ?.split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + + return ( + <> + + + + + {sectionTitle} + {doc.metadata.title} + + Last update: {formatDate(doc.metadata.updatedAt)} + + {doc.metadata.github && ( + + )} + + {doc.metadata.image && ( + + )} + + + + + + {prevPage ? ( + + + + + + + {prevPage.slug.includes('/') ? + `${prevPage.slug.split('/')[0].split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ')}` : + 'page'} + + + {prevPage.metadata.title} + + + + + + ) : } + {nextPage ? ( + + + + + + {nextPage.slug.includes('/') ? + `${nextPage.slug.split('/')[0].split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ')}` : + 'page'} + + + {nextPage.metadata.title} + + + + + + + ) : } + + + + + + + On this page + + + + + ); +} \ No newline at end of file diff --git a/apps/docs/src/app/(docs)/layout.tsx b/apps/docs/src/app/(docs)/layout.tsx new file mode 100644 index 0000000..64997d2 --- /dev/null +++ b/apps/docs/src/app/(docs)/layout.tsx @@ -0,0 +1,16 @@ +import { Row } from "@once-ui-system/core"; +import { Sidebar } from "@/product"; +import React from "react"; + +export default function DocsLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + {children} + + ); +} \ No newline at end of file diff --git a/apps/docs/src/app/api/navigation/route.ts b/apps/docs/src/app/api/navigation/route.ts new file mode 100644 index 0000000..a74bdab --- /dev/null +++ b/apps/docs/src/app/api/navigation/route.ts @@ -0,0 +1,7 @@ +import getNavigation from "@/app/utils/getNavigation"; +import { NextResponse } from "next/server"; + +export async function GET() { + const navigation = getNavigation(); + return NextResponse.json(navigation); +} diff --git a/apps/docs/src/app/api/og/fetch/route.ts b/apps/docs/src/app/api/og/fetch/route.ts new file mode 100644 index 0000000..4287e50 --- /dev/null +++ b/apps/docs/src/app/api/og/fetch/route.ts @@ -0,0 +1,98 @@ +import { NextResponse } from 'next/server'; + +export const runtime = 'edge'; + +function decodeHTMLEntities(text: string): string { + return text.replace(/&(#?[a-zA-Z0-9]+);/g, (match, entity) => { + const entities: { [key: string]: string } = { + 'amp': '&', + 'lt': '<', + 'gt': '>', + 'quot': '"', + 'apos': "'", + '#x27': "'", + '#39': "'", + '#x26': '&', + '#38': '&' + }; + + if (entity.startsWith('#')) { + const code = entity.startsWith('#x') ? + parseInt(entity.slice(2), 16) : + parseInt(entity.slice(1), 10); + return String.fromCharCode(code); + } + + return entities[entity] || match; + }); +} + +async function fetchWithTimeout(url: string, timeout = 5000) { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), timeout); + + try { + const response = await fetch(url, { + signal: controller.signal, + headers: { + 'User-Agent': 'bot' + } + }); + clearTimeout(timeoutId); + return response; + } catch (error) { + clearTimeout(timeoutId); + throw error; + } +} + +async function extractMetadata(html: string) { + const titleMatch = html.match(/]*>([^<]+)<\/title>/i); + const descMatch = html.match(/]*name="description"[^>]*content="([^"]+)"[^>]*>/i) + || html.match(/]*content="([^"]+)"[^>]*name="description"[^>]*>/i) + || html.match(/]*property="og:description"[^>]*content="([^"]+)"[^>]*>/i); + const imageMatch = html.match(/]*property="og:image"[^>]*content="([^"]+)"[^>]*>/i) + || html.match(/]*content="([^"]+)"[^>]*property="og:image"[^>]*>/i); + + const title = titleMatch?.[1]?.trim() || ''; + const description = descMatch?.[1]?.trim() || ''; + const image = imageMatch?.[1]?.trim() || ''; + + return { + title: decodeHTMLEntities(title), + description: decodeHTMLEntities(description), + image: image, + }; +} + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const url = searchParams.get('url'); + + if (!url) { + return NextResponse.json({ error: 'URL is required' }, { status: 400 }); + } + + try { + const response = await fetchWithTimeout(url); + + if (!response.ok) { + throw new Error(`Failed to fetch URL: ${response.status}`); + } + + const html = await response.text(); + const metadata = await extractMetadata(html); + + return NextResponse.json({ + ...metadata, + url, + }); + } catch (error) { + console.error('Error fetching metadata:', error instanceof Error ? error.message : String(error)); + + return NextResponse.json({ + error: 'Failed to fetch metadata', + message: error instanceof Error ? error.message : 'Unknown error occurred', + }, { status: 500 }); + } +} \ No newline at end of file diff --git a/apps/docs/src/app/api/og/generate/route.tsx b/apps/docs/src/app/api/og/generate/route.tsx new file mode 100644 index 0000000..ea43182 --- /dev/null +++ b/apps/docs/src/app/api/og/generate/route.tsx @@ -0,0 +1,133 @@ +import { ImageResponse } from "next/og"; + +export const runtime = "edge"; + +export async function GET(request: Request) { + let url = new URL(request.url); + let title = url.searchParams.get("title") || "Documentation"; + let description = url.searchParams.get("description"); + const font = fetch(new URL("../../../../../public/fonts/Inter.ttf", import.meta.url)).then((res) => + res.arrayBuffer(), + ); + const fontData = await font; + + return new ImageResponse( +

+ {/* Horizontal lines */} +
+
+ + {/* Vertical lines */} +
+
+ +
+ + {title} + + {description && ( + + {description} + + )} +
+
+
+
+
+
, + { + width: 1920, + height: 1080, + fonts: [ + { + name: "Inter", + data: fontData, + style: "normal", + }, + ], + }, + ); +} diff --git a/apps/docs/src/app/api/og/proxy/route.ts b/apps/docs/src/app/api/og/proxy/route.ts new file mode 100644 index 0000000..738b767 --- /dev/null +++ b/apps/docs/src/app/api/og/proxy/route.ts @@ -0,0 +1,45 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export async function GET(request: NextRequest) { + try { + // Get the URL parameter + const url = new URL(request.url); + const imageUrl = url.searchParams.get('url'); + + if (!imageUrl) { + return NextResponse.json({ error: 'Missing URL parameter' }, { status: 400 }); + } + + // Fetch the image + const response = await fetch(imageUrl, { + headers: { + 'User-Agent': 'Mozilla/5.0 (compatible; ImageProxy/1.0)', + }, + }); + + if (!response.ok) { + return NextResponse.json( + { error: `Failed to fetch image: ${response.status}` }, + { status: response.status } + ); + } + + // Get the image data + const contentType = response.headers.get('content-type') || 'image/jpeg'; + const imageData = await response.arrayBuffer(); + + // Return the image with appropriate headers + return new NextResponse(imageData, { + headers: { + 'Content-Type': contentType, + 'Cache-Control': 'public, max-age=86400', + }, + }); + } catch (error) { + console.error('Error proxying image:', error); + return NextResponse.json( + { error: 'Failed to proxy image' }, + { status: 500 } + ); + } +} diff --git a/apps/docs/src/app/changelog/layout.tsx b/apps/docs/src/app/changelog/layout.tsx new file mode 100644 index 0000000..9e90788 --- /dev/null +++ b/apps/docs/src/app/changelog/layout.tsx @@ -0,0 +1,20 @@ +import { Row } from "@once-ui-system/core"; +import { Sidebar } from "@/product"; +import React, { memo } from "react"; + +const DocsLayout = memo(({ + children, +}: { + children: React.ReactNode; +}) => { + return ( + + + {children} + + ); +}); + +DocsLayout.displayName = 'ChangelogLayout'; + +export default DocsLayout; \ No newline at end of file diff --git a/apps/docs/src/app/changelog/page.tsx b/apps/docs/src/app/changelog/page.tsx new file mode 100644 index 0000000..03db8e9 --- /dev/null +++ b/apps/docs/src/app/changelog/page.tsx @@ -0,0 +1,130 @@ +import React from "react"; +import { Column, SmartLink, Row, Line, Text, Heading, Media, Meta, Schema, HeadingLink } from "@once-ui-system/core"; +import { baseURL, meta, schema, changelog } from "@/resources"; +import { formatDate } from "../utils/formatDate"; + +export async function generateMetadata() { + return Meta.generate({ + title: meta.changelog.title, + description: meta.changelog.description, + baseURL: baseURL, + path: meta.changelog.path, + image: meta.changelog.image + }); +} + +const Changelog: React.FC = () => { + return ( + + + + + Changelog + + + See what's new in Once UI + + + + {changelog.map((entry, index) => ( + + + + + {formatDate(entry.date)} + + {index < changelog.length - 1 && ( + + )} + + + + + {entry.title} + + + {entry.description && ( + + {entry.description} + + )} + + {entry.image && ( + + )} + + {entry.sections.map((section, sectionIndex) => { + return ( + + + {section.title} + + + {section.description && ( + + {section.description} + + )} + + {section.bullets && section.bullets.length > 0 && ( +
    + {section.bullets.map((bullet, bulletIndex) => ( +
  • + + {bullet} + +
  • + ))} +
+ )} + + {section.link && ( + + + View update + + + )} +
+ ); + })} +
+
+ ))} +
+ ); +}; + +export default Changelog; \ No newline at end of file diff --git a/apps/docs/src/app/error.tsx b/apps/docs/src/app/error.tsx new file mode 100644 index 0000000..25543c6 --- /dev/null +++ b/apps/docs/src/app/error.tsx @@ -0,0 +1,31 @@ +'use client'; + +import { Column, Heading, Text, Button } from '@once-ui-system/core'; + +export default function Error({ + error, + reset, +}: { + error: Error & { digest?: string }; + reset: () => void; +}) { + return ( + + Dang! It's broken... + + An error occurred while rendering this page. This is what happened: + + + {error.message || 'Unknown error'} + + + + ); +} diff --git a/apps/docs/src/app/icon.ico b/apps/docs/src/app/icon.ico new file mode 100644 index 0000000..7751103 --- /dev/null +++ b/apps/docs/src/app/icon.ico @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/docs/src/app/layout.tsx b/apps/docs/src/app/layout.tsx new file mode 100644 index 0000000..1c6dbcb --- /dev/null +++ b/apps/docs/src/app/layout.tsx @@ -0,0 +1,181 @@ +import '@once-ui-system/core/css/styles.css'; +import '@once-ui-system/core/css/tokens.css'; +import '@/resources/custom.css' + +import classNames from "classnames"; + +import { Footer, Header } from "@/product"; +import { baseURL } from "@/resources"; + +import { Background, Column, Flex, Meta } from "@once-ui-system/core"; +import { effects, fonts, layout, schema } from "../resources/once-ui.config"; +import { meta } from "@/resources"; +import { RouteGuard } from "@/product/RouteGuard"; +import { Providers } from '@/product/Providers'; + +export async function generateMetadata() { + const baseMetadata = Meta.generate({ + title: meta.home.title, + description: meta.home.description, + baseURL: baseURL, + path: meta.home.path, + image: meta.home.image + }); + + return { + ...baseMetadata, + metadataBase: new URL(`${baseURL}`), + openGraph: { + ...baseMetadata.openGraph, + siteName: meta.home.title, + locale: schema.locale, + }, + robots: { + index: true, + follow: true, + googleBot: { + index: true, + follow: true, + "max-video-preview": -1, + "max-image-preview": "large", + "max-snippet": -1, + }, + }, + }; +} + +interface RootLayoutProps { + children: React.ReactNode; +} + +export default async function RootLayout({ children }: RootLayoutProps) { + return ( + <> + + +