@caqophony/ui 0.3.1 → 0.5.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/README.md +58 -5
- package/dist/chunk-44GEHNZP.js +126 -0
- package/dist/chunk-DP5WQAPO.js +23 -0
- package/dist/chunk-I5DQCG6D.js +378 -0
- package/dist/chunk-ID7VBGJA.js +233 -0
- package/dist/{chunk-4YA6BZDJ.js → chunk-ODRGJV46.js} +3 -10
- package/dist/icon.d-DQqyySj2.d.mts +82 -0
- package/dist/index.d.mts +14 -82
- package/dist/index.js +803 -1351
- package/dist/markdown.js +2 -1
- package/dist/marketing.d.mts +444 -0
- package/dist/marketing.js +1439 -0
- package/dist/material-art.d.mts +137 -0
- package/dist/material-art.js +210 -0
- package/dist/material-tones.d.mts +23 -0
- package/dist/material-tones.js +66 -0
- package/dist/material.d.mts +615 -0
- package/dist/material.js +1066 -0
- package/package.json +19 -2
- package/styles.css +358 -3
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { Tone } from './material-tones.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* #5962 (epic #5944 step 4) — the art slot's one renderer. A product's art is
|
|
6
|
+
* data, a closed tree a generated app holds as JSON, and this is the only code
|
|
7
|
+
* that turns it into SVG. So there is no art source to police: a script, a
|
|
8
|
+
* handler, an external reference, `foreignObject` or a computed element has no
|
|
9
|
+
* way to be written in the format, and this file has no case for it.
|
|
10
|
+
*
|
|
11
|
+
* Each attribute is written out by name from the node's own fields, so a key the
|
|
12
|
+
* format does not have reaches nothing. An element or a paint outside the format
|
|
13
|
+
* throws here, even if the tree skipped its check: the validator, which is not
|
|
14
|
+
* published, gives the exact errors at build time.
|
|
15
|
+
*
|
|
16
|
+
* Published alone as `@caqophony/ui/material-art`, built with no client directive
|
|
17
|
+
* (`server-entries.json`), so a server component can render art. It imports only
|
|
18
|
+
* the tone tables, and not `cn`: a client chunk here would carry the directive.
|
|
19
|
+
*
|
|
20
|
+
* Held from the authors until step 5, with the rest of `material`.
|
|
21
|
+
*
|
|
22
|
+
* Authored by Caqophony
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/** A tone, or no paint, or the colour of the surrounding text (a mark in a header). */
|
|
26
|
+
type ArtPaint = Tone | 'none' | 'currentColor';
|
|
27
|
+
type ArtTransform = {
|
|
28
|
+
op: 'translate';
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
} | {
|
|
32
|
+
op: 'rotate';
|
|
33
|
+
deg: number;
|
|
34
|
+
cx?: number;
|
|
35
|
+
cy?: number;
|
|
36
|
+
} | {
|
|
37
|
+
op: 'scale';
|
|
38
|
+
by: number;
|
|
39
|
+
};
|
|
40
|
+
/** What every element may say about how it is drawn. */
|
|
41
|
+
interface ArtDrawing {
|
|
42
|
+
stroke?: ArtPaint;
|
|
43
|
+
strokeWidth?: number;
|
|
44
|
+
strokeDasharray?: readonly number[];
|
|
45
|
+
strokeLinecap?: 'butt' | 'round' | 'square';
|
|
46
|
+
strokeLinejoin?: 'miter' | 'round' | 'bevel';
|
|
47
|
+
opacity?: number;
|
|
48
|
+
transform?: readonly ArtTransform[];
|
|
49
|
+
}
|
|
50
|
+
/** A shape with an area. A `line` has none, so it takes no fill. */
|
|
51
|
+
interface ArtFilled extends ArtDrawing {
|
|
52
|
+
fill?: ArtPaint;
|
|
53
|
+
}
|
|
54
|
+
interface ArtGroup extends ArtFilled {
|
|
55
|
+
el: 'g';
|
|
56
|
+
children: readonly ArtNode[];
|
|
57
|
+
}
|
|
58
|
+
interface ArtPath extends ArtFilled {
|
|
59
|
+
el: 'path';
|
|
60
|
+
d: string;
|
|
61
|
+
}
|
|
62
|
+
interface ArtRect extends ArtFilled {
|
|
63
|
+
el: 'rect';
|
|
64
|
+
x?: number;
|
|
65
|
+
y?: number;
|
|
66
|
+
width: number;
|
|
67
|
+
height: number;
|
|
68
|
+
rx?: number;
|
|
69
|
+
ry?: number;
|
|
70
|
+
}
|
|
71
|
+
interface ArtCircle extends ArtFilled {
|
|
72
|
+
el: 'circle';
|
|
73
|
+
cx: number;
|
|
74
|
+
cy: number;
|
|
75
|
+
r: number;
|
|
76
|
+
}
|
|
77
|
+
interface ArtEllipse extends ArtFilled {
|
|
78
|
+
el: 'ellipse';
|
|
79
|
+
cx: number;
|
|
80
|
+
cy: number;
|
|
81
|
+
rx: number;
|
|
82
|
+
ry: number;
|
|
83
|
+
}
|
|
84
|
+
interface ArtLine extends ArtDrawing {
|
|
85
|
+
el: 'line';
|
|
86
|
+
x1: number;
|
|
87
|
+
y1: number;
|
|
88
|
+
x2: number;
|
|
89
|
+
y2: number;
|
|
90
|
+
}
|
|
91
|
+
interface ArtPoly extends ArtFilled {
|
|
92
|
+
el: 'polygon' | 'polyline';
|
|
93
|
+
points: ReadonlyArray<readonly [number, number]>;
|
|
94
|
+
}
|
|
95
|
+
interface ArtText extends ArtFilled {
|
|
96
|
+
el: 'text';
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
anchor?: 'start' | 'middle' | 'end';
|
|
100
|
+
fontSize: number;
|
|
101
|
+
fontWeight?: 400 | 500 | 600 | 700;
|
|
102
|
+
/** Words on the page, apart from the drawing: step 5 holds them to the Brief. */
|
|
103
|
+
copy: string;
|
|
104
|
+
}
|
|
105
|
+
type ArtNode = ArtGroup | ArtPath | ArtRect | ArtCircle | ArtEllipse | ArtLine | ArtPoly | ArtText;
|
|
106
|
+
/** Where a frame stays when its box has another shape. */
|
|
107
|
+
type ArtAnchor = 'top' | 'center' | 'bottom' | 'right';
|
|
108
|
+
/** `cover` fills the box and may cut the frame; `contain` keeps all of it. */
|
|
109
|
+
type ArtFit = 'cover' | 'contain';
|
|
110
|
+
/** `phone`/`desktop` cut at `md`; `stack`/`side`, a `HeroScene`'s subject, cut at `lg`. */
|
|
111
|
+
type ArtOnly = 'phone' | 'desktop' | 'stack' | 'side';
|
|
112
|
+
/** One SVG: `0 0 width height`, in its box as `fit` says. */
|
|
113
|
+
interface ArtFrame {
|
|
114
|
+
width: number;
|
|
115
|
+
height: number;
|
|
116
|
+
/** Which part stays in view when the box's shape differs. */
|
|
117
|
+
anchor: ArtAnchor;
|
|
118
|
+
/** Absent: `cover`, as all art drew before #5978. */
|
|
119
|
+
fit?: ArtFit;
|
|
120
|
+
/** Show on one side of a cut only. */
|
|
121
|
+
only?: ArtOnly;
|
|
122
|
+
nodes: readonly ArtNode[];
|
|
123
|
+
}
|
|
124
|
+
/** A piece of art: one frame, or a `phone` and `desktop` pair, or a `stack` and `side` pair. */
|
|
125
|
+
interface ArtTree {
|
|
126
|
+
frames: readonly ArtFrame[];
|
|
127
|
+
}
|
|
128
|
+
/** The one writer of how a frame sits in its box, for `Art` and `SkyField`. */
|
|
129
|
+
declare const preserveOf: (anchor: ArtAnchor, fit?: ArtFit) => string;
|
|
130
|
+
/** The one writer of where frames are cut, for `Art` and `SkyField`. */
|
|
131
|
+
declare const frameClass: (only: ArtOnly | undefined) => string;
|
|
132
|
+
/** Draws a piece of art, for a `Figure`'s slot or a mark. */
|
|
133
|
+
declare function Art({ tree }: {
|
|
134
|
+
tree: ArtTree;
|
|
135
|
+
}): ReactElement;
|
|
136
|
+
|
|
137
|
+
export { Art, type ArtAnchor, type ArtCircle, type ArtDrawing, type ArtEllipse, type ArtFilled, type ArtFit, type ArtFrame, type ArtGroup, type ArtLine, type ArtNode, type ArtOnly, type ArtPaint, type ArtPath, type ArtPoly, type ArtRect, type ArtText, type ArtTransform, type ArtTree, frameClass, preserveOf };
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// src/material/tones.ts
|
|
2
|
+
var FILL = {
|
|
3
|
+
"night-0": "fill-night-0",
|
|
4
|
+
"night-1": "fill-night-1",
|
|
5
|
+
"night-2": "fill-night-2",
|
|
6
|
+
"sky-0": "fill-sky-0",
|
|
7
|
+
"sky-1": "fill-sky-1",
|
|
8
|
+
"sky-2": "fill-sky-2",
|
|
9
|
+
"sky-3": "fill-sky-3",
|
|
10
|
+
"sky-4": "fill-sky-4",
|
|
11
|
+
glow: "fill-glow",
|
|
12
|
+
"glow-soft": "fill-glow-soft",
|
|
13
|
+
"glow-pale": "fill-glow-pale",
|
|
14
|
+
canvas: "fill-canvas",
|
|
15
|
+
"mist-1": "fill-mist-1",
|
|
16
|
+
"mist-2": "fill-mist-2",
|
|
17
|
+
"mist-3": "fill-mist-3",
|
|
18
|
+
paper: "fill-paper",
|
|
19
|
+
ink: "fill-ink",
|
|
20
|
+
page: "fill-background"
|
|
21
|
+
};
|
|
22
|
+
var STROKE = {
|
|
23
|
+
"night-0": "stroke-night-0",
|
|
24
|
+
"night-1": "stroke-night-1",
|
|
25
|
+
"night-2": "stroke-night-2",
|
|
26
|
+
"sky-0": "stroke-sky-0",
|
|
27
|
+
"sky-1": "stroke-sky-1",
|
|
28
|
+
"sky-2": "stroke-sky-2",
|
|
29
|
+
"sky-3": "stroke-sky-3",
|
|
30
|
+
"sky-4": "stroke-sky-4",
|
|
31
|
+
glow: "stroke-glow",
|
|
32
|
+
"glow-soft": "stroke-glow-soft",
|
|
33
|
+
"glow-pale": "stroke-glow-pale",
|
|
34
|
+
canvas: "stroke-canvas",
|
|
35
|
+
"mist-1": "stroke-mist-1",
|
|
36
|
+
"mist-2": "stroke-mist-2",
|
|
37
|
+
"mist-3": "stroke-mist-3",
|
|
38
|
+
paper: "stroke-paper",
|
|
39
|
+
ink: "stroke-ink",
|
|
40
|
+
page: "stroke-background"
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// src/material/art.tsx
|
|
44
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
45
|
+
var ANCHOR = {
|
|
46
|
+
top: "xMidYMin",
|
|
47
|
+
center: "xMidYMid",
|
|
48
|
+
bottom: "xMidYMax",
|
|
49
|
+
right: "xMaxYMid"
|
|
50
|
+
};
|
|
51
|
+
var preserveOf = (anchor, fit = "cover") => `${ANCHOR[anchor]} ${fit === "contain" ? "meet" : "slice"}`;
|
|
52
|
+
var SHOWN = {
|
|
53
|
+
phone: "size-full md:hidden",
|
|
54
|
+
desktop: "hidden size-full md:block",
|
|
55
|
+
stack: "size-full lg:hidden",
|
|
56
|
+
side: "hidden size-full lg:block"
|
|
57
|
+
};
|
|
58
|
+
var frameClass = (only) => only ? SHOWN[only] : "size-full";
|
|
59
|
+
function classOf(table, paint, attribute) {
|
|
60
|
+
if (!Object.prototype.hasOwnProperty.call(table, paint))
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Art: \`${attribute}\` is ${JSON.stringify(paint)}, which is not a tone`
|
|
63
|
+
);
|
|
64
|
+
return table[paint];
|
|
65
|
+
}
|
|
66
|
+
function painted({ fill, stroke }) {
|
|
67
|
+
const direct = (paint) => paint === "none" || paint === "currentColor" ? paint : void 0;
|
|
68
|
+
const classes = [
|
|
69
|
+
fill === void 0 || direct(fill) ? "" : classOf(FILL, fill, "fill"),
|
|
70
|
+
stroke === void 0 || direct(stroke) ? "" : classOf(STROKE, stroke, "stroke")
|
|
71
|
+
].filter(Boolean);
|
|
72
|
+
return {
|
|
73
|
+
fill: direct(fill),
|
|
74
|
+
stroke: direct(stroke),
|
|
75
|
+
className: classes.length > 0 ? classes.join(" ") : void 0
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function transformOf(step) {
|
|
79
|
+
switch (step.op) {
|
|
80
|
+
case "translate":
|
|
81
|
+
return `translate(${step.x} ${step.y})`;
|
|
82
|
+
case "scale":
|
|
83
|
+
return `scale(${step.by})`;
|
|
84
|
+
case "rotate":
|
|
85
|
+
return step.cx === void 0 || step.cy === void 0 ? `rotate(${step.deg})` : `rotate(${step.deg} ${step.cx} ${step.cy})`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function drawn(node) {
|
|
89
|
+
return {
|
|
90
|
+
...painted(node),
|
|
91
|
+
strokeWidth: node.strokeWidth,
|
|
92
|
+
strokeDasharray: node.strokeDasharray?.join(" "),
|
|
93
|
+
strokeLinecap: node.strokeLinecap,
|
|
94
|
+
strokeLinejoin: node.strokeLinejoin,
|
|
95
|
+
opacity: node.opacity,
|
|
96
|
+
transform: node.transform?.map(transformOf).join(" ")
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function render(node, key) {
|
|
100
|
+
switch (node.el) {
|
|
101
|
+
case "g":
|
|
102
|
+
return /* @__PURE__ */ jsx("g", { ...drawn(node), children: node.children.map(render) }, key);
|
|
103
|
+
case "path":
|
|
104
|
+
return /* @__PURE__ */ jsx("path", { d: node.d, ...drawn(node) }, key);
|
|
105
|
+
case "rect":
|
|
106
|
+
return /* @__PURE__ */ jsx(
|
|
107
|
+
"rect",
|
|
108
|
+
{
|
|
109
|
+
x: node.x,
|
|
110
|
+
y: node.y,
|
|
111
|
+
width: node.width,
|
|
112
|
+
height: node.height,
|
|
113
|
+
rx: node.rx,
|
|
114
|
+
ry: node.ry,
|
|
115
|
+
...drawn(node)
|
|
116
|
+
},
|
|
117
|
+
key
|
|
118
|
+
);
|
|
119
|
+
case "circle":
|
|
120
|
+
return /* @__PURE__ */ jsx(
|
|
121
|
+
"circle",
|
|
122
|
+
{
|
|
123
|
+
cx: node.cx,
|
|
124
|
+
cy: node.cy,
|
|
125
|
+
r: node.r,
|
|
126
|
+
...drawn(node)
|
|
127
|
+
},
|
|
128
|
+
key
|
|
129
|
+
);
|
|
130
|
+
case "ellipse":
|
|
131
|
+
return /* @__PURE__ */ jsx(
|
|
132
|
+
"ellipse",
|
|
133
|
+
{
|
|
134
|
+
cx: node.cx,
|
|
135
|
+
cy: node.cy,
|
|
136
|
+
rx: node.rx,
|
|
137
|
+
ry: node.ry,
|
|
138
|
+
...drawn(node)
|
|
139
|
+
},
|
|
140
|
+
key
|
|
141
|
+
);
|
|
142
|
+
case "line":
|
|
143
|
+
return /* @__PURE__ */ jsx(
|
|
144
|
+
"line",
|
|
145
|
+
{
|
|
146
|
+
x1: node.x1,
|
|
147
|
+
y1: node.y1,
|
|
148
|
+
x2: node.x2,
|
|
149
|
+
y2: node.y2,
|
|
150
|
+
...drawn(node)
|
|
151
|
+
},
|
|
152
|
+
key
|
|
153
|
+
);
|
|
154
|
+
case "polygon":
|
|
155
|
+
return /* @__PURE__ */ jsx(
|
|
156
|
+
"polygon",
|
|
157
|
+
{
|
|
158
|
+
points: node.points.map((p) => p.join(",")).join(" "),
|
|
159
|
+
...drawn(node)
|
|
160
|
+
},
|
|
161
|
+
key
|
|
162
|
+
);
|
|
163
|
+
case "polyline":
|
|
164
|
+
return /* @__PURE__ */ jsx(
|
|
165
|
+
"polyline",
|
|
166
|
+
{
|
|
167
|
+
points: node.points.map((p) => p.join(",")).join(" "),
|
|
168
|
+
...drawn(node)
|
|
169
|
+
},
|
|
170
|
+
key
|
|
171
|
+
);
|
|
172
|
+
case "text":
|
|
173
|
+
return /* @__PURE__ */ jsx(
|
|
174
|
+
"text",
|
|
175
|
+
{
|
|
176
|
+
x: node.x,
|
|
177
|
+
y: node.y,
|
|
178
|
+
textAnchor: node.anchor,
|
|
179
|
+
fontSize: node.fontSize,
|
|
180
|
+
fontWeight: node.fontWeight,
|
|
181
|
+
...drawn(node),
|
|
182
|
+
children: node.copy
|
|
183
|
+
},
|
|
184
|
+
key
|
|
185
|
+
);
|
|
186
|
+
default:
|
|
187
|
+
throw new Error(
|
|
188
|
+
`Art: <${String(node.el)}> is not an art element`
|
|
189
|
+
// SAFE: reached only by a tree that skipped its check
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function Art({ tree }) {
|
|
194
|
+
return /* @__PURE__ */ jsx(Fragment, { children: tree.frames.map((frame, i) => /* @__PURE__ */ jsx(
|
|
195
|
+
"svg",
|
|
196
|
+
{
|
|
197
|
+
viewBox: `0 0 ${frame.width} ${frame.height}`,
|
|
198
|
+
preserveAspectRatio: preserveOf(frame.anchor, frame.fit),
|
|
199
|
+
"aria-hidden": "true",
|
|
200
|
+
className: frameClass(frame.only),
|
|
201
|
+
children: frame.nodes.map(render)
|
|
202
|
+
},
|
|
203
|
+
i
|
|
204
|
+
)) });
|
|
205
|
+
}
|
|
206
|
+
export {
|
|
207
|
+
Art,
|
|
208
|
+
frameClass,
|
|
209
|
+
preserveOf
|
|
210
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #5956 — the closed tone vocabulary of the material layer. Each tone is a
|
|
3
|
+
* theme token, derived per project from its brand (`deriveMaterialRamp`), so a
|
|
4
|
+
* theme change reaches every band, figure and field. Every class is written
|
|
5
|
+
* out in full so an app's Tailwind scan sees it. `Tone` is held to the ramp's
|
|
6
|
+
* own step list by `material-primitives-5956.test.ts`.
|
|
7
|
+
*
|
|
8
|
+
* `paper` and `ink` hold in dark mode, as a brand step does: art printed on
|
|
9
|
+
* white stays on white. `page` is the page's own surface, in either scheme: the
|
|
10
|
+
* tone for a band that should follow it, such as the one behind a footer.
|
|
11
|
+
*
|
|
12
|
+
* Published alone as `@caqophony/ui/material-tones`, with no client directive
|
|
13
|
+
* (`server-entries.json`), so a server component's art can read `FILL` and
|
|
14
|
+
* `STROKE`. It must import nothing: a shared chunk would carry the directive.
|
|
15
|
+
*
|
|
16
|
+
* Authored by Caqophony
|
|
17
|
+
*/
|
|
18
|
+
type Tone = 'night-0' | 'night-1' | 'night-2' | 'sky-0' | 'sky-1' | 'sky-2' | 'sky-3' | 'sky-4' | 'glow' | 'glow-soft' | 'glow-pale' | 'canvas' | 'mist-1' | 'mist-2' | 'mist-3' | 'paper' | 'ink' | 'page';
|
|
19
|
+
declare const FILL: Readonly<Record<Tone, string>>;
|
|
20
|
+
declare const STROKE: Readonly<Record<Tone, string>>;
|
|
21
|
+
declare const BG: Readonly<Record<Tone, string>>;
|
|
22
|
+
|
|
23
|
+
export { BG, FILL, STROKE, type Tone };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// src/material/tones.ts
|
|
2
|
+
var FILL = {
|
|
3
|
+
"night-0": "fill-night-0",
|
|
4
|
+
"night-1": "fill-night-1",
|
|
5
|
+
"night-2": "fill-night-2",
|
|
6
|
+
"sky-0": "fill-sky-0",
|
|
7
|
+
"sky-1": "fill-sky-1",
|
|
8
|
+
"sky-2": "fill-sky-2",
|
|
9
|
+
"sky-3": "fill-sky-3",
|
|
10
|
+
"sky-4": "fill-sky-4",
|
|
11
|
+
glow: "fill-glow",
|
|
12
|
+
"glow-soft": "fill-glow-soft",
|
|
13
|
+
"glow-pale": "fill-glow-pale",
|
|
14
|
+
canvas: "fill-canvas",
|
|
15
|
+
"mist-1": "fill-mist-1",
|
|
16
|
+
"mist-2": "fill-mist-2",
|
|
17
|
+
"mist-3": "fill-mist-3",
|
|
18
|
+
paper: "fill-paper",
|
|
19
|
+
ink: "fill-ink",
|
|
20
|
+
page: "fill-background"
|
|
21
|
+
};
|
|
22
|
+
var STROKE = {
|
|
23
|
+
"night-0": "stroke-night-0",
|
|
24
|
+
"night-1": "stroke-night-1",
|
|
25
|
+
"night-2": "stroke-night-2",
|
|
26
|
+
"sky-0": "stroke-sky-0",
|
|
27
|
+
"sky-1": "stroke-sky-1",
|
|
28
|
+
"sky-2": "stroke-sky-2",
|
|
29
|
+
"sky-3": "stroke-sky-3",
|
|
30
|
+
"sky-4": "stroke-sky-4",
|
|
31
|
+
glow: "stroke-glow",
|
|
32
|
+
"glow-soft": "stroke-glow-soft",
|
|
33
|
+
"glow-pale": "stroke-glow-pale",
|
|
34
|
+
canvas: "stroke-canvas",
|
|
35
|
+
"mist-1": "stroke-mist-1",
|
|
36
|
+
"mist-2": "stroke-mist-2",
|
|
37
|
+
"mist-3": "stroke-mist-3",
|
|
38
|
+
paper: "stroke-paper",
|
|
39
|
+
ink: "stroke-ink",
|
|
40
|
+
page: "stroke-background"
|
|
41
|
+
};
|
|
42
|
+
var BG = {
|
|
43
|
+
"night-0": "bg-night-0",
|
|
44
|
+
"night-1": "bg-night-1",
|
|
45
|
+
"night-2": "bg-night-2",
|
|
46
|
+
"sky-0": "bg-sky-0",
|
|
47
|
+
"sky-1": "bg-sky-1",
|
|
48
|
+
"sky-2": "bg-sky-2",
|
|
49
|
+
"sky-3": "bg-sky-3",
|
|
50
|
+
"sky-4": "bg-sky-4",
|
|
51
|
+
glow: "bg-glow",
|
|
52
|
+
"glow-soft": "bg-glow-soft",
|
|
53
|
+
"glow-pale": "bg-glow-pale",
|
|
54
|
+
canvas: "bg-canvas",
|
|
55
|
+
"mist-1": "bg-mist-1",
|
|
56
|
+
"mist-2": "bg-mist-2",
|
|
57
|
+
"mist-3": "bg-mist-3",
|
|
58
|
+
paper: "bg-paper",
|
|
59
|
+
ink: "bg-ink",
|
|
60
|
+
page: "bg-background"
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
BG,
|
|
64
|
+
FILL,
|
|
65
|
+
STROKE
|
|
66
|
+
};
|