Files
racket-wiki/static/index.html
T
2026-09-02 08:38:03 +02:00

662 lines
48 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Racket Wiki</title>
<link rel="stylesheet" href="/vendor/easymde.min.css">
<link rel="stylesheet" href="/vendor/highlight-github.min.css">
<link rel="stylesheet" href="/vendor/diff2html.min.css">
<link rel="stylesheet" href="/css/wiki.css?id=__CMAP_CACHE_ID__">
<link rel="stylesheet" href="/cmap/cmap.css?id=__CMAP_CACHE_ID__">
</head>
<body>
<div id="connection-status" class="connection-status hidden" role="status"></div>
<div id="app">
<aside id="sidebar">
<a id="wiki-brand" class="brand" href="#">Racket Wiki</a>
<nav class="sidebar-icon-nav" aria-label="Wiki navigation">
<a id="bookmarks-link" class="sidebar-icon-link" href="#bookmarks" title="Bookmarks" data-tr-title="bookmarks" aria-label="Bookmarks" data-tr-aria-label="bookmarks"><i data-lucide="star"></i><span class="visually-hidden" data-tr="bookmarks">Bookmarks</span></a>
<a id="todo-link" class="sidebar-icon-link" href="#todos" title="Todo list" data-tr-title="todo-list" aria-label="Todo list" data-tr-aria-label="todo-list"><i data-lucide="list-checks"></i><span class="visually-hidden" data-tr="todo-list">Todo list</span></a>
<a id="recent-link" class="sidebar-icon-link" href="#recent" title="Recent" data-tr-title="recent" aria-label="Recent" data-tr-aria-label="recent"><i data-lucide="square-stack"></i><span class="visually-hidden" data-tr="recent">Recent</span></a>
<a id="cmaps-link" class="sidebar-icon-link" href="#" title="CMaps" data-tr-title="cmaps" aria-label="CMaps" data-tr-aria-label="cmaps"><i data-lucide="share-2"></i><span class="visually-hidden" data-tr="cmaps">CMaps</span></a>
</nav>
<form id="search-form" class="wiki-search" role="search">
<input id="search-input" type="search" placeholder="Search pages and concept maps" data-tr-placeholder="search-wiki" autocomplete="off" aria-label="Search pages and concept maps" data-tr-aria-label="search-wiki">
</form>
<section class="sidebar-section toc-section">
<div class="sidebar-heading" data-tr="contents">Contents</div>
<nav id="toc-list" class="toc-list"></nav>
</section>
<details class="sidebar-section pages-section">
<summary class="sidebar-heading" data-tr="pages">Pages</summary>
<nav id="page-list"></nav>
</details>
</aside>
<main id="main">
<div id="top-chrome" class="top-chrome">
<div id="account-bar" class="account-bar">
<span id="account-name"></span>
<span class="account-separator" aria-hidden="true">·</span>
<span id="account-role" class="muted"></span>
<span class="account-separator" aria-hidden="true">·</span>
<a id="profile-link" href="#profile" data-tr="profile">Profile</a>
<span class="account-separator" aria-hidden="true">·</span>
<a id="logout-link" href="#" data-tr="sign-out">Sign out</a>
<span class="account-separator admin-only hidden" aria-hidden="true">·</span>
<a id="admin-link" class="admin-only hidden" href="#admin" data-tr="admin">Admin</a>
</div>
<div class="navigation-row">
<nav id="breadcrumbs" class="breadcrumbs hidden" aria-label="Breadcrumb"></nav>
<div id="page-action-links" class="page-action-links hidden">
<a id="bookmark-page" href="#" data-tr="bookmark">Bookmark</a>
<a id="edit-page" class="editor-only hidden" href="#" data-tr="edit">Edit</a>
<a id="rename-page" class="editor-only hidden" href="#" data-tr="rename">Rename</a>
<a id="history-page" href="#" data-tr="history">History</a>
<a id="delete-page" class="editor-only danger hidden" href="#" data-tr="delete">Delete</a>
</div>
</div>
</div>
<section id="page-view" class="hidden">
<header class="page-header">
<div>
<h1 id="page-title"></h1>
<div id="page-meta" class="muted"></div>
</div>
</header>
<article id="markdown-preview" class="markdown-body"></article>
<section id="page-cmap-connections" class="page-cmap-connections hidden" aria-labelledby="page-cmap-connections-title">
<h2 id="page-cmap-connections-title" data-tr="connected-cmap-concepts">Connected CMap concepts</h2>
<div id="page-cmap-connections-list"></div>
</section>
<footer id="page-details" class="page-details"></footer>
</section>
<section id="not-found-view" class="hidden">
<header class="page-header">
<h1 data-tr="page-not-found">Page not found</h1>
</header>
<p id="not-found-message"></p>
</section>
<section id="editor-view" class="hidden editor-shell">
<header class="page-header">
<div class="editor-heading">
<input id="editor-title" class="title-input" placeholder="Page title" data-tr-placeholder="page-title">
<div class="editor-namespace-row">
<label for="editor-namespace" data-tr="namespace">Namespace</label>
<input id="editor-namespace" type="text" placeholder="RWS" data-tr-placeholder="namespace-placeholder">
</div>
<div id="editor-slug-info" class="muted"></div>
<div class="editor-template-row">
<label for="template-select" data-tr="template">Template</label>
<select id="template-select">
<option value="" data-tr="no-template">No template</option>
</select>
</div>
</div>
<div class="toolbar">
<button id="cancel-edit" data-tr="cancel">Cancel</button>
<button id="save-page" class="primary" data-tr="save">Save</button>
</div>
</header>
<textarea id="markdown-editor" aria-label="Markdown source"></textarea>
<input id="file-input" type="file" multiple hidden>
<div class="editor-metadata-row">
<input id="editor-tags" placeholder="Tags (comma separated)" data-tr-placeholder="tags">
<input id="edit-summary" placeholder="Version summary (optional)" data-tr-placeholder="version-summary">
<span id="save-status" class="muted"></span>
</div>
</section>
<section id="search-view" class="hidden">
<header class="page-header">
<div>
<h1 data-tr="search">Search</h1>
<div id="search-summary" class="muted"></div>
</div>
</header>
<div id="search-results" class="search-results"></div>
</section>
<section id="recent-view" class="hidden">
<header class="page-header">
<h1 data-tr="recent-changes">Recent changes</h1>
</header>
<div id="recent-list" class="special-page-list"></div>
</section>
<section id="bookmarks-view" class="hidden">
<header class="page-header">
<h1 data-tr="bookmarks">Bookmarks</h1>
</header>
<div id="bookmarks-list" class="bookmarks-list"></div>
</section>
<section id="todo-view" class="hidden">
<header class="page-header">
<h1 data-tr="todo-items">Todo items</h1>
</header>
<div id="todo-list" class="todo-items"></div>
</section>
<section id="cmap-view" class="hidden">
<header class="cmap-page-header">
<div class="cmap-storage-controls">
<span id="cmap-map-navigation" class="cmap-map-navigation hidden"><button id="cmap-map-back" type="button" aria-label="Back to parent map"></button><strong id="cmap-active-map-title"></strong></span>
<div id="cmap-map-combobox" class="wiki-combobox">
<input id="cmap-map-select" type="search" role="combobox"
aria-label="Concept map" data-tr-placeholder="select-concept-map"
placeholder="Select a CMap">
<button type="button" class="wiki-combobox-toggle" tabindex="-1" aria-label="Show concept maps"></button>
<div id="cmap-map-options" class="wiki-combobox-list hidden" role="listbox"></div>
</div>
<button id="cmap-wiki-reference" class="cmap-wiki-reference hidden" type="button" data-tr-title="copy-wiki-link" title="Copy wiki link"></button>
<span class="cmap-toolbar-separator" aria-hidden="true"></span>
<button id="cmap-tools-menu" class="editor-only" type="button" aria-label="Concept map tools" aria-haspopup="menu"></button>
<button id="cmap-extract-selected" class="editor-only hidden" type="button" data-tr="promote-submap">Make separate CMap</button>
<span id="cmap-save-status" class="muted" role="status"></span>
<details id="cmap-hidden-items" class="cmap-hidden-items hidden">
<summary data-tr="hidden-concepts">Hidden concepts</summary>
<div id="cmap-hidden-item-options" class="cmap-hidden-item-options"></div>
</details>
<span class="cmap-toolbar-spacer" aria-hidden="true"></span>
<div class="cmap-zoom-controls" aria-label="Zoom controls">
<button id="cmap-zoom-out" type="button" aria-label="Zoom out"></button>
<label><input id="cmap-zoom-percent" type="number" min="25" max="300" step="10" value="100" aria-label="Zoom percentage"><span>%</span></label>
<button id="cmap-zoom-in" type="button" aria-label="Zoom in">+</button>
<button id="cmap-zoom-reset" type="button">100%</button>
</div>
<span class="cmap-toolbar-separator" aria-hidden="true"></span>
<details class="cmap-help-menu">
<summary aria-label="Concept map help">?</summary>
<div class="cmap-help-popover muted">
<p data-tr="concept-map-help-context">Select with Ctrl/Cmd/Shift-click or by dragging over empty space. Drag a selected element to move the complete selection. Hold Alt while drawing a relation to create a direct line without a linking phrase. Grouping creates a new sub-CMap around the selection. Double-click a concept to edit it or a sub-CMap to open it; right-click for more tools.</p>
<dl class="cmap-shortcut-list">
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>/<kbd>Shift</kbd> + <span data-tr="click">click</span></dt><dd data-tr="cmap-help-add-selection">Add to or remove from the selection</dd></div>
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>A</kbd></dt><dd data-tr="select-all">Select all</dd></div>
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>X</kbd>/<kbd>C</kbd>/<kbd>V</kbd></dt><dd data-tr="copy-paste-linked-concepts">Cut/copy/paste linked concepts</dd></div>
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>G</kbd></dt><dd data-tr="group-selected">Group selection as sub-CMap</dd></div>
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>G</kbd></dt><dd data-tr="ungroup-selected">Detach from sub-CMap</dd></div>
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>Z</kbd></dt><dd data-tr="undo">Undo</dd></div>
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>Y</kbd> / <kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>Z</kbd></dt><dd data-tr="redo-action">Redo</dd></div>
<div><dt><kbd>F2</kbd></dt><dd data-tr="cmap-help-rename">Edit the selected concept</dd></div>
<div><dt><kbd>Delete</kbd>/<kbd>Backspace</kbd></dt><dd data-tr="delete-selected">Delete selection</dd></div>
<div><dt><kbd>Esc</kbd></dt><dd data-tr="cmap-help-clear-selection">Clear selection</dd></div>
<div><dt><kbd>Ctrl</kbd>/<kbd>Cmd</kbd>+<kbd>S</kbd></dt><dd data-tr="save-now">Save now</dd></div>
</dl>
</div>
</details>
</div>
</header>
<div class="cmap-workspace">
<aside id="cmap-selection-toolbar" class="cmap-selection-toolbar editor-only" aria-label="Selection and layout tools" data-tr-aria-label="selection-layout-tools">
<div class="cmap-selection-tool-group" role="group" aria-label="Selection tools" data-tr-aria-label="selection-tools">
<button type="button" data-cmap-selection-action="edit" title="Edit selected" data-tr-title="edit-selected-concept" aria-label="Edit selected" data-tr-aria-label="edit-selected-concept" disabled><i data-lucide="pencil" aria-hidden="true"></i></button>
<button type="button" data-cmap-selection-action="group" title="Group selection as sub-CMap" data-tr-title="group-selected" aria-label="Group selection as sub-CMap" data-tr-aria-label="group-selected" disabled><i data-lucide="group" aria-hidden="true"></i></button>
<button type="button" data-cmap-selection-action="ungroup" title="Detach from sub-CMap" data-tr-title="ungroup-selected" aria-label="Detach from sub-CMap" data-tr-aria-label="ungroup-selected" disabled><i data-lucide="ungroup" aria-hidden="true"></i></button>
<button type="button" data-cmap-selection-action="hide" title="Hide in this view" data-tr-title="hide-in-this-view" aria-label="Hide in this view" data-tr-aria-label="hide-in-this-view" disabled><i data-lucide="eye-off" aria-hidden="true"></i></button>
</div>
<div class="cmap-selection-tool-separator" aria-hidden="true"></div>
<div class="cmap-selection-tool-group" role="group" aria-label="Size tools" data-tr-aria-label="size-tools">
<button type="button" data-cmap-layout="same-width" title="Make same width" data-tr-title="make-same-width" aria-label="Make same width" data-tr-aria-label="make-same-width" disabled><i data-lucide="move-horizontal" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="same-height" title="Make same height" data-tr-title="make-same-height" aria-label="Make same height" data-tr-aria-label="make-same-height" disabled><i data-lucide="move-vertical" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="same-size" title="Make same width and height" data-tr-title="make-same-size" aria-label="Make same width and height" data-tr-aria-label="make-same-size" disabled><i data-lucide="maximize-2" aria-hidden="true"></i></button>
</div>
<div class="cmap-selection-tool-separator" aria-hidden="true"></div>
<div class="cmap-selection-tool-group" role="group" aria-label="Alignment tools" data-tr-aria-label="alignment-tools">
<button type="button" data-cmap-layout="align-left" title="Align left" data-tr-title="align-left" aria-label="Align left" data-tr-aria-label="align-left" disabled><i data-lucide="align-horizontal-justify-start" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="align-center" title="Align horizontal centers" data-tr-title="align-horizontal-centers" aria-label="Align horizontal centers" data-tr-aria-label="align-horizontal-centers" disabled><i data-lucide="align-horizontal-justify-center" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="align-right" title="Align right" data-tr-title="align-right" aria-label="Align right" data-tr-aria-label="align-right" disabled><i data-lucide="align-horizontal-justify-end" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="align-top" title="Align top" data-tr-title="align-top" aria-label="Align top" data-tr-aria-label="align-top" disabled><i data-lucide="align-vertical-justify-start" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="align-middle" title="Align vertical centers" data-tr-title="align-vertical-centers" aria-label="Align vertical centers" data-tr-aria-label="align-vertical-centers" disabled><i data-lucide="align-vertical-justify-center" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="align-bottom" title="Align bottom" data-tr-title="align-bottom" aria-label="Align bottom" data-tr-aria-label="align-bottom" disabled><i data-lucide="align-vertical-justify-end" aria-hidden="true"></i></button>
</div>
<div class="cmap-selection-tool-separator" aria-hidden="true"></div>
<div class="cmap-selection-tool-group" role="group" aria-label="Distribution tools" data-tr-aria-label="distribution-tools">
<button type="button" data-cmap-layout="distribute-horizontal" title="Distribute horizontally" data-tr-title="distribute-horizontally" aria-label="Distribute horizontally" data-tr-aria-label="distribute-horizontally" disabled><i data-lucide="align-horizontal-space-around" aria-hidden="true"></i></button>
<button type="button" data-cmap-layout="distribute-vertical" title="Distribute vertically" data-tr-title="distribute-vertically" aria-label="Distribute vertically" data-tr-aria-label="distribute-vertically" disabled><i data-lucide="align-vertical-space-around" aria-hidden="true"></i></button>
</div>
</aside>
<div id="cmap-canvas" class="cmap-canvas" aria-label="Concept map"></div>
<nav id="cmap-context-menu" class="cmap-context-menu hidden" role="menu" aria-label="Concept map tools">
<button id="cmap-new-map" class="editor-only" type="button" role="menuitem" data-tr="new-concept-map">New CMap</button>
<button id="cmap-save-map" class="editor-only" type="button" role="menuitem" data-tr="save-now">Save now</button>
<div class="cmap-context-separator" role="separator"></div>
<button id="cmap-rename-map" type="button" role="menuitem" data-tr="rename-concept-map" disabled>Rename CMap</button>
<button id="cmap-edit-metadata" class="editor-only" type="button" role="menuitem" data-tr="concept-map-details" disabled>CMap details</button>
<button id="cmap-export-markdown" type="button" role="menuitem" data-tr="export-markdown" disabled>Export CMap…</button>
<button id="cmap-import-json" class="editor-only" type="button" role="menuitem" data-tr="import-cmap-json">Import CMap JSON…</button>
<button id="cmap-manage-people" class="editor-only" type="button" role="menuitem" data-tr="manage-people">Manage people</button>
<button id="cmap-set-start-map" type="button" role="menuitem" data-tr="set-start-concept-map" disabled>Use as start CMap</button>
<button id="cmap-create-snapshot" type="button" role="menuitem" data-tr="create-concept-map-snapshot" disabled>Make snapshot…</button>
<button id="cmap-history" type="button" role="menuitem" data-tr="concept-map-history" disabled>CMap history</button>
<div class="cmap-context-separator" role="separator"></div>
<button id="cmap-add-concept" type="button" role="menuitem" data-tr="add-concept">Add concept</button>
<button id="cmap-add-page" type="button" role="menuitem" data-tr="add-page-node">Add current page</button>
<button id="cmap-add-submap" type="button" role="menuitem" data-tr="add-submap">Add sub-CMap</button>
<button id="cmap-promote-submap" type="button" role="menuitem" data-tr="promote-submap" disabled>Make separate CMap</button>
<button id="cmap-edit-selected" type="button" role="menuitem" data-tr="edit-selected-concept">Edit selected</button>
<button id="cmap-cut-selected" type="button" role="menuitem" data-tr="cut-linked-concepts" disabled>Cut concept reference</button>
<button id="cmap-copy-selected" type="button" role="menuitem" data-tr="copy-linked-concepts">Copy concept reference</button>
<button id="cmap-paste-concepts" type="button" role="menuitem" data-tr="paste-linked-concepts" disabled>Paste linked concept</button>
<div class="cmap-context-separator" role="separator"></div>
<button id="cmap-undo" type="button" role="menuitem" data-tr="undo" disabled>Undo</button>
<button id="cmap-redo" type="button" role="menuitem" data-tr="redo-action" disabled>Redo</button>
<div class="cmap-context-separator" role="separator"></div>
<button id="cmap-select-all" type="button" role="menuitem" data-tr="select-all">Select all</button>
<button id="cmap-group-selected" type="button" role="menuitem" data-tr="group-selected" disabled>Group selection as sub-CMap</button>
<button id="cmap-ungroup-selected" type="button" role="menuitem" data-tr="ungroup-selected" disabled>Detach from sub-CMap</button>
<button id="cmap-hide-selected" type="button" role="menuitem" data-tr="hide-in-this-view" disabled>Hide in this view</button>
<button id="cmap-delete-selected" class="danger" type="button" role="menuitem" data-tr="delete-selected" disabled>Delete selection</button>
<div class="cmap-context-separator" role="separator"></div>
<button id="cmap-toggle-page-guides" type="button" role="menuitemcheckbox" aria-checked="true" data-tr="a4-page-boundaries">A4 page boundaries</button>
<button id="cmap-reset" type="button" role="menuitem" data-tr="reload-concept-map">Reload CMap</button>
<div class="cmap-context-separator" role="separator"></div>
<button id="cmap-delete-map" class="danger" type="button" role="menuitem" data-tr="archive-entire-concept-map" disabled>Archive entire CMap…</button>
</nav>
</div>
</section>
<section id="rename-view" class="hidden">
<div class="section-header">
<h1 data-tr="rename-page">Rename page</h1>
</div>
<div class="rename-form">
<label><span data-tr="page-title">Page title</span><input id="rename-title" type="text"></label>
<label><span data-tr="namespace">Namespace</span><input id="rename-namespace" type="text"></label>
<label><span data-tr="slug">Slug</span><input id="rename-slug" type="text"></label>
<div class="editor-buttons">
<button id="save-rename" type="button" data-tr="save">Save</button>
<button id="cancel-rename" type="button" data-tr="cancel">Cancel</button>
</div>
<p id="rename-status" class="muted"></p>
</div>
</section>
<section id="history-view" class="hidden">
<header class="page-header">
<h1 data-tr="page-history">Page history</h1>
<button id="close-history" data-tr="back">Back</button>
</header>
<div id="history-list"></div>
<div id="diff-target"></div>
</section>
<section id="profile-view" class="hidden settings-view">
<header class="page-header">
<h1 data-tr="profile">Profile</h1>
</header>
<form id="profile-form" class="settings-form card">
<label><span data-tr="username">Username</span><input id="profile-username" disabled></label>
<label><span data-tr="display-name">Display name</span><input id="profile-display-name" required maxlength="200" autocomplete="name"></label>
<label><span data-tr="email-address">Email address</span><input id="profile-email" type="email" maxlength="320" autocomplete="email"></label>
<fieldset>
<legend data-tr="change-password">Change password</legend>
<p class="muted" data-tr="change-password-help">Leave these fields empty if you do not want to change your password.</p>
<label><span data-tr="current-password">Current password</span><input id="profile-current-password" type="password" autocomplete="current-password"></label>
<label><span data-tr="new-password">New password</span><input id="profile-new-password" type="password" minlength="8" maxlength="1024" autocomplete="new-password"></label>
<label><span data-tr="repeat-password">Repeat password</span><input id="profile-repeat-password" type="password" minlength="8" maxlength="1024" autocomplete="new-password"></label>
</fieldset>
<div class="settings-actions"><button type="submit" data-tr="save-profile">Save profile</button><span id="profile-status" class="muted" role="status" aria-live="polite"></span></div>
</form>
</section>
<section id="admin-view" class="hidden">
<header class="page-header">
<h1 data-tr="admin">Admin</h1>
</header>
<p class="admin-version"><span data-tr="software-version">Software version</span>: <strong id="admin-software-version"></strong></p>
<p class="admin-version"><span data-tr="database-schema-version">Database schema version</span>: <strong id="admin-database-schema-version"></strong></p>
<nav class="admin-menu">
<a id="admin-users-link" href="#admin/users" data-tr="users">Users</a>
<a id="admin-mail-link" href="#admin/mail" data-tr="email-and-password-reset">Email and password reset</a>
<a id="admin-aliases-link" href="#admin/aliases" data-tr="page-aliases">Page aliases</a>
<a id="admin-translations-link" href="#" data-tr="translations">Translations</a>
<a id="admin-orphaned-uploads-link" href="#admin/orphaned-uploads" data-tr="orphaned-uploads">Orphaned uploads</a>
<a id="admin-archived-cmaps-link" href="#admin/archived-cmaps" data-tr="archived-concept-maps">Archived CMaps</a>
</nav>
</section>
<section id="archived-cmaps-view" class="hidden">
<header class="page-header">
<h1 data-tr="archived-concept-maps">Archived CMaps</h1>
<a id="close-archived-cmaps" href="#admin" data-tr="back">Back</a>
</header>
<p id="archived-cmaps-status" class="muted" role="status" aria-live="polite"></p>
<div id="archived-cmaps-list" class="archived-cmaps-list"></div>
</section>
<section id="orphaned-uploads-view" class="hidden">
<header class="page-header">
<h1 data-tr="orphaned-uploads">Orphaned uploads</h1>
<a id="close-orphaned-uploads" href="#admin" data-tr="back">Back</a>
</header>
<div id="orphaned-uploads-list" class="orphaned-uploads-list"></div>
</section>
<section id="alias-admin-view" class="hidden">
<div class="section-header">
<h1 data-tr="page-aliases">Page aliases</h1>
<a id="close-alias-admin" href="#admin" data-tr="back">Back</a>
</div>
<p id="alias-admin-status" class="muted" role="status" aria-live="polite"></p>
<div id="alias-list"></div>
</section>
<section id="user-admin-view" class="hidden">
<header class="page-header">
<h1 data-tr="user-administration">User administration</h1>
<a id="close-user-admin" href="#admin" data-tr="back">Back</a>
</header>
<form id="new-user-form" class="user-form">
<input id="new-username" placeholder="Username" data-tr-placeholder="username" required>
<input id="new-display-name" placeholder="Display name" data-tr-placeholder="display-name">
<input id="new-email" type="email" placeholder="Email address" data-tr-placeholder="email-address">
<input id="new-password" type="password" placeholder="Initial password" data-tr-placeholder="initial-password" required>
<select id="new-role">
<option value="reader" data-tr="role-reader">reader</option>
<option value="editor" data-tr="role-editor">editor</option>
<option value="admin" data-tr="role-admin">admin</option>
</select>
<button type="submit" data-tr="create-user">Create user</button>
</form>
<div id="user-list"></div>
</section>
<section id="mail-admin-view" class="hidden settings-view">
<header class="page-header">
<h1 data-tr="email-and-password-reset">Email and password reset</h1>
<a id="close-mail-admin" href="#admin" data-tr="back">Back</a>
</header>
<form id="mail-settings-form" class="settings-form card">
<label><span data-tr="public-wiki-url">Public wiki URL</span><input id="mail-public-url" type="url" placeholder="https://wiki.example.org"></label>
<label><span data-tr="smtp-server">SMTP server</span><input id="mail-smtp-host"></label>
<label><span data-tr="smtp-port">SMTP port</span><input id="mail-smtp-port" type="number" min="1" max="65535" value="587"></label>
<label><span data-tr="sender-address">Sender address</span><input id="mail-smtp-from" type="email"></label>
<label><span data-tr="smtp-username">SMTP username</span><input id="mail-smtp-user" autocomplete="username"></label>
<label><span data-tr="smtp-password">SMTP password</span><input id="mail-smtp-password" type="password" autocomplete="new-password"><small id="mail-password-help" class="muted"></small></label>
<label class="checkbox-label"><input id="mail-smtp-tls" type="checkbox" checked><span data-tr="use-starttls">Use STARTTLS</span></label>
<label class="checkbox-label"><input id="mail-smtp-accept-untrusted-certificates" type="checkbox"><span data-tr="accept-untrusted-smtp-certificates">Accept untrusted certificates (trusted local server only)</span></label>
<label><span data-tr="reset-links-per-hour">Maximum reset links per user per hour</span><input id="mail-reset-limit" type="number" min="1" max="20" value="2"></label>
<fieldset>
<legend data-tr="test-smtp-settings">Test SMTP settings</legend>
<label><span data-tr="test-recipient">Test recipient</span><input id="mail-test-recipient" type="email"></label>
<button id="mail-test-button" type="button" data-tr="send-test-mail">Send test email</button>
</fieldset>
<div class="settings-actions"><button type="submit" data-tr="save">Save</button><span id="mail-settings-status" class="muted" role="status" aria-live="polite"></span></div>
</form>
</section>
</main>
</div>
<dialog id="cmap-concept-dialog" class="cmap-concept-dialog" aria-labelledby="cmap-concept-dialog-title">
<form id="cmap-concept-form" novalidate>
<h2 id="cmap-concept-dialog-title" data-tr="edit-concept">Edit concept</h2>
<div class="cmap-concept-tabs" role="tablist" aria-label="Concept properties">
<button id="cmap-concept-tab-content" type="button" role="tab" data-cmap-concept-tab="content" aria-controls="cmap-concept-panel-content" aria-selected="true" data-tr="content-and-links">Content &amp; links</button>
<button id="cmap-concept-tab-appearance" type="button" role="tab" data-cmap-concept-tab="appearance" aria-controls="cmap-concept-panel-appearance" aria-selected="false" data-tr="specific-appearance">Specific appearance</button>
</div>
<div class="cmap-concept-dialog-body">
<section id="cmap-concept-panel-content" class="cmap-concept-panel" role="tabpanel" aria-labelledby="cmap-concept-tab-content">
<label>
<span data-tr="label">Label</span>
<input id="cmap-concept-label" type="text" required>
</label>
<label>
<span data-tr="aspects">Aspects</span>
<input id="cmap-concept-aspects" type="text" data-tr-placeholder="aspects-placeholder" placeholder="Security, performance">
</label>
<label class="cmap-person-tags-field">
<span data-tr="person-tags">People (special tags)</span>
<details id="cmap-person-tags-picker" class="cmap-person-picker">
<summary data-tr="select-people">Select people</summary>
<div id="cmap-person-tag-options" class="cmap-person-tag-options"></div>
<div class="cmap-person-add-row editor-only">
<input id="cmap-person-new-name" type="text" data-tr-placeholder="person-name" placeholder="Person name">
<button id="cmap-person-add" type="button" data-tr="add-person">Add person</button>
</div>
</details>
<small class="muted" data-tr="person-tags-help">These person tags mark who owns the responsibility or action represented by this concept.</small>
</label>
<label class="cmap-quick-style-field">
<span data-tr="style">Style</span>
<select id="cmap-concept-quick-style"></select>
</label>
<label class="cmap-dialog-wide">
<span data-tr="synopsis">Synopsis</span>
<textarea id="cmap-concept-synopsis" rows="5"></textarea>
</label>
<label id="cmap-concept-page-row" class="cmap-concept-page-row">
<span data-tr="linked-page">Linked wiki page</span>
<div id="cmap-concept-page-combobox" class="wiki-combobox">
<input id="cmap-concept-page" type="search" role="combobox"
data-tr-placeholder="filter-pages" placeholder="Filter pages">
<button type="button" class="wiki-combobox-toggle" tabindex="-1" aria-label="Show wiki pages"></button>
<div id="cmap-concept-page-options" class="wiki-combobox-list hidden" role="listbox"></div>
</div>
</label>
<label id="cmap-concept-cmap-row" class="cmap-concept-page-row">
<span data-tr="linked-concept-map">Linked concept map</span>
<div id="cmap-concept-cmap-combobox" class="wiki-combobox">
<input id="cmap-concept-cmap" type="search" role="combobox"
data-tr-placeholder="filter-concept-maps" placeholder="Filter concept maps">
<button type="button" class="wiki-combobox-toggle" tabindex="-1" aria-label="Show concept maps"></button>
<div id="cmap-concept-cmap-options" class="wiki-combobox-list hidden" role="listbox"></div>
</div>
</label>
<label class="cmap-dialog-wide">
<span data-tr="external-web-page">External web page</span>
<input id="cmap-concept-external-url" type="url" inputmode="url" placeholder="https://example.com">
<small class="muted" data-tr="external-web-page-help">Opens in a new browser tab. Only http and https addresses are accepted.</small>
</label>
<label class="cmap-dialog-wide">
<span data-tr="concept-description-page">Concept description page</span>
<input id="cmap-concept-description-page" type="text" data-tr-placeholder="concept-description-page-placeholder" placeholder="cmap:concept-name">
<a id="cmap-concept-description-link" class="hidden" href="#" data-tr="view-description-page">View description page</a>
</label>
<fieldset class="cmap-concept-image-fields cmap-dialog-wide">
<legend data-tr="concept-image">Concept image</legend>
<input id="cmap-concept-image" type="file" accept="image/*">
<div id="cmap-concept-image-preview-row" class="cmap-concept-image-preview-row hidden">
<img id="cmap-concept-image-preview" alt="">
<button id="cmap-concept-image-remove" type="button" data-tr="remove-image">Remove image</button>
</div>
</fieldset>
</section>
<section id="cmap-concept-panel-appearance" class="cmap-concept-panel hidden" role="tabpanel" aria-labelledby="cmap-concept-tab-appearance">
<div class="cmap-style-manager cmap-dialog-wide">
<label>
<span data-tr="styles">Styles</span>
<select id="cmap-concept-style-preset" aria-describedby="cmap-style-storage-help"></select>
</label>
<div class="cmap-style-manager-actions">
<button id="cmap-save-style" type="button" data-tr="save-as-style">Save as style…</button>
<button id="cmap-delete-style" type="button" data-tr="delete-style">Delete style</button>
</div>
<small id="cmap-style-storage-help" class="muted" data-tr="styles-database-storage-help">Styles are shared through this wiki's database.</small>
</div>
<fieldset class="cmap-appearance-fields cmap-dialog-wide">
<legend data-tr="appearance">Appearance</legend>
<label>
<span id="cmap-concept-background-label" data-tr="background-color">Background color</span>
<span class="cmap-color-control"><input id="cmap-concept-background" class="cmap-color-input" type="text" value="#f3f6f8"><button type="button" class="cmap-color-swatch" aria-label="Choose background color"></button></span>
</label>
<fieldset class="cmap-typography-fields">
<legend data-tr="concept-heading-appearance">Heading</legend>
<label><span data-tr="text-color">Text color</span><span class="cmap-color-control"><input id="cmap-concept-text-color" class="cmap-color-input" type="text" value="#222222"><button type="button" class="cmap-color-swatch" aria-label="Choose heading text color"></button></span></label>
<label><span data-tr="font-family">Font family</span><select id="cmap-concept-font-family"><option value="Arial, Helvetica, sans-serif">Arial</option><option value="Verdana, Geneva, sans-serif">Verdana</option><option value="Tahoma, Geneva, sans-serif">Tahoma</option><option value="Trebuchet MS, Arial, sans-serif">Trebuchet MS</option><option value="Georgia, Times New Roman, serif">Georgia</option><option value="Times New Roman, Times, serif">Times New Roman</option><option value="Courier New, Courier, monospace">Courier New</option><option value="system-ui, sans-serif">System UI</option></select></label>
<label><span data-tr="font-size">Font size</span><span class="cmap-font-size-input"><input id="cmap-concept-font-size" type="number" min="6" max="54" step="0.5"><span>pt</span></span></label>
<label class="cmap-check-label"><input id="cmap-concept-bold" type="checkbox" checked><span data-tr="bold">Bold</span></label>
<label class="cmap-check-label"><input id="cmap-concept-italic" type="checkbox"><span data-tr="italic">Italic</span></label>
</fieldset>
<fieldset class="cmap-typography-fields">
<legend data-tr="concept-subtext-appearance">Subtext</legend>
<label><span data-tr="text-color">Text color</span><span class="cmap-color-control"><input id="cmap-concept-synopsis-text-color" class="cmap-color-input" type="text" value="#222222"><button type="button" class="cmap-color-swatch" aria-label="Choose subtext color"></button></span></label>
<label><span data-tr="font-family">Font family</span><select id="cmap-concept-synopsis-font-family"><option value="Arial, Helvetica, sans-serif">Arial</option><option value="Verdana, Geneva, sans-serif">Verdana</option><option value="Tahoma, Geneva, sans-serif">Tahoma</option><option value="Trebuchet MS, Arial, sans-serif">Trebuchet MS</option><option value="Georgia, Times New Roman, serif">Georgia</option><option value="Times New Roman, Times, serif">Times New Roman</option><option value="Courier New, Courier, monospace">Courier New</option><option value="system-ui, sans-serif">System UI</option></select></label>
<label><span data-tr="font-size">Font size</span><span class="cmap-font-size-input"><input id="cmap-concept-synopsis-font-size" type="number" min="6" max="54" step="0.5"><span>pt</span></span></label>
<label class="cmap-check-label"><input id="cmap-concept-synopsis-bold" type="checkbox"><span data-tr="bold">Bold</span></label>
<label class="cmap-check-label"><input id="cmap-concept-synopsis-italic" type="checkbox"><span data-tr="italic">Italic</span></label>
</fieldset>
</fieldset>
<fieldset id="cmap-submap-style-fields" class="cmap-submap-style-fields hidden">
<legend data-tr="submap-appearance">Sub-CMap appearance</legend>
<label><span data-tr="submap-background-color">Sub-CMap background color</span><span class="cmap-color-control"><input id="cmap-submap-background" class="cmap-color-input" type="text" value="#edf7e8"><button type="button" class="cmap-color-swatch" aria-label="Choose submap background color"></button></span></label>
<label><span data-tr="submap-border-color">Sub-CMap border color</span><span class="cmap-color-control"><input id="cmap-submap-border" class="cmap-color-input" type="text" value="#57834a"><button type="button" class="cmap-color-swatch" aria-label="Choose submap border color"></button></span></label>
</fieldset>
</section>
</div>
<div class="cmap-concept-dialog-actions">
<button id="cmap-concept-cancel" type="button" data-tr="cancel">Cancel</button>
<button type="submit" class="primary" data-tr="save">Save</button>
</div>
</form>
</dialog>
<dialog id="wiki-cmap-link-dialog" class="cmap-concept-dialog" aria-labelledby="wiki-cmap-link-title">
<form id="wiki-cmap-link-form">
<h2 id="wiki-cmap-link-title" data-tr="insert-concept-map-link">Insert CMap link</h2>
<label>
<span data-tr="linked-concept-map">Linked concept map</span>
<div id="wiki-cmap-link-combobox" class="wiki-combobox">
<input id="wiki-cmap-link" type="search" role="combobox"
data-tr-placeholder="filter-concept-maps" placeholder="Filter concept maps">
<button type="button" class="wiki-combobox-toggle" tabindex="-1" aria-label="Show concept maps"></button>
<div id="wiki-cmap-link-options" class="wiki-combobox-list hidden" role="listbox"></div>
</div>
</label>
<p class="muted" data-tr="concept-map-link-help">The selected CMap is inserted as a normal Markdown link.</p>
<div class="cmap-concept-dialog-actions">
<button id="wiki-cmap-link-cancel" type="button" data-tr="cancel">Cancel</button>
<button id="wiki-cmap-embed-submit" type="button" data-tr="embed-concept-map">Embed CMap</button>
<button id="wiki-cmap-link-submit" type="submit" class="primary" data-tr="insert">Insert</button>
</div>
</form>
</dialog>
<dialog id="cmap-people-dialog" class="cmap-concept-dialog" aria-labelledby="cmap-people-title">
<form id="cmap-people-form">
<h2 id="cmap-people-title" data-tr="manage-people">Manage people</h2>
<p class="muted" data-tr="manage-people-help">Inactive people remain on existing concepts but are hidden from the selection list for new tags.</p>
<div id="cmap-people-list" class="cmap-people-list"></div>
<div class="cmap-person-add-row">
<input id="cmap-people-new-name" type="text" data-tr-placeholder="person-name" placeholder="Person name">
<button id="cmap-people-add" type="button" data-tr="add-person">Add person</button>
</div>
<div class="cmap-concept-dialog-actions">
<button id="cmap-people-close" type="button" data-tr="close">Close</button>
</div>
</form>
</dialog>
<dialog id="cmap-metadata-dialog" class="cmap-concept-dialog" aria-labelledby="cmap-metadata-title">
<form id="cmap-metadata-form">
<h2 id="cmap-metadata-title" data-tr="concept-map-details">CMap details</h2>
<label>
<span data-tr="summary">Summary</span>
<textarea id="cmap-metadata-summary" rows="5"></textarea>
</label>
<label>
<span data-tr="tags">Tags (comma separated)</span>
<input id="cmap-metadata-tags" type="text" data-tr-placeholder="tags" placeholder="Tags (comma separated)">
</label>
<label>
<span data-tr="concept-map-explanation-page">CMap explanation page</span>
<input id="cmap-metadata-explanation-page" type="text" data-tr-placeholder="concept-map-explanation-placeholder" placeholder="cmap:explanation">
</label>
<p class="muted" data-tr="concept-map-details-help">These details are included in Markdown exports. The explanation page is always included when it exists.</p>
<div class="cmap-concept-dialog-actions">
<button id="cmap-metadata-cancel" type="button" data-tr="cancel">Cancel</button>
<button type="submit" class="primary" data-tr="save">Save</button>
</div>
</form>
</dialog>
<dialog id="cmap-export-dialog" class="cmap-concept-dialog" aria-labelledby="cmap-export-title">
<form id="cmap-export-form">
<h2 id="cmap-export-title" data-tr="export-markdown">Export CMap…</h2>
<label>
<span data-tr="linked-concept-map-depth">Depth of linked CMaps</span>
<input id="cmap-export-depth" type="number" min="0" max="10" step="1" value="1" required>
</label>
<label class="cmap-check-label">
<input id="cmap-export-pages" type="checkbox">
<span data-tr="include-linked-wiki-pages">Include linked wiki pages in Markdown (JSON always includes them)</span>
</label>
<p class="muted" data-tr="cmap-export-help">Markdown is a readable report. JSON is a complete importable bundle containing diagram layout, concepts and linked wiki pages. Level 0 exports only this CMap.</p>
<p id="cmap-export-status" class="muted" role="status"></p>
<div class="cmap-concept-dialog-actions">
<button id="cmap-export-cancel" type="button" data-tr="cancel">Cancel</button>
<button id="cmap-export-copy" type="button" data-tr="copy-markdown">Copy Markdown</button>
<button id="cmap-export-json" type="button" data-tr="download-cmap-json">Download JSON</button>
<button type="submit" class="primary" data-tr="download-markdown">Download Markdown</button>
</div>
</form>
</dialog>
<input id="cmap-import-file" class="hidden" type="file" accept=".json,application/json">
<dialog id="cmap-unsaved-dialog" class="cmap-unsaved-dialog" aria-labelledby="cmap-unsaved-title">
<form method="dialog">
<h2 id="cmap-unsaved-title" data-tr="unsaved-concept-map">Unsaved concept map</h2>
<p data-tr="save-concept-map-before-leaving">Save the changes to this concept map before leaving?</p>
<div class="cmap-concept-dialog-actions">
<button id="cmap-unsaved-cancel" type="button" data-tr="cancel">Cancel</button>
<button id="cmap-unsaved-discard" type="button" data-tr="dont-save">Don't save</button>
<button id="cmap-unsaved-save" type="button" class="primary editor-only" data-tr="save">Save</button>
</div>
</form>
</dialog>
<dialog id="cmap-history-dialog" class="cmap-history-dialog" aria-labelledby="cmap-history-title">
<div class="cmap-history-panel">
<header>
<h2 id="cmap-history-title" data-tr="concept-map-history">CMap history</h2>
<button id="cmap-history-close" type="button" data-tr="close">Close</button>
</header>
<p class="muted" data-tr="concept-map-history-help">Snapshots are kept indefinitely. Up to five explicit saves are kept; automatic saves are not added to history.</p>
<div id="cmap-history-list"></div>
</div>
</dialog>
<script src="/vendor/purify.min.js"></script>
<script src="/vendor/mermaid.min.js"></script>
<script src="/vendor/highlight.min.js"></script>
<script src="/vendor/highlight-scheme.min.js"></script>
<script src="/vendor/easymde.min.js"></script>
<script src="/vendor/lucide.min.js"></script>
<script src="/vendor/diff2html-ui-base.min.js"></script>
<script src="/cmap/cmap.js?id=__CMAP_CACHE_ID__"></script>
<script src="/js/combobox.js?id=__CMAP_CACHE_ID__"></script>
<script src="/js/mermaid-racket-wiki.js?id=__CMAP_CACHE_ID__"></script>
<script src="/js/cmap-export.js?id=__CMAP_CACHE_ID__"></script>
<script type="importmap">
{
"imports": {
"/cmap/cmap-racket-wiki.js": "/cmap/cmap-racket-wiki.js?id=__CMAP_CACHE_ID__",
"/cmap/cmap-view.js": "/cmap/cmap-view.js?id=__CMAP_CACHE_ID__",
"/cmap/model/concept-repository.js": "/cmap/model/concept-repository.js?id=__CMAP_CACHE_ID__",
"/cmap/model/concept-map.js": "/cmap/model/concept-map.js?id=__CMAP_CACHE_ID__",
"/js/wiki/cmap/interchange.js": "/js/wiki/cmap/interchange.js?id=__CMAP_CACHE_ID__",
"/js/wiki/reference.js": "/js/wiki/reference.js?id=__CMAP_CACHE_ID__",
"/js/wiki/routes.js": "/js/wiki/routes.js?id=__CMAP_CACHE_ID__",
"/js/wiki/markdown.js": "/js/wiki/markdown.js?id=__CMAP_CACHE_ID__",
"/js/wiki/breadcrumb-trail.js": "/js/wiki/breadcrumb-trail.js?id=__CMAP_CACHE_ID__",
"/js/wiki/page-outline.js": "/js/wiki/page-outline.js?id=__CMAP_CACHE_ID__",
"/js/wiki/admin/overview.js": "/js/wiki/admin/overview.js?id=__CMAP_CACHE_ID__",
"/js/wiki/admin/alias-admin.js": "/js/wiki/admin/alias-admin.js?id=__CMAP_CACHE_ID__",
"/js/wiki/admin/archived-cmaps-admin.js": "/js/wiki/admin/archived-cmaps-admin.js?id=__CMAP_CACHE_ID__",
"/js/wiki/admin/mail-admin.js": "/js/wiki/admin/mail-admin.js?id=__CMAP_CACHE_ID__",
"/js/wiki/admin/orphaned-uploads-admin.js": "/js/wiki/admin/orphaned-uploads-admin.js?id=__CMAP_CACHE_ID__",
"/js/wiki/admin/user-admin.js": "/js/wiki/admin/user-admin.js?id=__CMAP_CACHE_ID__"
}
}
</script>
<script type="module" src="/js/wiki.js?id=__CMAP_CACHE_ID__"></script>
</body>
</html>