@cliangdev/conductor 0.21.0 → 0.22.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/assets/claude/skills/conductor-creative/SKILL.md +144 -0
- package/assets/claude/skills/conductor-publisher/SKILL.md +4 -0
- package/assets/cli-manifest.json +94 -0
- package/dist/commands/creative.d.ts +3 -0
- package/dist/commands/creative.d.ts.map +1 -0
- package/dist/commands/creative.js +60 -0
- package/dist/commands/creative.js.map +1 -0
- package/dist/creative/assertions.js +221 -0
- package/dist/creative/font.js +39 -0
- package/dist/creative/frame.css +126 -0
- package/dist/creative/frame.html +29 -0
- package/dist/creative/frame.js +76 -0
- package/dist/creative/job/render.mjs +203 -0
- package/dist/creative/job/server.mjs +72 -0
- package/dist/creative/job/transport.mjs +167 -0
- package/dist/creative/layouts/bleed/layout.css +47 -0
- package/dist/creative/layouts/bleed/layout.json +17 -0
- package/dist/creative/layouts/card/layout.css +24 -0
- package/dist/creative/layouts/card/layout.json +17 -0
- package/dist/creative/layouts/index.js +62 -0
- package/dist/creative/layouts/index.json +1 -0
- package/dist/creative/layouts/split/layout.css +22 -0
- package/dist/creative/layouts/split/layout.json +17 -0
- package/dist/creative/layouts/stacked/layout.css +40 -0
- package/dist/creative/layouts/stacked/layout.json +23 -0
- package/dist/creative/placements.js +200 -0
- package/dist/creative/placements.json +232 -0
- package/dist/creative/render.js +457 -0
- package/dist/creative/sheet.html +27 -0
- package/dist/creative/sheet.js +94 -0
- package/dist/creative/styles.css +314 -0
- package/dist/creative/tokens.css +33 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/creative-browser.d.ts +25 -0
- package/dist/lib/creative-browser.d.ts.map +1 -0
- package/dist/lib/creative-browser.js +36 -0
- package/dist/lib/creative-browser.js.map +1 -0
- package/dist/lib/creative-id.d.ts +8 -0
- package/dist/lib/creative-id.d.ts.map +1 -0
- package/dist/lib/creative-id.js +14 -0
- package/dist/lib/creative-id.js.map +1 -0
- package/dist/lib/creative-render.d.ts +32 -0
- package/dist/lib/creative-render.d.ts.map +1 -0
- package/dist/lib/creative-render.js +71 -0
- package/dist/lib/creative-render.js.map +1 -0
- package/dist/lib/image-dimensions.d.ts +20 -0
- package/dist/lib/image-dimensions.d.ts.map +1 -0
- package/dist/lib/image-dimensions.js +115 -0
- package/dist/lib/image-dimensions.js.map +1 -0
- package/dist/lib/plugin-assets.d.ts.map +1 -1
- package/dist/lib/plugin-assets.js +1 -0
- package/dist/lib/plugin-assets.js.map +1 -1
- package/dist/mcp/index.d.ts +18 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +284 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/creatives.d.ts +93 -0
- package/dist/mcp/tools/creatives.d.ts.map +1 -0
- package/dist/mcp/tools/creatives.js +291 -0
- package/dist/mcp/tools/creatives.js.map +1 -0
- package/dist/mcp/tools/insights.d.ts.map +1 -1
- package/dist/mcp/tools/insights.js +14 -0
- package/dist/mcp/tools/insights.js.map +1 -1
- package/package.json +4 -3
- package/scripts/build-creative.mjs +93 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* bleed — photo covers the whole artboard, text sits over a scrim. */
|
|
2
|
+
|
|
3
|
+
.cc-board--bleed {
|
|
4
|
+
background-image: var(--cc-photo);
|
|
5
|
+
background-size: cover;
|
|
6
|
+
background-position: var(--cc-focal, 50% 50%);
|
|
7
|
+
justify-content: flex-end;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* Fill variant (9x16, 4x5, story): the scrim covers the artboard and the
|
|
11
|
+
copy is distributed from top to bottom over it. */
|
|
12
|
+
.cc-board__panel--fill {
|
|
13
|
+
flex: 1 1 auto;
|
|
14
|
+
height: 100%;
|
|
15
|
+
justify-content: space-between;
|
|
16
|
+
}
|
|
17
|
+
.cc-r-9x16 .cc-board__panel--fill,
|
|
18
|
+
.cc-r-story .cc-board__panel--fill {
|
|
19
|
+
padding: 48px 88px var(--cc-safe-bottom, 430px);
|
|
20
|
+
background-image: linear-gradient(to top,
|
|
21
|
+
rgba(0,0,0,0.94) 0%, rgba(0,0,0,0.88) 42%,
|
|
22
|
+
rgba(0,0,0,0.68) 62%, rgba(0,0,0,0.34) 80%, rgba(0,0,0,0.55) 100%);
|
|
23
|
+
}
|
|
24
|
+
.cc-r-4x5 .cc-board__panel--fill {
|
|
25
|
+
padding: 48px 88px 96px;
|
|
26
|
+
background-image: linear-gradient(to top,
|
|
27
|
+
rgba(0,0,0,0.94) 0%, rgba(0,0,0,0.88) 48%,
|
|
28
|
+
rgba(0,0,0,0.62) 70%, rgba(0,0,0,0.30) 86%, rgba(0,0,0,0.50) 100%);
|
|
29
|
+
}
|
|
30
|
+
/* The chip's own padding already reads as a visual left inset over a full-bleed photo; nudge it back
|
|
31
|
+
flush with the panel's other content (ported from nexus's bleed layout.css). */
|
|
32
|
+
.cc-board__panel--fill .cc-lockup--chip { margin-left: -40px; }
|
|
33
|
+
|
|
34
|
+
/* Sequence frames (stories and carousels): anchored bottom so the eye does
|
|
35
|
+
not have to re-find the copy between taps or swipes. */
|
|
36
|
+
.cc-board--seq .cc-board__panel--fill { justify-content: flex-end; gap: 28px; }
|
|
37
|
+
.cc-board--story.cc-board--bleed .cc-board__panel--fill { padding-top: var(--cc-safe-top, 250px); }
|
|
38
|
+
|
|
39
|
+
/* Bottom variant (every 1x1, forced via perPlacement). */
|
|
40
|
+
.cc-board__panel--bottom {
|
|
41
|
+
flex: 0 0 auto;
|
|
42
|
+
padding: 220px 72px 48px;
|
|
43
|
+
gap: 14px;
|
|
44
|
+
background-image: linear-gradient(to top,
|
|
45
|
+
rgba(28,28,30,0.97) 0%, rgba(28,28,30,0.95) 42%,
|
|
46
|
+
rgba(28,28,30,0.74) 66%, rgba(28,28,30,0.26) 88%, rgba(28,28,30,0) 100%);
|
|
47
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bleed",
|
|
3
|
+
"description": "Photo fills the artboard, copy sits over a scrim.",
|
|
4
|
+
"themes": [
|
|
5
|
+
"dark"
|
|
6
|
+
],
|
|
7
|
+
"lockupInPanel": true,
|
|
8
|
+
"photo": "background",
|
|
9
|
+
"panel": "fill",
|
|
10
|
+
"dropBody": [],
|
|
11
|
+
"perPlacement": {
|
|
12
|
+
"1x1": {
|
|
13
|
+
"layout": "bleed",
|
|
14
|
+
"panel": "bottom"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* card — the light layout: inset rounded photo card on a light page. */
|
|
2
|
+
|
|
3
|
+
.cc-board--card { padding: var(--cc-card-pad); gap: var(--cc-card-gap); }
|
|
4
|
+
|
|
5
|
+
.cc-board__card {
|
|
6
|
+
position: relative;
|
|
7
|
+
width: 100%;
|
|
8
|
+
height: var(--cc-band-h);
|
|
9
|
+
flex: 0 0 auto;
|
|
10
|
+
border-radius: 24px;
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
box-shadow: var(--cc-elev-high);
|
|
13
|
+
}
|
|
14
|
+
.cc-board__card img {
|
|
15
|
+
position: absolute; inset: 0;
|
|
16
|
+
width: 100%; height: 100%;
|
|
17
|
+
object-fit: cover;
|
|
18
|
+
object-position: var(--cc-focal, 50% 40%);
|
|
19
|
+
}
|
|
20
|
+
.cc-board--card .cc-board__panel {
|
|
21
|
+
flex: 1 1 auto; min-height: 0;
|
|
22
|
+
justify-content: center;
|
|
23
|
+
gap: 28px;
|
|
24
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "card",
|
|
3
|
+
"description": "The light layout: inset rounded photo on a light page.",
|
|
4
|
+
"themes": [
|
|
5
|
+
"dark",
|
|
6
|
+
"light"
|
|
7
|
+
],
|
|
8
|
+
"lockupInPanel": false,
|
|
9
|
+
"photo": "card",
|
|
10
|
+
"panel": "plain",
|
|
11
|
+
"band": {
|
|
12
|
+
"9x16": 700,
|
|
13
|
+
"4x5": 520,
|
|
14
|
+
"1x1": 320
|
|
15
|
+
},
|
|
16
|
+
"dropBody": []
|
|
17
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// layouts/index.js — the layout registry as a JS module: the same data as
|
|
2
|
+
// layouts/index.json plus every layouts/<name>/layout.json, assembled into one
|
|
3
|
+
// object. Ships alongside the .json files so a bundler can import the
|
|
4
|
+
// registry directly; test/registry.test.mjs asserts the two never drift.
|
|
5
|
+
//
|
|
6
|
+
// A layout is a structural family (where the photo goes, how the panel is
|
|
7
|
+
// built, which themes it allows, per-placement overrides) with its look coming
|
|
8
|
+
// entirely from the CSS custom properties a brand and a placement set — never
|
|
9
|
+
// a brand value baked in here. Adding a layout is a new folder plus an entry
|
|
10
|
+
// in both this file and layouts/index.json.
|
|
11
|
+
export const layoutNames = ['stacked', 'bleed', 'card', 'split'];
|
|
12
|
+
|
|
13
|
+
export const layouts = {
|
|
14
|
+
stacked: {
|
|
15
|
+
name: 'stacked',
|
|
16
|
+
description: 'Photo band pinned top over a solid text panel.',
|
|
17
|
+
themes: ['dark'],
|
|
18
|
+
lockupInPanel: true,
|
|
19
|
+
photo: 'band',
|
|
20
|
+
panel: 'plain',
|
|
21
|
+
band: { '9x16': 1080, '4x5': 800 },
|
|
22
|
+
dropBody: ['4x5'],
|
|
23
|
+
perPlacement: {
|
|
24
|
+
'1x1': { layout: 'bleed', panel: 'bottom' },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
bleed: {
|
|
28
|
+
name: 'bleed',
|
|
29
|
+
description: 'Photo fills the artboard, copy sits over a scrim.',
|
|
30
|
+
themes: ['dark'],
|
|
31
|
+
lockupInPanel: true,
|
|
32
|
+
photo: 'background',
|
|
33
|
+
panel: 'fill',
|
|
34
|
+
dropBody: [],
|
|
35
|
+
perPlacement: {
|
|
36
|
+
'1x1': { layout: 'bleed', panel: 'bottom' },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
card: {
|
|
40
|
+
name: 'card',
|
|
41
|
+
description: 'The light layout: inset rounded photo on a light page.',
|
|
42
|
+
themes: ['dark', 'light'],
|
|
43
|
+
lockupInPanel: false,
|
|
44
|
+
photo: 'card',
|
|
45
|
+
panel: 'plain',
|
|
46
|
+
band: { '9x16': 700, '4x5': 520, '1x1': 320 },
|
|
47
|
+
dropBody: [],
|
|
48
|
+
},
|
|
49
|
+
split: {
|
|
50
|
+
name: 'split',
|
|
51
|
+
description: 'Photo on the top half, copy on a solid panel below, no scrim.',
|
|
52
|
+
themes: ['dark'],
|
|
53
|
+
lockupInPanel: true,
|
|
54
|
+
photo: 'band',
|
|
55
|
+
panel: 'plain',
|
|
56
|
+
band: { '9x16': 960, '4x5': 675, '1x1': 540 },
|
|
57
|
+
dropBody: [],
|
|
58
|
+
bandScrim: false,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export default layouts;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["stacked","bleed","card","split"]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* split — photo on the top half, plain panel below, no scrim. Proves a fourth
|
|
2
|
+
layout needs only this folder plus an entry in layouts/index.json. */
|
|
3
|
+
|
|
4
|
+
.cc-board--split .cc-board__band {
|
|
5
|
+
position: relative;
|
|
6
|
+
flex: 0 0 auto;
|
|
7
|
+
height: var(--cc-band-h);
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
.cc-board--split .cc-board__band img {
|
|
11
|
+
position: absolute; inset: 0;
|
|
12
|
+
width: 100%; height: 100%;
|
|
13
|
+
object-fit: cover;
|
|
14
|
+
object-position: var(--cc-focal, 50% 30%);
|
|
15
|
+
}
|
|
16
|
+
.cc-board--split .cc-board__panel {
|
|
17
|
+
flex: 1 1 auto; min-height: 0;
|
|
18
|
+
padding: 72px 88px;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
gap: 24px;
|
|
21
|
+
background-color: var(--cc-d-bg);
|
|
22
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "split",
|
|
3
|
+
"description": "Photo on the top half, copy on a solid panel below, no scrim.",
|
|
4
|
+
"themes": [
|
|
5
|
+
"dark"
|
|
6
|
+
],
|
|
7
|
+
"lockupInPanel": true,
|
|
8
|
+
"photo": "band",
|
|
9
|
+
"panel": "plain",
|
|
10
|
+
"band": {
|
|
11
|
+
"9x16": 960,
|
|
12
|
+
"4x5": 675,
|
|
13
|
+
"1x1": 540
|
|
14
|
+
},
|
|
15
|
+
"dropBody": [],
|
|
16
|
+
"bandScrim": false
|
|
17
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* stacked — photo band pinned top over a solid text panel. */
|
|
2
|
+
|
|
3
|
+
.cc-board__band {
|
|
4
|
+
position: relative;
|
|
5
|
+
flex: 0 0 auto;
|
|
6
|
+
height: var(--cc-band-h);
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
margin-bottom: -2px; /* hides a subpixel seam against the panel below */
|
|
9
|
+
}
|
|
10
|
+
.cc-board__band img {
|
|
11
|
+
position: absolute; inset: 0;
|
|
12
|
+
width: 100%; height: 100%;
|
|
13
|
+
object-fit: cover;
|
|
14
|
+
object-position: var(--cc-focal, 50% 30%);
|
|
15
|
+
}
|
|
16
|
+
.cc-board__scrim {
|
|
17
|
+
position: absolute; left: 0; right: 0; bottom: 0; height: 220px;
|
|
18
|
+
background: linear-gradient(to top,
|
|
19
|
+
var(--cc-d-bg) 0%, var(--cc-d-bg) 18%,
|
|
20
|
+
rgba(28,28,30,0.75) 42%, rgba(28,28,30,0.25) 72%, rgba(28,28,30,0) 100%);
|
|
21
|
+
}
|
|
22
|
+
.cc-board__glow {
|
|
23
|
+
position: absolute; right: -200px; bottom: -260px;
|
|
24
|
+
width: 720px; height: 720px; border-radius: 50%;
|
|
25
|
+
background: radial-gradient(circle, color-mix(in srgb, var(--cc-accent) 13%, transparent), transparent 68%);
|
|
26
|
+
pointer-events: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.cc-board--stacked .cc-board__panel { flex: 1 1 auto; min-height: 0; }
|
|
30
|
+
.cc-r-9x16.cc-board--stacked .cc-board__panel,
|
|
31
|
+
.cc-r-story.cc-board--stacked .cc-board__panel {
|
|
32
|
+
padding: 88px 88px var(--cc-pad-b, var(--cc-safe-bottom, 430px));
|
|
33
|
+
justify-content: space-between;
|
|
34
|
+
gap: 26px;
|
|
35
|
+
}
|
|
36
|
+
.cc-r-4x5.cc-board--stacked .cc-board__panel {
|
|
37
|
+
padding: 0 88px 88px;
|
|
38
|
+
justify-content: center;
|
|
39
|
+
gap: 20px;
|
|
40
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "stacked",
|
|
3
|
+
"description": "Photo band pinned top over a solid text panel.",
|
|
4
|
+
"themes": [
|
|
5
|
+
"dark"
|
|
6
|
+
],
|
|
7
|
+
"lockupInPanel": true,
|
|
8
|
+
"photo": "band",
|
|
9
|
+
"panel": "plain",
|
|
10
|
+
"band": {
|
|
11
|
+
"9x16": 1080,
|
|
12
|
+
"4x5": 800
|
|
13
|
+
},
|
|
14
|
+
"dropBody": [
|
|
15
|
+
"4x5"
|
|
16
|
+
],
|
|
17
|
+
"perPlacement": {
|
|
18
|
+
"1x1": {
|
|
19
|
+
"layout": "bleed",
|
|
20
|
+
"panel": "bottom"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// placements.js — the placement registry as a JS module, exporting the exact
|
|
2
|
+
// same data as placements.json. Shipping both lets a bundler (the Next.js
|
|
3
|
+
// frontend) import the object directly without a JSON loader, while a probe
|
|
4
|
+
// like the backend's sync test (or a Node consumer) can read placements.json
|
|
5
|
+
// on disk. test/registry.test.mjs asserts the two never drift apart.
|
|
6
|
+
//
|
|
7
|
+
// Each placement key is an artboard size: pixel dimensions, a platform label,
|
|
8
|
+
// whether it renders by default, the safe zone (top/bottom/right px a layout
|
|
9
|
+
// must not intrude on — this is where a caption sticker, a link overlay, etc.
|
|
10
|
+
// live on the real platform surface), the headline auto-fit bounds, and the
|
|
11
|
+
// per-placement scale numbers render.js applies as CSS custom properties.
|
|
12
|
+
//
|
|
13
|
+
// Adding a placement is a new key here (and in placements.json, kept equal by
|
|
14
|
+
// the sync test) — no code change.
|
|
15
|
+
export const placements = {
|
|
16
|
+
'9x16': {
|
|
17
|
+
w: 1080,
|
|
18
|
+
h: 1920,
|
|
19
|
+
label: '9:16 TikTok and Reels',
|
|
20
|
+
platform: 'tiktok',
|
|
21
|
+
default: true,
|
|
22
|
+
safe: { top: 220, bottom: 430, right: 140 },
|
|
23
|
+
fit: { max: 132, min: 54, lines: 4 },
|
|
24
|
+
badgeHeight: 108,
|
|
25
|
+
scale: {
|
|
26
|
+
lockupGap: 22,
|
|
27
|
+
iconSize: 80,
|
|
28
|
+
iconRadius: 20,
|
|
29
|
+
markHeight: 50,
|
|
30
|
+
chipPadding: '12px 28px 12px 12px',
|
|
31
|
+
chipGap: 20,
|
|
32
|
+
chipIcon: 64,
|
|
33
|
+
chipIconRadius: 16,
|
|
34
|
+
chipMark: 40,
|
|
35
|
+
bodySize: 32,
|
|
36
|
+
bodyLineHeight: 1.35,
|
|
37
|
+
bodyMaxWidth: 860,
|
|
38
|
+
bodyColor: 'rgba(255,255,255,0.72)',
|
|
39
|
+
lightBodySize: 40,
|
|
40
|
+
ctaGap: 28,
|
|
41
|
+
ctaMarginTop: 0,
|
|
42
|
+
noteSize: 28,
|
|
43
|
+
noteColor: 'rgba(255,255,255,0.55)',
|
|
44
|
+
cardPad: '72px 72px var(--cc-safe-bottom, 430px) 72px',
|
|
45
|
+
cardGap: 56,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
'4x5': {
|
|
49
|
+
w: 1080,
|
|
50
|
+
h: 1350,
|
|
51
|
+
label: '4:5 Instagram feed',
|
|
52
|
+
platform: 'instagram',
|
|
53
|
+
default: true,
|
|
54
|
+
safe: { top: 0, bottom: 0, right: 0 },
|
|
55
|
+
fit: { max: 118, min: 44, lines: 4 },
|
|
56
|
+
badgeHeight: 90,
|
|
57
|
+
scale: {
|
|
58
|
+
lockupGap: 22,
|
|
59
|
+
iconSize: 80,
|
|
60
|
+
iconRadius: 20,
|
|
61
|
+
markHeight: 50,
|
|
62
|
+
chipPadding: '12px 28px 12px 12px',
|
|
63
|
+
chipGap: 20,
|
|
64
|
+
chipIcon: 64,
|
|
65
|
+
chipIconRadius: 16,
|
|
66
|
+
chipMark: 40,
|
|
67
|
+
bodySize: 30,
|
|
68
|
+
bodyLineHeight: 1.35,
|
|
69
|
+
bodyMaxWidth: 860,
|
|
70
|
+
bodyColor: 'rgba(255,255,255,0.72)',
|
|
71
|
+
ctaGap: 28,
|
|
72
|
+
ctaMarginTop: 0,
|
|
73
|
+
noteSize: 28,
|
|
74
|
+
noteColor: 'rgba(255,255,255,0.55)',
|
|
75
|
+
cardPad: '72px 72px 88px 72px',
|
|
76
|
+
cardGap: 56,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
'1x1': {
|
|
80
|
+
w: 1080,
|
|
81
|
+
h: 1080,
|
|
82
|
+
label: '1:1 Facebook feed',
|
|
83
|
+
platform: 'facebook',
|
|
84
|
+
default: true,
|
|
85
|
+
safe: { top: 0, bottom: 0, right: 0 },
|
|
86
|
+
fit: { max: 60, min: 30, lines: 3 },
|
|
87
|
+
badgeHeight: 64,
|
|
88
|
+
scale: {
|
|
89
|
+
lockupGap: 13,
|
|
90
|
+
iconSize: 44,
|
|
91
|
+
iconRadius: 11,
|
|
92
|
+
markHeight: 27,
|
|
93
|
+
chipPadding: '8px 20px 8px 8px',
|
|
94
|
+
chipGap: 12,
|
|
95
|
+
bodySize: 23,
|
|
96
|
+
bodyLineHeight: 1.3,
|
|
97
|
+
bodyMaxWidth: 880,
|
|
98
|
+
bodyColor: 'rgba(255,255,255,0.75)',
|
|
99
|
+
ctaGap: 24,
|
|
100
|
+
ctaMarginTop: 6,
|
|
101
|
+
noteSize: 21,
|
|
102
|
+
noteColor: 'rgba(255,255,255,0.6)',
|
|
103
|
+
cardPad: '64px 64px 72px 64px',
|
|
104
|
+
cardGap: 40,
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
story: {
|
|
108
|
+
w: 1080,
|
|
109
|
+
h: 1920,
|
|
110
|
+
label: '9:16 Instagram and Facebook Stories',
|
|
111
|
+
platform: 'story',
|
|
112
|
+
default: false,
|
|
113
|
+
safe: { top: 250, bottom: 350, right: 170 },
|
|
114
|
+
fit: { max: 132, min: 54, lines: 4 },
|
|
115
|
+
badgeHeight: 108,
|
|
116
|
+
scale: {
|
|
117
|
+
lockupGap: 22,
|
|
118
|
+
iconSize: 80,
|
|
119
|
+
iconRadius: 20,
|
|
120
|
+
markHeight: 50,
|
|
121
|
+
chipPadding: '12px 28px 12px 12px',
|
|
122
|
+
chipGap: 20,
|
|
123
|
+
chipIcon: 64,
|
|
124
|
+
chipIconRadius: 16,
|
|
125
|
+
chipMark: 40,
|
|
126
|
+
bodySize: 32,
|
|
127
|
+
bodyLineHeight: 1.35,
|
|
128
|
+
bodyMaxWidth: 860,
|
|
129
|
+
bodyColor: 'rgba(255,255,255,0.72)',
|
|
130
|
+
lightBodySize: 40,
|
|
131
|
+
ctaGap: 28,
|
|
132
|
+
ctaMarginTop: 0,
|
|
133
|
+
noteSize: 28,
|
|
134
|
+
noteColor: 'rgba(255,255,255,0.55)',
|
|
135
|
+
cardPad: '72px 72px var(--cc-safe-bottom, 430px) 72px',
|
|
136
|
+
cardGap: 56,
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
'1.91x1': {
|
|
140
|
+
w: 1200,
|
|
141
|
+
h: 628,
|
|
142
|
+
label: '1.91:1 link ad',
|
|
143
|
+
platform: 'link',
|
|
144
|
+
default: false,
|
|
145
|
+
safe: { top: 0, bottom: 0, right: 0 },
|
|
146
|
+
fit: { max: 72, min: 34, lines: 3 },
|
|
147
|
+
badgeHeight: 56,
|
|
148
|
+
scale: {
|
|
149
|
+
lockupGap: 13,
|
|
150
|
+
iconSize: 44,
|
|
151
|
+
iconRadius: 11,
|
|
152
|
+
markHeight: 27,
|
|
153
|
+
chipPadding: '8px 20px 8px 8px',
|
|
154
|
+
chipGap: 12,
|
|
155
|
+
bodySize: 23,
|
|
156
|
+
bodyLineHeight: 1.3,
|
|
157
|
+
bodyMaxWidth: 880,
|
|
158
|
+
bodyColor: 'rgba(255,255,255,0.75)',
|
|
159
|
+
ctaGap: 24,
|
|
160
|
+
ctaMarginTop: 6,
|
|
161
|
+
noteSize: 21,
|
|
162
|
+
noteColor: 'rgba(255,255,255,0.6)',
|
|
163
|
+
cardPad: '64px 64px 72px 64px',
|
|
164
|
+
cardGap: 40,
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
'2x3': {
|
|
168
|
+
w: 1000,
|
|
169
|
+
h: 1500,
|
|
170
|
+
label: '2:3 Pinterest',
|
|
171
|
+
platform: 'pinterest',
|
|
172
|
+
default: false,
|
|
173
|
+
safe: { top: 0, bottom: 0, right: 0 },
|
|
174
|
+
fit: { max: 118, min: 44, lines: 4 },
|
|
175
|
+
badgeHeight: 90,
|
|
176
|
+
scale: {
|
|
177
|
+
lockupGap: 22,
|
|
178
|
+
iconSize: 80,
|
|
179
|
+
iconRadius: 20,
|
|
180
|
+
markHeight: 50,
|
|
181
|
+
chipPadding: '12px 28px 12px 12px',
|
|
182
|
+
chipGap: 20,
|
|
183
|
+
chipIcon: 64,
|
|
184
|
+
chipIconRadius: 16,
|
|
185
|
+
chipMark: 40,
|
|
186
|
+
bodySize: 30,
|
|
187
|
+
bodyLineHeight: 1.35,
|
|
188
|
+
bodyMaxWidth: 860,
|
|
189
|
+
bodyColor: 'rgba(255,255,255,0.72)',
|
|
190
|
+
ctaGap: 28,
|
|
191
|
+
ctaMarginTop: 0,
|
|
192
|
+
noteSize: 28,
|
|
193
|
+
noteColor: 'rgba(255,255,255,0.55)',
|
|
194
|
+
cardPad: '72px 72px 88px 72px',
|
|
195
|
+
cardGap: 56,
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
export default placements;
|