Minor Changes
-
8211e9d:
cimisy scan --fullnow also detects static, non-repeating content — headings, rich-text paragraphs, images, and standalone links — grouped into sections at semantic HTML5 boundary tags (<section>,<header>,<footer>, etc.), with a fallback region per component when no boundary tag is present.cimisy importpresents these alongside collection candidates in one combined picker; selecting one writes a real.yaml/.mdxentry viawriteSingleton, splices asingleton({...})orpage({...}){ sections }intocimisy.config.ts, and rewrites the source JSX to read fromreader.singletons.<key>/reader.pages.<pageKey>.<sectionKey>— the same git-branch-review trust model as collection imports (clean working tree or--allow-dirty, a dedicatedcimisy/import-<timestamp>branch, no runtime RBAC involved).Detection is conservative by design, mirroring the existing array scanner: content mixed with a non-literal expression (
Welcome to {siteName},{t("key")}), conditionally rendered content ({cond && <X/>}, ternaries), and ESM-imported images (import hero from "./hero.png") are reported as detected-but-not-eligible rather than guessed at. Only a narrow tag/prop allowlist is ever read as content (headings,p/blockquoterich text,figcaption,span,img/Image,a/Link) —className,data-*,aria-*, event handlers, and every other prop are never touched.A component rendered from a single route becomes a page-scoped
section(); the same component rendered from multiple routes (e.g. a sharedFooter) becomes a top-levelsingleton()instead.The admin content tree now separates a page's static content from its collections into two labeled groups instead of one flat list.
No breaking changes —
cimisy scan/cimisy importwithout--fullbehave exactly as before.