// Populate the sidebar // // This is a script, and not included directly in the page, to control the total size of the book. // The TOC contains an entry for each page, so if each page includes a copy of the TOC, // the total size of the page becomes O(n**2). class MDBookSidebarScrollbox extends HTMLElement { constructor() { super(); } connectedCallback() { this.innerHTML = '
  1. Introduction
  2. Getting Started
  3. Installation
  4. Prerequisites
  5. Quick Start
  6. Concepts
  7. How vmctl Works
  8. Imperative vs Declarative
  9. VM Lifecycle
  10. Networking Modes
  11. Image Management
  12. Cloud-Init and SSH Keys
  13. Tutorials
  14. Creating a VM Imperatively
  15. Declarative Workflow with VMFile.kdl
  16. Provisioning
  17. Real-World: OmniOS Builder VM
  18. VMFile.kdl Reference
  19. Overview
  20. VM Block
  21. Image Sources
  22. Resources
  23. Network Block
  24. Cloud-Init Block
  25. SSH Block
  26. Provision Blocks
  27. Multi-VM Definitions
  28. Full Example
  29. CLI Reference
  30. vmctl
  31. vmctl create
  32. vmctl start
  33. vmctl stop
  34. vmctl destroy
  35. vmctl list
  36. vmctl status
  37. vmctl console
  38. vmctl ssh
  39. vmctl suspend
  40. vmctl resume
  41. vmctl image
  42. vmctl up
  43. vmctl down
  44. vmctl reload
  45. vmctl provision
  46. vmctl log
  47. Architecture
  48. Overview
  49. Crate Structure
  50. Hypervisor Backends
  51. State Management
  52. SSH Subsystem
  53. Error Handling
  54. Library API Guide
  55. Using vm-manager as a Crate
  56. Hypervisor Trait
  57. Core Types
  58. Image Management API
  59. SSH and Provisioning API
  60. VMFile Parsing API
  61. Advanced Topics
  62. Running in Docker/Podman
  63. TAP Networking and Bridges
  64. illumos / Propolis Backend
  65. Custom Cloud-Init User Data
  66. Debugging and Logs
'; // Set the current, active page, and reveal it if it's hidden let current_page = document.location.href.toString().split("#")[0].split("?")[0]; if (current_page.endsWith("/")) { current_page += "index.html"; } var links = Array.prototype.slice.call(this.querySelectorAll("a")); var l = links.length; for (var i = 0; i < l; ++i) { var link = links[i]; var href = link.getAttribute("href"); if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { link.href = path_to_root + href; } // The "index" page is supposed to alias the first chapter in the book. if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { link.classList.add("active"); var parent = link.parentElement; if (parent && parent.classList.contains("chapter-item")) { parent.classList.add("expanded"); } while (parent) { if (parent.tagName === "LI" && parent.previousElementSibling) { if (parent.previousElementSibling.classList.contains("chapter-item")) { parent.previousElementSibling.classList.add("expanded"); } } parent = parent.parentElement; } } } // Track and set sidebar scroll position this.addEventListener('click', function(e) { if (e.target.tagName === 'A') { sessionStorage.setItem('sidebar-scroll', this.scrollTop); } }, { passive: true }); var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); sessionStorage.removeItem('sidebar-scroll'); if (sidebarScrollTop) { // preserve sidebar scroll position when navigating via links within sidebar this.scrollTop = sidebarScrollTop; } else { // scroll sidebar to current active section when navigating via "next/previous chapter" buttons var activeSection = document.querySelector('#sidebar .active'); if (activeSection) { activeSection.scrollIntoView({ block: 'center' }); } } // Toggle buttons var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); function toggleSection(ev) { ev.currentTarget.parentElement.classList.toggle('expanded'); } Array.from(sidebarAnchorToggles).forEach(function (el) { el.addEventListener('click', toggleSection); }); } } window.customElements.define("mdbook-sidebar-scrollbox", MDBookSidebarScrollbox);