@nodaro/prompts 1.46.0 → 1.48.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/dist/{catalog-packs-C9CXEWfl.d.cts → catalog-packs-BDsrv8St.d.cts} +1 -1
- package/dist/{catalog-packs-D7NJpo4k.d.ts → catalog-packs-CAK42voB.d.ts} +1 -1
- package/dist/{chunk-SMKIVT7P.js → chunk-36XMRVY4.js} +4 -4
- package/dist/{chunk-SMKIVT7P.js.map → chunk-36XMRVY4.js.map} +1 -1
- package/dist/{chunk-JHEZJKTX.cjs → chunk-54BYDWAM.cjs} +62 -52
- package/dist/chunk-54BYDWAM.cjs.map +1 -0
- package/dist/{chunk-IKHRZ5UQ.js → chunk-BTV2I7EN.js} +3 -3
- package/dist/{chunk-IKHRZ5UQ.js.map → chunk-BTV2I7EN.js.map} +1 -1
- package/dist/{chunk-57PTYJJX.js → chunk-CMEUYFBZ.js} +13 -13
- package/dist/chunk-CMEUYFBZ.js.map +1 -0
- package/dist/{chunk-2OIKQ4WB.js → chunk-GZVCBSFG.js} +5 -5
- package/dist/{chunk-2OIKQ4WB.js.map → chunk-GZVCBSFG.js.map} +1 -1
- package/dist/{chunk-FCTK7RGO.cjs → chunk-IMQB7GIK.cjs} +42 -39
- package/dist/chunk-IMQB7GIK.cjs.map +1 -0
- package/dist/{chunk-2HJJBXGA.js → chunk-JHRVNWBS.js} +6 -6
- package/dist/{chunk-2HJJBXGA.js.map → chunk-JHRVNWBS.js.map} +1 -1
- package/dist/{chunk-OSKABA64.cjs → chunk-JV2WSMAA.cjs} +8 -8
- package/dist/{chunk-OSKABA64.cjs.map → chunk-JV2WSMAA.cjs.map} +1 -1
- package/dist/{chunk-VAK4RUNU.cjs → chunk-KNAKOSKV.cjs} +13 -13
- package/dist/{chunk-VAK4RUNU.cjs.map → chunk-KNAKOSKV.cjs.map} +1 -1
- package/dist/{chunk-TXHFL725.js → chunk-LD47QOKS.js} +62 -53
- package/dist/chunk-LD47QOKS.js.map +1 -0
- package/dist/{chunk-QKD2KUZW.cjs → chunk-MGK6SFTV.cjs} +20 -6
- package/dist/chunk-MGK6SFTV.cjs.map +1 -0
- package/dist/{chunk-YCCQXX3U.cjs → chunk-MYVJVOPB.cjs} +39 -39
- package/dist/{chunk-YCCQXX3U.cjs.map → chunk-MYVJVOPB.cjs.map} +1 -1
- package/dist/{chunk-PHR4UETI.cjs → chunk-PJFX3MFI.cjs} +18 -18
- package/dist/{chunk-PHR4UETI.cjs.map → chunk-PJFX3MFI.cjs.map} +1 -1
- package/dist/{chunk-PUWJ2ZBG.js → chunk-RRHU6MD5.js} +20 -6
- package/dist/chunk-RRHU6MD5.js.map +1 -0
- package/dist/{chunk-NN4FL7SB.js → chunk-XBRW75LM.js} +4 -4
- package/dist/{chunk-NN4FL7SB.js.map → chunk-XBRW75LM.js.map} +1 -1
- package/dist/{chunk-C4FDHCEZ.cjs → chunk-XGNUOU4F.cjs} +125 -125
- package/dist/{chunk-C4FDHCEZ.cjs.map → chunk-XGNUOU4F.cjs.map} +1 -1
- package/dist/{chunk-CPKYIVWP.js → chunk-YXJSPQC6.js} +12 -9
- package/dist/chunk-YXJSPQC6.js.map +1 -0
- package/dist/{chunk-OY7XOPDG.cjs → chunk-Z755PH3K.cjs} +57 -57
- package/dist/chunk-Z755PH3K.cjs.map +1 -0
- package/dist/entries/assembly.cjs +28 -28
- package/dist/entries/assembly.d.cts +1 -2
- package/dist/entries/assembly.d.ts +1 -2
- package/dist/entries/assembly.js +5 -5
- package/dist/entries/catalog-packs.d.cts +3 -3
- package/dist/entries/catalog-packs.d.ts +3 -3
- package/dist/entries/person.d.cts +2 -2
- package/dist/entries/person.d.ts +2 -2
- package/dist/entries/picker-catalogs.cjs +56 -56
- package/dist/entries/picker-catalogs.d.cts +26 -4
- package/dist/entries/picker-catalogs.d.ts +26 -4
- package/dist/entries/picker-catalogs.js +4 -4
- package/dist/entries/pickers.cjs +377 -373
- package/dist/entries/pickers.d.cts +473 -2
- package/dist/entries/pickers.d.ts +473 -2
- package/dist/entries/pickers.js +2 -2
- package/dist/entries/presets.cjs +35 -35
- package/dist/entries/presets.js +1 -1
- package/dist/entries/prompt-builder.cjs +75 -75
- package/dist/entries/prompt-builder.d.cts +2 -3
- package/dist/entries/prompt-builder.d.ts +2 -3
- package/dist/entries/prompt-builder.js +4 -4
- package/dist/index.cjs +564 -560
- package/dist/index.d.cts +5 -6
- package/dist/index.d.ts +5 -6
- package/dist/index.js +9 -9
- package/dist/{picker-catalogs-C3utGMRB.d.cts → picker-catalogs-BiRCs_5G.d.cts} +8 -0
- package/dist/{picker-catalogs-BM8IphF1.d.ts → picker-catalogs-CX8pHi8q.d.ts} +8 -0
- package/dist/{subject-registry-DFiGx49v.d.ts → subject-registry-Cf802LQ5.d.ts} +8 -4
- package/dist/{subject-registry-CQi_CZfJ.d.cts → subject-registry-D2uMBVpP.d.cts} +8 -4
- package/package.json +2 -2
- package/src/__tests__/assemble-video-input.test.ts +13 -11
- package/src/__tests__/direction-registry.test.ts +5 -5
- package/src/__tests__/factory-presets.test.ts +26 -2
- package/src/__tests__/image-unwired-reference-tokens.test.ts +3 -2
- package/src/__tests__/prompt-style-section.test.ts +2 -2
- package/src/__tests__/style-video-wording.test.ts +258 -0
- package/src/catalog-overlay.ts +15 -1
- package/src/direction-registry.ts +25 -7
- package/src/factory-presets/generate-image.ts +18 -4
- package/src/parameter-prompt-hint.ts +23 -7
- package/src/picker-catalogs.ts +11 -0
- package/src/style.ts +78 -49
- package/dist/chunk-57PTYJJX.js.map +0 -1
- package/dist/chunk-CPKYIVWP.js.map +0 -1
- package/dist/chunk-FCTK7RGO.cjs.map +0 -1
- package/dist/chunk-JHEZJKTX.cjs.map +0 -1
- package/dist/chunk-OY7XOPDG.cjs.map +0 -1
- package/dist/chunk-PUWJ2ZBG.js.map +0 -1
- package/dist/chunk-QKD2KUZW.cjs.map +0 -1
- package/dist/chunk-TXHFL725.js.map +0 -1
- package/dist/transitions-BLFfAJUH.d.cts +0 -450
- package/dist/transitions-BgwWM37i.d.ts +0 -450
|
@@ -1,450 +0,0 @@
|
|
|
1
|
-
import { P as PickerHintMode } from './term-C01_g6s1.cjs';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Canonical catalog of cinematic transitions for AI-video generation.
|
|
5
|
-
*
|
|
6
|
-
* Shared between frontend (picker UI, prompt hint injection) and backend
|
|
7
|
-
* (orchestrator payload builder). The `promptHint` is a natural-language
|
|
8
|
-
* cue that gets composed into the user prompt when a transition node is
|
|
9
|
-
* connected to a video consumer.
|
|
10
|
-
*
|
|
11
|
-
* Multi-pick supported: value field accepts `string | string[]` (cap 2).
|
|
12
|
-
* Graph-aware: `startState` / `endState` input handles accept upstream
|
|
13
|
-
* parameter nodes whose hints are folded into the composed clause as
|
|
14
|
-
* "starting from <X>, ending at <Y>".
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
type TransitionCategory = "standard" | "time" | "element" | "morph" | "portal" | "physics" | "light" | "glitch";
|
|
18
|
-
interface Transition {
|
|
19
|
-
readonly id: string;
|
|
20
|
-
readonly label: string;
|
|
21
|
-
readonly category: TransitionCategory;
|
|
22
|
-
readonly description: string;
|
|
23
|
-
readonly promptHint: string;
|
|
24
|
-
/**
|
|
25
|
-
* Optional authored compact term (see `term.ts`). Authored where the
|
|
26
|
-
* lowercased label is not what an editor would write in a prompt — a UI
|
|
27
|
-
* compound ("None / Hard Cut" → "hard cut"), an annotation the derivation
|
|
28
|
-
* drops ("Fast-Forward (Day → Night)" → "day-to-night time-lapse"), a bare
|
|
29
|
-
* word that collides with another meaning ("Melt Down", "Channel Flip",
|
|
30
|
-
* "Roll"), or a coinage that is not the trade term ("Seamless Match" →
|
|
31
|
-
* "invisible cut"). Everywhere else the label IS the term.
|
|
32
|
-
*/
|
|
33
|
-
readonly term?: string;
|
|
34
|
-
/**
|
|
35
|
-
* `true` on rows whose mechanism IS A CUT — the change happens between two
|
|
36
|
-
* frames, so it has no duration to time. A duration clause ("lasting
|
|
37
|
-
* approximately 1 second") on such a row tells the video model to spend a
|
|
38
|
-
* second on the change, and it obliges with a dissolve: a match cut rendered
|
|
39
|
-
* as a 1.75 s cross-dissolve in QA. The composer therefore skips the duration
|
|
40
|
-
* clause when every picked transition is instant (on a BLENDABLE cut, a
|
|
41
|
-
* `blendsCut` step changes the cut itself instead — see `blendable`), and
|
|
42
|
-
* consumers offer only the levers a cut takes — Position without `full`, no
|
|
43
|
-
* Intensity, and Duration only on a blendable cut, as a Blend lever of "hard
|
|
44
|
-
* cut" plus the `blendsCut` steps — reading `isInstantTransition` /
|
|
45
|
-
* `isBlendableTransition` (the canvas panel) or the picker catalog's
|
|
46
|
-
* `instant` / `blendable` / `blendsCut` flags (an id-only client).
|
|
47
|
-
*
|
|
48
|
-
* The same holds for INTENSITY: every intensity clause describes how the
|
|
49
|
-
* change PERFORMS over time ("natural unhurried timing", "wild flourishes and
|
|
50
|
-
* dramatic distortion"), and a cut has no performance to shape — "unhurried"
|
|
51
|
-
* on a match cut is another invitation to blend. So the composer drops the
|
|
52
|
-
* intensity clause too when every pick is instant. Position still applies —
|
|
53
|
-
* WHERE the cut lands is a real choice — except `full`: a single-frame cut
|
|
54
|
-
* cannot "span the entire clip", so that clause is dropped on an all-instant
|
|
55
|
-
* pick (start / middle / end still place the cut).
|
|
56
|
-
*
|
|
57
|
-
* The bare term is not enough on its own either: "match cut" still came back
|
|
58
|
-
* as a ~1 s superimposition in prod QA (seedance-2-5). The composer therefore
|
|
59
|
-
* puts `INSTANT_CUT_CLAUSE` inside an all-instant pick's parentheses, once — the explicit
|
|
60
|
-
* anti-blend instruction that made the model render a true single-frame cut.
|
|
61
|
-
*/
|
|
62
|
-
readonly instant?: boolean;
|
|
63
|
-
/**
|
|
64
|
-
* `true` on a CUT that may become a BLENDED CUT: picked with a duration step
|
|
65
|
-
* that `blendsCut` (Short), the pick's anti-blend `INSTANT_CUT_CLAUSE` is
|
|
66
|
-
* REPLACED by `blendedCutClause` — the two shots blend into each other over
|
|
67
|
-
* that step's own `term` — and every other rule of a cut stands (position
|
|
68
|
-
* without `full`, no duration clause, no intensity clause). Any other
|
|
69
|
-
* duration leaves it a hard cut. See `isBlendableTransition`.
|
|
70
|
-
*
|
|
71
|
-
* Set on `seamless-match` and `jump-match` only. In the blended-cut test
|
|
72
|
-
* round (2026-10-04) their blended takes at Short kept what makes each row
|
|
73
|
-
* itself — the invisible cut still hid its join, the jump match still held
|
|
74
|
-
* the subject's place across the leap — and were approved. The blended takes
|
|
75
|
-
* of `match-cut`, `jump-cut` and `action-relay` lost their trait and rated
|
|
76
|
-
* below their hard cut, so those rows stay hard cuts at every duration, as
|
|
77
|
-
* do `none`, `snap-to-black` and `smash-cut`, whose descriptions a blend
|
|
78
|
-
* would contradict ("instantaneous", "on a single frame", "no fade").
|
|
79
|
-
*/
|
|
80
|
-
readonly blendable?: boolean;
|
|
81
|
-
/**
|
|
82
|
-
* PER-ROW OPTIONS — extra choices that only mean something for THIS
|
|
83
|
-
* transition (a wipe's direction), each written into the row's own hint.
|
|
84
|
-
*
|
|
85
|
-
* Unlike the timing scales (every row has a position), an option is declared
|
|
86
|
-
* by the row that reads it, so it never appears beside a transition it would
|
|
87
|
-
* not change. The row authors `promptTemplate` — its hint with one
|
|
88
|
-
* `{<field>}` token per option — and `promptHint` is DERIVED from it with
|
|
89
|
-
* every option on its `auto` choice (see `withOptionSlots`), so a reader of
|
|
90
|
-
* the plain `promptHint` (the picker catalog, the analyzer, a catalog pack)
|
|
91
|
-
* always sees a finished sentence and never a token.
|
|
92
|
-
*
|
|
93
|
-
* The choice's `phrase` is what fills the token, so the row BODY and the
|
|
94
|
-
* option WORDING are separate: a reworded body keeps its options as long as
|
|
95
|
-
* it keeps the token. `transition-options.test.ts` pins that every template
|
|
96
|
-
* carries exactly one token per option and no other.
|
|
97
|
-
*/
|
|
98
|
-
readonly options?: ReadonlyArray<TransitionOption>;
|
|
99
|
-
/** The hint with a `{<field>}` token per `options` entry — see `options`. */
|
|
100
|
-
readonly promptTemplate?: string;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* One choice of a per-row option. `auto` leads every option and is the choice
|
|
104
|
-
* `promptHint` is written with: picking it (or picking nothing) sends no value.
|
|
105
|
-
*/
|
|
106
|
-
interface TransitionOptionChoice {
|
|
107
|
-
readonly id: string;
|
|
108
|
-
readonly label: string;
|
|
109
|
-
readonly description: string;
|
|
110
|
-
/** The words that fill the row template's `{<field>}` token. */
|
|
111
|
-
readonly phrase: string;
|
|
112
|
-
/** The compact term for the choice ("left to right"); `""` on `auto`. */
|
|
113
|
-
readonly term: string;
|
|
114
|
-
}
|
|
115
|
-
/** A per-row option (see `Transition.options`). */
|
|
116
|
-
interface TransitionOption {
|
|
117
|
-
/** The node-data field the chosen id is stored under — also the template
|
|
118
|
-
* token's name (`{wipeDirection}`). Unique within a row; SHARED across rows
|
|
119
|
-
* only where the rows mean the same kind of setting (`style`, see
|
|
120
|
-
* `TRANSITION_STYLE_FIELD`) — each row still declares its own choices, and
|
|
121
|
-
* a value is read only by the row that declares it. */
|
|
122
|
-
readonly field: string;
|
|
123
|
-
readonly label: string;
|
|
124
|
-
/** `auto` first. */
|
|
125
|
-
readonly choices: ReadonlyArray<TransitionOptionChoice>;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* The chosen option ids, keyed by `TransitionOption.field`
|
|
129
|
-
* (`{ wipeDirection: "left-to-right" }`). One flat record for a whole pick: a
|
|
130
|
-
* row reads only the fields it declares, so the other row of a two-pick, or a
|
|
131
|
-
* value left behind by an earlier pick, changes nothing.
|
|
132
|
-
*/
|
|
133
|
-
type TransitionOptionValues = Readonly<Record<string, string | undefined>>;
|
|
134
|
-
/**
|
|
135
|
-
* The wipe's direction. The phrase is the edge AND its travel, so the row's
|
|
136
|
-
* body is free to change around it (`a clean {wipeDirection}, revealing …`).
|
|
137
|
-
* `auto` names no orientation at all — a straight edge — and is what a pick
|
|
138
|
-
* with no direction has always meant.
|
|
139
|
-
*/
|
|
140
|
-
declare const WIPE_DIRECTION: TransitionOption;
|
|
141
|
-
/** The shared node-data field every styled row stores its look under. */
|
|
142
|
-
declare const TRANSITION_STYLE_FIELD = "style";
|
|
143
|
-
declare const DEBRIS_SHOWER_STYLE: TransitionOption;
|
|
144
|
-
declare const GARDEN_BLOOM_STYLE: TransitionOption;
|
|
145
|
-
declare const SMOKE_PUFF_STYLE: TransitionOption;
|
|
146
|
-
declare const SAKURA_PETALS_STYLE: TransitionOption;
|
|
147
|
-
declare const AURORA_SWEEP_STYLE: TransitionOption;
|
|
148
|
-
declare const SAND_STORM_STYLE: TransitionOption;
|
|
149
|
-
declare const WHITE_FLASH_STYLE: TransitionOption;
|
|
150
|
-
/**
|
|
151
|
-
* The three timing scales, each derived from the catalog that defines it (see
|
|
152
|
-
* `TRANSITION_POSITIONS` and friends below).
|
|
153
|
-
*
|
|
154
|
-
* The direction matters. These used to be hand-written unions with the clause
|
|
155
|
-
* tables written out separately beside them, so the two could disagree: add a
|
|
156
|
-
* step to the union, forget the clause, and the composer indexed a missing key
|
|
157
|
-
* — pushing `undefined` into the parts list, which `join(", ")` renders as a
|
|
158
|
-
* dangling separator on a prompt that then ships to a provider with the user's
|
|
159
|
-
* chosen parameter silently dropped. Deriving the union FROM the catalog makes
|
|
160
|
-
* that unrepresentable: one array is the source of the type, the option list
|
|
161
|
-
* the API serves, and the clause table, so a new step reaches all three or
|
|
162
|
-
* none. The exact id sets are pinned by `transition-timing-catalogs.test.ts`.
|
|
163
|
-
*/
|
|
164
|
-
type TransitionPosition = (typeof TRANSITION_POSITIONS)[number]["id"];
|
|
165
|
-
type TransitionDuration = (typeof TRANSITION_DURATIONS)[number]["id"];
|
|
166
|
-
type TransitionIntensity = (typeof TRANSITION_INTENSITIES)[number]["id"];
|
|
167
|
-
interface TransitionTiming {
|
|
168
|
-
position?: TransitionPosition;
|
|
169
|
-
duration?: TransitionDuration;
|
|
170
|
-
intensity?: TransitionIntensity;
|
|
171
|
-
}
|
|
172
|
-
declare const TRANSITIONS: ReadonlyArray<Transition>;
|
|
173
|
-
declare const TRANSITION_CATEGORY_ORDER: ReadonlyArray<TransitionCategory>;
|
|
174
|
-
declare const TRANSITION_CATEGORY_LABELS: Readonly<Record<TransitionCategory, string>>;
|
|
175
|
-
declare function getTransition(id: string | undefined | null): Transition | undefined;
|
|
176
|
-
declare function getTransitionLabel(id: string | undefined | null, fallback?: string): string;
|
|
177
|
-
/**
|
|
178
|
-
* The row's hint. With `values`, a row that declares `options` is written with
|
|
179
|
-
* the chosen choices in its template (an absent or unknown choice reads as
|
|
180
|
-
* `auto`, which IS `promptHint`); every other row ignores them.
|
|
181
|
-
*
|
|
182
|
-
* A catalog pack that REWROTE the row's hint owns its words: its text has no
|
|
183
|
-
* token to fill, so it is returned as written and the options add nothing.
|
|
184
|
-
*/
|
|
185
|
-
declare function getTransitionPromptHint(id: string | undefined | null, values?: TransitionOptionValues): string;
|
|
186
|
-
/** The per-row options a transition declares (`[]` for most rows, an unknown
|
|
187
|
-
* id and `auto`). Reads through `getTransition`, like every other getter. */
|
|
188
|
-
declare function getTransitionOptions(id: string | undefined | null): ReadonlyArray<TransitionOption>;
|
|
189
|
-
/** Every option field any row declares, in catalog order — what a node-data
|
|
190
|
-
* reader collects into `TransitionOptionValues`. */
|
|
191
|
-
declare const TRANSITION_OPTION_FIELDS: ReadonlyArray<string>;
|
|
192
|
-
/**
|
|
193
|
-
* Collect `TransitionOptionValues` from a node-data-shaped record: every
|
|
194
|
-
* declared option field whose value is a non-empty string. Validation against
|
|
195
|
-
* a row's choices happens at render (an unknown id reads as `auto`).
|
|
196
|
-
*/
|
|
197
|
-
declare function readTransitionOptionValues(data: Readonly<Record<string, unknown>> | undefined | null): TransitionOptionValues | undefined;
|
|
198
|
-
/**
|
|
199
|
-
* Compact professional TERM for an id — the short phrase an editor would write
|
|
200
|
-
* in a prompt ("hard cut", "invisible cut", "day-to-night time-lapse"), as
|
|
201
|
-
* opposed to the paragraph-length `promptHint`.
|
|
202
|
-
*
|
|
203
|
-
* Same lookup and same empty-string-on-miss behavior as
|
|
204
|
-
* `getTransitionPromptHint`, so the two can never disagree about which entry
|
|
205
|
-
* they describe. The no-op "Auto" entry resolves to `""` in both.
|
|
206
|
-
*/
|
|
207
|
-
declare function getTransitionTerm(id: string | undefined | null): string;
|
|
208
|
-
declare const TRANSITION_IDS: ReadonlyArray<string>;
|
|
209
|
-
/**
|
|
210
|
-
* Whether a transition is a CUT — instantaneous by nature, so it takes no
|
|
211
|
-
* duration (see `Transition.instant`). Reads through `getTransition`, so it
|
|
212
|
-
* answers for the same entry every other getter describes; an unknown id, the
|
|
213
|
-
* no-op "auto" and an empty value are all `false`.
|
|
214
|
-
*
|
|
215
|
-
* A multi-pick (`string[]`) is instant only when EVERY picked id is: a cut
|
|
216
|
-
* paired with a dissolve still has a dissolve to time.
|
|
217
|
-
*/
|
|
218
|
-
declare function isInstantTransition(id: string | ReadonlyArray<string> | undefined | null): boolean;
|
|
219
|
-
/**
|
|
220
|
-
* Whether a pick may become a BLENDED CUT (see `Transition.blendable`): every
|
|
221
|
-
* picked id is a blendable cut. Same lookup and same empty-pick answer as
|
|
222
|
-
* `isInstantTransition`, so a pick is blendable only where it is instant. Like
|
|
223
|
-
* that check, it reads the ids it is given: the composer passes only the ids
|
|
224
|
-
* that contribute a fragment, so a no-op "auto" beside a blendable cut does not
|
|
225
|
-
* stop the blend there (`["auto", "seamless-match"]` given whole is `false`).
|
|
226
|
-
*/
|
|
227
|
-
declare function isBlendableTransition(id: string | ReadonlyArray<string> | undefined | null): boolean;
|
|
228
|
-
/**
|
|
229
|
-
* The anti-blend instruction an all-instant transition pick carries — the ONE
|
|
230
|
-
* place this sentence lives (see `Transition.instant`). Each row keeps its own
|
|
231
|
-
* meaning in its own hint (a match cut still matches shapes, snap to black
|
|
232
|
-
* still holds black for a beat); this clause only forbids the blend a video
|
|
233
|
-
* model otherwise puts between the two images. Measured on prod with
|
|
234
|
-
* seedance-2-5: with it, a match cut renders as a true single-frame hard cut,
|
|
235
|
-
* with and without an end frame; without it, as a ~1 s dissolve.
|
|
236
|
-
*/
|
|
237
|
-
declare const INSTANT_CUT_CLAUSE = "an abrupt single-frame hard cut, no dissolve, crossfade or superimposition; the two images never blend";
|
|
238
|
-
/**
|
|
239
|
-
* The transition BASE fragments for a pick — one `<term> (<hint body>)` per id
|
|
240
|
-
* that resolves to a term, in pick order. When EVERY contributing id is
|
|
241
|
-
* instant, the FIRST fragment's parentheses also carry `; INSTANT_CUT_CLAUSE`
|
|
242
|
-
* (once per pick — two cuts picked together are still one cut). FIRST, not
|
|
243
|
-
* last: the direction fold sheds fragments from the TAIL under a provider cap,
|
|
244
|
-
* so the clause rides the fragment that survives longest. A mixed pick carries
|
|
245
|
-
* no clause: its non-cut is meant to blend.
|
|
246
|
-
*
|
|
247
|
-
* The same text in both hint modes. A transition only ever reaches a VIDEO
|
|
248
|
-
* prompt (the registry row is `surface: "video"`; the canvas node is in
|
|
249
|
-
* `VIDEO_ONLY_PARAMETER_NODE_TYPES`), and there the bare compact term was not
|
|
250
|
-
* enough to steer the model, so the mode no longer changes a transition.
|
|
251
|
-
*
|
|
252
|
-
* Each fragment is ONE string, parentheses included: the cap-aware assemblers
|
|
253
|
-
* shed whole fragments from the tail, so a fragment is kept or dropped whole
|
|
254
|
-
* and can never lose its hint or its clause on its own.
|
|
255
|
-
*
|
|
256
|
-
* Shared by `composeTransitionHintFromConnections` (the canvas transition node,
|
|
257
|
-
* Studio's transition clauses) and the direction registry's `transition` row
|
|
258
|
-
* (the server fold of `direction.transition`), so both paths word a transition
|
|
259
|
-
* identically.
|
|
260
|
-
*
|
|
261
|
-
* `values` are the per-row option choices (`TransitionOptionValues`) — a wipe's
|
|
262
|
-
* direction. The direction registry passes none, so a `direction.transition`
|
|
263
|
-
* wipe reads as `auto`.
|
|
264
|
-
*
|
|
265
|
-
* These bases are always the HARD cut's: a pick here has no duration, so it
|
|
266
|
-
* never becomes a blended cut. The blend exists only where a duration is
|
|
267
|
-
* picked, in `composeTransitionHintFromConnections`.
|
|
268
|
-
*/
|
|
269
|
-
declare function renderTransitionBases(ids: ReadonlyArray<string>, _mode?: PickerHintMode, values?: TransitionOptionValues): string[];
|
|
270
|
-
/**
|
|
271
|
-
* THE BLENDED CUT — what a blendable cut becomes when a duration that
|
|
272
|
-
* `blendsCut` (Short) is picked on it: instead of the anti-blend
|
|
273
|
-
* `INSTANT_CUT_CLAUSE`, the two shots blend into each other over that step's
|
|
274
|
-
* own `term` ("about 1 second"), so the time words are the catalog's and never
|
|
275
|
-
* typed here. "" for every other value (auto, instant, medium, long, an unknown
|
|
276
|
-
* id, none), which leaves the cut a hard cut.
|
|
277
|
-
*/
|
|
278
|
-
declare function blendedCutClause(duration: string | undefined): string;
|
|
279
|
-
/**
|
|
280
|
-
* The transition node's three timing parameters, as catalogs.
|
|
281
|
-
*
|
|
282
|
-
* These are graded scales, not free numbers — the same shape as
|
|
283
|
-
* `exposure-settings`' aperture or `temporal`'s speed — so a consumer that can
|
|
284
|
-
* only send ids (Studio, the SDK, MCP) can offer them without composing prompt
|
|
285
|
-
* text of its own. `auto` is the no-op head of each scale: an empty
|
|
286
|
-
* `promptHint`, so an unset parameter contributes nothing and the model is left
|
|
287
|
-
* to decide, exactly as before these were enumerable.
|
|
288
|
-
*
|
|
289
|
-
* `POSITION_CLAUSES` / `DURATION_CLAUSES` / `INTENSITY_CLAUSES` below are
|
|
290
|
-
* DERIVED from these arrays, so the clause the composer injects and the hint
|
|
291
|
-
* the catalog advertises are the same string by construction and cannot drift.
|
|
292
|
-
*/
|
|
293
|
-
interface TransitionTimingOption {
|
|
294
|
-
readonly id: string;
|
|
295
|
-
readonly label: string;
|
|
296
|
-
readonly description: string;
|
|
297
|
-
readonly promptHint: string;
|
|
298
|
-
readonly term?: string;
|
|
299
|
-
/** Duration rows only: `true` on a step a blendable CUT may take — picked on
|
|
300
|
-
* such a pick it turns the cut into a BLENDED CUT over this row's `term`
|
|
301
|
-
* (see `blendedCutClause`). Absent = a cut ignores the step and stays a
|
|
302
|
-
* hard cut. Set on `short` only: the 2026-10-04 test round approved the
|
|
303
|
-
* blend at about 1 second, not at Medium's 2. */
|
|
304
|
-
readonly blendsCut?: boolean;
|
|
305
|
-
}
|
|
306
|
-
declare const TRANSITION_POSITIONS: readonly [{
|
|
307
|
-
readonly id: "auto";
|
|
308
|
-
readonly label: "Auto";
|
|
309
|
-
readonly description: "Let the model place it";
|
|
310
|
-
readonly promptHint: "";
|
|
311
|
-
readonly term: "";
|
|
312
|
-
}, {
|
|
313
|
-
readonly id: "start";
|
|
314
|
-
readonly label: "Start";
|
|
315
|
-
readonly description: "At the opening of the clip";
|
|
316
|
-
readonly promptHint: "the transition occurs at the opening of the clip";
|
|
317
|
-
readonly term: "at the opening of the clip";
|
|
318
|
-
}, {
|
|
319
|
-
readonly id: "middle";
|
|
320
|
-
readonly label: "Middle";
|
|
321
|
-
readonly description: "In the middle of the clip";
|
|
322
|
-
readonly promptHint: "the transition occurs in the middle of the clip";
|
|
323
|
-
readonly term: "mid-clip";
|
|
324
|
-
}, {
|
|
325
|
-
readonly id: "end";
|
|
326
|
-
readonly label: "End";
|
|
327
|
-
readonly description: "At the end of the clip";
|
|
328
|
-
readonly promptHint: "the transition occurs at the end of the clip";
|
|
329
|
-
readonly term: "at the end of the clip";
|
|
330
|
-
}, {
|
|
331
|
-
readonly id: "full";
|
|
332
|
-
readonly label: "Full";
|
|
333
|
-
readonly description: "Spans the entire clip";
|
|
334
|
-
readonly promptHint: "the transition spans the entire clip";
|
|
335
|
-
readonly term: "across the whole clip";
|
|
336
|
-
}];
|
|
337
|
-
declare const TRANSITION_DURATIONS: readonly [{
|
|
338
|
-
readonly id: "auto";
|
|
339
|
-
readonly label: "Auto";
|
|
340
|
-
readonly description: "Let the model time it";
|
|
341
|
-
readonly promptHint: "";
|
|
342
|
-
readonly term: "";
|
|
343
|
-
}, {
|
|
344
|
-
readonly id: "instant";
|
|
345
|
-
readonly label: "Instant";
|
|
346
|
-
readonly description: "No perceptible duration";
|
|
347
|
-
readonly promptHint: "occurring instantaneously";
|
|
348
|
-
readonly term: "instantaneous";
|
|
349
|
-
}, {
|
|
350
|
-
readonly id: "short";
|
|
351
|
-
readonly label: "Short (~1s)";
|
|
352
|
-
readonly description: "Approximately 1 second";
|
|
353
|
-
readonly promptHint: "lasting approximately 1 second";
|
|
354
|
-
readonly term: "about 1 second";
|
|
355
|
-
readonly blendsCut: true;
|
|
356
|
-
}, {
|
|
357
|
-
readonly id: "medium";
|
|
358
|
-
readonly label: "Medium (~2s)";
|
|
359
|
-
readonly description: "Approximately 2 seconds";
|
|
360
|
-
readonly promptHint: "lasting approximately 2 seconds";
|
|
361
|
-
readonly term: "about 2 seconds";
|
|
362
|
-
}, {
|
|
363
|
-
readonly id: "long";
|
|
364
|
-
readonly label: "Long (~3s)";
|
|
365
|
-
readonly description: "Approximately 3 seconds";
|
|
366
|
-
readonly promptHint: "lasting approximately 3 seconds";
|
|
367
|
-
readonly term: "about 3 seconds";
|
|
368
|
-
}];
|
|
369
|
-
declare const TRANSITION_INTENSITIES: readonly [{
|
|
370
|
-
readonly id: "auto";
|
|
371
|
-
readonly label: "Auto";
|
|
372
|
-
readonly description: "Let the model judge it";
|
|
373
|
-
readonly promptHint: "";
|
|
374
|
-
readonly term: "";
|
|
375
|
-
}, {
|
|
376
|
-
readonly id: "subtle";
|
|
377
|
-
readonly label: "Subtle";
|
|
378
|
-
readonly description: "Restrained, minimal flourish";
|
|
379
|
-
readonly promptHint: "with subtle restrained energy and minimal flourish";
|
|
380
|
-
readonly term: "subtly";
|
|
381
|
-
}, {
|
|
382
|
-
readonly id: "natural";
|
|
383
|
-
readonly label: "Natural";
|
|
384
|
-
readonly description: "Unhurried, unforced timing";
|
|
385
|
-
readonly promptHint: "with natural timing";
|
|
386
|
-
readonly term: "at a natural pace";
|
|
387
|
-
}, {
|
|
388
|
-
readonly id: "dynamic";
|
|
389
|
-
readonly label: "Dynamic";
|
|
390
|
-
readonly description: "Assertive, energetic";
|
|
391
|
-
readonly promptHint: "with dynamic energy and assertive flourish";
|
|
392
|
-
readonly term: "energetically";
|
|
393
|
-
}, {
|
|
394
|
-
readonly id: "crazy";
|
|
395
|
-
readonly label: "Crazy";
|
|
396
|
-
readonly description: "Extreme, wild, distorted";
|
|
397
|
-
readonly promptHint: "with extreme exaggerated energy, wild flourishes, and dramatic distortion";
|
|
398
|
-
readonly term: "wildly exaggerated";
|
|
399
|
-
}];
|
|
400
|
-
/**
|
|
401
|
-
* Where the composed hint lands. `"clip"` (the default) is a whole video's
|
|
402
|
-
* prompt, so a position is placed within "the clip". `"shot"` is one shot's
|
|
403
|
-
* time window inside a multi-shot prompt (`0-2s — …`, `2-4s — …`): there "the
|
|
404
|
-
* middle of the clip" points the model at the wrong span, so the position
|
|
405
|
-
* clause says "of this shot" instead.
|
|
406
|
-
*/
|
|
407
|
-
type TransitionHintScope = "clip" | "shot";
|
|
408
|
-
interface TransitionHintOptions {
|
|
409
|
-
readonly scope?: TransitionHintScope;
|
|
410
|
-
/** The per-row option choices (a wipe's `wipeDirection`) — see
|
|
411
|
-
* `Transition.options`. Absent, every row reads as `auto`. */
|
|
412
|
-
readonly optionValues?: TransitionOptionValues;
|
|
413
|
-
}
|
|
414
|
-
/**
|
|
415
|
-
* Compose a structural prompt-hint sentence from a transition id (or array
|
|
416
|
-
* of 1-2 ids for multi-pick) plus optional start-state/end-state hints
|
|
417
|
-
* (collected by walking the source node's startState / endState input
|
|
418
|
-
* handle edges upstream) and optional timing fields.
|
|
419
|
-
*
|
|
420
|
-
* Behavior:
|
|
421
|
-
* - 0 hints (no transition, empty array, or all-empty hints) → ""
|
|
422
|
-
* - each pick rendered `<term> (<hint body>)` (`renderTransitionBases`),
|
|
423
|
-
* n picks joined with ", and "
|
|
424
|
-
* - Timing/start/end clauses apply ONCE at the outer layer, not per-id
|
|
425
|
-
* - When every picked id is instant (a cut — see `isInstantTransition`) the
|
|
426
|
-
* first base's parentheses carry `INSTANT_CUT_CLAUSE` once, and the
|
|
427
|
-
* duration and intensity clauses are dropped; position still applies,
|
|
428
|
-
* except `full` — a single-frame cut spans nothing, so it adds no clause
|
|
429
|
-
* - A BLENDED CUT: when every picked id is a blendable cut
|
|
430
|
-
* (`isBlendableTransition`) and the duration `blendsCut` (Short), that
|
|
431
|
-
* clause is `blendedCutClause(duration)` INSTEAD of `INSTANT_CUT_CLAUSE`
|
|
432
|
-
* (replaced, not appended; still once, in the first parentheses); every
|
|
433
|
-
* other rule above stands as for a hard cut, so there is still no duration
|
|
434
|
-
* clause, no intensity clause and no `full`. Any other duration on such a
|
|
435
|
-
* pick, and any duration on any other cut, leaves the hard cut
|
|
436
|
-
* - null input is treated like undefined (falsy short-circuit → returns "")
|
|
437
|
-
*
|
|
438
|
-
* @param _mode Accepted for the picker-hint signature; a transition composes
|
|
439
|
-
* the same text in both modes — each pick as `<term> (<hint body>)`, see
|
|
440
|
-
* `renderTransitionBases`.
|
|
441
|
-
* @param options `scope: "shot"` when the hint is folded into one shot's time
|
|
442
|
-
* window of a multi-shot prompt — the position clause then says "of this
|
|
443
|
-
* shot" instead of "of the clip" (and `full`, on a non-cut, "spans this
|
|
444
|
-
* entire shot"). Omitted, the wording is the clip's. `optionValues` are the
|
|
445
|
-
* per-row option choices (a wipe's direction), written into the row's own
|
|
446
|
-
* description; omitted, every row reads as `auto`.
|
|
447
|
-
*/
|
|
448
|
-
declare function composeTransitionHintFromConnections(transitionId: string | ReadonlyArray<string> | undefined, startHints: ReadonlyArray<string>, endHints: ReadonlyArray<string>, timing?: TransitionTiming, _mode?: PickerHintMode, options?: TransitionHintOptions): string;
|
|
449
|
-
|
|
450
|
-
export { AURORA_SWEEP_STYLE as A, getTransitionLabel as B, getTransitionOptions as C, DEBRIS_SHOWER_STYLE as D, getTransitionPromptHint as E, getTransitionTerm as F, GARDEN_BLOOM_STYLE as G, isBlendableTransition as H, INSTANT_CUT_CLAUSE as I, isInstantTransition as J, readTransitionOptionValues as K, renderTransitionBases as L, SAKURA_PETALS_STYLE as S, TRANSITIONS as T, WHITE_FLASH_STYLE as W, SAND_STORM_STYLE as a, SMOKE_PUFF_STYLE as b, TRANSITION_CATEGORY_LABELS as c, TRANSITION_CATEGORY_ORDER as d, TRANSITION_DURATIONS as e, TRANSITION_IDS as f, TRANSITION_INTENSITIES as g, TRANSITION_OPTION_FIELDS as h, TRANSITION_POSITIONS as i, TRANSITION_STYLE_FIELD as j, type Transition as k, type TransitionCategory as l, type TransitionDuration as m, type TransitionHintOptions as n, type TransitionHintScope as o, type TransitionIntensity as p, type TransitionOption as q, type TransitionOptionChoice as r, type TransitionOptionValues as s, type TransitionPosition as t, type TransitionTiming as u, type TransitionTimingOption as v, WIPE_DIRECTION as w, blendedCutClause as x, composeTransitionHintFromConnections as y, getTransition as z };
|