@interware/content-generator 0.4.3 → 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-oubMDdAZ.mjs → App-DPVBu7QB.mjs} +37 -712
- package/dist/_chunks/{App-DmCOiKrV.js → App-DVTFrZvf.js} +31 -706
- 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-DwDV99gW.js → getTranslation-D88uLXGd.js} +1 -1
- package/dist/_chunks/{getTranslation-B0tfTODk.mjs → getTranslation-DfxaP_TC.mjs} +1 -1
- package/dist/_chunks/{index-PnmqwUfI.mjs → index-CqDdi211.mjs} +25 -7
- package/dist/_chunks/{index-CTnsB_jp.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 +2439 -1247
- package/dist/server/index.mjs +2446 -1253
- 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 +1 -5
- package/dist/server/src/controllers/image-studio.d.ts +23 -0
- package/dist/server/src/controllers/index.d.ts +129 -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 +231 -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 +28 -57
- package/dist/server/src/services/service.d.ts +1 -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-APrsjya3.js +0 -262
- package/dist/_chunks/Settings-BevnW4cE.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 -11
- package/dist/admin/src/pages/GenerateImage.d.ts +0 -2
- package/dist/admin/src/pages/GenerateImages.d.ts +0 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { LibraryFile } from './uploadApi';
|
|
2
|
+
/** Cliente de la biblioteca conectado al panel (sesión y notificaciones de Strapi), con raíz en «Generated». */
|
|
3
|
+
export declare const useLibraryApi: () => {
|
|
4
|
+
api: {
|
|
5
|
+
dataUrlOf: (file: LibraryFile) => Promise<string>;
|
|
6
|
+
download: (file: LibraryFile) => Promise<void>;
|
|
7
|
+
saveBlob: (blob: Blob, name: string, folderId: number | null) => Promise<LibraryFile[]>;
|
|
8
|
+
getTree(): Promise<import("./model").FolderNode[]>;
|
|
9
|
+
getCounts(): Promise<import("./uploadApi").FolderCounts>;
|
|
10
|
+
listFiles(folderId: number | null, { mimes }?: {
|
|
11
|
+
mimes?: string[] | undefined;
|
|
12
|
+
}): Promise<LibraryFile[]>;
|
|
13
|
+
listRecent({ folderIds, mimes, limit }: {
|
|
14
|
+
folderIds: number[];
|
|
15
|
+
mimes?: string[] | undefined;
|
|
16
|
+
limit: number;
|
|
17
|
+
}): Promise<LibraryFile[]>;
|
|
18
|
+
createFolder(name: string, parent: number | null): Promise<import("./model").FolderNode>;
|
|
19
|
+
renameFolder(id: number, name: string, parent: number | null): Promise<void>;
|
|
20
|
+
uploadFiles(files: File[], folderId: number | null): Promise<LibraryFile[]>;
|
|
21
|
+
renameFile(file: Pick<LibraryFile, "caption" | "id" | "name" | "folder" | "alternativeText">, name: string): Promise<void>;
|
|
22
|
+
replaceFile(id: number, file: File): Promise<void>;
|
|
23
|
+
move({ fileIds, folderIds }: {
|
|
24
|
+
fileIds?: number[] | undefined;
|
|
25
|
+
folderIds?: number[] | undefined;
|
|
26
|
+
}, destinationFolderId: number | null): Promise<void>;
|
|
27
|
+
remove({ fileIds, folderIds }: {
|
|
28
|
+
fileIds?: number[] | undefined;
|
|
29
|
+
folderIds?: number[] | undefined;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
deleteFolderSafely: (tree: import("./model").FolderNode[], folderId: number) => Promise<void>;
|
|
32
|
+
};
|
|
33
|
+
notify: (type: 'success' | 'danger' | 'warning', message: string) => void;
|
|
34
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface ColorFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
onChange: (value: string) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Selector de color (snowflake: el DS no tiene uno). Muestras de la paleta InterWare y, para casos
|
|
8
|
+
* puntuales, el selector nativo del navegador.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ColorField: ({ label, value, onChange }: ColorFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ImageLayer, Layer, Template } from '../model/types';
|
|
2
|
+
import type { FontDef } from '../fonts/catalog';
|
|
3
|
+
interface EditorProps {
|
|
4
|
+
template: Template;
|
|
5
|
+
onBack: () => void;
|
|
6
|
+
/** Tras «Guardar como»: el template creado y las capas actuales (con sus data URL) para seguir editando. */
|
|
7
|
+
onSaved?: (template: Template, layers: Layer[]) => void;
|
|
8
|
+
/** Sube una fuente propia y la devuelve registrada (S4.16); sin ella no se ofrece «Subir fuente». */
|
|
9
|
+
uploadFont?: (file: File) => Promise<FontDef | null>;
|
|
10
|
+
}
|
|
11
|
+
/** Capa de imagen centrada, a lo más 40% del ancho de la pieza. */
|
|
12
|
+
export declare const imageLayerFor: (image: {
|
|
13
|
+
src: string;
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
}, template: Template, layers: Layer[], id: string) => ImageLayer;
|
|
17
|
+
/** Editor de una plantilla: barra de herramientas y lienzo. El estado vive en `editorReducer`. */
|
|
18
|
+
export declare const Editor: ({ template, onBack, onSaved, uploadFont }: EditorProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Franja de las barras del editor (menús y herramientas): mismo fondo, espaciado y borde inferior
|
|
4
|
+
* para que se lean como un solo encabezado a todo lo ancho.
|
|
5
|
+
*/
|
|
6
|
+
export declare const EditorBar: ({ label, children }: {
|
|
7
|
+
label: string;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ExportFormat } from '../export/render';
|
|
2
|
+
import type { ViewOptions } from './Precision';
|
|
3
|
+
type Keys = {
|
|
4
|
+
key: string;
|
|
5
|
+
mod?: boolean;
|
|
6
|
+
shift?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/** «⇧⌘Z» en macOS, «Ctrl+Shift+Z» en los demás (diseño S4.9, D5). */
|
|
9
|
+
export declare const shortcutLabel: ({ key, mod, shift }: Keys, isMac: boolean) => string;
|
|
10
|
+
export declare const detectMac: () => boolean;
|
|
11
|
+
export interface MenuBarActions {
|
|
12
|
+
back: () => void;
|
|
13
|
+
save: () => void;
|
|
14
|
+
saveAs: () => void;
|
|
15
|
+
exportAs: (format: ExportFormat) => void;
|
|
16
|
+
saveToLibrary: () => void;
|
|
17
|
+
reset: () => void;
|
|
18
|
+
undo: () => void;
|
|
19
|
+
redo: () => void;
|
|
20
|
+
duplicate: () => void;
|
|
21
|
+
remove: () => void;
|
|
22
|
+
toggleLock: () => void;
|
|
23
|
+
reorder: (to: 'front' | 'back' | 'up' | 'down') => void;
|
|
24
|
+
toggleView: (key: keyof ViewOptions) => void;
|
|
25
|
+
togglePanel: (side: 'left' | 'right') => void;
|
|
26
|
+
fit: () => void;
|
|
27
|
+
zoom100: () => void;
|
|
28
|
+
fullscreen: () => void;
|
|
29
|
+
}
|
|
30
|
+
interface EditorMenuBarProps {
|
|
31
|
+
name: string;
|
|
32
|
+
onRename: (name: string) => void;
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
dirty: boolean;
|
|
36
|
+
own: boolean;
|
|
37
|
+
saving: boolean;
|
|
38
|
+
exporting: boolean;
|
|
39
|
+
canUndo: boolean;
|
|
40
|
+
canRedo: boolean;
|
|
41
|
+
selection: {
|
|
42
|
+
locked: boolean;
|
|
43
|
+
} | null;
|
|
44
|
+
view: ViewOptions;
|
|
45
|
+
panels: {
|
|
46
|
+
left: boolean;
|
|
47
|
+
right: boolean;
|
|
48
|
+
};
|
|
49
|
+
isMac: boolean;
|
|
50
|
+
actions: MenuBarActions;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Barra de menús del editor (diseño S4.9, D1–D5): título y medidas, «Sin guardar», menús Archivo,
|
|
54
|
+
* Edición y Vista con el `Menu` compuesto del DS (etiquetas, separadores, submenú de exportación y
|
|
55
|
+
* atajos como `endIcon`) y la acción principal a la derecha.
|
|
56
|
+
*/
|
|
57
|
+
export declare const EditorMenuBar: (p: EditorMenuBarProps) => import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface EditorToolbarProps {
|
|
2
|
+
canUndo: boolean;
|
|
3
|
+
canRedo: boolean;
|
|
4
|
+
panels: {
|
|
5
|
+
left: boolean;
|
|
6
|
+
right: boolean;
|
|
7
|
+
};
|
|
8
|
+
scale: number;
|
|
9
|
+
isFit: boolean;
|
|
10
|
+
onUndo: () => void;
|
|
11
|
+
onRedo: () => void;
|
|
12
|
+
onTogglePanel: (side: 'left' | 'right') => void;
|
|
13
|
+
onFullscreen: () => void;
|
|
14
|
+
onZoomBy: (delta: number) => void;
|
|
15
|
+
onZoomTo: (scale: number) => void;
|
|
16
|
+
onFit: () => void;
|
|
17
|
+
}
|
|
18
|
+
/** Barra de herramientas (diseño S4.9, D6): grupos de `IconButton` con tooltip y controles de zoom. */
|
|
19
|
+
export declare const EditorToolbar: (p: EditorToolbarProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ElementPreset } from '../model/presets';
|
|
2
|
+
interface ElementPaletteProps {
|
|
3
|
+
onAdd: (preset: ElementPreset) => void;
|
|
4
|
+
onUploadImage: (file: File) => void;
|
|
5
|
+
/** Abre el selector de la biblioteca; reemplaza al campo de URL (S4.13). */
|
|
6
|
+
onPickFromLibrary: () => void;
|
|
7
|
+
}
|
|
8
|
+
/** Elementos que se pueden agregar a la pieza (snowflake: rejilla de mosaicos). */
|
|
9
|
+
export declare const ElementPalette: ({ onAdd, onUploadImage, onPickFromLibrary }: ElementPaletteProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export declare const PANEL_GAP = 12;
|
|
3
|
+
export declare const STRIP = 36;
|
|
4
|
+
interface FloatingPanelProps {
|
|
5
|
+
side: 'left' | 'right';
|
|
6
|
+
title: string;
|
|
7
|
+
width: number;
|
|
8
|
+
open: boolean;
|
|
9
|
+
onToggle: () => void;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Panel flotante sobre el escenario (diseño S4.9, D7). Snowflake: el DS no tiene paneles laterales
|
|
14
|
+
* colapsables. Oculto deja una tira vertical para volver a abrirlo.
|
|
15
|
+
*/
|
|
16
|
+
export declare const FloatingPanel: ({ side, title, width, open, onToggle, children }: FloatingPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Layer, Template } from '../model/types';
|
|
2
|
+
/**
|
|
3
|
+
* Pantalla completa (diseño S4.5, D9): solo la pieza sobre fondo oscuro. Pide el modo nativo del
|
|
4
|
+
* navegador si existe; si lo niega, la vista funciona igual como capa fija. Esc, clic fuera o salir
|
|
5
|
+
* del modo nativo la cierran.
|
|
6
|
+
*/
|
|
7
|
+
export declare const FullscreenView: ({ template, layers, onClose }: {
|
|
8
|
+
template: Template;
|
|
9
|
+
layers: Layer[];
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface IconPickerProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
value: string;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onPick: (icon: string) => void;
|
|
6
|
+
}
|
|
7
|
+
/** Selector de íconos de contenido (rejilla dentro de un Modal del DS). */
|
|
8
|
+
export declare const IconPicker: ({ open, value, onClose, onPick }: IconPickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Layer, LayerPatch } from '../model/types';
|
|
2
|
+
interface InspectorProps {
|
|
3
|
+
layer: Layer;
|
|
4
|
+
onUpdate: (patch: LayerPatch) => void;
|
|
5
|
+
onRemove: () => void;
|
|
6
|
+
onDuplicate: () => void;
|
|
7
|
+
onReorder: (to: 'front' | 'back' | 'up' | 'down') => void;
|
|
8
|
+
onToggleBackground: () => void;
|
|
9
|
+
/** Cambiar la imagen de la capa sin moverla (S4.13). */
|
|
10
|
+
onReplaceFile: (file: File) => void;
|
|
11
|
+
onReplaceFromLibrary: () => void;
|
|
12
|
+
/** Subir una fuente propia desde el selector de tipografía (S4.16). */
|
|
13
|
+
onUploadFont?: () => void;
|
|
14
|
+
}
|
|
15
|
+
/** Propiedades de la capa seleccionada, según su tipo. */
|
|
16
|
+
export declare const Inspector: ({ layer: l, onUpdate, onRemove, onDuplicate, onReorder, onToggleBackground, onReplaceFile, onReplaceFromLibrary, onUploadFont }: InspectorProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Layer, LayerPatch } from '../model/types';
|
|
2
|
+
interface LayersPanelProps {
|
|
3
|
+
layers: Layer[];
|
|
4
|
+
selectedId: string | null;
|
|
5
|
+
onSelect: (id: string) => void;
|
|
6
|
+
onUpdate: (id: string, patch: LayerPatch) => void;
|
|
7
|
+
onRemove: (id: string) => void;
|
|
8
|
+
onMoveTo: (id: string, targetId: string, place: 'above' | 'below') => void;
|
|
9
|
+
}
|
|
10
|
+
/** Panel de capas con la del frente arriba; filas con arrastre para reordenar (snowflake). */
|
|
11
|
+
export declare const LayersPanel: ({ layers, selectedId, onSelect, onUpdate, onRemove, onMoveTo }: LayersPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Layer } from '../model/types';
|
|
2
|
+
export interface ViewOptions {
|
|
3
|
+
grid: boolean;
|
|
4
|
+
safe: boolean;
|
|
5
|
+
rulers: boolean;
|
|
6
|
+
snap: boolean;
|
|
7
|
+
guides: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Valores del prototipo: reglas y guías activas; el resto apagado. */
|
|
10
|
+
export declare const DEFAULT_VIEW: ViewOptions;
|
|
11
|
+
interface SafeAreaPanelProps {
|
|
12
|
+
show: boolean;
|
|
13
|
+
margin: number;
|
|
14
|
+
original: number;
|
|
15
|
+
max: number;
|
|
16
|
+
violations: Layer[];
|
|
17
|
+
onShow: (show: boolean) => void;
|
|
18
|
+
onMargin: (value: number) => void;
|
|
19
|
+
onSelect: (id: string) => void;
|
|
20
|
+
}
|
|
21
|
+
/** Área segura: mostrar, ajustar el margen, restablecer y ver qué capas salen (diseño S4.5, D8). */
|
|
22
|
+
export declare const SafeAreaPanel: ({ show, margin, original, max, violations, onShow, onMargin, onSelect }: SafeAreaPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface RangeFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value: number;
|
|
4
|
+
min: number;
|
|
5
|
+
max: number;
|
|
6
|
+
step?: number;
|
|
7
|
+
onChange: (value: number) => void;
|
|
8
|
+
format?: (value: number) => string;
|
|
9
|
+
}
|
|
10
|
+
/** Control deslizante (snowflake: el DS no tiene *range*). */
|
|
11
|
+
export declare const RangeField: ({ label, value, min, max, step, onChange, format }: RangeFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface SaveTemplateDialogProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
defaultName: string;
|
|
4
|
+
defaultFolder: string;
|
|
5
|
+
folders: string[];
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
onSave: (target: {
|
|
8
|
+
name: string;
|
|
9
|
+
folder: string;
|
|
10
|
+
}) => void | Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/** «Guardar como template…»: nombre, carpeta y, opcional, una carpeta nueva dentro (diseño S4.6, D11). */
|
|
13
|
+
export declare const SaveTemplateDialog: ({ open, defaultName, defaultFolder, folders, onClose, onSave }: SaveTemplateDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Layer, LayerPatch, Template } from '../model/types';
|
|
2
|
+
interface StageProps {
|
|
3
|
+
template: Template;
|
|
4
|
+
layers: Layer[];
|
|
5
|
+
selectedId: string | null;
|
|
6
|
+
/** Escala de presentación del lienzo. */
|
|
7
|
+
scale: number;
|
|
8
|
+
onSelect: (id: string | null) => void;
|
|
9
|
+
/** `transient` = parte de un gesto en curso; el gesto termina con `onCommit`. */
|
|
10
|
+
onChange: (id: string, patch: LayerPatch, transient: boolean) => void;
|
|
11
|
+
onCommit: () => void;
|
|
12
|
+
/** Ajuste al arrastrar: unidad de cuadrícula (o `null`) y guías inteligentes (diseño S4.5, D2). */
|
|
13
|
+
precision?: {
|
|
14
|
+
grid: number | null;
|
|
15
|
+
guides: boolean;
|
|
16
|
+
};
|
|
17
|
+
overlays?: {
|
|
18
|
+
grid?: boolean;
|
|
19
|
+
safe?: boolean;
|
|
20
|
+
rulers?: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Lienzo interactivo (snowflake: el DS no tiene un escenario de edición). Pinta la pieza con el
|
|
25
|
+
* mismo `LayerCanvas` de la exportación y encima una capa de cajas para seleccionar, mover y
|
|
26
|
+
* redimensionar. Un arrastre emite cambios transitorios y termina en un solo `onCommit`.
|
|
27
|
+
*/
|
|
28
|
+
export declare const Stage: ({ template, layers, selectedId, scale, onSelect, onChange, onCommit, precision, overlays }: StageProps) => import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface TemplateFolderSelectProps {
|
|
2
|
+
folders: string[];
|
|
3
|
+
value: string;
|
|
4
|
+
onChange: (path: string) => void;
|
|
5
|
+
label?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Carpetas de «Mis templates» (rutas) con sangría por nivel; `''` es la raíz. */
|
|
8
|
+
export declare const TemplateFolderSelect: ({ folders, value, onChange, label }: TemplateFolderSelectProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Template } from '../model/types';
|
|
2
|
+
interface TemplatePickerProps {
|
|
3
|
+
bases: Template[];
|
|
4
|
+
mine: Template[];
|
|
5
|
+
folders: string[];
|
|
6
|
+
onOpen: (template: Template) => void;
|
|
7
|
+
onCreateBlank: (width: number, height: number) => void;
|
|
8
|
+
onRename: (template: Template, name: string) => void;
|
|
9
|
+
onDuplicate: (template: Template) => void;
|
|
10
|
+
onMove: (template: Template, folder: string) => void;
|
|
11
|
+
onDelete: (template: Template) => void;
|
|
12
|
+
onCreateFolder: (parent: string, name: string) => void;
|
|
13
|
+
onRenameFolder: (path: string, name: string) => void;
|
|
14
|
+
onDeleteFolder: (path: string) => void;
|
|
15
|
+
/** Vuelve una base editada a la versión de InterWare (S4.15). */
|
|
16
|
+
onRestoreBase: (template: Template) => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Selector de plantillas (diseño S4.6, D10): lienzo en blanco con tamaños predefinidos, «Mis
|
|
20
|
+
* templates» por carpetas y las plantillas base. Presentacional: las operaciones llegan por props.
|
|
21
|
+
*/
|
|
22
|
+
export declare const TemplatePicker: (p: TemplatePickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pestaña Plantillas: selector (lienzo en blanco, «Mis templates», bases) o el editor abierto. Un
|
|
3
|
+
* template propio se abre con sus imágenes convertidas a data URL (diseño S4.6, D7).
|
|
4
|
+
*/
|
|
5
|
+
export declare const TemplatesTab: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LayerPatch } from '../model/types';
|
|
2
|
+
type Align = 'left' | 'center' | 'right';
|
|
3
|
+
interface TypographyLayer {
|
|
4
|
+
font?: string;
|
|
5
|
+
fontSize: number;
|
|
6
|
+
fontWeight: number;
|
|
7
|
+
fontStyle?: 'normal' | 'italic';
|
|
8
|
+
textAlign?: Align;
|
|
9
|
+
}
|
|
10
|
+
interface TypographyControlsProps {
|
|
11
|
+
layer: TypographyLayer;
|
|
12
|
+
/** Solo las capas de texto se alinean; lista, cita y etiqueta no. */
|
|
13
|
+
alignable: boolean;
|
|
14
|
+
onUpdate: (patch: LayerPatch) => void;
|
|
15
|
+
/** Subir una fuente propia (S4.16, D4). */
|
|
16
|
+
onUploadFont?: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Controles de texto como los de los editores habituales (S4.16, D6): tipografía con vista previa,
|
|
20
|
+
* peso según la fuente, tamaño con − / campo / + sobre la escala estándar, negritas y cursivas como
|
|
21
|
+
* toggles y alineación con íconos.
|
|
22
|
+
*/
|
|
23
|
+
export declare const TypographyControls: ({ layer: l, alignable, onUpdate, onUploadFont }: TypographyControlsProps) => import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ComponentType, SVGProps } from 'react';
|
|
2
|
+
import type { LayerType } from '../model/types';
|
|
3
|
+
type IconComponent = ComponentType<SVGProps<SVGSVGElement>>;
|
|
4
|
+
/** Íconos de interfaz del editor (paleta de elementos y panel de capas). */
|
|
5
|
+
export declare const UI_ICONS: Record<string, IconComponent>;
|
|
6
|
+
export declare const LAYER_ICONS: Record<LayerType, IconComponent>;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const GridOverlay: ({ w, h, unit, scale }: {
|
|
2
|
+
w: number;
|
|
3
|
+
h: number;
|
|
4
|
+
unit: number;
|
|
5
|
+
scale: number;
|
|
6
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare const SafeAreaOverlay: ({ w, h, margin, scale }: {
|
|
8
|
+
w: number;
|
|
9
|
+
h: number;
|
|
10
|
+
margin: number;
|
|
11
|
+
scale: number;
|
|
12
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare const RULER = 24;
|
|
14
|
+
/** Reglas superior e izquierda con marcas cada `unit` px del lienzo y media marca intermedia. */
|
|
15
|
+
export declare const Rulers: ({ w, h, scale, unit }: {
|
|
16
|
+
w: number;
|
|
17
|
+
h: number;
|
|
18
|
+
scale: number;
|
|
19
|
+
unit?: number;
|
|
20
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MouseEvent as ReactMouseEvent, RefObject } from 'react';
|
|
2
|
+
import type { View } from '../model/viewport';
|
|
3
|
+
/**
|
|
4
|
+
* Navegación del lienzo (diseño S4.9, D8–D11). «Ajustar» calcula la vista con el espacio libre
|
|
5
|
+
* entre paneles; cualquier paneo o zoom pasa a una vista manual.
|
|
6
|
+
* - Rueda nativa `{ passive: false }`: con Ctrl/⌘ (el pellizco del trackpad llega así) hace zoom
|
|
7
|
+
* hacia el cursor; sin modificador desplaza (dos dedos).
|
|
8
|
+
* - Arrastre del fondo, Espacio + arrastrar y botón central desplazan.
|
|
9
|
+
*/
|
|
10
|
+
export declare const useCanvasNav: (viewport: RefObject<HTMLElement>, piece: {
|
|
11
|
+
w: number;
|
|
12
|
+
h: number;
|
|
13
|
+
}, insets: {
|
|
14
|
+
left: number;
|
|
15
|
+
right: number;
|
|
16
|
+
}, rulers: number) => {
|
|
17
|
+
view: View;
|
|
18
|
+
isFit: boolean;
|
|
19
|
+
spaceDown: boolean;
|
|
20
|
+
panning: boolean;
|
|
21
|
+
startPan: (e: ReactMouseEvent) => void;
|
|
22
|
+
fit: () => void;
|
|
23
|
+
zoomTo: (scale: number) => void;
|
|
24
|
+
zoomBy: (delta: number) => void;
|
|
25
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FontDef } from '../fonts/catalog';
|
|
2
|
+
import type { Layer } from '../model/types';
|
|
3
|
+
type WithLayers = {
|
|
4
|
+
layers?: Layer[];
|
|
5
|
+
};
|
|
6
|
+
type Fetcher = (url: string) => Promise<Blob>;
|
|
7
|
+
/**
|
|
8
|
+
* Fuentes que usa una pieza (S4.16, D5): las de sus capas con texto, Inter (la base del lienzo) y
|
|
9
|
+
* Texta si lleva el logo (su palabra va en Texta).
|
|
10
|
+
*/
|
|
11
|
+
export declare const usedFonts: (template: WithLayers) => FontDef[];
|
|
12
|
+
/**
|
|
13
|
+
* `@font-face` de las fuentes dadas con cada archivo incrustado como data URL. Se pasa a
|
|
14
|
+
* html-to-image como `fontEmbedCSS` para que no recorra las hojas de estilo del panel: al hacerlo
|
|
15
|
+
* intenta descargar fuentes de otros dominios (Font Awesome), la CSP del admin lo bloquea y la
|
|
16
|
+
* exportación se queda colgada. Una fuente que no se pueda descargar se omite (la pieza cae a la
|
|
17
|
+
* fuente de respaldo); las subidas ya vienen como data URL.
|
|
18
|
+
*/
|
|
19
|
+
export declare const buildFontEmbedCss: (fonts: FontDef[], fetcher?: Fetcher) => Promise<string>;
|
|
20
|
+
/** `@font-face` incrustado de las fuentes de la pieza; cada fuente se descarga una vez por sesión. */
|
|
21
|
+
export declare const getFontEmbedCss: (template: WithLayers) => Promise<string>;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type Post = (url: string, body: {
|
|
2
|
+
url: string;
|
|
3
|
+
}) => Promise<{
|
|
4
|
+
data: {
|
|
5
|
+
base64: string;
|
|
6
|
+
contentType: string;
|
|
7
|
+
};
|
|
8
|
+
}>;
|
|
9
|
+
export declare const DOWNLOAD_PROXY = "/strapi-content-generator-gemini/download-file";
|
|
10
|
+
/**
|
|
11
|
+
* Convierte una imagen en data URL para que pueda entrar al lienzo y exportarse. El bucket S3 no
|
|
12
|
+
* tiene CORS para el panel: sin esto el lienzo queda contaminado y la exportación falla (diseño
|
|
13
|
+
* S4.4, D4). Las imágenes remotas pasan por el proxy autenticado del plugin.
|
|
14
|
+
*/
|
|
15
|
+
export declare const toDataUrl: (src: string, post: Post, origin?: string) => Promise<string>;
|
|
16
|
+
/** Mide una imagen a partir de su URL (se usa con data URLs). */
|
|
17
|
+
export declare const measureImage: (src: string) => Promise<{
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
}>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF 1.4 de una página con un JPEG a página completa (diseño S4.7, D3). La página mide lo mismo
|
|
3
|
+
* que la pieza a 96 ppp (px × 0.75 = pt). El JPEG se incrusta tal cual con `DCTDecode`: no se
|
|
4
|
+
* decodifica ni se recomprime.
|
|
5
|
+
*/
|
|
6
|
+
export declare const buildPdf: (jpeg: Uint8Array, width: number, height: number) => Uint8Array;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Layer } from '../model/types';
|
|
2
|
+
export type ExportFormat = 'png' | 'jpg' | 'svg' | 'pdf';
|
|
3
|
+
export declare const FORMAT_LABELS: Record<ExportFormat, string>;
|
|
4
|
+
/** «Story / Reels», 'png' → «story-reels.png». */
|
|
5
|
+
export declare const fileNameFor: (name: string, ext: ExportFormat) => string;
|
|
6
|
+
/** Color de relleno del JPEG: el de la plantilla si es sólido; con degradado, blanco. */
|
|
7
|
+
export declare const jpegBackground: (background: string) => string;
|
|
8
|
+
/**
|
|
9
|
+
* Renderiza la pieza (el nodo `data-export-root`) a su tamaño real en el formato pedido. Quita la
|
|
10
|
+
* escala de presentación del lienzo, espera a las fuentes de marca y las incrusta sin recorrer las
|
|
11
|
+
* hojas de estilo del panel (ver `fontEmbed.ts`). El PDF se arma con el JPEG (diseño S4.7, D3).
|
|
12
|
+
*/
|
|
13
|
+
export declare const renderPiece: (node: HTMLElement, tpl: {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
background: string;
|
|
17
|
+
layers?: Layer[];
|
|
18
|
+
}, format: ExportFormat, { timeoutMs }?: {
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
}) => Promise<Blob>;
|
|
21
|
+
/** Descarga un blob con el nombre dado. */
|
|
22
|
+
export declare const downloadBlob: (blob: Blob, name: string) => void;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ExportFormat } from './render';
|
|
2
|
+
import type { Template } from '../model/types';
|
|
3
|
+
/**
|
|
4
|
+
* Entrada y salida del editor que dependen del panel de Strapi (cliente autenticado, biblioteca y
|
|
5
|
+
* notificaciones). Aislado en un hook para que el editor se pueda probar sin el panel.
|
|
6
|
+
*/
|
|
7
|
+
export declare const useEditorIO: () => {
|
|
8
|
+
loadImage: (url: string) => Promise<{
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
src: string;
|
|
12
|
+
} | null>;
|
|
13
|
+
exportAs: (node: HTMLElement | null, template: Template, format: ExportFormat) => Promise<void>;
|
|
14
|
+
saveToLibrary: (node: HTMLElement | null, template: Template, { name, folderId }: {
|
|
15
|
+
name: string;
|
|
16
|
+
folderId: number | null;
|
|
17
|
+
}) => Promise<boolean>;
|
|
18
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catálogo de tipografías del editor (S4.16, D1). Los archivos los sirve el CMS desde
|
|
3
|
+
* `public/fonts/` (mismo origen que el panel, D2): Texta es comercial y no viaja en el paquete npm.
|
|
4
|
+
* Agregar una fuente = copiar sus archivos al CMS y añadir una entrada aquí. Las fuentes que sube el
|
|
5
|
+
* equipo se registran en tiempo de ejecución con `registerCustomFonts` (D4).
|
|
6
|
+
*/
|
|
7
|
+
export interface FontFile {
|
|
8
|
+
url: string;
|
|
9
|
+
/** Uno («400») o un rango de fuente variable («100 900»). */
|
|
10
|
+
weight: string;
|
|
11
|
+
style: 'normal' | 'italic';
|
|
12
|
+
format: 'truetype' | 'opentype' | 'woff' | 'woff2';
|
|
13
|
+
}
|
|
14
|
+
export interface FontDef {
|
|
15
|
+
id: string;
|
|
16
|
+
label: string;
|
|
17
|
+
/** Nombre CSS de la familia. */
|
|
18
|
+
family: string;
|
|
19
|
+
/** Respaldo del mismo tipo (sans, serif o monoespaciada) si el archivo no carga. */
|
|
20
|
+
fallback: string;
|
|
21
|
+
weights: number[];
|
|
22
|
+
/** Tiene cursivas propias; sin ellas el navegador las inclina. */
|
|
23
|
+
italic: boolean;
|
|
24
|
+
files: FontFile[];
|
|
25
|
+
/** Subida por el equipo a «/Fuentes». */
|
|
26
|
+
custom?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare const BUILTIN_FONTS: FontDef[];
|
|
29
|
+
export declare const DEFAULT_FONT = "inter";
|
|
30
|
+
/** Reemplaza las fuentes subidas por el equipo (se llama al cargar la biblioteca de fuentes). */
|
|
31
|
+
export declare const registerCustomFonts: (fonts: FontDef[]) => void;
|
|
32
|
+
/** Para `useSyncExternalStore`: el lienzo se vuelve a pintar cuando cargan las fuentes subidas. */
|
|
33
|
+
export declare const subscribeFonts: (listener: () => void) => () => boolean;
|
|
34
|
+
export declare const fontsVersion: () => number;
|
|
35
|
+
export declare const allFonts: () => FontDef[];
|
|
36
|
+
/** La fuente de una capa; lo desconocido (p. ej. una fuente subida que se borró) cae a Inter. */
|
|
37
|
+
export declare const resolveFont: (id: string | undefined) => FontDef;
|
|
38
|
+
export declare const fontStack: (f: FontDef) => string;
|
|
39
|
+
/** El peso disponible más cercano (una fuente sin 800 usa su 700). */
|
|
40
|
+
export declare const nearestWeight: (f: FontDef, weight: number) => number;
|
|
41
|
+
export declare const WEIGHT_LABELS: Record<number, string>;
|
|
42
|
+
/** `@font-face` de las fuentes dadas; `url` puede ser una ruta del CMS o una data URL. */
|
|
43
|
+
export declare const fontFaceCss: (fonts: FontDef[]) => string;
|
|
44
|
+
/** Escala de tamaños de los editores de texto habituales (D6). */
|
|
45
|
+
export declare const FONT_SIZES: number[];
|
|
46
|
+
/** Tamaño estándar siguiente (`+1`) o anterior (`-1`); un valor libre salta al estándar más próximo. */
|
|
47
|
+
export declare const stepSize: (size: number, dir: 1 | -1) => number;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FontDef } from './catalog';
|
|
2
|
+
/**
|
|
3
|
+
* Fuentes que sube el equipo (S4.16, D4). Viven en la carpeta «Fuentes» de la biblioteca del Estudio
|
|
4
|
+
* («/Fuentes»); cada archivo es una fuente. La licencia de cada una es responsabilidad de quien la sube.
|
|
5
|
+
*/
|
|
6
|
+
export declare const FONTS_FOLDER = "Fuentes";
|
|
7
|
+
export declare const FONT_MAX_BYTES: number;
|
|
8
|
+
export declare const isFontName: (name: string) => boolean;
|
|
9
|
+
/** Error para mostrar, o `null` si el archivo se puede subir. */
|
|
10
|
+
export declare const checkFontFile: (file: File) => string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Archivo de la biblioteca → fuente del catálogo. El nombre visible sale del archivo
|
|
13
|
+
* («Montserrat-SemiBold.ttf» → «Montserrat SemiBold»); la familia CSS es única por archivo para no
|
|
14
|
+
* chocar con fuentes del sistema. Un archivo trae un solo peso: las negritas las simula el navegador.
|
|
15
|
+
*/
|
|
16
|
+
export declare const fontFromFile: (file: {
|
|
17
|
+
id: number;
|
|
18
|
+
name: string;
|
|
19
|
+
}, dataUrl: string) => FontDef;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FontDef } from './catalog';
|
|
2
|
+
/**
|
|
3
|
+
* Fuentes propias del equipo (S4.16, D4): al montar carga las de «/Fuentes» al catálogo (por el
|
|
4
|
+
* proxy, como data URL: mismo origen para el lienzo y la exportación) y permite subir otra.
|
|
5
|
+
*/
|
|
6
|
+
export declare const useCustomFonts: () => {
|
|
7
|
+
upload: (file: File) => Promise<FontDef | null>;
|
|
8
|
+
reload: () => Promise<void>;
|
|
9
|
+
};
|