summaryrefslogtreecommitdiff
path: root/vrsite/assets
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-08-02 17:38:06 -0300
committerGabriel Schneider <[email protected]>2026-08-02 23:11:01 -0300
commita9263daee9413c5eff3c1f1bebcd224442fd8685 (patch)
treef0a74fe1420cd9933cb2f85dc8313914aa674e94 /vrsite/assets
parente16f78b255bcf46d8c6f9a4b9e76dd7a3817edeb (diff)
downloadnotevi-a9263daee9413c5eff3c1f1bebcd224442fd8685.tar.gz
notevi-a9263daee9413c5eff3c1f1bebcd224442fd8685.zip
vrsite: toggle repository file list
Diffstat (limited to 'vrsite/assets')
-rw-r--r--vrsite/assets/app.js15
-rw-r--r--vrsite/assets/style.css.tmpl7
-rw-r--r--vrsite/assets/zig.scm65
3 files changed, 87 insertions, 0 deletions
diff --git a/vrsite/assets/app.js b/vrsite/assets/app.js
index 74db8d2..854959a 100644
--- a/vrsite/assets/app.js
+++ b/vrsite/assets/app.js
@@ -256,6 +256,21 @@ const nav = document.getElementById("nav");
const tree = document.getElementById("tree");
const state = JSON.parse(localStorage.getItem("vrsite-tree") || "{}");
+// The file tree can get out of the way without losing repository context or
+// the navigation footer. Keep the choice across page loads in this browser.
+const fileList = document.getElementById("filelist");
+const fileToggle = document.getElementById("filetoggle");
+if (fileList && fileToggle) {
+ const setFilesHidden = hidden => {
+ root.dataset.files = hidden ? "hidden" : "shown";
+ fileToggle.setAttribute("aria-expanded", String(!hidden));
+ fileToggle.textContent = hidden ? "show files" : "hide files";
+ localStorage.setItem("vrsite-files-hidden", hidden ? "1" : "0");
+ };
+ setFilesHidden(localStorage.getItem("vrsite-files-hidden") === "1");
+ fileToggle.addEventListener("click", () => setFilesHidden(root.dataset.files !== "hidden"));
+}
+
if (nav && tree) {
const base = nav.dataset.root, cur = nav.dataset.current;
fetch(nav.dataset.tree).then(r => r.text()).then(t => {
diff --git a/vrsite/assets/style.css.tmpl b/vrsite/assets/style.css.tmpl
index 60d2a2b..5ea2a40 100644
--- a/vrsite/assets/style.css.tmpl
+++ b/vrsite/assets/style.css.tmpl
@@ -73,6 +73,13 @@ nav > header {
}
nav > header a { color: var(--fg); }
nav .brand { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+#filetoggle {
+ display: block; margin: 0 0 6px auto;
+ background: none; color: var(--muted); border: 0;
+ font: inherit; font-size: 11px; padding: 1px 3px; cursor: pointer;
+}
+#filetoggle:hover { color: var(--fg); }
+:root[data-files="hidden"] #filelist { display: none; }
/* ── the current change ────────────────────────────────────────
Everything on screen is read at one change: the tree, the code, the
diff --git a/vrsite/assets/zig.scm b/vrsite/assets/zig.scm
new file mode 100644
index 0000000..a85383a
--- /dev/null
+++ b/vrsite/assets/zig.scm
@@ -0,0 +1,65 @@
+; Zig highlights, from tree-sitter-grammars/tree-sitter-zig v1.1.2
+; queries/highlights.scm (MIT). Reordered for later-patterns-win, capture names
+; mapped onto zed syntax keys — upstream's keyword.* split collapses to
+; @keyword, which zed themes colour as one — and the #lua-match? identifier
+; heuristics rewritten as #match?, which this engine evaluates.
+
+["(" ")" "[" "]" "{" "}"] @punctuation.bracket
+(payload "|" @punctuation.bracket)
+[";" "," "." ":" "=>" "->"] @punctuation.delimiter
+["=" "==" "!=" "<" ">" "<=" ">=" "+" "+%" "+|" "-" "-%" "-|" "*" "*%" "*|"
+ "**" "/" "%" "&" "|" "^" "~" "!" "||" "<<" "<<|" ">>" ".." ".*" ".?" "?"
+ "+=" "+%=" "+|=" "-=" "-%=" "-|=" "*=" "*%=" "*|=" "/=" "%=" "&=" "|=" "^="
+ "<<=" "<<|=" ">>="] @operator
+
+["addrspace" "align" "allowzero" "and" "asm" "async" "await" "break"
+ "callconv" "catch" "comptime" "const" "continue" "defer" "else" "enum"
+ "errdefer" "error" "export" "extern" "fn" "for" "if" "inline" "linksection"
+ "noalias" "noinline" "nosuspend" "opaque" "or" "orelse" "packed" "pub"
+ "resume" "return" "struct" "suspend" "switch" "test" "threadlocal" "try"
+ "union" "usingnamespace" "var" "volatile" "while"] @keyword
+
+(builtin_type) @type
+["anyframe" "anytype"] @type
+(parameter type: (identifier) @type)
+(variable_declaration (identifier) @type "="
+ [(struct_declaration) (enum_declaration) (union_declaration)
+ (opaque_declaration)])
+
+["null" "undefined" "unreachable"] @constant
+(boolean) @constant
+; an enum literal — .ok — is a member with nothing to its left
+(field_expression . member: (identifier) @constant)
+(enum_declaration (container_field type: (identifier) @constant))
+
+(container_field name: (identifier) @property)
+(field_initializer . (identifier) @property)
+(field_expression (_) member: (identifier) @property)
+; .x = 1 inside a Point{...} is a field, not the enum literal above
+(initializer_list
+ (assignment_expression
+ left: (field_expression . member: (identifier) @property)))
+(parameter name: (identifier) @variable.parameter)
+(block_label (identifier) @label)
+(break_label (identifier) @label)
+
+(function_declaration name: (identifier) @function)
+(call_expression function: (identifier) @function)
+(call_expression function: (field_expression member: (identifier) @function.method))
+(builtin_identifier) @function.builtin
+
+; Zig has no type-identifier node, only the TitleCase convention, and these
+; land after the call patterns so that the convention wins the way upstream's
+; first-pattern-wins order has it: std.ArrayList(u8) is a type, not a call.
+((identifier) @type
+ (#match? @type "^[A-Z][a-zA-Z0-9_]*$"))
+((identifier) @constant
+ (#match? @constant "^[A-Z][A-Z0-9_]+$"))
+
+[(integer) (float)] @number
+[(string) (multiline_string) (character)] @string
+(escape_sequence) @string.escape
+
+(comment) @comment
+((comment) @comment.doc
+ (#match? @comment.doc "^//[/!]"))