Edit any note and its images from the admin page

Every note gets an Edit form built from its note type's schema: image
fields show a thumbnail with a pick from the vault or an upload, link
fields offer note names, and lists of rows can be added to, removed and
reordered. A new Site pages view lists each page of the site with its
text and images and the notes that fill it. Image and link fields now
carry a JSON Schema format so a form knows to offer a picker.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012aSbo2D1qP8cMFQCykf7kx
This commit is contained in:
Claude
2026-10-18 14:19:38 +00:00
parent 5077aeacfd
commit 0f78505e99
10 changed files with 781 additions and 10 deletions
+28
View File
@@ -110,3 +110,31 @@ details summary { cursor: pointer; color: var(--muted); margin-top: 10px; }
form.inline { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: 13px; }
form.inline button { min-height: 30px; padding: 2px 12px; font-size: 13px; }
.preview img { max-height: 480px; object-fit: contain; }
/* Note editor */
.note-form .field { margin-bottom: 14px; }
.note-form fieldset { border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px 12px; margin: 0 0 14px; min-width: 0; }
.note-form legend { padding: 0 6px; font-weight: 600; }
.note-form .label { font-weight: 600; }
.image-pick { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: 12px; align-items: start; }
.image-pick img, .image-pick .no-image { width: 120px; aspect-ratio: 4 / 3; object-fit: cover; border-radius: 8px; border: 1px solid var(--line); display: block; }
.image-pick .no-image { display: grid; place-items: center; color: var(--muted); font-size: 0.85rem; }
.image-pick .sub { margin-top: 8px; font-weight: 400; color: var(--muted); }
.side .image-pick { grid-template-columns: 1fr; }
.side .image-pick img, .side .image-pick .no-image { width: 100%; aspect-ratio: 16 / 9; }
.row-item { border-top: 1px solid var(--line); padding: 10px 0; }
.row-item:first-of-type { border-top: 0; }
.row-item.blank { opacity: 0.85; }
.row-fields { display: grid; gap: 0 12px; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
.row-fields .field:has(.image-pick) { grid-column: 1 / -1; }
.row-tools { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 4px; }
.row-tools button { padding: 4px 10px; font-size: 0.85rem; }
/* Site pages */
.site-pages { list-style: none; padding: 0; margin: 0; display: grid; gap: 16px; }
.site-pages h2 { margin: 0; font-size: 1.1rem; }
.page-images { list-style: none; padding: 0; margin: 8px 0; display: flex; flex-wrap: wrap; gap: 10px; }
.page-images li { width: 120px; font-size: 0.8rem; color: var(--muted); }
.page-images img { width: 120px; aspect-ratio: 4 / 3; object-fit: cover; border-radius: 8px; border: 1px solid var(--line); display: block; margin-bottom: 4px; }
.feeds { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.pill-link { border: 1px solid var(--line); border-radius: 999px; padding: 2px 10px; font-size: 0.85rem; }