@koda-sl/baker-cli 0.450.0 → 0.451.0-dev.d9192b76e
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 +9 -1
- package/dist/{account-F6MHQ64I.js → account-4NKJUHAX.js} +3 -3
- package/dist/{account-writes-ISE4U2FQ.js → account-writes-G4AQU3VO.js} +3 -3
- package/dist/{ad-group-writes-UU5NNKSO.js → ad-group-writes-5EI7ZUJ5.js} +3 -3
- package/dist/{ad-groups-CGFXZNIA.js → ad-groups-LMABGPYC.js} +7 -7
- package/dist/{ad-writes-NALDYWOR.js → ad-writes-6IDBPDXA.js} +3 -3
- package/dist/{ads-PV7GZXPR.js → ads-KAKCCIMC.js} +8 -8
- package/dist/{ads-6MXVIV62.js → ads-OYQK5UIE.js} +2 -2
- package/dist/{animate-FWWHSYPL.js → animate-Z2T3H3LT.js} +4 -4
- package/dist/{audiences-VEKGLWBG.js → audiences-MHTOHG5O.js} +3 -3
- package/dist/{brief-EK6ULGXD.js → brief-WBF6CYEL.js} +5 -5
- package/dist/{campaign-writes-SX52CJYW.js → campaign-writes-JTGBURBJ.js} +3 -3
- package/dist/{campaigns-X3DPCCSN.js → campaigns-FC7MKUSE.js} +7 -7
- package/dist/{canvas-XYCDLDRS.js → canvas-A54MR6MA.js} +13 -13
- package/dist/{catalog-ME44ZRZF.js → catalog-6L2QHG4J.js} +6 -6
- package/dist/{catalogs-G3YEVG6S.js → catalogs-JCWJX4T6.js} +3 -3
- package/dist/{chatgpt-QNUN63YS.js → chatgpt-WMBVL3FZ.js} +13 -13
- package/dist/{chunk-P2RE52V7.js → chunk-2FB3GT3T.js} +3 -3
- package/dist/{chunk-542XAHNT.js → chunk-4D5QDX5F.js} +3 -3
- package/dist/{chunk-7WD2RW2R.js → chunk-5ICHPX5S.js} +2 -2
- package/dist/{chunk-K66OLA6Y.js → chunk-DPYVRK2J.js} +54 -27
- package/dist/chunk-DPYVRK2J.js.map +1 -0
- package/dist/{chunk-VB6WJJR3.js → chunk-GMHWZVTG.js} +2 -2
- package/dist/{chunk-KQTYTCKQ.js → chunk-INK2NCJ6.js} +2 -2
- package/dist/{chunk-7ZHMGXE2.js → chunk-JH2RZU7H.js} +3 -3
- package/dist/{chunk-P6ICBEE4.js → chunk-K2PZPVSQ.js} +5 -5
- package/dist/chunk-K2PZPVSQ.js.map +1 -0
- package/dist/{chunk-D5XAVXUZ.js → chunk-K6D5ZZ6R.js} +6 -6
- package/dist/{chunk-KFE3S63W.js → chunk-K6MTKYPC.js} +3 -3
- package/dist/{chunk-K7FZXIOZ.js → chunk-KUGXBSFR.js} +2 -2
- package/dist/{chunk-GLCPTMPG.js → chunk-LTBFR6NT.js} +5 -5
- package/dist/{chunk-KLBTXETO.js → chunk-OCDSEI6D.js} +169 -169
- package/dist/chunk-OCDSEI6D.js.map +1 -0
- package/dist/{chunk-54UVGFX3.js → chunk-PFGHX7FG.js} +4 -4
- package/dist/{chunk-ULJ5RFOV.js → chunk-QAP7HVKN.js} +2 -2
- package/dist/{chunk-HQSCJYZO.js → chunk-QTMCA6JM.js} +2 -2
- package/dist/{chunk-J5IY3GVE.js → chunk-SUML5T3G.js} +4 -4
- package/dist/{chunk-CHSNHVYF.js → chunk-SZF65D5I.js} +4 -4
- package/dist/chunk-SZF65D5I.js.map +1 -0
- package/dist/{chunk-PLGIETFZ.js → chunk-UPBIBKA7.js} +6 -6
- package/dist/{chunk-35XWJEWH.js → chunk-WCCGRK6P.js} +2 -2
- package/dist/{chunk-TD6GIMV6.js → chunk-WNA43DDU.js} +2 -2
- package/dist/{chunk-LYBXCXJB.js → chunk-XBE7QI2C.js} +2 -2
- package/dist/{chunk-NEXCBTBZ.js → chunk-YA7NZZGA.js} +2 -2
- package/dist/{chunk-TXI5OWCF.js → chunk-ZAVWJK7I.js} +19 -13
- package/dist/{chunk-TXI5OWCF.js.map → chunk-ZAVWJK7I.js.map} +1 -1
- package/dist/cli.js +7 -7
- package/dist/{conversion-report-N4HANYOB.js → conversion-report-YMW72GUE.js} +2 -2
- package/dist/{conversion-writes-LW4HQKK5.js → conversion-writes-HCENZRSI.js} +3 -3
- package/dist/{conversions-TS723AZV.js → conversions-WDMVDUBJ.js} +5 -5
- package/dist/{creatives-D3NXWVUF.js → creatives-QWKF7YKQ.js} +7 -7
- package/dist/{credentials-4BPEXA3E.js → credentials-2OJ5KTJY.js} +14 -14
- package/dist/credentials-2OJ5KTJY.js.map +1 -0
- package/dist/{critique-3XJG44NG.js → critique-RVVKOWGS.js} +6 -6
- package/dist/{customers-USB6VCMU.js → customers-AQMZLTHL.js} +3 -3
- package/dist/{draft-THPZFASM.js → draft-QYKYXZYX.js} +3 -3
- package/dist/engine/index.js +5 -5
- package/dist/{feedback-C6CBUUDA.js → feedback-ZRIGOXR6.js} +2 -2
- package/dist/{feedback-record-FM5MW2YV.js → feedback-record-ENMRET57.js} +8 -8
- package/dist/{fit-7237F5EB.js → fit-D3TXME5X.js} +5 -5
- package/dist/{generate-MMBYB44G.js → generate-YDBUZ2VC.js} +3 -3
- package/dist/{history-DBIEYQHY.js → history-VIOY7LN5.js} +3 -3
- package/dist/{insights-ZIU6FJMS.js → insights-3HAJWLE2.js} +2 -2
- package/dist/{learn-MMIGRLCP.js → learn-IUNXQGY6.js} +4 -4
- package/dist/{locations-74TPQWAT.js → locations-S7TMZH64.js} +2 -2
- package/dist/{make-ATEHKECL.js → make-VOJNPEWW.js} +16 -13
- package/dist/{make-ATEHKECL.js.map → make-VOJNPEWW.js.map} +1 -1
- package/dist/{models-7U3GRYHF.js → models-BC5G76EA.js} +2 -2
- package/dist/{pixels-45A55MOP.js → pixels-DDEDYF2F.js} +3 -3
- package/dist/{rerun-FCZRSS3H.js → rerun-IBAERILY.js} +14 -14
- package/dist/{research-EBQ5KWOS.js → research-3SFTD2GL.js} +2 -2
- package/dist/{run-CUUAWKAZ.js → run-JWWCVS5Y.js} +14 -14
- package/dist/{scaffold-ad-AYKWASWY.js → scaffold-ad-HAKYTRBX.js} +12 -12
- package/dist/{scaffold-static-ad-IEZEQW4N.js → scaffold-static-ad-SJIUDIPJ.js} +21 -21
- package/dist/scaffold-static-ad-SJIUDIPJ.js.map +1 -0
- package/dist/{scaffold-video-YMN7AJS4.js → scaffold-video-5UUZ2ZTZ.js} +11 -11
- package/dist/{select-LSS7ZJSB.js → select-K6NZSJHH.js} +8 -8
- package/dist/{set-prompt-P3WR2TZX.js → set-prompt-J3KTX3H6.js} +7 -7
- package/dist/{stale-7VJECYYJ.js → stale-V4PRACSB.js} +7 -7
- package/dist/{studio-C5K3YX3P.js → studio-OCBMZRXO.js} +4 -4
- package/dist/{sync-definition-ARIX5XWM.js → sync-definition-LQ7PGJOD.js} +10 -10
- package/dist/{translate-GGONJG62.js → translate-5TV5QWWJ.js} +11 -11
- package/dist/{validate-FSFELDFZ.js → validate-INS7WOH3.js} +8 -8
- package/dist/{viewer-check-45T2HLAH.js → viewer-check-LDWOSBGZ.js} +4 -4
- package/dist/{winning-ads-HRSCX6O2.js → winning-ads-R3PE2RV5.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-CHSNHVYF.js.map +0 -1
- package/dist/chunk-K66OLA6Y.js.map +0 -1
- package/dist/chunk-KLBTXETO.js.map +0 -1
- package/dist/chunk-P6ICBEE4.js.map +0 -1
- package/dist/credentials-4BPEXA3E.js.map +0 -1
- package/dist/scaffold-static-ad-IEZEQW4N.js.map +0 -1
- /package/dist/{account-F6MHQ64I.js.map → account-4NKJUHAX.js.map} +0 -0
- /package/dist/{account-writes-ISE4U2FQ.js.map → account-writes-G4AQU3VO.js.map} +0 -0
- /package/dist/{ad-group-writes-UU5NNKSO.js.map → ad-group-writes-5EI7ZUJ5.js.map} +0 -0
- /package/dist/{ad-groups-CGFXZNIA.js.map → ad-groups-LMABGPYC.js.map} +0 -0
- /package/dist/{ad-writes-NALDYWOR.js.map → ad-writes-6IDBPDXA.js.map} +0 -0
- /package/dist/{ads-PV7GZXPR.js.map → ads-KAKCCIMC.js.map} +0 -0
- /package/dist/{ads-6MXVIV62.js.map → ads-OYQK5UIE.js.map} +0 -0
- /package/dist/{animate-FWWHSYPL.js.map → animate-Z2T3H3LT.js.map} +0 -0
- /package/dist/{audiences-VEKGLWBG.js.map → audiences-MHTOHG5O.js.map} +0 -0
- /package/dist/{brief-EK6ULGXD.js.map → brief-WBF6CYEL.js.map} +0 -0
- /package/dist/{campaign-writes-SX52CJYW.js.map → campaign-writes-JTGBURBJ.js.map} +0 -0
- /package/dist/{campaigns-X3DPCCSN.js.map → campaigns-FC7MKUSE.js.map} +0 -0
- /package/dist/{canvas-XYCDLDRS.js.map → canvas-A54MR6MA.js.map} +0 -0
- /package/dist/{catalog-ME44ZRZF.js.map → catalog-6L2QHG4J.js.map} +0 -0
- /package/dist/{catalogs-G3YEVG6S.js.map → catalogs-JCWJX4T6.js.map} +0 -0
- /package/dist/{chatgpt-QNUN63YS.js.map → chatgpt-WMBVL3FZ.js.map} +0 -0
- /package/dist/{chunk-P2RE52V7.js.map → chunk-2FB3GT3T.js.map} +0 -0
- /package/dist/{chunk-542XAHNT.js.map → chunk-4D5QDX5F.js.map} +0 -0
- /package/dist/{chunk-7WD2RW2R.js.map → chunk-5ICHPX5S.js.map} +0 -0
- /package/dist/{chunk-VB6WJJR3.js.map → chunk-GMHWZVTG.js.map} +0 -0
- /package/dist/{chunk-KQTYTCKQ.js.map → chunk-INK2NCJ6.js.map} +0 -0
- /package/dist/{chunk-7ZHMGXE2.js.map → chunk-JH2RZU7H.js.map} +0 -0
- /package/dist/{chunk-D5XAVXUZ.js.map → chunk-K6D5ZZ6R.js.map} +0 -0
- /package/dist/{chunk-KFE3S63W.js.map → chunk-K6MTKYPC.js.map} +0 -0
- /package/dist/{chunk-K7FZXIOZ.js.map → chunk-KUGXBSFR.js.map} +0 -0
- /package/dist/{chunk-GLCPTMPG.js.map → chunk-LTBFR6NT.js.map} +0 -0
- /package/dist/{chunk-54UVGFX3.js.map → chunk-PFGHX7FG.js.map} +0 -0
- /package/dist/{chunk-ULJ5RFOV.js.map → chunk-QAP7HVKN.js.map} +0 -0
- /package/dist/{chunk-HQSCJYZO.js.map → chunk-QTMCA6JM.js.map} +0 -0
- /package/dist/{chunk-J5IY3GVE.js.map → chunk-SUML5T3G.js.map} +0 -0
- /package/dist/{chunk-PLGIETFZ.js.map → chunk-UPBIBKA7.js.map} +0 -0
- /package/dist/{chunk-35XWJEWH.js.map → chunk-WCCGRK6P.js.map} +0 -0
- /package/dist/{chunk-TD6GIMV6.js.map → chunk-WNA43DDU.js.map} +0 -0
- /package/dist/{chunk-LYBXCXJB.js.map → chunk-XBE7QI2C.js.map} +0 -0
- /package/dist/{chunk-NEXCBTBZ.js.map → chunk-YA7NZZGA.js.map} +0 -0
- /package/dist/{conversion-report-N4HANYOB.js.map → conversion-report-YMW72GUE.js.map} +0 -0
- /package/dist/{conversion-writes-LW4HQKK5.js.map → conversion-writes-HCENZRSI.js.map} +0 -0
- /package/dist/{conversions-TS723AZV.js.map → conversions-WDMVDUBJ.js.map} +0 -0
- /package/dist/{creatives-D3NXWVUF.js.map → creatives-QWKF7YKQ.js.map} +0 -0
- /package/dist/{critique-3XJG44NG.js.map → critique-RVVKOWGS.js.map} +0 -0
- /package/dist/{customers-USB6VCMU.js.map → customers-AQMZLTHL.js.map} +0 -0
- /package/dist/{draft-THPZFASM.js.map → draft-QYKYXZYX.js.map} +0 -0
- /package/dist/{feedback-C6CBUUDA.js.map → feedback-ZRIGOXR6.js.map} +0 -0
- /package/dist/{feedback-record-FM5MW2YV.js.map → feedback-record-ENMRET57.js.map} +0 -0
- /package/dist/{fit-7237F5EB.js.map → fit-D3TXME5X.js.map} +0 -0
- /package/dist/{generate-MMBYB44G.js.map → generate-YDBUZ2VC.js.map} +0 -0
- /package/dist/{history-DBIEYQHY.js.map → history-VIOY7LN5.js.map} +0 -0
- /package/dist/{insights-ZIU6FJMS.js.map → insights-3HAJWLE2.js.map} +0 -0
- /package/dist/{learn-MMIGRLCP.js.map → learn-IUNXQGY6.js.map} +0 -0
- /package/dist/{locations-74TPQWAT.js.map → locations-S7TMZH64.js.map} +0 -0
- /package/dist/{models-7U3GRYHF.js.map → models-BC5G76EA.js.map} +0 -0
- /package/dist/{pixels-45A55MOP.js.map → pixels-DDEDYF2F.js.map} +0 -0
- /package/dist/{rerun-FCZRSS3H.js.map → rerun-IBAERILY.js.map} +0 -0
- /package/dist/{research-EBQ5KWOS.js.map → research-3SFTD2GL.js.map} +0 -0
- /package/dist/{run-CUUAWKAZ.js.map → run-JWWCVS5Y.js.map} +0 -0
- /package/dist/{scaffold-ad-AYKWASWY.js.map → scaffold-ad-HAKYTRBX.js.map} +0 -0
- /package/dist/{scaffold-video-YMN7AJS4.js.map → scaffold-video-5UUZ2ZTZ.js.map} +0 -0
- /package/dist/{select-LSS7ZJSB.js.map → select-K6NZSJHH.js.map} +0 -0
- /package/dist/{set-prompt-P3WR2TZX.js.map → set-prompt-J3KTX3H6.js.map} +0 -0
- /package/dist/{stale-7VJECYYJ.js.map → stale-V4PRACSB.js.map} +0 -0
- /package/dist/{studio-C5K3YX3P.js.map → studio-OCBMZRXO.js.map} +0 -0
- /package/dist/{sync-definition-ARIX5XWM.js.map → sync-definition-LQ7PGJOD.js.map} +0 -0
- /package/dist/{translate-GGONJG62.js.map → translate-5TV5QWWJ.js.map} +0 -0
- /package/dist/{validate-FSFELDFZ.js.map → validate-INS7WOH3.js.map} +0 -0
- /package/dist/{viewer-check-45T2HLAH.js.map → viewer-check-LDWOSBGZ.js.map} +0 -0
- /package/dist/{winning-ads-HRSCX6O2.js.map → winning-ads-R3PE2RV5.js.map} +0 -0
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
safeRectPx,
|
|
8
8
|
staticSafeArea,
|
|
9
9
|
textMismatch
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-K6MTKYPC.js";
|
|
11
11
|
import {
|
|
12
12
|
HAND_LETTERED,
|
|
13
13
|
conceptSummary,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
readAdSpec,
|
|
16
16
|
seesReferenceStructure,
|
|
17
17
|
withRenderedLettering
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-GMHWZVTG.js";
|
|
19
19
|
import {
|
|
20
20
|
AD_IMAGE_MODEL,
|
|
21
21
|
MODEL_REGISTRY,
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
supportsParam,
|
|
29
29
|
validateModelInputs,
|
|
30
30
|
validateModelParams
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-SZF65D5I.js";
|
|
32
32
|
import {
|
|
33
33
|
askAboutImages
|
|
34
34
|
} from "./chunk-RX6F3GEA.js";
|
|
@@ -251,11 +251,12 @@ function logoInstruction(p, ctx) {
|
|
|
251
251
|
const plate = ctx.plates.length > 0 ? ctx.plates.map((u) => `${u.name} (${u.hex})`).join(" or ") : "white or black";
|
|
252
252
|
const where = `at least a fifth of the frame wide, on an area it contrasts with or a small ${plate} plate`;
|
|
253
253
|
if (ctx.short)
|
|
254
|
-
return "the brand's real logo. Reproduce it once, exactly as drawn, at least a fifth of the frame wide.";
|
|
254
|
+
return "the brand's real logo. Reproduce it once, apart from the product, exactly as drawn, at least a fifth of the frame wide.";
|
|
255
255
|
return ctx.flowing ? `the brand's real logo. Reproduce it once, apart from the product${at}, exactly as drawn in Image ${p.index}, ${where}.` : `the brand's real logo. Reproduce it once, never on the product${at}, exactly as drawn, ${where}.`;
|
|
256
256
|
}
|
|
257
|
-
function identityInstruction(p, what, keep, flowing) {
|
|
257
|
+
function identityInstruction(p, what, keep, flowing, short) {
|
|
258
258
|
if (p.spec && personOrAnimal(p.spec) === "person") {
|
|
259
|
+
if (short) return `${what} Same face, hair, skin tone and build; one person, once.${keep}`;
|
|
259
260
|
return flowing ? `${what} Keep their facial features, hair, skin tone and build exactly the same as in Image ${p.index}, and show them once; several views in that picture are all this one person.${keep}` : `${what} Keep this exact face, hair, skin tone and build, and show them once; several views in the picture are all this one person.${keep}`;
|
|
260
261
|
}
|
|
261
262
|
return flowing ? `${what} Keep its face, markings and colours exactly the same as in Image ${p.index}, and show it once; several views in that picture are all this one animal.${keep}` : `${what} Keep its exact face, markings and colours, and show it once; several views in the picture are all this one animal.${keep}`;
|
|
@@ -271,9 +272,9 @@ function pictureInstruction(p, ctx) {
|
|
|
271
272
|
const keep = p.spec?.keep ? ` Keep ${plain(p.spec.keep, ctx.clean)}.` : "";
|
|
272
273
|
switch (p.role) {
|
|
273
274
|
case "base":
|
|
274
|
-
return
|
|
275
|
+
return "screen content takes priority over other references unless explicitly changed.";
|
|
275
276
|
case "identity":
|
|
276
|
-
return identityInstruction(p, what, keep, ctx.flowing);
|
|
277
|
+
return identityInstruction(p, what, keep, ctx.flowing, ctx.short);
|
|
277
278
|
// The user saw one label come back two ways (E4 gallery, BENCH.md § "E1 v2"): the label is the product's.
|
|
278
279
|
case "product":
|
|
279
280
|
return ctx.flowing ? `${what} Keep it and its label, text and design, exactly as in Image ${p.index}.${keep}` : `${what} Reproduce this exact product and its label, text and design unchanged.${keep}`;
|
|
@@ -655,7 +656,8 @@ function deliverableSection(c) {
|
|
|
655
656
|
return c.flowing ? `Image 1 is a finished ad of this series. Make the next ad of the same series${forBrand}: ${change} Keep everything else in Image 1 exactly the same, preserving its picture, layout, background, shapes, colours, lettering style and logo, each word in the place and style of the one it replaces.` : `Edit: Image 1 is a finished ad of this series. Make the next ad of the same series${forBrand}. ${capitalize(change)} Keep everything else exactly as it is in Image 1: the picture, the layout, the background, the shapes, the colours, the lettering style and the logo, each new line in the place, size and style of the line it replaces.`;
|
|
656
657
|
}
|
|
657
658
|
if (c.job === "relay") {
|
|
658
|
-
|
|
659
|
+
const ui = "Keep any depicted app interface exact, with marketing overlays visibly separate from its native controls.";
|
|
660
|
+
return c.flowing ? `Image 1 is a finished ad. Adapt this same ad to a ${noun}${forBrand}: move and scale its existing elements, keeping its picture, background, colours, lettering and every word. Extend only its existing background where needed. ${ui}` : `Deliverable: the same ad as Image 1, re-laid as a finished ${noun}${forBrand}. Move and scale its existing elements; keep its picture, background, colours, lettering and every word. Extend only its existing background where needed. ${ui}`;
|
|
659
661
|
}
|
|
660
662
|
const lead = c.flowing ? "Create a finished" : "Deliverable: a finished";
|
|
661
663
|
return `${lead} ${noun}${forBrand}${audienceText(c.viewer, c.level, c.clean)}.${marketText(c)}${recognitionText(c)}${ideaText(c.spec, c.level, c.clean)}${conceptText(c)}${deviceText(c)}`;
|
|
@@ -697,10 +699,11 @@ function conceptText(c) {
|
|
|
697
699
|
const layers = [w.disguise, w.voice, w.trigger, w.attention, w.logic].flatMap(
|
|
698
700
|
(t) => t?.trim() ? [plain(t, c.clean)] : []
|
|
699
701
|
);
|
|
700
|
-
const
|
|
702
|
+
const continuing = c.job !== "generate";
|
|
703
|
+
const idea = layers.length > 0 && (continuing || c.level < LAST_RESORT_LEVEL) ? sentence(layers.join("; ")) : "";
|
|
701
704
|
const keep = mustKeep(c);
|
|
702
705
|
const keepLine = keep.length > 0 ? sentence(keep.join("; ")) : "";
|
|
703
|
-
const carry = kept.carry && c.level < LAST_RESORT_LEVEL ? CARRIED[kept.carry] : "";
|
|
706
|
+
const carry = kept.carry && (continuing || c.level < LAST_RESORT_LEVEL) ? CARRIED[kept.carry] : "";
|
|
704
707
|
const parts = [
|
|
705
708
|
carry,
|
|
706
709
|
idea ? `The idea: ${idea}` : "",
|
|
@@ -710,6 +713,12 @@ function conceptText(c) {
|
|
|
710
713
|
return parts.flatMap((part) => part ? [`${separator}${part}`] : []).join("");
|
|
711
714
|
}
|
|
712
715
|
function deviceText(c) {
|
|
716
|
+
if (c.job !== "generate") {
|
|
717
|
+
const mechanisms = c.spec.mechanism.map(
|
|
718
|
+
(m) => [plain(m.device, c.clean), m.why_it_works ? plain(m.why_it_works, c.clean) : ""].filter(Boolean).join(": ")
|
|
719
|
+
);
|
|
720
|
+
return mechanisms.length > 0 ? `Keep the persuasion mechanism: ${sentence(mechanisms.join("; "))}` : "";
|
|
721
|
+
}
|
|
713
722
|
const device = c.spec.mechanism[0]?.device;
|
|
714
723
|
if (!device || c.level >= 1) return "";
|
|
715
724
|
const text = plain(device, c.clean);
|
|
@@ -818,12 +827,22 @@ var SCREENS = {
|
|
|
818
827
|
var SCREENSHOT = /\b(screenshots?|screen ?grabs?|screens?)\b/i;
|
|
819
828
|
var screenshotOf = (pics) => pics.find((p) => p.spec && p.role !== "identity" && SCREENSHOT.test(p.spec.what));
|
|
820
829
|
function screensText(c) {
|
|
830
|
+
const laptop = /\b(laptops?|notebook computers?|macbooks?)\b/i.test(c.spec.scene.description);
|
|
831
|
+
const device = laptop ? "laptop" : "phone";
|
|
821
832
|
const shot = screenshotOf(c.pics);
|
|
822
833
|
if (shot) {
|
|
823
|
-
return c.flowing ? ` Every screen shows Image ${shot.index} exactly as it is, on a real
|
|
824
|
-
Screens: every screen shows Image ${shot.index} exactly as it is, on a real
|
|
834
|
+
return c.flowing ? ` Every screen shows Image ${shot.index} exactly as it is, on a real ${device}, photographed.` : `
|
|
835
|
+
Screens: every screen shows Image ${shot.index} exactly as it is, on a real ${device}, photographed.`;
|
|
836
|
+
}
|
|
837
|
+
if (!showsScreen(c.spec)) return "";
|
|
838
|
+
if (c.level >= EXTRAS_SHORT_LEVEL)
|
|
839
|
+
return c.flowing ? ` Every ${device} or app screen looks like a real ${device} photographed or a real screenshot.` : `
|
|
840
|
+
Screens: a real ${device} photographed, or a real screenshot.`;
|
|
841
|
+
if (laptop) {
|
|
842
|
+
const screen = "a real laptop photographed, or a real screenshot; display, keyboard and hinge in consistent perspective; any words on it from the quoted lines.";
|
|
843
|
+
return c.flowing ? ` Every laptop screen looks like ${screen}` : `
|
|
844
|
+
Screens: ${screen}`;
|
|
825
845
|
}
|
|
826
|
-
if (!showsScreen(c.spec) || c.level >= EXTRAS_SHORT_LEVEL) return "";
|
|
827
846
|
return c.flowing ? ` ${SCREENS.flowing}` : `
|
|
828
847
|
${SCREENS.labelled}`;
|
|
829
848
|
}
|
|
@@ -941,8 +960,11 @@ function constraintsSection(c) {
|
|
|
941
960
|
...logo ? [`Image ${logo.index}`] : [],
|
|
942
961
|
...thirdPartyNames(c.spec) ? [thirdPartyNames(c.spec)] : []
|
|
943
962
|
];
|
|
963
|
+
const repeatedWordLimit = n > 0 && c.level >= LAST_RESORT_LEVEL;
|
|
964
|
+
const wordLimit = n > 0 ? `any words other than the ${n} quoted lines` : "any words or letters";
|
|
944
965
|
const avoid = [
|
|
945
|
-
|
|
966
|
+
// At the final trim level the Text section already states the complete word allow-list.
|
|
967
|
+
...repeatedWordLimit ? [] : [wordLimit],
|
|
946
968
|
// A Toyota badge appeared on a car-loan ad's SUV (BENCH.md § "Final"): the allow-list covers the scene's things too.
|
|
947
969
|
// The words and the identity's "show them once" are said above; brief v2 spends the words on the logo and the button.
|
|
948
970
|
`${logos.length > 0 ? `any logo, badge, icon, seal or sticker other than ${logos.join(" and ")}` : "any logo or wordmark, badge, icon, seal or sticker"}, on vehicles, packaging and clothing too`,
|
|
@@ -954,8 +976,14 @@ function constraintsSection(c) {
|
|
|
954
976
|
return `Avoid: ${avoid.join("; ")}.`;
|
|
955
977
|
}
|
|
956
978
|
function assemble(c) {
|
|
979
|
+
const continuity = c.job !== "generate" ? (conceptText(c) || deviceText(c)).trim() : "";
|
|
957
980
|
return [
|
|
958
981
|
deliverableSection(c),
|
|
982
|
+
"Real-world anatomy, devices, scale, perspective and supports stay plausible. Scale proportionally; reflow text; preserve letter shapes.",
|
|
983
|
+
// A continuation needs the original idea as well as the previous picture. Keep this
|
|
984
|
+
// separate: the per-format adapter replaces the deliverable paragraph.
|
|
985
|
+
...continuity ? [continuity] : [],
|
|
986
|
+
...c.job === "fix" || c.job === "series" ? ["Keep any depicted app interface exact, with marketing overlays visibly separate from its native controls."] : [],
|
|
959
987
|
...picturesSection(c),
|
|
960
988
|
...sceneSection(c),
|
|
961
989
|
textSection(c),
|
|
@@ -1208,12 +1236,13 @@ function adaptNoun(plan) {
|
|
|
1208
1236
|
function adaptDeliverable(plan, spec, flowing, ground, short) {
|
|
1209
1237
|
const brand = spec.brand?.name;
|
|
1210
1238
|
const noun = `${adaptNoun(plan)}${brand ? ` for ${brand}` : ""}`;
|
|
1239
|
+
const background = "Extend only the background at Image 1's outer edges; textures stay on their existing surfaces.";
|
|
1211
1240
|
if (short && !flowing) {
|
|
1212
1241
|
const keep = [
|
|
1213
1242
|
...showsPeople2(spec) ? ["each person the same face and clothes"] : [],
|
|
1214
1243
|
...isBeforeAfter(spec) ? ["the two states as different"] : []
|
|
1215
1244
|
];
|
|
1216
|
-
return `Deliverable:
|
|
1245
|
+
return `Deliverable: adapt Image 1 to a ${noun}. Move and scale existing elements first; reflow the contents for this frame, keeping its words, people, product, logo, colours and typeface. ${background} Keep any depicted app interface exact, with marketing overlays visibly separate from its native controls. Every person, product and line appears whole and once${keep.length > 0 ? `, ${keep.join(", ")}` : ""}; add nothing new; never Image 1 shrunk onto a background.`;
|
|
1217
1246
|
}
|
|
1218
1247
|
const cast = [
|
|
1219
1248
|
SAME_CAST,
|
|
@@ -1221,13 +1250,14 @@ function adaptDeliverable(plan, spec, flowing, ground, short) {
|
|
|
1221
1250
|
...isBeforeAfter(spec) ? [SAME_CHANGE] : [],
|
|
1222
1251
|
...ground ? [GROUND_ONLY] : []
|
|
1223
1252
|
].join(" ");
|
|
1224
|
-
|
|
1253
|
+
const continuity = `Move and scale existing elements first; reflow the contents for this frame instead of pasting a smaller copy on a backdrop. Keep the visual hierarchy. ${background} Keep any depicted app interface exact, with marketing overlays visibly separate from its native controls.`;
|
|
1254
|
+
return flowing ? `Image 1 is a finished ad. Adapt this same ad to a ${noun}, keeping its message, words, people, product, logo, colours and typeface. ${continuity} ${cast}` : `Deliverable: the ad in Image 1, re-laid out as a finished ${noun}, keeping its message, words, people, product, logo, colours and typeface; never Image 1 shrunk onto a background. ${continuity} ${cast}`;
|
|
1225
1255
|
}
|
|
1226
1256
|
var SAME_CAST = "Every person, product and line appears whole and once, the same individuals as in Image 1; add no person, animal, product or object that Image 1 does not show.";
|
|
1227
1257
|
var SAME_PERSON = "Each person is the same person as in Image 1: same face, same hair, same clothes.";
|
|
1228
1258
|
var SAME_CHANGE = "The two states it compares stay as clearly different as in Image 1.";
|
|
1229
1259
|
var showsPeople2 = (spec) => spec.references.some((r) => r.id.startsWith("PERSON_")) || spec.scene.look !== "illustration" && PEOPLE.test(`${spec.scene.description} ${spec.scene.layout ?? ""}`);
|
|
1230
|
-
var GROUND_ONLY = "Image 1 shows no people and no product, so the room this frame adds carries
|
|
1260
|
+
var GROUND_ONLY = "Image 1 shows no people and no product, so the room this frame adds carries only Image 1's own background and the brand's colours already present there, never a new scene.";
|
|
1231
1261
|
function wordsOnly(spec) {
|
|
1232
1262
|
return spec.references.length === 0 && spec.scene.look !== "photo" && !PEOPLE.test(`${spec.scene.description} ${spec.scene.layout ?? ""}`);
|
|
1233
1263
|
}
|
|
@@ -1248,7 +1278,7 @@ function scaleText(plan, spec, flowing, zoned, short) {
|
|
|
1248
1278
|
var COVERED_HEADROOM = { top: 0.06, bottom: 0.08, side: 0.02 };
|
|
1249
1279
|
var NO_HEADROOM = { top: 0, bottom: 0, side: 0 };
|
|
1250
1280
|
var pct = (share) => `${Math.round(share * 100)}%`;
|
|
1251
|
-
function zonesText(plan, flowing,
|
|
1281
|
+
function zonesText(plan, flowing, short) {
|
|
1252
1282
|
const covered = staticSafeArea(plan.format, plan.placements).placement !== "feed";
|
|
1253
1283
|
const room = isTall(plan) && covered ? COVERED_HEADROOM : NO_HEADROOM;
|
|
1254
1284
|
const top = plan.safe.top + room.top;
|
|
@@ -1256,14 +1286,14 @@ function zonesText(plan, flowing, ground, short) {
|
|
|
1256
1286
|
const side = Math.max(plan.safe.left, plan.safe.right) + room.side;
|
|
1257
1287
|
const band = `from ${pct(top)} to ${pct(1 - bottom)} of the height, at least ${pct(side)} in from each side`;
|
|
1258
1288
|
if (short && !flowing) {
|
|
1259
|
-
const around =
|
|
1289
|
+
const around = "Image 1's existing background treatment, including any intentional flat colour";
|
|
1260
1290
|
return `Zones: every word, the logo and the button sit ${band}; around them, ${around}.`;
|
|
1261
1291
|
}
|
|
1262
1292
|
if (!(isTall(plan) && covered)) {
|
|
1263
1293
|
return flowing ? `The logo, every line and the button sit ${band}; around them the frame shows only the ad's own picture.` : `Zones: the logo, every line and the button sit ${band}; around them, only the ad's own picture.`;
|
|
1264
1294
|
}
|
|
1265
|
-
const picture =
|
|
1266
|
-
return flowing ? `The words' band runs ${band}, holding the logo, every line and the button. Above and below it the
|
|
1295
|
+
const picture = "Image 1's existing background treatment, including any intentional flat colour";
|
|
1296
|
+
return flowing ? `The words' band runs ${band}, holding the logo, every line and the button. Above and below it the placement's interface covers the frame: continue only ${picture}.` : `Zones: the app's buttons and captions cover the top and the bottom of this frame, hiding any word there. The logo, every line and the button sit in one band, ${band}: the headline starts below the top fifth, and the button ends directly under the last line, never at the bottom edge where a feed ad puts it. Above and below it, where the placement's interface covers the frame, continue only ${picture}.`;
|
|
1267
1297
|
}
|
|
1268
1298
|
function adaptBrief(spec, profile, opts) {
|
|
1269
1299
|
const { plan, images } = opts;
|
|
@@ -1298,14 +1328,11 @@ function adaptBrief(spec, profile, opts) {
|
|
|
1298
1328
|
const first = spec.copy[0] ? quotedCopy(spec.copy[0].text) : void 0;
|
|
1299
1329
|
const textAt = first ? paragraphs.findIndex((p) => p.includes(first)) : -1;
|
|
1300
1330
|
if (textAt >= 0) {
|
|
1301
|
-
const added = [
|
|
1302
|
-
...zoned ? [zonesText(plan, flowing, ground, short)] : [],
|
|
1303
|
-
scaleText(plan, spec, flowing, zoned, short)
|
|
1304
|
-
];
|
|
1331
|
+
const added = [...zoned ? [zonesText(plan, flowing, short)] : [], scaleText(plan, spec, flowing, zoned, short)];
|
|
1305
1332
|
paragraphs.splice(textAt + 1, 0, ...added);
|
|
1306
1333
|
} else if (zoned) {
|
|
1307
1334
|
const layoutAt = paragraphs.findIndex((p) => p.startsWith("Layout:"));
|
|
1308
|
-
paragraphs.splice(layoutAt > 0 ? layoutAt : 1, 0, zonesText(plan, flowing,
|
|
1335
|
+
paragraphs.splice(layoutAt > 0 ? layoutAt : 1, 0, zonesText(plan, flowing, short));
|
|
1309
1336
|
}
|
|
1310
1337
|
return paragraphs.join("\n\n");
|
|
1311
1338
|
};
|
|
@@ -4380,4 +4407,4 @@ export {
|
|
|
4380
4407
|
canSpellNumbers,
|
|
4381
4408
|
spellNumber
|
|
4382
4409
|
};
|
|
4383
|
-
//# sourceMappingURL=chunk-
|
|
4410
|
+
//# sourceMappingURL=chunk-DPYVRK2J.js.map
|