|
All checks were successful
Build + deploy releases / build-and-deploy (push) Successful in 8s
Schema-driven form renderer plus zddc-server endpoints that turn any
<name>.form.yaml into a working data-collection form at <path>/<name>.form.html.
Submissions land in <path>/<name>/<YYYY-MM-DD>-<email-sanitized>.yaml,
ACL-gated by the existing .zddc cascade. The form posts back to its own URL;
the server strips ".html" and routes by what's underneath, so create and
update use the same client-side code path.
Form spec dialect: JSON Schema 2020-12 + RJSF-style ui:* hints, written in
YAML. Chosen for LLM authorability — it's the canonical structured-output
target for OpenAI/Anthropic, and the ui:* convention is the most-trained UI
hint vocabulary. Supported subset for v0: type (string/number/integer/boolean/
array/object), enum, min/max, minLength/maxLength, required, additionalProperties:
false, properties, items, format (date, email). Round-trip mode is form-as-truth:
submission YAML is regenerated each save, comments are not preserved (the v1
file-as-truth mode for hand-edited files like .zddc itself is deferred).
New components:
* form/ — sixth single-file HTML tool, vanilla JS renderer (~760 LoC)
* zddc/internal/jsonschema/ — focused JSON Schema validator covering only
the v0 keyword subset. Match-implementation-cost-to-surface-used: a full
library brings 70%+ surface we don't use; revisit when v1 adds $ref +
oneOf + if/then/else.
* zddc/internal/handler/formhandler.go — RecognizeFormRequest / ServeForm,
capability-URL re-edit, atomic submission writes via the new
zddc.WriteAtomic helper extracted from writer.go.
* dispatch() in zddc-server/main.go now intercepts *.form.html and
*.yaml.html before the static-file path; spec existence is the trigger.
Build pipeline: form joins ZDDC_RELEASE_TOOLS in lockstep, gets its own
embedded copy in handler/form.html (separate from the apps cascade —
the form renderer is fixed, not subject to per-folder version overrides).
Tests: 5 new Playwright specs (form-safety) + 14 new Go tests across the
validator and handler. All 172 Playwright tests + 10 Go packages green.
End-to-end manual verification: GET empty → POST 201 + capability URL →
GET re-edit (pre-filled) → POST update → 200, raw YAML browsable, ACL
deny → 403.
Docs: form/ section added to AGENTS.md and ARCHITECTURE.md. AGENTS.md
also documents the implementation-vs-dependency policy. CLAUDE.md repo-shape
list extended.
Deferred (v1+): .zddc editor migration onto this system, file-as-truth
lossless YAML round-trip, ui:show-when conditional visibility, oneOf/anyOf,
apps-cascade preview hook, cascade-fetched form definitions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| css | ||
| dist | ||
| js | ||
| vendor | ||
| build.sh | ||
| README.md | ||
| template.html | ||
ZDDC Markdown Editor
A lightweight, browser-based markdown editor with YAML front matter support.
🔗 Open Markdown Editor - Click to use online, or right-click → "Save Link As" to keep your own copy.
Reliability
This tool follows the "record player with the record" philosophy - the application and your data travel together. The single HTML file contains everything needed to edit markdown files locally in your browser.
Quick Start
- Open the editor in your browser
- Click Select Directory to choose a folder with markdown files
- Navigate the file tree on the left
- Click any
.mdfile to edit it - Click Save File or Save All to save changes
Features
📂 File Navigation
- Browse directories using the File System Access API
- Collapsible folder tree with file type icons
- Files sorted alphabetically with directories grouped
✏️ Markdown Editing
- Toast UI Editor with live preview
- Split view (markdown + preview)
- Full toolbar for formatting
📋 YAML Front Matter
- Separate front matter section at top of editor
- Auto-parsed and preserved on save
- Collapsible for more editing space
📑 Table of Contents
- Auto-generated from headings
- Adjustable depth (H1 only through H6)
- Click to jump to heading in preview
💾 File Operations
- Save individual files or Save All
- Reload from disk (discards unsaved changes)
- External change detection with reload prompt
- Unsaved change warnings before leaving
🖼️ File Previews
- Image preview for common formats
- HTML preview in sandboxed iframe
- Plain text editing for non-markdown files
Build
The editor is built from modular source files using a bash script:
cd mdedit
./build.sh
This concatenates CSS and JS files into dist/mdedit.html.
Project Structure
mdedit/
├── css/
│ ├── base.css # Core styles and layout
│ ├── editor.css # Toast UI Editor overrides
│ ├── toc.css # Table of Contents styles
│ └── markdown.css # Markdown rendering styles
├── js/
│ ├── app.js # Global state
│ ├── utils.js # Utility functions
│ ├── front-matter.js # YAML parsing
│ ├── file-system.js # File operations
│ ├── file-tree.js # Tree rendering
│ ├── editor.js # Toast UI setup
│ ├── toc.js # TOC generation
│ ├── resizer.js # Pane resizing
│ ├── events.js # Event listeners
│ └── main.js # Initialization
├── vendor/
│ ├── toastui-editor-all.min.js # Toast UI Editor JS (bundled)
│ └── toastui-editor.min.css # Toast UI Editor CSS (bundled)
├── template.html # HTML structure (uses CDN for local dev convenience)
├── build.sh # Build script (inlines vendor files, strips CDN refs)
└── dist/
└── mdedit.html # Built self-contained file
Technical Details
- No server required - runs entirely in browser
- File System Access API - direct local file access
- Toast UI Editor v3.2.2 - bundled from
vendor/into the built output (no CDN required) - Tailwind CSS - replaced at build time by
css/tailwind-utils.css, a hand-written static subset containing only the ~80 utility classes actually used intemplate.html(no runtime overhead, no console warnings) - Fully self-contained -
dist/mdedit.html(~850 KB) works offline with no external dependencies
Development note:
template.htmlloads Toast UI and Tailwind from CDN for a faster local development experience (opentemplate.htmldirectly in a browser). Thebuild.shscript replaces the Tailwind CDN<script>tag with nothing (utilities come fromcss/tailwind-utils.cssinstead) and replaces the Toast UI CDN tags with the locally bundledvendor/files when producingdist/mdedit.html.
Modules
CSS and JS modules live under css/ and js/. The canonical load order is in build.sh. See the root ARCHITECTURE.md for the build/module pattern and AGENTS.md for shared helpers.
mdedit-specific notes:
css/tailwind-utils.cssis a hand-curated static subset of Tailwind v3 — there is no Tailwind build step. Add a class here when adding it totemplate.html.- Toast UI Editor v3.2.2 ships pre-bundled in
vendor/.template.htmlloads it from CDN for dev convenience;build.shswaps the CDN tag for the bundled file. - File operations (create, rename, delete) live in
js/file-ops.js.
Build Process
The build script (build.sh):
- Concatenates all local CSS and JS files in dependency order
- Replaces the CDN
<script>/<link>tags for Tailwind and Toast UI with the locally bundled files fromvendor/ - Injects everything into
template.htmlto producedist/mdedit.html
The final HTML file (~850 KB) is fully self-contained and works offline.
Architecture Notes
- All local CSS/JS files are inlined into the output HTML
- Vendor dependencies (Toast UI, Tailwind) are bundled from
vendor/— no runtime CDN access template.htmlloads dependencies from CDN for convenient local development, butbuild.shreplaces these- No npm dependencies required at runtime
- File System Access API requires Chromium-based browsers