Support sharp 0.35
- The optional
sharppeer dependency accepts 0.35.
Release notes for packages.
sharp peer dependency accepts 0.35.vercelImage(), says that it is added twice, like plugins that add a route.@vitejs/plugin-rsc in the lockfile@vitejs/plugin-rsc of Waku. A lockfile from Fumapress 1 no longer installs a second copy that fails every page.1.0.0-rc.4, which needs React 19.3.1 or later.waku to 1.0.0-rc.4.head of ui.renderRoot has the charset and viewport tags, which Waku no longer adds to custom roots.src/pages/_api accept CONNECT, TRACE and QUERY handlers, like Waku.aiPlugin() and mcpPlugin() work on Waku and Astro, and fumapress is no longer a peer dependency.aiChat prop through useLayoutProps(), so a custom layout docks it by spreading useLayoutProps(). Docs and Notebook layouts show a floating "Ask AI" button, Glass and Spacious their own.AIChatLayout, and AIChat takes the endpoint as its api prop./api/ai answers 400 to messages the UI never sends: system messages and parts like files, which the server would download.@fumapress/astro runs the site of press.config.tsx on Astro, with the plugins, ui options and search of Fumapress.integrations of Astro, and write the site with createPress() of @fumapress/astro/config. The core plugins are at @fumapress/astro/plugins/*.output, adapter, site and base of Astro. A route rendered on demand without an adapter fails the build, naming the route.output: "server", content renders on demand unless mode of createPress() sets it. mode: "force-static" builds a dynamic source without an adapter.middleware of plugins never runs.ui.renderPage can return an .astro file as the layout of a page, with a React root from createIsland() of @fumapress/astro/client in client:*. LayoutProps<typeof app, "docs"> and IslandProps<typeof app, "docs"> of @fumapress/astro/config type them.contentSourcePlugin() of @fumapress/astro/plugins/content-source renders content collections and runtime sources: list it with components as a function of the page for components per page.@fumapress/astro/css/default.css is the whole stylesheet, @fumapress/astro/css/preset.css only the styles of Fumapress for a custom Tailwind and Fumadocs UI setup.@fumapress/blog is the blog of a Fumapress site, replacing fumapress/plugins/blog. blogPlugin({ source: "blog" }) renders the posts of one or more source keys.@import "@fumapress/blog/css/preset.css"; and its frontmatter schema blogPageSchema from @fumapress/blog/schema.ui.renderPage receives typed props for blog.index, blog.tags, blog.tag and the post pages. Compose them with BlogIndexView, BlogTagsView, BlogTagView and BlogPostView.getTags, getAuthors and getImage options, falling back to the frontmatter.getBlogPosts(ctx, { lang }) lists the posts on custom pages, like a landing page. Without i18n, getBlogPosts(ctx).@fumapress/core is the internal engine of fumapress and @fumapress/astro. Sites import from those two packages.create-fumapress asks for a framework, and --framework astro scaffolds an Astro site. --yes picks Waku.createPress().feedbackPlugin(), githubFeedbackPlugin() and emailFeedbackPlugin() work on Waku and Astro, and fumapress is no longer a peer dependency.feedback:page slot item, props.slots["feedback:page"] in ui.renderPage.feedbackPlugin() run on the server at /api/feedback/page and /api/feedback/text instead of as Server Functions. A Response an action throws is the answer.'use client' modules run in the browser, also on a site without a server.feedbackPlugin() accepts beforeRequest, like the integrations.githubFeedbackPlugin() finds the existing discussion of a page instead of opening a new one for each feedback.