@bluepic/embed 0.4.0-next.166 → 0.4.0-next.168

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.
@@ -7,10 +7,17 @@ export interface BxTableColumn {
7
7
  width?: string;
8
8
  /** Header text for assistive tech only, e.g. an actions column. */
9
9
  srOnlyLabel?: boolean;
10
+ /** Class(es) put on the header cell — the caller puts the same on its `<td>`s. */
11
+ class?: string;
12
+ /**
13
+ * Pin the column while the table scrolls sideways. Pinned columns must be
14
+ * the outermost ones (the first N / the last N); anything else is ignored.
15
+ */
16
+ sticky?: 'left' | 'right';
10
17
  }
11
18
  /**
12
- * A table's chrome: the scroll container, the border, the header, row hover and
13
- * per-column alignment.
19
+ * A table's chrome: the scroll container, the border, the header, row hover,
20
+ * per-column alignment, pinned header/columns and row states.
14
21
  *
15
22
  * The BODY is a slot rather than a `rows` prop on purpose. Real tables wrap
16
23
  * their rows — the studio's org list puts every `<tr>` inside a
@@ -19,10 +26,15 @@ export interface BxTableColumn {
19
26
  * keeps its `<tr>`s and this owns everything around them, which is the part
20
27
  * that was being re-written per app.
21
28
  *
22
- * Alignment reaches app-authored cells through custom properties rather than
23
- * classes the caller would have to remember: each column publishes
24
- * `--col-N-align`, and the static rules below read it. Eight columns is the
25
- * supported width; past that, a table is a different problem.
29
+ * Alignment and pinning reach app-authored cells through custom properties
30
+ * rather than classes the caller would have to remember: each column publishes
31
+ * `--col-N-align` (and, when pinned, `--col-N-position/left/right/z`), and the
32
+ * static rules below read them. Twenty-four columns is the supported width.
33
+ *
34
+ * Row states are read off ATTRIBUTES on the caller's `<tr>`, so a table stays
35
+ * a table for assistive tech:
36
+ * - `aria-current="true"` → the ACTIVE row (themed inset ring)
37
+ * - `aria-selected="true"` → a SELECTED row (soft primary background)
26
38
  */
27
39
  type __VLS_Props = {
28
40
  columns?: BxTableColumn[];
@@ -41,17 +53,50 @@ type __VLS_Props = {
41
53
  /** Row highlight on hover. Off unless rows actually do something. */
42
54
  hoverable?: boolean;
43
55
  dense?: boolean;
56
+ /** Keep the header row visible while the body scrolls vertically. */
57
+ stickyHeader?: boolean;
58
+ /**
59
+ * Fill the parent (a flex column) and scroll INSIDE the wrapper in both
60
+ * axes, instead of growing with the rows. Momentum scrolling and contained
61
+ * overscroll come with it, so the page never scrolls sideways.
62
+ */
63
+ fill?: boolean;
64
+ /** Cap the wrapper's height; the body scrolls beyond it. */
65
+ maxHeight?: string;
66
+ /**
67
+ * Pin the first `left` / last `right` columns while scrolling sideways.
68
+ * The per-column `sticky` field is the other way to say the same thing.
69
+ */
70
+ stickyColumns?: {
71
+ left?: number;
72
+ right?: number;
73
+ };
44
74
  };
45
75
  type __VLS_Slots = {
46
76
  default?: () => VNode[] | VNode;
77
+ /** Replaces a header cell's label; the column def and its index come along. */
78
+ 'header-cell'?: (scope: {
79
+ column: BxTableColumn;
80
+ index: number;
81
+ }) => VNode[] | VNode;
47
82
  };
48
- declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
83
+ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
84
+ /** The scroll container, for `scrollIntoView` on a row or programmatic scrolling. */
85
+ wrapperRef: import("vue").Ref<HTMLDivElement | undefined, HTMLDivElement | undefined>;
86
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
87
+ fill: boolean;
49
88
  bordered: boolean;
50
89
  hoverable: boolean;
51
90
  radius: "none" | "sm" | "md" | "lg";
91
+ maxHeight: string;
52
92
  variant: "plain" | "card";
53
93
  columns: BxTableColumn[];
54
94
  dense: boolean;
95
+ stickyHeader: boolean;
96
+ stickyColumns: {
97
+ left?: number;
98
+ right?: number;
99
+ };
55
100
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
56
101
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
57
102
  export default _default;
@@ -0,0 +1,18 @@
1
+ import type { BluepicField } from '@bluepic/types';
2
+ type __VLS_Props = {
3
+ field: BluepicField;
4
+ /** The row's data object — mutated in place. */
5
+ data: Record<string, unknown>;
6
+ labelId?: string;
7
+ /** Header bulk control: route every write through `onBulkUpdate` instead. */
8
+ bulk?: boolean;
9
+ onBulkUpdate?: (bindingKey: string, value: unknown) => void;
10
+ };
11
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
12
+ change: (bindingKey: string, value: unknown) => any;
13
+ activate: () => any;
14
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
15
+ onChange?: ((bindingKey: string, value: unknown) => any) | undefined;
16
+ onActivate?: (() => any) | undefined;
17
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
+ export default _default;
@@ -0,0 +1,258 @@
1
+ import { nextTick } from 'vue';
2
+ import type { Template } from '@bluepic/types';
3
+ import { type BxTableColumn } from '../BxTable.vue';
4
+ import type { BatchRowsModel } from '../../util/batch/useBatchRows';
5
+ /**
6
+ * The batch editor: a BxTable with one row per dataset and one column per
7
+ * field. Owns nothing but the table chrome — the rows live in `batch`
8
+ * (`useBatchRows`, created by BxTemplateEditor so the live preview and the
9
+ * export share the same model).
10
+ */
11
+ type __VLS_Props = {
12
+ serial?: Template.Serial;
13
+ batch: BatchRowsModel;
14
+ };
15
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {
16
+ tableRef: import("vue").Ref<({
17
+ $: import("vue").ComponentInternalInstance;
18
+ $data: {};
19
+ $props: {
20
+ readonly columns?: BxTableColumn[] | undefined;
21
+ readonly bordered?: boolean | undefined;
22
+ readonly radius?: "none" | "sm" | "md" | "lg" | undefined;
23
+ readonly variant?: "plain" | "card" | undefined;
24
+ readonly hoverable?: boolean | undefined;
25
+ readonly dense?: boolean | undefined;
26
+ readonly stickyHeader?: boolean | undefined;
27
+ readonly fill?: boolean | undefined;
28
+ readonly maxHeight?: string | undefined;
29
+ readonly stickyColumns?: {
30
+ left?: number;
31
+ right?: number;
32
+ } | undefined;
33
+ } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps;
34
+ $attrs: import("vue").Attrs;
35
+ $refs: {
36
+ [x: string]: unknown;
37
+ };
38
+ $slots: Readonly<{
39
+ [name: string]: import("vue").Slot<any> | undefined;
40
+ }>;
41
+ $root: import("vue").ComponentPublicInstance | null;
42
+ $parent: import("vue").ComponentPublicInstance | null;
43
+ $host: Element | null;
44
+ $emit: (event: string, ...args: any[]) => void;
45
+ $el: any;
46
+ $options: import("vue").ComponentOptionsBase<Readonly<{
47
+ columns?: BxTableColumn[];
48
+ bordered?: boolean;
49
+ radius?: "none" | "sm" | "md" | "lg";
50
+ variant?: "plain" | "card";
51
+ hoverable?: boolean;
52
+ dense?: boolean;
53
+ stickyHeader?: boolean;
54
+ fill?: boolean;
55
+ maxHeight?: string;
56
+ stickyColumns?: {
57
+ left?: number;
58
+ right?: number;
59
+ };
60
+ }> & Readonly<{}>, {
61
+ wrapperRef: import("vue").Ref<HTMLDivElement | undefined, HTMLDivElement | undefined>;
62
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {
63
+ fill: boolean;
64
+ bordered: boolean;
65
+ hoverable: boolean;
66
+ radius: "none" | "sm" | "md" | "lg";
67
+ maxHeight: string;
68
+ variant: "plain" | "card";
69
+ columns: BxTableColumn[];
70
+ dense: boolean;
71
+ stickyHeader: boolean;
72
+ stickyColumns: {
73
+ left?: number;
74
+ right?: number;
75
+ };
76
+ }, {}, string, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & {
77
+ beforeCreate?: (() => void) | (() => void)[];
78
+ created?: (() => void) | (() => void)[];
79
+ beforeMount?: (() => void) | (() => void)[];
80
+ mounted?: (() => void) | (() => void)[];
81
+ beforeUpdate?: (() => void) | (() => void)[];
82
+ updated?: (() => void) | (() => void)[];
83
+ activated?: (() => void) | (() => void)[];
84
+ deactivated?: (() => void) | (() => void)[];
85
+ beforeDestroy?: (() => void) | (() => void)[];
86
+ beforeUnmount?: (() => void) | (() => void)[];
87
+ destroyed?: (() => void) | (() => void)[];
88
+ unmounted?: (() => void) | (() => void)[];
89
+ renderTracked?: ((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[];
90
+ renderTriggered?: ((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[];
91
+ errorCaptured?: ((err: unknown, instance: import("vue").ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import("vue").ComponentPublicInstance | null, info: string) => boolean | void)[];
92
+ };
93
+ $forceUpdate: () => void;
94
+ $nextTick: typeof nextTick;
95
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import("@vue/reactivity").OnCleanup]) => any : (...args: [any, any, import("@vue/reactivity").OnCleanup]) => any, options?: import("vue").WatchOptions): import("vue").WatchStopHandle;
96
+ } & Readonly<{
97
+ fill: boolean;
98
+ bordered: boolean;
99
+ hoverable: boolean;
100
+ radius: "none" | "sm" | "md" | "lg";
101
+ maxHeight: string;
102
+ variant: "plain" | "card";
103
+ columns: BxTableColumn[];
104
+ dense: boolean;
105
+ stickyHeader: boolean;
106
+ stickyColumns: {
107
+ left?: number;
108
+ right?: number;
109
+ };
110
+ }> & Omit<Readonly<{
111
+ columns?: BxTableColumn[];
112
+ bordered?: boolean;
113
+ radius?: "none" | "sm" | "md" | "lg";
114
+ variant?: "plain" | "card";
115
+ hoverable?: boolean;
116
+ dense?: boolean;
117
+ stickyHeader?: boolean;
118
+ fill?: boolean;
119
+ maxHeight?: string;
120
+ stickyColumns?: {
121
+ left?: number;
122
+ right?: number;
123
+ };
124
+ }> & Readonly<{}>, "wrapperRef" | ("fill" | "bordered" | "hoverable" | "radius" | "maxHeight" | "variant" | "columns" | "dense" | "stickyHeader" | "stickyColumns")> & {
125
+ wrapperRef: HTMLDivElement | undefined;
126
+ } & {} & import("vue").ComponentCustomProperties & {} & {
127
+ $slots: {
128
+ default?: () => import("vue").VNode[] | import("vue").VNode;
129
+ 'header-cell'?: (scope: {
130
+ column: BxTableColumn;
131
+ index: number;
132
+ }) => import("vue").VNode[] | import("vue").VNode;
133
+ };
134
+ }) | undefined, ({
135
+ $: import("vue").ComponentInternalInstance;
136
+ $data: {};
137
+ $props: {
138
+ readonly columns?: BxTableColumn[] | undefined;
139
+ readonly bordered?: boolean | undefined;
140
+ readonly radius?: "none" | "sm" | "md" | "lg" | undefined;
141
+ readonly variant?: "plain" | "card" | undefined;
142
+ readonly hoverable?: boolean | undefined;
143
+ readonly dense?: boolean | undefined;
144
+ readonly stickyHeader?: boolean | undefined;
145
+ readonly fill?: boolean | undefined;
146
+ readonly maxHeight?: string | undefined;
147
+ readonly stickyColumns?: {
148
+ left?: number;
149
+ right?: number;
150
+ } | undefined;
151
+ } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps;
152
+ $attrs: import("vue").Attrs;
153
+ $refs: {
154
+ [x: string]: unknown;
155
+ };
156
+ $slots: Readonly<{
157
+ [name: string]: import("vue").Slot<any> | undefined;
158
+ }>;
159
+ $root: import("vue").ComponentPublicInstance | null;
160
+ $parent: import("vue").ComponentPublicInstance | null;
161
+ $host: Element | null;
162
+ $emit: (event: string, ...args: any[]) => void;
163
+ $el: any;
164
+ $options: import("vue").ComponentOptionsBase<Readonly<{
165
+ columns?: BxTableColumn[];
166
+ bordered?: boolean;
167
+ radius?: "none" | "sm" | "md" | "lg";
168
+ variant?: "plain" | "card";
169
+ hoverable?: boolean;
170
+ dense?: boolean;
171
+ stickyHeader?: boolean;
172
+ fill?: boolean;
173
+ maxHeight?: string;
174
+ stickyColumns?: {
175
+ left?: number;
176
+ right?: number;
177
+ };
178
+ }> & Readonly<{}>, {
179
+ wrapperRef: import("vue").Ref<HTMLDivElement | undefined, HTMLDivElement | undefined>;
180
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {
181
+ fill: boolean;
182
+ bordered: boolean;
183
+ hoverable: boolean;
184
+ radius: "none" | "sm" | "md" | "lg";
185
+ maxHeight: string;
186
+ variant: "plain" | "card";
187
+ columns: BxTableColumn[];
188
+ dense: boolean;
189
+ stickyHeader: boolean;
190
+ stickyColumns: {
191
+ left?: number;
192
+ right?: number;
193
+ };
194
+ }, {}, string, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & {
195
+ beforeCreate?: (() => void) | (() => void)[];
196
+ created?: (() => void) | (() => void)[];
197
+ beforeMount?: (() => void) | (() => void)[];
198
+ mounted?: (() => void) | (() => void)[];
199
+ beforeUpdate?: (() => void) | (() => void)[];
200
+ updated?: (() => void) | (() => void)[];
201
+ activated?: (() => void) | (() => void)[];
202
+ deactivated?: (() => void) | (() => void)[];
203
+ beforeDestroy?: (() => void) | (() => void)[];
204
+ beforeUnmount?: (() => void) | (() => void)[];
205
+ destroyed?: (() => void) | (() => void)[];
206
+ unmounted?: (() => void) | (() => void)[];
207
+ renderTracked?: ((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[];
208
+ renderTriggered?: ((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[];
209
+ errorCaptured?: ((err: unknown, instance: import("vue").ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import("vue").ComponentPublicInstance | null, info: string) => boolean | void)[];
210
+ };
211
+ $forceUpdate: () => void;
212
+ $nextTick: typeof nextTick;
213
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import("@vue/reactivity").OnCleanup]) => any : (...args: [any, any, import("@vue/reactivity").OnCleanup]) => any, options?: import("vue").WatchOptions): import("vue").WatchStopHandle;
214
+ } & Readonly<{
215
+ fill: boolean;
216
+ bordered: boolean;
217
+ hoverable: boolean;
218
+ radius: "none" | "sm" | "md" | "lg";
219
+ maxHeight: string;
220
+ variant: "plain" | "card";
221
+ columns: BxTableColumn[];
222
+ dense: boolean;
223
+ stickyHeader: boolean;
224
+ stickyColumns: {
225
+ left?: number;
226
+ right?: number;
227
+ };
228
+ }> & Omit<Readonly<{
229
+ columns?: BxTableColumn[];
230
+ bordered?: boolean;
231
+ radius?: "none" | "sm" | "md" | "lg";
232
+ variant?: "plain" | "card";
233
+ hoverable?: boolean;
234
+ dense?: boolean;
235
+ stickyHeader?: boolean;
236
+ fill?: boolean;
237
+ maxHeight?: string;
238
+ stickyColumns?: {
239
+ left?: number;
240
+ right?: number;
241
+ };
242
+ }> & Readonly<{}>, "wrapperRef" | ("fill" | "bordered" | "hoverable" | "radius" | "maxHeight" | "variant" | "columns" | "dense" | "stickyHeader" | "stickyColumns")> & {
243
+ wrapperRef: HTMLDivElement | undefined;
244
+ } & {} & import("vue").ComponentCustomProperties & {} & {
245
+ $slots: {
246
+ default?: () => import("vue").VNode[] | import("vue").VNode;
247
+ 'header-cell'?: (scope: {
248
+ column: BxTableColumn;
249
+ index: number;
250
+ }) => import("vue").VNode[] | import("vue").VNode;
251
+ };
252
+ }) | undefined>;
253
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
254
+ import: () => any;
255
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
256
+ onImport?: (() => any) | undefined;
257
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
258
+ export default _default;
@@ -0,0 +1,66 @@
1
+ import type { BatchFileFormat, BatchNaming } from '../../util/batch/export';
2
+ import type { BatchCsvFormat } from '../../util/batch/csv';
3
+ export type BatchExportKind = 'files' | 'csv';
4
+ export interface BatchExportRunOptions {
5
+ kind: BatchExportKind;
6
+ format: BatchFileFormat | BatchCsvFormat;
7
+ naming: BatchNaming;
8
+ delimiter: ',' | ';';
9
+ prewarm: boolean;
10
+ signal: AbortSignal;
11
+ onProgress: (progress: {
12
+ done: number;
13
+ total: number;
14
+ failed?: number;
15
+ current?: number;
16
+ }) => void;
17
+ }
18
+ export interface BatchExportRunResult {
19
+ /** What to hand out: the zip / single file, or the CSV. */
20
+ output?: {
21
+ blob: Blob;
22
+ fileName: string;
23
+ };
24
+ /** Files count (files export) — for the wording. */
25
+ fileCount?: number;
26
+ /** CSV rows whose render URL is over budget (1-based). */
27
+ overBudget?: number[];
28
+ /** Pre-warm outcome (CSV). */
29
+ prewarmed?: {
30
+ done: number;
31
+ failed: number;
32
+ };
33
+ cancelled?: boolean;
34
+ }
35
+ /**
36
+ * The batch export dialog: choose format + naming, see what it costs, run,
37
+ * download. The parent supplies `run` — this component only knows the shape
38
+ * of the choices and the progress, not how rendering works.
39
+ */
40
+ type __VLS_Props = {
41
+ kind: BatchExportKind;
42
+ rowCount: number;
43
+ templateName: string;
44
+ isVideoTemplate: boolean;
45
+ /** Rows a video batch may contain (tier). */
46
+ videoBatchMaxSize: number;
47
+ /** Whether outputs are charged in this context (false = preview / trusted). */
48
+ consumesCredits: boolean;
49
+ /** Text bindings usable as file names: label → binding key. */
50
+ namingBindings: {
51
+ label: string;
52
+ key: string;
53
+ }[];
54
+ run: (opts: BatchExportRunOptions) => Promise<BatchExportRunResult>;
55
+ };
56
+ declare function cancelRun(): void;
57
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {
58
+ cancelRun: typeof cancelRun;
59
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
60
+ cancel: () => any;
61
+ done: (result: BatchExportRunResult) => any;
62
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
63
+ onCancel?: (() => any) | undefined;
64
+ onDone?: ((result: BatchExportRunResult) => any) | undefined;
65
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
66
+ export default _default;
@@ -0,0 +1,25 @@
1
+ import { type BatchColumnField } from '../../util/batch/fields';
2
+ /**
3
+ * Import rows into the batch: parse (delimiter + per-cell type inference from
4
+ * the studio's parseCSV), match columns to fields, convert per field type.
5
+ * Columns whose header IS a binding key are matched up front — that is what
6
+ * "Export as CSV" writes, so a round trip needs no clicking.
7
+ */
8
+ type __VLS_Props = {
9
+ columns: BatchColumnField[];
10
+ currentRowCount: number;
11
+ };
12
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
13
+ cancel: () => any;
14
+ confirm: (payload: {
15
+ datasets: Record<string, unknown>[];
16
+ mode: "append" | "replace";
17
+ }) => any;
18
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
19
+ onCancel?: (() => any) | undefined;
20
+ onConfirm?: ((payload: {
21
+ datasets: Record<string, unknown>[];
22
+ mode: "append" | "replace";
23
+ }) => any) | undefined;
24
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
+ export default _default;
@@ -2,6 +2,7 @@ import { BluepicField, FieldsBridge, Studio, Template } from '@bluepic/types';
2
2
  import { VNode } from 'vue';
3
3
  import { type AssetProxyConfig } from '../../util/assetProxy';
4
4
  import { z } from '@hono/zod-openapi';
5
+ import { type BatchRow } from '../../util/batch/useBatchRows';
5
6
  import 'swiper/css';
6
7
  import 'swiper/css/navigation';
7
8
  import 'swiper/css/pagination';
@@ -98,6 +99,29 @@ type __VLS_Props = {
98
99
  * (bx-template → PostHog `template_render_*`). Omit to disable analytics.
99
100
  */
100
101
  analytics?: ExportAnalyticsSink;
102
+ /**
103
+ * Batch editor (campaign `config.editMode`): `single` is the classic editor,
104
+ * `batch` a table of rows with the live preview following the active row,
105
+ * `all` both behind a Single | Batch switch in the header. Absent = single.
106
+ */
107
+ editMode?: 'single' | 'batch' | 'all';
108
+ /**
109
+ * Rows a VIDEO batch export may contain, from the paying team's tier
110
+ * (public campaign `videoBatchMaxSize`). Absent = 1.
111
+ */
112
+ videoBatchMaxSize?: number;
113
+ /** URL render API scope (`image.bluepic.io/<orgSlug>/<alias>.png`) for CSV links. */
114
+ orgSlug?: string;
115
+ /** This template's URL-render alias, if published under one. */
116
+ templateAlias?: string | null;
117
+ /**
118
+ * Origin of the URL render API this editor should link to in CSV exports
119
+ * (`https://image.bluepic.io`, staging `https://image-staging.bluepic.io`).
120
+ * Absent = derived from `apiBaseUrl` / production.
121
+ */
122
+ urlRenderBaseUrl?: string;
123
+ /** Host-owned batch rows (`v-model:batchRows`). Absent = session storage only. */
124
+ batchRows?: BatchRow[];
101
125
  };
102
126
  type __VLS_Slots = {
103
127
  legal: () => VNode[] | VNode;
@@ -2946,13 +2970,17 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
2946
2970
  [k: string]: unknown;
2947
2971
  }) => any;
2948
2972
  back: () => any;
2973
+ "update:batchRows": (args_0: BatchRow[]) => any;
2949
2974
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
2950
2975
  "onUpdate:data"?: ((args_0: {
2951
2976
  [k: string]: unknown;
2952
2977
  }) => any) | undefined;
2953
2978
  onBack?: (() => any) | undefined;
2979
+ "onUpdate:batchRows"?: ((args_0: BatchRow[]) => any) | undefined;
2954
2980
  }>, {
2955
2981
  zoomAndPan: boolean;
2982
+ editMode: "single" | "batch" | "all";
2983
+ videoBatchMaxSize: number;
2956
2984
  preCacheLocalRendering: boolean;
2957
2985
  liveViewOffsetDesktop: {
2958
2986
  top: number;
@@ -14,6 +14,11 @@ type __VLS_Props = {
14
14
  maxSize?: number;
15
15
  bridge: FieldsBridge;
16
16
  mobile?: boolean;
17
+ /**
18
+ * Table-cell layout (batch editor): a small thumbnail with icon-only
19
+ * actions in a row, instead of the card layout with labelled buttons.
20
+ */
21
+ compact?: boolean;
17
22
  field?: BluepicField;
18
23
  allowCropImage: boolean;
19
24
  aspectRatio: number;
@@ -45,6 +50,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
45
50
  uploadLabel: string;
46
51
  actionsLabel: string;
47
52
  mobile: boolean;
53
+ compact: boolean;
48
54
  resetCropOnChange: boolean;
49
55
  allowPadding: boolean;
50
56
  autoCrop: boolean;