feat(site-builder): block registry, notices, local prefs, project extras, overlay slot

Add an exported block registry (keywords, search, insertBlock) consumed by
BlocksPanel, a NoticeProvider/NoticeHost toast stack, a guarded localStorage
prefs helper, a ProjectExtras store persisted as project.json 'extras', and a
CanvasOverlays mount point.

Refs #38
Refs #41
Refs #49
Refs #48
Refs #57
Refs #58

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
shadowdaoandClaude Sonnet 5.5 committed 2026-10-07 11:14:51 -07:00
1 parent 97ccbee461
commit 21c2776c88
16 files changed
+869 -215

No files matched your search

+42
View File
@@ -2054,3 +2054,45 @@ body {
padding: 4px 12px;
}
.conflict-modal-actions button:disabled { opacity: 0.5; cursor: default; }
/* Notice stack (state/NoticeContext + editor/NoticeHost): bottom-left, so it
never collides with TopBar's bottom-right ErrorNotice. */
.notice-host {
position: fixed;
left: 16px;
bottom: 16px;
z-index: 60;
display: flex;
flex-direction: column;
gap: 8px;
max-width: min(420px, calc(100vw - 32px));
}
.notice-item {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 12px;
font-size: 12px;
color: var(--color-text);
background: var(--color-bg-elevated);
border: 1px solid var(--color-border);
border-left: 3px solid var(--color-border);
border-radius: var(--radius-md);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
}
.notice-item.success { border-left-color: var(--color-success); }
.notice-item.error { border-left-color: var(--color-danger); }
.notice-text { flex: 1; word-break: break-word; }
.notice-action, .notice-dismiss {
background: none;
border: none;
color: inherit;
cursor: pointer;
padding: 0 4px;
}
.notice-action { font-weight: 600; text-decoration: underline; }
@media (max-width: 768px) {
.notice-host {
bottom: calc(var(--mobile-tabbar-height) + env(safe-area-inset-bottom, 0px) + 12px);
}
}