mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-20 08:13:39 +02:00
Expands the builder from 3 M1 blocks to 8. Containers (columns) and
media blocks (image, gallery) are the structural additions; cta and faq
round out the content coverage.
packages/website-blocks:
- image, cta, faq, columns (container), gallery — each with Zod schema,
renderer (mode-aware for edit/preview/public), and fallback inspector.
- Block type extended with optional `children` + `renderChild` snippet
so containers render their children through the same chrome the
outer renderer provides (click-to-select, public-path tagging).
- themes/: 3 presets (classic light, modern dark, warm) with
`resolveTheme` + `themeCssVars` helpers. Public layout now emits
CSS vars via `style=` on the root; block components read
`var(--wb-primary)` / `var(--wb-bg)` / `var(--wb-fg)` / etc.
- Registry updated; new exports + `./themes` subpath export.
apps/mana/apps/web/src/lib/modules/website:
- upload.ts: multipart POST to mana-media with `app=website` scope,
returns { mediaId, url }. 25 MB cap, non-image rejection client-side.
- components/ImageInspector + GalleryInspector: app-side overrides
wired to upload. Registered via `CUSTOM_INSPECTORS` in BlockInspector
so block.type → app-side inspector, fallback to registry otherwise.
- components/SiteSettingsDialog: theme preset picker + color overrides
for primary/bg/fg + footer text. Mounted from a ⚙ button in the
editor's left pane.
- components/BlockRenderer: rebuilt around a byParent map + recursive
`renderBlock` snippet so container blocks can render their children
through the same click-to-select wrapper as top-level blocks.
- routes/s/[siteSlug]: rename `[[...path]]` → `[...path]` (SvelteKit
treats rest segments as optional automatically — double-bracket form
errored at sync time). +page.svelte renders snapshot trees
recursively so published pages match the editor.
apps/api: unchanged.
Validation:
- pnpm run validate:all: all 6 gates green
- pnpm run check (web): 0 errors, 0 warnings
- apps/api type-check: green
- website-blocks tsc: green
Plan: docs/plans/website-builder.md (M3 block shipped)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
29 lines
813 B
TypeScript
29 lines
813 B
TypeScript
import { z } from 'zod';
|
|
|
|
export const GalleryImageSchema = z.object({
|
|
url: z.string().min(1).max(1024),
|
|
altText: z.string().max(280).default(''),
|
|
caption: z.string().max(280).default(''),
|
|
});
|
|
|
|
export type GalleryImage = z.infer<typeof GalleryImageSchema>;
|
|
|
|
export const GallerySchema = z.object({
|
|
title: z.string().max(160).default(''),
|
|
images: z.array(GalleryImageSchema).max(60).default([]),
|
|
layout: z.enum(['masonry', 'grid']).default('grid'),
|
|
columns: z.union([z.literal(2), z.literal(3), z.literal(4)]).default(3),
|
|
gap: z.enum(['sm', 'md', 'lg']).default('md'),
|
|
lightbox: z.boolean().default(true),
|
|
});
|
|
|
|
export type GalleryProps = z.infer<typeof GallerySchema>;
|
|
|
|
export const GALLERY_DEFAULTS: GalleryProps = {
|
|
title: '',
|
|
images: [],
|
|
layout: 'grid',
|
|
columns: 3,
|
|
gap: 'md',
|
|
lightbox: true,
|
|
};
|