@idelio/contracts 0.1.0-beta.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/LICENSE +21 -0
- package/README.md +27 -0
- package/dist/api-keys.d.ts +44 -0
- package/dist/api-keys.js +19 -0
- package/dist/assets.d.ts +188 -0
- package/dist/assets.js +107 -0
- package/dist/billing.d.ts +94 -0
- package/dist/billing.js +67 -0
- package/dist/brands.d.ts +641 -0
- package/dist/brands.js +364 -0
- package/dist/catalog.d.ts +26 -0
- package/dist/catalog.js +53 -0
- package/dist/consent.d.ts +60 -0
- package/dist/consent.js +65 -0
- package/dist/creative-direction.d.ts +333 -0
- package/dist/creative-direction.js +681 -0
- package/dist/credits.d.ts +38 -0
- package/dist/credits.js +31 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.js +22 -0
- package/dist/events.d.ts +20 -0
- package/dist/events.js +29 -0
- package/dist/ids.d.ts +28 -0
- package/dist/ids.js +29 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +19 -0
- package/dist/jobs.d.ts +100 -0
- package/dist/jobs.js +81 -0
- package/dist/me.d.ts +77 -0
- package/dist/me.js +45 -0
- package/dist/notifications.d.ts +17 -0
- package/dist/notifications.js +26 -0
- package/dist/pricing.d.ts +38 -0
- package/dist/pricing.js +105 -0
- package/dist/rate-limits.d.ts +8 -0
- package/dist/rate-limits.js +18 -0
- package/dist/usage.d.ts +22 -0
- package/dist/usage.js +11 -0
- package/dist/waitlist.d.ts +34 -0
- package/dist/waitlist.js +27 -0
- package/dist/webhooks.d.ts +74 -0
- package/dist/webhooks.js +26 -0
- package/openapi/openapi.yaml +3026 -0
- package/package.json +54 -0
|
@@ -0,0 +1,681 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const brandStyles = [
|
|
3
|
+
"modern",
|
|
4
|
+
"minimal",
|
|
5
|
+
"bold",
|
|
6
|
+
"playful",
|
|
7
|
+
"elegant",
|
|
8
|
+
"corporate",
|
|
9
|
+
"luxury",
|
|
10
|
+
"organic",
|
|
11
|
+
"geometric",
|
|
12
|
+
"handcrafted",
|
|
13
|
+
"brutalist",
|
|
14
|
+
"editorial",
|
|
15
|
+
"retro",
|
|
16
|
+
"vintage",
|
|
17
|
+
"futuristic",
|
|
18
|
+
"timeless",
|
|
19
|
+
"art_deco",
|
|
20
|
+
"y2k",
|
|
21
|
+
"calm",
|
|
22
|
+
"energetic",
|
|
23
|
+
"warm",
|
|
24
|
+
"technical",
|
|
25
|
+
"rebellious",
|
|
26
|
+
"premium",
|
|
27
|
+
];
|
|
28
|
+
export const MAX_BRAND_STYLES = 5;
|
|
29
|
+
export const BRAND_STYLES = {
|
|
30
|
+
modern: { label: "Modern", hint: "contemporary and clean, of this decade" },
|
|
31
|
+
minimal: { label: "Minimal", hint: "stripped back, generous space, few elements" },
|
|
32
|
+
bold: { label: "Bold", hint: "high contrast, confident, impossible to miss" },
|
|
33
|
+
playful: { label: "Playful", hint: "friendly and light, with a sense of humour" },
|
|
34
|
+
elegant: { label: "Elegant", hint: "refined and restrained, quietly expensive" },
|
|
35
|
+
corporate: { label: "Corporate", hint: "credible and institutional, trust first" },
|
|
36
|
+
luxury: { label: "Luxury", hint: "premium materials, deep tones, unhurried" },
|
|
37
|
+
organic: { label: "Organic", hint: "natural forms, soft edges, earthy" },
|
|
38
|
+
geometric: { label: "Geometric", hint: "built from circles, squares and precise angles" },
|
|
39
|
+
handcrafted: { label: "Handcrafted", hint: "made by a person, slight imperfection welcome" },
|
|
40
|
+
brutalist: { label: "Brutalist", hint: "raw, structural, unapologetically plain" },
|
|
41
|
+
editorial: { label: "Editorial", hint: "magazine typography, strong hierarchy" },
|
|
42
|
+
retro: { label: "Retro", hint: "knowingly borrowed from the 70s and 80s" },
|
|
43
|
+
vintage: { label: "Vintage", hint: "aged and heritage, as if it has always existed" },
|
|
44
|
+
futuristic: { label: "Futuristic", hint: "forward looking, technical, slightly synthetic" },
|
|
45
|
+
timeless: { label: "Timeless", hint: "classical proportions that will not date" },
|
|
46
|
+
art_deco: { label: "Art deco", hint: "symmetry, gold, stepped geometry" },
|
|
47
|
+
y2k: { label: "Y2K", hint: "early web optimism, chrome and gradients" },
|
|
48
|
+
calm: { label: "Calm", hint: "low contrast, quiet, reassuring" },
|
|
49
|
+
energetic: { label: "Energetic", hint: "saturated, kinetic, forward leaning" },
|
|
50
|
+
warm: { label: "Warm", hint: "human and inviting, warm hues" },
|
|
51
|
+
technical: { label: "Technical", hint: "precise, systematic, engineered" },
|
|
52
|
+
rebellious: { label: "Rebellious", hint: "breaks the category's rules on purpose" },
|
|
53
|
+
premium: { label: "Premium", hint: "considered detail, restraint over decoration" },
|
|
54
|
+
};
|
|
55
|
+
export const brandStyleGroupIds = ["character", "aesthetic", "era", "energy"];
|
|
56
|
+
export const DEFAULT_STYLE_GROUP_ID = "character";
|
|
57
|
+
export const brandStyleGroups = [
|
|
58
|
+
{
|
|
59
|
+
id: "character",
|
|
60
|
+
label: "Character",
|
|
61
|
+
styles: ["modern", "minimal", "bold", "playful", "elegant", "corporate"],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "aesthetic",
|
|
65
|
+
label: "Aesthetic",
|
|
66
|
+
styles: ["luxury", "organic", "geometric", "handcrafted", "brutalist", "editorial"],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: "era",
|
|
70
|
+
label: "Era",
|
|
71
|
+
styles: ["retro", "vintage", "futuristic", "timeless", "art_deco", "y2k"],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "energy",
|
|
75
|
+
label: "Energy",
|
|
76
|
+
styles: ["calm", "energetic", "warm", "technical", "rebellious", "premium"],
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
export const paletteIds = [
|
|
80
|
+
"indigo",
|
|
81
|
+
"teal",
|
|
82
|
+
"amber",
|
|
83
|
+
"forest",
|
|
84
|
+
"rose",
|
|
85
|
+
"slate",
|
|
86
|
+
"midnight",
|
|
87
|
+
"coral",
|
|
88
|
+
"sand",
|
|
89
|
+
"plum",
|
|
90
|
+
"ocean",
|
|
91
|
+
"citrus",
|
|
92
|
+
"mono_warm",
|
|
93
|
+
"berry",
|
|
94
|
+
];
|
|
95
|
+
export const paletteDirections = [
|
|
96
|
+
{
|
|
97
|
+
id: "indigo",
|
|
98
|
+
name: "Indigo focus",
|
|
99
|
+
desc: "Confident and modern - great for tech and SaaS.",
|
|
100
|
+
colors: ["#4744C9", "#6D6EF0", "#14162E", "#EEEEFC", "#A5A3F0"],
|
|
101
|
+
mood: ["technical", "modern", "trustworthy"],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "teal",
|
|
105
|
+
name: "Calm teal",
|
|
106
|
+
desc: "Fresh and trustworthy - health and wellness.",
|
|
107
|
+
colors: ["#0EA5A4", "#134E4A", "#99F6E4", "#F0FDFA", "#5EEAD4"],
|
|
108
|
+
mood: ["calm", "clean", "health"],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: "amber",
|
|
112
|
+
name: "Warm amber",
|
|
113
|
+
desc: "Inviting and artisanal - food, craft and retail.",
|
|
114
|
+
colors: ["#B45309", "#C9884F", "#EADBC8", "#2A1B12", "#F59E0B"],
|
|
115
|
+
mood: ["warm", "handcrafted", "food"],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "forest",
|
|
119
|
+
name: "Deep forest",
|
|
120
|
+
desc: "Grounded and premium - sustainable brands.",
|
|
121
|
+
colors: ["#16A34A", "#065F46", "#BBF7D0", "#052E16", "#22C55E"],
|
|
122
|
+
mood: ["organic", "sustainable", "grounded"],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: "rose",
|
|
126
|
+
name: "Rose bloom",
|
|
127
|
+
desc: "Elegant and editorial - beauty and lifestyle.",
|
|
128
|
+
colors: ["#E11D48", "#5B1E3F", "#FBCFE1", "#FFF1F5", "#F472A0"],
|
|
129
|
+
mood: ["elegant", "beauty", "editorial"],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: "slate",
|
|
133
|
+
name: "Slate mono",
|
|
134
|
+
desc: "Minimal and precise - premium and pro tools.",
|
|
135
|
+
colors: ["#111827", "#374151", "#9CA3AF", "#F3F4F6", "#6B7280"],
|
|
136
|
+
mood: ["minimal", "technical", "premium"],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: "midnight",
|
|
140
|
+
name: "Midnight blue",
|
|
141
|
+
desc: "Serious and nocturnal - fintech and security.",
|
|
142
|
+
colors: ["#1E3A8A", "#0B1220", "#93C5FD", "#F8FAFC", "#3B82F6"],
|
|
143
|
+
mood: ["corporate", "secure", "night"],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: "coral",
|
|
147
|
+
name: "Coral pop",
|
|
148
|
+
desc: "Energetic and social - consumer apps.",
|
|
149
|
+
colors: ["#FF6B5B", "#7C2D12", "#FFD9D2", "#FFF7F5", "#FB923C"],
|
|
150
|
+
mood: ["energetic", "playful", "consumer"],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: "sand",
|
|
154
|
+
name: "Sand and ink",
|
|
155
|
+
desc: "Quiet and editorial - studios and publishing.",
|
|
156
|
+
colors: ["#C4A484", "#2B2622", "#EFE6DA", "#FBF8F4", "#8A7A66"],
|
|
157
|
+
mood: ["timeless", "editorial", "calm"],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: "plum",
|
|
161
|
+
name: "Deep plum",
|
|
162
|
+
desc: "Rich and expressive - culture and events.",
|
|
163
|
+
colors: ["#6D28D9", "#2E1065", "#DDD6FE", "#FAF5FF", "#A78BFA"],
|
|
164
|
+
mood: ["luxury", "expressive", "culture"],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: "ocean",
|
|
168
|
+
name: "Ocean depth",
|
|
169
|
+
desc: "Wide and dependable - logistics and travel.",
|
|
170
|
+
colors: ["#0369A1", "#082F49", "#BAE6FD", "#F0F9FF", "#38BDF8"],
|
|
171
|
+
mood: ["dependable", "travel", "open"],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "citrus",
|
|
175
|
+
name: "Citrus bright",
|
|
176
|
+
desc: "Optimistic and loud - sport and food delivery.",
|
|
177
|
+
colors: ["#CA8A04", "#422006", "#FEF08A", "#FEFCE8", "#FACC15"],
|
|
178
|
+
mood: ["energetic", "optimistic", "sport"],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: "mono_warm",
|
|
182
|
+
name: "Warm mono",
|
|
183
|
+
desc: "One hue, many steps - restrained and premium.",
|
|
184
|
+
colors: ["#3F3A34", "#1C1917", "#D6D3D1", "#FAFAF9", "#78716C"],
|
|
185
|
+
mood: ["minimal", "premium", "warm"],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: "berry",
|
|
189
|
+
name: "Berry contrast",
|
|
190
|
+
desc: "Bold and modern - fashion and media.",
|
|
191
|
+
colors: ["#BE123C", "#4C0519", "#FECDD3", "#FFF1F2", "#F43F5E"],
|
|
192
|
+
mood: ["bold", "fashion", "modern"],
|
|
193
|
+
},
|
|
194
|
+
];
|
|
195
|
+
export const CUSTOM_PALETTE_DEFAULT = [
|
|
196
|
+
"#4744C9",
|
|
197
|
+
"#14162E",
|
|
198
|
+
"#F59E0B",
|
|
199
|
+
"#E5E7EB",
|
|
200
|
+
"#F8FAFC",
|
|
201
|
+
];
|
|
202
|
+
export const fontPairIds = [
|
|
203
|
+
"sora_inter",
|
|
204
|
+
"fraunces_inter",
|
|
205
|
+
"space_inter",
|
|
206
|
+
"playfair_source",
|
|
207
|
+
"dmserif_dmsans",
|
|
208
|
+
"outfit_inter",
|
|
209
|
+
"manrope_manrope",
|
|
210
|
+
"bricolage_inter",
|
|
211
|
+
"instrument_inter",
|
|
212
|
+
"archivo_archivo",
|
|
213
|
+
"lora_lato",
|
|
214
|
+
"syne_inter",
|
|
215
|
+
"epilogue_inter",
|
|
216
|
+
"ibmplex_ibmplex",
|
|
217
|
+
"jost_inter",
|
|
218
|
+
"newsreader_inter",
|
|
219
|
+
"chivo_chivo",
|
|
220
|
+
"unbounded_inter",
|
|
221
|
+
"figtree_figtree",
|
|
222
|
+
"spectral_inter",
|
|
223
|
+
];
|
|
224
|
+
export const fontPairCategories = [
|
|
225
|
+
"geometric",
|
|
226
|
+
"editorial",
|
|
227
|
+
"technical",
|
|
228
|
+
"humanist",
|
|
229
|
+
"display",
|
|
230
|
+
];
|
|
231
|
+
const INTER = {
|
|
232
|
+
family: "Inter Variable",
|
|
233
|
+
fontsourcePackage: "@fontsource-variable/inter",
|
|
234
|
+
weights: "100 900",
|
|
235
|
+
license: "OFL",
|
|
236
|
+
};
|
|
237
|
+
export const fontPairs = [
|
|
238
|
+
{
|
|
239
|
+
id: "sora_inter",
|
|
240
|
+
name: "Sora + Inter",
|
|
241
|
+
desc: "Geometric, modern, versatile.",
|
|
242
|
+
category: "geometric",
|
|
243
|
+
heading: {
|
|
244
|
+
family: "Sora Variable",
|
|
245
|
+
fontsourcePackage: "@fontsource-variable/sora",
|
|
246
|
+
weights: "100 800",
|
|
247
|
+
license: "OFL",
|
|
248
|
+
},
|
|
249
|
+
body: INTER,
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
id: "fraunces_inter",
|
|
253
|
+
name: "Fraunces + Inter",
|
|
254
|
+
desc: "Editorial with a warm, wobbly contrast.",
|
|
255
|
+
category: "editorial",
|
|
256
|
+
heading: {
|
|
257
|
+
family: "Fraunces Variable",
|
|
258
|
+
fontsourcePackage: "@fontsource-variable/fraunces",
|
|
259
|
+
weights: "100 900",
|
|
260
|
+
license: "OFL",
|
|
261
|
+
},
|
|
262
|
+
body: INTER,
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
id: "space_inter",
|
|
266
|
+
name: "Space Grotesk + Inter",
|
|
267
|
+
desc: "Technical and precise, with character.",
|
|
268
|
+
category: "technical",
|
|
269
|
+
heading: {
|
|
270
|
+
family: "Space Grotesk Variable",
|
|
271
|
+
fontsourcePackage: "@fontsource-variable/space-grotesk",
|
|
272
|
+
weights: "300 700",
|
|
273
|
+
license: "OFL",
|
|
274
|
+
},
|
|
275
|
+
body: INTER,
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
id: "playfair_source",
|
|
279
|
+
name: "Playfair Display + Source Sans 3",
|
|
280
|
+
desc: "High contrast serif over a calm sans.",
|
|
281
|
+
category: "editorial",
|
|
282
|
+
heading: {
|
|
283
|
+
family: "Playfair Display Variable",
|
|
284
|
+
fontsourcePackage: "@fontsource-variable/playfair-display",
|
|
285
|
+
weights: "400 900",
|
|
286
|
+
license: "OFL",
|
|
287
|
+
},
|
|
288
|
+
body: {
|
|
289
|
+
family: "Source Sans 3 Variable",
|
|
290
|
+
fontsourcePackage: "@fontsource-variable/source-sans-3",
|
|
291
|
+
weights: "200 900",
|
|
292
|
+
license: "OFL",
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
id: "dmserif_dmsans",
|
|
297
|
+
name: "DM Serif Display + DM Sans",
|
|
298
|
+
desc: "One family's serif and sans, made to pair.",
|
|
299
|
+
category: "editorial",
|
|
300
|
+
heading: {
|
|
301
|
+
family: "DM Serif Display",
|
|
302
|
+
fontsourcePackage: "@fontsource/dm-serif-display",
|
|
303
|
+
weights: "400",
|
|
304
|
+
license: "OFL",
|
|
305
|
+
},
|
|
306
|
+
body: {
|
|
307
|
+
family: "DM Sans Variable",
|
|
308
|
+
fontsourcePackage: "@fontsource-variable/dm-sans",
|
|
309
|
+
weights: "100 1000",
|
|
310
|
+
license: "OFL",
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
id: "outfit_inter",
|
|
315
|
+
name: "Outfit + Inter",
|
|
316
|
+
desc: "Wide geometric caps, friendly and current.",
|
|
317
|
+
category: "geometric",
|
|
318
|
+
heading: {
|
|
319
|
+
family: "Outfit Variable",
|
|
320
|
+
fontsourcePackage: "@fontsource-variable/outfit",
|
|
321
|
+
weights: "100 900",
|
|
322
|
+
license: "OFL",
|
|
323
|
+
},
|
|
324
|
+
body: INTER,
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
id: "manrope_manrope",
|
|
328
|
+
name: "Manrope",
|
|
329
|
+
desc: "One humanist sans doing both jobs.",
|
|
330
|
+
category: "humanist",
|
|
331
|
+
heading: {
|
|
332
|
+
family: "Manrope Variable",
|
|
333
|
+
fontsourcePackage: "@fontsource-variable/manrope",
|
|
334
|
+
weights: "200 800",
|
|
335
|
+
license: "OFL",
|
|
336
|
+
},
|
|
337
|
+
body: {
|
|
338
|
+
family: "Manrope Variable",
|
|
339
|
+
fontsourcePackage: "@fontsource-variable/manrope",
|
|
340
|
+
weights: "200 800",
|
|
341
|
+
license: "OFL",
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
id: "bricolage_inter",
|
|
346
|
+
name: "Bricolage Grotesque + Inter",
|
|
347
|
+
desc: "Deliberately irregular, memorable headlines.",
|
|
348
|
+
category: "display",
|
|
349
|
+
heading: {
|
|
350
|
+
family: "Bricolage Grotesque Variable",
|
|
351
|
+
fontsourcePackage: "@fontsource-variable/bricolage-grotesque",
|
|
352
|
+
weights: "200 800",
|
|
353
|
+
license: "OFL",
|
|
354
|
+
},
|
|
355
|
+
body: INTER,
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
id: "instrument_inter",
|
|
359
|
+
name: "Instrument Serif + Inter",
|
|
360
|
+
desc: "Tall, quiet serif for a restrained brand.",
|
|
361
|
+
category: "editorial",
|
|
362
|
+
heading: {
|
|
363
|
+
family: "Instrument Serif",
|
|
364
|
+
fontsourcePackage: "@fontsource/instrument-serif",
|
|
365
|
+
weights: "400",
|
|
366
|
+
license: "OFL",
|
|
367
|
+
},
|
|
368
|
+
body: INTER,
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
id: "archivo_archivo",
|
|
372
|
+
name: "Archivo Black + Archivo",
|
|
373
|
+
desc: "Heavy grotesque headlines over its own text face.",
|
|
374
|
+
category: "display",
|
|
375
|
+
heading: {
|
|
376
|
+
family: "Archivo Black",
|
|
377
|
+
fontsourcePackage: "@fontsource/archivo-black",
|
|
378
|
+
weights: "400",
|
|
379
|
+
license: "OFL",
|
|
380
|
+
},
|
|
381
|
+
body: {
|
|
382
|
+
family: "Archivo Variable",
|
|
383
|
+
fontsourcePackage: "@fontsource-variable/archivo",
|
|
384
|
+
weights: "100 900",
|
|
385
|
+
license: "OFL",
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
id: "lora_lato",
|
|
390
|
+
name: "Lora + Lato",
|
|
391
|
+
desc: "Warm bookish serif with a neutral sans.",
|
|
392
|
+
category: "humanist",
|
|
393
|
+
heading: {
|
|
394
|
+
family: "Lora Variable",
|
|
395
|
+
fontsourcePackage: "@fontsource-variable/lora",
|
|
396
|
+
weights: "400 700",
|
|
397
|
+
license: "OFL",
|
|
398
|
+
},
|
|
399
|
+
body: {
|
|
400
|
+
family: "Lato",
|
|
401
|
+
fontsourcePackage: "@fontsource/lato",
|
|
402
|
+
weights: "400;700",
|
|
403
|
+
license: "OFL",
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
id: "syne_inter",
|
|
408
|
+
name: "Syne + Inter",
|
|
409
|
+
desc: "Art-scene display face, unmistakably contemporary.",
|
|
410
|
+
category: "display",
|
|
411
|
+
heading: {
|
|
412
|
+
family: "Syne Variable",
|
|
413
|
+
fontsourcePackage: "@fontsource-variable/syne",
|
|
414
|
+
weights: "400 800",
|
|
415
|
+
license: "OFL",
|
|
416
|
+
},
|
|
417
|
+
body: INTER,
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
id: "epilogue_inter",
|
|
421
|
+
name: "Epilogue + Inter",
|
|
422
|
+
desc: "Crisp geometric sans with a sharp italic.",
|
|
423
|
+
category: "geometric",
|
|
424
|
+
heading: {
|
|
425
|
+
family: "Epilogue Variable",
|
|
426
|
+
fontsourcePackage: "@fontsource-variable/epilogue",
|
|
427
|
+
weights: "100 900",
|
|
428
|
+
license: "OFL",
|
|
429
|
+
},
|
|
430
|
+
body: INTER,
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
id: "ibmplex_ibmplex",
|
|
434
|
+
name: "IBM Plex Sans",
|
|
435
|
+
desc: "Engineered and systematic, one family throughout.",
|
|
436
|
+
category: "technical",
|
|
437
|
+
heading: {
|
|
438
|
+
family: "IBM Plex Sans Variable",
|
|
439
|
+
fontsourcePackage: "@fontsource-variable/ibm-plex-sans",
|
|
440
|
+
weights: "100 700",
|
|
441
|
+
license: "OFL",
|
|
442
|
+
},
|
|
443
|
+
body: {
|
|
444
|
+
family: "IBM Plex Sans Variable",
|
|
445
|
+
fontsourcePackage: "@fontsource-variable/ibm-plex-sans",
|
|
446
|
+
weights: "100 700",
|
|
447
|
+
license: "OFL",
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
id: "jost_inter",
|
|
452
|
+
name: "Jost + Inter",
|
|
453
|
+
desc: "Futura-adjacent geometry, clean and timeless.",
|
|
454
|
+
category: "geometric",
|
|
455
|
+
heading: {
|
|
456
|
+
family: "Jost Variable",
|
|
457
|
+
fontsourcePackage: "@fontsource-variable/jost",
|
|
458
|
+
weights: "100 900",
|
|
459
|
+
license: "OFL",
|
|
460
|
+
},
|
|
461
|
+
body: INTER,
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
id: "newsreader_inter",
|
|
465
|
+
name: "Newsreader + Inter",
|
|
466
|
+
desc: "Made for long reads, comfortable at any size.",
|
|
467
|
+
category: "editorial",
|
|
468
|
+
heading: {
|
|
469
|
+
family: "Newsreader Variable",
|
|
470
|
+
fontsourcePackage: "@fontsource-variable/newsreader",
|
|
471
|
+
weights: "200 800",
|
|
472
|
+
license: "OFL",
|
|
473
|
+
},
|
|
474
|
+
body: INTER,
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
id: "chivo_chivo",
|
|
478
|
+
name: "Chivo",
|
|
479
|
+
desc: "Sturdy grotesque, plain-spoken and legible.",
|
|
480
|
+
category: "humanist",
|
|
481
|
+
heading: {
|
|
482
|
+
family: "Chivo Variable",
|
|
483
|
+
fontsourcePackage: "@fontsource-variable/chivo",
|
|
484
|
+
weights: "100 900",
|
|
485
|
+
license: "OFL",
|
|
486
|
+
},
|
|
487
|
+
body: {
|
|
488
|
+
family: "Chivo Variable",
|
|
489
|
+
fontsourcePackage: "@fontsource-variable/chivo",
|
|
490
|
+
weights: "100 900",
|
|
491
|
+
license: "OFL",
|
|
492
|
+
},
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
id: "unbounded_inter",
|
|
496
|
+
name: "Unbounded + Inter",
|
|
497
|
+
desc: "Loud display face for a brand that wants noticing.",
|
|
498
|
+
category: "display",
|
|
499
|
+
heading: {
|
|
500
|
+
family: "Unbounded Variable",
|
|
501
|
+
fontsourcePackage: "@fontsource-variable/unbounded",
|
|
502
|
+
weights: "200 900",
|
|
503
|
+
license: "OFL",
|
|
504
|
+
},
|
|
505
|
+
body: INTER,
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
id: "figtree_figtree",
|
|
509
|
+
name: "Figtree",
|
|
510
|
+
desc: "Soft, approachable sans across the whole system.",
|
|
511
|
+
category: "humanist",
|
|
512
|
+
heading: {
|
|
513
|
+
family: "Figtree Variable",
|
|
514
|
+
fontsourcePackage: "@fontsource-variable/figtree",
|
|
515
|
+
weights: "300 900",
|
|
516
|
+
license: "OFL",
|
|
517
|
+
},
|
|
518
|
+
body: {
|
|
519
|
+
family: "Figtree Variable",
|
|
520
|
+
fontsourcePackage: "@fontsource-variable/figtree",
|
|
521
|
+
weights: "300 900",
|
|
522
|
+
license: "OFL",
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
id: "spectral_inter",
|
|
527
|
+
name: "Spectral + Inter",
|
|
528
|
+
desc: "Screen-first serif, quietly authoritative.",
|
|
529
|
+
category: "editorial",
|
|
530
|
+
heading: {
|
|
531
|
+
family: "Spectral",
|
|
532
|
+
fontsourcePackage: "@fontsource/spectral",
|
|
533
|
+
weights: "400;600;700",
|
|
534
|
+
license: "OFL",
|
|
535
|
+
},
|
|
536
|
+
body: INTER,
|
|
537
|
+
},
|
|
538
|
+
];
|
|
539
|
+
export const logoMarkStyles = [
|
|
540
|
+
"geometric",
|
|
541
|
+
"rounded",
|
|
542
|
+
"circular",
|
|
543
|
+
"sharp",
|
|
544
|
+
"monogram",
|
|
545
|
+
"lettermark",
|
|
546
|
+
"abstract",
|
|
547
|
+
"emblem",
|
|
548
|
+
"organic",
|
|
549
|
+
"line",
|
|
550
|
+
"gradient",
|
|
551
|
+
"wordmark_only",
|
|
552
|
+
];
|
|
553
|
+
export const LOGO_MARK_STYLES = {
|
|
554
|
+
geometric: {
|
|
555
|
+
label: "Geometric",
|
|
556
|
+
desc: "Built from precise circles, squares and angles.",
|
|
557
|
+
category: "geometric",
|
|
558
|
+
previewPath: "M4 6h14v14H4Z M22 6h14v14H22Z M4 24h32v10H4Z",
|
|
559
|
+
},
|
|
560
|
+
rounded: {
|
|
561
|
+
label: "Rounded",
|
|
562
|
+
desc: "Soft forms with generous corner radii.",
|
|
563
|
+
category: "humanist",
|
|
564
|
+
previewPath: "M11 6h18a7 7 0 0 1 7 7v14a7 7 0 0 1-7 7H11a7 7 0 0 1-7-7V13a7 7 0 0 1 7-7Z",
|
|
565
|
+
},
|
|
566
|
+
circular: {
|
|
567
|
+
label: "Circular",
|
|
568
|
+
desc: "A balanced badge, contained in a circle.",
|
|
569
|
+
category: "editorial",
|
|
570
|
+
previewPath: "M20 4a16 16 0 1 1 0 32 16 16 0 0 1 0-32Z",
|
|
571
|
+
},
|
|
572
|
+
sharp: {
|
|
573
|
+
label: "Sharp",
|
|
574
|
+
desc: "Crisp angular geometry, confident corners.",
|
|
575
|
+
category: "geometric",
|
|
576
|
+
previewPath: "M20 2 38 20 20 38 2 20Z",
|
|
577
|
+
},
|
|
578
|
+
monogram: {
|
|
579
|
+
label: "Monogram",
|
|
580
|
+
desc: "Built from the brand's initials.",
|
|
581
|
+
previewPath: "M6 6h6l8 12 8-12h6v28h-7V19l-7 10-7-10v15H6Z",
|
|
582
|
+
},
|
|
583
|
+
lettermark: {
|
|
584
|
+
label: "Lettermark",
|
|
585
|
+
desc: "A single stylised letterform.",
|
|
586
|
+
previewPath: "M20 5 34 35h-7L20 19 13 35H6Z",
|
|
587
|
+
},
|
|
588
|
+
abstract: {
|
|
589
|
+
label: "Abstract",
|
|
590
|
+
desc: "Non-representational, meaning through form.",
|
|
591
|
+
category: "display",
|
|
592
|
+
previewPath: "M13 5a10 10 0 1 1 0 20 10 10 0 0 1 0-20Z M27 15a10 10 0 1 1 0 20 10 10 0 0 1 0-20Z",
|
|
593
|
+
},
|
|
594
|
+
emblem: {
|
|
595
|
+
label: "Emblem",
|
|
596
|
+
desc: "A pictorial motif enclosed inside a shape.",
|
|
597
|
+
previewPath: "M20 3 35 9v12c0 8-6 14-15 17-9-3-15-9-15-17V9Z",
|
|
598
|
+
},
|
|
599
|
+
organic: {
|
|
600
|
+
label: "Organic",
|
|
601
|
+
desc: "Natural forms with flowing edges.",
|
|
602
|
+
category: "humanist",
|
|
603
|
+
previewPath: "M35 5c0 15-9 27-24 30C11 20 20 8 35 5Z",
|
|
604
|
+
},
|
|
605
|
+
line: {
|
|
606
|
+
label: "Line",
|
|
607
|
+
desc: "Single-weight line art, no heavy fills.",
|
|
608
|
+
category: "technical",
|
|
609
|
+
previewPath: "M6 34 20 6l14 28h-4.5L20 15 10.5 34Z",
|
|
610
|
+
},
|
|
611
|
+
gradient: {
|
|
612
|
+
label: "Gradient",
|
|
613
|
+
desc: "A smooth two-tone fade across the mark.",
|
|
614
|
+
category: "display",
|
|
615
|
+
previewPath: "M20 4a16 16 0 1 1 0 32Z M20 4a16 16 0 0 0-13 25h13Z",
|
|
616
|
+
},
|
|
617
|
+
wordmark_only: {
|
|
618
|
+
label: "Wordmark only",
|
|
619
|
+
desc: "Typographic name, with no separate icon.",
|
|
620
|
+
previewPath: "M4 13h32v6H4Z M4 23h22v6H4Z",
|
|
621
|
+
},
|
|
622
|
+
};
|
|
623
|
+
export const logoLockups = ["horizontal", "stacked", "icon_only"];
|
|
624
|
+
export const LOGO_LOCKUPS = {
|
|
625
|
+
horizontal: { label: "Horizontal", desc: "Mark on the left, name on the right." },
|
|
626
|
+
stacked: { label: "Stacked", desc: "Mark above, name centred below." },
|
|
627
|
+
icon_only: { label: "Icon only", desc: "The mark alone, with no name." },
|
|
628
|
+
};
|
|
629
|
+
export const AI_CHOICE = "ai";
|
|
630
|
+
export const hexColorSchema = z
|
|
631
|
+
.string()
|
|
632
|
+
.regex(/^#[0-9a-fA-F]{6}$/, "must be a six-digit hex color, e.g. #4744C9");
|
|
633
|
+
export const colorDirectionSchema = z.discriminatedUnion("mode", [
|
|
634
|
+
z.object({ mode: z.literal(AI_CHOICE) }).strict(),
|
|
635
|
+
z.object({ mode: z.literal("preset"), preset_id: z.enum(paletteIds) }).strict(),
|
|
636
|
+
z.object({ mode: z.literal("custom"), colors: z.array(hexColorSchema).min(3).max(6) }).strict(),
|
|
637
|
+
]);
|
|
638
|
+
export const typographyDirectionSchema = z.discriminatedUnion("mode", [
|
|
639
|
+
z.object({ mode: z.literal(AI_CHOICE) }).strict(),
|
|
640
|
+
z.object({ mode: z.literal("preset"), preset_id: z.enum(fontPairIds) }).strict(),
|
|
641
|
+
]);
|
|
642
|
+
export const logoDirectionSchema = z
|
|
643
|
+
.object({
|
|
644
|
+
style: z.union([z.literal(AI_CHOICE), z.enum(logoMarkStyles)]).default(AI_CHOICE),
|
|
645
|
+
lockup: z.union([z.literal(AI_CHOICE), z.enum(logoLockups)]).default(AI_CHOICE),
|
|
646
|
+
include_tagline: z.boolean().default(false),
|
|
647
|
+
})
|
|
648
|
+
.strict()
|
|
649
|
+
.refine((v) => !(v.style === "wordmark_only" && v.lockup === "icon_only"), {
|
|
650
|
+
path: ["lockup"],
|
|
651
|
+
message: 'a "wordmark only" mark cannot use the "icon only" lockup - there is no icon',
|
|
652
|
+
});
|
|
653
|
+
export const creativeDirectionSchema = z
|
|
654
|
+
.object({
|
|
655
|
+
styles: z.array(z.enum(brandStyles)).max(MAX_BRAND_STYLES).optional(),
|
|
656
|
+
color: colorDirectionSchema.optional(),
|
|
657
|
+
typography: typographyDirectionSchema.optional(),
|
|
658
|
+
logo: logoDirectionSchema.optional(),
|
|
659
|
+
})
|
|
660
|
+
.strict();
|
|
661
|
+
export const DEFAULT_CREATIVE_DIRECTION = {
|
|
662
|
+
styles: [],
|
|
663
|
+
color: { mode: AI_CHOICE },
|
|
664
|
+
typography: { mode: AI_CHOICE },
|
|
665
|
+
logo: { style: AI_CHOICE, lockup: AI_CHOICE, include_tagline: false },
|
|
666
|
+
};
|
|
667
|
+
export const SHORTLIST_SIZES = { palettes: 12, font_pairs: 8, logo_styles: 6 };
|
|
668
|
+
export const creativeDirectionsRequestSchema = z
|
|
669
|
+
.object({
|
|
670
|
+
prompt: z.string().min(8).max(500),
|
|
671
|
+
styles: z.array(z.enum(brandStyles)).max(MAX_BRAND_STYLES).optional(),
|
|
672
|
+
})
|
|
673
|
+
.strict();
|
|
674
|
+
export const creativeDirectionsResponseSchema = z
|
|
675
|
+
.object({
|
|
676
|
+
palettes: z.array(z.enum(paletteIds)),
|
|
677
|
+
font_pairs: z.array(z.enum(fontPairIds)),
|
|
678
|
+
logo_styles: z.array(z.enum(logoMarkStyles)),
|
|
679
|
+
rationale: z.string().max(200).optional(),
|
|
680
|
+
})
|
|
681
|
+
.strict();
|