The Vue 3 law editor and library browser for working with machine-readable law.
The frontend is a law editor and library browser built with Vue 3 and Vite.
frontend/Browse the corpus of Dutch laws in a 3-pane layout:
Edit law articles with a split-pane interface:
?law=...)The frontend is built almost entirely from @nldd/design-system web components (custom-element prefix nldd-), imported in the JS entry point (src/main.js imports @nldd/design-system and its styles). A representative slice of the components in use:
| Category | Components used |
|---|---|
| Layout | nldd-page, nldd-side-by-side-split-view, nldd-navigation-split-view, nldd-toolbar, nldd-spacer, nldd-container |
| Navigation | nldd-top-title-bar, nldd-tab-bar, nldd-document-tab-bar, nldd-menu |
| Inputs | nldd-search-field, nldd-text-field, nldd-multi-line-text-field, nldd-dropdown, nldd-combo-box, nldd-segmented-control |
| Lists & cells | nldd-list, nldd-list-item, nldd-text-cell, nldd-icon-cell, nldd-collection |
| Actions & overlays | nldd-button, nldd-icon-button, nldd-button-group, nldd-inline-dialog, nldd-modal-dialog, nldd-sheet |
| Content | nldd-rich-text, nldd-code-viewer, nldd-code-editor, nldd-title, nldd-tag |
The Rijksoverheid brand color (#154273) and typography come from the design system; the only app-level stylesheet is frontend/css/main.css, which holds a handful of resets and one --color-primary token (the design system provides everything else through its own styles).
The app is split into two top-level shells, LibraryApp.vue (the law browser) and EditorApp.vue (the split-pane editor), plus ~30 components under src/components/. Notable ones:
| Component | Purpose |
|---|---|
ArticleText.vue / ArticleTextEditor.vue | Render and edit article text |
MachineReadable.vue | Machine-readable visualization |
YamlView.vue | Raw YAML view |
EditSheet.vue / ActionSheet.vue / OperationSettings.vue | Editing operations and conditions |
LawGraphView.vue (+ graph/) | Cross-law dependency graph |
ExecutionTraceView.vue | Execution trace tree |
ScenarioBuilder/Form/Gherkin/Visual/Panel.vue | BDD scenario authoring |
AnnotatedText.vue / NoteCreator.vue | Stand-off notes (RFC-018) |
TrajectMenu.vue / TrajectMembersDialog.vue | Traject collaboration |
Shared logic lives in composables (useLaw.js for loading and article selection, plus others for settings and corpus URLs).
Law content comes from the editor-api over HTTP, not from static files. useLaw.js fetches and saves laws via lawUrl(...) (a GET to load, a PUT to save), with traject-scoped variants for private-repo collaboration. A scripts/copy-laws.js prebuild step still exists, but the runtime data flow goes through the API, so the editor can read and write the corpus.
Or use the full dev stack:
The editor ships as a single Docker image (regelrecht-editor) that bundles the built Vue frontend together with the editor-api Rust binary, which serves the static assets and the REST API. It is deployed to RIG/ZAD:
editor.regelrecht.rijks.appA separate admin UI exists at packages/admin/ for pipeline management:
@nldd/design-system (same stack as the editor)See the admin API endpoints:
GET /api/law_entries - query law processing statusGET /api/jobs - query job queuePOST /api/harvest-jobs - create harvest jobPOST /api/enrich-jobs - create enrich jobsGET /api/jobs/{id} - job detail with progressAn exploration by Bureau Architectuur of the Dutch Ministry of the Interior into the possibilities of transparent, executable legislation.
Bureau Architectuur
Ministry of the Interior and Kingdom Relations