@nodaro/prompts 1.47.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.
Files changed (80) hide show
  1. package/dist/{catalog-packs-C9CXEWfl.d.cts → catalog-packs-BDsrv8St.d.cts} +1 -1
  2. package/dist/{catalog-packs-D7NJpo4k.d.ts → catalog-packs-CAK42voB.d.ts} +1 -1
  3. package/dist/{chunk-SMKIVT7P.js → chunk-36XMRVY4.js} +4 -4
  4. package/dist/{chunk-SMKIVT7P.js.map → chunk-36XMRVY4.js.map} +1 -1
  5. package/dist/{chunk-JHEZJKTX.cjs → chunk-54BYDWAM.cjs} +62 -52
  6. package/dist/chunk-54BYDWAM.cjs.map +1 -0
  7. package/dist/{chunk-IKHRZ5UQ.js → chunk-BTV2I7EN.js} +3 -3
  8. package/dist/{chunk-IKHRZ5UQ.js.map → chunk-BTV2I7EN.js.map} +1 -1
  9. package/dist/{chunk-57PTYJJX.js → chunk-CMEUYFBZ.js} +13 -13
  10. package/dist/chunk-CMEUYFBZ.js.map +1 -0
  11. package/dist/{chunk-2OIKQ4WB.js → chunk-GZVCBSFG.js} +5 -5
  12. package/dist/{chunk-2OIKQ4WB.js.map → chunk-GZVCBSFG.js.map} +1 -1
  13. package/dist/{chunk-FCTK7RGO.cjs → chunk-IMQB7GIK.cjs} +42 -39
  14. package/dist/chunk-IMQB7GIK.cjs.map +1 -0
  15. package/dist/{chunk-2HJJBXGA.js → chunk-JHRVNWBS.js} +6 -6
  16. package/dist/{chunk-2HJJBXGA.js.map → chunk-JHRVNWBS.js.map} +1 -1
  17. package/dist/{chunk-OSKABA64.cjs → chunk-JV2WSMAA.cjs} +8 -8
  18. package/dist/{chunk-OSKABA64.cjs.map → chunk-JV2WSMAA.cjs.map} +1 -1
  19. package/dist/{chunk-VAK4RUNU.cjs → chunk-KNAKOSKV.cjs} +13 -13
  20. package/dist/{chunk-VAK4RUNU.cjs.map → chunk-KNAKOSKV.cjs.map} +1 -1
  21. package/dist/{chunk-TXHFL725.js → chunk-LD47QOKS.js} +62 -53
  22. package/dist/chunk-LD47QOKS.js.map +1 -0
  23. package/dist/{chunk-YCCQXX3U.cjs → chunk-MYVJVOPB.cjs} +39 -39
  24. package/dist/{chunk-YCCQXX3U.cjs.map → chunk-MYVJVOPB.cjs.map} +1 -1
  25. package/dist/{chunk-PHR4UETI.cjs → chunk-PJFX3MFI.cjs} +18 -18
  26. package/dist/{chunk-PHR4UETI.cjs.map → chunk-PJFX3MFI.cjs.map} +1 -1
  27. package/dist/{chunk-NN4FL7SB.js → chunk-XBRW75LM.js} +4 -4
  28. package/dist/{chunk-NN4FL7SB.js.map → chunk-XBRW75LM.js.map} +1 -1
  29. package/dist/{chunk-C4FDHCEZ.cjs → chunk-XGNUOU4F.cjs} +125 -125
  30. package/dist/{chunk-C4FDHCEZ.cjs.map → chunk-XGNUOU4F.cjs.map} +1 -1
  31. package/dist/{chunk-CPKYIVWP.js → chunk-YXJSPQC6.js} +12 -9
  32. package/dist/chunk-YXJSPQC6.js.map +1 -0
  33. package/dist/{chunk-OY7XOPDG.cjs → chunk-Z755PH3K.cjs} +57 -57
  34. package/dist/chunk-Z755PH3K.cjs.map +1 -0
  35. package/dist/entries/assembly.cjs +28 -28
  36. package/dist/entries/assembly.d.cts +1 -2
  37. package/dist/entries/assembly.d.ts +1 -2
  38. package/dist/entries/assembly.js +5 -5
  39. package/dist/entries/catalog-packs.d.cts +3 -3
  40. package/dist/entries/catalog-packs.d.ts +3 -3
  41. package/dist/entries/person.d.cts +2 -2
  42. package/dist/entries/person.d.ts +2 -2
  43. package/dist/entries/picker-catalogs.cjs +56 -56
  44. package/dist/entries/picker-catalogs.d.cts +26 -4
  45. package/dist/entries/picker-catalogs.d.ts +26 -4
  46. package/dist/entries/picker-catalogs.js +4 -4
  47. package/dist/entries/pickers.cjs +377 -373
  48. package/dist/entries/pickers.d.cts +473 -2
  49. package/dist/entries/pickers.d.ts +473 -2
  50. package/dist/entries/pickers.js +2 -2
  51. package/dist/entries/prompt-builder.cjs +75 -75
  52. package/dist/entries/prompt-builder.d.cts +2 -3
  53. package/dist/entries/prompt-builder.d.ts +2 -3
  54. package/dist/entries/prompt-builder.js +4 -4
  55. package/dist/index.cjs +529 -525
  56. package/dist/index.d.cts +5 -6
  57. package/dist/index.d.ts +5 -6
  58. package/dist/index.js +8 -8
  59. package/dist/{picker-catalogs-C3utGMRB.d.cts → picker-catalogs-BiRCs_5G.d.cts} +8 -0
  60. package/dist/{picker-catalogs-BM8IphF1.d.ts → picker-catalogs-CX8pHi8q.d.ts} +8 -0
  61. package/dist/{subject-registry-DFiGx49v.d.ts → subject-registry-Cf802LQ5.d.ts} +8 -4
  62. package/dist/{subject-registry-CQi_CZfJ.d.cts → subject-registry-D2uMBVpP.d.cts} +8 -4
  63. package/package.json +2 -2
  64. package/src/__tests__/assemble-video-input.test.ts +13 -11
  65. package/src/__tests__/direction-registry.test.ts +5 -5
  66. package/src/__tests__/prompt-style-section.test.ts +2 -2
  67. package/src/__tests__/style-video-wording.test.ts +258 -0
  68. package/src/catalog-overlay.ts +15 -1
  69. package/src/direction-registry.ts +25 -7
  70. package/src/parameter-prompt-hint.ts +23 -7
  71. package/src/picker-catalogs.ts +11 -0
  72. package/src/style.ts +78 -49
  73. package/dist/chunk-57PTYJJX.js.map +0 -1
  74. package/dist/chunk-CPKYIVWP.js.map +0 -1
  75. package/dist/chunk-FCTK7RGO.cjs.map +0 -1
  76. package/dist/chunk-JHEZJKTX.cjs.map +0 -1
  77. package/dist/chunk-OY7XOPDG.cjs.map +0 -1
  78. package/dist/chunk-TXHFL725.js.map +0 -1
  79. package/dist/transitions-BLFfAJUH.d.cts +0 -450
  80. package/dist/transitions-BgwWM37i.d.ts +0 -450
@@ -1,450 +0,0 @@
1
- import { P as PickerHintMode } from './term-C01_g6s1.js';
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 };