@interware/content-generator 0.4.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +21 -1
  2. package/dist/_chunks/{App-CfwvfmvL.js → App-CJxSC8yt.js} +32 -720
  3. package/dist/_chunks/{App-BQr5_g5u.mjs → App-qbgUXlOZ.mjs} +38 -726
  4. package/dist/_chunks/ImageStudioTabs-BLAH3KYv.mjs +5270 -0
  5. package/dist/_chunks/ImageStudioTabs-DtusqpQO.js +5271 -0
  6. package/dist/_chunks/PluginProviders-D79TeGSE.js +34 -0
  7. package/dist/_chunks/PluginProviders-DWMpcAIh.mjs +35 -0
  8. package/dist/_chunks/Settings-BQXxV3LO.js +242 -0
  9. package/dist/_chunks/Settings-o2GngLaW.mjs +242 -0
  10. package/dist/_chunks/StudioApp-BaySMwrk.js +18 -0
  11. package/dist/_chunks/StudioApp-C_znlQRo.mjs +18 -0
  12. package/dist/_chunks/{getTranslation-B9ND5RaH.mjs → getTranslation-B6Bsu-uq.mjs} +1 -1
  13. package/dist/_chunks/{getTranslation-DNhP1INv.js → getTranslation-BRVMWSf8.js} +1 -1
  14. package/dist/_chunks/{index-DGPqyrzz.js → index-BKhe-Jyx.js} +24 -6
  15. package/dist/_chunks/{index-Dyq8dxMX.mjs → index-BKigRXm3.mjs} +25 -7
  16. package/dist/admin/index.js +1 -1
  17. package/dist/admin/index.mjs +1 -1
  18. package/dist/admin/src/components/PluginIcon.d.ts +4 -2
  19. package/dist/admin/src/components/PluginProviders.d.ts +12 -0
  20. package/dist/admin/src/components/generate-video/Form.d.ts +1 -1
  21. package/dist/admin/src/components/settings/Form.d.ts +4 -5
  22. package/dist/admin/src/components/settings/VertexSettings.d.ts +18 -0
  23. package/dist/admin/src/containers/settings/index.d.ts +7 -7
  24. package/dist/admin/src/features/background-removal/RemoveBackgroundButton.d.ts +7 -0
  25. package/dist/admin/src/features/background-removal/RemoveBackgroundDialog.d.ts +15 -0
  26. package/dist/admin/src/features/background-removal/colorKey.d.ts +29 -0
  27. package/dist/admin/src/features/background-removal/imageCanvas.d.ts +20 -0
  28. package/dist/admin/src/features/background-removal/mask.d.ts +10 -0
  29. package/dist/admin/src/features/background-removal/runtime.d.ts +31 -0
  30. package/dist/admin/src/features/generator/EditEmpty.d.ts +13 -0
  31. package/dist/admin/src/features/generator/GeneratorTab.d.ts +7 -0
  32. package/dist/admin/src/features/generator/GroundingSources.d.ts +9 -0
  33. package/dist/admin/src/features/generator/ModeSwitch.d.ts +6 -0
  34. package/dist/admin/src/features/generator/PromptComposer.d.ts +25 -0
  35. package/dist/admin/src/features/generator/ReferencePicker.d.ts +26 -0
  36. package/dist/admin/src/features/generator/VersionHistory.d.ts +13 -0
  37. package/dist/admin/src/features/generator/generatorApi.d.ts +71 -0
  38. package/dist/admin/src/features/generator/model.d.ts +60 -0
  39. package/dist/admin/src/features/generator/useGeneratorApi.d.ts +21 -0
  40. package/dist/admin/src/features/image-studio/ImageStudioTabs.d.ts +26 -0
  41. package/dist/admin/src/features/image-studio/SegmentedSwitch.d.ts +18 -0
  42. package/dist/admin/src/features/image-studio/checkerboard.d.ts +5 -0
  43. package/dist/admin/src/features/library/FileCard.d.ts +17 -0
  44. package/dist/admin/src/features/library/FolderTree.d.ts +14 -0
  45. package/dist/admin/src/features/library/LibraryDialogs.d.ts +46 -0
  46. package/dist/admin/src/features/library/LibraryImagePicker.d.ts +15 -0
  47. package/dist/admin/src/features/library/LibraryTab.d.ts +2 -0
  48. package/dist/admin/src/features/library/SaveToLibraryDialog.d.ts +15 -0
  49. package/dist/admin/src/features/library/model.d.ts +40 -0
  50. package/dist/admin/src/features/library/studioRoot.d.ts +11 -0
  51. package/dist/admin/src/features/library/uploadApi.d.ts +77 -0
  52. package/dist/admin/src/features/library/useLibraryApi.d.ts +34 -0
  53. package/dist/admin/src/features/templates/editor/ColorField.d.ts +11 -0
  54. package/dist/admin/src/features/templates/editor/Editor.d.ts +19 -0
  55. package/dist/admin/src/features/templates/editor/EditorBar.d.ts +9 -0
  56. package/dist/admin/src/features/templates/editor/EditorMenuBar.d.ts +58 -0
  57. package/dist/admin/src/features/templates/editor/EditorToolbar.d.ts +20 -0
  58. package/dist/admin/src/features/templates/editor/ElementPalette.d.ts +10 -0
  59. package/dist/admin/src/features/templates/editor/FloatingPanel.d.ts +17 -0
  60. package/dist/admin/src/features/templates/editor/FullscreenView.d.ts +11 -0
  61. package/dist/admin/src/features/templates/editor/IconPicker.d.ts +9 -0
  62. package/dist/admin/src/features/templates/editor/Inspector.d.ts +17 -0
  63. package/dist/admin/src/features/templates/editor/LayersPanel.d.ts +12 -0
  64. package/dist/admin/src/features/templates/editor/Precision.d.ts +23 -0
  65. package/dist/admin/src/features/templates/editor/RangeField.d.ts +12 -0
  66. package/dist/admin/src/features/templates/editor/SaveTemplateDialog.d.ts +14 -0
  67. package/dist/admin/src/features/templates/editor/Stage.d.ts +29 -0
  68. package/dist/admin/src/features/templates/editor/TemplateFolderSelect.d.ts +9 -0
  69. package/dist/admin/src/features/templates/editor/TemplatePicker.d.ts +23 -0
  70. package/dist/admin/src/features/templates/editor/TemplatesTab.d.ts +5 -0
  71. package/dist/admin/src/features/templates/editor/TypographyControls.d.ts +24 -0
  72. package/dist/admin/src/features/templates/editor/icons.d.ts +7 -0
  73. package/dist/admin/src/features/templates/editor/overlays.d.ts +20 -0
  74. package/dist/admin/src/features/templates/editor/useCanvasNav.d.ts +25 -0
  75. package/dist/admin/src/features/templates/editor/useFitScale.d.ts +3 -0
  76. package/dist/admin/src/features/templates/export/fontEmbed.d.ts +22 -0
  77. package/dist/admin/src/features/templates/export/imageSource.d.ts +21 -0
  78. package/dist/admin/src/features/templates/export/pdf.d.ts +6 -0
  79. package/dist/admin/src/features/templates/export/render.d.ts +22 -0
  80. package/dist/admin/src/features/templates/export/useEditorIO.d.ts +18 -0
  81. package/dist/admin/src/features/templates/fonts/catalog.d.ts +47 -0
  82. package/dist/admin/src/features/templates/fonts/customFonts.d.ts +19 -0
  83. package/dist/admin/src/features/templates/fonts/useCustomFonts.d.ts +9 -0
  84. package/dist/admin/src/features/templates/fonts/useFonts.d.ts +2 -0
  85. package/dist/admin/src/features/templates/model/drag.d.ts +10 -0
  86. package/dist/admin/src/features/templates/model/editorReducer.d.ts +58 -0
  87. package/dist/admin/src/features/templates/model/layers.d.ts +42 -0
  88. package/dist/admin/src/features/templates/model/palette.d.ts +38 -0
  89. package/dist/admin/src/features/templates/model/presets.d.ts +17 -0
  90. package/dist/admin/src/features/templates/model/shortcuts.d.ts +19 -0
  91. package/dist/admin/src/features/templates/model/snap.d.ts +24 -0
  92. package/dist/admin/src/features/templates/model/templates.d.ts +8 -0
  93. package/dist/admin/src/features/templates/model/types.d.ts +154 -0
  94. package/dist/admin/src/features/templates/model/viewport.d.ts +36 -0
  95. package/dist/admin/src/features/templates/render/IWLogo.d.ts +7 -0
  96. package/dist/admin/src/features/templates/render/LayerCanvas.d.ts +13 -0
  97. package/dist/admin/src/features/templates/render/fonts.d.ts +5 -0
  98. package/dist/admin/src/features/templates/render/icons.d.ts +10 -0
  99. package/dist/admin/src/features/templates/render/renderLayer.d.ts +9 -0
  100. package/dist/admin/src/features/templates/store/persist.d.ts +41 -0
  101. package/dist/admin/src/features/templates/store/templatesApi.d.ts +49 -0
  102. package/dist/admin/src/features/templates/store/useMyTemplates.d.ts +19 -0
  103. package/dist/admin/src/features/templates/store/useTemplateSaving.d.ts +14 -0
  104. package/dist/admin/src/features/templates/store/useTemplatesApi.d.ts +23 -0
  105. package/dist/admin/src/hooks/useAdminTheme.d.ts +8 -0
  106. package/dist/admin/src/hooks/useThemeColors.d.ts +9 -0
  107. package/dist/admin/src/lib/dataUrl.d.ts +6 -0
  108. package/dist/admin/src/lib/promptRules.d.ts +23 -0
  109. package/dist/admin/src/lib/use-cases/articles/index.d.ts +12 -1
  110. package/dist/admin/src/lib/use-cases/categories/index.d.ts +12 -1
  111. package/dist/admin/src/lib/use-cases/facebook/index.d.ts +1 -1
  112. package/dist/admin/src/lib/use-cases/generate-content/index.d.ts +2 -2
  113. package/dist/admin/src/lib/use-cases/images/index.d.ts +1 -4
  114. package/dist/admin/src/lib/use-cases/linkedin/index.d.ts +1 -1
  115. package/dist/admin/src/lib/use-cases/settings/index.d.ts +14 -2
  116. package/dist/admin/src/lib/use-cases/users/index.d.ts +12 -1
  117. package/dist/admin/src/pages/ImageStudio.d.ts +3 -0
  118. package/dist/admin/src/pages/StudioApp.d.ts +3 -0
  119. package/dist/admin/src/pluginId.d.ts +6 -0
  120. package/dist/admin/src/test-setup.d.ts +1 -0
  121. package/dist/admin/src/test-utils.d.ts +5 -0
  122. package/dist/server/index.js +2494 -1279
  123. package/dist/server/index.mjs +2501 -1285
  124. package/dist/server/src/bootstrap.d.ts +1 -1
  125. package/dist/server/src/content-types/index.d.ts +66 -1
  126. package/dist/server/src/content-types/template/index.d.ts +65 -0
  127. package/dist/server/src/content-types/template/schema.d.ts +69 -0
  128. package/dist/server/src/controllers/config.d.ts +10 -0
  129. package/dist/server/src/controllers/controller.d.ts +0 -5
  130. package/dist/server/src/controllers/image-studio.d.ts +23 -0
  131. package/dist/server/src/controllers/index.d.ts +129 -5
  132. package/dist/server/src/controllers/templates.d.ts +26 -0
  133. package/dist/server/src/image-studio/geminiConfig.d.ts +40 -0
  134. package/dist/server/src/image-studio/models.d.ts +39 -0
  135. package/dist/server/src/image-studio/prompt.d.ts +7 -0
  136. package/dist/server/src/image-studio/validate.d.ts +41 -0
  137. package/dist/server/src/index.d.ts +233 -75
  138. package/dist/server/src/routes/admin.d.ts +6 -2
  139. package/dist/server/src/routes/content-api.d.ts +4 -9
  140. package/dist/server/src/routes/index.d.ts +7 -11
  141. package/dist/server/src/routes/policies.d.ts +14 -0
  142. package/dist/server/src/services/image-studio.d.ts +66 -0
  143. package/dist/server/src/services/index.d.ts +30 -57
  144. package/dist/server/src/services/service.d.ts +10 -57
  145. package/dist/server/src/services/templates.d.ts +81 -0
  146. package/dist/server/src/templates/folders.d.ts +14 -0
  147. package/dist/server/src/templates/validate.d.ts +23 -0
  148. package/dist/server/src/utils/folders.d.ts +15 -0
  149. package/dist/server/src/utils/geminiClient.d.ts +24 -0
  150. package/dist/server/src/utils/secrets.d.ts +9 -0
  151. package/dist/server/src/utils/serviceAccount.d.ts +29 -0
  152. package/package.json +23 -10
  153. package/static/background-worker.d.mts +15 -0
  154. package/static/background-worker.mjs +87 -0
  155. package/dist/_chunks/Settings-BrqTzJp-.js +0 -262
  156. package/dist/_chunks/Settings-CdZnYLLK.mjs +0 -244
  157. package/dist/admin/src/components/Navigation.d.ts +0 -2
  158. package/dist/admin/src/components/generate-image/Form.d.ts +0 -15
  159. package/dist/admin/src/components/generate-images/Image.d.ts +0 -5
  160. package/dist/admin/src/components/generate-images/Images.d.ts +0 -2
  161. package/dist/admin/src/components/generate-images/Modal.d.ts +0 -9
  162. package/dist/admin/src/containers/generate-image/index.d.ts +0 -2
  163. package/dist/admin/src/containers/generate-images/index.d.ts +0 -2
  164. package/dist/admin/src/hooks/generate-images/useImages.d.ts +0 -12
  165. package/dist/admin/src/pages/GenerateImage.d.ts +0 -2
  166. package/dist/admin/src/pages/GenerateImages.d.ts +0 -2
@@ -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,2 @@
1
+ /** Pestaña «Imágenes y documentos»: la Media Library de Strapi organizada por carpetas. */
2
+ export declare const LibraryTab: () => import("react/jsx-runtime").JSX.Element;
@@ -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 {};
@@ -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 {};