Add image support to footer component with size control via HTML attributes

This commit is contained in:
Wayne Sutton
2025-12-25 23:01:58 -08:00
parent d00f204fa7
commit b94b26116a
20 changed files with 602 additions and 139 deletions

View File

@@ -20,6 +20,8 @@ export const getAllPages = query({
authorImage: v.optional(v.string()),
layout: v.optional(v.string()),
rightSidebar: v.optional(v.boolean()),
showFooter: v.optional(v.boolean()),
footer: v.optional(v.string()),
}),
),
handler: async (ctx) => {
@@ -57,6 +59,7 @@ export const getAllPages = query({
authorImage: page.authorImage,
layout: page.layout,
rightSidebar: page.rightSidebar,
showFooter: page.showFooter,
}));
},
});
@@ -122,6 +125,8 @@ export const getPageBySlug = query({
authorImage: v.optional(v.string()),
layout: v.optional(v.string()),
rightSidebar: v.optional(v.boolean()),
showFooter: v.optional(v.boolean()),
footer: v.optional(v.string()),
}),
v.null(),
),
@@ -151,6 +156,8 @@ export const getPageBySlug = query({
authorImage: page.authorImage,
layout: page.layout,
rightSidebar: page.rightSidebar,
showFooter: page.showFooter,
footer: page.footer,
};
},
});
@@ -174,6 +181,8 @@ export const syncPagesPublic = mutation({
authorImage: v.optional(v.string()),
layout: v.optional(v.string()),
rightSidebar: v.optional(v.boolean()),
showFooter: v.optional(v.boolean()),
footer: v.optional(v.string()),
}),
),
},
@@ -214,6 +223,8 @@ export const syncPagesPublic = mutation({
authorImage: page.authorImage,
layout: page.layout,
rightSidebar: page.rightSidebar,
showFooter: page.showFooter,
footer: page.footer,
lastSyncedAt: now,
});
updated++;

View File

@@ -23,6 +23,8 @@ export const getAllPosts = query({
authorImage: v.optional(v.string()),
layout: v.optional(v.string()),
rightSidebar: v.optional(v.boolean()),
showFooter: v.optional(v.boolean()),
footer: v.optional(v.string()),
}),
),
handler: async (ctx) => {
@@ -55,6 +57,7 @@ export const getAllPosts = query({
authorImage: post.authorImage,
layout: post.layout,
rightSidebar: post.rightSidebar,
showFooter: post.showFooter,
}));
},
});
@@ -125,6 +128,8 @@ export const getPostBySlug = query({
authorImage: v.optional(v.string()),
layout: v.optional(v.string()),
rightSidebar: v.optional(v.boolean()),
showFooter: v.optional(v.boolean()),
footer: v.optional(v.string()),
}),
v.null(),
),
@@ -157,6 +162,8 @@ export const getPostBySlug = query({
authorImage: post.authorImage,
layout: post.layout,
rightSidebar: post.rightSidebar,
showFooter: post.showFooter,
footer: post.footer,
};
},
});
@@ -182,6 +189,8 @@ export const syncPosts = internalMutation({
authorImage: v.optional(v.string()),
layout: v.optional(v.string()),
rightSidebar: v.optional(v.boolean()),
showFooter: v.optional(v.boolean()),
footer: v.optional(v.string()),
}),
),
},
@@ -224,6 +233,8 @@ export const syncPosts = internalMutation({
authorImage: post.authorImage,
layout: post.layout,
rightSidebar: post.rightSidebar,
showFooter: post.showFooter,
footer: post.footer,
lastSyncedAt: now,
});
updated++;
@@ -270,6 +281,8 @@ export const syncPostsPublic = mutation({
authorImage: v.optional(v.string()),
layout: v.optional(v.string()),
rightSidebar: v.optional(v.boolean()),
showFooter: v.optional(v.boolean()),
footer: v.optional(v.string()),
}),
),
},
@@ -312,6 +325,8 @@ export const syncPostsPublic = mutation({
authorImage: post.authorImage,
layout: post.layout,
rightSidebar: post.rightSidebar,
showFooter: post.showFooter,
footer: post.footer,
lastSyncedAt: now,
});
updated++;

View File

@@ -20,6 +20,8 @@ export default defineSchema({
authorImage: v.optional(v.string()), // Author avatar image URL (round)
layout: v.optional(v.string()), // Layout type: "sidebar" for docs-style layout
rightSidebar: v.optional(v.boolean()), // Enable right sidebar with CopyPageDropdown
showFooter: v.optional(v.boolean()), // Show footer on this post (overrides siteConfig default)
footer: v.optional(v.string()), // Footer markdown content (overrides siteConfig defaultContent)
lastSyncedAt: v.number(),
})
.index("by_slug", ["slug"])
@@ -51,6 +53,8 @@ export default defineSchema({
authorImage: v.optional(v.string()), // Author avatar image URL (round)
layout: v.optional(v.string()), // Layout type: "sidebar" for docs-style layout
rightSidebar: v.optional(v.boolean()), // Enable right sidebar with CopyPageDropdown
showFooter: v.optional(v.boolean()), // Show footer on this page (overrides siteConfig default)
footer: v.optional(v.string()), // Footer markdown content (overrides siteConfig defaultContent)
lastSyncedAt: v.number(),
})
.index("by_slug", ["slug"])