@arraypress/covers 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +1 -1
- package/package.json +2 -1
- package/recipes/flyers/grid-poster.json +91 -0
- package/recipes/flyers/logofolio.json +60 -0
- package/recipes/flyers/pixel-mosaic.json +58 -0
- package/schema/recipe.schema.json +306 -4
- package/src/index.d.ts +9 -7
- package/src/json-recipe.js +5 -0
- package/src/layer-options.js +5 -3
- package/src/layers/index.d.ts +6 -0
- package/src/layers/index.js +3 -0
- package/src/layers/mark-geometry.d.ts +15 -0
- package/src/layers/mark-geometry.js +46 -0
- package/src/layers/marks.d.ts +25 -0
- package/src/layers/marks.js +102 -0
- package/src/layers/mosaic.d.ts +32 -0
- package/src/layers/mosaic.js +155 -0
- package/src/layers.js +7 -6
- package/src/type/fallback.js +1 -1
- package/src/type/spans.d.ts +5 -1
- package/src/type/spans.js +26 -3
- package/src/type/symbols.d.ts +1 -1
- package/src/type/symbols.js +20 -2
- package/src/type/typeset.js +6 -2
- package/src/version.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,24 @@ All notable changes to `@arraypress/covers` are documented here.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.4.0] — 2026-11-06
|
|
9
|
+
|
|
10
|
+
Three flyers that set on any canvas, and the layers they stand on. Every published recipe renders as before (185 SVGs, flyers at 4:5 and as release covers plus the built-ins, byte-identical to 1.3.1).
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Three flyers**, drawn on a 400-wide grid as tall as the canvas, so they set at 4:5, 1:1, 9:16 and A-series portrait alike: `grid-poster` (a Swiss grid poster: a photo washed in one colour or a grainy field, a hairline grid of five columns whose rows follow the aspect, meta in its cells, the mark on a tile in one cell, a two-weight headline fitted to four columns), `logofolio` (a collection sheet: a title and meta over a grid of up to 70 marks, optically sized the same) and `pixel-mosaic` (the mark rastered into big neon cells over a greyscale photo, a few left out by seed, the name huge across the foot).
|
|
15
|
+
- **`mosaic` layer**: a mark rastered into square cells drawn apart, following its shape (`@logomarks/core`'s pixelate); `cells`, `gap`, `drop` (a seeded share left out), `accent` (an asterisk or dot in one empty cell).
|
|
16
|
+
- **`marks` layer**: a set of marks on an even grid, each optically sized by its real bounds and ink and held to its cell; columns and rows from the count (3 × 3 to 10 × 7).
|
|
17
|
+
- **Text lines as spans**: a `content` array may hold span objects, one a line (`[{ content: 'Signal', bold: true }, 'over the']`); `bold: true` on any span sets it at the layer's `boldWeight` (700).
|
|
18
|
+
- **JSON**: `round`, `floor` and `ceil` operators (a grid's row count from the canvas).
|
|
19
|
+
- `pattern` takes `divisions: [cols, rows]` for a design grid.
|
|
20
|
+
- `≠` in the built-in symbols, for fonts whose Latin subset lacks it.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- Depends on `@logomarks/core` `^0.1.5` (pixelate without a canvas).
|
|
25
|
+
|
|
8
26
|
## [1.3.1] — 2026-11-06
|
|
9
27
|
|
|
10
28
|
### Changed
|
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ await writeFile('public/covers/introducing-covers.webp', webp);
|
|
|
36
36
|
- [API](https://github.com/arraypress/covers/blob/main/docs/api.md): every export and cover option
|
|
37
37
|
- [Layers](https://github.com/arraypress/covers/blob/main/docs/layers.md): mesh, grain, text, diagrams, riso inks, dithers, poster type and more
|
|
38
38
|
- [Effects](https://github.com/arraypress/covers/blob/main/docs/effects.md): filters and pixel effects on any layer, masks, paints
|
|
39
|
-
- [Recipes](https://github.com/arraypress/covers/blob/main/docs/recipes.md): seventeen built-ins,
|
|
39
|
+
- [Recipes](https://github.com/arraypress/covers/blob/main/docs/recipes.md): seventeen built-ins, 87 flyers and release covers, your own
|
|
40
40
|
- [JSON recipes](https://github.com/arraypress/covers/blob/main/docs/json-recipes.md): a cover style as data, with no JavaScript
|
|
41
41
|
- [Palettes](https://github.com/arraypress/covers/blob/main/docs/palettes.md): presets, one accent, a theme's tokens
|
|
42
42
|
- [Formats, print and brand kits](https://github.com/arraypress/covers/blob/main/docs/formats.md): social sizes with safe zones, print with bleed, `kit`, `lint`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arraypress/covers",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Covers, flyers, posters, release art, social formats and print stationery from one seed and a stack of layers: mesh gradients, grain, riso inks and halftones, knockout and justified type, torn paper, barcodes, safe zones and bleed, as SVG or WebP/PNG/AVIF/JPEG. Recipes are JSON. Runs in Node, browsers and Cloudflare Workers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -85,6 +85,7 @@
|
|
|
85
85
|
},
|
|
86
86
|
"dependencies": {
|
|
87
87
|
"@arraypress/color-utils": "^1.3.0",
|
|
88
|
+
"@logomarks/core": "^0.1.5",
|
|
88
89
|
"@logomarks/image-effects": "^0.1.1",
|
|
89
90
|
"harfbuzzjs": "^1.6.3"
|
|
90
91
|
},
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/recipe.schema.json",
|
|
3
|
+
"name": "grid-poster",
|
|
4
|
+
"description": "Swiss grid poster: a moody full-bleed photo washed in one strong colour (or, with no photo, a grainy gradient field in it), a hairline grid of five columns over the whole sheet, tiny meta hung in its cells (series, handle and year across the top; a label, a code and coordinates on the middle row; the credit and a save prompt along the foot), the mark small on a white tile in one cell, and a big uppercase headline whose lines alternate bold and light, fitted to the four columns right of the first column line, with a small sub-line under it. The grid is drawn on a 400-wide design grid as tall as the canvas, so its rows follow the aspect: eight at 4:5, six at 1:1, eleven at 9:16. Headline lines are strings or { content, bold }.",
|
|
5
|
+
"params": {
|
|
6
|
+
"name": "Kestrel",
|
|
7
|
+
"headline": [
|
|
8
|
+
{ "content": "Signal", "bold": true },
|
|
9
|
+
{ "content": "over the", "bold": false },
|
|
10
|
+
{ "content": "noise", "bold": true }
|
|
11
|
+
],
|
|
12
|
+
"sub": "Visibility ≠ Clarity",
|
|
13
|
+
"series": "",
|
|
14
|
+
"handle": "",
|
|
15
|
+
"year": "©2026",
|
|
16
|
+
"label": "Edition",
|
|
17
|
+
"code": "Nº 014",
|
|
18
|
+
"coords": "51.5072° N\n0.1276° W",
|
|
19
|
+
"credit": "",
|
|
20
|
+
"save": "Save this for later",
|
|
21
|
+
"wash": "#ff5a1f",
|
|
22
|
+
"ink": "#ffffff",
|
|
23
|
+
"tile": "#ffffff",
|
|
24
|
+
"markColor": ""
|
|
25
|
+
},
|
|
26
|
+
"vars": {
|
|
27
|
+
"h": { "mul": [400, { "div": ["@height", "@width"] }] },
|
|
28
|
+
"rows": { "max": [4, { "round": { "div": ["$h", 62.5] } }] },
|
|
29
|
+
"rowH": { "div": ["$h", "$rows"] },
|
|
30
|
+
"mid": { "floor": { "div": [{ "sub": ["$rows", 1] }, 2] } },
|
|
31
|
+
"midTop": { "mul": ["$mid", "$rowH"] },
|
|
32
|
+
"footTop": { "sub": ["$h", "$rowH"] },
|
|
33
|
+
"deep": { "readable": ["{ink}", { "tone": ["{wash}", { "l": [0.5, 0.58] }] }, { "tone": ["{wash}", { "l": [0.12, 0.2] }] }] },
|
|
34
|
+
"glow": { "tone": ["{wash}", { "l": [0.72, 0.8] }] },
|
|
35
|
+
"markInk": { "if": "markColor", "then": "{markColor}", "else": { "tone": ["{wash}", { "l": [0.3, 0.58] }] } }
|
|
36
|
+
},
|
|
37
|
+
"layers": [
|
|
38
|
+
{ "id": "photo", "type": "image", "when": "photo", "src": "{photo}", "fit": "cover", "duotone": ["$deep", "{wash}"] },
|
|
39
|
+
{ "id": "field", "type": "radial", "when": { "not": "photo" }, "colors": ["$glow", "{wash}", "$deep"], "radius": "110vmax" },
|
|
40
|
+
{ "id": "fieldGrain", "type": "grain", "when": { "not": "photo" }, "amount": 0.16, "vary": "edges" },
|
|
41
|
+
{
|
|
42
|
+
"id": "poster",
|
|
43
|
+
"type": "group",
|
|
44
|
+
"viewBox": [0, 0, 400, "$h"],
|
|
45
|
+
"fit": "contain",
|
|
46
|
+
"layers": [
|
|
47
|
+
{ "id": "grid", "type": "pattern", "kind": "grid", "divisions": [5, "$rows"], "color": "{ink}", "stroke": 0.5, "opacity": 0.12 },
|
|
48
|
+
{ "id": "tile", "type": "shape", "kind": "rect", "x": 6, "y": { "add": ["$rowH", 6] }, "width": 68, "height": { "sub": ["$rowH", 12] }, "fill": "{tile}", "when": "mark" },
|
|
49
|
+
{
|
|
50
|
+
"id": "mark",
|
|
51
|
+
"type": "icon",
|
|
52
|
+
"when": "mark",
|
|
53
|
+
"markup": "{mark}",
|
|
54
|
+
"size": { "mul": ["$rowH", 0.56] },
|
|
55
|
+
"x": { "sub": [40, { "mul": ["$rowH", 0.28] }] },
|
|
56
|
+
"y": { "mul": ["$rowH", 1.22] },
|
|
57
|
+
"color": "$markInk"
|
|
58
|
+
},
|
|
59
|
+
{ "id": "series", "type": "text", "content": { "if": "series", "then": "{series}", "else": "{name} — Series" }, "font": "Inter Tight", "weight": 700, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 6, "y": 12, "maxWidth": 68, "color": "{ink}" },
|
|
60
|
+
{ "id": "handle", "type": "text", "content": { "if": "handle", "then": "{handle}", "else": { "join": [["@@", { "lower": "{name}" }], ""] } }, "font": "Inter Tight", "weight": 500, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 200, "y": 12, "align": "center", "maxWidth": 68, "color": "{ink}" },
|
|
61
|
+
{ "id": "year", "type": "text", "content": "{year}", "when": "year", "font": "Inter Tight", "weight": 500, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 394, "y": 12, "align": "right", "maxWidth": 68, "color": "{ink}" },
|
|
62
|
+
{ "id": "label", "type": "text", "content": "{label}", "when": "label", "font": "Inter Tight", "weight": 700, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 6, "y": { "add": ["$midTop", 12] }, "maxWidth": 68, "color": "{ink}" },
|
|
63
|
+
{ "id": "code", "type": "text", "content": "{code}", "when": "code", "font": "Inter Tight", "weight": 500, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 86, "y": { "add": ["$midTop", 12] }, "maxWidth": 68, "color": "{ink}" },
|
|
64
|
+
{ "id": "coords", "type": "text", "content": "{coords}", "when": "coords", "font": "Inter Tight", "weight": 500, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 394, "y": { "add": ["$midTop", 12] }, "align": "right", "maxWidth": 68, "color": "{ink}" },
|
|
65
|
+
{
|
|
66
|
+
"id": "headline",
|
|
67
|
+
"type": "text",
|
|
68
|
+
"content": "{headline}",
|
|
69
|
+
"transform": "uppercase",
|
|
70
|
+
"font": "Inter Tight",
|
|
71
|
+
"weight": 300,
|
|
72
|
+
"boldWeight": 800,
|
|
73
|
+
"size": 60,
|
|
74
|
+
"lineHeight": 0.92,
|
|
75
|
+
"letterSpacing": -0.035,
|
|
76
|
+
"fit": "width",
|
|
77
|
+
"maxWidth": 308,
|
|
78
|
+
"maxHeight": { "sub": [{ "mul": [{ "sub": ["$rows", { "add": ["$mid", 2] }] }, "$rowH"] }, 12] },
|
|
79
|
+
"anchor": "bottom-left",
|
|
80
|
+
"margin": 0,
|
|
81
|
+
"offset": { "x": 86, "y": { "mul": [-1, { "add": ["$rowH", 6] }] } },
|
|
82
|
+
"color": "{ink}"
|
|
83
|
+
},
|
|
84
|
+
{ "id": "credit", "type": "text", "content": { "if": "credit", "then": "{credit}", "else": "Made by {name}" }, "font": "Inter Tight", "weight": 500, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 6, "y": { "add": ["$footTop", 12] }, "maxWidth": 68, "color": "{ink}" },
|
|
85
|
+
{ "id": "sub", "type": "text", "content": "{sub}", "when": "sub", "font": "Inter Tight", "weight": 600, "size": 10, "letterSpacing": -0.01, "lineHeight": 1.15, "x": 86, "y": { "add": ["$footTop", 13.5] }, "maxWidth": 228, "color": "{ink}" },
|
|
86
|
+
{ "id": "save", "type": "text", "content": "{save}", "when": "save", "font": "Inter Tight", "weight": 500, "size": 7, "letterSpacing": 0, "lineHeight": 1.25, "x": 394, "y": { "add": ["$footTop", 12] }, "align": "right", "maxWidth": 68, "color": "{ink}" }
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{ "id": "print", "type": "grain", "amount": 0.05, "size": 1.5 }
|
|
90
|
+
]
|
|
91
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/recipe.schema.json",
|
|
3
|
+
"name": "logofolio",
|
|
4
|
+
"description": "Logofolio, a collection sheet: a dark ground (or any colour), a small sub-title and a meta line across the top over a hairline, a big title fitted to the width, and the marks on an even grid of square cells, every mark optically sized the same (by its real bounds and how much it inks, not its 512 grid), centred so the margins match; columns and rows come from the count (3 × 3 up to 10 × 7) unless given. An optional footer line and the count sit under a second hairline. Drawn on a 400-wide grid as tall as the canvas, so it sets at 4:5, 1:1 and A-series portrait alike. For presenting a set, or a grid of marks for social.",
|
|
5
|
+
"requires": ["marks"],
|
|
6
|
+
"params": {
|
|
7
|
+
"title": "Logofolio",
|
|
8
|
+
"subtitle": "Selected work — Logo collection",
|
|
9
|
+
"meta": "Selected symbols 2020–2026",
|
|
10
|
+
"marks": [],
|
|
11
|
+
"cols": 0,
|
|
12
|
+
"rows": 0,
|
|
13
|
+
"footer": "",
|
|
14
|
+
"ground": "#0e0e0f",
|
|
15
|
+
"ink": "#f2efe8"
|
|
16
|
+
},
|
|
17
|
+
"vars": {
|
|
18
|
+
"h": { "mul": [400, { "div": ["@height", "@width"] }] },
|
|
19
|
+
"count": { "length": "{marks}" }
|
|
20
|
+
},
|
|
21
|
+
"layers": [
|
|
22
|
+
{ "id": "ground", "type": "solid", "color": "{ground}" },
|
|
23
|
+
{
|
|
24
|
+
"id": "sheet",
|
|
25
|
+
"type": "group",
|
|
26
|
+
"viewBox": [0, 0, 400, "$h"],
|
|
27
|
+
"fit": "contain",
|
|
28
|
+
"layers": [
|
|
29
|
+
{ "id": "subtitle", "type": "text", "content": "{subtitle}", "when": "subtitle", "font": "Inter Tight", "weight": 500, "size": 7.5, "letterSpacing": 0, "x": 16, "y": 24, "maxWidth": 200, "maxLines": 1, "color": "{ink}" },
|
|
30
|
+
{ "id": "meta", "type": "text", "content": "{meta}", "when": "meta", "font": "Inter Tight", "weight": 500, "size": 7.5, "letterSpacing": 0, "x": 384, "y": 24, "align": "right", "maxWidth": 160, "maxLines": 1, "color": "{ink}", "opacity": 0.7 },
|
|
31
|
+
{ "id": "rules", "type": "shape", "stroke": "{ink}", "strokeWidth": 0.5, "opacity": 0.35, "items": [
|
|
32
|
+
{ "kind": "line", "x1": 16, "y1": 33, "x2": 384, "y2": 33 },
|
|
33
|
+
{ "kind": "line", "x1": 16, "y1": { "sub": ["$h", 36] }, "x2": 384, "y2": { "sub": ["$h", 36] } }
|
|
34
|
+
] },
|
|
35
|
+
{
|
|
36
|
+
"id": "title",
|
|
37
|
+
"type": "text",
|
|
38
|
+
"content": "{title}",
|
|
39
|
+
"transform": "uppercase",
|
|
40
|
+
"font": "Inter Tight",
|
|
41
|
+
"weight": 800,
|
|
42
|
+
"size": 60,
|
|
43
|
+
"lineHeight": 0.92,
|
|
44
|
+
"letterSpacing": -0.045,
|
|
45
|
+
"fit": "width",
|
|
46
|
+
"maxWidth": 368,
|
|
47
|
+
"maxHeight": 64,
|
|
48
|
+
"anchor": "top-left",
|
|
49
|
+
"margin": 0,
|
|
50
|
+
"offset": { "x": 16, "y": 46 },
|
|
51
|
+
"color": "{ink}"
|
|
52
|
+
},
|
|
53
|
+
{ "id": "marks", "type": "marks", "marks": "{marks}", "cols": "{cols}", "rows": "{rows}", "x": 16, "y": 128, "width": 368, "height": { "sub": ["$h", 176] }, "size": 0.42, "color": "{ink}" },
|
|
54
|
+
{ "id": "footer", "type": "text", "content": "{footer}", "when": "footer", "font": "Inter Tight", "weight": 500, "size": 7.5, "letterSpacing": 0, "x": 16, "y": { "sub": ["$h", 18] }, "maxWidth": 260, "maxLines": 1, "color": "{ink}" },
|
|
55
|
+
{ "id": "count", "type": "text", "content": { "join": [["(", "$count", ")"], ""] }, "font": "Inter Tight", "weight": 500, "size": 7.5, "letterSpacing": 0, "x": 384, "y": { "sub": ["$h", 18] }, "align": "right", "color": "{ink}", "opacity": 0.7 }
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{ "id": "print", "type": "grain", "amount": 0.035, "size": 1.5 }
|
|
59
|
+
]
|
|
60
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schema/recipe.schema.json",
|
|
3
|
+
"name": "pixel-mosaic",
|
|
4
|
+
"description": "Pixel mosaic poster: a greyscale portrait full-bleed (or a grainy grey field with no photo), the mark enlarged to about 80% of the width and rastered into big square cells in one neon ink (lime by default) that follow the mark's own shape (@logomarks/core's pixelate), the photo showing between the cells and through a seeded few left out, a small asterisk or dot in one empty cell beside it, the name huge and bold across the foot fitted to the width, and a small meta row under it: a ® (or the mark, small), two short labels and a volume, right-aligned. Drawn on a 400-wide grid as tall as the canvas, so it sets at 4:5, 1:1 and 9:16; which cells drop out follows the seed.",
|
|
5
|
+
"params": {
|
|
6
|
+
"name": "Kestrel",
|
|
7
|
+
"labels": ["Visual identity", "Pixel series"],
|
|
8
|
+
"volume": "Vol. 116",
|
|
9
|
+
"badge": "®",
|
|
10
|
+
"neon": "#c8ff2e",
|
|
11
|
+
"ink": "#ffffff",
|
|
12
|
+
"cells": 11,
|
|
13
|
+
"drop": 0.12,
|
|
14
|
+
"accent": "asterisk"
|
|
15
|
+
},
|
|
16
|
+
"vars": {
|
|
17
|
+
"h": { "mul": [400, { "div": ["@height", "@width"] }] }
|
|
18
|
+
},
|
|
19
|
+
"layers": [
|
|
20
|
+
{ "id": "photo", "type": "image", "when": "photo", "src": "{photo}", "fit": "cover", "grayscale": true },
|
|
21
|
+
{ "id": "shade", "type": "linear", "when": "photo", "angle": 180, "colors": ["#000000", "#000000"], "opacities": [0, 0.55] },
|
|
22
|
+
{ "id": "field", "type": "radial", "when": { "not": "photo" }, "colors": ["#6b6b6b", "#3a3a3a", "#141414"], "radius": "100vmax" },
|
|
23
|
+
{ "id": "fieldGrain", "type": "grain", "when": { "not": "photo" }, "amount": 0.18, "vary": "edges" },
|
|
24
|
+
{
|
|
25
|
+
"id": "poster",
|
|
26
|
+
"type": "group",
|
|
27
|
+
"viewBox": [0, 0, 400, "$h"],
|
|
28
|
+
"fit": "contain",
|
|
29
|
+
"layers": [
|
|
30
|
+
{ "id": "mosaic", "type": "mosaic", "when": "mark", "markup": "{mark}", "x": 40, "y": 28, "width": 320, "height": { "sub": ["$h", 164] }, "cells": "{cells}", "drop": "{drop}", "accent": "{accent}", "color": "{neon}" },
|
|
31
|
+
{
|
|
32
|
+
"id": "title",
|
|
33
|
+
"type": "text",
|
|
34
|
+
"content": "{name}",
|
|
35
|
+
"transform": "uppercase",
|
|
36
|
+
"font": "Inter Tight",
|
|
37
|
+
"weight": 900,
|
|
38
|
+
"size": 80,
|
|
39
|
+
"lineHeight": 0.9,
|
|
40
|
+
"letterSpacing": -0.05,
|
|
41
|
+
"fit": "width",
|
|
42
|
+
"maxWidth": 368,
|
|
43
|
+
"maxHeight": 92,
|
|
44
|
+
"anchor": "bottom-left",
|
|
45
|
+
"margin": 0,
|
|
46
|
+
"offset": { "x": 16, "y": -34 },
|
|
47
|
+
"color": "{ink}"
|
|
48
|
+
},
|
|
49
|
+
{ "id": "badge", "type": "text", "when": { "all": ["badge", { "not": { "badge": "mark" } }] }, "content": "{badge}", "font": "Inter Tight", "weight": 600, "size": 9, "letterSpacing": 0, "x": 16, "y": { "sub": ["$h", 16] }, "color": "{ink}" },
|
|
50
|
+
{ "id": "badgeMark", "type": "icon", "when": { "all": ["mark", { "badge": "mark" }] }, "markup": "{mark}", "x": 15, "y": { "sub": ["$h", 25.5] }, "size": 11, "color": "{ink}" },
|
|
51
|
+
{ "id": "label1", "type": "text", "content": "{labels.0}", "when": "labels.0", "transform": "uppercase", "font": "Inter Tight", "weight": 600, "size": 6.5, "letterSpacing": 0.04, "x": 108, "y": { "sub": ["$h", 16] }, "maxWidth": 86, "maxLines": 1, "color": "{ink}" },
|
|
52
|
+
{ "id": "label2", "type": "text", "content": "{labels.1}", "when": "labels.1", "transform": "uppercase", "font": "Inter Tight", "weight": 600, "size": 6.5, "letterSpacing": 0.04, "x": 200, "y": { "sub": ["$h", 16] }, "maxWidth": 86, "maxLines": 1, "color": "{ink}" },
|
|
53
|
+
{ "id": "volume", "type": "text", "content": "{volume}", "when": "volume", "transform": "uppercase", "font": "Inter Tight", "weight": 600, "size": 6.5, "letterSpacing": 0.04, "x": 384, "y": { "sub": ["$h", 16] }, "align": "right", "maxWidth": 86, "maxLines": 1, "color": "{ink}" }
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{ "id": "print", "type": "grain", "amount": 0.05, "size": 1.5 }
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -370,6 +370,45 @@
|
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
},
|
|
373
|
+
{
|
|
374
|
+
"type": "object",
|
|
375
|
+
"description": "To the nearest whole number.",
|
|
376
|
+
"required": [
|
|
377
|
+
"round"
|
|
378
|
+
],
|
|
379
|
+
"additionalProperties": false,
|
|
380
|
+
"properties": {
|
|
381
|
+
"round": {
|
|
382
|
+
"$ref": "#/$defs/value"
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"type": "object",
|
|
388
|
+
"description": "Down to a whole number.",
|
|
389
|
+
"required": [
|
|
390
|
+
"floor"
|
|
391
|
+
],
|
|
392
|
+
"additionalProperties": false,
|
|
393
|
+
"properties": {
|
|
394
|
+
"floor": {
|
|
395
|
+
"$ref": "#/$defs/value"
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"type": "object",
|
|
401
|
+
"description": "Up to a whole number.",
|
|
402
|
+
"required": [
|
|
403
|
+
"ceil"
|
|
404
|
+
],
|
|
405
|
+
"additionalProperties": false,
|
|
406
|
+
"properties": {
|
|
407
|
+
"ceil": {
|
|
408
|
+
"$ref": "#/$defs/value"
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
},
|
|
373
412
|
{
|
|
374
413
|
"type": "object",
|
|
375
414
|
"description": "[from, to, steps, amount?]: steps colours from one toward the other.",
|
|
@@ -4838,7 +4877,9 @@
|
|
|
4838
4877
|
"barcode",
|
|
4839
4878
|
"perforation",
|
|
4840
4879
|
"tear",
|
|
4841
|
-
"texture"
|
|
4880
|
+
"texture",
|
|
4881
|
+
"mosaic",
|
|
4882
|
+
"marks"
|
|
4842
4883
|
]
|
|
4843
4884
|
},
|
|
4844
4885
|
"id": {
|
|
@@ -5682,7 +5723,7 @@
|
|
|
5682
5723
|
},
|
|
5683
5724
|
"divisions": {
|
|
5684
5725
|
"$ref": "#/$defs/value",
|
|
5685
|
-
"description": "Grid/lines: N equal cells (inner lines only) instead of size."
|
|
5726
|
+
"description": "Grid/lines: N equal cells (inner lines only) instead of size; [cols, rows] for a design grid."
|
|
5686
5727
|
},
|
|
5687
5728
|
"gaps": {
|
|
5688
5729
|
"$ref": "#/$defs/value",
|
|
@@ -6056,7 +6097,7 @@
|
|
|
6056
6097
|
"properties": {
|
|
6057
6098
|
"content": {
|
|
6058
6099
|
"$ref": "#/$defs/value",
|
|
6059
|
-
"description": "The text (\"{title}\")."
|
|
6100
|
+
"description": "The text (\"{title}\"); an array is a line per item, an item may be a span ({ content, bold })."
|
|
6060
6101
|
},
|
|
6061
6102
|
"font": {
|
|
6062
6103
|
"$ref": "#/$defs/value",
|
|
@@ -6066,6 +6107,10 @@
|
|
|
6066
6107
|
"$ref": "#/$defs/value",
|
|
6067
6108
|
"description": "Default 600."
|
|
6068
6109
|
},
|
|
6110
|
+
"boldWeight": {
|
|
6111
|
+
"$ref": "#/$defs/value",
|
|
6112
|
+
"description": "The weight of spans and lines marked bold: true. Default 700."
|
|
6113
|
+
},
|
|
6069
6114
|
"style": {
|
|
6070
6115
|
"$ref": "#/$defs/value",
|
|
6071
6116
|
"description": "normal | italic"
|
|
@@ -6220,7 +6265,7 @@
|
|
|
6220
6265
|
},
|
|
6221
6266
|
"spans": {
|
|
6222
6267
|
"$ref": "#/$defs/value",
|
|
6223
|
-
"description": "[{ content, font, weight, style, axes, scale, size, color, letterSpacing, dy }]: mixed runs on the same lines."
|
|
6268
|
+
"description": "[{ content, font, weight, bold, style, axes, scale, size, color, letterSpacing, dy }]: mixed runs on the same lines."
|
|
6224
6269
|
},
|
|
6225
6270
|
"glyphs": {
|
|
6226
6271
|
"$ref": "#/$defs/value",
|
|
@@ -6291,6 +6336,7 @@
|
|
|
6291
6336
|
"content",
|
|
6292
6337
|
"font",
|
|
6293
6338
|
"weight",
|
|
6339
|
+
"boldWeight",
|
|
6294
6340
|
"style",
|
|
6295
6341
|
"size",
|
|
6296
6342
|
"minSize",
|
|
@@ -9082,6 +9128,262 @@
|
|
|
9082
9128
|
]
|
|
9083
9129
|
}
|
|
9084
9130
|
}
|
|
9131
|
+
},
|
|
9132
|
+
{
|
|
9133
|
+
"if": {
|
|
9134
|
+
"properties": {
|
|
9135
|
+
"type": {
|
|
9136
|
+
"const": "mosaic"
|
|
9137
|
+
}
|
|
9138
|
+
},
|
|
9139
|
+
"required": [
|
|
9140
|
+
"type"
|
|
9141
|
+
]
|
|
9142
|
+
},
|
|
9143
|
+
"then": {
|
|
9144
|
+
"properties": {
|
|
9145
|
+
"markup": {
|
|
9146
|
+
"$ref": "#/$defs/value",
|
|
9147
|
+
"description": "The mark's paths (512 grid)."
|
|
9148
|
+
},
|
|
9149
|
+
"x": {
|
|
9150
|
+
"$ref": "#/$defs/value",
|
|
9151
|
+
"description": "Box x, px or %."
|
|
9152
|
+
},
|
|
9153
|
+
"y": {
|
|
9154
|
+
"$ref": "#/$defs/value",
|
|
9155
|
+
"description": "Box y."
|
|
9156
|
+
},
|
|
9157
|
+
"width": {
|
|
9158
|
+
"$ref": "#/$defs/value",
|
|
9159
|
+
"description": "Box width (default the canvas)."
|
|
9160
|
+
},
|
|
9161
|
+
"height": {
|
|
9162
|
+
"$ref": "#/$defs/value",
|
|
9163
|
+
"description": "Box height."
|
|
9164
|
+
},
|
|
9165
|
+
"cells": {
|
|
9166
|
+
"$ref": "#/$defs/value",
|
|
9167
|
+
"description": "Cells across the mark's longest side, 4–48. Default 10."
|
|
9168
|
+
},
|
|
9169
|
+
"gap": {
|
|
9170
|
+
"$ref": "#/$defs/value",
|
|
9171
|
+
"description": "Gap between cells, a share of a cell. Default 0.12."
|
|
9172
|
+
},
|
|
9173
|
+
"radius": {
|
|
9174
|
+
"$ref": "#/$defs/value",
|
|
9175
|
+
"description": "Cell corner radius, a share of a cell. Default 0."
|
|
9176
|
+
},
|
|
9177
|
+
"drop": {
|
|
9178
|
+
"$ref": "#/$defs/value",
|
|
9179
|
+
"description": "Share of filled cells left out (seeded), 0–0.9. Default 0.12."
|
|
9180
|
+
},
|
|
9181
|
+
"color": {
|
|
9182
|
+
"$ref": "#/$defs/value",
|
|
9183
|
+
"description": "Default @accent."
|
|
9184
|
+
},
|
|
9185
|
+
"accent": {
|
|
9186
|
+
"$ref": "#/$defs/value",
|
|
9187
|
+
"description": "asterisk | dot: a small glyph in one empty cell beside the mark."
|
|
9188
|
+
},
|
|
9189
|
+
"accentColor": {
|
|
9190
|
+
"$ref": "#/$defs/value",
|
|
9191
|
+
"description": "Default color."
|
|
9192
|
+
},
|
|
9193
|
+
"opacity": {
|
|
9194
|
+
"$ref": "#/$defs/value",
|
|
9195
|
+
"description": "0–1."
|
|
9196
|
+
},
|
|
9197
|
+
"blend": {
|
|
9198
|
+
"$ref": "#/$defs/value",
|
|
9199
|
+
"description": "A CSS mix-blend-mode."
|
|
9200
|
+
},
|
|
9201
|
+
"seed": {
|
|
9202
|
+
"$ref": "#/$defs/value",
|
|
9203
|
+
"description": "This layer's own random stream."
|
|
9204
|
+
},
|
|
9205
|
+
"transform": {
|
|
9206
|
+
"$ref": "#/$defs/value",
|
|
9207
|
+
"description": "{ translate, rotate, scale, skewX, skewY, mirror: x | y, origin } (on text, a case keyword is still the case)."
|
|
9208
|
+
},
|
|
9209
|
+
"effects": {
|
|
9210
|
+
"$ref": "#/$defs/effects",
|
|
9211
|
+
"description": "[{ kind, mask, colorSpace, … }]: filters, pixel effects and copies, in order (see docs/effects.md; kinds in EFFECTS)."
|
|
9212
|
+
},
|
|
9213
|
+
"mask": {
|
|
9214
|
+
"$ref": "#/$defs/value",
|
|
9215
|
+
"description": "Layers whose luminance masks this one (white shows)."
|
|
9216
|
+
},
|
|
9217
|
+
"knockout": {
|
|
9218
|
+
"$ref": "#/$defs/value",
|
|
9219
|
+
"description": "Layers cut out of this one."
|
|
9220
|
+
},
|
|
9221
|
+
"clip": {
|
|
9222
|
+
"$ref": "#/$defs/value",
|
|
9223
|
+
"description": "Layers this one shows only inside."
|
|
9224
|
+
},
|
|
9225
|
+
"area": {
|
|
9226
|
+
"$ref": "#/$defs/value",
|
|
9227
|
+
"description": "trim | safe | bleed, or { x, y, width, height } fractions: draw the layer in that box."
|
|
9228
|
+
},
|
|
9229
|
+
"motion": {
|
|
9230
|
+
"$ref": "#/$defs/motion",
|
|
9231
|
+
"description": "A motion, a preset name (drift | spin | breathe | blink | marquee), or a list: plays in the SVG as CSS keyframes (see MOTION_OPTIONS)."
|
|
9232
|
+
}
|
|
9233
|
+
},
|
|
9234
|
+
"propertyNames": {
|
|
9235
|
+
"enum": [
|
|
9236
|
+
"type",
|
|
9237
|
+
"id",
|
|
9238
|
+
"when",
|
|
9239
|
+
"markup",
|
|
9240
|
+
"x",
|
|
9241
|
+
"y",
|
|
9242
|
+
"width",
|
|
9243
|
+
"height",
|
|
9244
|
+
"cells",
|
|
9245
|
+
"gap",
|
|
9246
|
+
"radius",
|
|
9247
|
+
"drop",
|
|
9248
|
+
"color",
|
|
9249
|
+
"accent",
|
|
9250
|
+
"accentColor",
|
|
9251
|
+
"opacity",
|
|
9252
|
+
"blend",
|
|
9253
|
+
"seed",
|
|
9254
|
+
"transform",
|
|
9255
|
+
"effects",
|
|
9256
|
+
"mask",
|
|
9257
|
+
"knockout",
|
|
9258
|
+
"clip",
|
|
9259
|
+
"area",
|
|
9260
|
+
"motion"
|
|
9261
|
+
]
|
|
9262
|
+
}
|
|
9263
|
+
}
|
|
9264
|
+
},
|
|
9265
|
+
{
|
|
9266
|
+
"if": {
|
|
9267
|
+
"properties": {
|
|
9268
|
+
"type": {
|
|
9269
|
+
"const": "marks"
|
|
9270
|
+
}
|
|
9271
|
+
},
|
|
9272
|
+
"required": [
|
|
9273
|
+
"type"
|
|
9274
|
+
]
|
|
9275
|
+
},
|
|
9276
|
+
"then": {
|
|
9277
|
+
"properties": {
|
|
9278
|
+
"marks": {
|
|
9279
|
+
"$ref": "#/$defs/value",
|
|
9280
|
+
"description": "The marks: paths on a 512 grid (or { markup })."
|
|
9281
|
+
},
|
|
9282
|
+
"cols": {
|
|
9283
|
+
"$ref": "#/$defs/value",
|
|
9284
|
+
"description": "Default from the count: 3 × 3 up to 10 × 7."
|
|
9285
|
+
},
|
|
9286
|
+
"rows": {
|
|
9287
|
+
"$ref": "#/$defs/value",
|
|
9288
|
+
"description": "Default from the count."
|
|
9289
|
+
},
|
|
9290
|
+
"x": {
|
|
9291
|
+
"$ref": "#/$defs/value",
|
|
9292
|
+
"description": "Box x, px or %."
|
|
9293
|
+
},
|
|
9294
|
+
"y": {
|
|
9295
|
+
"$ref": "#/$defs/value",
|
|
9296
|
+
"description": "Box y."
|
|
9297
|
+
},
|
|
9298
|
+
"width": {
|
|
9299
|
+
"$ref": "#/$defs/value",
|
|
9300
|
+
"description": "Box width (default the canvas)."
|
|
9301
|
+
},
|
|
9302
|
+
"height": {
|
|
9303
|
+
"$ref": "#/$defs/value",
|
|
9304
|
+
"description": "Box height."
|
|
9305
|
+
},
|
|
9306
|
+
"size": {
|
|
9307
|
+
"$ref": "#/$defs/value",
|
|
9308
|
+
"description": "Share of a cell a mark's area takes. Default 0.5."
|
|
9309
|
+
},
|
|
9310
|
+
"optical": {
|
|
9311
|
+
"$ref": "#/$defs/value",
|
|
9312
|
+
"description": "false: fit each mark's bounds to the same box instead. Default true."
|
|
9313
|
+
},
|
|
9314
|
+
"color": {
|
|
9315
|
+
"$ref": "#/$defs/value",
|
|
9316
|
+
"description": "Default @text."
|
|
9317
|
+
},
|
|
9318
|
+
"opacity": {
|
|
9319
|
+
"$ref": "#/$defs/value",
|
|
9320
|
+
"description": "0–1."
|
|
9321
|
+
},
|
|
9322
|
+
"blend": {
|
|
9323
|
+
"$ref": "#/$defs/value",
|
|
9324
|
+
"description": "A CSS mix-blend-mode."
|
|
9325
|
+
},
|
|
9326
|
+
"seed": {
|
|
9327
|
+
"$ref": "#/$defs/value",
|
|
9328
|
+
"description": "This layer's own random stream."
|
|
9329
|
+
},
|
|
9330
|
+
"transform": {
|
|
9331
|
+
"$ref": "#/$defs/value",
|
|
9332
|
+
"description": "{ translate, rotate, scale, skewX, skewY, mirror: x | y, origin } (on text, a case keyword is still the case)."
|
|
9333
|
+
},
|
|
9334
|
+
"effects": {
|
|
9335
|
+
"$ref": "#/$defs/effects",
|
|
9336
|
+
"description": "[{ kind, mask, colorSpace, … }]: filters, pixel effects and copies, in order (see docs/effects.md; kinds in EFFECTS)."
|
|
9337
|
+
},
|
|
9338
|
+
"mask": {
|
|
9339
|
+
"$ref": "#/$defs/value",
|
|
9340
|
+
"description": "Layers whose luminance masks this one (white shows)."
|
|
9341
|
+
},
|
|
9342
|
+
"knockout": {
|
|
9343
|
+
"$ref": "#/$defs/value",
|
|
9344
|
+
"description": "Layers cut out of this one."
|
|
9345
|
+
},
|
|
9346
|
+
"clip": {
|
|
9347
|
+
"$ref": "#/$defs/value",
|
|
9348
|
+
"description": "Layers this one shows only inside."
|
|
9349
|
+
},
|
|
9350
|
+
"area": {
|
|
9351
|
+
"$ref": "#/$defs/value",
|
|
9352
|
+
"description": "trim | safe | bleed, or { x, y, width, height } fractions: draw the layer in that box."
|
|
9353
|
+
},
|
|
9354
|
+
"motion": {
|
|
9355
|
+
"$ref": "#/$defs/motion",
|
|
9356
|
+
"description": "A motion, a preset name (drift | spin | breathe | blink | marquee), or a list: plays in the SVG as CSS keyframes (see MOTION_OPTIONS)."
|
|
9357
|
+
}
|
|
9358
|
+
},
|
|
9359
|
+
"propertyNames": {
|
|
9360
|
+
"enum": [
|
|
9361
|
+
"type",
|
|
9362
|
+
"id",
|
|
9363
|
+
"when",
|
|
9364
|
+
"marks",
|
|
9365
|
+
"cols",
|
|
9366
|
+
"rows",
|
|
9367
|
+
"x",
|
|
9368
|
+
"y",
|
|
9369
|
+
"width",
|
|
9370
|
+
"height",
|
|
9371
|
+
"size",
|
|
9372
|
+
"optical",
|
|
9373
|
+
"color",
|
|
9374
|
+
"opacity",
|
|
9375
|
+
"blend",
|
|
9376
|
+
"seed",
|
|
9377
|
+
"transform",
|
|
9378
|
+
"effects",
|
|
9379
|
+
"mask",
|
|
9380
|
+
"knockout",
|
|
9381
|
+
"clip",
|
|
9382
|
+
"area",
|
|
9383
|
+
"motion"
|
|
9384
|
+
]
|
|
9385
|
+
}
|
|
9386
|
+
}
|
|
9085
9387
|
}
|
|
9086
9388
|
]
|
|
9087
9389
|
}
|