forlogic-core 2.0.0 → 2.0.1

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 (181) hide show
  1. package/README.md +0 -46
  2. package/dist/assets/AccordionDoc-CGNlubG3.js +31 -0
  3. package/dist/assets/ActionButtonDoc-CYtkXR0k.js +47 -0
  4. package/dist/assets/ActionPlanDoc-BSuPRftQ.js +65 -0
  5. package/dist/assets/AlertDoc-Cpvxneqg.js +37 -0
  6. package/dist/assets/AliasUrlDoc-DIpUWf4Y.js +189 -0
  7. package/dist/assets/AppHeaderDoc-DNQErj_t.js +74 -0
  8. package/dist/assets/AppSidebarDoc-DkeQarDu.js +221 -0
  9. package/dist/assets/ApprovalFlowDoc-8YgXbhKJ.js +31 -0
  10. package/dist/assets/AuditLogDoc-BBvNcHIo.js +67 -0
  11. package/dist/assets/AuditTrailDoc-DgFHO-uo.js +17 -0
  12. package/dist/assets/AuthDoc-WIA_Aetl.js +200 -0
  13. package/dist/assets/AvatarDoc-B6go1C1T.js +11 -0
  14. package/dist/assets/BadgeDoc-BONhfqB_.js +36 -0
  15. package/dist/assets/BaseFormDoc-CuyUArcj.js +169 -0
  16. package/dist/assets/BodyContentDoc-CterHC1E.js +83 -0
  17. package/dist/assets/BreadcrumbDoc-Dwn9nLeO.js +75 -0
  18. package/dist/assets/ButtonDoc-BOjRseZT.js +41 -0
  19. package/dist/assets/ButtonGroupDoc-8IS6PPh4.js +7 -0
  20. package/dist/assets/CalendarDoc-CMwIEqgT.js +81 -0
  21. package/dist/assets/CardDoc-BZz1CVg2.js +49 -0
  22. package/dist/assets/ChartDoc-B5vZVtqD.js +76 -0
  23. package/dist/assets/CheckboxDoc-lAbYO9I5.js +55 -0
  24. package/dist/assets/ColorPickerDoc-Dpsprp4N.js +10 -0
  25. package/dist/assets/ColorsFoundationDoc-CCHeSL3p.js +13 -0
  26. package/dist/assets/ComboTreeDoc-D4dTkIt-.js +46 -0
  27. package/dist/assets/ComboboxDoc-CqqZPvZq.js +134 -0
  28. package/dist/assets/ComponentDocTemplate-CQbBhfvZ.js +1 -0
  29. package/dist/assets/ContextMenuDoc-D3jC-MVA.js +182 -0
  30. package/dist/assets/ContextsDoc-XFH0-JdS.js +211 -0
  31. package/dist/assets/CreateCrudPageDoc-CpuiWI-g.js +106 -0
  32. package/dist/assets/CrudActionBarDoc-wuBGXD9Y.js +112 -0
  33. package/dist/assets/CrudGridDoc-BYWqSXBH.js +85 -0
  34. package/dist/assets/CrudOverviewDoc-B_bk2a2t.js +14 -0
  35. package/dist/assets/CrudPrimitivesDoc-CxaTB94A.js +164 -0
  36. package/dist/assets/CrudTableDoc-Dga1VgCu.js +113 -0
  37. package/dist/assets/CustomFormFieldsDoc-C1hwwSl3.js +33 -0
  38. package/dist/assets/DashboardFormDoc-BUDCmrMl.js +49 -0
  39. package/dist/assets/DashboardGeneralViewDoc-Cyg1SIiG.js +71 -0
  40. package/dist/assets/DashboardGridDoc-BavePiRF.js +49 -0
  41. package/dist/assets/DashboardListDoc-CLyMA6UK.js +37 -0
  42. package/dist/assets/DashboardOverviewDoc-DRVvNIF1.js +35 -0
  43. package/dist/assets/DashboardPanelRendererDoc--mfwb8Nc.js +60 -0
  44. package/dist/assets/DashboardPanelsBasicDoc-BQ2V_52D.js +62 -0
  45. package/dist/assets/DashboardPanelsCartesianDoc-sy-hcVQY.js +75 -0
  46. package/dist/assets/DashboardPanelsSpecialDoc-DsIUCRRP.js +83 -0
  47. package/dist/assets/DashboardViewDoc-CtlCNlEF.js +45 -0
  48. package/dist/assets/DataListDoc-DUy88lCQ.js +13 -0
  49. package/dist/assets/DesignSystemHome-DHl9YtbH.js +1 -0
  50. package/dist/assets/DialogDoc-CMQqnTV-.js +981 -0
  51. package/dist/assets/DropdownMenuDoc-S7X9csGt.js +175 -0
  52. package/dist/assets/ElectronicSignatureDialogDoc-BfithaL_.js +57 -0
  53. package/dist/assets/EmptyStateDoc-CHGCiGIk.js +35 -0
  54. package/dist/assets/EnvironmentsDoc-DZHJZ2nm.js +96 -0
  55. package/dist/assets/ErrorBoundaryDoc-DoaAg68p.js +111 -0
  56. package/dist/assets/ExampleActionPlanPage-C0fIMZCD.js +1 -0
  57. package/dist/assets/ExampleAppDoc-DzIU81Fn.js +1 -0
  58. package/dist/assets/ExampleCard-DuLrb3t-.js +1 -0
  59. package/dist/assets/ExampleCrudReportsPage-M0pz6tdM.js +1 -0
  60. package/dist/assets/ExampleDashboardPage-CRG5r3Vw.js +1 -0
  61. package/dist/assets/ExampleIdeasPage-I84ZMLY4.js +1 -0
  62. package/dist/assets/ExampleImportWizardPage-h4YqrrSe.js +1 -0
  63. package/dist/assets/ExampleSettingsPage-CwdWqoaP.js +1 -0
  64. package/dist/assets/FileUploadDoc-9-UujFNX.js +34 -0
  65. package/dist/assets/FilterBar-DDTqqUfZ.js +1 -0
  66. package/dist/assets/FormDoc-CVES6n3d.js +81 -0
  67. package/dist/assets/FoundationOverview-DT0u11Gz.js +1 -0
  68. package/dist/assets/GridDoc-CbHFSILF.js +28 -0
  69. package/dist/assets/HooksDoc-Ctxdk6Wq.js +665 -0
  70. package/dist/assets/HoverCardDoc-8Wkaafdj.js +31 -0
  71. package/dist/assets/I18nDoc-D3Q2m7ik.js +167 -0
  72. package/dist/assets/IconPickerDoc-DZ26Gdpg.js +10 -0
  73. package/dist/assets/IconsFoundationDoc-xOxtC7CW.js +33 -0
  74. package/dist/assets/InputDoc-BhztAiuJ.js +211 -0
  75. package/dist/assets/LabelDoc-A4hmTRRV.js +42 -0
  76. package/dist/assets/LeadershipDoc-CqOSfWsP.js +452 -0
  77. package/dist/assets/MediaDoc-C78gvC8p.js +459 -0
  78. package/dist/assets/MenubarDoc-DCnmd2tO.js +165 -0
  79. package/dist/assets/ModuleAccessDoc-CmD5nHDp.js +153 -0
  80. package/dist/assets/ModulesDialogDoc-DVit1CA-.js +46 -0
  81. package/dist/assets/MultiselectPermissionsDoc-tlJMs04L.js +34 -0
  82. package/dist/assets/NavigationMenuDoc-q1fbc89j.js +116 -0
  83. package/dist/assets/OnboardingDialogDoc-3A3eBYrq.js +55 -0
  84. package/dist/assets/PaginationDoc-B8-bMz5J.js +27 -0
  85. package/dist/assets/PaginationDoc-BkGdxHL3.js +98 -0
  86. package/dist/assets/PlacesDoc-CKPO6ATs.js +226 -0
  87. package/dist/assets/PopoverDoc-CJPU4Ags.js +64 -0
  88. package/dist/assets/ProgressDoc-CpjbTL4o.js +29 -0
  89. package/dist/assets/QualiexUserFieldDoc-DDwumlRw.js +149 -0
  90. package/dist/assets/RadioGroupDoc-D6tSZz8G.js +57 -0
  91. package/dist/assets/RadiusDoc-B4xSnajw.js +7 -0
  92. package/dist/assets/ReportRequestListDoc-C0LIaU8P.js +15 -0
  93. package/dist/assets/RequiredFieldsCounterDoc-COesoSdx.js +58 -0
  94. package/dist/assets/ResizableDoc-CW0-XQuB.js +104 -0
  95. package/dist/assets/RichTextEditorDoc-C8c_XA9P.js +24 -0
  96. package/dist/assets/ScrollAreaDoc-BxtoAPaZ.js +28 -0
  97. package/dist/assets/SecurityDoc-wOVqpg2F.js +204 -0
  98. package/dist/assets/SelectDoc-C75gtY9D.js +80 -0
  99. package/dist/assets/SeparatorDoc-BjQBPB1P.js +4 -0
  100. package/dist/assets/ServicesDoc-CXTctwBl.js +308 -0
  101. package/dist/assets/ShadowsDoc-C6Lw8_x2.js +9 -0
  102. package/dist/assets/SignDoc-Bh5ZUg5x.js +66 -0
  103. package/dist/assets/SkeletonDoc-rTLGK5VE.js +54 -0
  104. package/dist/assets/SliderDoc-JMAMDub7.js +41 -0
  105. package/dist/assets/SpacingDoc-RljOrpwA.js +12 -0
  106. package/dist/assets/SplitButtonDoc-CvShUW3w.js +53 -0
  107. package/dist/assets/StepSelectorDoc-C-nAap9H.js +41 -0
  108. package/dist/assets/SwitchDoc-DLnqmkPr.js +56 -0
  109. package/dist/assets/TableDoc-B8EpWLVg.js +128 -0
  110. package/dist/assets/TabsDoc-DIBtl_uC.js +42 -0
  111. package/dist/assets/TeamSelectorDoc-B7OnCbL7.js +10 -0
  112. package/dist/assets/TermsOfUseDoc-Bb-pw08s.js +16 -0
  113. package/dist/assets/TextareaDoc-DGnqMqEC.js +46 -0
  114. package/dist/assets/ToastDoc-DjYyc7ae.js +157 -0
  115. package/dist/assets/ToggleDoc-C9ZOVjkY.js +51 -0
  116. package/dist/assets/TooltipDoc-BEx4l9-i.js +58 -0
  117. package/dist/assets/TruncatedCellDoc-BbV1bRSY.js +12 -0
  118. package/dist/assets/TypographyFoundationDoc-CUDYjRo9.js +7 -0
  119. package/dist/assets/UpdatesNotificationDoc-7nyjzLMJ.js +29 -0
  120. package/dist/assets/UsersGroupsSelectorDoc-C0KlTAL5.js +18 -0
  121. package/dist/assets/UtilitiesDoc-DGxaHVV1.js +145 -0
  122. package/dist/assets/ViewerDialogsDoc-CnTPTEz0.js +1 -0
  123. package/dist/assets/blocks-B6LrJeAM.js +1 -0
  124. package/dist/assets/building-DeVappnD.js +1 -0
  125. package/dist/assets/calendar-days-BQ0na5kM.js +1 -0
  126. package/dist/assets/check-check-C_-PJCJa.js +1 -0
  127. package/dist/assets/circle-plus-CpIcep-O.js +1 -0
  128. package/dist/assets/circle-x-jPpBPew0.js +1 -0
  129. package/dist/assets/clipboard-list-CXNPdciZ.js +1 -0
  130. package/dist/assets/cloud-upload-BEjzumjl.js +1 -0
  131. package/dist/assets/crown-CqNsQIsm.js +1 -0
  132. package/dist/assets/date-picker-BW3eGOe_.js +1 -0
  133. package/dist/assets/disabled-menu-item-C2YaMvSt.js +1 -0
  134. package/dist/assets/drawer-D5rflIcD.js +3 -0
  135. package/dist/assets/file-braces-DFb5X9so.js +1 -0
  136. package/dist/assets/file-pen-line-CyUGKkEN.js +1 -0
  137. package/dist/assets/git-branch-BcXv9mpp.js +1 -0
  138. package/dist/assets/globe-CpMIWAcv.js +1 -0
  139. package/dist/assets/hash-cQWdKjya.js +1 -0
  140. package/dist/assets/hourglass-BahQ3eDv.js +1 -0
  141. package/dist/assets/hover-card-R66N85sZ.js +1 -0
  142. package/dist/assets/iframe-dialog-V0mW5aBb.js +1 -0
  143. package/dist/assets/index-DkiftrvI.js +352 -0
  144. package/dist/assets/index-nmBjO9Th.css +1 -0
  145. package/dist/assets/life-buoy-ByXiPddz.js +1 -0
  146. package/dist/assets/loading-state-Cb5_t5uE.js +1 -0
  147. package/dist/assets/lucide-react-Cp3Yw3Zm.js +1 -0
  148. package/dist/assets/package-B3-pVvPM.js +1 -0
  149. package/dist/assets/pen-Bi_lmmKT.js +1 -0
  150. package/dist/assets/pin-DVsSl8QA.js +1 -0
  151. package/dist/assets/printer-BnJ8B6m-.js +1 -0
  152. package/dist/assets/radio-group-BHAaNGsm.js +1 -0
  153. package/dist/assets/server-CtzFTfKR.js +1 -0
  154. package/dist/assets/share-2-Dv8Do445.js +1 -0
  155. package/dist/assets/shield-check-CFXjOV_w.js +1 -0
  156. package/dist/assets/shield-x-DJTRfVux.js +1 -0
  157. package/dist/assets/slider-v9tXBSnB.js +1 -0
  158. package/dist/assets/smartphone-BSNR60L7.js +1 -0
  159. package/dist/assets/step-selector-ATTh_9Wa.js +1 -0
  160. package/dist/assets/text-align-start-qE-MbYYw.js +1 -0
  161. package/dist/assets/thumbs-up-D_XIW_uX.js +1 -0
  162. package/dist/assets/trash-DTWQwpwA.js +1 -0
  163. package/dist/assets/trending-up-jip5-leJ.js +1 -0
  164. package/dist/assets/useMockCrud-CN4vjyOZ.js +1 -0
  165. package/dist/assets/user-check-BlH3EDWK.js +1 -0
  166. package/dist/assets/user-plus-BqwXwD-c.js +1 -0
  167. package/dist/components/ui/button.d.ts +1 -1
  168. package/dist/components/ui/resizable.d.ts +1 -1
  169. package/dist/index.css +1 -1
  170. package/dist/index.css.map +1 -1
  171. package/dist/index.d.ts +1 -0
  172. package/dist/index.esm.js +1 -1
  173. package/dist/index.html +33 -0
  174. package/dist/index.js +1 -1
  175. package/dist/setup/favicon.d.ts +1 -0
  176. package/docs/PUBLISH.md +3 -3
  177. package/package.json +1 -5
  178. package/dist/README.md +0 -1079
  179. package/dist/bin/bootstrap.js +0 -40
  180. package/dist/bin/pull-docs.js +0 -186
  181. 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};