${ssrInterpolate(((_c = unref(theme2).notFound) == null ? void 0 : _c.quote) ?? "But if you don't change your direction, and if you keep looking, you may end up where you are heading.")}
With Enabled on, the plugin evaluates a Markdown note in this order:
An enabled Exclude match leaves it editable.
Otherwise, All Markdown files protects it.
Otherwise, Only matched paths requires an enabled Include match to protect it.
New installations start in All Markdown files mode. Include rules are retained but inactive in that mode. In Only matched paths, an empty rule list protects nothing. Changing or deleting rules does not switch modes.
Each row has an Enabled checkbox, an Include or Exclude type, a Value field, and a Delete button. Disable a row to keep it for later without applying it. Disabled and unresolved rules do not participate in matching or active-rule counts.
By default, Use glob patterns is off and Case sensitive is on. Ordinary rules use literal path-prefix matching.
Value
Use
Reference/
Notes in Reference and all its subfolders
Archive/
Notes in Archive and all its subfolders
Notes/Summaries/
Notes under this nested folder
Reference/Handbook.md
A prefix beginning with this note path
Keep the trailing / for folder rules. In prefix mode, a plain name without .md or wildcards is treated as a folder prefix after source resolution. When entering an existing vault path without an extension, the source resolver first checks for a matching Markdown note; an existing folder is normalized with a trailing slash. Use / explicitly if a note and folder share a name and you intend to select the folder.
A .md vault path remains a prefix rule, not an exact equality check. To target exactly one existing note regardless of prefix or glob mode, import its Obsidian URL or desktop system file path.
With Only matched paths, these rules protect reference notes but allow drafts:
Type
Value
Include
Reference/
Exclude
Reference/Drafts/
With All Markdown files, an Exclude for Inbox/ leaves that folder editable and protects other Markdown notes. An include rule cannot override an exclude.
Can I use wildcards in Obsidian read-only path rules?
Yes. Turn on Advanced → Matching → Use glob patterns to enable the plugin's glob matcher for ordinary paths. Patterns match the entire vault-relative path.
Pattern
Meaning
**
All paths, including vault-root notes; protection still applies only to Markdown
Reference/*.md
Markdown notes directly inside Reference
Reference/**
Notes anywhere under Reference
Reference/**/Summary.md
Summary.md directly inside Reference or deeper below it
Notes/Summary?.md
One non-slash character after Summary, such as Summary1.md
* matches zero or more characters except /; ** can cross folder separators; ? matches one character except /. The /**/ form can cover zero or more nested folders. A leading **/README.md requires a slash, so use README.md separately if you also want the vault-root note.
There is no regular-expression, brace-alternative, or character-class syntax. With glob matching off, * and ? are literal characters. Switching matching modes affects ordinary saved path rules, so replace a prefix such as Reference/ with Reference/** when enabling globs.
Yes. Open Settings → Read Only View → Advanced → Matching and turn Case sensitive on. It is enabled by default. Turn it off to ignore uppercase/lowercase differences when matching paths. This is a shared setting for include and exclude rules, not a per-rule option.
With Only matched paths, glob matching off, and an enabled Include Reference/:
Note path
Case sensitive on
Case sensitive off
Reference/Handbook.md
Read-only
Read-only
reference/Handbook.md
Editable
Read-only
This example assumes no other rules match. The setting applies to prefix and glob matching, as well as comparisons against resolved exact-file rules. It does not rename files or make an invalid Obsidian URL or system path resolve: imported sources must still identify an existing item in the current vault. Verify the actual note path with Path tester.
Can I temporarily disable a path rule without deleting it?
Yes. Uncheck Enabled on the rule's row under Path rules. The plugin keeps its value and type, so you can re-enable it later without entering the path again.
To edit a note protected by its own include rule:
In Only matched paths, find the note's Include row.
Uncheck that row's Enabled checkbox, leaving the global Enabled toggle on.
Wait for Saved. and test the note. If it is Editable, switch it into editing and make your changes.
Check the row's Enabled checkbox again and wait for Saved. to restore that rule.
If another include, such as Reference/ or **, also matches, disabling only the note rule will not make the note editable. Add an Exclude for the note instead. Keep that exclude row saved: enable it when editing and disable it when you want protection back. Disabling a folder include affects every note it was protecting.
In All Markdown files, include rows are already inactive. Use an exclude for a particular note, or use Disable read-only mode and Enable read-only mode to pause and restore protection globally. Neither approach needs you to delete saved paths, and protection does not resume on a timer.
Can I use an Obsidian URL, system path, or vault path in a rule?
Yes. Add an enabled Include under Path rules in Only matched paths, then paste any of the following sources into Value. The field detects the source format. The same source formats also work for Exclude rules:
Resolves one exact existing Markdown note in the current vault
Desktop system path
/Users/name/MyVault/Reference/Handbook.md
Imports one exact existing Markdown note inside the current vault
Desktop system folder
/Users/name/MyVault/Reference/
Imports a folder using ordinary folder matching
Obsidian URLs may omit .md. Heading and block locators do not change which note is selected. A URL must name the current vault. Absolute system-path imports are available only on desktop, but the saved vault-relative path remains portable to mobile. The full system path is not persisted after successful import.
If a source cannot be resolved, its value remains visible with an explanation, but it does not match anything. Imported sources require existing targets and do not automatically follow later renames.
Wait for Saved., then paste a specific Markdown note path into Path tester. If the result is unexpected, check the selected mode, exclude matches, enabled rows, case sensitivity, and matching mode.
For very large configurations, settings show warnings and ignore rules beyond the limits: at most 200 includes, 300 excludes, and 400 total. Include rules are counted first; exclude rules at the end are trimmed if the total exceeds 400. Prefer a few folder rules where possible and review any limit warnings.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("docs/path-rules.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const pathRules = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ pathRules as default
+};
diff --git a/docs-site/.vitepress/.temp/docs_path-tester.md.js b/docs-site/.vitepress/.temp/docs_path-tester.md.js
new file mode 100644
index 0000000..0e5d66e
--- /dev/null
+++ b/docs-site/.vitepress/.temp/docs_path-tester.md.js
@@ -0,0 +1,20 @@
+import { ssrRenderAttrs, ssrRenderAttr } from "vue/server-renderer";
+import { useSSRContext } from "vue";
+import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js";
+const _imports_0 = "/Read-Only-View/assets/Read-Only-View-path-tester-read-only-1200x800.FabEG4bU.png";
+const __pageData = JSON.parse('{"title":"How to Check Whether an Obsidian Note Will Be Read-Only","description":"Diagnose whether an Obsidian note is Read-only or Editable using source resolution, matching Include and Exclude rules, and the all-Markdown preset.","frontmatter":{"title":"How to Check Whether an Obsidian Note Will Be Read-Only","description":"Diagnose whether an Obsidian note is Read-only or Editable using source resolution, matching Include and Exclude rules, and the all-Markdown preset."},"headers":[],"relativePath":"docs/path-tester.md","filePath":"docs/path-tester.md"}');
+const _sfc_main = { name: "docs/path-tester.md" };
+function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
+ _push(`
How to Check Whether an Obsidian Note Will Be Read-Only
Path tester is built into Settings → Read Only View. Use it to understand why a specific note is protected or remains editable; this website does not run the tester or access your vault.
Yes. Path tester evaluates the current configuration for the supplied path without requiring you to open the note. Obsidian URLs and system paths must resolve to existing items; enter a specific Markdown note to get a read-only result.
With Enabled on, Only matched paths selected, glob matching off, an Include for Reference/, and an Exclude for Reference/Drafts/:
Tested path
Expected result
Reason
Reference/Handbook.md
Read-only
Include matches; no exclude matches
Reference/Drafts/Handbook.md
Editable
Exclude wins
Inbox/Capture.md
Editable
No include matches
In All Markdown files, a note can be read-only without any include matches. The preset determines the result unless an exclude matches. Turning Enabled off disables protection.
Wrong vault or missing note: an Obsidian URL must resolve to an existing Markdown note in the current vault.
System path on mobile: import new absolute paths on desktop, or enter the portable vault-relative path instead.
Folder instead of a note: for a system folder, the tester shows the resolved folder and asks for a specific Markdown note before evaluating matches.
Unexpected Editable status: check excludes, the row's Enabled checkbox, letter case, and whether glob matching is on.
Unexpected Read-only status: check whether All Markdown files is selected.
The result explains the current configuration; it is not a filesystem-permission check or a guarantee for every embedded view. If open notes do not reflect saved changes, run Re-apply rules now from the Command Palette and reopen the note if necessary.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("docs/path-tester.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const pathTester = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ pathTester as default
+};
diff --git a/docs-site/.vitepress/.temp/docs_troubleshooting.md.js b/docs-site/.vitepress/.temp/docs_troubleshooting.md.js
new file mode 100644
index 0000000..e3db80d
--- /dev/null
+++ b/docs-site/.vitepress/.temp/docs_troubleshooting.md.js
@@ -0,0 +1,19 @@
+import { ssrRenderAttrs } from "vue/server-renderer";
+import { useSSRContext } from "vue";
+import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js";
+const __pageData = JSON.parse('{"title":"Why Is My Obsidian Note Read-Only or Still Editable?","description":"Troubleshoot Read Only View rules when a note stays editable, remains read-only after disabling an Include, or does not reflect saved settings.","frontmatter":{"title":"Why Is My Obsidian Note Read-Only or Still Editable?","description":"Troubleshoot Read Only View rules when a note stays editable, remains read-only after disabling an Include, or does not reflect saved settings."},"headers":[],"relativePath":"docs/troubleshooting.md","filePath":"docs/troubleshooting.md"}');
+const _sfc_main = { name: "docs/troubleshooting.md" };
+function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
+ _push(`
Why Is My Obsidian Note Read-Only or Still Editable?
Start with Path tester in Settings → Read Only View. Enter the specific Markdown note path and check its resolved path, matching rules, and final Read-only or Editable status. This separates a rule-configuration problem from a view that has not reflected the configuration yet.
Why is my note still editable after I added an Include?
An include protects a Markdown note only while the plugin is enabled and no enabled exclude matches. Check these points in order:
Confirm the global Enabled toggle is on and the file is a Markdown note.
Look for an Exclude match in Path tester. Excludes always win; adding another include cannot override one.
In Only matched paths, confirm the Include row is enabled and its source resolves without an inline error.
Check Advanced → Matching. Use Reference/ for a folder with glob matching off, or Reference/** with glob matching on. With globs off, * and ? are literal characters.
Check spelling and capitalization. Case sensitive is on by default. Imported URLs and system paths must still resolve to existing items in the current vault.
If the note was moved or renamed, update the saved path. Imported rules do not automatically follow renames.
For example, Include Reference/ and Exclude Reference/Drafts/ leave Reference/Drafts/Plan.md editable. Disable or narrow that exclude if you want the note protected.
If settings show a rule-limit warning, review which rules were ignored. See Path rules for the limits.
Why is my note read-only when I want to edit it?
Check Mode first. New installations use All Markdown files, which protects Markdown notes even without include rules. Choose Only matched paths for selected-path protection, or add an enabled exclude for an exception.
In Only matched paths, check every matching include in Path tester. A broad include such as Reference/ in prefix mode, or ** in glob mode, may protect the note alongside its individual rule.
For example, a vault in All Markdown files mode needs an Exclude for Daily Notes/ to leave that folder editable with glob matching off. With glob matching on, use Daily Notes/**. See the daily notes example.
Why does disabling an Include not let me edit the note?
Either All Markdown files is active or another enabled include still matches. Disabling one rule does not override those other sources of protection.
For a temporary exception, keep an Exclude row for the note: enable the exclude while editing, then disable it to restore protection. Its path stays saved. To pause enforcement for every note, run Disable read-only mode and later Enable read-only mode. See temporarily disabling rules.
Why does Path tester disagree with the open note?
Confirm you tested the actual note path and waited for Saved. after editing rules. If settings report Save failed., the changes have not saved successfully.
Run Re-apply rules now from the Command Palette, then reopen the note if necessary. An Editable result means Read Only View is not enforcing protection; you may still need to switch the note from Reading view to editing yourself.
If Path tester reports Read-only but editing remains possible in a hover, embedded, or nonstandard view, that context may depend on Obsidian internals. Protection is not guaranteed in every such view, and it does not prevent another plugin or application from modifying files.
If the problem continues, report an issue with your Obsidian and plugin versions, platform, mode, matching settings, and a minimal rule example. Use anonymized paths and describe whether it occurs in a normal note tab or a preview. See Path tester for the available diagnostics.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("docs/troubleshooting.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const troubleshooting = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ troubleshooting as default
+};
diff --git a/docs-site/.vitepress/.temp/faq.md.js b/docs-site/.vitepress/.temp/faq.md.js
new file mode 100644
index 0000000..2287925
--- /dev/null
+++ b/docs-site/.vitepress/.temp/faq.md.js
@@ -0,0 +1,19 @@
+import { ssrRenderAttrs } from "vue/server-renderer";
+import { useSSRContext } from "vue";
+import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js";
+const __pageData = JSON.parse('{"title":"Read Only View FAQ","description":"Answers about read-only Obsidian notes and folders, temporary editing, mobile support, Markdown files, local matching, and file-permission limitations.","frontmatter":{"title":"Read Only View FAQ","description":"Answers about read-only Obsidian notes and folders, temporary editing, mobile support, Markdown files, local matching, and file-permission limitations."},"headers":[],"relativePath":"faq.md","filePath":"faq.md"}');
+const _sfc_main = { name: "faq.md" };
+function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
+ _push(`
You can keep it in Reading view with Read Only View. Choose Only matched paths and add an enabled Include for the note. The plugin enforces view behavior and blocks input in supported Markdown editors; it does not make the underlying file immutable. Follow the single-note guide.
Yes, for Markdown note views. With glob matching off, include a folder such as Reference/ to cover its notes and subfolders. Add Exclude rules for editable exceptions. Attachments are unaffected. See the folder guide.
Does Read Only View change filesystem permissions?
No. It changes Obsidian view behavior only. It is not an operating-system lock, security boundary, or access-control system.
Can another application still edit the Markdown file?
Yes. Other applications, external tools, and plugins can still change files. Read Only View is intended to prevent accidental editing while reading in Obsidian.
Yes. Run Disable read-only mode in the Command Palette, switch to editing, then run Enable read-only mode when finished. This pauses protection globally and does not resume automatically.
To exempt only a particular note or folder, add an enabled Exclude rule and remove or disable it later. In Only matched paths, disabling an include row also stops that rule from protecting notes, provided no other include matches. In All Markdown files, disabling an include has no effect.
Yes. The plugin supports desktop and mobile and requires Obsidian 1.10.3 or newer. Narrow settings panes use a stacked layout. New absolute system paths can only be imported on desktop; their saved vault-relative paths remain portable to mobile. See the mobile guide.
The plugin makes no network requests during normal operation. Rule matching stays local. Downloading the plugin or its updates is separate from that operation.
The plugin does not rewrite Markdown content to enforce read-only behavior. It controls note views and editor input and saves its own configuration as plugin data. It does not add frontmatter or permission markers to notes.
New installations default to All Markdown files mode with Enabled on. Switch to Only matched paths to protect only selected paths, or add excludes for working notes and folders.
Check that Enabled is on, the note is Markdown, and an enabled exclude does not match. In Only matched paths, an enabled include must match. Check case sensitivity and glob settings with Path tester.
Some hover, embedded, or nonstandard editor contexts depend on Obsidian internals. Protection is not guaranteed in every such context.
Imported rules do not automatically follow later renames. Review the saved path after moving or renaming a note or folder and verify the new note path in Path tester.
How do I switch all Obsidian notes to Reading view?
Select All Markdown files with Enabled on. Alternatively, select Only matched paths, enable Use glob patterns, and add an enabled Include **. Enabled excludes still win. Follow the whole-vault guide.
Can I protect a folder but keep one note editable?
Yes. With glob matching off, include Reference/ and exclude Reference/Working notes.md. For an exact-file exception in either matching mode, use the note's Obsidian URL. See the folder and single-note exception example.
Can I use an Obsidian URL or system path instead of a vault path?
Yes. The rule's Value field accepts all three. URLs must resolve to an existing Markdown note in the current vault; system-path imports are desktop-only and must point inside that vault. Successful system-path imports save portable vault-relative paths. See source formats and examples.
Can I disable a rule temporarily without retyping the path later?
Yes. Uncheck the rule row's Enabled checkbox, then recheck it when needed. Its path and type stay saved. Other includes or All Markdown files may still protect the note; a saved exclude can provide a temporary exception in either mode. See temporarily disabling rules.
Can I check whether a note will be read-only by entering its path?
Yes. Paste a specific note path into Path tester in the plugin settings. It shows source resolution, matching rules, and the final Read-only or Editable status. See how to test a note path.
Can I use wildcards such as *, **, and ? in path rules?
Yes, after enabling Advanced → Matching → Use glob patterns. Use * within one path segment, ** across folders, and ? for one non-slash character. With glob matching off, these characters are literal. See wildcard examples.
Can I turn case-sensitive path matching on or off?
Yes. Use Advanced → Matching → Case sensitive. It is on by default; turn it off to ignore case when matching include and exclude paths. See case-sensitive matching examples.
Can I keep daily notes editable while protecting the rest of my vault?
Yes. In All Markdown files, exclude your daily-notes folder: Daily Notes/ with glob matching off, or Daily Notes/** with it on. Use your actual folder path; the plugin does not identify daily notes automatically. See the daily notes and Inbox example.
Can I protect notes in a folder without protecting its subfolders?
Yes. Select Only matched paths, enable Use glob patterns, and include Reference/*.md. Remove or disable broader includes if they also protect the subfolders. See the direct notes versus subfolders example.
How do I troubleshoot a note that is protected or editable unexpectedly?
Start with Path tester, then check the global Enabled toggle, selected mode, matching excludes, and enabled includes. Follow Troubleshooting for each result, including what to do when disabling an include does not remove protection.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("faq.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const faq = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ faq as default
+};
diff --git a/docs-site/.vitepress/.temp/guides_make-all-notes-read-only.md.js b/docs-site/.vitepress/.temp/guides_make-all-notes-read-only.md.js
new file mode 100644
index 0000000..d3a00fc
--- /dev/null
+++ b/docs-site/.vitepress/.temp/guides_make-all-notes-read-only.md.js
@@ -0,0 +1,19 @@
+import { ssrRenderAttrs } from "vue/server-renderer";
+import { useSSRContext } from "vue";
+import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js";
+const __pageData = JSON.parse('{"title":"How to Keep All Obsidian Notes in Reading View","description":"Make all Markdown notes in an Obsidian vault read-only using All Markdown files mode or an Include rule with **, while keeping editable exceptions.","frontmatter":{"title":"How to Keep All Obsidian Notes in Reading View","description":"Make all Markdown notes in an Obsidian vault read-only using All Markdown files mode or an Include rule with **, while keeping editable exceptions."},"headers":[],"relativePath":"guides/make-all-notes-read-only.md","filePath":"guides/make-all-notes-read-only.md"}');
+const _sfc_main = { name: "guides/make-all-notes-read-only.md" };
+function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
+ _push(`
To keep every Markdown note in your Obsidian vault in Reading view, enable Read Only View and select All Markdown files. You can also use an Include rule with ** when glob matching is enabled.
Both options help prevent accidental edits in Obsidian. They do not change filesystem permissions or protect attachments and changes made by other applications.
How do I make my entire Obsidian vault read-only?
Open Settings → Community plugins → Browse, search for Read Only View, then Install and Enable it.
Open Settings → Read Only View and keep Enabled on.
Select All Markdown files. This is the default for new installations.
Review existing Exclude rules: any enabled matching exclude leaves the note editable.
Open a Markdown note, or run Re-apply rules now to apply the configuration across open Markdown notes.
No include rules are required. Saved include rules remain available but inactive in this mode. Use glob patterns does not need to be enabled for the all-Markdown preset; it still controls how ordinary exclude rules match.
Can I match all notes with an Include rule and **?
Yes. The ** glob matches paths at every depth, including notes directly in the vault root.
Select Only matched paths and keep the global Enabled toggle on.
Under Advanced → Matching, turn on Use glob patterns.
Under Path rules, add an enabled Include with Value set to **.
Wait for Saved. and check a note with Path tester.
Tested path
Result with Include ** and no matching exclude
Home.md
Read-only
Reference/Handbook.md
Read-only
Archive/2025/Meeting.md
Read-only
Only Markdown notes are protected even though ** can match other path strings. With Use glob patterns off, ** is literal text and does not select all notes. A single * cannot cross folder separators.
Review existing rules when enabling globs
Glob matching is a shared setting for ordinary path rules. Change folder prefixes such as Reference/ to Reference/** when switching to glob mode. Exact imported note rules keep their exact-file behavior.
How do I keep some notes editable in a read-only vault?
Add enabled Exclude rules. Excludes take precedence in both approaches.
Matching mode
Exclude value
Editable exception
Glob matching off
Inbox/
Markdown notes in Inbox and its subfolders
Glob matching on
Inbox/**
Markdown notes in Inbox and its subfolders
Either mode
Reference/Working notes.md
The named note; ordinary paths remain prefixes when globs are off
For an exact-file exception regardless of matching mode, paste the existing note's Obsidian URL into an Exclude row. See supported path sources.
How do I make my vault read-only except for daily notes?
Use All Markdown files with an enabled Exclude for the folder where you keep daily notes. For example, protect reference material while keeping your journal and quick captures editable:
Open Settings → Read Only View, keep Enabled on, and select All Markdown files.
With Use glob patterns off, add these enabled Exclude rows under Path rules:
Type
Value
Exclude
Daily Notes/
Exclude
Inbox/
Replace the example folder names with the actual vault-relative paths you use. Read Only View matches paths; it does not detect daily notes by date or automatically read another plugin's folder setting.
Wait for Saved. and check representative notes with Path tester.
Tested path
Expected result with only the rules above
Daily Notes/2026-09-18.md
Editable
Daily Notes/2026/09/18.md
Editable
Inbox/Quick capture.md
Editable
Reference/Handbook.md
Read-only
Home.md
Read-only
New Markdown notes created under the excluded folders also match those folder rules. A daily note saved elsewhere does not get an exception just because it is a daily note.
If Use glob patterns is already on, use Daily Notes/** and Inbox/** instead. These excludes also work with Only matched paths and Include **. Review existing rules before changing the shared matching mode.
Can I temporarily allow editing without deleting my rules?
Run Disable read-only mode, switch into editing, then run Enable read-only mode when finished. This pauses protection globally and does not resume automatically.
If you use the ** include in Only matched paths, you can instead uncheck that row's Enabled checkbox and recheck it later. Other enabled includes may still protect some notes. Disabling an include does not pause All Markdown files mode. See temporarily disabling path rules.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/make-all-notes-read-only.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const makeAllNotesReadOnly = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ makeAllNotesReadOnly as default
+};
diff --git a/docs-site/.vitepress/.temp/guides_make-folder-read-only.md.js b/docs-site/.vitepress/.temp/guides_make-folder-read-only.md.js
new file mode 100644
index 0000000..fe6f182
--- /dev/null
+++ b/docs-site/.vitepress/.temp/guides_make-folder-read-only.md.js
@@ -0,0 +1,19 @@
+import { ssrRenderAttrs } from "vue/server-renderer";
+import { useSSRContext } from "vue";
+import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js";
+const __pageData = JSON.parse('{"title":"How to Make a Folder Read-Only in Obsidian","description":"Keep Markdown notes in a reference or archive folder in Reading view, with include rules for folders and exclude rules for one editable note or a drafts subfolder.","frontmatter":{"title":"How to Make a Folder Read-Only in Obsidian","description":"Keep Markdown notes in a reference or archive folder in Reading view, with include rules for folders and exclude rules for one editable note or a drafts subfolder."},"headers":[],"relativePath":"guides/make-folder-read-only.md","filePath":"guides/make-folder-read-only.md"}');
+const _sfc_main = { name: "guides/make-folder-read-only.md" };
+function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
+ _push(`
Add a folder path such as Reference/ as an Include rule in Read Only View. With ordinary path matching, Markdown notes inside that folder and its subfolders stay in Reading view.
Open Settings → Read Only View. Keep Enabled on and select Only matched paths.
Under Advanced → Matching, keep Use glob patterns off.
Under Path rules, add an enabled Include row with Value set to Reference/.
Wait for Saved. and open a Markdown note inside that folder.
Use a vault-relative path, not the vault's name. Keep the trailing / to make the folder intent clear. For an archive, use Archive/; for a nested folder, use Notes/Summaries/.
How do I make a folder read-only but leave one note editable?
Add an Exclude for that note alongside the folder's Include. With Only matched paths selected and Use glob patterns off, enable both rows:
Type
Value
Include
Reference/
Exclude
Reference/Working notes.md
Reference/Handbook.md and Reference/Policies/Security.md stay in Reading view, while Reference/Working notes.md remains editable. Excludes always win, even when an include also matches.
Ordinary file paths use prefix matching with glob matching off. To exempt exactly one existing note, paste its Obsidian URL into the exclude row instead. With glob matching on, use Reference/** for the folder include and Reference/Working notes.md for the note exclude.
Check both the exception and another note using Path tester. To protect the exception again without retyping its path, uncheck the exclude row's Enabled checkbox; recheck it when you want to edit that note again.
If almost the whole vault is for reading, select All Markdown files and add an Exclude rule for Inbox/. Include rules are saved but inactive in this mode.
If you enable glob matching, use Reference/** instead of the plain folder rule. See Path rules before changing the matching mode, because it applies to ordinary path rules throughout the configuration.
How do I make only the notes directly in a folder read-only, without subfolders?
Use the glob Reference/*.md in Only matched paths mode. A single * cannot cross /, so it selects Markdown notes directly inside Reference/ without selecting notes in nested folders.
Keep the global Enabled toggle on and select Only matched paths.
Under Advanced → Matching, turn on Use glob patterns.
Add an enabled Include with Value set to Reference/*.md.
Disable broader includes such as Reference/** or ** if you want the subfolders to remain editable.
Wait for Saved. and test both a direct note and a nested note with Path tester.
Note
With Include Reference/*.md
With Include Reference/**
Reference/Handbook.md
Read-only
Read-only
Reference/Policies/Security.md
Editable
Read-only
Inbox/Capture.md
Editable
Editable
This comparison assumes Only matched paths, glob matching on, and only the include shown in each column, with no excludes. In All Markdown files, nested Markdown notes remain protected unless excluded.
Glob matching applies to all ordinary path rules. Review existing folder rules when turning it on: a prefix such as Inbox/ needs to become Inbox/** to continue matching its contents. With glob matching off, Reference/*.md treats * literally and will not behave as this example describes.
The rule affects Markdown note views, not the directory's filesystem permissions. It does not protect PDFs, images, other attachments, or changes made by external tools. Review rules after moving or renaming notes and folders; imported paths do not automatically track renames.
Use Read Only View with an Include rule for the note's vault path. The plugin keeps matching Markdown notes in Reading view to help prevent accidental edits.
Obsidian already provides Reading view and lets you switch between reading and editing. Live Preview is still an editing mode. See Obsidian's guide to views and editing modes.
Read Only View adds automatic enforcement for selected paths: it returns matching notes to Reading view and blocks editor input in supported Markdown editors. The underlying file does not become read-only at the operating-system level.
Open Settings → Community plugins → Browse, find Read Only View, then Install and Enable it.
Open Settings → Read Only View and keep Enabled on.
Select Only matched paths. A new installation defaults to All Markdown files, which protects all Markdown notes instead.
Under Path rules, select Add rule. Keep the row enabled, select Include, and enter Reference/Travel checklist.md in Value.
Under Advanced → Matching, keep Use glob patterns off for this example. Keep the path's spelling and capitalization consistent with the vault.
Wait for Saved., then open the note.
Paste Reference/Travel checklist.md into Path tester. It should report Read-only unless an enabled exclude rule matches.
Ordinary paths use prefix matching. To target exactly one existing note, you can also paste its obsidian://open URL into the rule. See Path rules for the distinction.
Can I temporarily edit this note without deleting its rule?
Yes. In Only matched paths, uncheck Enabled on the note's Include row and wait for Saved. The path stays saved. Edit the note, then check the row again to restore protection. This works only if no other enabled include also protects the note.
If a folder rule or ** also matches, use a saved Exclude for the note: enable the exclude to allow editing, then disable it to restore protection. See how to pause individual rules.
Run Disable read-only mode from the Command Palette, then switch the note into editing. This disables enforcement across the vault. When finished, run Enable read-only mode.
For an exception limited to this note, add an Exclude rule instead. Excludes always take precedence. Remove or disable the exception to protect the note again.
Only Markdown notes are affected. Other applications and plugins can still modify files, and imported note rules do not follow later renames automatically. Some preview and embedded contexts depend on Obsidian's internal view behavior; this is accidental-edit prevention, not an access-control mechanism.
Read Only View supports Obsidian on phones and tablets as well as desktop. Use it for notes you mainly consume: reference material, checklists, summaries, or an archive.
An accidental switch into editing can open the keyboard and interrupt reading. The plugin returns matching Markdown notes to Reading view and blocks editor input in supported editors. It does not promise to suppress every keyboard appearance or control every plugin-provided view.
In Obsidian, open Settings → Community plugins → Browse. Search for Read Only View, then Install and Enable it.
Open Settings → Read Only View. Keep Enabled on and select Only matched paths.
Under Path rules, add an enabled Include rule for Reference/.
Keep Use glob patterns off under Advanced → Matching.
Wait for Saved., then open a note in that folder.
Use Path tester with a specific note such as Reference/Travel checklist.md to check the result. On narrow screens, settings controls and rule rows use a stacked layout.
For an entire vault used mainly for reading, keep All Markdown files selected and add Exclude rules for notes you need to edit.
Vault-relative paths work on desktop and mobile. Obsidian URLs must resolve to an existing Markdown note in the current vault.
Importing a new absolute system path is desktop-only. Once imported, the rule stores its resolved vault-relative path, so that saved rule remains portable to mobile. You can enter the vault-relative path directly on your phone; no system path is needed.
Run Disable read-only mode, switch to editing, and make your change. Then run Enable read-only mode. The disable command pauses enforcement for all notes, not just the current one.
For a permanent writing area, add an Exclude rule such as Reference/Drafts/. See folder rules.
Only Markdown notes are affected. The plugin does not change file permissions or prevent external applications from editing notes. Rule matching stays local, and the plugin makes no network requests. Installation and updates are separate from normal plugin operation.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/mobile-reading-view.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const mobileReadingView = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ mobileReadingView as default
+};
diff --git a/docs-site/.vitepress/.temp/guides_prevent-accidental-editing.md.js b/docs-site/.vitepress/.temp/guides_prevent-accidental-editing.md.js
new file mode 100644
index 0000000..46387d3
--- /dev/null
+++ b/docs-site/.vitepress/.temp/guides_prevent-accidental-editing.md.js
@@ -0,0 +1,19 @@
+import { ssrRenderAttrs } from "vue/server-renderer";
+import { useSSRContext } from "vue";
+import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js";
+const __pageData = JSON.parse('{"title":"How to Prevent Accidental Editing in Obsidian","description":"Keep reference notes in Reading view while leaving working notes editable, and deliberately pause Read Only View when you need to make changes.","frontmatter":{"title":"How to Prevent Accidental Editing in Obsidian","description":"Keep reference notes in Reading view while leaving working notes editable, and deliberately pause Read Only View when you need to make changes."},"headers":[],"relativePath":"guides/prevent-accidental-editing.md","filePath":"guides/prevent-accidental-editing.md"}');
+const _sfc_main = { name: "guides/prevent-accidental-editing.md" };
+function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
+ _push(`
If you mostly read reference notes, configure Read Only View to keep those notes in Reading view. It helps when an unintended tap, click, or view switch takes you into editing while you are trying to read.
Keep Use glob patterns off under Advanced → Matching.
Add enabled Include rules for Reference/ and Archive/.
If needed, add an Exclude rule for Reference/Drafts/.
Wait for Saved. and check a representative note with Path tester.
Notes outside those includes remain editable unless another rule matches them. If you mainly read the entire vault, use All Markdown files with exclusions for working folders instead.
Use Disable read-only mode in the Command Palette before editing protected material. This pauses protection globally; it does not automatically resume. Run Enable read-only mode when you finish. Re-apply rules now enforces the current configuration across open Markdown notes.
For a continuing exception, use an exclude rule instead of repeatedly pausing protection.
An unwanted switch into editing can interrupt reading and bring up the keyboard on a touch device. Keeping matching notes in Reading view helps reduce these interruptions. See the mobile guide for configuration details.
The plugin also blocks editor input in supported CodeMirror-backed Markdown contexts, including some preview contexts. Coverage of every hover or embedded view is not guaranteed because it depends on Obsidian's internal behavior.
Read Only View does not enforce security permissions, make files immutable, or stop another plugin or application from changing them. Its purpose is to reduce accidental edits during normal reading in Obsidian. It does not replace backups or file-access controls.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("guides/prevent-accidental-editing.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const preventAccidentalEditing = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ preventAccidentalEditing as default
+};
diff --git a/docs-site/.vitepress/.temp/index.md.js b/docs-site/.vitepress/.temp/index.md.js
new file mode 100644
index 0000000..4562226
--- /dev/null
+++ b/docs-site/.vitepress/.temp/index.md.js
@@ -0,0 +1,20 @@
+import { ssrRenderAttrs, ssrRenderAttr } from "vue/server-renderer";
+import { useSSRContext } from "vue";
+import { _ as _export_sfc } from "./plugin-vue_export-helper.1tPrXgE0.js";
+const _imports_0 = "/Read-Only-View/assets/Read-Only-View-matched-paths-mode-1200x800.ALYpEN-F.png";
+const __pageData = JSON.parse('{"title":"Read Only View for Obsidian","description":"Keep selected notes and folders in Obsidian Reading view. Prevent accidental edits on desktop, phone, and tablet with local path rules.","frontmatter":{"layout":"home","title":"Read Only View for Obsidian","description":"Keep selected notes and folders in Obsidian Reading view. Prevent accidental edits on desktop, phone, and tablet with local path rules.","hero":{"name":"Read Only View","text":"Keep selected Obsidian notes in Reading view and prevent accidental edits.","tagline":"Read reference notes comfortably on desktop, phone, and tablet. Choose individual notes, whole folders, or every Markdown note in your vault.","actions":[{"theme":"brand","text":"Install from Community Plugins","link":"https://community.obsidian.md/plugins/read-only-view"},{"theme":"alt","text":"Read the guides","link":"/guides/make-note-read-only"},{"theme":"alt","text":"GitHub","link":"https://github.com/mrKazzila/Read-Only-View"}]},"features":[{"title":"Choose what stays in Reading view","details":"Include notes or folders with Path rules. Exclude drafts and working notes so they remain editable."},{"title":"Check a rule before relying on it","details":"The built-in Path tester shows the resolved path, matching rules, and whether a note is Read-only or Editable.","link":"/docs/path-tester"},{"title":"Read on mobile and tablet","details":"Keep reference notes in Reading view while browsing. Matching runs locally, with no network requests from the plugin.","link":"/guides/mobile-reading-view"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}');
+const _sfc_main = { name: "index.md" };
+function _sfc_ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
+ _push(`
In Obsidian, open Settings → Community plugins → Browse, search for Read Only View, then select Install and Enable. Requires Obsidian 1.10.3 or newer; supports desktop and mobile.
Choose your scope
New installations use All Markdown files mode. To protect selected notes or folders, open Settings → Read Only View, select Only matched paths, and add an Include rule under Path rules.
Read Only View returns matching Markdown notes to Reading view and blocks editor input in supported Markdown editors. It changes Obsidian view behavior; it does not change filesystem permissions, rewrite your Markdown files, or prevent other applications from editing them. See the FAQ for limitations and temporary editing.
`);
+}
+const _sfc_setup = _sfc_main.setup;
+_sfc_main.setup = (props, ctx) => {
+ const ssrContext = useSSRContext();
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("index.md");
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
+};
+const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
+export {
+ __pageData,
+ index as default
+};
diff --git a/docs-site/.vitepress/.temp/package.json b/docs-site/.vitepress/.temp/package.json
new file mode 100644
index 0000000..25d9dcf
--- /dev/null
+++ b/docs-site/.vitepress/.temp/package.json
@@ -0,0 +1 @@
+{ "private": true, "type": "module" }
\ No newline at end of file
diff --git a/docs-site/.vitepress/.temp/plugin-vue_export-helper.1tPrXgE0.js b/docs-site/.vitepress/.temp/plugin-vue_export-helper.1tPrXgE0.js
new file mode 100644
index 0000000..84d1cb5
--- /dev/null
+++ b/docs-site/.vitepress/.temp/plugin-vue_export-helper.1tPrXgE0.js
@@ -0,0 +1,10 @@
+const _export_sfc = (sfc, props) => {
+ const target = sfc.__vccOpts || sfc;
+ for (const [key, val] of props) {
+ target[key] = val;
+ }
+ return target;
+};
+export {
+ _export_sfc as _
+};
diff --git a/docs-site/.vitepress/.temp/robots.txt b/docs-site/.vitepress/.temp/robots.txt
new file mode 100644
index 0000000..04da39e
--- /dev/null
+++ b/docs-site/.vitepress/.temp/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /Read-Only-View/
+
+Sitemap: https://mrkazzila.github.io/Read-Only-View/sitemap.xml
diff --git a/docs-site/.vitepress/config.ts b/docs-site/.vitepress/config.ts
new file mode 100644
index 0000000..76a742c
--- /dev/null
+++ b/docs-site/.vitepress/config.ts
@@ -0,0 +1,64 @@
+import { defineConfig } from 'vitepress';
+
+const siteUrl = 'https://mrkazzila.github.io/Read-Only-View/';
+const description = 'Keep selected Obsidian notes in Reading view and prevent accidental edits with local include and exclude path rules.';
+const guides = [
+ { text: 'Keep all notes in Reading view', link: '/guides/make-all-notes-read-only' },
+ { text: 'Make a note read-only', link: '/guides/make-note-read-only' },
+ { text: 'Make a folder read-only', link: '/guides/make-folder-read-only' },
+ { text: 'Prevent accidental editing', link: '/guides/prevent-accidental-editing' },
+ { text: 'Reading view on mobile', link: '/guides/mobile-reading-view' },
+];
+
+export default defineConfig({
+ title: 'Read Only View',
+ description,
+ lang: 'en-US',
+ base: '/Read-Only-View/',
+ cleanUrls: true,
+ sitemap: { hostname: siteUrl },
+ themeConfig: {
+ nav: [
+ { text: 'Guides', link: '/guides/make-note-read-only' },
+ { text: 'Path rules', link: '/docs/path-rules' },
+ { text: 'FAQ', link: '/faq' },
+ ],
+ sidebar: [
+ { text: 'Guides', items: guides },
+ { text: 'Documentation', items: [
+ { text: 'Path rules', link: '/docs/path-rules' },
+ { text: 'Path tester', link: '/docs/path-tester' },
+ { text: 'Troubleshooting', link: '/docs/troubleshooting' },
+ { text: 'FAQ', link: '/faq' },
+ ] },
+ ],
+ socialLinks: [{ icon: 'github', link: 'https://github.com/mrKazzila/Read-Only-View' }],
+ footer: { message: 'Released under the 0BSD license.' },
+ },
+ transformHead({ pageData }) {
+ if (pageData.relativePath === '404.md') return [['meta', { name: 'robots', content: 'noindex' }]];
+ const path = pageData.relativePath.replace(/index\.md$/, '').replace(/\.md$/, '');
+ const url = new URL(path, siteUrl).href;
+ return [
+ ['link', { rel: 'canonical', href: url }],
+ ['meta', { property: 'og:type', content: 'website' }],
+ ['meta', { property: 'og:site_name', content: 'Read Only View' }],
+ ['meta', { property: 'og:title', content: pageData.title }],
+ ['meta', { property: 'og:description', content: pageData.description || description }],
+ ['meta', { property: 'og:url', content: url }],
+ ...(pageData.relativePath === 'index.md' ? [[
+ 'script', { type: 'application/ld+json' }, JSON.stringify({
+ '@context': 'https://schema.org',
+ '@type': 'SoftwareApplication',
+ name: 'Read Only View',
+ applicationCategory: 'ProductivityApplication',
+ description,
+ url: siteUrl,
+ downloadUrl: 'https://community.obsidian.md/plugins/read-only-view',
+ softwareRequirements: 'Obsidian 1.10.3 or newer',
+ license: 'https://github.com/mrKazzila/Read-Only-View/blob/master/LICENSE',
+ }),
+ ] as [string, Record, string]] : []),
+ ];
+ },
+});
diff --git a/docs-site/.vitepress/theme/index.ts b/docs-site/.vitepress/theme/index.ts
new file mode 100644
index 0000000..d050e52
--- /dev/null
+++ b/docs-site/.vitepress/theme/index.ts
@@ -0,0 +1,4 @@
+import DefaultTheme from 'vitepress/theme';
+import './style.css';
+
+export default DefaultTheme;
diff --git a/docs-site/.vitepress/theme/style.css b/docs-site/.vitepress/theme/style.css
new file mode 100644
index 0000000..8539bb9
--- /dev/null
+++ b/docs-site/.vitepress/theme/style.css
@@ -0,0 +1,15 @@
+:root {
+ --vp-c-brand-1: #7054bd;
+ --vp-c-brand-2: #8065ca;
+ --vp-c-brand-3: #7054bd;
+}
+
+.dark {
+ --vp-c-brand-1: #b7a0f3;
+ --vp-c-brand-2: #a68ce7;
+ --vp-c-brand-3: #7054bd;
+}
+
+.vp-doc img {
+ border-radius: 8px;
+}
diff --git a/docs-site/docs/path-rules.md b/docs-site/docs/path-rules.md
new file mode 100644
index 0000000..f23a755
--- /dev/null
+++ b/docs-site/docs/path-rules.md
@@ -0,0 +1,114 @@
+---
+title: Path Rules for Read Only View
+description: Learn how Include and Exclude rules, folder prefixes, exact imported notes, glob patterns, and matching precedence work in Read Only View.
+---
+# Path rules
+
+**Path rules** select which Markdown notes stay in Reading view. Open **Settings → Read Only View** to add, disable, or remove a rule.
+
+## Modes and precedence
+
+With **Enabled** on, the plugin evaluates a Markdown note in this order:
+
+1. An enabled **Exclude** match leaves it editable.
+2. Otherwise, **All Markdown files** protects it.
+3. Otherwise, **Only matched paths** requires an enabled **Include** match to protect it.
+
+New installations start in **All Markdown files** mode. Include rules are retained but inactive in that mode. In **Only matched paths**, an empty rule list protects nothing. Changing or deleting rules does not switch modes.
+
+Each row has an **Enabled** checkbox, an **Include** or **Exclude** type, a **Value** field, and a Delete button. Disable a row to keep it for later without applying it. Disabled and unresolved rules do not participate in matching or active-rule counts.
+
+
+
+## Ordinary vault paths
+
+By default, **Use glob patterns** is off and **Case sensitive** is on. Ordinary rules use literal path-prefix matching.
+
+| Value | Use |
+| --- | --- |
+| `Reference/` | Notes in Reference and all its subfolders |
+| `Archive/` | Notes in Archive and all its subfolders |
+| `Notes/Summaries/` | Notes under this nested folder |
+| `Reference/Handbook.md` | A prefix beginning with this note path |
+
+Keep the trailing `/` for folder rules. In prefix mode, a plain name without `.md` or wildcards is treated as a folder prefix after source resolution. When entering an existing vault path without an extension, the source resolver first checks for a matching Markdown note; an existing folder is normalized with a trailing slash. Use `/` explicitly if a note and folder share a name and you intend to select the folder.
+
+A `.md` vault path remains a prefix rule, not an exact equality check. To target exactly one existing note regardless of prefix or glob mode, import its Obsidian URL or desktop system file path.
+
+### Editable exceptions
+
+With **Only matched paths**, these rules protect reference notes but allow drafts:
+
+| Type | Value |
+| --- | --- |
+| Include | `Reference/` |
+| Exclude | `Reference/Drafts/` |
+
+With **All Markdown files**, an **Exclude** for `Inbox/` leaves that folder editable and protects other Markdown notes. An include rule cannot override an exclude.
+
+## Can I use wildcards in Obsidian read-only path rules? {#glob-patterns}
+
+Yes. Turn on **Advanced → Matching → Use glob patterns** to enable the plugin's glob matcher for ordinary paths. Patterns match the entire vault-relative path.
+
+| Pattern | Meaning |
+| --- | --- |
+| `**` | All paths, including vault-root notes; protection still applies only to Markdown |
+| `Reference/*.md` | Markdown notes directly inside Reference |
+| `Reference/**` | Notes anywhere under Reference |
+| `Reference/**/Summary.md` | Summary.md directly inside Reference or deeper below it |
+| `Notes/Summary?.md` | One non-slash character after Summary, such as Summary1.md |
+
+`*` matches zero or more characters except `/`; `**` can cross folder separators; `?` matches one character except `/`. The `/**/` form can cover zero or more nested folders. A leading `**/README.md` requires a slash, so use `README.md` separately if you also want the vault-root note.
+
+There is no regular-expression, brace-alternative, or character-class syntax. With glob matching off, `*` and `?` are literal characters. Switching matching modes affects ordinary saved path rules, so replace a prefix such as `Reference/` with `Reference/**` when enabling globs.
+
+To protect the whole vault using `**`, follow [Keep all Obsidian notes in Reading view](../guides/make-all-notes-read-only.md).
+
+## Can I make note-path matching case-sensitive? {#case-sensitivity}
+
+Yes. Open **Settings → Read Only View → Advanced → Matching** and turn **Case sensitive** on. It is enabled by default. Turn it off to ignore uppercase/lowercase differences when matching paths. This is a shared setting for include and exclude rules, not a per-rule option.
+
+With **Only matched paths**, glob matching off, and an enabled Include `Reference/`:
+
+| Note path | Case sensitive on | Case sensitive off |
+| --- | --- | --- |
+| `Reference/Handbook.md` | Read-only | Read-only |
+| `reference/Handbook.md` | Editable | Read-only |
+
+This example assumes no other rules match. The setting applies to prefix and glob matching, as well as comparisons against resolved exact-file rules. It does not rename files or make an invalid Obsidian URL or system path resolve: imported sources must still identify an existing item in the current vault. Verify the actual note path with [Path tester](./path-tester.md).
+
+## Can I temporarily disable a path rule without deleting it? {#temporarily-disable-rules}
+
+Yes. Uncheck **Enabled** on the rule's row under **Path rules**. The plugin keeps its value and type, so you can re-enable it later without entering the path again.
+
+To edit a note protected by its own include rule:
+
+1. In **Only matched paths**, find the note's **Include** row.
+2. Uncheck that row's **Enabled** checkbox, leaving the global **Enabled** toggle on.
+3. Wait for **Saved.** and test the note. If it is **Editable**, switch it into editing and make your changes.
+4. Check the row's **Enabled** checkbox again and wait for **Saved.** to restore that rule.
+
+If another include, such as `Reference/` or `**`, also matches, disabling only the note rule will not make the note editable. Add an **Exclude** for the note instead. Keep that exclude row saved: enable it when editing and disable it when you want protection back. Disabling a folder include affects every note it was protecting.
+
+In **All Markdown files**, include rows are already inactive. Use an exclude for a particular note, or use **Disable read-only mode** and **Enable read-only mode** to pause and restore protection globally. Neither approach needs you to delete saved paths, and protection does not resume on a timer.
+
+## Can I use an Obsidian URL, system path, or vault path in a rule? {#import-a-note-or-folder}
+
+Yes. Add an enabled **Include** under **Path rules** in **Only matched paths**, then paste any of the following sources into **Value**. The field detects the source format. The same source formats also work for **Exclude** rules:
+
+| Source | Example | Behavior |
+| --- | --- | --- |
+| Vault path | `Reference/Handbook.md` | Uses the configured prefix or glob matching |
+| Obsidian URL | `obsidian://open?vault=MyVault&file=Reference%2FHandbook` | Resolves one exact existing Markdown note in the current vault |
+| Desktop system path | `/Users/name/MyVault/Reference/Handbook.md` | Imports one exact existing Markdown note inside the current vault |
+| Desktop system folder | `/Users/name/MyVault/Reference/` | Imports a folder using ordinary folder matching |
+
+Obsidian URLs may omit `.md`. Heading and block locators do not change which note is selected. A URL must name the current vault. Absolute system-path imports are available only on desktop, but the saved vault-relative path remains portable to mobile. The full system path is not persisted after successful import.
+
+If a source cannot be resolved, its value remains visible with an explanation, but it does not match anything. Imported sources require existing targets and do not automatically follow later renames.
+
+## Verify the result
+
+Wait for **Saved.**, then paste a specific Markdown note path into [Path tester](./path-tester.md). If the result is unexpected, check the selected mode, exclude matches, enabled rows, case sensitivity, and matching mode.
+
+For very large configurations, settings show warnings and ignore rules beyond the limits: at most 200 includes, 300 excludes, and 400 total. Include rules are counted first; exclude rules at the end are trimmed if the total exceeds 400. Prefer a few folder rules where possible and review any limit warnings.
diff --git a/docs-site/docs/path-tester.md b/docs-site/docs/path-tester.md
new file mode 100644
index 0000000..103fef4
--- /dev/null
+++ b/docs-site/docs/path-tester.md
@@ -0,0 +1,43 @@
+---
+title: How to Check Whether an Obsidian Note Will Be Read-Only
+description: Diagnose whether an Obsidian note is Read-only or Editable using source resolution, matching Include and Exclude rules, and the all-Markdown preset.
+---
+# How to Check Whether an Obsidian Note Will Be Read-Only
+
+**Path tester** is built into **Settings → Read Only View**. Use it to understand why a specific note is protected or remains editable; this website does not run the tester or access your vault.
+
+## Can I test a note path before opening the note? {#test-a-note}
+
+Yes. **Path tester** evaluates the current configuration for the supplied path without requiring you to open the note. Obsidian URLs and system paths must resolve to existing items; enter a specific Markdown note to get a read-only result.
+
+1. Configure your [Path rules](./path-rules.md) and wait for **Saved.**
+2. Find **Path tester** in the plugin settings.
+3. Paste a vault-relative note path such as `Reference/Handbook.md`, an Obsidian URL, or a desktop system path.
+4. Review the detected source type and resolved vault path.
+5. Check the matching include and exclude rules, the all-Markdown preset explanation, and the final **Read-only** or **Editable** status.
+
+
+
+## Interpret a result
+
+With **Enabled** on, **Only matched paths** selected, glob matching off, an **Include** for `Reference/`, and an **Exclude** for `Reference/Drafts/`:
+
+| Tested path | Expected result | Reason |
+| --- | --- | --- |
+| `Reference/Handbook.md` | Read-only | Include matches; no exclude matches |
+| `Reference/Drafts/Handbook.md` | Editable | Exclude wins |
+| `Inbox/Capture.md` | Editable | No include matches |
+
+In **All Markdown files**, a note can be read-only without any include matches. The preset determines the result unless an exclude matches. Turning **Enabled** off disables protection.
+
+## Resolve input problems
+
+- **Wrong vault or missing note:** an Obsidian URL must resolve to an existing Markdown note in the current vault.
+- **System path on mobile:** import new absolute paths on desktop, or enter the portable vault-relative path instead.
+- **Folder instead of a note:** for a system folder, the tester shows the resolved folder and asks for a specific Markdown note before evaluating matches.
+- **Unexpected Editable status:** check excludes, the row's Enabled checkbox, letter case, and whether glob matching is on.
+- **Unexpected Read-only status:** check whether **All Markdown files** is selected.
+
+The result explains the current configuration; it is not a filesystem-permission check or a guarantee for every embedded view. If open notes do not reflect saved changes, run **Re-apply rules now** from the Command Palette and reopen the note if necessary.
+
+For a step-by-step diagnosis of unexpected results, see [Troubleshooting read-only notes](./troubleshooting.md).
diff --git a/docs-site/docs/troubleshooting.md b/docs-site/docs/troubleshooting.md
new file mode 100644
index 0000000..c7ddae2
--- /dev/null
+++ b/docs-site/docs/troubleshooting.md
@@ -0,0 +1,46 @@
+---
+title: Why Is My Obsidian Note Read-Only or Still Editable?
+description: Troubleshoot Read Only View rules when a note stays editable, remains read-only after disabling an Include, or does not reflect saved settings.
+---
+# Why Is My Obsidian Note Read-Only or Still Editable?
+
+Start with **Path tester** in **Settings → Read Only View**. Enter the specific Markdown note path and check its resolved path, matching rules, and final **Read-only** or **Editable** status. This separates a rule-configuration problem from a view that has not reflected the configuration yet.
+
+## Why is my note still editable after I added an Include? {#still-editable}
+
+An include protects a Markdown note only while the plugin is enabled and no enabled exclude matches. Check these points in order:
+
+1. Confirm the global **Enabled** toggle is on and the file is a Markdown note.
+2. Look for an **Exclude** match in Path tester. Excludes always win; adding another include cannot override one.
+3. In **Only matched paths**, confirm the Include row is enabled and its source resolves without an inline error.
+4. Check **Advanced → Matching**. Use `Reference/` for a folder with glob matching off, or `Reference/**` with glob matching on. With globs off, `*` and `?` are literal characters.
+5. Check spelling and capitalization. **Case sensitive** is on by default. Imported URLs and system paths must still resolve to existing items in the current vault.
+6. If the note was moved or renamed, update the saved path. Imported rules do not automatically follow renames.
+
+For example, Include `Reference/` and Exclude `Reference/Drafts/` leave `Reference/Drafts/Plan.md` editable. Disable or narrow that exclude if you want the note protected.
+
+If settings show a rule-limit warning, review which rules were ignored. See [Path rules](./path-rules.md#verify-the-result) for the limits.
+
+## Why is my note read-only when I want to edit it? {#unexpectedly-read-only}
+
+Check **Mode** first. New installations use **All Markdown files**, which protects Markdown notes even without include rules. Choose **Only matched paths** for selected-path protection, or add an enabled exclude for an exception.
+
+In **Only matched paths**, check every matching include in Path tester. A broad include such as `Reference/` in prefix mode, or `**` in glob mode, may protect the note alongside its individual rule.
+
+For example, a vault in **All Markdown files** mode needs an Exclude for `Daily Notes/` to leave that folder editable with glob matching off. With glob matching on, use `Daily Notes/**`. See the [daily notes example](../guides/make-all-notes-read-only.md#except-daily-notes).
+
+## Why does disabling an Include not let me edit the note? {#disabled-include}
+
+Either **All Markdown files** is active or another enabled include still matches. Disabling one rule does not override those other sources of protection.
+
+For a temporary exception, keep an **Exclude** row for the note: enable the exclude while editing, then disable it to restore protection. Its path stays saved. To pause enforcement for every note, run **Disable read-only mode** and later **Enable read-only mode**. See [temporarily disabling rules](./path-rules.md#temporarily-disable-rules).
+
+## Why does Path tester disagree with the open note? {#view-not-updated}
+
+Confirm you tested the actual note path and waited for **Saved.** after editing rules. If settings report **Save failed.**, the changes have not saved successfully.
+
+Run **Re-apply rules now** from the Command Palette, then reopen the note if necessary. An **Editable** result means Read Only View is not enforcing protection; you may still need to switch the note from Reading view to editing yourself.
+
+If Path tester reports **Read-only** but editing remains possible in a hover, embedded, or nonstandard view, that context may depend on Obsidian internals. Protection is not guaranteed in every such view, and it does not prevent another plugin or application from modifying files.
+
+If the problem continues, [report an issue](https://github.com/mrKazzila/Read-Only-View/issues) with your Obsidian and plugin versions, platform, mode, matching settings, and a minimal rule example. Use anonymized paths and describe whether it occurs in a normal note tab or a preview. See [Path tester](./path-tester.md) for the available diagnostics.
diff --git a/docs-site/faq.md b/docs-site/faq.md
new file mode 100644
index 0000000..dd9e19d
--- /dev/null
+++ b/docs-site/faq.md
@@ -0,0 +1,93 @@
+---
+title: Read Only View FAQ
+description: Answers about read-only Obsidian notes and folders, temporary editing, mobile support, Markdown files, local matching, and file-permission limitations.
+---
+# Frequently asked questions
+
+## Can I make an Obsidian note read-only?
+
+You can keep it in Reading view with Read Only View. Choose **Only matched paths** and add an enabled **Include** for the note. The plugin enforces view behavior and blocks input in supported Markdown editors; it does not make the underlying file immutable. Follow the [single-note guide](./guides/make-note-read-only.md).
+
+## Can I make an entire folder read-only?
+
+Yes, for Markdown note views. With glob matching off, include a folder such as `Reference/` to cover its notes and subfolders. Add **Exclude** rules for editable exceptions. Attachments are unaffected. See the [folder guide](./guides/make-folder-read-only.md).
+
+## Does Read Only View change filesystem permissions?
+
+No. It changes Obsidian view behavior only. It is not an operating-system lock, security boundary, or access-control system.
+
+## Can another application still edit the Markdown file?
+
+Yes. Other applications, external tools, and plugins can still change files. Read Only View is intended to prevent accidental editing while reading in Obsidian.
+
+## Can I temporarily edit a matched note?
+
+Yes. Run **Disable read-only mode** in the Command Palette, switch to editing, then run **Enable read-only mode** when finished. This pauses protection globally and does not resume automatically.
+
+To exempt only a particular note or folder, add an enabled **Exclude** rule and remove or disable it later. In **Only matched paths**, disabling an include row also stops that rule from protecting notes, provided no other include matches. In **All Markdown files**, disabling an include has no effect.
+
+## Does it work on mobile?
+
+Yes. The plugin supports desktop and mobile and requires Obsidian **1.10.3 or newer**. Narrow settings panes use a stacked layout. New absolute system paths can only be imported on desktop; their saved vault-relative paths remain portable to mobile. See the [mobile guide](./guides/mobile-reading-view.md).
+
+## Are network requests required?
+
+The plugin makes no network requests during normal operation. Rule matching stays local. Downloading the plugin or its updates is separate from that operation.
+
+## Does it modify my Markdown files?
+
+The plugin does not rewrite Markdown content to enforce read-only behavior. It controls note views and editor input and saves its own configuration as plugin data. It does not add frontmatter or permission markers to notes.
+
+## Why are all my notes in Reading view?
+
+New installations default to **All Markdown files** mode with **Enabled** on. Switch to **Only matched paths** to protect only selected paths, or add excludes for working notes and folders.
+
+## Why does a matching note remain editable?
+
+Check that **Enabled** is on, the note is Markdown, and an enabled exclude does not match. In **Only matched paths**, an enabled include must match. Check case sensitivity and glob settings with [Path tester](./docs/path-tester.md).
+
+Some hover, embedded, or nonstandard editor contexts depend on Obsidian internals. Protection is not guaranteed in every such context.
+
+## Will a rule follow a renamed note?
+
+Imported rules do not automatically follow later renames. Review the saved path after moving or renaming a note or folder and verify the new note path in **Path tester**.
+
+## How do I switch all Obsidian notes to Reading view?
+
+Select **All Markdown files** with **Enabled** on. Alternatively, select **Only matched paths**, enable **Use glob patterns**, and add an enabled Include `**`. Enabled excludes still win. Follow the [whole-vault guide](./guides/make-all-notes-read-only.md).
+
+## Can I protect a folder but keep one note editable?
+
+Yes. With glob matching off, include `Reference/` and exclude `Reference/Working notes.md`. For an exact-file exception in either matching mode, use the note's Obsidian URL. See the [folder and single-note exception example](./guides/make-folder-read-only.md#leave-one-note-editable).
+
+## Can I use an Obsidian URL or system path instead of a vault path?
+
+Yes. The rule's **Value** field accepts all three. URLs must resolve to an existing Markdown note in the current vault; system-path imports are desktop-only and must point inside that vault. Successful system-path imports save portable vault-relative paths. See [source formats and examples](./docs/path-rules.md#import-a-note-or-folder).
+
+## Can I disable a rule temporarily without retyping the path later?
+
+Yes. Uncheck the rule row's **Enabled** checkbox, then recheck it when needed. Its path and type stay saved. Other includes or **All Markdown files** may still protect the note; a saved exclude can provide a temporary exception in either mode. See [temporarily disabling rules](./docs/path-rules.md#temporarily-disable-rules).
+
+## Can I check whether a note will be read-only by entering its path?
+
+Yes. Paste a specific note path into **Path tester** in the plugin settings. It shows source resolution, matching rules, and the final **Read-only** or **Editable** status. See [how to test a note path](./docs/path-tester.md#test-a-note).
+
+## Can I use wildcards such as *, **, and ? in path rules?
+
+Yes, after enabling **Advanced → Matching → Use glob patterns**. Use `*` within one path segment, `**` across folders, and `?` for one non-slash character. With glob matching off, these characters are literal. See [wildcard examples](./docs/path-rules.md#glob-patterns).
+
+## Can I turn case-sensitive path matching on or off?
+
+Yes. Use **Advanced → Matching → Case sensitive**. It is on by default; turn it off to ignore case when matching include and exclude paths. See [case-sensitive matching examples](./docs/path-rules.md#case-sensitivity).
+
+## Can I keep daily notes editable while protecting the rest of my vault?
+
+Yes. In **All Markdown files**, exclude your daily-notes folder: `Daily Notes/` with glob matching off, or `Daily Notes/**` with it on. Use your actual folder path; the plugin does not identify daily notes automatically. See the [daily notes and Inbox example](./guides/make-all-notes-read-only.md#except-daily-notes).
+
+## Can I protect notes in a folder without protecting its subfolders?
+
+Yes. Select **Only matched paths**, enable **Use glob patterns**, and include `Reference/*.md`. Remove or disable broader includes if they also protect the subfolders. See the [direct notes versus subfolders example](./guides/make-folder-read-only.md#without-subfolders).
+
+## How do I troubleshoot a note that is protected or editable unexpectedly?
+
+Start with **Path tester**, then check the global Enabled toggle, selected mode, matching excludes, and enabled includes. Follow [Troubleshooting](./docs/troubleshooting.md) for each result, including what to do when disabling an include does not remove protection.
diff --git a/docs-site/guides/make-all-notes-read-only.md b/docs-site/guides/make-all-notes-read-only.md
new file mode 100644
index 0000000..379fc56
--- /dev/null
+++ b/docs-site/guides/make-all-notes-read-only.md
@@ -0,0 +1,85 @@
+---
+title: How to Keep All Obsidian Notes in Reading View
+description: Make all Markdown notes in an Obsidian vault read-only using All Markdown files mode or an Include rule with **, while keeping editable exceptions.
+---
+# How to Keep All Obsidian Notes in Reading View
+
+To keep every Markdown note in your Obsidian vault in Reading view, enable Read Only View and select **All Markdown files**. You can also use an **Include** rule with `**` when glob matching is enabled.
+
+Both options help prevent accidental edits in Obsidian. They do not change filesystem permissions or protect attachments and changes made by other applications.
+
+## How do I make my entire Obsidian vault read-only?
+
+1. Open **Settings → Community plugins → Browse**, search for **Read Only View**, then **Install** and **Enable** it.
+2. Open **Settings → Read Only View** and keep **Enabled** on.
+3. Select **All Markdown files**. This is the default for new installations.
+4. Review existing **Exclude** rules: any enabled matching exclude leaves the note editable.
+5. Open a Markdown note, or run **Re-apply rules now** to apply the configuration across open Markdown notes.
+
+No include rules are required. Saved include rules remain available but inactive in this mode. **Use glob patterns** does not need to be enabled for the all-Markdown preset; it still controls how ordinary exclude rules match.
+
+## Can I match all notes with an Include rule and **?
+
+Yes. The `**` glob matches paths at every depth, including notes directly in the vault root.
+
+1. Select **Only matched paths** and keep the global **Enabled** toggle on.
+2. Under **Advanced → Matching**, turn on **Use glob patterns**.
+3. Under **Path rules**, add an enabled **Include** with **Value** set to `**`.
+4. Wait for **Saved.** and check a note with [Path tester](../docs/path-tester.md).
+
+| Tested path | Result with Include `**` and no matching exclude |
+| --- | --- |
+| `Home.md` | Read-only |
+| `Reference/Handbook.md` | Read-only |
+| `Archive/2025/Meeting.md` | Read-only |
+
+Only Markdown notes are protected even though `**` can match other path strings. With **Use glob patterns** off, `**` is literal text and does not select all notes. A single `*` cannot cross folder separators.
+
+::: tip Review existing rules when enabling globs
+Glob matching is a shared setting for ordinary path rules. Change folder prefixes such as `Reference/` to `Reference/**` when switching to glob mode. Exact imported note rules keep their exact-file behavior.
+:::
+
+## How do I keep some notes editable in a read-only vault?
+
+Add enabled **Exclude** rules. Excludes take precedence in both approaches.
+
+| Matching mode | Exclude value | Editable exception |
+| --- | --- | --- |
+| Glob matching off | `Inbox/` | Markdown notes in Inbox and its subfolders |
+| Glob matching on | `Inbox/**` | Markdown notes in Inbox and its subfolders |
+| Either mode | `Reference/Working notes.md` | The named note; ordinary paths remain prefixes when globs are off |
+
+For an exact-file exception regardless of matching mode, paste the existing note's Obsidian URL into an **Exclude** row. See [supported path sources](../docs/path-rules.md#import-a-note-or-folder).
+
+## How do I make my vault read-only except for daily notes? {#except-daily-notes}
+
+Use **All Markdown files** with an enabled **Exclude** for the folder where you keep daily notes. For example, protect reference material while keeping your journal and quick captures editable:
+
+1. Open **Settings → Read Only View**, keep **Enabled** on, and select **All Markdown files**.
+2. With **Use glob patterns** off, add these enabled **Exclude** rows under **Path rules**:
+
+| Type | Value |
+| --- | --- |
+| Exclude | `Daily Notes/` |
+| Exclude | `Inbox/` |
+
+3. Replace the example folder names with the actual vault-relative paths you use. Read Only View matches paths; it does not detect daily notes by date or automatically read another plugin's folder setting.
+4. Wait for **Saved.** and check representative notes with [Path tester](../docs/path-tester.md).
+
+| Tested path | Expected result with only the rules above |
+| --- | --- |
+| `Daily Notes/2026-09-18.md` | Editable |
+| `Daily Notes/2026/09/18.md` | Editable |
+| `Inbox/Quick capture.md` | Editable |
+| `Reference/Handbook.md` | Read-only |
+| `Home.md` | Read-only |
+
+New Markdown notes created under the excluded folders also match those folder rules. A daily note saved elsewhere does not get an exception just because it is a daily note.
+
+If **Use glob patterns** is already on, use `Daily Notes/**` and `Inbox/**` instead. These excludes also work with **Only matched paths** and Include `**`. Review existing rules before changing the shared matching mode.
+
+## Can I temporarily allow editing without deleting my rules?
+
+Run **Disable read-only mode**, switch into editing, then run **Enable read-only mode** when finished. This pauses protection globally and does not resume automatically.
+
+If you use the `**` include in **Only matched paths**, you can instead uncheck that row's **Enabled** checkbox and recheck it later. Other enabled includes may still protect some notes. Disabling an include does not pause **All Markdown files** mode. See [temporarily disabling path rules](../docs/path-rules.md#temporarily-disable-rules).
diff --git a/docs-site/guides/make-folder-read-only.md b/docs-site/guides/make-folder-read-only.md
new file mode 100644
index 0000000..0202ae9
--- /dev/null
+++ b/docs-site/guides/make-folder-read-only.md
@@ -0,0 +1,84 @@
+---
+title: How to Make a Folder Read-Only in Obsidian
+description: Keep Markdown notes in a reference or archive folder in Reading view, with include rules for folders and exclude rules for one editable note or a drafts subfolder.
+---
+# How to Make a Folder Read-Only in Obsidian
+
+Add a folder path such as `Reference/` as an **Include** rule in Read Only View. With ordinary path matching, Markdown notes inside that folder and its subfolders stay in Reading view.
+
+## Protect a reference or archive folder
+
+1. [Install and enable Read Only View](./make-note-read-only.md#protect-a-reference-note).
+2. Open **Settings → Read Only View**. Keep **Enabled** on and select **Only matched paths**.
+3. Under **Advanced → Matching**, keep **Use glob patterns** off.
+4. Under **Path rules**, add an enabled **Include** row with **Value** set to `Reference/`.
+5. Wait for **Saved.** and open a Markdown note inside that folder.
+
+Use a vault-relative path, not the vault's name. Keep the trailing `/` to make the folder intent clear. For an archive, use `Archive/`; for a nested folder, use `Notes/Summaries/`.
+
+## How do I make a folder read-only but leave one note editable? {#leave-one-note-editable}
+
+Add an **Exclude** for that note alongside the folder's **Include**. With **Only matched paths** selected and **Use glob patterns** off, enable both rows:
+
+| Type | Value |
+| --- | --- |
+| Include | `Reference/` |
+| Exclude | `Reference/Working notes.md` |
+
+`Reference/Handbook.md` and `Reference/Policies/Security.md` stay in Reading view, while `Reference/Working notes.md` remains editable. Excludes always win, even when an include also matches.
+
+Ordinary file paths use prefix matching with glob matching off. To exempt exactly one existing note, paste its Obsidian URL into the exclude row instead. With glob matching on, use `Reference/**` for the folder include and `Reference/Working notes.md` for the note exclude.
+
+Check both the exception and another note using [Path tester](../docs/path-tester.md). To protect the exception again without retyping its path, uncheck the exclude row's **Enabled** checkbox; recheck it when you want to edit that note again.
+
+## Leave drafts editable
+
+Add these two rules:
+
+| Type | Value |
+| --- | --- |
+| Include | `Reference/` |
+| Exclude | `Reference/Drafts/` |
+
+The resulting behavior is:
+
+| Note | Result |
+| --- | --- |
+| `Reference/Handbook.md` | Read-only |
+| `Reference/Policies/Security.md` | Read-only |
+| `Reference/Drafts/New policy.md` | Editable |
+| `Inbox/Capture.md` | Editable, unless another include rule matches |
+
+An enabled **Exclude** always wins, even if another include rule also matches. Check any note with [Path tester](../docs/path-tester.md).
+
+## Protect everything except a working folder
+
+If almost the whole vault is for reading, select **All Markdown files** and add an **Exclude** rule for `Inbox/`. Include rules are saved but inactive in this mode.
+
+If you enable glob matching, use `Reference/**` instead of the plain folder rule. See [Path rules](../docs/path-rules.md#glob-patterns) before changing the matching mode, because it applies to ordinary path rules throughout the configuration.
+
+## How do I make only the notes directly in a folder read-only, without subfolders? {#without-subfolders}
+
+Use the glob `Reference/*.md` in **Only matched paths** mode. A single `*` cannot cross `/`, so it selects Markdown notes directly inside `Reference/` without selecting notes in nested folders.
+
+1. Keep the global **Enabled** toggle on and select **Only matched paths**.
+2. Under **Advanced → Matching**, turn on **Use glob patterns**.
+3. Add an enabled **Include** with **Value** set to `Reference/*.md`.
+4. Disable broader includes such as `Reference/**` or `**` if you want the subfolders to remain editable.
+5. Wait for **Saved.** and test both a direct note and a nested note with [Path tester](../docs/path-tester.md).
+
+| Note | With Include `Reference/*.md` | With Include `Reference/**` |
+| --- | --- | --- |
+| `Reference/Handbook.md` | Read-only | Read-only |
+| `Reference/Policies/Security.md` | Editable | Read-only |
+| `Inbox/Capture.md` | Editable | Editable |
+
+This comparison assumes **Only matched paths**, glob matching on, and only the include shown in each column, with no excludes. In **All Markdown files**, nested Markdown notes remain protected unless excluded.
+
+Glob matching applies to all ordinary path rules. Review existing folder rules when turning it on: a prefix such as `Inbox/` needs to become `Inbox/**` to continue matching its contents. With glob matching off, `Reference/*.md` treats `*` literally and will not behave as this example describes.
+
+## What a folder rule does not lock
+
+The rule affects Markdown note views, not the directory's filesystem permissions. It does not protect PDFs, images, other attachments, or changes made by external tools. Review rules after moving or renaming notes and folders; imported paths do not automatically track renames.
+
+For reading on a phone or tablet, see [Reading view on mobile](./mobile-reading-view.md).
diff --git a/docs-site/guides/make-note-read-only.md b/docs-site/guides/make-note-read-only.md
new file mode 100644
index 0000000..0639bf1
--- /dev/null
+++ b/docs-site/guides/make-note-read-only.md
@@ -0,0 +1,44 @@
+---
+title: How to Make a Note Read-Only in Obsidian
+description: Configure Read Only View to keep one Obsidian Markdown note in Reading view, verify its path rule, and temporarily allow editing when needed.
+---
+# How to Make a Note Read-Only in Obsidian
+
+Use Read Only View with an **Include** rule for the note's vault path. The plugin keeps matching Markdown notes in Reading view to help prevent accidental edits.
+
+## Reading view and protection
+
+Obsidian already provides Reading view and lets you switch between reading and editing. Live Preview is still an editing mode. See [Obsidian's guide to views and editing modes](https://obsidian.md/help/edit-and-read).
+
+Read Only View adds automatic enforcement for selected paths: it returns matching notes to Reading view and blocks editor input in supported Markdown editors. The underlying file does not become read-only at the operating-system level.
+
+## Protect a reference note
+
+1. Open **Settings → Community plugins → Browse**, find **Read Only View**, then **Install** and **Enable** it.
+2. Open **Settings → Read Only View** and keep **Enabled** on.
+3. Select **Only matched paths**. A new installation defaults to **All Markdown files**, which protects all Markdown notes instead.
+4. Under **Path rules**, select **Add rule**. Keep the row enabled, select **Include**, and enter `Reference/Travel checklist.md` in **Value**.
+5. Under **Advanced → Matching**, keep **Use glob patterns** off for this example. Keep the path's spelling and capitalization consistent with the vault.
+6. Wait for **Saved.**, then open the note.
+
+Paste `Reference/Travel checklist.md` into [Path tester](../docs/path-tester.md). It should report **Read-only** unless an enabled exclude rule matches.
+
+Ordinary paths use prefix matching. To target exactly one existing note, you can also paste its `obsidian://open` URL into the rule. See [Path rules](../docs/path-rules.md) for the distinction.
+
+## Can I temporarily edit this note without deleting its rule? {#temporarily-edit-the-note}
+
+Yes. In **Only matched paths**, uncheck **Enabled** on the note's Include row and wait for **Saved.** The path stays saved. Edit the note, then check the row again to restore protection. This works only if no other enabled include also protects the note.
+
+If a folder rule or `**` also matches, use a saved **Exclude** for the note: enable the exclude to allow editing, then disable it to restore protection. See [how to pause individual rules](../docs/path-rules.md#temporarily-disable-rules).
+
+### Pause protection for all notes
+
+Run **Disable read-only mode** from the Command Palette, then switch the note into editing. This disables enforcement across the vault. When finished, run **Enable read-only mode**.
+
+For an exception limited to this note, add an **Exclude** rule instead. Excludes always take precedence. Remove or disable the exception to protect the note again.
+
+## Limitations
+
+Only Markdown notes are affected. Other applications and plugins can still modify files, and imported note rules do not follow later renames automatically. Some preview and embedded contexts depend on Obsidian's internal view behavior; this is accidental-edit prevention, not an access-control mechanism.
+
+To cover several notes together, follow [Make a folder read-only](./make-folder-read-only.md).
diff --git a/docs-site/guides/mobile-reading-view.md b/docs-site/guides/mobile-reading-view.md
new file mode 100644
index 0000000..0f17014
--- /dev/null
+++ b/docs-site/guides/mobile-reading-view.md
@@ -0,0 +1,37 @@
+---
+title: Keep Obsidian Notes in Reading View on Mobile
+description: Use Read Only View on phones and tablets to keep reference notes in Reading view, configure folder rules, and allow deliberate edits.
+---
+# Keep Obsidian Notes in Reading View on Mobile
+
+Read Only View supports Obsidian on phones and tablets as well as desktop. Use it for notes you mainly consume: reference material, checklists, summaries, or an archive.
+
+An accidental switch into editing can open the keyboard and interrupt reading. The plugin returns matching Markdown notes to Reading view and blocks editor input in supported editors. It does not promise to suppress every keyboard appearance or control every plugin-provided view.
+
+## Set up a reading folder
+
+1. In Obsidian, open **Settings → Community plugins → Browse**. Search for **Read Only View**, then **Install** and **Enable** it.
+2. Open **Settings → Read Only View**. Keep **Enabled** on and select **Only matched paths**.
+3. Under **Path rules**, add an enabled **Include** rule for `Reference/`.
+4. Keep **Use glob patterns** off under **Advanced → Matching**.
+5. Wait for **Saved.**, then open a note in that folder.
+
+Use [Path tester](../docs/path-tester.md) with a specific note such as `Reference/Travel checklist.md` to check the result. On narrow screens, settings controls and rule rows use a stacked layout.
+
+For an entire vault used mainly for reading, keep **All Markdown files** selected and add **Exclude** rules for notes you need to edit.
+
+## Use portable paths
+
+Vault-relative paths work on desktop and mobile. Obsidian URLs must resolve to an existing Markdown note in the current vault.
+
+Importing a new absolute system path is desktop-only. Once imported, the rule stores its resolved vault-relative path, so that saved rule remains portable to mobile. You can enter the vault-relative path directly on your phone; no system path is needed.
+
+## Edit when you intend to
+
+Run **Disable read-only mode**, switch to editing, and make your change. Then run **Enable read-only mode**. The disable command pauses enforcement for all notes, not just the current one.
+
+For a permanent writing area, add an **Exclude** rule such as `Reference/Drafts/`. See [folder rules](./make-folder-read-only.md).
+
+## Limits and privacy
+
+Only Markdown notes are affected. The plugin does not change file permissions or prevent external applications from editing notes. Rule matching stays local, and the plugin makes no network requests. Installation and updates are separate from normal plugin operation.
diff --git a/docs-site/guides/prevent-accidental-editing.md b/docs-site/guides/prevent-accidental-editing.md
new file mode 100644
index 0000000..c2388f8
--- /dev/null
+++ b/docs-site/guides/prevent-accidental-editing.md
@@ -0,0 +1,36 @@
+---
+title: How to Prevent Accidental Editing in Obsidian
+description: Keep reference notes in Reading view while leaving working notes editable, and deliberately pause Read Only View when you need to make changes.
+---
+# How to Prevent Accidental Editing in Obsidian
+
+If you mostly read reference notes, configure Read Only View to keep those notes in Reading view. It helps when an unintended tap, click, or view switch takes you into editing while you are trying to read.
+
+## Separate reading notes from working notes
+
+A practical setup keeps reference material protected and daily writing editable:
+
+1. [Install Read Only View](./make-note-read-only.md#protect-a-reference-note) and open its settings.
+2. Keep **Enabled** on and choose **Only matched paths**.
+3. Keep **Use glob patterns** off under **Advanced → Matching**.
+4. Add enabled **Include** rules for `Reference/` and `Archive/`.
+5. If needed, add an **Exclude** rule for `Reference/Drafts/`.
+6. Wait for **Saved.** and check a representative note with [Path tester](../docs/path-tester.md).
+
+Notes outside those includes remain editable unless another rule matches them. If you mainly read the entire vault, use **All Markdown files** with exclusions for working folders instead.
+
+## Make editing deliberate
+
+Use **Disable read-only mode** in the Command Palette before editing protected material. This pauses protection globally; it does not automatically resume. Run **Enable read-only mode** when you finish. **Re-apply rules now** enforces the current configuration across open Markdown notes.
+
+For a continuing exception, use an exclude rule instead of repeatedly pausing protection.
+
+## Phones, tablets, and preview contexts
+
+An unwanted switch into editing can interrupt reading and bring up the keyboard on a touch device. Keeping matching notes in Reading view helps reduce these interruptions. See the [mobile guide](./mobile-reading-view.md) for configuration details.
+
+The plugin also blocks editor input in supported CodeMirror-backed Markdown contexts, including some preview contexts. Coverage of every hover or embedded view is not guaranteed because it depends on Obsidian's internal behavior.
+
+## Protection is not access control
+
+Read Only View does not enforce security permissions, make files immutable, or stop another plugin or application from changing them. Its purpose is to reduce accidental edits during normal reading in Obsidian. It does not replace backups or file-access controls.
diff --git a/docs-site/index.md b/docs-site/index.md
new file mode 100644
index 0000000..257936c
--- /dev/null
+++ b/docs-site/index.md
@@ -0,0 +1,65 @@
+---
+layout: home
+title: Read Only View for Obsidian
+description: Keep selected notes and folders in Obsidian Reading view. Prevent accidental edits on desktop, phone, and tablet with local path rules.
+hero:
+ name: Read Only View
+ text: Keep selected Obsidian notes in Reading view and prevent accidental edits.
+ tagline: Read reference notes comfortably on desktop, phone, and tablet. Choose individual notes, whole folders, or every Markdown note in your vault.
+ actions:
+ - theme: brand
+ text: Install from Community Plugins
+ link: https://community.obsidian.md/plugins/read-only-view
+ - theme: alt
+ text: Read the guides
+ link: /guides/make-note-read-only
+ - theme: alt
+ text: GitHub
+ link: https://github.com/mrKazzila/Read-Only-View
+features:
+ - title: Choose what stays in Reading view
+ details: Include notes or folders with Path rules. Exclude drafts and working notes so they remain editable.
+ - title: Check a rule before relying on it
+ details: The built-in Path tester shows the resolved path, matching rules, and whether a note is Read-only or Editable.
+ link: /docs/path-tester
+ - title: Read on mobile and tablet
+ details: Keep reference notes in Reading view while browsing. Matching runs locally, with no network requests from the plugin.
+ link: /guides/mobile-reading-view
+---
+
+## Get started
+
+In Obsidian, open **Settings → Community plugins → Browse**, search for **Read Only View**, then select **Install** and **Enable**. Requires Obsidian **1.10.3 or newer**; supports desktop and mobile.
+
+::: tip Choose your scope
+New installations use **All Markdown files** mode. To protect selected notes or folders, open **Settings → Read Only View**, select **Only matched paths**, and add an **Include** rule under **Path rules**.
+:::
+
+
+
+## Find your workflow
+
+- [How do I keep all Obsidian notes in Reading view?](./guides/make-all-notes-read-only.md): use **All Markdown files** or an Include glob `**`.
+- [Make one note read-only](./guides/make-note-read-only.md): keep a reference note in Reading view.
+- [Make a folder read-only](./guides/make-folder-read-only.md): protect `Reference/` or `Archive/` while leaving drafts editable.
+- [Prevent accidental editing](./guides/prevent-accidental-editing.md): separate reading from deliberate editing.
+- [Use Reading view on mobile](./guides/mobile-reading-view.md): browse notes on a phone or tablet.
+
+See [Path rules](./docs/path-rules.md) for matching syntax and [Path tester](./docs/path-tester.md) for diagnostics.
+
+## Questions about path rules
+
+- [How do I keep daily notes editable in a read-only vault?](./guides/make-all-notes-read-only.md#except-daily-notes)
+- [How do I protect a folder without its subfolders?](./guides/make-folder-read-only.md#without-subfolders)
+- [Why is my note read-only or still editable?](./docs/troubleshooting.md)
+
+- [Can I protect a folder but leave one note editable?](./guides/make-folder-read-only.md#leave-one-note-editable)
+- [Can I use an Obsidian URL, system path, or vault path?](./docs/path-rules.md#import-a-note-or-folder)
+- [Can I temporarily disable a rule without deleting its path?](./docs/path-rules.md#temporarily-disable-rules)
+- [How do I check whether a note will be read-only?](./docs/path-tester.md#test-a-note)
+- [Can I use wildcards in path rules?](./docs/path-rules.md#glob-patterns)
+- [Can I make path matching case-sensitive?](./docs/path-rules.md#case-sensitivity)
+
+## What protection means
+
+Read Only View returns matching Markdown notes to Reading view and blocks editor input in supported Markdown editors. It changes Obsidian view behavior; it does not change filesystem permissions, rewrite your Markdown files, or prevent other applications from editing them. See the [FAQ](./faq.md) for limitations and temporary editing.
diff --git a/docs-site/public/robots.txt b/docs-site/public/robots.txt
new file mode 100644
index 0000000..04da39e
--- /dev/null
+++ b/docs-site/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /Read-Only-View/
+
+Sitemap: https://mrkazzila.github.io/Read-Only-View/sitemap.xml
diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md
index d0e5cba..d4ab507 100644
--- a/docs/PROJECT_STATE.md
+++ b/docs/PROJECT_STATE.md
@@ -416,3 +416,16 @@ When plugin behavior changes (matching logic, enforcement behavior, commands, se
1. Update this file (`docs/PROJECT_STATE.md`).
2. Update user-facing docs (`README.md`).
3. Re-run validation: `just lint && just test && just build`.
+
+## Public documentation website
+
+- `docs-site/` contains the VitePress homepage, five workflow guides, Path rules, Path tester, and FAQ. It documents the checked-in behavior rather than claiming a latest release version.
+- `docs-site/.vitepress/config.ts` owns navigation, the `/Read-Only-View/` base, sitemap, canonical URLs, Open Graph metadata, and homepage SoftwareApplication JSON-LD.
+- Screenshots are imported from `docs/images/community-images/`; there are no duplicated source assets.
+- Root npm scripts: `docs:dev`, `docs:build`, `docs:preview`. Website dependencies are development-only and locked in `package-lock.json`.
+- `.github/workflows/pages.yml` builds PRs against `master` and deploys `master` to GitHub Pages. Plugin CI, releases, and runtime behavior are unchanged.
+- Setup, validation, and the project-site robots.txt limitation are documented in `CONTRIBUTING.md`.
+
+The public guides explicitly cover all-Markdown mode versus Include `**`, a single editable note inside a protected folder, retained disabled rules, supported path sources, Path tester, wildcards, and case sensitivity. Question-based headings and FAQ answers link to concrete setup examples.
+
+Additional public examples cover an all-Markdown vault with editable Daily Notes and Inbox folders, and direct-child folder matching with `Reference/*.md`. `docs-site/docs/troubleshooting.md` diagnoses unexpected read-only/editable results and links to Path tester; navigation, homepage, and FAQ expose these workflows.
diff --git a/eslint.config.mts b/eslint.config.mts
index f0a2689..1f1fa3f 100644
--- a/eslint.config.mts
+++ b/eslint.config.mts
@@ -44,6 +44,7 @@ export default tseslint.config(
'.tmp',
'node_modules',
'dist',
+ 'docs-site/.vitepress/**',
'build-tests',
'demo-vault',
'esbuild.config.mjs',
diff --git a/package-lock.json b/package-lock.json
index 2ab5d50..48ba74e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -31,6 +31,7 @@
"tslib": "2.4.0",
"typescript": "^5.8.3",
"typescript-eslint": "8.35.1",
+ "vitepress": "1.6.4",
"webdriverio": "^9.27.2"
}
},
@@ -1475,9 +1476,9 @@
}
},
"node_modules/@types/estree": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
- "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
"dev": true,
"license": "MIT"
},
@@ -13082,6 +13083,2510 @@
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
+ },
+ "node_modules/@algolia/abtesting": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.25.0.tgz",
+ "integrity": "sha512-rSTin9Uta23uaewYVQEp8XI9T3iA/zrg0/1G2vhf8oFFDxFL5vybnZ5IQwsVAg4JpKxPX4/WYNKdcfWrZymk7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/autocomplete-core": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz",
+ "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-plugin-algolia-insights": "1.17.7",
+ "@algolia/autocomplete-shared": "1.17.7"
+ }
+ },
+ "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz",
+ "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.7"
+ },
+ "peerDependencies": {
+ "search-insights": ">= 1 < 3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-preset-algolia": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz",
+ "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.7"
+ },
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/autocomplete-shared": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz",
+ "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/client-abtesting": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.59.0.tgz",
+ "integrity": "sha512-bm2XN0hCSMYwStSsCBT0/PUB2BDxoyR1Lnub3c392HMEy9bi8PUSW8vR6zltVEKWG2t4PQFWMD5C07bmJxGgPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.59.0.tgz",
+ "integrity": "sha512-XOFPOTa69WuqHR6c5tMgnUUwwqQgNSzMpxmhrgA9KmxRf8WIqEa0cokHJvohk5CYb7CZx0xeSL6Bk2IUJ7Lv7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-common": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.59.0.tgz",
+ "integrity": "sha512-PC8ipLOYFKRTfIUY1J3FJxS6ryzWziaXmIX9/sNMoUR8L+XhF7hX2QAeUI87YVl5zujvlYTSOb+HAIqKXDjyHQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-insights": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.59.0.tgz",
+ "integrity": "sha512-yFNcCMM5fHiyoR0HuxMrzy+VjDcmhFUZTm2IJ2DHwGsVH3B5SEob4zTmeEZ3j/AZqNnmrJOCKl/tJnBg7+84bA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-personalization": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.59.0.tgz",
+ "integrity": "sha512-GYja6HkDt2VrQhWmB2cLx3Z5fDwI9no7q+xwCWcFrTPm5CLH9QZvK0XLO9co1FcNIDxxkMaP3AXM39/XcecEOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-query-suggestions": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.59.0.tgz",
+ "integrity": "sha512-Wofg7bMpWh8N5qDDZs0wy6whc+KMmdNsxgrIGp9Ug2s1Bka0uq7AjyckdxReKPHLA0Q1qH8X/SNh0wn2t2X2Lw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-search": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.59.0.tgz",
+ "integrity": "sha512-fHnALZfbEnODczGk14Y/1YBRApp6UEpZUTexGcMUPzY7RDc7q4HN2Y6jh0KUG8Jo9B+q+wOoQEc3ziR0ErbuFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/ingestion": {
+ "version": "1.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.59.0.tgz",
+ "integrity": "sha512-Fa38s1mHgoaLCT117sfJ6P78rtxUt93CYxBYpq1VOIcslaF+cH+1h5uikAPsKfxLnsuEDZHiBiaI6eNPTsQMRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/monitoring": {
+ "version": "1.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.59.0.tgz",
+ "integrity": "sha512-NyNsRSqM2tF1MX7ZGw/j4rduoEJiQ5wfvbSo/CFVdEzYCjyxbGFRPOZyS/GETJG9rk1TdHOq8NZqKqk/u1fm4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/recommend": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.59.0.tgz",
+ "integrity": "sha512-nXBK2uygWtvbCOffMWqqfjjcEtp9enDKY5/2Pw/Hhw8VVaOyK2ThbGK04bNX/Le+qoK1VHYkodWGVTKfw0Otkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-browser-xhr": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.59.0.tgz",
+ "integrity": "sha512-yb+4afX/zja8QwX0KmV4/ae2kyYkRknsE79CRusYS2U5D8qwn2wq0cn1x12f3tm3F3+5FgmDdbuGdQTuCLSKMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-fetch": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.59.0.tgz",
+ "integrity": "sha512-Lp52TmpA1QtNmdHzs505Xwf4tgII7RAapkDSF9AAtWIBETcGaTIaXci4Rd9nS6SdaWK1BWTSqAPp5wzh6UN3Ag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-node-http": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.59.0.tgz",
+ "integrity": "sha512-YYHLEs5rC6oRTFwT7bJaKBR9NSFzikeVHGAT1ffATmUQzR8XqyhHXjoieAUoR7fBU6I5cfy1FVeh5GoRgriuzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz",
+ "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/js": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz",
+ "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/react": "3.8.2",
+ "preact": "^10.0.0"
+ }
+ },
+ "node_modules/@docsearch/react": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz",
+ "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-core": "1.17.7",
+ "@algolia/autocomplete-preset-algolia": "1.17.7",
+ "@docsearch/css": "3.8.2",
+ "algoliasearch": "^5.14.2"
+ },
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 19.0.0",
+ "react": ">= 16.8.0 < 19.0.0",
+ "react-dom": ">= 16.8.0 < 19.0.0",
+ "search-insights": ">= 1 < 3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "search-insights": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@iconify-json/simple-icons": {
+ "version": "1.2.96",
+ "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.96.tgz",
+ "integrity": "sha512-/FmCYo/H5rIywTLV/P6OYsr0rg/31vuc8jYq0QnkOZl6m7PWIs+h5oAnSTT2cqRhOsMaKqbXcdkka6tnZ1WiUA==",
+ "dev": true,
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@napi-rs/lzma-linux-x64-gnu": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
+ "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^22.20 || ^24.12 || >=25"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.3.tgz",
+ "integrity": "sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.3.tgz",
+ "integrity": "sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.3.tgz",
+ "integrity": "sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.3.tgz",
+ "integrity": "sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.3.tgz",
+ "integrity": "sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.3.tgz",
+ "integrity": "sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.3.tgz",
+ "integrity": "sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.3.tgz",
+ "integrity": "sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.3.tgz",
+ "integrity": "sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.3.tgz",
+ "integrity": "sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.3.tgz",
+ "integrity": "sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.3.tgz",
+ "integrity": "sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.3.tgz",
+ "integrity": "sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.3.tgz",
+ "integrity": "sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.3.tgz",
+ "integrity": "sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.3.tgz",
+ "integrity": "sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.3.tgz",
+ "integrity": "sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.3.tgz",
+ "integrity": "sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.3.tgz",
+ "integrity": "sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.3.tgz",
+ "integrity": "sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.3.tgz",
+ "integrity": "sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.3.tgz",
+ "integrity": "sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.3.tgz",
+ "integrity": "sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.3.tgz",
+ "integrity": "sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.3.tgz",
+ "integrity": "sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz",
+ "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/engine-javascript": "2.5.0",
+ "@shikijs/engine-oniguruma": "2.5.0",
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.4"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz",
+ "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^3.1.0"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz",
+ "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz",
+ "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz",
+ "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0"
+ }
+ },
+ "node_modules/@shikijs/transformers": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz",
+ "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "2.5.0",
+ "@shikijs/types": "2.5.0"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz",
+ "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz",
+ "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.43.tgz",
+ "integrity": "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/shared": "3.5.43",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-core/node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@vue/compiler-core/node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@vue/compiler-core/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@vue/compiler-core/node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz",
+ "integrity": "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.43",
+ "@vue/shared": "3.5.43"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz",
+ "integrity": "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/compiler-core": "3.5.43",
+ "@vue/compiler-dom": "3.5.43",
+ "@vue/compiler-ssr": "3.5.43",
+ "@vue/shared": "3.5.43",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.28",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-sfc/node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@vue/compiler-sfc/node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@vue/compiler-sfc/node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz",
+ "integrity": "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.43",
+ "@vue/shared": "3.5.43"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "7.7.10",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz",
+ "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^7.7.10"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "7.7.10",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz",
+ "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^7.7.10",
+ "birpc": "^2.3.0",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.2"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "7.7.10",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz",
+ "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.43.tgz",
+ "integrity": "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.43"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.43.tgz",
+ "integrity": "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.43",
+ "@vue/shared": "3.5.43"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.43.tgz",
+ "integrity": "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.43",
+ "@vue/runtime-core": "3.5.43",
+ "@vue/shared": "3.5.43",
+ "csstype": "^3.2.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.43.tgz",
+ "integrity": "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.43",
+ "@vue/runtime-dom": "3.5.43",
+ "@vue/shared": "3.5.43"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.43.tgz",
+ "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz",
+ "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "12.8.2",
+ "@vueuse/shared": "12.8.2",
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/integrations": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz",
+ "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vueuse/core": "12.8.2",
+ "@vueuse/shared": "12.8.2",
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "async-validator": "^4",
+ "axios": "^1",
+ "change-case": "^5",
+ "drauu": "^0.4",
+ "focus-trap": "^7",
+ "fuse.js": "^7",
+ "idb-keyval": "^6",
+ "jwt-decode": "^4",
+ "nprogress": "^0.2",
+ "qrcode": "^1.5",
+ "sortablejs": "^1",
+ "universal-cookie": "^7"
+ },
+ "peerDependenciesMeta": {
+ "async-validator": {
+ "optional": true
+ },
+ "axios": {
+ "optional": true
+ },
+ "change-case": {
+ "optional": true
+ },
+ "drauu": {
+ "optional": true
+ },
+ "focus-trap": {
+ "optional": true
+ },
+ "fuse.js": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "jwt-decode": {
+ "optional": true
+ },
+ "nprogress": {
+ "optional": true
+ },
+ "qrcode": {
+ "optional": true
+ },
+ "sortablejs": {
+ "optional": true
+ },
+ "universal-cookie": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz",
+ "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz",
+ "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/algoliasearch": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.59.0.tgz",
+ "integrity": "sha512-wUXzaeI7B526W4y1gFg3lcxgDZ67XSgRJIiellYWOas/pLpO7rOtxm9Gr2E/C8aiSDXIgx1q5TdSsvK67Uakqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/abtesting": "1.25.0",
+ "@algolia/client-abtesting": "5.59.0",
+ "@algolia/client-analytics": "5.59.0",
+ "@algolia/client-common": "5.59.0",
+ "@algolia/client-insights": "5.59.0",
+ "@algolia/client-personalization": "5.59.0",
+ "@algolia/client-query-suggestions": "5.59.0",
+ "@algolia/client-search": "5.59.0",
+ "@algolia/ingestion": "1.59.0",
+ "@algolia/monitoring": "1.59.0",
+ "@algolia/recommend": "5.59.0",
+ "@algolia/requester-browser-xhr": "5.59.0",
+ "@algolia/requester-fetch": "5.59.0",
+ "@algolia/requester-node-http": "5.59.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
+ "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.1.0.tgz",
+ "integrity": "sha512-ufbM3smX/Jbnpk5wcQjzd1MgBpzmqfNETUAyZNrGwU9foRlyHoGzMMBBCRzEhQLBjZfFDE1W2ufPXX2vdWkV8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/emoji-regex-xs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz",
+ "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/focus-trap": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz",
+ "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tabbable": "^6.4.0"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/minisearch": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz",
+ "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.19",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
+ "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz",
+ "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex-xs": "^1.0.0",
+ "regex": "^6.0.1",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/postcss": {
+ "version": "8.5.28",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
+ "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.18",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/preact": {
+ "version": "10.29.8",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.8.tgz",
+ "integrity": "sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ },
+ "peerDependencies": {
+ "preact-render-to-string": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "preact-render-to-string": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rollup": {
+ "version": "4.63.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.3.tgz",
+ "integrity": "sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+ "@rollup/rollup-android-arm-eabi": "4.63.3",
+ "@rollup/rollup-android-arm64": "4.63.3",
+ "@rollup/rollup-darwin-arm64": "4.63.3",
+ "@rollup/rollup-darwin-x64": "4.63.3",
+ "@rollup/rollup-freebsd-arm64": "4.63.3",
+ "@rollup/rollup-freebsd-x64": "4.63.3",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.63.3",
+ "@rollup/rollup-linux-arm-musleabihf": "4.63.3",
+ "@rollup/rollup-linux-arm64-gnu": "4.63.3",
+ "@rollup/rollup-linux-arm64-musl": "4.63.3",
+ "@rollup/rollup-linux-loong64-gnu": "4.63.3",
+ "@rollup/rollup-linux-loong64-musl": "4.63.3",
+ "@rollup/rollup-linux-ppc64-gnu": "4.63.3",
+ "@rollup/rollup-linux-ppc64-musl": "4.63.3",
+ "@rollup/rollup-linux-riscv64-gnu": "4.63.3",
+ "@rollup/rollup-linux-riscv64-musl": "4.63.3",
+ "@rollup/rollup-linux-s390x-gnu": "4.63.3",
+ "@rollup/rollup-linux-x64-gnu": "4.63.3",
+ "@rollup/rollup-linux-x64-musl": "4.63.3",
+ "@rollup/rollup-openbsd-x64": "4.63.3",
+ "@rollup/rollup-openharmony-arm64": "4.63.3",
+ "@rollup/rollup-win32-arm64-msvc": "4.63.3",
+ "@rollup/rollup-win32-ia32-msvc": "4.63.3",
+ "@rollup/rollup-win32-x64-gnu": "4.63.3",
+ "@rollup/rollup-win32-x64-msvc": "4.63.3",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/search-insights": {
+ "version": "2.17.3",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
+ "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/shiki": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz",
+ "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "2.5.0",
+ "@shikijs/engine-javascript": "2.5.0",
+ "@shikijs/engine-oniguruma": "2.5.0",
+ "@shikijs/langs": "2.5.0",
+ "@shikijs/themes": "2.5.0",
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/superjson": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz",
+ "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "copy-anything": "^4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz",
+ "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vitepress": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz",
+ "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/css": "3.8.2",
+ "@docsearch/js": "3.8.2",
+ "@iconify-json/simple-icons": "^1.2.21",
+ "@shikijs/core": "^2.1.0",
+ "@shikijs/transformers": "^2.1.0",
+ "@shikijs/types": "^2.1.0",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^5.2.1",
+ "@vue/devtools-api": "^7.7.0",
+ "@vue/shared": "^3.5.13",
+ "@vueuse/core": "^12.4.0",
+ "@vueuse/integrations": "^12.4.0",
+ "focus-trap": "^7.6.4",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.1.1",
+ "shiki": "^2.1.0",
+ "vite": "^5.4.14",
+ "vue": "^3.5.13"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vitepress/node_modules/@types/node": {
+ "version": "26.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.1.tgz",
+ "integrity": "sha512-VqGJBMCtdhqkBUCcBLvywI0NJ+KLuVzgNnlBUNFOQjqVxzo2lxLUNg1DSey8+u2u6ktswSAxg+s68QLzWHNOuA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~8.9.0"
+ }
+ },
+ "node_modules/vitepress/node_modules/@vitejs/plugin-vue": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+ "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/vitepress/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/vitepress/node_modules/undici-types": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
+ "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/vitepress/node_modules/vite": {
+ "version": "5.4.21",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.43",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.43.tgz",
+ "integrity": "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.43",
+ "@vue/compiler-sfc": "3.5.43",
+ "@vue/runtime-dom": "3.5.43",
+ "@vue/server-renderer": "3.5.43",
+ "@vue/shared": "3.5.43"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
}
}
}
diff --git a/package.json b/package.json
index 5b6462a..426d750 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,10 @@
"test": "tsc -p tsconfig.test.json && node tests/helpers/prepare-obsidian-runtime.mjs && node --test build-tests/**/*.test.js",
"lint": "eslint .",
"test:e2e": "npm run build && python3 scripts/create_demo_vault.py --force && wdio run wdio.conf.mjs",
- "test:e2e:debug": "npm run build && python3 scripts/create_demo_vault.py --force && wdio run wdio.conf.mjs --logLevel info"
+ "test:e2e:debug": "npm run build && python3 scripts/create_demo_vault.py --force && wdio run wdio.conf.mjs --logLevel info",
+ "docs:dev": "vitepress dev docs-site",
+ "docs:build": "vitepress build docs-site",
+ "docs:preview": "vitepress preview docs-site"
},
"keywords": [],
"license": "0BSD",
@@ -35,6 +38,7 @@
"tslib": "2.4.0",
"typescript": "^5.8.3",
"typescript-eslint": "8.35.1",
+ "vitepress": "1.6.4",
"webdriverio": "^9.27.2"
},
"dependencies": {