forlogic-core 2.0.0 → 2.0.2
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 +0 -46
- package/dist/assets/AccordionDoc-CGNlubG3.js +31 -0
- package/dist/assets/ActionButtonDoc-CYtkXR0k.js +47 -0
- package/dist/assets/ActionPlanDoc-BSuPRftQ.js +65 -0
- package/dist/assets/AlertDoc-Cpvxneqg.js +37 -0
- package/dist/assets/AliasUrlDoc-DIpUWf4Y.js +189 -0
- package/dist/assets/AppHeaderDoc-DNQErj_t.js +74 -0
- package/dist/assets/AppSidebarDoc-DkeQarDu.js +221 -0
- package/dist/assets/ApprovalFlowDoc-8YgXbhKJ.js +31 -0
- package/dist/assets/AuditLogDoc-BBvNcHIo.js +67 -0
- package/dist/assets/AuditTrailDoc-DgFHO-uo.js +17 -0
- package/dist/assets/AuthDoc-WIA_Aetl.js +200 -0
- package/dist/assets/AvatarDoc-B6go1C1T.js +11 -0
- package/dist/assets/BadgeDoc-BONhfqB_.js +36 -0
- package/dist/assets/BaseFormDoc-CuyUArcj.js +169 -0
- package/dist/assets/BodyContentDoc-CterHC1E.js +83 -0
- package/dist/assets/BreadcrumbDoc-Dwn9nLeO.js +75 -0
- package/dist/assets/ButtonDoc-BOjRseZT.js +41 -0
- package/dist/assets/ButtonGroupDoc-8IS6PPh4.js +7 -0
- package/dist/assets/CalendarDoc-CMwIEqgT.js +81 -0
- package/dist/assets/CardDoc-BZz1CVg2.js +49 -0
- package/dist/assets/ChartDoc-B5vZVtqD.js +76 -0
- package/dist/assets/CheckboxDoc-lAbYO9I5.js +55 -0
- package/dist/assets/ColorPickerDoc-Dpsprp4N.js +10 -0
- package/dist/assets/ColorsFoundationDoc-CCHeSL3p.js +13 -0
- package/dist/assets/ComboTreeDoc-D4dTkIt-.js +46 -0
- package/dist/assets/ComboboxDoc-CqqZPvZq.js +134 -0
- package/dist/assets/ComponentDocTemplate-CQbBhfvZ.js +1 -0
- package/dist/assets/ContextMenuDoc-D3jC-MVA.js +182 -0
- package/dist/assets/ContextsDoc-XFH0-JdS.js +211 -0
- package/dist/assets/CreateCrudPageDoc-CpuiWI-g.js +106 -0
- package/dist/assets/CrudActionBarDoc-wuBGXD9Y.js +112 -0
- package/dist/assets/CrudGridDoc-BYWqSXBH.js +85 -0
- package/dist/assets/CrudOverviewDoc-B_bk2a2t.js +14 -0
- package/dist/assets/CrudPrimitivesDoc-CxaTB94A.js +164 -0
- package/dist/assets/CrudTableDoc-Dga1VgCu.js +113 -0
- package/dist/assets/CustomFormFieldsDoc-C1hwwSl3.js +33 -0
- package/dist/assets/DashboardFormDoc-BUDCmrMl.js +49 -0
- package/dist/assets/DashboardGeneralViewDoc-Cyg1SIiG.js +71 -0
- package/dist/assets/DashboardGridDoc-BavePiRF.js +49 -0
- package/dist/assets/DashboardListDoc-CLyMA6UK.js +37 -0
- package/dist/assets/DashboardOverviewDoc-DRVvNIF1.js +35 -0
- package/dist/assets/DashboardPanelRendererDoc--mfwb8Nc.js +60 -0
- package/dist/assets/DashboardPanelsBasicDoc-BQ2V_52D.js +62 -0
- package/dist/assets/DashboardPanelsCartesianDoc-sy-hcVQY.js +75 -0
- package/dist/assets/DashboardPanelsSpecialDoc-DsIUCRRP.js +83 -0
- package/dist/assets/DashboardViewDoc-CtlCNlEF.js +45 -0
- package/dist/assets/DataListDoc-DUy88lCQ.js +13 -0
- package/dist/assets/DesignSystemHome-DHl9YtbH.js +1 -0
- package/dist/assets/DialogDoc-CMQqnTV-.js +981 -0
- package/dist/assets/DropdownMenuDoc-S7X9csGt.js +175 -0
- package/dist/assets/ElectronicSignatureDialogDoc-BfithaL_.js +57 -0
- package/dist/assets/EmptyStateDoc-CHGCiGIk.js +35 -0
- package/dist/assets/EnvironmentsDoc-DZHJZ2nm.js +96 -0
- package/dist/assets/ErrorBoundaryDoc-DoaAg68p.js +111 -0
- package/dist/assets/ExampleActionPlanPage-C0fIMZCD.js +1 -0
- package/dist/assets/ExampleAppDoc-DzIU81Fn.js +1 -0
- package/dist/assets/ExampleCard-DuLrb3t-.js +1 -0
- package/dist/assets/ExampleCrudReportsPage-M0pz6tdM.js +1 -0
- package/dist/assets/ExampleDashboardPage-CRG5r3Vw.js +1 -0
- package/dist/assets/ExampleIdeasPage-I84ZMLY4.js +1 -0
- package/dist/assets/ExampleImportWizardPage-h4YqrrSe.js +1 -0
- package/dist/assets/ExampleSettingsPage-CwdWqoaP.js +1 -0
- package/dist/assets/FileUploadDoc-9-UujFNX.js +34 -0
- package/dist/assets/FilterBar-DDTqqUfZ.js +1 -0
- package/dist/assets/FormDoc-CVES6n3d.js +81 -0
- package/dist/assets/FoundationOverview-DT0u11Gz.js +1 -0
- package/dist/assets/GridDoc-CbHFSILF.js +28 -0
- package/dist/assets/HooksDoc-Ctxdk6Wq.js +665 -0
- package/dist/assets/HoverCardDoc-8Wkaafdj.js +31 -0
- package/dist/assets/I18nDoc-D3Q2m7ik.js +167 -0
- package/dist/assets/IconPickerDoc-DZ26Gdpg.js +10 -0
- package/dist/assets/IconsFoundationDoc-xOxtC7CW.js +33 -0
- package/dist/assets/InputDoc-BhztAiuJ.js +211 -0
- package/dist/assets/LabelDoc-A4hmTRRV.js +42 -0
- package/dist/assets/LeadershipDoc-CqOSfWsP.js +452 -0
- package/dist/assets/MediaDoc-C78gvC8p.js +459 -0
- package/dist/assets/MenubarDoc-DCnmd2tO.js +165 -0
- package/dist/assets/ModuleAccessDoc-CmD5nHDp.js +153 -0
- package/dist/assets/ModulesDialogDoc-DVit1CA-.js +46 -0
- package/dist/assets/MultiselectPermissionsDoc-tlJMs04L.js +34 -0
- package/dist/assets/NavigationMenuDoc-q1fbc89j.js +116 -0
- package/dist/assets/OnboardingDialogDoc-3A3eBYrq.js +55 -0
- package/dist/assets/PaginationDoc-B8-bMz5J.js +27 -0
- package/dist/assets/PaginationDoc-BkGdxHL3.js +98 -0
- package/dist/assets/PlacesDoc-CKPO6ATs.js +226 -0
- package/dist/assets/PopoverDoc-CJPU4Ags.js +64 -0
- package/dist/assets/ProgressDoc-CpjbTL4o.js +29 -0
- package/dist/assets/QualiexUserFieldDoc-DDwumlRw.js +149 -0
- package/dist/assets/RadioGroupDoc-D6tSZz8G.js +57 -0
- package/dist/assets/RadiusDoc-B4xSnajw.js +7 -0
- package/dist/assets/ReportRequestListDoc-C0LIaU8P.js +15 -0
- package/dist/assets/RequiredFieldsCounterDoc-COesoSdx.js +58 -0
- package/dist/assets/ResizableDoc-CW0-XQuB.js +104 -0
- package/dist/assets/RichTextEditorDoc-C8c_XA9P.js +24 -0
- package/dist/assets/ScrollAreaDoc-BxtoAPaZ.js +28 -0
- package/dist/assets/SecurityDoc-wOVqpg2F.js +204 -0
- package/dist/assets/SelectDoc-C75gtY9D.js +80 -0
- package/dist/assets/SeparatorDoc-BjQBPB1P.js +4 -0
- package/dist/assets/ServicesDoc-CXTctwBl.js +308 -0
- package/dist/assets/ShadowsDoc-C6Lw8_x2.js +9 -0
- package/dist/assets/SignDoc-Bh5ZUg5x.js +66 -0
- package/dist/assets/SkeletonDoc-rTLGK5VE.js +54 -0
- package/dist/assets/SliderDoc-JMAMDub7.js +41 -0
- package/dist/assets/SpacingDoc-RljOrpwA.js +12 -0
- package/dist/assets/SplitButtonDoc-CvShUW3w.js +53 -0
- package/dist/assets/StepSelectorDoc-C-nAap9H.js +41 -0
- package/dist/assets/SwitchDoc-DLnqmkPr.js +56 -0
- package/dist/assets/TableDoc-B8EpWLVg.js +128 -0
- package/dist/assets/TabsDoc-DIBtl_uC.js +42 -0
- package/dist/assets/TeamSelectorDoc-B7OnCbL7.js +10 -0
- package/dist/assets/TermsOfUseDoc-Bb-pw08s.js +16 -0
- package/dist/assets/TextareaDoc-DGnqMqEC.js +46 -0
- package/dist/assets/ToastDoc-DjYyc7ae.js +157 -0
- package/dist/assets/ToggleDoc-C9ZOVjkY.js +51 -0
- package/dist/assets/TooltipDoc-BEx4l9-i.js +58 -0
- package/dist/assets/TruncatedCellDoc-BbV1bRSY.js +12 -0
- package/dist/assets/TypographyFoundationDoc-CUDYjRo9.js +7 -0
- package/dist/assets/UpdatesNotificationDoc-7nyjzLMJ.js +29 -0
- package/dist/assets/UsersGroupsSelectorDoc-C0KlTAL5.js +18 -0
- package/dist/assets/UtilitiesDoc-DGxaHVV1.js +145 -0
- package/dist/assets/ViewerDialogsDoc-CnTPTEz0.js +1 -0
- package/dist/assets/blocks-B6LrJeAM.js +1 -0
- package/dist/assets/building-DeVappnD.js +1 -0
- package/dist/assets/calendar-days-BQ0na5kM.js +1 -0
- package/dist/assets/check-check-C_-PJCJa.js +1 -0
- package/dist/assets/circle-plus-CpIcep-O.js +1 -0
- package/dist/assets/circle-x-jPpBPew0.js +1 -0
- package/dist/assets/clipboard-list-CXNPdciZ.js +1 -0
- package/dist/assets/cloud-upload-BEjzumjl.js +1 -0
- package/dist/assets/crown-CqNsQIsm.js +1 -0
- package/dist/assets/date-picker-BW3eGOe_.js +1 -0
- package/dist/assets/disabled-menu-item-C2YaMvSt.js +1 -0
- package/dist/assets/drawer-D5rflIcD.js +3 -0
- package/dist/assets/file-braces-DFb5X9so.js +1 -0
- package/dist/assets/file-pen-line-CyUGKkEN.js +1 -0
- package/dist/assets/git-branch-BcXv9mpp.js +1 -0
- package/dist/assets/globe-CpMIWAcv.js +1 -0
- package/dist/assets/hash-cQWdKjya.js +1 -0
- package/dist/assets/hourglass-BahQ3eDv.js +1 -0
- package/dist/assets/hover-card-R66N85sZ.js +1 -0
- package/dist/assets/iframe-dialog-V0mW5aBb.js +1 -0
- package/dist/assets/index-DkiftrvI.js +352 -0
- package/dist/assets/index-nmBjO9Th.css +1 -0
- package/dist/assets/life-buoy-ByXiPddz.js +1 -0
- package/dist/assets/loading-state-Cb5_t5uE.js +1 -0
- package/dist/assets/lucide-react-Cp3Yw3Zm.js +1 -0
- package/dist/assets/package-B3-pVvPM.js +1 -0
- package/dist/assets/pen-Bi_lmmKT.js +1 -0
- package/dist/assets/pin-DVsSl8QA.js +1 -0
- package/dist/assets/printer-BnJ8B6m-.js +1 -0
- package/dist/assets/radio-group-BHAaNGsm.js +1 -0
- package/dist/assets/server-CtzFTfKR.js +1 -0
- package/dist/assets/share-2-Dv8Do445.js +1 -0
- package/dist/assets/shield-check-CFXjOV_w.js +1 -0
- package/dist/assets/shield-x-DJTRfVux.js +1 -0
- package/dist/assets/slider-v9tXBSnB.js +1 -0
- package/dist/assets/smartphone-BSNR60L7.js +1 -0
- package/dist/assets/step-selector-ATTh_9Wa.js +1 -0
- package/dist/assets/text-align-start-qE-MbYYw.js +1 -0
- package/dist/assets/thumbs-up-D_XIW_uX.js +1 -0
- package/dist/assets/trash-DTWQwpwA.js +1 -0
- package/dist/assets/trending-up-jip5-leJ.js +1 -0
- package/dist/assets/useMockCrud-CN4vjyOZ.js +1 -0
- package/dist/assets/user-check-BlH3EDWK.js +1 -0
- package/dist/assets/user-plus-BqwXwD-c.js +1 -0
- package/dist/components/modules/ModulesContent.d.ts +7 -3
- package/dist/components/modules/ModulesFooterCards.d.ts +3 -1
- package/dist/components/modules/types.d.ts +3 -1
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/resizable.d.ts +1 -1
- package/dist/exports/crud.d.ts +5 -1
- package/dist/exports/ui.d.ts +8 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.html +33 -0
- package/dist/index.js +1 -1
- package/dist/setup/favicon.d.ts +1 -0
- package/docs/PUBLISH.md +3 -3
- package/package.json +1 -5
- package/dist/README.md +0 -1079
- package/dist/bin/bootstrap.js +0 -40
- package/dist/bin/pull-docs.js +0 -186
- package/dist/docs/KNOWLEDGE.md +0 -109
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import{j as e,a as o,d as a,U as n,dT as s,aJ as l,ex as r,S as d,b as t,c as i}from"./index-DkiftrvI.js";import{C as c}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";function m(){return e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs(o,{children:[e.jsx(t,{className:"pb-2",children:e.jsxs(i,{className:"text-sm flex items-center gap-2",children:[e.jsx(s,{className:"h-4 w-4 text-primary"}),"Imagens"]})}),e.jsxs(a,{className:"text-xs text-muted-foreground space-y-1",children:[e.jsxs("p",{children:[e.jsx("strong",{children:"ImageEditor:"})," Edição de URL, upload, legenda, alt, dimensões"]}),e.jsxs("p",{children:[e.jsx("strong",{children:"ImageRenderer:"})," Exibição com alinhamento e download"]})]})]}),e.jsxs(o,{children:[e.jsx(t,{className:"pb-2",children:e.jsxs(i,{className:"text-sm flex items-center gap-2",children:[e.jsx(r,{className:"h-4 w-4 text-primary"}),"Vídeos"]})}),e.jsxs(a,{className:"text-xs text-muted-foreground space-y-1",children:[e.jsxs("p",{children:[e.jsx("strong",{children:"VideoEditor:"})," URL, upload, embed, thumbnail, autoplay"]}),e.jsxs("p",{children:[e.jsx("strong",{children:"VideoRenderer:"})," YouTube, Vimeo e arquivos diretos"]})]})]}),e.jsxs(o,{children:[e.jsx(t,{className:"pb-2",children:e.jsxs(i,{className:"text-sm flex items-center gap-2",children:[e.jsx(n,{className:"h-4 w-4 text-primary"}),"Upload Hook"]})}),e.jsxs(a,{className:"text-xs text-muted-foreground space-y-1",children:[e.jsxs("p",{children:[e.jsx("strong",{children:"useMediaUpload:"})," Hook genérico para upload"]}),e.jsx("p",{children:"Validação de tipo e tamanho, progresso, callbacks"})]})]}),e.jsxs(o,{children:[e.jsx(t,{className:"pb-2",children:e.jsxs(i,{className:"text-sm flex items-center gap-2",children:[e.jsx(d,{className:"h-4 w-4 text-primary"}),"Helpers"]})}),e.jsxs(a,{className:"text-xs text-muted-foreground space-y-1",children:[e.jsxs("p",{children:[e.jsx("strong",{children:"imageHelpers:"})," Compressão, resize, validação"]}),e.jsxs("p",{children:[e.jsx("strong",{children:"videoHelpers:"})," Detecção de provider, normalização"]})]})]})]})}function x(){return e.jsx(c,{title:"Media",description:"Módulo completo para upload, edição e renderização de imagens e vídeos. Inclui editores interativos, renderizadores otimizados e hook genérico de upload.",component:e.jsx(m,{}),installation:`// Importação dos componentes
|
|
2
|
+
import {
|
|
3
|
+
ImageEditor,
|
|
4
|
+
ImageRenderer,
|
|
5
|
+
VideoEditor,
|
|
6
|
+
VideoRenderer,
|
|
7
|
+
useMediaUpload
|
|
8
|
+
} from 'forlogic-core';
|
|
9
|
+
|
|
10
|
+
// Importação de tipos
|
|
11
|
+
import type {
|
|
12
|
+
ImageBlockContent,
|
|
13
|
+
VideoBlockContent,
|
|
14
|
+
UploadFunction,
|
|
15
|
+
DeleteFunction,
|
|
16
|
+
UploadOptions,
|
|
17
|
+
UploadResult
|
|
18
|
+
} from 'forlogic-core';`,usage:`// Exemplo básico de upload de imagem
|
|
19
|
+
const { upload, uploading, progress } = useMediaUpload({
|
|
20
|
+
uploadFunction: async (file, options) => {
|
|
21
|
+
// Implementação do upload para seu storage
|
|
22
|
+
const url = await uploadToStorage(file, options);
|
|
23
|
+
return { url, path: file.name };
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Renderizar uma imagem
|
|
28
|
+
<ImageRenderer
|
|
29
|
+
content={{
|
|
30
|
+
imageUrl: 'https://example.com/image.jpg',
|
|
31
|
+
caption: 'Legenda da imagem',
|
|
32
|
+
alignment: 'center'
|
|
33
|
+
}}
|
|
34
|
+
/>
|
|
35
|
+
|
|
36
|
+
// Renderizar um vídeo
|
|
37
|
+
<VideoRenderer
|
|
38
|
+
content={{
|
|
39
|
+
videoUrl: 'https://youtube.com/watch?v=...',
|
|
40
|
+
controls: true
|
|
41
|
+
}}
|
|
42
|
+
/>`,examples:[{title:"useMediaUpload",description:"Hook genérico para upload de arquivos com validação e progresso.",preview:e.jsx(o,{children:e.jsx(a,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(n,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Características"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsx("li",{children:"Função de upload customizável (injeção de dependência)"}),e.jsx("li",{children:"Validação de tamanho máximo de arquivo"}),e.jsx("li",{children:"Validação de tipos MIME permitidos"}),e.jsx("li",{children:"Indicador de progresso de upload"}),e.jsx("li",{children:"Callbacks de sucesso e erro"}),e.jsx("li",{children:"Função de delete para remoção de arquivos"}),e.jsx("li",{children:"Toast automático de feedback"})]})]})})}),code:`import { useMediaUpload, getSupabaseClient } from 'forlogic-core';
|
|
43
|
+
|
|
44
|
+
const supabase = getSupabaseClient();
|
|
45
|
+
|
|
46
|
+
// Função de upload para Supabase Storage
|
|
47
|
+
const uploadToSupabase: UploadFunction = async (file, options) => {
|
|
48
|
+
const bucket = options?.bucket || 'media';
|
|
49
|
+
const path = \`\${Date.now()}-\${file.name}\`;
|
|
50
|
+
|
|
51
|
+
const { data, error } = await supabase.storage
|
|
52
|
+
.from(bucket)
|
|
53
|
+
.upload(path, file);
|
|
54
|
+
|
|
55
|
+
if (error) throw error;
|
|
56
|
+
|
|
57
|
+
const { data: { publicUrl } } = supabase.storage
|
|
58
|
+
.from(bucket)
|
|
59
|
+
.getPublicUrl(path);
|
|
60
|
+
|
|
61
|
+
return { url: publicUrl, path };
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Função de delete
|
|
65
|
+
const deleteFromSupabase: DeleteFunction = async (path, bucket = 'media') => {
|
|
66
|
+
const { error } = await supabase.storage
|
|
67
|
+
.from(bucket)
|
|
68
|
+
.remove([path]);
|
|
69
|
+
|
|
70
|
+
if (error) throw error;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Uso do hook
|
|
74
|
+
function MediaUploader() {
|
|
75
|
+
const { upload, deleteMedia, uploading, progress } = useMediaUpload({
|
|
76
|
+
uploadFunction: uploadToSupabase,
|
|
77
|
+
deleteFunction: deleteFromSupabase,
|
|
78
|
+
defaultOptions: {
|
|
79
|
+
bucket: 'images',
|
|
80
|
+
maxSize: 5 * 1024 * 1024, // 5MB
|
|
81
|
+
allowedTypes: ['image/*']
|
|
82
|
+
},
|
|
83
|
+
onSuccess: (result) => {
|
|
84
|
+
console.log('Upload concluído:', result.url);
|
|
85
|
+
},
|
|
86
|
+
onError: (error) => {
|
|
87
|
+
console.error('Erro no upload:', error.message);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
92
|
+
const file = e.target.files?.[0];
|
|
93
|
+
if (!file) return;
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
const result = await upload(file, { bucket: 'avatars' });
|
|
97
|
+
// result.url contém a URL pública do arquivo
|
|
98
|
+
} catch (error) {
|
|
99
|
+
// Erro já tratado pelo hook com toast
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
<div>
|
|
105
|
+
<input type="file" onChange={handleFileSelect} disabled={uploading} />
|
|
106
|
+
{uploading && <progress value={progress} max={100} />}
|
|
107
|
+
</div>
|
|
108
|
+
);
|
|
109
|
+
}`},{title:"ImageEditor",description:"Editor completo para gerenciamento de imagens com upload e propriedades.",preview:e.jsx(o,{children:e.jsx(a,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Funcionalidades"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsx("li",{children:"Input de URL de imagem externa"}),e.jsx("li",{children:"Upload de arquivo local"}),e.jsx("li",{children:"Campo de legenda (caption)"}),e.jsx("li",{children:"Texto alternativo (alt) para acessibilidade"}),e.jsx("li",{children:"Alinhamento (esquerda, centro, direita)"}),e.jsx("li",{children:"Dimensões customizadas (largura/altura)"}),e.jsx("li",{children:"Toggle para permitir download"}),e.jsx("li",{children:"Preview em tempo real"})]})]})})}),code:`import { ImageEditor } from 'forlogic-core';
|
|
110
|
+
import type { ImageBlockContent } from 'forlogic-core';
|
|
111
|
+
|
|
112
|
+
function ImageBlockEditor() {
|
|
113
|
+
const [content, setContent] = useState<ImageBlockContent>({
|
|
114
|
+
imageUrl: '',
|
|
115
|
+
caption: '',
|
|
116
|
+
alt: '',
|
|
117
|
+
alignment: 'center',
|
|
118
|
+
allowDownload: false
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const handleSubmit = (value: ImageBlockContent) => {
|
|
122
|
+
console.log('Imagem salva:', value);
|
|
123
|
+
// Salvar no banco de dados
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<ImageEditor
|
|
128
|
+
value={content}
|
|
129
|
+
onChange={setContent}
|
|
130
|
+
onSubmit={handleSubmit}
|
|
131
|
+
onCancel={() => console.log('Cancelado')}
|
|
132
|
+
uploadFunction={uploadToSupabase}
|
|
133
|
+
deleteFunction={deleteFromSupabase}
|
|
134
|
+
uploadOptions={{
|
|
135
|
+
bucket: 'images',
|
|
136
|
+
maxSize: 10 * 1024 * 1024, // 10MB
|
|
137
|
+
allowedTypes: ['image/jpeg', 'image/png', 'image/webp', 'image/gif']
|
|
138
|
+
}}
|
|
139
|
+
/>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Tipo ImageBlockContent
|
|
144
|
+
interface ImageBlockContent {
|
|
145
|
+
imageUrl?: string;
|
|
146
|
+
imageFile?: string; // Nome do arquivo
|
|
147
|
+
imagePath?: string; // Caminho no storage
|
|
148
|
+
imageSize?: number; // Tamanho em bytes
|
|
149
|
+
caption?: string; // Legenda
|
|
150
|
+
alt?: string; // Texto alternativo
|
|
151
|
+
width?: number; // Largura em pixels
|
|
152
|
+
height?: number; // Altura em pixels
|
|
153
|
+
alignment?: 'left' | 'center' | 'right';
|
|
154
|
+
allowDownload?: boolean;
|
|
155
|
+
}`},{title:"ImageRenderer",description:"Renderizador de imagens com alinhamento, legenda e opção de download.",preview:e.jsx(o,{children:e.jsx(a,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(l,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Recursos"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsx("li",{children:"Alinhamento responsivo (left, center, right)"}),e.jsx("li",{children:"Exibição de legenda em itálico"}),e.jsx("li",{children:"Dimensões customizadas com max-width: 100%"}),e.jsx("li",{children:"Link de download opcional"}),e.jsx("li",{children:"Estilização com rounded-lg e shadow-md"}),e.jsx("li",{children:"Props className e style para customização"})]})]})})}),code:`import { ImageRenderer } from 'forlogic-core';
|
|
156
|
+
|
|
157
|
+
// Uso básico
|
|
158
|
+
<ImageRenderer
|
|
159
|
+
content={{
|
|
160
|
+
imageUrl: 'https://example.com/photo.jpg',
|
|
161
|
+
caption: 'Foto da equipe em 2024',
|
|
162
|
+
alt: 'Equipe reunida no escritório',
|
|
163
|
+
alignment: 'center'
|
|
164
|
+
}}
|
|
165
|
+
/>
|
|
166
|
+
|
|
167
|
+
// Com download habilitado
|
|
168
|
+
<ImageRenderer
|
|
169
|
+
content={{
|
|
170
|
+
imageUrl: 'https://example.com/diagram.png',
|
|
171
|
+
caption: 'Diagrama de arquitetura',
|
|
172
|
+
alt: 'Diagrama mostrando a arquitetura do sistema',
|
|
173
|
+
alignment: 'left',
|
|
174
|
+
allowDownload: true,
|
|
175
|
+
width: 800,
|
|
176
|
+
height: 600
|
|
177
|
+
}}
|
|
178
|
+
className="my-8"
|
|
179
|
+
/>
|
|
180
|
+
|
|
181
|
+
// Customização via style
|
|
182
|
+
<ImageRenderer
|
|
183
|
+
content={{
|
|
184
|
+
imageUrl: 'https://example.com/banner.jpg',
|
|
185
|
+
alignment: 'center'
|
|
186
|
+
}}
|
|
187
|
+
style={{ maxWidth: '600px' }}
|
|
188
|
+
/>`},{title:"VideoEditor",description:"Editor de vídeos com suporte a URL, upload e embed code.",preview:e.jsx(o,{children:e.jsx(a,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(r,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Modos de Input"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"URL:"})," YouTube, Vimeo ou link direto"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Upload:"})," Arquivo de vídeo local"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Embed:"})," Código HTML iframe"]}),e.jsx("li",{children:"Upload de thumbnail customizada"}),e.jsx("li",{children:"Título do vídeo"}),e.jsx("li",{children:"Toggle de autoplay"}),e.jsx("li",{children:"Toggle de controles"}),e.jsx("li",{children:"Preview em tempo real"})]})]})})}),code:`import { VideoEditor } from 'forlogic-core';
|
|
189
|
+
import type { VideoBlockContent } from 'forlogic-core';
|
|
190
|
+
|
|
191
|
+
function VideoBlockEditor() {
|
|
192
|
+
const [content, setContent] = useState<VideoBlockContent>({
|
|
193
|
+
inputType: 'url',
|
|
194
|
+
videoUrl: '',
|
|
195
|
+
autoplay: false,
|
|
196
|
+
controls: true
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
const handleSubmit = (value: VideoBlockContent) => {
|
|
200
|
+
console.log('Vídeo salvo:', value);
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
return (
|
|
204
|
+
<VideoEditor
|
|
205
|
+
value={content}
|
|
206
|
+
onChange={setContent}
|
|
207
|
+
onSubmit={handleSubmit}
|
|
208
|
+
onCancel={() => console.log('Cancelado')}
|
|
209
|
+
uploadFunction={uploadToSupabase}
|
|
210
|
+
deleteFunction={deleteFromSupabase}
|
|
211
|
+
uploadOptions={{
|
|
212
|
+
bucket: 'videos',
|
|
213
|
+
maxSize: 100 * 1024 * 1024, // 100MB
|
|
214
|
+
allowedTypes: ['video/mp4', 'video/webm', 'video/ogg']
|
|
215
|
+
}}
|
|
216
|
+
/>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Tipo VideoBlockContent
|
|
221
|
+
interface VideoBlockContent {
|
|
222
|
+
inputType?: 'url' | 'upload' | 'embed';
|
|
223
|
+
videoUrl?: string;
|
|
224
|
+
videoFile?: string;
|
|
225
|
+
videoPath?: string;
|
|
226
|
+
videoSize?: number;
|
|
227
|
+
embedCode?: string; // Código iframe
|
|
228
|
+
thumbnail?: string; // URL da thumbnail
|
|
229
|
+
thumbnailFile?: string;
|
|
230
|
+
thumbnailPath?: string;
|
|
231
|
+
title?: string;
|
|
232
|
+
autoplay?: boolean;
|
|
233
|
+
controls?: boolean;
|
|
234
|
+
}`},{title:"VideoRenderer",description:"Renderizador inteligente com detecção automática de provider.",preview:e.jsx(o,{children:e.jsx(a,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(r,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Providers Suportados"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"YouTube:"})," Detecção automática e embed otimizado"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Vimeo:"})," Normalização de URL e embed"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Arquivo:"})," Player HTML5 nativo"]}),e.jsx("li",{children:"Aspect ratio 16:9 para embeds"}),e.jsx("li",{children:"Autoplay com mute automático"}),e.jsx("li",{children:"Controles configuráveis"}),e.jsx("li",{children:"Thumbnail poster para arquivos"})]})]})})}),code:`import { VideoRenderer } from 'forlogic-core';
|
|
235
|
+
|
|
236
|
+
// YouTube
|
|
237
|
+
<VideoRenderer
|
|
238
|
+
content={{
|
|
239
|
+
videoUrl: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
|
|
240
|
+
title: 'Tutorial de React',
|
|
241
|
+
controls: true
|
|
242
|
+
}}
|
|
243
|
+
/>
|
|
244
|
+
|
|
245
|
+
// Vimeo
|
|
246
|
+
<VideoRenderer
|
|
247
|
+
content={{
|
|
248
|
+
videoUrl: 'https://vimeo.com/123456789',
|
|
249
|
+
autoplay: false,
|
|
250
|
+
controls: true
|
|
251
|
+
}}
|
|
252
|
+
/>
|
|
253
|
+
|
|
254
|
+
// Arquivo direto
|
|
255
|
+
<VideoRenderer
|
|
256
|
+
content={{
|
|
257
|
+
videoUrl: 'https://storage.example.com/video.mp4',
|
|
258
|
+
thumbnail: 'https://storage.example.com/thumbnail.jpg',
|
|
259
|
+
title: 'Apresentação do Produto',
|
|
260
|
+
autoplay: false,
|
|
261
|
+
controls: true
|
|
262
|
+
}}
|
|
263
|
+
/>
|
|
264
|
+
|
|
265
|
+
// Via embed code
|
|
266
|
+
<VideoRenderer
|
|
267
|
+
content={{
|
|
268
|
+
embedCode: '<iframe src="https://player.vimeo.com/video/..." />',
|
|
269
|
+
title: 'Vídeo Incorporado'
|
|
270
|
+
}}
|
|
271
|
+
/>`},{title:"Helpers de Vídeo",description:"Funções utilitárias para manipulação de URLs e detecção de providers.",preview:e.jsx(o,{children:e.jsx(a,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(d,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Funções Disponíveis"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"detectVideoProvider"}),": Identifica YouTube, Vimeo ou file"]}),e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"normalizeYouTubeUrl"}),": Converte para URL de embed"]}),e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"normalizeVimeoUrl"}),": Converte para URL de embed"]}),e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"parseIframeSrc"}),": Extrai src de código iframe"]})]})]})})}),code:`import {
|
|
272
|
+
detectVideoProvider,
|
|
273
|
+
normalizeYouTubeUrl,
|
|
274
|
+
normalizeVimeoUrl,
|
|
275
|
+
parseIframeSrc
|
|
276
|
+
} from 'forlogic-core';
|
|
277
|
+
|
|
278
|
+
// Detectar provider
|
|
279
|
+
const provider = detectVideoProvider('https://www.youtube.com/watch?v=abc123');
|
|
280
|
+
// Retorna: 'youtube' | 'vimeo' | 'file'
|
|
281
|
+
|
|
282
|
+
// Normalizar URL do YouTube para embed
|
|
283
|
+
const youtubeEmbed = normalizeYouTubeUrl(
|
|
284
|
+
'https://www.youtube.com/watch?v=abc123',
|
|
285
|
+
false // autoplay
|
|
286
|
+
);
|
|
287
|
+
// Retorna: 'https://www.youtube.com/embed/abc123'
|
|
288
|
+
|
|
289
|
+
// Normalizar URL do Vimeo para embed
|
|
290
|
+
const vimeoEmbed = normalizeVimeoUrl(
|
|
291
|
+
'https://vimeo.com/123456789',
|
|
292
|
+
true // autoplay
|
|
293
|
+
);
|
|
294
|
+
// Retorna: 'https://player.vimeo.com/video/123456789?autoplay=1'
|
|
295
|
+
|
|
296
|
+
// Extrair src de iframe
|
|
297
|
+
const src = parseIframeSrc('<iframe src="https://..." />');
|
|
298
|
+
// Retorna a URL do src`},{title:"Helpers de Imagem",description:"Funções utilitárias para manipulação e validação de imagens.",preview:e.jsx(o,{children:e.jsx(a,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Funções Disponíveis"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"compressImage"}),": Comprime imagem mantendo qualidade"]}),e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"resizeImage"}),": Redimensiona para max width/height"]}),e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"getImageDimensions"}),": Obtém largura e altura"]}),e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"isValidImageType"}),": Valida tipos MIME"]}),e.jsxs("li",{children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"formatFileSize"}),": Formata bytes para KB/MB"]})]})]})})}),code:`import {
|
|
299
|
+
compressImage,
|
|
300
|
+
resizeImage,
|
|
301
|
+
getImageDimensions,
|
|
302
|
+
isValidImageType,
|
|
303
|
+
formatFileSize
|
|
304
|
+
} from 'forlogic-core';
|
|
305
|
+
|
|
306
|
+
// Comprimir imagem
|
|
307
|
+
const compressedFile = await compressImage(file, {
|
|
308
|
+
quality: 0.8,
|
|
309
|
+
maxWidth: 1920,
|
|
310
|
+
maxHeight: 1080
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Redimensionar imagem
|
|
314
|
+
const resizedFile = await resizeImage(file, {
|
|
315
|
+
maxWidth: 800,
|
|
316
|
+
maxHeight: 600,
|
|
317
|
+
maintainAspectRatio: true
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
// Obter dimensões
|
|
321
|
+
const { width, height } = await getImageDimensions(file);
|
|
322
|
+
console.log(\`Imagem: \${width}x\${height}\`);
|
|
323
|
+
|
|
324
|
+
// Validar tipo
|
|
325
|
+
const isValid = isValidImageType(file, ['image/jpeg', 'image/png']);
|
|
326
|
+
if (!isValid) {
|
|
327
|
+
throw new Error('Tipo de arquivo não suportado');
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Formatar tamanho
|
|
331
|
+
const size = formatFileSize(file.size);
|
|
332
|
+
console.log(\`Tamanho: \${size}\`); // "2.5 MB"`},{title:"Exemplo Completo Integrado",description:"Exemplo de uso completo do módulo Media em um editor de posts.",preview:e.jsxs(o,{className:"border-primary/20",children:[e.jsx(t,{className:"pb-2",children:e.jsx(i,{className:"text-sm",children:"Editor de Mídia Completo"})}),e.jsxs(a,{className:"text-xs text-muted-foreground",children:[e.jsx("p",{children:"Demonstração de integração com:"}),e.jsxs("ul",{className:"list-disc list-inside mt-2 space-y-1",children:[e.jsx("li",{children:"Upload para Supabase Storage"}),e.jsx("li",{children:"Alternância entre ImageEditor e VideoEditor"}),e.jsx("li",{children:"Renderização com ImageRenderer e VideoRenderer"}),e.jsx("li",{children:"Gerenciamento de estado com hooks"})]})]})]}),code:`import { useState } from 'react';
|
|
333
|
+
import {
|
|
334
|
+
ImageEditor,
|
|
335
|
+
ImageRenderer,
|
|
336
|
+
VideoEditor,
|
|
337
|
+
VideoRenderer,
|
|
338
|
+
useMediaUpload
|
|
339
|
+
} from 'forlogic-core';
|
|
340
|
+
import type {
|
|
341
|
+
ImageBlockContent,
|
|
342
|
+
VideoBlockContent,
|
|
343
|
+
UploadFunction,
|
|
344
|
+
DeleteFunction
|
|
345
|
+
} from 'forlogic-core';
|
|
346
|
+
import { getSupabaseClient } from 'forlogic-core';
|
|
347
|
+
|
|
348
|
+
const supabase = getSupabaseClient();
|
|
349
|
+
|
|
350
|
+
// Funções de upload/delete para Supabase
|
|
351
|
+
const uploadToSupabase: UploadFunction = async (file, options) => {
|
|
352
|
+
const bucket = options?.bucket || 'media';
|
|
353
|
+
const path = \`\${Date.now()}-\${file.name}\`;
|
|
354
|
+
|
|
355
|
+
const { data, error } = await supabase.storage
|
|
356
|
+
.from(bucket)
|
|
357
|
+
.upload(path, file);
|
|
358
|
+
|
|
359
|
+
if (error) throw error;
|
|
360
|
+
|
|
361
|
+
const { data: { publicUrl } } = supabase.storage
|
|
362
|
+
.from(bucket)
|
|
363
|
+
.getPublicUrl(path);
|
|
364
|
+
|
|
365
|
+
return { url: publicUrl, path };
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
const deleteFromSupabase: DeleteFunction = async (path, bucket = 'media') => {
|
|
369
|
+
const { error } = await supabase.storage.from(bucket).remove([path]);
|
|
370
|
+
if (error) throw error;
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
// Componente principal
|
|
374
|
+
function MediaBlockManager() {
|
|
375
|
+
const [mediaType, setMediaType] = useState<'image' | 'video'>('image');
|
|
376
|
+
const [imageContent, setImageContent] = useState<ImageBlockContent>({});
|
|
377
|
+
const [videoContent, setVideoContent] = useState<VideoBlockContent>({});
|
|
378
|
+
const [savedContent, setSavedContent] = useState<{
|
|
379
|
+
type: 'image' | 'video';
|
|
380
|
+
content: ImageBlockContent | VideoBlockContent;
|
|
381
|
+
} | null>(null);
|
|
382
|
+
|
|
383
|
+
const handleSaveImage = (content: ImageBlockContent) => {
|
|
384
|
+
setSavedContent({ type: 'image', content });
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
const handleSaveVideo = (content: VideoBlockContent) => {
|
|
388
|
+
setSavedContent({ type: 'video', content });
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
return (
|
|
392
|
+
<div className="space-y-6">
|
|
393
|
+
{/* Seletor de tipo */}
|
|
394
|
+
<div className="flex gap-2">
|
|
395
|
+
<button
|
|
396
|
+
onClick={() => setMediaType('image')}
|
|
397
|
+
className={\`px-4 py-2 rounded \${
|
|
398
|
+
mediaType === 'image' ? 'bg-primary text-primary-foreground' : 'bg-muted'
|
|
399
|
+
}\`}
|
|
400
|
+
>
|
|
401
|
+
Imagem
|
|
402
|
+
</button>
|
|
403
|
+
<button
|
|
404
|
+
onClick={() => setMediaType('video')}
|
|
405
|
+
className={\`px-4 py-2 rounded \${
|
|
406
|
+
mediaType === 'video' ? 'bg-primary text-primary-foreground' : 'bg-muted'
|
|
407
|
+
}\`}
|
|
408
|
+
>
|
|
409
|
+
Vídeo
|
|
410
|
+
</button>
|
|
411
|
+
</div>
|
|
412
|
+
|
|
413
|
+
{/* Editor */}
|
|
414
|
+
<div className="border rounded-lg p-4">
|
|
415
|
+
{mediaType === 'image' ? (
|
|
416
|
+
<ImageEditor
|
|
417
|
+
value={imageContent}
|
|
418
|
+
onChange={setImageContent}
|
|
419
|
+
onSubmit={handleSaveImage}
|
|
420
|
+
onCancel={() => setImageContent({})}
|
|
421
|
+
uploadFunction={uploadToSupabase}
|
|
422
|
+
deleteFunction={deleteFromSupabase}
|
|
423
|
+
uploadOptions={{
|
|
424
|
+
bucket: 'images',
|
|
425
|
+
maxSize: 10 * 1024 * 1024,
|
|
426
|
+
allowedTypes: ['image/*']
|
|
427
|
+
}}
|
|
428
|
+
/>
|
|
429
|
+
) : (
|
|
430
|
+
<VideoEditor
|
|
431
|
+
value={videoContent}
|
|
432
|
+
onChange={setVideoContent}
|
|
433
|
+
onSubmit={handleSaveVideo}
|
|
434
|
+
onCancel={() => setVideoContent({})}
|
|
435
|
+
uploadFunction={uploadToSupabase}
|
|
436
|
+
deleteFunction={deleteFromSupabase}
|
|
437
|
+
uploadOptions={{
|
|
438
|
+
bucket: 'videos',
|
|
439
|
+
maxSize: 100 * 1024 * 1024,
|
|
440
|
+
allowedTypes: ['video/*']
|
|
441
|
+
}}
|
|
442
|
+
/>
|
|
443
|
+
)}
|
|
444
|
+
</div>
|
|
445
|
+
|
|
446
|
+
{/* Preview do conteúdo salvo */}
|
|
447
|
+
{savedContent && (
|
|
448
|
+
<div className="border rounded-lg p-4">
|
|
449
|
+
<h3 className="font-medium mb-4">Preview</h3>
|
|
450
|
+
{savedContent.type === 'image' ? (
|
|
451
|
+
<ImageRenderer content={savedContent.content as ImageBlockContent} />
|
|
452
|
+
) : (
|
|
453
|
+
<VideoRenderer content={savedContent.content as VideoBlockContent} />
|
|
454
|
+
)}
|
|
455
|
+
</div>
|
|
456
|
+
)}
|
|
457
|
+
</div>
|
|
458
|
+
);
|
|
459
|
+
}`}],props:[{name:"uploadFunction",type:"UploadFunction",description:"Função de upload customizada (obrigatória para uploads)"},{name:"deleteFunction",type:"DeleteFunction",description:"Função de delete customizada"},{name:"defaultOptions",type:"UploadOptions",description:"Opções padrão: bucket, maxSize, allowedTypes"},{name:"onSuccess",type:"(result: UploadResult) => void",description:"Callback executado após upload bem-sucedido"},{name:"onError",type:"(error: Error) => void",description:"Callback executado em caso de erro"},{name:"value",type:"ImageBlockContent | VideoBlockContent",description:"Valor atual do conteúdo"},{name:"onChange",type:"(value) => void",description:"Callback para mudanças no conteúdo"},{name:"onSubmit",type:"(value) => void",description:"Callback ao salvar o conteúdo"},{name:"onCancel",type:"() => void",description:"Callback ao cancelar edição"},{name:"uploadOptions",type:"UploadOptions",description:"Opções de upload específicas para o editor"},{name:"content",type:"ImageBlockContent | VideoBlockContent",description:"Conteúdo a ser renderizado"},{name:"className",type:"string",description:"Classes CSS adicionais"},{name:"style",type:"CSSProperties",description:"Estilos inline adicionais"}],accessibility:["ImageRenderer inclui atributo alt obrigatório para acessibilidade","VideoRenderer usa atributo title no iframe para identificação","Controles de vídeo habilitados por padrão para navegação por teclado","Autoplay sempre acompanhado de muted para conformidade com navegadores","Links de download possuem texto descritivo","Todos os inputs dos editores possuem labels associados"],notes:["O hook useMediaUpload requer que o projeto forneça as funções de upload/delete","A função uploadFunction deve retornar { url: string, path?: string }","VideoRenderer detecta automaticamente YouTube e Vimeo pela URL","Para vídeos locais, use o player HTML5 nativo com controles","Dimensões são opcionais; imagens usam max-width: 100% por padrão","O módulo não inclui implementação de storage - use Supabase, S3, etc.","Helpers de imagem usam Canvas API para compressão e resize"]})}export{x as MediaDoc};
|