diff --git a/.editorconfig b/.editorconfig index 5f4be94c..43456223 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,7 +14,7 @@ indent_style = space indent_size = 2 trim_trailing_whitespace = false -[*.{nix,yml,yaml}] +[*.{js,nix,yml,yaml}] indent_style = space indent_size = 2 tab_width = 2 diff --git a/.github/README.md b/.github/README.md index 029f2fc8..fdc878d6 100644 --- a/.github/README.md +++ b/.github/README.md @@ -69,7 +69,7 @@ [Home-Manager module]: https://notashelf.github.io/nvf/index.xhtml#ch-standalone-hm - **Simple**: One language to rule them all! Use Nix to configure everything, - with additional Lua Support + with optional Lua support for robust configurability! - **Reproducible**: Your configuration will behave the same _anywhere_. No surprises, promise! - **Portable**: nvf depends _solely_ on your Nix store, and nothing else. No @@ -77,8 +77,9 @@ - Options to install [standalone], [NixOS module] or [Home-Manager module]. - **Customizable**: There are _almost no defaults_ to annoy you. nvf is fully customizable through the Nix module system. -- Not comfortable with a full-nix config or want to bring your Lua config? You - can do just that, no unnecessary restrictions. + - Not comfortable with a full-nix config or want to bring your Lua config? You + can do just that, no unnecessary restrictions. + - Lazyloading? We got it! Lazyload both internal and external plugins at will. - **Well-documented**: Documentation is priority. You will _never_ face undocumented, obscure behaviour. - **Idiomatic**: nvf does things ✨ _the right way_ ✨ - the codebase is, and diff --git a/docs/manual.nix b/docs/manual.nix index 113fb789..4becdf2d 100644 --- a/docs/manual.nix +++ b/docs/manual.nix @@ -62,7 +62,8 @@ in # Copy anchor scripts to the script directory in document root. cp -vt "$dest"/script \ ${./static/script}/anchor-min.js \ - ${./static/script}/anchor-use.js + ${./static/script}/anchor-use.js \ + ${./static/script}/search.js substituteInPlace ./options.md \ --subst-var-by OPTIONS_JSON ./config-options.json @@ -100,6 +101,7 @@ in --script highlightjs/loader.js \ --script script/anchor-use.js \ --script script/anchor-min.js \ + --script script/search.js \ --toc-depth 2 \ --section-toc-depth 1 \ manual.md \ diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 128ecd19..52a9ae64 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -6,3 +6,5 @@ - Add [typst-preview.nvim] under `languages.typst.extensions.typst-preview-nvim`. + +- Add a search widget to the options page in the nvf manual. diff --git a/docs/static/script/search.js b/docs/static/script/search.js new file mode 100644 index 00000000..e20c2314 --- /dev/null +++ b/docs/static/script/search.js @@ -0,0 +1,58 @@ +document.addEventListener("DOMContentLoaded", () => { + if (!window.location.pathname.endsWith("options.html")) return; + + const searchDiv = document.createElement("div"); + searchDiv.id = "search-bar"; + searchDiv.innerHTML = ` + +
+ `; + document.body.prepend(searchDiv); + + const dtElements = Array.from(document.querySelectorAll("dt")); + const ddElements = Array.from(document.querySelectorAll("dd")); + const dtOptionIds = dtElements.map( + (dt) => dt.querySelector("a")?.id.toLowerCase() || "", + ); + + if (dtElements.length === 0 || ddElements.length === 0) { + console.warn("Something went wrong, page may be loaded incorrectly."); + return; + } + + const dtElementsData = dtElements.map((dt, index) => ({ + element: dt, + id: dtOptionIds[index], + ddElement: ddElements[index], + })); + + const hiddenClass = "hidden"; + const hiddenStyle = document.createElement("style"); + hiddenStyle.innerHTML = `.${hiddenClass} { display: none; }`; + document.head.appendChild(hiddenStyle); + + let debounceTimeout; + document.getElementById("search-input").addEventListener("input", (event) => { + clearTimeout(debounceTimeout); + debounceTimeout = setTimeout(() => { + const query = event.target.value.toLowerCase(); + + const matches = []; + const nonMatches = []; + + dtElementsData.forEach(({ element, id, ddElement }) => { + const isMatch = id.includes(query); + if (isMatch) { + matches.push(element, ddElement); + } else { + nonMatches.push(element, ddElement); + } + }); + + requestAnimationFrame(() => { + matches.forEach((el) => el?.classList.remove(hiddenClass)); + nonMatches.forEach((el) => el?.classList.add(hiddenClass)); + }); + }, 200); + }); +}); diff --git a/docs/static/style.scss b/docs/static/style.scss index 718302f3..d6becd0c 100644 --- a/docs/static/style.scss +++ b/docs/static/style.scss @@ -189,14 +189,16 @@ th { dt { margin: 1.2rem 0 0.8rem; + content-visibility: auto; + contain-intrinsic-size: auto 42px; } - dd { margin-left: 2rem; + content-visibility: auto; + contain-intrinsic-size: auto 500px; } -div.book { -} +div.book {} ul { @include margined; @@ -233,6 +235,33 @@ li { } } +#search-bar { + position: sticky; + top: 0; + background: white; + padding: 10px; + border-bottom: 1px solid $color-gray-200; + z-index: 1000; + @media (prefers-color-scheme: dark) { + background: $color-gray-900; + color: $color-gray-50; + border-bottom: 1px solid black; + } +} + +#search-input { + width: 100%; + padding: 8px; + border: 1px solid #ccc; + border-radius: 4px; + background: inherit; + color: inherit; +} + +.hidden { + display: none; +} + div.titlepage { margin: 40px 0; diff --git a/modules/wrapper/rc/options.nix b/modules/wrapper/rc/options.nix index 4680190a..ab541419 100644 --- a/modules/wrapper/rc/options.nix +++ b/modules/wrapper/rc/options.nix @@ -12,22 +12,28 @@ cfg = config.vim; in { options.vim = { - enableLuaLoader = mkEnableOption '' - [{option}`official documentation`]: https://neovim.io/doc/user/lua.html#vim.loader.enable() + enableLuaLoader = mkOption { + type = bool; + default = false; + example = true; + description = '' + [{option}`official documentation`]: https://neovim.io/doc/user/lua.html#vim.loader.enable() - the experimental Lua module loader to speed up the start up process + the experimental Lua module loader to speed up the start up process - If `true`, this will enable the experimental Lua module loader which: - - overrides loadfile - - adds the lua loader using the byte-compilation cache - - adds the libs loader - - removes the default Neovim loader + If `true`, this will enable the experimental Lua module loader which: + - overrides loadfile + - adds the lua loader using the byte-compilation cache + - adds the libs loader + - removes the default Neovim loader - ::: {.note} - This is disabled by default. Before setting this option, please - take a look at the [{option}`official documentation`]. - ::: - ''; + ::: {.note} + The Lua module loader is *disabled* by default. Before setting this option, please + take a look at the [{option}`official documentation`]. This option may be enabled by + default in the future. + ::: + ''; + }; additionalRuntimePaths = mkOption { type = listOf (either path str);