@interware/content-generator 0.4.4 → 0.5.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/README.md +21 -1
- package/dist/_chunks/{App-BQr5_g5u.mjs → App-DPVBu7QB.mjs} +37 -726
- package/dist/_chunks/{App-CfwvfmvL.js → App-DVTFrZvf.js} +31 -720
- package/dist/_chunks/ImageStudioTabs-B2UbKYq7.js +5299 -0
- package/dist/_chunks/ImageStudioTabs-mlNL6aQ2.mjs +5298 -0
- package/dist/_chunks/Settings-DziRY70a.js +155 -0
- package/dist/_chunks/Settings-RrBQdijj.mjs +155 -0
- package/dist/_chunks/StudioApp-AUyPNhh2.mjs +17 -0
- package/dist/_chunks/StudioApp-Cswkzh7F.js +17 -0
- package/dist/_chunks/{getTranslation-DNhP1INv.js → getTranslation-D88uLXGd.js} +1 -1
- package/dist/_chunks/{getTranslation-B9ND5RaH.mjs → getTranslation-DfxaP_TC.mjs} +1 -1
- package/dist/_chunks/{index-Dyq8dxMX.mjs → index-CqDdi211.mjs} +25 -7
- package/dist/_chunks/{index-DGPqyrzz.js → index-Ddp0Qvqo.js} +24 -6
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/components/PluginIcon.d.ts +4 -2
- package/dist/admin/src/components/PluginProviders.d.ts +8 -0
- package/dist/admin/src/components/generate-video/Form.d.ts +1 -1
- package/dist/admin/src/components/settings/Form.d.ts +4 -5
- package/dist/admin/src/containers/settings/index.d.ts +7 -7
- package/dist/admin/src/features/background-removal/RemoveBackgroundButton.d.ts +7 -0
- package/dist/admin/src/features/background-removal/RemoveBackgroundDialog.d.ts +15 -0
- package/dist/admin/src/features/background-removal/colorKey.d.ts +29 -0
- package/dist/admin/src/features/background-removal/imageCanvas.d.ts +20 -0
- package/dist/admin/src/features/background-removal/mask.d.ts +10 -0
- package/dist/admin/src/features/background-removal/runtime.d.ts +31 -0
- package/dist/admin/src/features/generator/EditEmpty.d.ts +13 -0
- package/dist/admin/src/features/generator/GeneratorTab.d.ts +7 -0
- package/dist/admin/src/features/generator/GroundingSources.d.ts +9 -0
- package/dist/admin/src/features/generator/ModeSwitch.d.ts +6 -0
- package/dist/admin/src/features/generator/PromptComposer.d.ts +25 -0
- package/dist/admin/src/features/generator/ReferencePicker.d.ts +26 -0
- package/dist/admin/src/features/generator/VersionHistory.d.ts +13 -0
- package/dist/admin/src/features/generator/generatorApi.d.ts +71 -0
- package/dist/admin/src/features/generator/model.d.ts +60 -0
- package/dist/admin/src/features/generator/useGeneratorApi.d.ts +21 -0
- package/dist/admin/src/features/image-studio/ImageStudioTabs.d.ts +26 -0
- package/dist/admin/src/features/image-studio/SegmentedSwitch.d.ts +18 -0
- package/dist/admin/src/features/image-studio/checkerboard.d.ts +5 -0
- package/dist/admin/src/features/library/FileCard.d.ts +17 -0
- package/dist/admin/src/features/library/FolderTree.d.ts +14 -0
- package/dist/admin/src/features/library/LibraryDialogs.d.ts +46 -0
- package/dist/admin/src/features/library/LibraryImagePicker.d.ts +15 -0
- package/dist/admin/src/features/library/LibraryTab.d.ts +2 -0
- package/dist/admin/src/features/library/SaveToLibraryDialog.d.ts +15 -0
- package/dist/admin/src/features/library/model.d.ts +40 -0
- package/dist/admin/src/features/library/studioRoot.d.ts +11 -0
- package/dist/admin/src/features/library/uploadApi.d.ts +77 -0
- package/dist/admin/src/features/library/useLibraryApi.d.ts +34 -0
- package/dist/admin/src/features/templates/editor/ColorField.d.ts +11 -0
- package/dist/admin/src/features/templates/editor/Editor.d.ts +19 -0
- package/dist/admin/src/features/templates/editor/EditorBar.d.ts +9 -0
- package/dist/admin/src/features/templates/editor/EditorMenuBar.d.ts +58 -0
- package/dist/admin/src/features/templates/editor/EditorToolbar.d.ts +20 -0
- package/dist/admin/src/features/templates/editor/ElementPalette.d.ts +10 -0
- package/dist/admin/src/features/templates/editor/FloatingPanel.d.ts +17 -0
- package/dist/admin/src/features/templates/editor/FullscreenView.d.ts +11 -0
- package/dist/admin/src/features/templates/editor/IconPicker.d.ts +9 -0
- package/dist/admin/src/features/templates/editor/Inspector.d.ts +17 -0
- package/dist/admin/src/features/templates/editor/LayersPanel.d.ts +12 -0
- package/dist/admin/src/features/templates/editor/Precision.d.ts +23 -0
- package/dist/admin/src/features/templates/editor/RangeField.d.ts +12 -0
- package/dist/admin/src/features/templates/editor/SaveTemplateDialog.d.ts +14 -0
- package/dist/admin/src/features/templates/editor/Stage.d.ts +29 -0
- package/dist/admin/src/features/templates/editor/TemplateFolderSelect.d.ts +9 -0
- package/dist/admin/src/features/templates/editor/TemplatePicker.d.ts +23 -0
- package/dist/admin/src/features/templates/editor/TemplatesTab.d.ts +5 -0
- package/dist/admin/src/features/templates/editor/TypographyControls.d.ts +24 -0
- package/dist/admin/src/features/templates/editor/icons.d.ts +7 -0
- package/dist/admin/src/features/templates/editor/overlays.d.ts +20 -0
- package/dist/admin/src/features/templates/editor/useCanvasNav.d.ts +25 -0
- package/dist/admin/src/features/templates/editor/useFitScale.d.ts +3 -0
- package/dist/admin/src/features/templates/export/fontEmbed.d.ts +22 -0
- package/dist/admin/src/features/templates/export/imageSource.d.ts +21 -0
- package/dist/admin/src/features/templates/export/pdf.d.ts +6 -0
- package/dist/admin/src/features/templates/export/render.d.ts +22 -0
- package/dist/admin/src/features/templates/export/useEditorIO.d.ts +18 -0
- package/dist/admin/src/features/templates/fonts/catalog.d.ts +47 -0
- package/dist/admin/src/features/templates/fonts/customFonts.d.ts +19 -0
- package/dist/admin/src/features/templates/fonts/useCustomFonts.d.ts +9 -0
- package/dist/admin/src/features/templates/fonts/useFonts.d.ts +2 -0
- package/dist/admin/src/features/templates/model/drag.d.ts +10 -0
- package/dist/admin/src/features/templates/model/editorReducer.d.ts +58 -0
- package/dist/admin/src/features/templates/model/layers.d.ts +42 -0
- package/dist/admin/src/features/templates/model/palette.d.ts +38 -0
- package/dist/admin/src/features/templates/model/presets.d.ts +17 -0
- package/dist/admin/src/features/templates/model/shortcuts.d.ts +19 -0
- package/dist/admin/src/features/templates/model/snap.d.ts +24 -0
- package/dist/admin/src/features/templates/model/templates.d.ts +8 -0
- package/dist/admin/src/features/templates/model/types.d.ts +154 -0
- package/dist/admin/src/features/templates/model/viewport.d.ts +36 -0
- package/dist/admin/src/features/templates/render/IWLogo.d.ts +7 -0
- package/dist/admin/src/features/templates/render/LayerCanvas.d.ts +13 -0
- package/dist/admin/src/features/templates/render/fonts.d.ts +5 -0
- package/dist/admin/src/features/templates/render/icons.d.ts +10 -0
- package/dist/admin/src/features/templates/render/renderLayer.d.ts +9 -0
- package/dist/admin/src/features/templates/store/persist.d.ts +41 -0
- package/dist/admin/src/features/templates/store/templatesApi.d.ts +49 -0
- package/dist/admin/src/features/templates/store/useMyTemplates.d.ts +19 -0
- package/dist/admin/src/features/templates/store/useTemplateSaving.d.ts +14 -0
- package/dist/admin/src/features/templates/store/useTemplatesApi.d.ts +23 -0
- package/dist/admin/src/hooks/useAdminTheme.d.ts +8 -0
- package/dist/admin/src/hooks/useThemeColors.d.ts +9 -0
- package/dist/admin/src/lib/dataUrl.d.ts +6 -0
- package/dist/admin/src/lib/promptRules.d.ts +23 -0
- package/dist/admin/src/lib/use-cases/articles/index.d.ts +12 -1
- package/dist/admin/src/lib/use-cases/categories/index.d.ts +12 -1
- package/dist/admin/src/lib/use-cases/facebook/index.d.ts +1 -1
- package/dist/admin/src/lib/use-cases/generate-content/index.d.ts +2 -2
- package/dist/admin/src/lib/use-cases/images/index.d.ts +1 -4
- package/dist/admin/src/lib/use-cases/linkedin/index.d.ts +1 -1
- package/dist/admin/src/lib/use-cases/settings/index.d.ts +13 -2
- package/dist/admin/src/lib/use-cases/users/index.d.ts +12 -1
- package/dist/admin/src/pages/ImageStudio.d.ts +3 -0
- package/dist/admin/src/pages/StudioApp.d.ts +3 -0
- package/dist/admin/src/pluginId.d.ts +6 -0
- package/dist/admin/src/test-setup.d.ts +1 -0
- package/dist/admin/src/test-utils.d.ts +5 -0
- package/dist/server/index.js +2408 -1261
- package/dist/server/index.mjs +2415 -1267
- package/dist/server/src/bootstrap.d.ts +1 -1
- package/dist/server/src/content-types/index.d.ts +66 -1
- package/dist/server/src/content-types/template/index.d.ts +65 -0
- package/dist/server/src/content-types/template/schema.d.ts +69 -0
- package/dist/server/src/controllers/config.d.ts +2 -0
- package/dist/server/src/controllers/controller.d.ts +0 -5
- package/dist/server/src/controllers/image-studio.d.ts +23 -0
- package/dist/server/src/controllers/index.d.ts +128 -5
- package/dist/server/src/controllers/templates.d.ts +26 -0
- package/dist/server/src/image-studio/geminiConfig.d.ts +40 -0
- package/dist/server/src/image-studio/models.d.ts +38 -0
- package/dist/server/src/image-studio/prompt.d.ts +7 -0
- package/dist/server/src/image-studio/validate.d.ts +41 -0
- package/dist/server/src/index.d.ts +229 -75
- package/dist/server/src/routes/admin.d.ts +6 -2
- package/dist/server/src/routes/content-api.d.ts +4 -9
- package/dist/server/src/routes/index.d.ts +7 -11
- package/dist/server/src/routes/policies.d.ts +14 -0
- package/dist/server/src/services/image-studio.d.ts +62 -0
- package/dist/server/src/services/index.d.ts +27 -57
- package/dist/server/src/services/service.d.ts +0 -57
- package/dist/server/src/services/templates.d.ts +81 -0
- package/dist/server/src/templates/folders.d.ts +14 -0
- package/dist/server/src/templates/validate.d.ts +23 -0
- package/dist/server/src/utils/folders.d.ts +15 -0
- package/dist/server/src/utils/secrets.d.ts +9 -0
- package/package.json +22 -10
- package/static/background-worker.d.mts +15 -0
- package/static/background-worker.mjs +87 -0
- package/dist/_chunks/Settings-BrqTzJp-.js +0 -262
- package/dist/_chunks/Settings-CdZnYLLK.mjs +0 -244
- package/dist/admin/src/components/Navigation.d.ts +0 -2
- package/dist/admin/src/components/generate-image/Form.d.ts +0 -15
- package/dist/admin/src/components/generate-images/Image.d.ts +0 -5
- package/dist/admin/src/components/generate-images/Images.d.ts +0 -2
- package/dist/admin/src/components/generate-images/Modal.d.ts +0 -9
- package/dist/admin/src/containers/generate-image/index.d.ts +0 -2
- package/dist/admin/src/containers/generate-images/index.d.ts +0 -2
- package/dist/admin/src/hooks/generate-images/useImages.d.ts +0 -12
- package/dist/admin/src/pages/GenerateImage.d.ts +0 -2
- package/dist/admin/src/pages/GenerateImages.d.ts +0 -2
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas de «Quitar fondo» (S4.18): leer los píxeles de una imagen, pintarlos y exportarlos a PNG.
|
|
3
|
+
* Aislado aquí porque jsdom no dibuja; las pruebas lo simulan.
|
|
4
|
+
*/
|
|
5
|
+
export interface Pixels {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
data: Uint8ClampedArray;
|
|
9
|
+
}
|
|
10
|
+
export declare const canvas: (width: number, height: number) => {
|
|
11
|
+
c: HTMLCanvasElement;
|
|
12
|
+
ctx: CanvasRenderingContext2D;
|
|
13
|
+
};
|
|
14
|
+
export declare const loadImage: (src: string) => Promise<HTMLImageElement>;
|
|
15
|
+
/** Píxeles RGBA de una imagen (data URL o URL del mismo origen) a su tamaño original. */
|
|
16
|
+
export declare const loadPixels: (src: string) => Promise<Pixels>;
|
|
17
|
+
/** Pinta los píxeles en un canvas de la página (la vista previa). */
|
|
18
|
+
export declare const drawPixels: (target: HTMLCanvasElement, width: number, height: number, data: Uint8ClampedArray) => void;
|
|
19
|
+
/** Píxeles → PNG en data URL (conserva la transparencia). */
|
|
20
|
+
export declare const pixelsToDataUrl: (width: number, height: number, data: Uint8ClampedArray) => string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Posprocesamiento de «Quitar fondo» en el panel (S4.17). La normalización y el modelo (ISNet) los hace el
|
|
3
|
+
* worker (`static/background-worker.mjs`); aquí se aplica su máscara 0–1 al tamaño de la imagen.
|
|
4
|
+
* Funciones puras sobre arreglos RGBA: el canvas queda en `runtime.ts`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const INPUT_SIZE = 1024;
|
|
7
|
+
/** Máscara 0–1 → RGBA en gris opaco, para escalarla con un canvas sin alfa premultiplicado. */
|
|
8
|
+
export declare const maskToRgba: (mask: Float32Array, width: number, height: number) => Uint8ClampedArray;
|
|
9
|
+
/** Usa el canal rojo de la máscara (ya al tamaño de la imagen) como alfa de la imagen. */
|
|
10
|
+
export declare const applyAlpha: (rgba: Uint8ClampedArray, maskRgba: Uint8ClampedArray) => void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker que sirve el CMS desde `/ort/` (lo copia `npm run assets:image-studio` de web-cms desde
|
|
3
|
+
* `static/background-worker.mjs`): la inferencia corre fuera del hilo del panel (S4.17, ADR-007).
|
|
4
|
+
*/
|
|
5
|
+
export declare const WORKER_URL = "/ort/background-worker.mjs";
|
|
6
|
+
/** Límite por imagen: con WASM en una máquina lenta tarda decenas de segundos, nunca minutos. */
|
|
7
|
+
export declare const RUN_TIMEOUT_MS = 120000;
|
|
8
|
+
export declare const TIMEOUT_MESSAGE = "Quitar fondo tard\u00F3 demasiado. Intenta de nuevo.";
|
|
9
|
+
export declare class RemoveBackgroundTimeout extends Error {
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
12
|
+
/** Mensaje para el panel: el aviso de tiempo agotado o el genérico. */
|
|
13
|
+
export declare const removeBackgroundError: (err: unknown) => "Quitar fondo tardó demasiado. Intenta de nuevo." | "No se pudo quitar el fondo.";
|
|
14
|
+
export interface Model {
|
|
15
|
+
/** Píxeles RGBA de 1024 × 1024 → máscara 0–1. El búfer se transfiere al worker. */
|
|
16
|
+
run: (rgba: Uint8ClampedArray) => Promise<Float32Array>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Crea el worker y carga el modelo una sola vez por sesión del panel. El worker elige WebGPU o WASM.
|
|
20
|
+
* Si la carga o una imagen fallan, o una imagen pasa del límite, termina el worker y descarta la
|
|
21
|
+
* promesa: una sesión que falló puede no volver a responder, y el siguiente intento empieza de cero.
|
|
22
|
+
*/
|
|
23
|
+
export declare const loadModel: (onStatus?: (status: string) => void) => Promise<Model>;
|
|
24
|
+
/** Solo para pruebas. */
|
|
25
|
+
export declare const resetModel: () => void;
|
|
26
|
+
/**
|
|
27
|
+
* Quita el fondo de una imagen (data URL o URL del mismo origen) y devuelve un PNG en data URL con
|
|
28
|
+
* el fondo transparente, al tamaño original. La máscara vuelve a ese tamaño escalándola con el
|
|
29
|
+
* canvas (diseño S4.7, D8).
|
|
30
|
+
*/
|
|
31
|
+
export declare const removeBackground: (src: string, onStatus?: (status: string) => void) => Promise<string>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LibraryFile } from '../library/uploadApi';
|
|
2
|
+
interface EditEmptyProps {
|
|
3
|
+
disabled: boolean;
|
|
4
|
+
onUpload: (file: File | undefined) => void;
|
|
5
|
+
onOpenLibrary: () => void;
|
|
6
|
+
onOpenRecent: (file: LibraryFile) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Modo Editar sin imagen (S4.13): arrastrar, subir o elegir de la biblioteca, con las imágenes más
|
|
10
|
+
* recientes de toda la biblioteca (raíz y subcarpetas, S4.14) a un clic.
|
|
11
|
+
*/
|
|
12
|
+
export declare const EditEmpty: ({ disabled, onUpload, onOpenLibrary, onOpenRecent }: EditEmptyProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pestaña «Generador» del Estudio de imágenes (diseño S4.2, modos de S4.13). «Crear imagen»: parámetros,
|
|
3
|
+
* referencias de estilo y prompt con «Expandir idea». «Editar imagen»: una imagen (generada, subida o
|
|
4
|
+
* de la biblioteca) con cambios por instrucción, elementos para integrar e historial de versiones en
|
|
5
|
+
* memoria. Nada se sube a la biblioteca hasta que se guarda (D4).
|
|
6
|
+
*/
|
|
7
|
+
export declare const GeneratorTab: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Grounding } from './generatorApi';
|
|
2
|
+
/**
|
|
3
|
+
* Fuentes y sugerencia de búsqueda de una imagen generada con búsqueda de Google (S4.14, D6). Los
|
|
4
|
+
* términos de Google piden mostrar la sugerencia tal cual: es HTML de Google, así que va en un
|
|
5
|
+
* iframe `srcdoc` sin scripts (solo puede abrir sus enlaces en otra pestaña).
|
|
6
|
+
*/
|
|
7
|
+
export declare const GroundingSources: ({ grounding }: {
|
|
8
|
+
grounding: Grounding;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type GeneratorMode = 'create' | 'edit';
|
|
2
|
+
/** Crear o editar (S4.13): dos modos separados para que quede claro qué aplica en cada uno. */
|
|
3
|
+
export declare const ModeSwitch: ({ value, onChange }: {
|
|
4
|
+
value: GeneratorMode;
|
|
5
|
+
onChange: (mode: GeneratorMode) => void;
|
|
6
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { PromptLabels } from '../../lib/promptRules';
|
|
3
|
+
interface PromptComposerProps {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
onChange: (value: string) => void;
|
|
7
|
+
/** Recibe el texto ya saneado (S4.14, D1). */
|
|
8
|
+
onSubmit: (text: string) => void;
|
|
9
|
+
labels: PromptLabels;
|
|
10
|
+
placeholder: string;
|
|
11
|
+
actionLabel: string;
|
|
12
|
+
actionIcon: ReactNode;
|
|
13
|
+
loading: boolean;
|
|
14
|
+
disabled: boolean;
|
|
15
|
+
hint?: string;
|
|
16
|
+
/** Acciones secundarias dentro del campo, a la izquierda del contador (p. ej. «Expandir idea»). */
|
|
17
|
+
tools?: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Campo de prompt con la acción principal dentro (S4.14, D3): contador, validación con las reglas
|
|
21
|
+
* compartidas y ⌘/Ctrl + Enter. Snowflake: el `Textarea` del DS no admite contenido dentro del
|
|
22
|
+
* borde; se pinta con los tokens del tema.
|
|
23
|
+
*/
|
|
24
|
+
export declare const PromptComposer: (p: PromptComposerProps) => import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface ReferencePickerProps {
|
|
2
|
+
files: File[];
|
|
3
|
+
max: number;
|
|
4
|
+
modelLabel: string;
|
|
5
|
+
onChange: (files: File[]) => void;
|
|
6
|
+
/** Abre el selector de la biblioteca (S4.13). */
|
|
7
|
+
onPickFromLibrary: () => void;
|
|
8
|
+
/**
|
|
9
|
+
* Textos del uso: referencias de estilo al crear o elementos para el cambio al editar (S4.13).
|
|
10
|
+
* `noun` arma «Agregar …», «… desde la biblioteca» y las etiquetas accesibles.
|
|
11
|
+
*/
|
|
12
|
+
label?: string;
|
|
13
|
+
hint?: string;
|
|
14
|
+
noun?: {
|
|
15
|
+
plural: string;
|
|
16
|
+
capital: string;
|
|
17
|
+
file: string;
|
|
18
|
+
none: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Imágenes de referencia con miniaturas. Snowflake: el DS no tiene un cargador de imágenes con
|
|
23
|
+
* vista previa. El tope lo da el modelo (diseño S4.2, D7); con 0 se deshabilita y lo explica.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ReferencePicker: ({ files, max, modelLabel, onChange, onPickFromLibrary, label, hint, noun, }: ReferencePickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Version } from './model';
|
|
2
|
+
interface VersionHistoryProps {
|
|
3
|
+
versions: Version[];
|
|
4
|
+
currentId: string | null;
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
onSelect: (id: string) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Historial de versiones con miniatura. Snowflake: el DS no tiene una lista seleccionable con
|
|
10
|
+
* imagen; cada fila es un botón con `aria-current` en la versión actual.
|
|
11
|
+
*/
|
|
12
|
+
export declare const VersionHistory: ({ versions, currentId, disabled, onSelect }: VersionHistoryProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface ImageModelInfo {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
maxReferences: number;
|
|
5
|
+
sizes: string[];
|
|
6
|
+
aspectRatios: string[];
|
|
7
|
+
canEdit: boolean;
|
|
8
|
+
/** Admite la búsqueda de Google al generar (S4.14). */
|
|
9
|
+
grounding: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Fuentes y sugerencia de búsqueda que devuelve una imagen generada con búsqueda de Google. */
|
|
12
|
+
export interface Grounding {
|
|
13
|
+
suggestions?: string;
|
|
14
|
+
/** Consultas web y de imágenes que hizo el modelo. */
|
|
15
|
+
queries: string[];
|
|
16
|
+
sources: {
|
|
17
|
+
title: string;
|
|
18
|
+
uri: string;
|
|
19
|
+
}[];
|
|
20
|
+
}
|
|
21
|
+
export interface GenerateParams {
|
|
22
|
+
prompt: string;
|
|
23
|
+
model: string;
|
|
24
|
+
aspectRatio: string;
|
|
25
|
+
imageSize?: string;
|
|
26
|
+
safety: boolean;
|
|
27
|
+
allowPeople: boolean;
|
|
28
|
+
grounding: boolean;
|
|
29
|
+
references: File[];
|
|
30
|
+
}
|
|
31
|
+
/** Editar la versión actual; `references` son los elementos para el cambio (S4.13). */
|
|
32
|
+
export interface EditParams {
|
|
33
|
+
src: string;
|
|
34
|
+
instruction: string;
|
|
35
|
+
model: string;
|
|
36
|
+
references: File[];
|
|
37
|
+
safety: boolean;
|
|
38
|
+
allowPeople: boolean;
|
|
39
|
+
/** Proporción que debe conservar el resultado (la de la imagen base). */
|
|
40
|
+
aspectRatio?: string;
|
|
41
|
+
}
|
|
42
|
+
type Client = {
|
|
43
|
+
get: (url: string) => Promise<{
|
|
44
|
+
data: unknown;
|
|
45
|
+
}>;
|
|
46
|
+
post: (url: string, body: unknown) => Promise<{
|
|
47
|
+
data: unknown;
|
|
48
|
+
}>;
|
|
49
|
+
};
|
|
50
|
+
/** Mensaje del servidor (400 y 422 traen uno legible, diseño S4.2 D12) o el genérico dado. */
|
|
51
|
+
export declare const errorMessage: (err: unknown, fallback: string) => string;
|
|
52
|
+
/** Cliente de las rutas del Generador. Las imágenes viajan en multipart (el JSON admite 1 MB). */
|
|
53
|
+
export declare const createGeneratorApi: (client: Client) => {
|
|
54
|
+
models(): Promise<{
|
|
55
|
+
models: ImageModelInfo[];
|
|
56
|
+
verified: boolean;
|
|
57
|
+
}>;
|
|
58
|
+
generate(p: GenerateParams): Promise<{
|
|
59
|
+
grounding?: Grounding | undefined;
|
|
60
|
+
src: string;
|
|
61
|
+
model: string;
|
|
62
|
+
}>;
|
|
63
|
+
edit(p: EditParams): Promise<{
|
|
64
|
+
grounding?: Grounding | undefined;
|
|
65
|
+
src: string;
|
|
66
|
+
model: string;
|
|
67
|
+
}>;
|
|
68
|
+
expand(prompt: string): Promise<string>;
|
|
69
|
+
};
|
|
70
|
+
export type GeneratorApi = ReturnType<typeof createGeneratorApi>;
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Grounding } from './generatorApi';
|
|
2
|
+
/**
|
|
3
|
+
* Historial de versiones del Generador (diseño S4.2, D10). Vive en memoria como en el prototipo:
|
|
4
|
+
* la persistencia quedó en el parking lot del epic.
|
|
5
|
+
*/
|
|
6
|
+
export interface Version {
|
|
7
|
+
id: string;
|
|
8
|
+
/** Data URL de la imagen. */
|
|
9
|
+
src: string;
|
|
10
|
+
prompt: string;
|
|
11
|
+
/** Instrucción con la que se iteró; vacía en la versión original. */
|
|
12
|
+
instruction?: string;
|
|
13
|
+
/** Fuentes y sugerencia si se generó con búsqueda de Google (S4.14). */
|
|
14
|
+
grounding?: Grounding;
|
|
15
|
+
}
|
|
16
|
+
export interface GeneratorState {
|
|
17
|
+
versions: Version[];
|
|
18
|
+
currentId: string | null;
|
|
19
|
+
}
|
|
20
|
+
export type GeneratorAction = {
|
|
21
|
+
type: 'generated';
|
|
22
|
+
id: string;
|
|
23
|
+
src: string;
|
|
24
|
+
prompt: string;
|
|
25
|
+
grounding?: Grounding;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'iterated';
|
|
28
|
+
id: string;
|
|
29
|
+
src: string;
|
|
30
|
+
instruction: string;
|
|
31
|
+
}
|
|
32
|
+
/** Una imagen existente (subida o de la biblioteca) como Original, para editarla (S4.13). */
|
|
33
|
+
| {
|
|
34
|
+
type: 'loaded';
|
|
35
|
+
id: string;
|
|
36
|
+
src: string;
|
|
37
|
+
name: string;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'select';
|
|
40
|
+
id: string;
|
|
41
|
+
}
|
|
42
|
+
/** «Cambiar imagen» en el modo Editar (S4.13). */
|
|
43
|
+
| {
|
|
44
|
+
type: 'reset';
|
|
45
|
+
};
|
|
46
|
+
export declare const initialGenerator: GeneratorState;
|
|
47
|
+
export declare const currentVersion: (s: GeneratorState) => Version | null;
|
|
48
|
+
export declare const generatorReducer: (state: GeneratorState, action: GeneratorAction) => GeneratorState;
|
|
49
|
+
export declare const versionLabel: (index: number) => string;
|
|
50
|
+
/**
|
|
51
|
+
* «Imagen 28 sep» y, desde la segunda versión, « v3». La fecha se arma a mano: `toLocaleDateString`
|
|
52
|
+
* da «28-sep» o «28 sept» según la versión de ICU del navegador.
|
|
53
|
+
*/
|
|
54
|
+
export declare const defaultSaveName: (date: Date, index: number) => string;
|
|
55
|
+
export declare const ITERATE_EXAMPLES: string[];
|
|
56
|
+
/**
|
|
57
|
+
* La proporción del modelo más cercana a unas medidas (S4.13). Al editar con elementos, Gemini no
|
|
58
|
+
* conserva la proporción de la imagen base, así que se le pide la más parecida.
|
|
59
|
+
*/
|
|
60
|
+
export declare const closestRatio: (width: number, height: number, ratios: string[]) => string | undefined;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Cliente del Generador conectado al panel (sesión y notificaciones de Strapi). */
|
|
2
|
+
export declare const useGeneratorApi: () => {
|
|
3
|
+
api: {
|
|
4
|
+
models(): Promise<{
|
|
5
|
+
models: import("./generatorApi").ImageModelInfo[];
|
|
6
|
+
verified: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
generate(p: import("./generatorApi").GenerateParams): Promise<{
|
|
9
|
+
grounding?: import("./generatorApi").Grounding | undefined;
|
|
10
|
+
src: string;
|
|
11
|
+
model: string;
|
|
12
|
+
}>;
|
|
13
|
+
edit(p: import("./generatorApi").EditParams): Promise<{
|
|
14
|
+
grounding?: import("./generatorApi").Grounding | undefined;
|
|
15
|
+
src: string;
|
|
16
|
+
model: string;
|
|
17
|
+
}>;
|
|
18
|
+
expand(prompt: string): Promise<string>;
|
|
19
|
+
};
|
|
20
|
+
notify: (type: 'success' | 'danger' | 'warning', message: string) => void;
|
|
21
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const STUDIO_TABS: readonly [{
|
|
2
|
+
readonly value: "generator";
|
|
3
|
+
readonly label: "Generador";
|
|
4
|
+
}, {
|
|
5
|
+
readonly value: "templates";
|
|
6
|
+
readonly label: "Plantillas";
|
|
7
|
+
}, {
|
|
8
|
+
readonly value: "library";
|
|
9
|
+
readonly label: "Imágenes y documentos";
|
|
10
|
+
}];
|
|
11
|
+
export type StudioTab = (typeof STUDIO_TABS)[number]['value'];
|
|
12
|
+
/**
|
|
13
|
+
* Rutas anteriores del módulo de imágenes. Redirigen a su pestaña equivalente para no romper
|
|
14
|
+
* enlaces guardados (diseño del epic, Migration Path).
|
|
15
|
+
*/
|
|
16
|
+
export declare const LEGACY_ROUTES: {
|
|
17
|
+
path: string;
|
|
18
|
+
tab: StudioTab;
|
|
19
|
+
}[];
|
|
20
|
+
export declare const legacyRedirect: (tab: StudioTab) => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
/** `/plugins/<id>/image-studio` (S4.4–S4.9) → la entrada propia del menú, conservando `?tab=` (S4.10). */
|
|
22
|
+
export declare const StudioRedirect: () => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
/**
|
|
24
|
+
* Pestañas del Estudio de imágenes. La pestaña activa vive en `?tab=` para que se pueda enlazar.
|
|
25
|
+
*/
|
|
26
|
+
export declare const ImageStudioTabs: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ComponentType, SVGProps } from 'react';
|
|
2
|
+
export interface SegmentedOption<T extends string> {
|
|
3
|
+
value: T;
|
|
4
|
+
label: string;
|
|
5
|
+
Icon: ComponentType<SVGProps<SVGSVGElement>>;
|
|
6
|
+
}
|
|
7
|
+
interface SegmentedSwitchProps<T extends string> {
|
|
8
|
+
label: string;
|
|
9
|
+
options: readonly SegmentedOption<T>[];
|
|
10
|
+
value: T;
|
|
11
|
+
onChange: (value: T) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Control segmentado del Estudio (S4.13, generalizado en S4.18): modos del Generador y de «Quitar fondo».
|
|
15
|
+
* Snowflake: el DS 2.2 no tiene un control segmentado; es un `radiogroup` con los tokens del DS.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SegmentedSwitch: <T extends string>({ label, options, value, onChange }: SegmentedSwitchProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuadrícula de transparencia (fondo CSS): deja ver qué partes no tienen fondo. Siempre clara, como en
|
|
3
|
+
* los editores habituales: en el tema oscuro, una cuadrícula oscura esconde el texto y los logos azul marino.
|
|
4
|
+
*/
|
|
5
|
+
export declare const CHECKERBOARD = "repeating-conic-gradient(#e6e6ec 0% 25%, #ffffff 0% 50%) 50% / 16px 16px";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { LibraryFile } from './uploadApi';
|
|
2
|
+
export type FileAction = 'preview' | 'download' | 'rename' | 'replace' | 'move' | 'removeBackground' | 'delete';
|
|
3
|
+
/** Quitar fondo aplica a mapas de bits: un SVG puede no declarar tamaño y es vectorial. */
|
|
4
|
+
export declare const canRemoveBackground: (f: LibraryFile) => boolean;
|
|
5
|
+
/** Piezas que el plugin generó con IA: el servidor les pone ese caption al subirlas. */
|
|
6
|
+
export declare const isGenerated: (f: LibraryFile) => boolean;
|
|
7
|
+
/** Tamaño en KB (Strapi guarda `size` en KB). */
|
|
8
|
+
export declare const formatSize: (kb?: number) => string;
|
|
9
|
+
interface FileCardProps {
|
|
10
|
+
file: LibraryFile;
|
|
11
|
+
onAction: (action: FileAction, file: LibraryFile) => void;
|
|
12
|
+
/** Avance de «Quitar fondo» sobre este archivo, si está en curso. */
|
|
13
|
+
busy?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Tarjeta de archivo arrastrable a una carpeta del árbol. */
|
|
16
|
+
export declare const FileCard: ({ file, onAction, busy }: FileCardProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FolderCounts } from './uploadApi';
|
|
2
|
+
import type { FolderNode } from './model';
|
|
3
|
+
export declare const FILE_DRAG_TYPE = "application/x-iw-library-file";
|
|
4
|
+
interface FolderTreeProps {
|
|
5
|
+
tree: FolderNode[];
|
|
6
|
+
counts: FolderCounts;
|
|
7
|
+
current: number | null;
|
|
8
|
+
onOpen: (id: number | null) => void;
|
|
9
|
+
/** Soltar un archivo de la grilla sobre una carpeta lo mueve ahí. */
|
|
10
|
+
onDropFile: (fileId: number, folderId: number | null) => void;
|
|
11
|
+
}
|
|
12
|
+
/** Árbol de carpetas con arrastrar y soltar (snowflake: el DS no tiene árbol). */
|
|
13
|
+
export declare const FolderTree: ({ tree, counts, current, onOpen, onDropFile }: FolderTreeProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { FolderNode } from './model';
|
|
3
|
+
interface NameDialogProps {
|
|
4
|
+
open: boolean;
|
|
5
|
+
title: string;
|
|
6
|
+
label: string;
|
|
7
|
+
initial?: string;
|
|
8
|
+
confirmLabel: string;
|
|
9
|
+
/** Devuelve un mensaje de error para mostrar, o `null` si el nombre es válido. */
|
|
10
|
+
validate?: (name: string) => string | null;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
onConfirm: (name: string) => void | Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Pide un nombre (carpeta nueva, renombrar carpeta o archivo). */
|
|
15
|
+
export declare const NameDialog: ({ open, title, label, initial, confirmLabel, validate, onClose, onConfirm }: NameDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
interface ConfirmDialogProps {
|
|
17
|
+
open: boolean;
|
|
18
|
+
title: string;
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
confirmLabel?: string;
|
|
21
|
+
onClose: () => void;
|
|
22
|
+
onConfirm: () => void | Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/** Confirmación de una acción destructiva (DS `Dialog`). */
|
|
25
|
+
export declare const ConfirmDialog: ({ open, title, children, confirmLabel, onClose, onConfirm }: ConfirmDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
interface FolderSelectProps {
|
|
27
|
+
tree: FolderNode[];
|
|
28
|
+
value: number | null;
|
|
29
|
+
onChange: (id: number | null) => void;
|
|
30
|
+
label?: string;
|
|
31
|
+
}
|
|
32
|
+
/** Selector de carpeta con sangría por nivel; la raíz («/») es «Generated». */
|
|
33
|
+
export declare const FolderSelect: ({ tree, value, onChange, label }: FolderSelectProps) => import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
interface MoveDialogProps {
|
|
35
|
+
open: boolean;
|
|
36
|
+
tree: FolderNode[];
|
|
37
|
+
current: number | null;
|
|
38
|
+
onClose: () => void;
|
|
39
|
+
onConfirm: (destination: number | null) => void | Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
/** Elegir la carpeta destino para mover un archivo. */
|
|
42
|
+
export declare const MoveDialog: ({ open, tree, current, onClose, onConfirm }: MoveDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
export declare const EmptyNote: ({ children }: {
|
|
44
|
+
children: React.ReactNode;
|
|
45
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LibraryFile } from './uploadApi';
|
|
2
|
+
interface LibraryImagePickerProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
/** Cuántas se pueden elegir. Con 1, elegir otra reemplaza la anterior. */
|
|
5
|
+
max: number;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
onPick: (files: LibraryFile[]) => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Elegir imágenes de la biblioteca (S4.13, D2): navega las carpetas de «Generated» y muestra solo
|
|
11
|
+
* imágenes. Lo elegido se conserva al cambiar de carpeta. Snowflake: el DS no tiene un selector de
|
|
12
|
+
* archivos con miniaturas.
|
|
13
|
+
*/
|
|
14
|
+
export declare const LibraryImagePicker: ({ open, max, onClose, onPick }: LibraryImagePickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface SaveToLibraryDialogProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
defaultName: string;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onSave: (target: {
|
|
6
|
+
name: string;
|
|
7
|
+
folderId: number | null;
|
|
8
|
+
}) => void | Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Diálogo «Guardar en la biblioteca»: nombre, carpeta y, si hace falta, una subcarpeta nueva. Lo
|
|
12
|
+
* usan el Generador (S4.2) y la exportación del editor (S4.7); la subida la hace quien lo abre.
|
|
13
|
+
*/
|
|
14
|
+
export declare const SaveToLibraryDialog: ({ open, defaultName, onClose, onSave }: SaveToLibraryDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Carpeta de la Media Library tal como la devuelve `GET /upload/folder-structure`. */
|
|
2
|
+
export interface FolderNode {
|
|
3
|
+
id: number;
|
|
4
|
+
name: string;
|
|
5
|
+
children: FolderNode[];
|
|
6
|
+
}
|
|
7
|
+
export interface FlatFolder {
|
|
8
|
+
id: number;
|
|
9
|
+
name: string;
|
|
10
|
+
parentId: number | null;
|
|
11
|
+
depth: number;
|
|
12
|
+
}
|
|
13
|
+
/** Carpetas en orden de árbol (padre antes que hijas) con su padre y profundidad. */
|
|
14
|
+
export declare const flattenTree: (tree: FolderNode[], parentId?: number | null, depth?: number) => FlatFolder[];
|
|
15
|
+
/** Ruta desde la raíz hasta la carpeta (vacía para la raíz o un id inexistente). */
|
|
16
|
+
export declare const pathTo: (tree: FolderNode[], id: number | null) => FolderNode[];
|
|
17
|
+
/** Subcarpetas de una carpeta, o las de la raíz con `null`. */
|
|
18
|
+
export declare const childrenOf: (tree: FolderNode[], id: number | null) => FolderNode[];
|
|
19
|
+
/** Nombre de carpeta limpio: sin espacios sobrantes ni diagonales (Strapi las usa en rutas). */
|
|
20
|
+
export declare const cleanFolderName: (name: string) => string;
|
|
21
|
+
/** ¿Ya existe una carpeta hermana con ese nombre? Sin distinguir mayúsculas ni espacios. */
|
|
22
|
+
export declare const nameTaken: (tree: FolderNode[], parentId: number | null, name: string) => boolean;
|
|
23
|
+
export interface DeletePlan {
|
|
24
|
+
move: {
|
|
25
|
+
destinationFolderId: number | null;
|
|
26
|
+
fileIds: number[];
|
|
27
|
+
folderIds: number[];
|
|
28
|
+
} | null;
|
|
29
|
+
remove: number[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Plan para eliminar una carpeta sin perder archivos. En Strapi 5.51 borrar una carpeta borra sus
|
|
33
|
+
* archivos, así que primero se mueven archivos y subcarpetas a la carpeta superior (o a la raíz) y
|
|
34
|
+
* después se borra la carpeta, ya vacía (diseño S4.3, D1).
|
|
35
|
+
*/
|
|
36
|
+
export declare const safeDeletePlan: (tree: FolderNode[], folderId: number, fileIds: number[]) => DeletePlan | null;
|
|
37
|
+
/** «retrato.jpg» → «retrato (sin fondo).png»: la copia sin fondo siempre es PNG con transparencia. */
|
|
38
|
+
export declare const noBackgroundName: (name: string) => string;
|
|
39
|
+
/** Los tipos de imagen que acepta Gemini; la biblioteca también guarda documentos (S4.13, D1). */
|
|
40
|
+
export declare const IMAGE_MIMES: string[];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UploadApi } from './uploadApi';
|
|
2
|
+
/** Carpeta de la Media Library que el Estudio usa como raíz (decisión de Israel, S4.11). */
|
|
3
|
+
export declare const STUDIO_ROOT = "Generated";
|
|
4
|
+
/** Cómo se muestra la raíz en el Estudio: es la raíz de su biblioteca, aunque sea «Generated» (S4.14). */
|
|
5
|
+
export declare const ROOT_LABEL = "/";
|
|
6
|
+
/**
|
|
7
|
+
* La API de la biblioteca con una carpeta como raíz: `getTree` devuelve sus subcarpetas y cada
|
|
8
|
+
* `null` («la raíz») se traduce a su id, así que nada se sube, crea ni mueve fuera de ella. La
|
|
9
|
+
* carpeta se busca (o se crea) una vez por instancia.
|
|
10
|
+
*/
|
|
11
|
+
export declare const scopeToFolder: (base: UploadApi, rootName: string) => UploadApi;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { FolderNode } from './model';
|
|
2
|
+
/** Subconjunto de `useFetchClient` de Strapi que usa la biblioteca (inyectado para probar). */
|
|
3
|
+
export interface UploadClient {
|
|
4
|
+
get: (url: string, config?: {
|
|
5
|
+
params?: Record<string, unknown>;
|
|
6
|
+
}) => Promise<{
|
|
7
|
+
data: any;
|
|
8
|
+
}>;
|
|
9
|
+
post: (url: string, body?: unknown) => Promise<{
|
|
10
|
+
data: any;
|
|
11
|
+
}>;
|
|
12
|
+
put: (url: string, body?: unknown) => Promise<{
|
|
13
|
+
data: any;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export interface LibraryFile {
|
|
17
|
+
id: number;
|
|
18
|
+
documentId?: string;
|
|
19
|
+
name: string;
|
|
20
|
+
url?: string;
|
|
21
|
+
mime?: string;
|
|
22
|
+
ext?: string;
|
|
23
|
+
size?: number;
|
|
24
|
+
width?: number;
|
|
25
|
+
height?: number;
|
|
26
|
+
caption?: string | null;
|
|
27
|
+
alternativeText?: string | null;
|
|
28
|
+
folder?: {
|
|
29
|
+
id: number;
|
|
30
|
+
} | null;
|
|
31
|
+
formats?: Record<string, {
|
|
32
|
+
url: string;
|
|
33
|
+
}> | null;
|
|
34
|
+
updatedAt?: string;
|
|
35
|
+
}
|
|
36
|
+
export type FolderCounts = Record<number, {
|
|
37
|
+
files: number;
|
|
38
|
+
children: number;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Cliente de la API de administración de upload de Strapi 5.51 (ADR-002). La biblioteca no tiene
|
|
42
|
+
* endpoints propios: los permisos y el cálculo de rutas de carpetas son los de la Media Library.
|
|
43
|
+
*/
|
|
44
|
+
export declare const createUploadApi: (client: UploadClient) => {
|
|
45
|
+
getTree(): Promise<FolderNode[]>;
|
|
46
|
+
getCounts(): Promise<FolderCounts>;
|
|
47
|
+
/** Archivos de una carpeta; con `mimes`, solo esos tipos (el selector de imágenes, S4.13). */
|
|
48
|
+
listFiles(folderId: number | null, { mimes }?: {
|
|
49
|
+
mimes?: string[];
|
|
50
|
+
}): Promise<LibraryFile[]>;
|
|
51
|
+
/** Las más recientes de varias carpetas a la vez («Recientes» del Generador, S4.14). */
|
|
52
|
+
listRecent({ folderIds, mimes, limit }: {
|
|
53
|
+
folderIds: number[];
|
|
54
|
+
mimes?: string[];
|
|
55
|
+
limit: number;
|
|
56
|
+
}): Promise<LibraryFile[]>;
|
|
57
|
+
createFolder(name: string, parent: number | null): Promise<FolderNode>;
|
|
58
|
+
renameFolder(id: number, name: string, parent: number | null): Promise<void>;
|
|
59
|
+
uploadFiles(files: File[], folderId: number | null): Promise<LibraryFile[]>;
|
|
60
|
+
renameFile(file: Pick<LibraryFile, 'id' | 'name' | 'folder' | 'alternativeText' | 'caption'>, name: string): Promise<void>;
|
|
61
|
+
replaceFile(id: number, file: File): Promise<void>;
|
|
62
|
+
move({ fileIds, folderIds }: {
|
|
63
|
+
fileIds?: number[];
|
|
64
|
+
folderIds?: number[];
|
|
65
|
+
}, destinationFolderId: number | null): Promise<void>;
|
|
66
|
+
remove({ fileIds, folderIds }: {
|
|
67
|
+
fileIds?: number[];
|
|
68
|
+
folderIds?: number[];
|
|
69
|
+
}): Promise<void>;
|
|
70
|
+
/** Elimina una carpeta dejando sus archivos y subcarpetas en la carpeta superior (D1). */
|
|
71
|
+
deleteFolderSafely: (tree: FolderNode[], folderId: number) => Promise<void>;
|
|
72
|
+
};
|
|
73
|
+
type FolderOps = Pick<ReturnType<typeof createUploadApi>, 'listFiles' | 'move' | 'remove'>;
|
|
74
|
+
/** Plan de `safeDeletePlan` ejecutado con las operaciones dadas (las de la raíz del Estudio, S4.11). */
|
|
75
|
+
export declare const deleteFolderSafely: (api: FolderOps, tree: FolderNode[], folderId: number) => Promise<void>;
|
|
76
|
+
export type UploadApi = ReturnType<typeof createUploadApi>;
|
|
77
|
+
export {};
|