@brunoalz/smartgesti-site-editor 1.4.0 → 1.4.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.
Files changed (73) hide show
  1. package/dist/editor/BlockSelector.js +4 -2
  2. package/dist/editor/BlockSelector.js.map +1 -1
  3. package/dist/engine/export/exportHtml.d.ts +5 -1
  4. package/dist/engine/export/exportHtml.d.ts.map +1 -1
  5. package/dist/engine/export/exportHtml.js +69 -51
  6. package/dist/engine/export/exportHtml.js.map +1 -1
  7. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts +2 -0
  8. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
  9. package/dist/engine/export/exporters/sections/BlogPostExporters.js +137 -80
  10. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
  11. package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
  12. package/dist/engine/export/exporters/sections/index.js +40 -38
  13. package/dist/engine/export/exporters/sections/index.js.map +1 -1
  14. package/dist/engine/index.js +97 -95
  15. package/dist/engine/index.js.map +1 -1
  16. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
  17. package/dist/engine/plugins/builtin/blog/manifest.js +103 -53
  18. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
  19. package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts.map +1 -1
  20. package/dist/engine/plugins/builtin/blog/mockContentProvider.js +13 -9
  21. package/dist/engine/plugins/builtin/blog/mockContentProvider.js.map +1 -1
  22. package/dist/engine/plugins/contentHydration.d.ts.map +1 -1
  23. package/dist/engine/plugins/contentHydration.js +119 -79
  24. package/dist/engine/plugins/contentHydration.js.map +1 -1
  25. package/dist/engine/plugins/types.d.ts +5 -0
  26. package/dist/engine/plugins/types.d.ts.map +1 -1
  27. package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts +3 -0
  28. package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -0
  29. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +53 -0
  30. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -0
  31. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
  32. package/dist/engine/registry/blocks/sections/blogPostDetail.js +4 -1
  33. package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
  34. package/dist/engine/registry/blocks/sections/blogPostGrid.js +4 -4
  35. package/dist/engine/registry/blocks/sections/blogPostGrid.js.map +1 -1
  36. package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts +3 -0
  37. package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -0
  38. package/dist/engine/registry/blocks/sections/blogSearchBar.js +56 -0
  39. package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -0
  40. package/dist/engine/registry/blocks/sections/index.d.ts +2 -0
  41. package/dist/engine/registry/blocks/sections/index.d.ts.map +1 -1
  42. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts +3 -0
  43. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts.map +1 -0
  44. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js +213 -0
  45. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js.map +1 -0
  46. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts +3 -0
  47. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts.map +1 -0
  48. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js +138 -0
  49. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js.map +1 -0
  50. package/dist/engine/render/renderers/sections/index.js +28 -24
  51. package/dist/engine/render/renderers/sections/index.js.map +1 -1
  52. package/dist/engine/schema/siteDocument.d.ts +66 -2
  53. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  54. package/dist/engine/schema/siteDocument.js.map +1 -1
  55. package/dist/hooks/useNavbarAutoSync.d.ts.map +1 -1
  56. package/dist/hooks/useNavbarAutoSync.js +27 -15
  57. package/dist/hooks/useNavbarAutoSync.js.map +1 -1
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +108 -106
  61. package/dist/index.js.map +1 -1
  62. package/dist/utils/blockIcons.d.ts.map +1 -1
  63. package/dist/utils/blockIcons.js +2 -0
  64. package/dist/utils/blockIcons.js.map +1 -1
  65. package/dist/utils/navbarSync.d.ts +3 -1
  66. package/dist/utils/navbarSync.d.ts.map +1 -1
  67. package/dist/utils/navbarSync.js +3 -3
  68. package/dist/utils/navbarSync.js.map +1 -1
  69. package/dist/viewer/LandingPageViewer.d.ts +7 -2
  70. package/dist/viewer/LandingPageViewer.d.ts.map +1 -1
  71. package/dist/viewer/LandingPageViewer.js +106 -92
  72. package/dist/viewer/LandingPageViewer.js.map +1 -1
  73. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { createEmptySiteDocument as te } from "./schema/siteDocument.js";
2
- import { corporateThemeTokens as ae, darkThemeTokens as me, defaultComponentTokens as ie, defaultEffectTokens as pe, defaultLayoutTokens as se, defaultThemeTokens as ne, generateThemeCSSVariables as le, gradientDirectionMap as ce, gradientThemeTokens as ge, playfulThemeTokens as de, radiusScaleMap as fe, shadowScaleMap as he, spacingScaleMap as Pe } from "./schema/themeTokens.js";
3
- import { componentRegistry as xe } from "./registry/registry.js";
1
+ import { createEmptySiteDocument as ae } from "./schema/siteDocument.js";
2
+ import { corporateThemeTokens as ie, darkThemeTokens as pe, defaultComponentTokens as se, defaultEffectTokens as ne, defaultLayoutTokens as le, defaultThemeTokens as ce, generateThemeCSSVariables as ge, gradientDirectionMap as de, gradientThemeTokens as fe, playfulThemeTokens as he, radiusScaleMap as Pe, shadowScaleMap as Te, spacingScaleMap as xe } from "./schema/themeTokens.js";
3
+ import { componentRegistry as ke } from "./registry/registry.js";
4
4
  import "./registry/blocks/layout/container.js";
5
5
  import "./registry/blocks/layout/stack.js";
6
6
  import "./registry/blocks/layout/grid.js";
@@ -45,6 +45,8 @@ import "./registry/blocks/sections/categoryCardGrid.js";
45
45
  import "./registry/blocks/sections/blogPostCard.js";
46
46
  import "./registry/blocks/sections/blogPostGrid.js";
47
47
  import "./registry/blocks/sections/blogPostDetail.js";
48
+ import "./registry/blocks/sections/blogCategoryFilter.js";
49
+ import "./registry/blocks/sections/blogSearchBar.js";
48
50
  import "./registry/blocks/sections/productShowcase.js";
49
51
  import "./registry/blocks/sections/aboutSection.js";
50
52
  import "./registry/blocks/sections/contactSection.js";
@@ -52,99 +54,99 @@ import "./registry/blocks/forms/form.js";
52
54
  import "./registry/blocks/forms/input.js";
53
55
  import "./registry/blocks/forms/textarea.js";
54
56
  import "./registry/blocks/forms/select.js";
55
- import { RenderNode as ke } from "./render/renderNode.js";
56
- import { RenderPage as ye, renderPage as Me } from "./render/renderPage.js";
57
- import { clearHtmlCache as Ve, exportBlockToHtml as be, exportDocumentToHtml as He, exportPageToHtml as ve, generateAssetsManifest as Re } from "./export/exportHtml.js";
58
- import { isSafeUrl as Ae, sanitizeHtml as De } from "./export/sanitizeHtml.js";
59
- import { Preview as Z } from "./preview/Preview.js";
60
- import { applyPatch as Ie, createAddPatch as Ne, createCopyPatch as Oe, createMovePatch as _e, createRemovePatch as we, createReplacePatch as Be } from "./patch/applyPatch.js";
61
- import { HistoryManager as je, createHistoryManager as Ue } from "./patch/history.js";
62
- import { PatchBuilder as ze } from "./patch/PatchBuilder.js";
63
- import { applyOverrides as Ke, classicPreset as qe, cleanPreset as Je, corporatePreset as Qe, getAllPresets as Xe, getPreset as Ye, glassPreset as Ze, minimalPreset as $e, neonPreset as er, pastelPreset as rr, playfulKidsPreset as tr, themePresets as or, validateContrast as ar } from "./presets/themePresets.js";
64
- import { HERO_IMAGE_NAMES as ir, PLACEHOLDER_IMAGE_URL as pr, getHeroVariation as sr, heroVariationIds as nr, heroVariations as lr } from "./presets/heroVariations.js";
65
- import { getNavbarVariation as gr, navbarVariationIds as dr, navbarVariations as fr } from "./presets/navbarVariations.js";
66
- import { generateCompleteLandingPage as Pr, generateModernLandingPage as Tr, generatePatchesForLandingPage as xr } from "./generators/generateLandingPage.js";
57
+ import { RenderNode as ye } from "./render/renderNode.js";
58
+ import { RenderPage as Ce, renderPage as Ve } from "./render/renderPage.js";
59
+ import { clearHtmlCache as He, exportBlockToHtml as ve, exportDocumentToHtml as Re, exportPageToHtml as Ee, generateAssetsManifest as Ae } from "./export/exportHtml.js";
60
+ import { isSafeUrl as Le, sanitizeHtml as Ie } from "./export/sanitizeHtml.js";
61
+ import { Preview as ee } from "./preview/Preview.js";
62
+ import { applyPatch as Oe, createAddPatch as _e, createCopyPatch as we, createMovePatch as Be, createRemovePatch as Ge, createReplacePatch as je } from "./patch/applyPatch.js";
63
+ import { HistoryManager as We, createHistoryManager as ze } from "./patch/history.js";
64
+ import { PatchBuilder as Ke } from "./patch/PatchBuilder.js";
65
+ import { applyOverrides as Je, classicPreset as Qe, cleanPreset as Xe, corporatePreset as Ye, getAllPresets as Ze, getPreset as $e, glassPreset as er, minimalPreset as rr, neonPreset as tr, pastelPreset as or, playfulKidsPreset as ar, themePresets as mr, validateContrast as ir } from "./presets/themePresets.js";
66
+ import { HERO_IMAGE_NAMES as sr, PLACEHOLDER_IMAGE_URL as nr, getHeroVariation as lr, heroVariationIds as cr, heroVariations as gr } from "./presets/heroVariations.js";
67
+ import { getNavbarVariation as fr, navbarVariationIds as hr, navbarVariations as Pr } from "./presets/navbarVariations.js";
68
+ import { generateCompleteLandingPage as xr, generateModernLandingPage as Sr, generatePatchesForLandingPage as kr } from "./generators/generateLandingPage.js";
67
69
  import "./plugins/builtin/blog/manifest.js";
68
- import { evaluateShowWhen as kr } from "./shared/showWhen.js";
69
- import { createThemeStyle as yr, generateCSSVariables as Mr, generateCSSVariablesObject as Cr, mergeThemeTokens as Vr } from "./theme/generateCSSVariables.js";
70
- import { gridPresetMap as Hr, imageGridPresetIds as vr } from "./shared/imageGrid/presets.js";
71
- import { hydratePageWithContent as Er } from "./plugins/contentHydration.js";
72
- import { matchDynamicPage as Dr } from "./plugins/dynamicPageResolver.js";
73
- import { pluginRegistry as Ir } from "./plugins/pluginRegistry.js";
74
- import { renderBlockNode as Or } from "./render/renderNodeImpl.js";
75
- import { darkTheme as wr, defaultTheme as Br } from "./theme/defaultTheme.js";
70
+ import { evaluateShowWhen as yr } from "./shared/showWhen.js";
71
+ import { createThemeStyle as Cr, generateCSSVariables as Vr, generateCSSVariablesObject as br, mergeThemeTokens as Hr } from "./theme/generateCSSVariables.js";
72
+ import { gridPresetMap as Rr, imageGridPresetIds as Er } from "./shared/imageGrid/presets.js";
73
+ import { hydratePageWithContent as Dr } from "./plugins/contentHydration.js";
74
+ import { matchDynamicPage as Ir } from "./plugins/dynamicPageResolver.js";
75
+ import { pluginRegistry as Or } from "./plugins/pluginRegistry.js";
76
+ import { renderBlockNode as wr } from "./render/renderNodeImpl.js";
77
+ import { darkTheme as Gr, defaultTheme as jr } from "./theme/defaultTheme.js";
76
78
  export {
77
- ir as HERO_IMAGE_NAMES,
78
- je as HistoryManager,
79
- pr as PLACEHOLDER_IMAGE_URL,
80
- ze as PatchBuilder,
81
- Z as Preview,
82
- ke as RenderNode,
83
- ye as RenderPage,
84
- Ke as applyOverrides,
85
- Ie as applyPatch,
86
- qe as classicPreset,
87
- Je as cleanPreset,
88
- Ve as clearHtmlCache,
89
- xe as componentRegistry,
90
- Qe as corporatePreset,
91
- ae as corporateThemeTokens,
92
- Ne as createAddPatch,
93
- Oe as createCopyPatch,
94
- te as createEmptySiteDocument,
95
- Ue as createHistoryManager,
96
- _e as createMovePatch,
97
- we as createRemovePatch,
98
- Be as createReplacePatch,
99
- yr as createSiteThemeStyle,
100
- me as darkThemeTokens,
101
- ie as defaultComponentTokens,
102
- pe as defaultEffectTokens,
103
- se as defaultLayoutTokens,
104
- ne as defaultThemeTokens,
105
- kr as evaluateShowWhen,
106
- be as exportBlockToHtml,
107
- He as exportDocumentToHtml,
108
- ve as exportPageToHtml,
109
- Re as generateAssetsManifest,
110
- Pr as generateCompleteLandingPage,
111
- Tr as generateModernLandingPage,
112
- xr as generatePatchesForLandingPage,
113
- Mr as generateSiteCSSVariables,
114
- Cr as generateSiteCSSVariablesObject,
115
- le as generateThemeCSSVariables,
116
- Xe as getAllPresets,
117
- sr as getHeroVariation,
118
- gr as getNavbarVariation,
119
- Ye as getPreset,
120
- Ze as glassPreset,
121
- ce as gradientDirectionMap,
122
- ge as gradientThemeTokens,
123
- Hr as gridPresetMap,
124
- nr as heroVariationIds,
125
- lr as heroVariations,
126
- Er as hydratePageWithContent,
127
- vr as imageGridPresetIds,
128
- Ae as isSafeUrl,
129
- Dr as matchDynamicPage,
130
- Vr as mergeSiteThemeTokens,
131
- $e as minimalPreset,
132
- dr as navbarVariationIds,
133
- fr as navbarVariations,
134
- er as neonPreset,
135
- rr as pastelPreset,
136
- tr as playfulKidsPreset,
137
- de as playfulThemeTokens,
138
- Ir as pluginRegistry,
139
- fe as radiusScaleMap,
140
- Or as renderNode,
141
- Me as renderPage,
142
- De as sanitizeHtml,
143
- he as shadowScaleMap,
144
- wr as siteDarkTheme,
145
- Br as siteDefaultTheme,
146
- Pe as spacingScaleMap,
147
- or as themePresets,
148
- ar as validateContrast
79
+ sr as HERO_IMAGE_NAMES,
80
+ We as HistoryManager,
81
+ nr as PLACEHOLDER_IMAGE_URL,
82
+ Ke as PatchBuilder,
83
+ ee as Preview,
84
+ ye as RenderNode,
85
+ Ce as RenderPage,
86
+ Je as applyOverrides,
87
+ Oe as applyPatch,
88
+ Qe as classicPreset,
89
+ Xe as cleanPreset,
90
+ He as clearHtmlCache,
91
+ ke as componentRegistry,
92
+ Ye as corporatePreset,
93
+ ie as corporateThemeTokens,
94
+ _e as createAddPatch,
95
+ we as createCopyPatch,
96
+ ae as createEmptySiteDocument,
97
+ ze as createHistoryManager,
98
+ Be as createMovePatch,
99
+ Ge as createRemovePatch,
100
+ je as createReplacePatch,
101
+ Cr as createSiteThemeStyle,
102
+ pe as darkThemeTokens,
103
+ se as defaultComponentTokens,
104
+ ne as defaultEffectTokens,
105
+ le as defaultLayoutTokens,
106
+ ce as defaultThemeTokens,
107
+ yr as evaluateShowWhen,
108
+ ve as exportBlockToHtml,
109
+ Re as exportDocumentToHtml,
110
+ Ee as exportPageToHtml,
111
+ Ae as generateAssetsManifest,
112
+ xr as generateCompleteLandingPage,
113
+ Sr as generateModernLandingPage,
114
+ kr as generatePatchesForLandingPage,
115
+ Vr as generateSiteCSSVariables,
116
+ br as generateSiteCSSVariablesObject,
117
+ ge as generateThemeCSSVariables,
118
+ Ze as getAllPresets,
119
+ lr as getHeroVariation,
120
+ fr as getNavbarVariation,
121
+ $e as getPreset,
122
+ er as glassPreset,
123
+ de as gradientDirectionMap,
124
+ fe as gradientThemeTokens,
125
+ Rr as gridPresetMap,
126
+ cr as heroVariationIds,
127
+ gr as heroVariations,
128
+ Dr as hydratePageWithContent,
129
+ Er as imageGridPresetIds,
130
+ Le as isSafeUrl,
131
+ Ir as matchDynamicPage,
132
+ Hr as mergeSiteThemeTokens,
133
+ rr as minimalPreset,
134
+ hr as navbarVariationIds,
135
+ Pr as navbarVariations,
136
+ tr as neonPreset,
137
+ or as pastelPreset,
138
+ ar as playfulKidsPreset,
139
+ he as playfulThemeTokens,
140
+ Or as pluginRegistry,
141
+ Pe as radiusScaleMap,
142
+ wr as renderNode,
143
+ Ve as renderPage,
144
+ Ie as sanitizeHtml,
145
+ Te as shadowScaleMap,
146
+ Gr as siteDarkTheme,
147
+ jr as siteDefaultTheme,
148
+ xe as spacingScaleMap,
149
+ mr as themePresets,
150
+ ir as validateContrast
149
151
  };
150
152
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../../../src/engine/plugins/builtin/blog/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAqFtD,eAAO,MAAM,UAAU,EAAE,kBAiSxB,CAAC"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../../../src/engine/plugins/builtin/blog/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAqFtD,eAAO,MAAM,UAAU,EAAE,kBA0XxB,CAAC"}
@@ -1,6 +1,6 @@
1
- import { pluginRegistry as h } from "../../pluginRegistry.js";
2
- import { logger as n } from "../../../../utils/logger.js";
3
- const g = "plugin-blog-home-grid", c = [
1
+ import { pluginRegistry as f } from "../../pluginRegistry.js";
2
+ import { logger as d } from "../../../../utils/logger.js";
3
+ const u = "plugin-blog-home-grid", h = [
4
4
  {
5
5
  title: "Feira de Ciências 2026: Inovação e Criatividade",
6
6
  excerpt: "Nossos alunos apresentaram projetos incríveis na Feira de Ciências deste ano. Confira os destaques e premiações!",
@@ -58,10 +58,10 @@ const g = "plugin-blog-home-grid", c = [
58
58
  <p>Os três projetos finalistas representarão nossa escola na <strong>Feira Regional de Ciências</strong>, que acontecerá em março na capital. Os alunos já estão se preparando para levar suas apresentações a um público ainda maior.</p>
59
59
  <p>Parabéns a todos os participantes, professores orientadores e famílias que apoiaram essa jornada de descobertas!</p>
60
60
  `.trim();
61
- function p(o, s) {
62
- return { ...JSON.parse(JSON.stringify(o)), id: s };
61
+ function m(s, l) {
62
+ return { ...JSON.parse(JSON.stringify(s)), id: l };
63
63
  }
64
- const f = {
64
+ const y = {
65
65
  manifest: {
66
66
  id: "blog",
67
67
  version: "1.0.0",
@@ -69,7 +69,7 @@ const f = {
69
69
  description: "Blog com posts, categorias e tags",
70
70
  icon: "FileText",
71
71
  capabilities: {
72
- blocks: ["blogPostCard", "blogPostGrid", "blogPostDetail"],
72
+ blocks: ["blogPostCard", "blogPostGrid", "blogPostDetail", "blogCategoryFilter", "blogSearchBar"],
73
73
  pageTemplates: [
74
74
  {
75
75
  id: "blog-listing",
@@ -112,7 +112,10 @@ const f = {
112
112
  { name: "category", type: "string", label: "Category" },
113
113
  { name: "tags", type: "array", label: "Tags" },
114
114
  { name: "authorVariant", type: "string", label: "Author Variant" },
115
- { name: "readingTime", type: "number", label: "Reading Time" }
115
+ { name: "readingTime", type: "number", label: "Reading Time" },
116
+ { name: "metaTitle", type: "string", label: "Meta Title (SEO)" },
117
+ { name: "metaDescription", type: "string", label: "Meta Description (SEO)" },
118
+ { name: "ogImage", type: "image", label: "Open Graph Image" }
116
119
  ]
117
120
  }
118
121
  ],
@@ -125,39 +128,53 @@ const f = {
125
128
  requiredPages: ["blog-listing", "blog-post"]
126
129
  }
127
130
  },
128
- onActivate(o) {
129
- n.debug("Blog plugin activating...");
130
- const s = new Set(o.pages.map((e) => e.id)), a = [...o.pages], i = o.pages.find((e) => e.slug === "home") || o.pages[0], t = i?.structure.find((e) => e.type === "navbar"), l = i?.structure.find((e) => e.type === "footer");
131
- if (i) {
132
- const e = a.findIndex((r) => r.id === i.id), m = i.structure.some(
133
- (r) => r.id === g
131
+ onActivate(s) {
132
+ d.debug("Blog plugin activating...");
133
+ const l = new Set(s.pages.map((e) => e.id)), o = [...s.pages], t = s.pages.find((e) => e.slug === "home") || s.pages[0], n = t?.structure.find((e) => e.type === "navbar"), i = t?.structure.find((e) => e.type === "footer");
134
+ if (t && n) {
135
+ const e = o.findIndex((r) => r.id === t.id);
136
+ if (e >= 0) {
137
+ const r = n.props, a = Array.isArray(r.links) ? [...r.links] : [];
138
+ if (!a.some(
139
+ (p) => p.href === "/p/blog"
140
+ )) {
141
+ const p = a.length > 0 ? a.length - 1 : 0;
142
+ a.splice(p, 0, { text: "Blog", href: "/p/blog" });
143
+ const b = o[e].structure.map((c) => c.id === n.id ? { ...c, props: { ...c.props, links: a } } : c);
144
+ o[e] = { ...o[e], structure: b }, d.debug("Blog link added to home navbar"), n.props = { ...r, links: a };
145
+ }
146
+ }
147
+ }
148
+ if (t) {
149
+ const e = o.findIndex((a) => a.id === t.id), r = t.structure.some(
150
+ (a) => a.id === u
134
151
  );
135
- if (e >= 0 && !m) {
136
- const r = {
137
- id: g,
152
+ if (e >= 0 && !r) {
153
+ const a = {
154
+ id: u,
138
155
  type: "blogPostGrid",
139
156
  props: {
140
157
  title: "Blog",
141
158
  subtitle: "Últimas publicações",
142
159
  columns: 3,
143
- cards: c,
160
+ cards: h,
144
161
  variant: "default",
145
162
  showViewAll: !0,
146
163
  viewAllText: "Ver todos os posts",
147
164
  viewAllHref: "/site/p/blog"
148
165
  }
149
- }, d = [...a[e].structure], u = d.findIndex(
166
+ }, g = [...o[e].structure], p = g.findIndex(
150
167
  (b) => b.type === "footer"
151
168
  );
152
- u >= 0 ? d.splice(u, 0, r) : d.push(r), a[e] = {
153
- ...a[e],
154
- structure: d
155
- }, n.debug("Blog section injected into home page");
169
+ p >= 0 ? g.splice(p, 0, a) : g.push(a), o[e] = {
170
+ ...o[e],
171
+ structure: g
172
+ }, d.debug("Blog section injected into home page");
156
173
  }
157
174
  }
158
- if (!s.has("blog")) {
175
+ if (!l.has("blog")) {
159
176
  const e = [];
160
- t && e.push(p(t, "blog-page-navbar")), e.push({
177
+ n && e.push(m(n, "blog-page-navbar")), e.push({
161
178
  id: "blog-page-hero",
162
179
  type: "hero",
163
180
  props: {
@@ -171,6 +188,31 @@ const f = {
171
188
  background: "#4f46e5",
172
189
  minHeight: "280px"
173
190
  }
191
+ }), e.push({
192
+ id: "blog-search-bar",
193
+ type: "blogSearchBar",
194
+ props: {
195
+ placeholder: "Buscar posts...",
196
+ variant: "simple",
197
+ showIcon: !0,
198
+ searchUrl: "/site/p/blog"
199
+ }
200
+ }), e.push({
201
+ id: "blog-category-filter",
202
+ type: "blogCategoryFilter",
203
+ props: {
204
+ title: "",
205
+ categories: h.map((r) => ({
206
+ name: r.category,
207
+ slug: r.category.toLowerCase().replace(/\s+/g, "-"),
208
+ count: 1
209
+ })),
210
+ variant: "chips",
211
+ showCount: !1,
212
+ showAll: !0,
213
+ allLabel: "Todas",
214
+ filterUrl: "/site/p/blog"
215
+ }
174
216
  }), e.push({
175
217
  id: "blog-grid-main",
176
218
  type: "blogPostGrid",
@@ -178,13 +220,13 @@ const f = {
178
220
  title: "",
179
221
  subtitle: "",
180
222
  columns: 3,
181
- cards: c,
223
+ cards: h,
182
224
  variant: "default",
183
225
  showViewAll: !1,
184
226
  viewAllText: "Ver todos",
185
- viewAllHref: "/blog"
227
+ viewAllHref: "/site/p/blog"
186
228
  }
187
- }), l && e.push(p(l, "blog-page-footer")), a.push({
229
+ }), i && e.push(m(i, "blog-page-footer")), o.push({
188
230
  id: "blog",
189
231
  name: "Blog",
190
232
  slug: "blog",
@@ -195,11 +237,11 @@ const f = {
195
237
  provider: "blog-posts",
196
238
  mode: "list"
197
239
  }
198
- }), n.debug("Blog listing page created");
240
+ }), d.debug("Blog listing page created");
199
241
  }
200
- if (!s.has("blog-post")) {
242
+ if (!l.has("blog-post")) {
201
243
  const e = [];
202
- t && e.push(p(t, "post-page-navbar")), e.push({
244
+ n && e.push(m(n, "post-page-navbar")), e.push({
203
245
  id: "blog-detail-main",
204
246
  type: "blogPostDetail",
205
247
  props: {
@@ -218,7 +260,7 @@ const f = {
218
260
  showReadingTime: !0,
219
261
  contentMaxWidth: "720px"
220
262
  }
221
- }), l && e.push(p(l, "post-page-footer")), a.push({
263
+ }), i && e.push(m(i, "post-page-footer")), o.push({
222
264
  id: "blog-post",
223
265
  name: "Post",
224
266
  slug: "blog/:slug",
@@ -235,39 +277,47 @@ const f = {
235
277
  lockedStructure: !0,
236
278
  nonRemovable: !0
237
279
  }
238
- }), n.debug("Blog post detail page created");
280
+ }), d.debug("Blog post detail page created");
239
281
  }
240
282
  return {
241
- ...o,
242
- pages: a
283
+ ...s,
284
+ pages: o
243
285
  };
244
286
  },
245
- onDeactivate(o) {
246
- n.debug("Blog plugin deactivating...");
247
- const s = o.pages.filter((a) => a.pluginId !== "blog").map((a) => a.structure.some(
248
- (t) => t.id === g
249
- ) ? {
250
- ...a,
251
- structure: a.structure.filter(
252
- (t) => t.id !== g
253
- )
254
- } : a);
255
- return n.debug(
256
- `Removed ${o.pages.length - s.length} blog page(s) and injected section`
287
+ onDeactivate(s) {
288
+ d.debug("Blog plugin deactivating...");
289
+ const l = s.pages.filter((o) => o.pluginId !== "blog").map((o) => {
290
+ let t = o.structure;
291
+ return t.some(
292
+ (i) => i.id === u
293
+ ) && (t = t.filter(
294
+ (i) => i.id !== u
295
+ )), t = t.map((i) => {
296
+ if (i.type !== "navbar") return i;
297
+ const e = i.props, r = Array.isArray(e.links) ? e.links : [], a = r.filter((g) => g.href !== "/p/blog");
298
+ return a.length !== r.length ? { ...i, props: { ...e, links: a } } : i;
299
+ }), t !== o.structure ? { ...o, structure: t } : o;
300
+ });
301
+ return d.debug(
302
+ `Removed ${s.pages.length - l.length} blog page(s) and injected section`
257
303
  ), {
258
- ...o,
259
- pages: s
304
+ ...s,
305
+ pages: l
260
306
  };
261
307
  },
262
- getEditorRestrictions(o) {
263
- if (o === "blogPostDetail")
308
+ getEditorRestrictions(s) {
309
+ if (s === "blogPostDetail")
264
310
  return {
265
311
  lockedFields: ["content", "date"]
266
312
  };
313
+ if (s === "blogCategoryFilter")
314
+ return {
315
+ lockedFields: ["categories"]
316
+ };
267
317
  }
268
318
  };
269
- h.register(f);
319
+ f.register(y);
270
320
  export {
271
- f as blogPlugin
321
+ y as blogPlugin
272
322
  };
273
323
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sources":["../../../../../src/engine/plugins/builtin/blog/manifest.ts"],"sourcesContent":["/**\n * Blog Plugin Manifest\n * Plugin para blog com posts, categorias e tags.\n *\n * onActivate:\n * 1. Injeta seção blogPostGrid na home page (antes do footer)\n * 2. Cria página \"Blog\" com navbar + grid de posts + footer\n * 3. Cria página \"Post\" com navbar + detalhe do post + footer\n *\n * onDeactivate:\n * 1. Remove a seção injetada na home page\n * 2. Remove as páginas do plugin\n */\n\nimport type { PluginRegistration } from \"../../types\";\nimport type { SiteDocument, Block, BlockType } from \"../../../schema/siteDocument\";\nimport { pluginRegistry } from \"../../pluginRegistry\";\nimport { logger } from \"../../../../utils/logger\";\n\n// ─── ID usado para a seção de blog injetada na home page ───\nconst BLOG_HOME_SECTION_ID = \"plugin-blog-home-grid\";\n\n// ─── Sample blog cards para preview ───\nconst SAMPLE_BLOG_CARDS = [\n {\n title: \"Feira de Ciências 2026: Inovação e Criatividade\",\n excerpt:\n \"Nossos alunos apresentaram projetos incríveis na Feira de Ciências deste ano. Confira os destaques e premiações!\",\n image:\n \"https://images.unsplash.com/photo-1567168544230-3b9e5ec47659?w=800&h=400&fit=crop\",\n category: \"Eventos\",\n date: \"05 Fev 2026\",\n linkHref: \"/site/p/blog/feira-de-ciencias-2026\",\n linkText: \"Ler mais\",\n },\n {\n title: \"Matrículas Abertas para o Segundo Semestre\",\n excerpt:\n \"Garanta a vaga do seu filho na melhor escola da região. Condições especiais para matrículas antecipadas.\",\n image:\n \"https://images.unsplash.com/photo-1523050854058-8df90110c9f1?w=800&h=400&fit=crop\",\n category: \"Institucional\",\n date: \"01 Fev 2026\",\n linkHref: \"/site/p/blog/matriculas-segundo-semestre\",\n linkText: \"Ler mais\",\n },\n {\n title: \"5 Dicas para Preparar seu Filho para o Ano Letivo\",\n excerpt:\n \"Dicas práticas para uma transição tranquila e um início de ano produtivo para toda a família.\",\n image:\n \"https://images.unsplash.com/photo-1503676260728-1c00da094a0b?w=800&h=400&fit=crop\",\n category: \"Educação\",\n date: \"28 Jan 2026\",\n linkHref: \"/site/p/blog/dicas-preparar-ano-letivo\",\n linkText: \"Ler mais\",\n },\n];\n\n// ─── Conteúdo HTML rico para o post de exemplo ───\nconst SAMPLE_POST_CONTENT = `\n<h2>O que é a Feira de Ciências?</h2>\n<p>A Feira de Ciências é um evento anual que celebra a curiosidade, a pesquisa e a criatividade dos nossos alunos. Nesta edição especial de 2026, recebemos mais de <strong>500 visitantes</strong> e contamos com a participação de todas as turmas do Ensino Fundamental e Médio.</p>\n<p>Este ano, o tema central foi <em>\"Ciência e Sustentabilidade\"</em>, incentivando os estudantes a desenvolverem projetos que aliassem inovação tecnológica com responsabilidade ambiental.</p>\n\n<h2>Destaques da Edição 2026</h2>\n<p>Entre os mais de 50 projetos apresentados, alguns se destacaram pela originalidade e impacto:</p>\n<ul>\n <li><strong>Jardim Sustentável Inteligente</strong> — Alunos do 5º ano desenvolveram um sistema de irrigação automática usando sensores de umidade e placa Arduino.</li>\n <li><strong>Robótica Educacional</strong> — A turma do 8º ano criou um robô que auxilia no ensino de matemática para crianças do 1º ao 3º ano.</li>\n <li><strong>Energia Solar na Escola</strong> — Projeto do 2º ano do Ensino Médio demonstrou como painéis solares poderiam reduzir em 40% o consumo de energia da escola.</li>\n</ul>\n\n<blockquote>\n <p>\"A Feira de Ciências é um dos momentos mais importantes do nosso calendário escolar. Ver a dedicação e o brilho nos olhos dos alunos ao apresentarem seus projetos nos enche de orgulho e nos motiva a continuar investindo em educação de qualidade.\"</p>\n <p><strong>— Prof. Maria Silva, Coordenadora Pedagógica</strong></p>\n</blockquote>\n\n<h2>Premiações</h2>\n<p>O júri, composto por professores universitários e profissionais da área de tecnologia, selecionou os três melhores projetos:</p>\n<ol>\n <li><strong>1º Lugar:</strong> Jardim Sustentável Inteligente (5º ano)</li>\n <li><strong>2º Lugar:</strong> Energia Solar na Escola (2º EM)</li>\n <li><strong>3º Lugar:</strong> Robótica Educacional (8º ano)</li>\n</ol>\n\n<h2>Próximos Passos</h2>\n<p>Os três projetos finalistas representarão nossa escola na <strong>Feira Regional de Ciências</strong>, que acontecerá em março na capital. Os alunos já estão se preparando para levar suas apresentações a um público ainda maior.</p>\n<p>Parabéns a todos os participantes, professores orientadores e famílias que apoiaram essa jornada de descobertas!</p>\n`.trim();\n\n/**\n * Deep-clone um bloco com novo ID\n */\nfunction cloneBlock(block: Block, newId: string): Block {\n const cloned: Block = JSON.parse(JSON.stringify(block));\n return { ...cloned, id: newId };\n}\n\nexport const blogPlugin: PluginRegistration = {\n manifest: {\n id: \"blog\",\n version: \"1.0.0\",\n name: \"Blog\",\n description: \"Blog com posts, categorias e tags\",\n icon: \"FileText\",\n\n capabilities: {\n blocks: [\"blogPostCard\", \"blogPostGrid\", \"blogPostDetail\"],\n\n pageTemplates: [\n {\n id: \"blog-listing\",\n name: \"Blog\",\n slug: \"blog\",\n pluginId: \"blog\",\n structure: [],\n dataSource: {\n provider: \"blog-posts\",\n mode: \"list\",\n },\n },\n {\n id: \"blog-post\",\n name: \"Post\",\n slug: \"blog/:slug\",\n pluginId: \"blog\",\n structure: [],\n dataSource: {\n provider: \"blog-posts\",\n mode: \"single\",\n paramMapping: { slug: \":slug\" },\n },\n editRestrictions: {\n lockedStructure: true,\n nonRemovable: true,\n },\n },\n ],\n\n dataSchemas: [\n {\n type: \"blog-post\",\n label: \"Blog Post\",\n fields: [\n { name: \"title\", type: \"string\", required: true, label: \"Title\" },\n { name: \"slug\", type: \"string\", required: true, label: \"Slug\" },\n { name: \"excerpt\", type: \"string\", label: \"Excerpt\" },\n { name: \"content\", type: \"richtext\", required: true, label: \"Content\" },\n { name: \"featuredImage\", type: \"image\", label: \"Featured Image\" },\n { name: \"category\", type: \"string\", label: \"Category\" },\n { name: \"tags\", type: \"array\", label: \"Tags\" },\n { name: \"authorVariant\", type: \"string\", label: \"Author Variant\" },\n { name: \"readingTime\", type: \"number\", label: \"Reading Time\" },\n ],\n },\n ],\n\n contentProviders: [\"blog-posts\", \"blog-categories\"],\n },\n\n restrictions: {\n lockedFields: {\n blogPostDetail: [\"content\", \"date\"],\n },\n requiredPages: [\"blog-listing\", \"blog-post\"],\n },\n },\n\n onActivate(document: SiteDocument): SiteDocument {\n logger.debug(\"Blog plugin activating...\");\n\n const existingPageIds = new Set(document.pages.map((p) => p.id));\n const newPages = [...document.pages];\n\n // ── Encontrar home page para clonar navbar/footer ──\n const homePage =\n document.pages.find((p) => p.slug === \"home\") || document.pages[0];\n\n const homeNavbar = homePage?.structure.find((b) => b.type === \"navbar\");\n const homeFooter = homePage?.structure.find((b) => b.type === \"footer\");\n\n // ── 1. Injetar seção de blog na home page (antes do footer) ──\n if (homePage) {\n const homeIdx = newPages.findIndex((p) => p.id === homePage.id);\n const alreadyInjected = homePage.structure.some(\n (b) => b.id === BLOG_HOME_SECTION_ID,\n );\n\n if (homeIdx >= 0 && !alreadyInjected) {\n const blogHomeSection: Block = {\n id: BLOG_HOME_SECTION_ID,\n type: \"blogPostGrid\",\n props: {\n title: \"Blog\",\n subtitle: \"Últimas publicações\",\n columns: 3,\n cards: SAMPLE_BLOG_CARDS,\n variant: \"default\",\n showViewAll: true,\n viewAllText: \"Ver todos os posts\",\n viewAllHref: \"/site/p/blog\",\n },\n } as Block;\n\n const updatedStructure = [...newPages[homeIdx].structure];\n const footerIdx = updatedStructure.findIndex(\n (b) => b.type === \"footer\",\n );\n\n if (footerIdx >= 0) {\n updatedStructure.splice(footerIdx, 0, blogHomeSection);\n } else {\n updatedStructure.push(blogHomeSection);\n }\n\n newPages[homeIdx] = {\n ...newPages[homeIdx],\n structure: updatedStructure,\n };\n logger.debug(\"Blog section injected into home page\");\n }\n }\n\n // ── 2. Criar página \"Blog\" (listagem completa) ──\n if (!existingPageIds.has(\"blog\")) {\n const blogPageStructure: Block[] = [];\n\n // Navbar clonada da home\n if (homeNavbar) {\n blogPageStructure.push(cloneBlock(homeNavbar, \"blog-page-navbar\"));\n }\n\n // Hero banner do blog\n blogPageStructure.push({\n id: \"blog-page-hero\",\n type: \"hero\",\n props: {\n title: \"Blog\",\n subtitle: \"Novidades & Publicações\",\n description:\n \"Acompanhe as últimas novidades, eventos e conquistas da nossa comunidade escolar.\",\n variant: \"centered\",\n align: \"center\",\n overlay: true,\n overlayColor: \"rgba(79, 70, 229, 0.9)\",\n background: \"#4f46e5\",\n minHeight: \"280px\",\n },\n } as Block);\n\n // Grid de posts\n blogPageStructure.push({\n id: \"blog-grid-main\",\n type: \"blogPostGrid\",\n props: {\n title: \"\",\n subtitle: \"\",\n columns: 3,\n cards: SAMPLE_BLOG_CARDS,\n variant: \"default\",\n showViewAll: false,\n viewAllText: \"Ver todos\",\n viewAllHref: \"/blog\",\n },\n } as Block);\n\n // Footer clonado da home\n if (homeFooter) {\n blogPageStructure.push(cloneBlock(homeFooter, \"blog-page-footer\"));\n }\n\n newPages.push({\n id: \"blog\",\n name: \"Blog\",\n slug: \"blog\",\n pluginId: \"blog\",\n pageTemplateId: \"blog-listing\",\n structure: blogPageStructure,\n dataSource: {\n provider: \"blog-posts\",\n mode: \"list\",\n },\n });\n logger.debug(\"Blog listing page created\");\n }\n\n // ── 3. Criar página \"Post\" (detalhe) ──\n if (!existingPageIds.has(\"blog-post\")) {\n const postPageStructure: Block[] = [];\n\n if (homeNavbar) {\n postPageStructure.push(cloneBlock(homeNavbar, \"post-page-navbar\"));\n }\n\n postPageStructure.push({\n id: \"blog-detail-main\",\n type: \"blogPostDetail\",\n props: {\n title: \"Feira de Ciências 2026: Inovação e Criatividade\",\n content: SAMPLE_POST_CONTENT,\n featuredImage:\n \"https://images.unsplash.com/photo-1567168544230-3b9e5ec47659?w=1200&h=600&fit=crop\",\n date: \"05 Fev 2026\",\n category: \"Eventos\",\n authorVariant: \"inline\",\n readingTime: \"5 min de leitura\",\n tags: [\"Feira de Ciências\", \"Eventos\", \"Sustentabilidade\", \"Projetos\"],\n showFeaturedImage: true,\n showAuthor: true,\n showDate: true,\n showTags: true,\n showReadingTime: true,\n contentMaxWidth: \"720px\",\n },\n } as Block);\n\n if (homeFooter) {\n postPageStructure.push(cloneBlock(homeFooter, \"post-page-footer\"));\n }\n\n newPages.push({\n id: \"blog-post\",\n name: \"Post\",\n slug: \"blog/:slug\",\n pluginId: \"blog\",\n pageTemplateId: \"blog-post\",\n isDynamic: true,\n structure: postPageStructure,\n dataSource: {\n provider: \"blog-posts\",\n mode: \"single\",\n paramMapping: { slug: \":slug\" },\n },\n editRestrictions: {\n lockedStructure: true,\n nonRemovable: true,\n },\n });\n logger.debug(\"Blog post detail page created\");\n }\n\n return {\n ...document,\n pages: newPages,\n };\n },\n\n onDeactivate(document: SiteDocument): SiteDocument {\n logger.debug(\"Blog plugin deactivating...\");\n\n const newPages = document.pages\n // Remover páginas do plugin\n .filter((page) => page.pluginId !== \"blog\")\n // Remover seção de blog injetada na home page\n .map((page) => {\n const hasInjected = page.structure.some(\n (b) => b.id === BLOG_HOME_SECTION_ID,\n );\n if (hasInjected) {\n return {\n ...page,\n structure: page.structure.filter(\n (b) => b.id !== BLOG_HOME_SECTION_ID,\n ),\n };\n }\n return page;\n });\n\n logger.debug(\n `Removed ${document.pages.length - newPages.length} blog page(s) and injected section`,\n );\n\n return {\n ...document,\n pages: newPages,\n };\n },\n\n getEditorRestrictions(blockType: BlockType) {\n if (blockType === \"blogPostDetail\") {\n return {\n lockedFields: [\"content\", \"date\"],\n };\n }\n return undefined;\n },\n};\n\n// Auto-registrar o plugin (side effect — como os blocos fazem com componentRegistry)\npluginRegistry.register(blogPlugin);\n"],"names":["BLOG_HOME_SECTION_ID","SAMPLE_BLOG_CARDS","SAMPLE_POST_CONTENT","cloneBlock","block","newId","blogPlugin","document","logger","existingPageIds","p","newPages","homePage","homeNavbar","b","homeFooter","homeIdx","alreadyInjected","blogHomeSection","updatedStructure","footerIdx","blogPageStructure","postPageStructure","page","blockType","pluginRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sources":["../../../../../src/engine/plugins/builtin/blog/manifest.ts"],"sourcesContent":["/**\n * Blog Plugin Manifest\n * Plugin para blog com posts, categorias e tags.\n *\n * onActivate:\n * 1. Injeta seção blogPostGrid na home page (antes do footer)\n * 2. Cria página \"Blog\" com navbar + grid de posts + footer\n * 3. Cria página \"Post\" com navbar + detalhe do post + footer\n *\n * onDeactivate:\n * 1. Remove a seção injetada na home page\n * 2. Remove as páginas do plugin\n */\n\nimport type { PluginRegistration } from \"../../types\";\nimport type { SiteDocument, Block, BlockType } from \"../../../schema/siteDocument\";\nimport { pluginRegistry } from \"../../pluginRegistry\";\nimport { logger } from \"../../../../utils/logger\";\n\n// ─── ID usado para a seção de blog injetada na home page ───\nconst BLOG_HOME_SECTION_ID = \"plugin-blog-home-grid\";\n\n// ─── Sample blog cards para preview ───\nconst SAMPLE_BLOG_CARDS = [\n {\n title: \"Feira de Ciências 2026: Inovação e Criatividade\",\n excerpt:\n \"Nossos alunos apresentaram projetos incríveis na Feira de Ciências deste ano. Confira os destaques e premiações!\",\n image:\n \"https://images.unsplash.com/photo-1567168544230-3b9e5ec47659?w=800&h=400&fit=crop\",\n category: \"Eventos\",\n date: \"05 Fev 2026\",\n linkHref: \"/site/p/blog/feira-de-ciencias-2026\",\n linkText: \"Ler mais\",\n },\n {\n title: \"Matrículas Abertas para o Segundo Semestre\",\n excerpt:\n \"Garanta a vaga do seu filho na melhor escola da região. Condições especiais para matrículas antecipadas.\",\n image:\n \"https://images.unsplash.com/photo-1523050854058-8df90110c9f1?w=800&h=400&fit=crop\",\n category: \"Institucional\",\n date: \"01 Fev 2026\",\n linkHref: \"/site/p/blog/matriculas-segundo-semestre\",\n linkText: \"Ler mais\",\n },\n {\n title: \"5 Dicas para Preparar seu Filho para o Ano Letivo\",\n excerpt:\n \"Dicas práticas para uma transição tranquila e um início de ano produtivo para toda a família.\",\n image:\n \"https://images.unsplash.com/photo-1503676260728-1c00da094a0b?w=800&h=400&fit=crop\",\n category: \"Educação\",\n date: \"28 Jan 2026\",\n linkHref: \"/site/p/blog/dicas-preparar-ano-letivo\",\n linkText: \"Ler mais\",\n },\n];\n\n// ─── Conteúdo HTML rico para o post de exemplo ───\nconst SAMPLE_POST_CONTENT = `\n<h2>O que é a Feira de Ciências?</h2>\n<p>A Feira de Ciências é um evento anual que celebra a curiosidade, a pesquisa e a criatividade dos nossos alunos. Nesta edição especial de 2026, recebemos mais de <strong>500 visitantes</strong> e contamos com a participação de todas as turmas do Ensino Fundamental e Médio.</p>\n<p>Este ano, o tema central foi <em>\"Ciência e Sustentabilidade\"</em>, incentivando os estudantes a desenvolverem projetos que aliassem inovação tecnológica com responsabilidade ambiental.</p>\n\n<h2>Destaques da Edição 2026</h2>\n<p>Entre os mais de 50 projetos apresentados, alguns se destacaram pela originalidade e impacto:</p>\n<ul>\n <li><strong>Jardim Sustentável Inteligente</strong> — Alunos do 5º ano desenvolveram um sistema de irrigação automática usando sensores de umidade e placa Arduino.</li>\n <li><strong>Robótica Educacional</strong> — A turma do 8º ano criou um robô que auxilia no ensino de matemática para crianças do 1º ao 3º ano.</li>\n <li><strong>Energia Solar na Escola</strong> — Projeto do 2º ano do Ensino Médio demonstrou como painéis solares poderiam reduzir em 40% o consumo de energia da escola.</li>\n</ul>\n\n<blockquote>\n <p>\"A Feira de Ciências é um dos momentos mais importantes do nosso calendário escolar. Ver a dedicação e o brilho nos olhos dos alunos ao apresentarem seus projetos nos enche de orgulho e nos motiva a continuar investindo em educação de qualidade.\"</p>\n <p><strong>— Prof. Maria Silva, Coordenadora Pedagógica</strong></p>\n</blockquote>\n\n<h2>Premiações</h2>\n<p>O júri, composto por professores universitários e profissionais da área de tecnologia, selecionou os três melhores projetos:</p>\n<ol>\n <li><strong>1º Lugar:</strong> Jardim Sustentável Inteligente (5º ano)</li>\n <li><strong>2º Lugar:</strong> Energia Solar na Escola (2º EM)</li>\n <li><strong>3º Lugar:</strong> Robótica Educacional (8º ano)</li>\n</ol>\n\n<h2>Próximos Passos</h2>\n<p>Os três projetos finalistas representarão nossa escola na <strong>Feira Regional de Ciências</strong>, que acontecerá em março na capital. Os alunos já estão se preparando para levar suas apresentações a um público ainda maior.</p>\n<p>Parabéns a todos os participantes, professores orientadores e famílias que apoiaram essa jornada de descobertas!</p>\n`.trim();\n\n/**\n * Deep-clone um bloco com novo ID\n */\nfunction cloneBlock(block: Block, newId: string): Block {\n const cloned: Block = JSON.parse(JSON.stringify(block));\n return { ...cloned, id: newId };\n}\n\nexport const blogPlugin: PluginRegistration = {\n manifest: {\n id: \"blog\",\n version: \"1.0.0\",\n name: \"Blog\",\n description: \"Blog com posts, categorias e tags\",\n icon: \"FileText\",\n\n capabilities: {\n blocks: [\"blogPostCard\", \"blogPostGrid\", \"blogPostDetail\", \"blogCategoryFilter\", \"blogSearchBar\"],\n\n pageTemplates: [\n {\n id: \"blog-listing\",\n name: \"Blog\",\n slug: \"blog\",\n pluginId: \"blog\",\n structure: [],\n dataSource: {\n provider: \"blog-posts\",\n mode: \"list\",\n },\n },\n {\n id: \"blog-post\",\n name: \"Post\",\n slug: \"blog/:slug\",\n pluginId: \"blog\",\n structure: [],\n dataSource: {\n provider: \"blog-posts\",\n mode: \"single\",\n paramMapping: { slug: \":slug\" },\n },\n editRestrictions: {\n lockedStructure: true,\n nonRemovable: true,\n },\n },\n ],\n\n dataSchemas: [\n {\n type: \"blog-post\",\n label: \"Blog Post\",\n fields: [\n { name: \"title\", type: \"string\", required: true, label: \"Title\" },\n { name: \"slug\", type: \"string\", required: true, label: \"Slug\" },\n { name: \"excerpt\", type: \"string\", label: \"Excerpt\" },\n { name: \"content\", type: \"richtext\", required: true, label: \"Content\" },\n { name: \"featuredImage\", type: \"image\", label: \"Featured Image\" },\n { name: \"category\", type: \"string\", label: \"Category\" },\n { name: \"tags\", type: \"array\", label: \"Tags\" },\n { name: \"authorVariant\", type: \"string\", label: \"Author Variant\" },\n { name: \"readingTime\", type: \"number\", label: \"Reading Time\" },\n { name: \"metaTitle\", type: \"string\", label: \"Meta Title (SEO)\" },\n { name: \"metaDescription\", type: \"string\", label: \"Meta Description (SEO)\" },\n { name: \"ogImage\", type: \"image\", label: \"Open Graph Image\" },\n ],\n },\n ],\n\n contentProviders: [\"blog-posts\", \"blog-categories\"],\n },\n\n restrictions: {\n lockedFields: {\n blogPostDetail: [\"content\", \"date\"],\n },\n requiredPages: [\"blog-listing\", \"blog-post\"],\n },\n },\n\n onActivate(document: SiteDocument): SiteDocument {\n logger.debug(\"Blog plugin activating...\");\n\n const existingPageIds = new Set(document.pages.map((p) => p.id));\n const newPages = [...document.pages];\n\n // ── Encontrar home page para clonar navbar/footer ──\n const homePage =\n document.pages.find((p) => p.slug === \"home\") || document.pages[0];\n\n const homeNavbar = homePage?.structure.find((b) => b.type === \"navbar\");\n const homeFooter = homePage?.structure.find((b) => b.type === \"footer\");\n\n // ── 1. Adicionar link \"Blog\" à navbar da home page ──\n // Preserva os links existentes e apenas insere \"Blog\" antes do último item.\n if (homePage && homeNavbar) {\n const homeIdx = newPages.findIndex((p) => p.id === homePage.id);\n if (homeIdx >= 0) {\n const navbarProps = homeNavbar.props as Record<string, any>;\n const existingLinks: Array<{ text: string; href: string }> =\n Array.isArray(navbarProps.links) ? [...navbarProps.links] : [];\n const hasBlogLink = existingLinks.some(\n (l) => l.href === \"/p/blog\",\n );\n\n if (!hasBlogLink) {\n // Inserir \"Blog\" antes do último link (geralmente \"Contato\")\n const insertIdx = existingLinks.length > 0 ? existingLinks.length - 1 : 0;\n existingLinks.splice(insertIdx, 0, { text: \"Blog\", href: \"/p/blog\" });\n\n // Atualizar navbar na home page com o novo link\n const updatedStructure = newPages[homeIdx].structure.map((b) => {\n if (b.id === homeNavbar.id) {\n return { ...b, props: { ...b.props, links: existingLinks } } as Block;\n }\n return b;\n });\n newPages[homeIdx] = { ...newPages[homeIdx], structure: updatedStructure };\n logger.debug(\"Blog link added to home navbar\");\n\n // Atualizar referência para que clones nas páginas do blog usem navbar com link\n // (homeNavbar é const, então criamos a versão atualizada para uso nos clones)\n (homeNavbar as any).props = { ...navbarProps, links: existingLinks };\n }\n }\n }\n\n // ── 2. Injetar seção de blog na home page (antes do footer) ──\n if (homePage) {\n const homeIdx = newPages.findIndex((p) => p.id === homePage.id);\n const alreadyInjected = homePage.structure.some(\n (b) => b.id === BLOG_HOME_SECTION_ID,\n );\n\n if (homeIdx >= 0 && !alreadyInjected) {\n const blogHomeSection: Block = {\n id: BLOG_HOME_SECTION_ID,\n type: \"blogPostGrid\",\n props: {\n title: \"Blog\",\n subtitle: \"Últimas publicações\",\n columns: 3,\n cards: SAMPLE_BLOG_CARDS,\n variant: \"default\",\n showViewAll: true,\n viewAllText: \"Ver todos os posts\",\n viewAllHref: \"/site/p/blog\",\n },\n } as Block;\n\n const updatedStructure = [...newPages[homeIdx].structure];\n const footerIdx = updatedStructure.findIndex(\n (b) => b.type === \"footer\",\n );\n\n if (footerIdx >= 0) {\n updatedStructure.splice(footerIdx, 0, blogHomeSection);\n } else {\n updatedStructure.push(blogHomeSection);\n }\n\n newPages[homeIdx] = {\n ...newPages[homeIdx],\n structure: updatedStructure,\n };\n logger.debug(\"Blog section injected into home page\");\n }\n }\n\n // ── 3. Criar página \"Blog\" (listagem completa) ──\n if (!existingPageIds.has(\"blog\")) {\n const blogPageStructure: Block[] = [];\n\n // Navbar clonada da home\n if (homeNavbar) {\n blogPageStructure.push(cloneBlock(homeNavbar, \"blog-page-navbar\"));\n }\n\n // Hero banner do blog\n blogPageStructure.push({\n id: \"blog-page-hero\",\n type: \"hero\",\n props: {\n title: \"Blog\",\n subtitle: \"Novidades & Publicações\",\n description:\n \"Acompanhe as últimas novidades, eventos e conquistas da nossa comunidade escolar.\",\n variant: \"centered\",\n align: \"center\",\n overlay: true,\n overlayColor: \"rgba(79, 70, 229, 0.9)\",\n background: \"#4f46e5\",\n minHeight: \"280px\",\n },\n } as Block);\n\n // Search bar\n blogPageStructure.push({\n id: \"blog-search-bar\",\n type: \"blogSearchBar\",\n props: {\n placeholder: \"Buscar posts...\",\n variant: \"simple\",\n showIcon: true,\n searchUrl: \"/site/p/blog\",\n },\n } as Block);\n\n // Category filter\n blogPageStructure.push({\n id: \"blog-category-filter\",\n type: \"blogCategoryFilter\",\n props: {\n title: \"\",\n categories: SAMPLE_BLOG_CARDS.map((c) => ({\n name: c.category,\n slug: c.category.toLowerCase().replace(/\\s+/g, \"-\"),\n count: 1,\n })),\n variant: \"chips\",\n showCount: false,\n showAll: true,\n allLabel: \"Todas\",\n filterUrl: \"/site/p/blog\",\n },\n } as Block);\n\n // Grid de posts\n blogPageStructure.push({\n id: \"blog-grid-main\",\n type: \"blogPostGrid\",\n props: {\n title: \"\",\n subtitle: \"\",\n columns: 3,\n cards: SAMPLE_BLOG_CARDS,\n variant: \"default\",\n showViewAll: false,\n viewAllText: \"Ver todos\",\n viewAllHref: \"/site/p/blog\",\n },\n } as Block);\n\n // Footer clonado da home\n if (homeFooter) {\n blogPageStructure.push(cloneBlock(homeFooter, \"blog-page-footer\"));\n }\n\n newPages.push({\n id: \"blog\",\n name: \"Blog\",\n slug: \"blog\",\n pluginId: \"blog\",\n pageTemplateId: \"blog-listing\",\n structure: blogPageStructure,\n dataSource: {\n provider: \"blog-posts\",\n mode: \"list\",\n },\n });\n logger.debug(\"Blog listing page created\");\n }\n\n // ── 4. Criar página \"Post\" (detalhe) ──\n if (!existingPageIds.has(\"blog-post\")) {\n const postPageStructure: Block[] = [];\n\n if (homeNavbar) {\n postPageStructure.push(cloneBlock(homeNavbar, \"post-page-navbar\"));\n }\n\n postPageStructure.push({\n id: \"blog-detail-main\",\n type: \"blogPostDetail\",\n props: {\n title: \"Feira de Ciências 2026: Inovação e Criatividade\",\n content: SAMPLE_POST_CONTENT,\n featuredImage:\n \"https://images.unsplash.com/photo-1567168544230-3b9e5ec47659?w=1200&h=600&fit=crop\",\n date: \"05 Fev 2026\",\n category: \"Eventos\",\n authorVariant: \"inline\",\n readingTime: \"5 min de leitura\",\n tags: [\"Feira de Ciências\", \"Eventos\", \"Sustentabilidade\", \"Projetos\"],\n showFeaturedImage: true,\n showAuthor: true,\n showDate: true,\n showTags: true,\n showReadingTime: true,\n contentMaxWidth: \"720px\",\n },\n } as Block);\n\n if (homeFooter) {\n postPageStructure.push(cloneBlock(homeFooter, \"post-page-footer\"));\n }\n\n newPages.push({\n id: \"blog-post\",\n name: \"Post\",\n slug: \"blog/:slug\",\n pluginId: \"blog\",\n pageTemplateId: \"blog-post\",\n isDynamic: true,\n structure: postPageStructure,\n dataSource: {\n provider: \"blog-posts\",\n mode: \"single\",\n paramMapping: { slug: \":slug\" },\n },\n editRestrictions: {\n lockedStructure: true,\n nonRemovable: true,\n },\n });\n logger.debug(\"Blog post detail page created\");\n }\n\n return {\n ...document,\n pages: newPages,\n };\n },\n\n onDeactivate(document: SiteDocument): SiteDocument {\n logger.debug(\"Blog plugin deactivating...\");\n\n const newPages = document.pages\n // Remover páginas do plugin\n .filter((page) => page.pluginId !== \"blog\")\n // Remover seção de blog injetada + link \"Blog\" da navbar\n .map((page) => {\n let structure = page.structure;\n\n // Remover seção de blog injetada\n const hasInjected = structure.some(\n (b) => b.id === BLOG_HOME_SECTION_ID,\n );\n if (hasInjected) {\n structure = structure.filter(\n (b) => b.id !== BLOG_HOME_SECTION_ID,\n );\n }\n\n // Remover link \"Blog\" (/p/blog) da navbar\n structure = structure.map((b) => {\n if (b.type !== \"navbar\") return b;\n const props = b.props as Record<string, any>;\n const links: Array<{ text: string; href: string }> = Array.isArray(props.links) ? props.links : [];\n const filtered = links.filter((l) => l.href !== \"/p/blog\");\n if (filtered.length !== links.length) {\n return { ...b, props: { ...props, links: filtered } } as Block;\n }\n return b;\n });\n\n if (structure !== page.structure) {\n return { ...page, structure };\n }\n return page;\n });\n\n logger.debug(\n `Removed ${document.pages.length - newPages.length} blog page(s) and injected section`,\n );\n\n return {\n ...document,\n pages: newPages,\n };\n },\n\n getEditorRestrictions(blockType: BlockType) {\n if (blockType === \"blogPostDetail\") {\n return {\n lockedFields: [\"content\", \"date\"],\n };\n }\n if (blockType === \"blogCategoryFilter\") {\n return {\n lockedFields: [\"categories\"],\n };\n }\n return undefined;\n },\n};\n\n// Auto-registrar o plugin (side effect — como os blocos fazem com componentRegistry)\npluginRegistry.register(blogPlugin);\n"],"names":["BLOG_HOME_SECTION_ID","SAMPLE_BLOG_CARDS","SAMPLE_POST_CONTENT","cloneBlock","block","newId","blogPlugin","document","logger","existingPageIds","p","newPages","homePage","homeNavbar","b","homeFooter","homeIdx","navbarProps","existingLinks","l","insertIdx","updatedStructure","alreadyInjected","blogHomeSection","footerIdx","blogPageStructure","c","postPageStructure","page","structure","props","links","filtered","blockType","pluginRegistry"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mockContentProvider.d.ts","sourceRoot":"","sources":["../../../../../src/engine/plugins/builtin/blog/mockContentProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAKhB,MAAM,aAAa,CAAC;AAiHrB;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,eAiDrC,CAAC"}
1
+ {"version":3,"file":"mockContentProvider.d.ts","sourceRoot":"","sources":["../../../../../src/engine/plugins/builtin/blog/mockContentProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAKhB,MAAM,aAAa,CAAC;AAqHrB;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,eAiDrC,CAAC"}