@deot/docs-client 1.1.4 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -10,6 +10,7 @@ let _deot_helper_fp = require("@deot/helper-fp");
10
10
  let _deot_http = require("@deot/http");
11
11
  let _deot_docs_renderer = require("@deot/docs-renderer");
12
12
  let es_module_lexer = require("es-module-lexer");
13
+ let _deot_helper_unicode = require("@deot/helper-unicode");
13
14
  let _deot_docs_playground = require("@deot/docs-playground");
14
15
  let _deot_helper_dom = require("@deot/helper-dom");
15
16
  //#region packages/client/src/utils/runtime.ts
@@ -73,9 +74,9 @@ var getEnvironmentBase = (config) => {
73
74
  const segments = location.pathname.split("/").filter(Boolean);
74
75
  const configuredLanguages = Object.keys(config.locales);
75
76
  const languages = configuredLanguages.length ? configuredLanguages : ["zh-CN"];
76
- const languageIndex = segments.findIndex((segment) => languages.includes(segment));
77
- if (languageIndex >= 0) {
78
- const deploymentSegments = segments.slice(0, languageIndex);
77
+ const routeIndex = /^__docs\/preview(?:-config-generate)?$/.test(segments.slice(-2).join("/")) ? segments.length - 2 : segments.findIndex((segment) => languages.includes(segment));
78
+ if (routeIndex >= 0) {
79
+ const deploymentSegments = segments.slice(0, routeIndex);
79
80
  return new URL(`/${deploymentSegments.join("/")}${deploymentSegments.length ? "/" : ""}`, location.origin).href;
80
81
  }
81
82
  return new URL("./", location.href).href;
@@ -747,25 +748,25 @@ var setSidebarItems = (next) => {
747
748
  };
748
749
  //#endregion
749
750
  //#region packages/client/src/components/layout/default-footer.vue?vue&type=script&setup=true&lang.ts
750
- var _hoisted_1$30 = ["data-content-width"];
751
- var _hoisted_2$24 = {
751
+ var _hoisted_1$31 = ["data-content-width"];
752
+ var _hoisted_2$25 = {
752
753
  key: 0,
753
754
  class: "docs-footer__inner"
754
755
  };
755
756
  var _hoisted_3$18 = { class: "docs-footer__content" };
756
- var _hoisted_4$11 = { class: "docs-footer__title" };
757
- var _hoisted_5$8 = {
757
+ var _hoisted_4$12 = { class: "docs-footer__title" };
758
+ var _hoisted_5$9 = {
758
759
  key: 0,
759
760
  class: "docs-footer__links"
760
761
  };
761
- var _hoisted_6$6 = ["href"];
762
- var _hoisted_7$6 = { key: 2 };
763
- var _hoisted_8$5 = { class: "docs-footer__bar" };
764
- var _hoisted_9$4 = { class: "docs-footer__bar-inner" };
765
- var _hoisted_10$4 = ["href"];
766
- var _hoisted_11$4 = ["src"];
767
- var _hoisted_12$4 = ["src"];
768
- var _hoisted_13$3 = {
762
+ var _hoisted_6$7 = ["href"];
763
+ var _hoisted_7$7 = { key: 2 };
764
+ var _hoisted_8$7 = { class: "docs-footer__bar" };
765
+ var _hoisted_9$5 = { class: "docs-footer__bar-inner" };
766
+ var _hoisted_10$5 = ["href"];
767
+ var _hoisted_11$5 = ["src"];
768
+ var _hoisted_12$5 = ["src"];
769
+ var _hoisted_13$4 = {
769
770
  key: 2,
770
771
  class: "docs-footer__powered-by"
771
772
  };
@@ -887,25 +888,25 @@ var default_footer_default = /* @__PURE__ */ (0, vue.defineComponent)({
887
888
  key: 0,
888
889
  class: "docs-footer",
889
890
  "data-content-width": contentWidth.value
890
- }, [groups.value.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$24, [(0, vue.createElementVNode)("div", _hoisted_3$18, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(groups.value, (group) => {
891
+ }, [groups.value.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$25, [(0, vue.createElementVNode)("div", _hoisted_3$18, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(groups.value, (group) => {
891
892
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", {
892
893
  key: group.label,
893
894
  class: "docs-footer__group"
894
- }, [(0, vue.createElementVNode)("h2", _hoisted_4$11, (0, vue.toDisplayString)(group.label), 1), group.children?.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("ul", _hoisted_5$8, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(group.children, (item) => {
895
+ }, [(0, vue.createElementVNode)("h2", _hoisted_4$12, (0, vue.toDisplayString)(group.label), 1), group.children?.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("ul", _hoisted_5$9, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(group.children, (item) => {
895
896
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("li", { key: `${item.label}:${item.value || ""}` }, [item.value && isExternal(item.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
896
897
  key: 0,
897
898
  href: item.value,
898
899
  target: "_blank",
899
900
  rel: "noopener noreferrer"
900
- }, (0, vue.toDisplayString)(item.label), 9, _hoisted_6$6)) : item.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
901
+ }, (0, vue.toDisplayString)(item.label), 9, _hoisted_6$7)) : item.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
901
902
  key: 1,
902
903
  to: toPath(item.value)
903
904
  }, {
904
905
  default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)(item.label), 1)]),
905
906
  _: 2
906
- }, 1032, ["to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_7$6, (0, vue.toDisplayString)(item.label), 1))]);
907
+ }, 1032, ["to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_7$7, (0, vue.toDisplayString)(item.label), 1))]);
907
908
  }), 128))])) : (0, vue.createCommentVNode)("v-if", true)]);
908
- }), 128))])])) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createElementVNode)("div", _hoisted_8$5, [(0, vue.createElementVNode)("div", _hoisted_9$4, [brandExternal.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
909
+ }), 128))])])) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createElementVNode)("div", _hoisted_8$7, [(0, vue.createElementVNode)("div", _hoisted_9$5, [brandExternal.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
909
910
  key: 0,
910
911
  class: "docs-footer__brand",
911
912
  href: brandValue.value,
@@ -916,7 +917,7 @@ var default_footer_default = /* @__PURE__ */ (0, vue.defineComponent)({
916
917
  class: "docs-footer__brand-logo",
917
918
  src: brandLogo.value,
918
919
  alt: ""
919
- }, null, 8, _hoisted_11$4)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)], 8, _hoisted_10$4)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
920
+ }, null, 8, _hoisted_11$5)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)], 8, _hoisted_10$5)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
920
921
  key: 1,
921
922
  class: "docs-footer__brand",
922
923
  to: brandPath.value
@@ -926,15 +927,15 @@ var default_footer_default = /* @__PURE__ */ (0, vue.defineComponent)({
926
927
  class: "docs-footer__brand-logo",
927
928
  src: brandLogo.value,
928
929
  alt: ""
929
- }, null, 8, _hoisted_12$4)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)]),
930
+ }, null, 8, _hoisted_12$5)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)]),
930
931
  _: 1
931
- }, 8, ["to"])), poweredBy.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_13$3, (0, vue.toDisplayString)(poweredBy.value), 1)) : (0, vue.createCommentVNode)("v-if", true)])])], 8, _hoisted_1$30)) : (0, vue.createCommentVNode)("v-if", true);
932
+ }, 8, ["to"])), poweredBy.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_13$4, (0, vue.toDisplayString)(poweredBy.value), 1)) : (0, vue.createCommentVNode)("v-if", true)])])], 8, _hoisted_1$31)) : (0, vue.createCommentVNode)("v-if", true);
932
933
  };
933
934
  }
934
935
  });
935
936
  //#endregion
936
937
  //#region packages/client/src/components/search/highlight-text.vue?vue&type=script&setup=true&lang.ts
937
- var _hoisted_1$29 = {
938
+ var _hoisted_1$30 = {
938
939
  key: 0,
939
940
  class: "docs-search-highlight"
940
941
  };
@@ -963,7 +964,7 @@ var highlight_text_default = /* @__PURE__ */ (0, vue.defineComponent)({
963
964
  });
964
965
  return (_ctx, _cache) => {
965
966
  return (0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(parts.value, (part, index) => {
966
- return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: `${index}:${part.text}` }, [part.match ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("mark", _hoisted_1$29, (0, vue.toDisplayString)(part.text), 1)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [(0, vue.createTextVNode)((0, vue.toDisplayString)(part.text), 1)], 64))], 64);
967
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: `${index}:${part.text}` }, [part.match ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("mark", _hoisted_1$30, (0, vue.toDisplayString)(part.text), 1)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [(0, vue.createTextVNode)((0, vue.toDisplayString)(part.text), 1)], 64))], 64);
967
968
  }), 128);
968
969
  };
969
970
  }
@@ -1915,24 +1916,28 @@ var ResourceGateway = class {
1915
1916
  var Gateway = new ResourceGateway();
1916
1917
  //#endregion
1917
1918
  //#region packages/client/src/utils/resource-graph.ts
1918
- var SUPPORTED_DEPENDENCY_RE = /\.(?:vue|[jt]s|css)(?:$|[?#])/i;
1919
- var STYLE_IMPORT_RE = /@import\s+(?:url\(\s*(?:(['"])(.*?)\1|([^'")\s]+))\s*\)|(['"])(.*?)\4)/gi;
1919
+ var SUPPORTED_DEPENDENCY_RE = /\.(?:vue|[jt]sx?|json|css|scss|sass)(?:$|[?#])/i;
1920
+ var STYLE_IMPORT_RE = /@(?:import|use|forward)\s+(?:url\(\s*(?:(['"])(.*?)\1|([^'")\s]+))\s*\)|(['"])(.*?)\4)/gi;
1920
1921
  var SFC_BLOCK_RE = /<(script|style)\b([^>]*)>([\s\S]*?)<\/\1>/gi;
1921
1922
  var SOURCE_ATTRIBUTE_RE = /\bsrc\s*=\s*(['"])(.*?)\1/i;
1922
1923
  var getResourceType = (url) => {
1923
1924
  if (/\.vue(?:$|[?#])/i.test(url)) return "sfc";
1924
- if (/\.css(?:$|[?#])/i.test(url)) return "style";
1925
+ if (/\.(?:css|scss|sass)(?:$|[?#])/i.test(url)) return "style";
1925
1926
  return "module";
1926
1927
  };
1927
- var isSupportedDependency = (value) => value.startsWith(".") && SUPPORTED_DEPENDENCY_RE.test(value);
1928
+ var isSupportedDependency = (value) => value.startsWith(".") && (SUPPORTED_DEPENDENCY_RE.test(value) || /\.m(?:$|[?#])/.test(value) || !/\.[^/]+$/.test(value.split(/[?#]/)[0]));
1928
1929
  var resolveDependencyUrl = (specifier, importer) => {
1929
1930
  const fallbackBase = typeof location === "undefined" ? "http://localhost/" : location.href;
1930
1931
  return new URL(specifier, new URL(importer, fallbackBase)).href;
1931
1932
  };
1932
- var collectStyleImports = (code) => [...code.matchAll(STYLE_IMPORT_RE)].map((match) => match[2] || match[3] || match[5]);
1933
+ var collectStyleImports = (code) => [...code.matchAll(STYLE_IMPORT_RE)].map((match) => match[2] || match[3] || match[5]).filter((value) => !/^(?:[a-z][a-z\d+.-]*:|\/)/i.test(value)).map((value) => value.startsWith(".") ? value : `./${value}`);
1933
1934
  var collectModuleImports = async (code) => {
1934
1935
  await es_module_lexer.init;
1935
- return (0, es_module_lexer.parse)(code)[0].map((item) => item.n).filter((item) => Boolean(item));
1936
+ try {
1937
+ return (0, es_module_lexer.parse)(code)[0].filter((item) => !/^(?:import|export)\s+type\b(?!\s+from\b)/.test(code.slice(item.ss, item.se))).map((item) => item.n).filter((item) => Boolean(item));
1938
+ } catch {
1939
+ return [...code.replace(/\b(?:import|export)\s+type\b(?!\s+from\b)\s*(?:\{[^}]*\}|\*\s+as\s+[\w$]+|[\w$]+)(?:\s+from\s*(['"])[^'"]+\1)?\s*;?/g, "").matchAll(/(?:\bfrom\s+|import\s*\(\s*|import\s+)['"]([^'"]+)['"]/g)].map((match) => match[1]);
1940
+ }
1936
1941
  };
1937
1942
  var collectResourceImports = async (code, type) => {
1938
1943
  if (type === "style") return [...new Set(collectStyleImports(code))];
@@ -1957,6 +1962,189 @@ var toLogicalResourceSource = (config, lang, url) => {
1957
1962
  if (resolved.origin !== root.origin || !resolved.pathname.startsWith(root.pathname)) return resolved.href;
1958
1963
  return `./${resolved.pathname.slice(root.pathname.length)}${resolved.search}${resolved.hash}`;
1959
1964
  };
1965
+ /**
1966
+ * 远程静态文件没有 Vite 的扩展名补全,按源码类型探测实际文件。
1967
+ * @param specifier 源码中的相对引用。
1968
+ * @param importer 发起引用的源文件 URL。
1969
+ * @param style 是否使用 Sass 样式路径规则。
1970
+ * @returns 按优先级排列的候选 URL。
1971
+ */
1972
+ var dependencyUrlCandidates = (specifier, importer, style = false) => {
1973
+ const url = new URL(resolveDependencyUrl(specifier, importer));
1974
+ const path = url.pathname.replace(/\/$/, "");
1975
+ const partial = (value) => value.replace(/([^/]+)$/, "_$1");
1976
+ const hasExtension = SUPPORTED_DEPENDENCY_RE.test(path);
1977
+ const paths = style ? hasExtension ? [path, partial(path)] : [
1978
+ ".scss",
1979
+ ".sass",
1980
+ ".css"
1981
+ ].flatMap((ext) => [
1982
+ `${path}${ext}`,
1983
+ partial(`${path}${ext}`),
1984
+ `${path}/index${ext}`,
1985
+ `${path}/_index${ext}`
1986
+ ]) : hasExtension ? [path] : [
1987
+ path,
1988
+ ...[
1989
+ ".vue",
1990
+ ".ts",
1991
+ ".js",
1992
+ ".tsx",
1993
+ ".jsx",
1994
+ ".json"
1995
+ ].map((ext) => `${path}${ext}`),
1996
+ ...[
1997
+ ".vue",
1998
+ ".ts",
1999
+ ".js",
2000
+ ".tsx",
2001
+ ".jsx",
2002
+ ".json"
2003
+ ].map((ext) => `${path}/index${ext}`)
2004
+ ];
2005
+ return [...new Set(paths)].map((value) => {
2006
+ const candidate = new URL(url);
2007
+ candidate.pathname = value;
2008
+ return candidate.href;
2009
+ });
2010
+ };
2011
+ var collectResourceStyleImports = (code, type) => {
2012
+ if (type === "style") return collectStyleImports(code);
2013
+ if (type !== "sfc") return [];
2014
+ return [...code.matchAll(SFC_BLOCK_RE)].filter((match) => match[1].toLowerCase() === "style").flatMap((match) => collectStyleImports(match[3]));
2015
+ };
2016
+ var resolveDependencyRequestUrl = (url) => {
2017
+ const resolved = new URL(url, typeof location === "undefined" ? "http://localhost/" : location.href);
2018
+ if (resolved.hostname !== "raw.githubusercontent.com") return url;
2019
+ const index = resolved.pathname.indexOf("/node_modules/");
2020
+ return index < 0 ? url : `https://cdn.jsdelivr.net/npm/${resolved.pathname.slice(index + 14)}${resolved.search}`;
2021
+ };
2022
+ //#endregion
2023
+ //#region packages/client/src/utils/github-source.ts
2024
+ /**
2025
+ * GitHub Raw 不提供目录列表,用 Git tree 确定源码文件和 glob 匹配项。
2026
+ * @param rootUrl 入口源码的 URL。
2027
+ * @param signal 资源图的取消信号。
2028
+ * @returns GitHub 文件解析器,非 GitHub 地址返回 null。
2029
+ */
2030
+ var createGithubSourceResolver = (rootUrl, signal) => {
2031
+ const root = new URL(rootUrl, typeof location === "undefined" ? "http://localhost/" : location.href);
2032
+ const match = root.hostname === "raw.githubusercontent.com" ? root.pathname.match(/^\/([^/]+)\/([^/]+)\/(refs\/(?:heads|tags)\/)?([^/]+)\//) : null;
2033
+ if (!match) return null;
2034
+ const [, owner, repo, , ref] = match;
2035
+ const base = `${root.origin}${match[0]}`;
2036
+ let pending;
2037
+ let globTree;
2038
+ const tree = () => {
2039
+ pending ??= (async () => {
2040
+ try {
2041
+ const apiUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/${encodeURIComponent(ref)}?recursive=1`;
2042
+ const response = await fetch(apiUrl, { signal });
2043
+ if (!response.ok) return null;
2044
+ const data = await response.json();
2045
+ if (data.truncated) return null;
2046
+ return new Set(data.tree.filter((item) => item.type === "blob").map((item) => `${base}${item.path}`));
2047
+ } catch (reason) {
2048
+ if (signal?.aborted) throw reason;
2049
+ return null;
2050
+ }
2051
+ })();
2052
+ return pending;
2053
+ };
2054
+ const fallbackGlobTree = () => {
2055
+ globTree ??= (async () => {
2056
+ const url = `https://data.jsdelivr.com/v1/package/gh/${owner}/${repo}@${encodeURIComponent(ref)}/flat`;
2057
+ const response = await fetch(url, { signal });
2058
+ if (!response.ok) throw new Error(`[RemoteSfc] glob 备用文件清单加载失败: ${response.status}`);
2059
+ const data = await response.json();
2060
+ return new Set(data.files.map((item) => `${base}${item.name.replace(/^\//, "")}`));
2061
+ })();
2062
+ return globTree;
2063
+ };
2064
+ return {
2065
+ base,
2066
+ resolve: async (specifier, importer, style) => {
2067
+ const candidates = dependencyUrlCandidates(specifier, importer, style);
2068
+ if (!candidates[0].startsWith(base) || candidates[0].includes("/node_modules/")) return candidates;
2069
+ const files = await tree();
2070
+ if (!files) return candidates;
2071
+ const found = candidates.find((value) => files.has(value.split(/[?#]/)[0]));
2072
+ if (!found) throw new Error(`[RemoteSfc] 无法解析依赖 "${specifier}"(来自 ${importer})`);
2073
+ return [found];
2074
+ },
2075
+ expandGlob: async (code, importer) => {
2076
+ if (!code.includes("import.meta.glob")) return code;
2077
+ const files = await tree() ?? await fallbackGlobTree();
2078
+ const imports = [];
2079
+ const transformed = code.replace(/import\.meta\.glob(?:<[^;\n]+?>)?\(\s*(['"])([^'"]+)\1\s*,\s*\{\s*eager\s*:\s*true\s*\}\s*\)/g, (_call, _quote, pattern) => {
2080
+ const expression = new URL(pattern, importer).href.split("*").map((part) => part.replace(/[.+?^${}()|[\]\\]/g, "\\$&")).join("[^/]*");
2081
+ const matcher = new RegExp(`^${expression}$`);
2082
+ const directory = new URL(".", importer).href;
2083
+ return `({${[...files].filter((value) => matcher.test(value)).sort().map((value) => {
2084
+ const path = `./${value.slice(directory.length)}`;
2085
+ const name = `__docs_glob_${imports.length}`;
2086
+ imports.push(`import * as ${name} from ${JSON.stringify(path)};`);
2087
+ return `${JSON.stringify(path)}: ${name}`;
2088
+ }).join(",")}})`;
2089
+ });
2090
+ if (transformed.includes("import.meta.glob")) throw new Error(`[RemoteSfc] 不支持的 glob 调用: ${importer}`);
2091
+ return `${imports.join("\n")}\n${transformed}`;
2092
+ }
2093
+ };
2094
+ };
2095
+ var rewritePackageStyleImports = (code) => code.replace(/@import\s+(['"])([^.'"/][^'"]*\.css)\1/g, (statement, quote, path) => /^[a-z][a-z\d+.-]*:/i.test(path) ? statement : `@import ${quote}https://cdn.jsdelivr.net/npm/${path}${quote}`);
2096
+ //#endregion
2097
+ //#region packages/client/src/utils/source-dependencies.ts
2098
+ var assertResolvableSourceGlobs = (code, url) => {
2099
+ if (code.includes("import.meta.glob")) throw new Error(`[RemoteSfc] 普通 HTTP 资源无法枚举 glob 文件,请使用显式 import 或预先展开的文件清单: ${url}`);
2100
+ };
2101
+ var createResourceDependencyResolver = (knownUrls = []) => {
2102
+ const files = new Set(knownUrls);
2103
+ const resolutions = /* @__PURE__ */ new Map();
2104
+ const githubResolvers = [];
2105
+ return async (code, type, url, probe) => {
2106
+ files.add(url);
2107
+ if (/\.json(?:$|[?#])/i.test(url)) return [];
2108
+ let github = githubResolvers.find((resolver) => url.startsWith(resolver.base));
2109
+ if (!github) {
2110
+ github = createGithubSourceResolver(url) ?? void 0;
2111
+ if (github) githubResolvers.push(github);
2112
+ }
2113
+ let source = code;
2114
+ if (type === "module") {
2115
+ if (github) source = await github.expandGlob(source, url);
2116
+ }
2117
+ if (!github && type !== "style") assertResolvableSourceGlobs(source, url);
2118
+ if (type === "style") source = rewritePackageStyleImports(source);
2119
+ const imports = await collectResourceImports(source, type);
2120
+ const styles = collectResourceStyleImports(source, type);
2121
+ return await Promise.all(imports.filter(isSupportedDependency).map(async (specifier) => {
2122
+ const style = styles.includes(specifier) || /\.(?:scss|sass)(?:$|[?#])/i.test(specifier);
2123
+ const candidates = github ? await github.resolve(specifier, url, style) : dependencyUrlCandidates(specifier, url, style);
2124
+ const found = candidates.find((candidate) => files.has(candidate));
2125
+ if (found) return resolveDependencyRequestUrl(found);
2126
+ if (!probe || candidates.length === 1) return resolveDependencyRequestUrl(candidates[0]);
2127
+ const key = JSON.stringify(candidates);
2128
+ let pending = resolutions.get(key);
2129
+ if (!pending) {
2130
+ pending = (async () => {
2131
+ for (let index = 0;; index += 1) {
2132
+ const candidate = candidates[index];
2133
+ try {
2134
+ await probe(candidate);
2135
+ files.add(candidate);
2136
+ return candidate;
2137
+ } catch (reason) {
2138
+ if (!(reason instanceof ResourceRequestError) || reason.status !== 404 || index === candidates.length - 1) throw reason;
2139
+ }
2140
+ }
2141
+ })();
2142
+ resolutions.set(key, pending);
2143
+ }
2144
+ return resolveDependencyRequestUrl(await pending);
2145
+ }));
2146
+ };
2147
+ };
1960
2148
  //#endregion
1961
2149
  //#region packages/client/src/utils/content.ts
1962
2150
  var isRendererDocument = (value) => Boolean(value && typeof value === "object" && "schemaVersion" in value);
@@ -1998,7 +2186,7 @@ var writeHomeContent = (config, lang, value) => {
1998
2186
  };
1999
2187
  //#endregion
2000
2188
  //#region packages/client/src/utils/components.ts
2001
- var isPlainObject$1 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2189
+ var isPlainObject$2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2002
2190
  /**
2003
2191
  * 归一化站点 Markdown 排版皮肤;非法值回退 `default`。
2004
2192
  * @param value `components.markdown.theme`。
@@ -2012,7 +2200,7 @@ var resolveDocsMarkdownTheme = (value) => value === "traditional" ? "traditional
2012
2200
  */
2013
2201
  var resolveDocsMarkdownComponent = (config) => {
2014
2202
  const markdown = config.components?.markdown;
2015
- if (!isPlainObject$1(markdown)) return { theme: "default" };
2203
+ if (!isPlainObject$2(markdown)) return { theme: "default" };
2016
2204
  const options = { theme: resolveDocsMarkdownTheme(markdown.theme) };
2017
2205
  if ("indicator" in markdown) options.indicator = markdown.indicator;
2018
2206
  return options;
@@ -2024,7 +2212,7 @@ var resolveDocsMarkdownComponent = (config) => {
2024
2212
  */
2025
2213
  var resolveDocsPlaygroundComponent = (config) => {
2026
2214
  const playground = config.components?.playground;
2027
- if (!isPlainObject$1(playground)) return {};
2215
+ if (!isPlainObject$2(playground)) return {};
2028
2216
  return { ...playground };
2029
2217
  };
2030
2218
  var RENDERER_FITS = /* @__PURE__ */ new Set([
@@ -2039,7 +2227,7 @@ var RENDERER_FITS = /* @__PURE__ */ new Set([
2039
2227
  */
2040
2228
  var resolveDocsRendererComponent = (config) => {
2041
2229
  const renderer = config.components?.renderer;
2042
- if (!isPlainObject$1(renderer)) return {};
2230
+ if (!isPlainObject$2(renderer)) return {};
2043
2231
  const options = {};
2044
2232
  if (typeof renderer.fit === "string" && RENDERER_FITS.has(renderer.fit)) options.fit = renderer.fit;
2045
2233
  return options;
@@ -2047,7 +2235,7 @@ var resolveDocsRendererComponent = (config) => {
2047
2235
  //#endregion
2048
2236
  //#region packages/client/src/components/renderer/markdown-props.ts
2049
2237
  var INDICATOR_POSITIONS = /* @__PURE__ */ new Set(["left", "right"]);
2050
- var isPlainObject = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2238
+ var isPlainObject$1 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2051
2239
  /**
2052
2240
  * 规范化指示器配置。非法值丢弃,合法对象只保留已知字段。
2053
2241
  * @param value 原始 indicator。
@@ -2055,7 +2243,7 @@ var isPlainObject = (value) => Boolean(value) && typeof value === "object" && !A
2055
2243
  */
2056
2244
  var normalizeDocsMarkdownIndicator = (value) => {
2057
2245
  if (value === true || value === false) return value;
2058
- if (!isPlainObject(value)) return void 0;
2246
+ if (!isPlainObject$1(value)) return void 0;
2059
2247
  const options = {};
2060
2248
  if (typeof value.preview === "boolean") options.preview = value.preview;
2061
2249
  if (typeof value.draggable === "boolean") options.draggable = value.draggable;
@@ -2070,7 +2258,7 @@ var normalizeDocsMarkdownIndicator = (value) => {
2070
2258
  * @returns 可写入模块 props 的 options。
2071
2259
  */
2072
2260
  var normalizeDocsMarkdownOptions = (value) => {
2073
- if (!isPlainObject(value)) return void 0;
2261
+ if (!isPlainObject$1(value)) return void 0;
2074
2262
  const options = { ...value };
2075
2263
  if ("indicator" in options) {
2076
2264
  const indicator = normalizeDocsMarkdownIndicator(options.indicator);
@@ -2085,7 +2273,7 @@ var normalizeDocsMarkdownOptions = (value) => {
2085
2273
  * @returns source / content / options。
2086
2274
  */
2087
2275
  var normalizeDocsMarkdownProps = (value) => {
2088
- const record = isPlainObject(value) ? value : {};
2276
+ const record = isPlainObject$1(value) ? value : {};
2089
2277
  const props = { source: typeof record.source === "string" ? record.source : "" };
2090
2278
  if (typeof record.content === "string") props.content = record.content;
2091
2279
  const options = normalizeDocsMarkdownOptions(record.options);
@@ -2123,8 +2311,8 @@ var docsMarkdownIndicator = (options) => {
2123
2311
  var docsMarkdownInlineContent = (props) => typeof props.content === "string" ? props.content : void 0;
2124
2312
  //#endregion
2125
2313
  //#region packages/client/src/components/renderer/markdown.vue?vue&type=script&setup=true&lang.ts
2126
- var _hoisted_1$28 = { class: "docs-renderer-markdown" };
2127
- var _hoisted_2$23 = {
2314
+ var _hoisted_1$29 = { class: "docs-renderer-markdown" };
2315
+ var _hoisted_2$24 = {
2128
2316
  key: 0,
2129
2317
  class: "docs-renderer-markdown__error"
2130
2318
  };
@@ -2220,7 +2408,7 @@ var markdown_default = /* @__PURE__ */ (0, vue.defineComponent)({
2220
2408
  unsubscribe?.();
2221
2409
  });
2222
2410
  return (_ctx, _cache) => {
2223
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$28, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$23, (0, vue.toDisplayString)(error.value), 1)) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$17, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_markdown.Markdown), {
2411
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$29, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$24, (0, vue.toDisplayString)(error.value), 1)) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$17, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_markdown.Markdown), {
2224
2412
  key: 2,
2225
2413
  value: content.value,
2226
2414
  indicator: indicator.value,
@@ -2239,10 +2427,10 @@ var markdown_default = /* @__PURE__ */ (0, vue.defineComponent)({
2239
2427
  });
2240
2428
  //#endregion
2241
2429
  //#region packages/client/src/components/renderer/markdown-editor.vue?vue&type=script&setup=true&lang.ts
2242
- var _hoisted_1$27 = { class: "docs-renderer-module-editor" };
2243
- var _hoisted_2$22 = { class: "docs-renderer-field is-wide" };
2430
+ var _hoisted_1$28 = { class: "docs-renderer-module-editor" };
2431
+ var _hoisted_2$23 = { class: "docs-renderer-field is-wide" };
2244
2432
  var _hoisted_3$16 = { class: "docs-renderer-field is-wide" };
2245
- var _hoisted_4$10 = { class: "docs-renderer-field is-wide is-inline" };
2433
+ var _hoisted_4$11 = { class: "docs-renderer-field is-wide is-inline" };
2246
2434
  //#endregion
2247
2435
  //#region packages/client/src/components/renderer/markdown-editor.vue
2248
2436
  var markdown_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -2281,8 +2469,8 @@ var markdown_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
2281
2469
  } });
2282
2470
  };
2283
2471
  return (_ctx, _cache) => {
2284
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$27, [
2285
- (0, vue.createElementVNode)("div", _hoisted_2$22, [(0, vue.createElementVNode)("label", null, (0, vue.toDisplayString)((0, vue.unref)(t)("renderer.editor.source")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Input), {
2472
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$28, [
2473
+ (0, vue.createElementVNode)("div", _hoisted_2$23, [(0, vue.createElementVNode)("label", null, (0, vue.toDisplayString)((0, vue.unref)(t)("renderer.editor.source")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Input), {
2286
2474
  "model-value": String(__props.modelValue.source || ""),
2287
2475
  placeholder: (0, vue.unref)(t)("renderer.editor.markdownSourceHint"),
2288
2476
  "onUpdate:modelValue": _cache[0] || (_cache[0] = (value) => update({ source: value }))
@@ -2293,7 +2481,7 @@ var markdown_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
2293
2481
  placeholder: (0, vue.unref)(t)("renderer.editor.markdownContentHint"),
2294
2482
  "onUpdate:modelValue": handleContent
2295
2483
  }, null, 8, ["model-value", "placeholder"])]),
2296
- (0, vue.createElementVNode)("div", _hoisted_4$10, [(0, vue.createElementVNode)("label", null, (0, vue.toDisplayString)((0, vue.unref)(t)("markdown.indicator.label")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Switch), {
2484
+ (0, vue.createElementVNode)("div", _hoisted_4$11, [(0, vue.createElementVNode)("label", null, (0, vue.toDisplayString)((0, vue.unref)(t)("markdown.indicator.label")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Switch), {
2297
2485
  "model-value": indicatorEnabled.value,
2298
2486
  "onUpdate:modelValue": patchIndicator
2299
2487
  }, null, 8, ["model-value"])])
@@ -2302,13 +2490,158 @@ var markdown_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
2302
2490
  }
2303
2491
  });
2304
2492
  //#endregion
2493
+ //#region packages/client/src/modules/preview/config.ts
2494
+ var previewConfigKey = Symbol("preview-config");
2495
+ var isPlainObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
2496
+ var playgroundFields = [
2497
+ "local",
2498
+ "styleless",
2499
+ "views",
2500
+ "viewport",
2501
+ "previewInset",
2502
+ "expandable",
2503
+ "previewScroller",
2504
+ "title"
2505
+ ];
2506
+ var normalizePlayground = (value) => {
2507
+ if (!isPlainObject(value)) throw new TypeError("playground must be an object");
2508
+ return Object.fromEntries(playgroundFields.filter((key) => key in value).map((key) => [key, value[key]]));
2509
+ };
2510
+ /**
2511
+ * 校验链接中可序列化的预览配置,不混入站点配置。
2512
+ * @param value JSON 解码后的配置。
2513
+ * @returns 规范化的预览配置。
2514
+ */
2515
+ var normalizePreviewConfig = (value) => {
2516
+ if (!isPlainObject(value)) throw new TypeError("raw must contain a configuration object");
2517
+ const input = value;
2518
+ if (typeof input.url !== "string" || !input.url.trim()) throw new TypeError("url must be a non-empty string");
2519
+ if (input.styles !== void 0 && (!Array.isArray(input.styles) || input.styles.some((item) => typeof item !== "string"))) throw new TypeError("styles must be an array of URL strings");
2520
+ if (input.modules !== void 0 && (!isPlainObject(input.modules) || Object.entries(input.modules).some(([key, url]) => !key.trim() || typeof url !== "string" || !url.trim()))) throw new TypeError("modules must map module names to URL strings");
2521
+ if (input.lang !== void 0 && typeof input.lang !== "string") throw new TypeError("lang must be a string");
2522
+ return {
2523
+ url: input.url.trim(),
2524
+ styles: input.styles || [],
2525
+ modules: input.modules || {},
2526
+ ...input.lang ? { lang: input.lang } : {},
2527
+ ...input.playground !== void 0 ? { playground: normalizePlayground(input.playground) } : {}
2528
+ };
2529
+ };
2530
+ /**
2531
+ * raw 是完整配置;未指定时兼容现有 url/styles/lang 查询参数。
2532
+ * @param query Vue Router 已解码的查询参数。
2533
+ * @returns 当前链接的预览配置。
2534
+ */
2535
+ var readPreviewConfig = (query) => {
2536
+ if (query.raw !== void 0) {
2537
+ if (typeof query.raw !== "string" || !query.raw) throw new TypeError("raw must be a single encoded configuration");
2538
+ return normalizePreviewConfig(JSON.parse((0, _deot_helper_unicode.decode)(query.raw)));
2539
+ }
2540
+ const styles = Array.isArray(query.styles) ? query.styles : typeof query.styles === "string" ? query.styles.split(",") : [];
2541
+ return {
2542
+ url: typeof query.url === "string" ? query.url.trim() : "",
2543
+ styles: styles.filter((item) => typeof item === "string"),
2544
+ modules: {},
2545
+ ...typeof query.lang === "string" ? { lang: query.lang } : {}
2546
+ };
2547
+ };
2548
+ /**
2549
+ * 使用 Unicode helper 编码并正确转义 Base64 的 +、/、=。
2550
+ * @param config 预览配置。
2551
+ * @param base 站点部署根地址。
2552
+ * @returns 可直接分享的预览链接。
2553
+ */
2554
+ var createPreviewUrl = (config, base) => {
2555
+ const url = new URL("__docs/preview", base);
2556
+ url.searchParams.set("raw", (0, _deot_helper_unicode.encode)(JSON.stringify(config)));
2557
+ return url.href;
2558
+ };
2559
+ /**
2560
+ * 根据资源 URL 的 pathname 选择预览组件。
2561
+ * @param source 资源地址。
2562
+ * @param base 解析相对地址的页面地址。
2563
+ * @returns 支持的资源类型;其他资源返回 undefined。
2564
+ */
2565
+ var resolvePreviewType = (source, base) => {
2566
+ const url = new URL(source, base);
2567
+ if (!/^https?:$/.test(url.protocol)) return void 0;
2568
+ if (/\.vue$/i.test(url.pathname)) return "sfc";
2569
+ if (/(?:^|\/|\.)page\.json$/i.test(url.pathname)) return "page";
2570
+ };
2571
+ //#endregion
2572
+ //#region packages/client/src/modules/preview/styles.ts
2573
+ /**
2574
+ * 单个 styles 参数按逗号分隔;重复参数各自是一条完整 URL。
2575
+ * @param value Router 已解码的 styles 参数。
2576
+ * @param base 用于解析站点根路径的页面地址。
2577
+ * @returns 按声明顺序去重的样式 URL。
2578
+ */
2579
+ var parsePreviewStyleUrls = (value, base) => {
2580
+ const items = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
2581
+ return [...new Set(items.flatMap((item) => {
2582
+ const href = item?.trim();
2583
+ if (!href) return [];
2584
+ if (href.includes("\\") || !/^https?:\/\//i.test(href) && !(href.startsWith("/") && !href.startsWith("//"))) throw new TypeError(`Invalid stylesheet URL: ${href}`);
2585
+ const url = new URL(href, base);
2586
+ if (!/^https?:$/.test(url.protocol)) throw new TypeError(`Invalid stylesheet URL: ${href}`);
2587
+ return [url.href];
2588
+ }))];
2589
+ };
2590
+ var sharedStyles = /* @__PURE__ */ new Map();
2591
+ /**
2592
+ * 复用同一 URL 的 stylesheet,只清理本工具创建且已无引用的节点。
2593
+ * @param urls 已归一化的样式 URL,按加载顺序排列。
2594
+ * @param onError 当前预览的样式加载错误回调。
2595
+ * @returns 释放当前预览引用的函数。
2596
+ */
2597
+ var acquirePreviewStyles = (urls, onError) => {
2598
+ const listener = (url) => onError(url);
2599
+ const records = [...new Set(urls)].map((url) => {
2600
+ let record = sharedStyles.get(url);
2601
+ if (!record) {
2602
+ const existing = [...document.querySelectorAll("link[rel~=\"stylesheet\"]")].find((link) => link.href === url && !link.disabled);
2603
+ const link = existing || document.createElement("link");
2604
+ record = {
2605
+ link,
2606
+ owned: !existing,
2607
+ listeners: /* @__PURE__ */ new Set(),
2608
+ failed: false,
2609
+ handleError: () => {
2610
+ record.failed = true;
2611
+ record.listeners.forEach((callback) => callback(url));
2612
+ }
2613
+ };
2614
+ sharedStyles.set(url, record);
2615
+ link.addEventListener("error", record.handleError);
2616
+ if (!existing) {
2617
+ link.rel = "stylesheet";
2618
+ link.href = url;
2619
+ link.setAttribute("data-docs-preview-style", "");
2620
+ document.head.appendChild(link);
2621
+ }
2622
+ }
2623
+ record.listeners.add(listener);
2624
+ if (record.failed) listener(url);
2625
+ return {
2626
+ url,
2627
+ record
2628
+ };
2629
+ });
2630
+ return () => records.forEach(({ url, record }) => {
2631
+ record.listeners.delete(listener);
2632
+ if (record.listeners.size || sharedStyles.get(url) !== record) return;
2633
+ record.link.removeEventListener("error", record.handleError);
2634
+ if (record.owned) record.link.remove();
2635
+ sharedStyles.delete(url);
2636
+ });
2637
+ };
2638
+ //#endregion
2305
2639
  //#region packages/client/src/components/remote-sfc/remote-sfc.vue?vue&type=script&setup=true&lang.ts
2306
- var _hoisted_1$26 = { class: "docs-remote-sfc" };
2307
- var _hoisted_2$21 = {
2640
+ var _hoisted_1$27 = {
2308
2641
  key: 0,
2309
2642
  class: "docs-remote-sfc__error"
2310
2643
  };
2311
- var _hoisted_3$15 = {
2644
+ var _hoisted_2$22 = {
2312
2645
  key: 1,
2313
2646
  class: "docs-remote-sfc__loading"
2314
2647
  };
@@ -2325,6 +2658,7 @@ var remote_sfc_default = /* @__PURE__ */ (0, vue.defineComponent)({
2325
2658
  const { locale, t } = (0, _deot_docs_locale.useLocale)();
2326
2659
  const router = (0, vue_router.useRouter)();
2327
2660
  const config = getDocsConfig();
2661
+ const preview = (0, vue.inject)(previewConfigKey, void 0);
2328
2662
  const loading = (0, vue.ref)(true);
2329
2663
  const error = (0, vue.ref)("");
2330
2664
  const files = (0, vue.ref)({});
@@ -2335,29 +2669,49 @@ var remote_sfc_default = /* @__PURE__ */ (0, vue.defineComponent)({
2335
2669
  let controller;
2336
2670
  let generation = 0;
2337
2671
  const playgroundDefaults = (0, vue.computed)(() => resolveDocsPlaygroundComponent(config));
2672
+ const previewModules = (0, vue.computed)(() => JSON.stringify(preview?.value?.modules || {}));
2673
+ const previewPlayground = (0, vue.computed)(() => JSON.stringify(preview?.value?.playground || {}));
2674
+ const playgroundOptions = (0, vue.computed)(() => {
2675
+ const siteOptions = playgroundDefaults.value.options || {};
2676
+ const siteImportMap = siteOptions.builtinImportMap || {};
2677
+ return {
2678
+ ...siteOptions,
2679
+ builtinImportMap: {
2680
+ ...siteImportMap,
2681
+ imports: {
2682
+ ...siteImportMap.imports,
2683
+ ...config.modules,
2684
+ ...JSON.parse(previewModules.value)
2685
+ }
2686
+ }
2687
+ };
2688
+ });
2338
2689
  const playgroundProps = (0, vue.computed)(() => {
2339
2690
  const site = playgroundDefaults.value;
2340
- const siteOptions = site.options && typeof site.options === "object" ? site.options : {};
2341
- const siteImportMap = siteOptions.builtinImportMap && typeof siteOptions.builtinImportMap === "object" ? siteOptions.builtinImportMap : {};
2342
- const siteImports = "imports" in siteImportMap && siteImportMap.imports && typeof siteImportMap.imports === "object" ? siteImportMap.imports : {};
2691
+ const overrides = JSON.parse(previewPlayground.value);
2343
2692
  return {
2344
2693
  ...site,
2345
2694
  files: files.value,
2346
2695
  entry: entry.value,
2347
2696
  locale: locale.value,
2348
2697
  styleless: true,
2349
- options: {
2350
- ...siteOptions,
2351
- builtinImportMap: {
2352
- ...siteImportMap,
2353
- imports: {
2354
- ...siteImports,
2355
- ...config.modules
2356
- }
2357
- }
2358
- }
2698
+ ...overrides,
2699
+ local: overrides.local ?? site.local ?? true,
2700
+ ...previewStyleHead.value ? { previewOptions: {
2701
+ ...site.previewOptions,
2702
+ headHTML: `${site.previewOptions?.headHTML || ""}${previewStyleHead.value}`
2703
+ } } : {},
2704
+ options: playgroundOptions.value
2359
2705
  };
2360
2706
  });
2707
+ const useIframeViewport = (0, vue.computed)(() => !!preview?.value && !playgroundProps.value.local && playgroundProps.value.styleless && !Array.isArray(playgroundProps.value.viewport));
2708
+ const previewStyleHead = (0, vue.computed)(() => {
2709
+ try {
2710
+ return parsePreviewStyleUrls(preview?.value?.styles, location.href).map((url) => `<link rel="stylesheet" href="${url.replaceAll("&", "&amp;").replaceAll("\"", "&quot;")}">`).join("");
2711
+ } catch {
2712
+ return "";
2713
+ }
2714
+ });
2361
2715
  const clearSubscriptions = () => {
2362
2716
  while (subscriptions.length) subscriptions.pop()?.();
2363
2717
  };
@@ -2388,12 +2742,12 @@ var remote_sfc_default = /* @__PURE__ */ (0, vue.defineComponent)({
2388
2742
  lang: langSnapshot
2389
2743
  });
2390
2744
  if (current !== generation || activeController.signal.aborted) return;
2745
+ const github = createGithubSourceResolver(rootUrl, activeController.signal);
2391
2746
  const nextFiles = {};
2392
2747
  const visited = /* @__PURE__ */ new Set();
2393
2748
  const activeLoads = /* @__PURE__ */ new Set();
2394
2749
  const visit = async (url, logicalSource) => {
2395
2750
  if (current !== generation || visited.has(url)) return;
2396
- visited.add(url);
2397
2751
  const type = getResourceType(url);
2398
2752
  const source = logicalSource || toLogicalResourceSource(config, langSnapshot, url);
2399
2753
  const identity = createResourceIdentity(config, langSnapshot, type, source);
@@ -2401,12 +2755,11 @@ var remote_sfc_default = /* @__PURE__ */ (0, vue.defineComponent)({
2401
2755
  const reload = () => {
2402
2756
  if (!activeLoads.has(key)) loadFiles();
2403
2757
  };
2404
- subscriptions.push(Gateway.subscribe(identity, reload));
2405
2758
  activeLoads.add(key);
2406
2759
  let record;
2407
2760
  try {
2408
2761
  record = await Gateway.load(identity, {
2409
- url,
2762
+ url: resolveDependencyRequestUrl(url),
2410
2763
  priority: 100,
2411
2764
  signal: activeController.signal
2412
2765
  });
@@ -2414,11 +2767,24 @@ var remote_sfc_default = /* @__PURE__ */ (0, vue.defineComponent)({
2414
2767
  activeLoads.delete(key);
2415
2768
  }
2416
2769
  if (current !== generation) return;
2417
- nextFiles[getFilename(url, langSnapshot)] = record.content;
2418
- const imports = await collectResourceImports(record.content, type);
2770
+ visited.add(url);
2771
+ subscriptions.push(Gateway.subscribe(identity, reload));
2772
+ let content = github && type === "module" ? await github.expandGlob(record.content, url) : record.content;
2773
+ if (!github && type !== "style") assertResolvableSourceGlobs(content, url);
2774
+ if (github && type === "style") content = rewritePackageStyleImports(content);
2775
+ nextFiles[getFilename(url, langSnapshot)] = content;
2776
+ const imports = /\.json(?:$|[?#])/i.test(url) ? [] : await collectResourceImports(content, type);
2777
+ const styles = collectResourceStyleImports(content, type);
2419
2778
  await Promise.all(imports.filter(isSupportedDependency).map(async (value) => {
2420
- const dependency = resolveDependencyUrl(value, url);
2421
- await visit(dependency);
2779
+ const style = styles.includes(value) || /\.(?:scss|sass)(?:$|[?#])/i.test(value);
2780
+ const candidates = github ? await github.resolve(value, url, style) : dependencyUrlCandidates(value, url, style);
2781
+ if (candidates.some((dependency) => visited.has(dependency))) return;
2782
+ for (const [index, dependency] of candidates.entries()) try {
2783
+ await visit(dependency);
2784
+ break;
2785
+ } catch (reason) {
2786
+ if (visited.has(dependency) || !(reason instanceof ResourceRequestError) || reason.status !== 404 || index === candidates.length - 1) throw reason;
2787
+ }
2422
2788
  }));
2423
2789
  };
2424
2790
  await visit(rootUrl, sourceSnapshot);
@@ -2457,7 +2823,7 @@ var remote_sfc_default = /* @__PURE__ */ (0, vue.defineComponent)({
2457
2823
  clearSubscriptions();
2458
2824
  });
2459
2825
  return (_ctx, _cache) => {
2460
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$26, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$21, (0, vue.toDisplayString)(error.value), 1)) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$15, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : PlaygroundComponent.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)(PlaygroundComponent.value), (0, vue.mergeProps)({ key: revision.value }, playgroundProps.value, { onNavigate: handleNavigate }), null, 16)) : (0, vue.createCommentVNode)("v-if", true)]);
2826
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["docs-remote-sfc", { "docs-remote-sfc--viewport": useIframeViewport.value }]) }, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$27, (0, vue.toDisplayString)(error.value), 1)) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$22, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : PlaygroundComponent.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)(PlaygroundComponent.value), (0, vue.mergeProps)({ key: `${revision.value}:${playgroundProps.value.local}` }, playgroundProps.value, { onNavigate: handleNavigate }), null, 16)) : (0, vue.createCommentVNode)("v-if", true)], 2);
2461
2827
  };
2462
2828
  }
2463
2829
  });
@@ -2483,7 +2849,7 @@ var sfc_default = /* @__PURE__ */ (0, vue.defineComponent)({
2483
2849
  });
2484
2850
  //#endregion
2485
2851
  //#region packages/client/src/components/renderer/source-editor.vue?vue&type=script&setup=true&lang.ts
2486
- var _hoisted_1$25 = { class: "docs-renderer-module-editor" };
2852
+ var _hoisted_1$26 = { class: "docs-renderer-module-editor" };
2487
2853
  //#endregion
2488
2854
  //#region packages/client/src/components/renderer/source-editor.vue
2489
2855
  var source_editor_default$1 = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -2503,7 +2869,7 @@ var source_editor_default$1 = /* @__PURE__ */ (0, vue.defineComponent)({
2503
2869
  source
2504
2870
  });
2505
2871
  return (_ctx, _cache) => {
2506
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$25, [(0, vue.createElementVNode)("label", null, (0, vue.toDisplayString)((0, vue.unref)(t)("renderer.editor.source")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Input), {
2872
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$26, [(0, vue.createElementVNode)("label", null, (0, vue.toDisplayString)((0, vue.unref)(t)("renderer.editor.source")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Input), {
2507
2873
  "model-value": String(__props.modelValue.source || ""),
2508
2874
  "onUpdate:modelValue": handleUpdate
2509
2875
  }, null, 8, ["model-value"])]);
@@ -2918,6 +3284,7 @@ var ResourcePlanner = class {
2918
3284
  return parsedKeys;
2919
3285
  }
2920
3286
  async collectResourcesDepthFirst(config, collector, records) {
3287
+ const resolveDependencies = createResourceDependencyResolver(records.filter((record) => typeof record.content === "string").map((record) => record.url));
2921
3288
  const recordsByKey = new Map(records.map((record) => [resourceIdentityKey(record.identity), record]));
2922
3289
  const ordered = [];
2923
3290
  const visited = /* @__PURE__ */ new Set();
@@ -2946,20 +3313,19 @@ var ResourcePlanner = class {
2946
3313
  if (!record || typeof record.content !== "string") return;
2947
3314
  let imports;
2948
3315
  try {
2949
- imports = await collectResourceImports(record.content, identity.type);
3316
+ imports = await resolveDependencies(record.content, identity.type, record.url);
2950
3317
  } catch {
2951
3318
  return;
2952
3319
  }
2953
- for (const specifier of imports.filter(isSupportedDependency)) {
3320
+ for (const url of imports) {
2954
3321
  let source;
2955
3322
  try {
2956
- const url = resolveDependencyUrl(specifier, record.url);
2957
3323
  source = toLogicalResourceSource(config, identity.lang, url);
2958
3324
  } catch {
2959
3325
  continue;
2960
3326
  }
2961
- const candidate = createResourceIdentity(config, identity.lang, classifyResourceSource(source), source);
2962
- const dependency = collector.add(identity.lang, source) || collector.identities.get(resourceIdentityKey(candidate));
3327
+ const candidate = createResourceIdentity(config, identity.lang, getResourceType(source), source);
3328
+ const dependency = collector.add(identity.lang, source, getResourceType(source)) || collector.identities.get(resourceIdentityKey(candidate));
2963
3329
  if (dependency) await visit(dependency);
2964
3330
  }
2965
3331
  };
@@ -3166,6 +3532,7 @@ var ResourcePlanner = class {
3166
3532
  return results;
3167
3533
  }
3168
3534
  async collectDependencyResources({ config, collector, seeds, strict, loadResources }) {
3535
+ const resolveDependencies = createResourceDependencyResolver((await this.gateway.list()).filter((record) => typeof record.content === "string").map((record) => record.url));
3169
3536
  const results = [];
3170
3537
  const processed = /* @__PURE__ */ new Set();
3171
3538
  let queue = seeds;
@@ -3183,21 +3550,24 @@ var ResourcePlanner = class {
3183
3550
  }
3184
3551
  let imports;
3185
3552
  try {
3186
- imports = await collectResourceImports(record.content, identity.type);
3553
+ imports = await resolveDependencies(record.content, identity.type, record.url, async (url) => {
3554
+ const source = toLogicalResourceSource(config, identity.lang, url);
3555
+ const [result] = await loadResources([createResourceIdentity(config, identity.lang, getResourceType(url), source)]);
3556
+ if (result.status === "rejected") throw result.reason;
3557
+ });
3187
3558
  } catch (reason) {
3188
3559
  if (strict) throw reason;
3189
3560
  continue;
3190
3561
  }
3191
- for (const specifier of imports.filter(isSupportedDependency)) {
3562
+ for (const url of imports) {
3192
3563
  let source;
3193
3564
  try {
3194
- const url = resolveDependencyUrl(specifier, record.url);
3195
3565
  source = toLogicalResourceSource(config, identity.lang, url);
3196
3566
  } catch (reason) {
3197
3567
  if (strict) throw reason;
3198
3568
  continue;
3199
3569
  }
3200
- const dependency = collector.add(identity.lang, source);
3570
+ const dependency = collector.add(identity.lang, source, getResourceType(source));
3201
3571
  if (dependency) discovered.push(dependency);
3202
3572
  }
3203
3573
  }
@@ -4211,52 +4581,52 @@ var SearchManager = class {
4211
4581
  var Search = new SearchManager();
4212
4582
  //#endregion
4213
4583
  //#region packages/client/src/components/search/search.vue?vue&type=script&setup=true&lang.ts
4214
- var _hoisted_1$24 = ["aria-label"];
4215
- var _hoisted_2$20 = { class: "docs-search__header" };
4216
- var _hoisted_3$14 = ["placeholder", "aria-label"];
4217
- var _hoisted_4$9 = { class: "docs-search__actions" };
4218
- var _hoisted_5$7 = ["aria-label"];
4219
- var _hoisted_6$5 = { class: "docs-search__body" };
4220
- var _hoisted_7$5 = { class: "docs-search__content" };
4221
- var _hoisted_8$4 = {
4584
+ var _hoisted_1$25 = ["aria-label"];
4585
+ var _hoisted_2$21 = { class: "docs-search__header" };
4586
+ var _hoisted_3$15 = ["placeholder", "aria-label"];
4587
+ var _hoisted_4$10 = { class: "docs-search__actions" };
4588
+ var _hoisted_5$8 = ["aria-label"];
4589
+ var _hoisted_6$6 = { class: "docs-search__body" };
4590
+ var _hoisted_7$6 = { class: "docs-search__content" };
4591
+ var _hoisted_8$6 = {
4222
4592
  key: 0,
4223
4593
  class: "docs-search__state"
4224
4594
  };
4225
- var _hoisted_9$3 = {
4595
+ var _hoisted_9$4 = {
4226
4596
  key: 1,
4227
4597
  class: "docs-search__state docs-search__state--error"
4228
4598
  };
4229
- var _hoisted_10$3 = { class: "docs-search__group-title" };
4230
- var _hoisted_11$3 = [
4599
+ var _hoisted_10$4 = { class: "docs-search__group-title" };
4600
+ var _hoisted_11$4 = [
4231
4601
  "data-search-index",
4232
4602
  "onMouseenter",
4233
4603
  "onClick"
4234
4604
  ];
4235
- var _hoisted_12$3 = {
4605
+ var _hoisted_12$4 = {
4236
4606
  class: "docs-search__result-icon",
4237
4607
  "aria-hidden": "true"
4238
4608
  };
4239
- var _hoisted_13$2 = { class: "docs-search__result-content" };
4240
- var _hoisted_14$1 = { class: "docs-search__result-title" };
4241
- var _hoisted_15$1 = {
4609
+ var _hoisted_13$3 = { class: "docs-search__result-content" };
4610
+ var _hoisted_14$2 = { class: "docs-search__result-title" };
4611
+ var _hoisted_15$2 = {
4242
4612
  key: 0,
4243
4613
  class: "docs-search__result-parent"
4244
4614
  };
4245
- var _hoisted_16$1 = {
4615
+ var _hoisted_16$2 = {
4246
4616
  key: 1,
4247
4617
  class: "docs-search__result-excerpt"
4248
4618
  };
4249
- var _hoisted_17$1 = {
4619
+ var _hoisted_17$2 = {
4250
4620
  key: 0,
4251
4621
  class: "docs-search__state"
4252
4622
  };
4253
- var _hoisted_18 = { class: "docs-search__group-title" };
4254
- var _hoisted_19 = [
4623
+ var _hoisted_18$1 = { class: "docs-search__group-title" };
4624
+ var _hoisted_19$1 = [
4255
4625
  "data-search-index",
4256
4626
  "onMouseenter",
4257
4627
  "onClick"
4258
4628
  ];
4259
- var _hoisted_20 = { class: "docs-search__result-content" };
4629
+ var _hoisted_20$1 = { class: "docs-search__result-content" };
4260
4630
  var _hoisted_21 = { class: "docs-search__result-title" };
4261
4631
  var _hoisted_22 = {
4262
4632
  key: 0,
@@ -4466,7 +4836,7 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4466
4836
  "aria-label": (0, vue.unref)(t)("client.search.dialogLabel"),
4467
4837
  onKeydown: handleKeydown
4468
4838
  }, [
4469
- (0, vue.createElementVNode)("header", _hoisted_2$20, [
4839
+ (0, vue.createElementVNode)("header", _hoisted_2$21, [
4470
4840
  _cache[2] || (_cache[2] = (0, vue.createElementVNode)("span", {
4471
4841
  class: "docs-search__icon",
4472
4842
  "aria-hidden": "true"
@@ -4482,8 +4852,8 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4482
4852
  "aria-label": (0, vue.unref)(t)("client.search.placeholder"),
4483
4853
  onCompositionstart: _cache[1] || (_cache[1] = ($event) => composing.value = true),
4484
4854
  onCompositionend: handleCompositionEnd
4485
- }, null, 40, _hoisted_3$14), [[vue.vModelText, keyword.value]]),
4486
- (0, vue.createElementVNode)("div", _hoisted_4$9, [keyword.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4855
+ }, null, 40, _hoisted_3$15), [[vue.vModelText, keyword.value]]),
4856
+ (0, vue.createElementVNode)("div", _hoisted_4$10, [keyword.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4487
4857
  key: 0,
4488
4858
  class: "docs-search__clear",
4489
4859
  type: "button",
@@ -4493,9 +4863,9 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4493
4863
  type: "button",
4494
4864
  "aria-label": (0, vue.unref)(t)("client.search.close"),
4495
4865
  onClick: handleClose
4496
- }, " esc ", 8, _hoisted_5$7)])
4866
+ }, " esc ", 8, _hoisted_5$8)])
4497
4867
  ]),
4498
- (0, vue.createElementVNode)("div", _hoisted_6$5, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Scroller), {
4868
+ (0, vue.createElementVNode)("div", _hoisted_6$6, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Scroller), {
4499
4869
  class: "docs-search__scroller",
4500
4870
  "auto-resize": true,
4501
4871
  native: false,
@@ -4503,8 +4873,8 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4503
4873
  height: "100%",
4504
4874
  "wrapper-style": "overflow-x: hidden;"
4505
4875
  }, {
4506
- default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_7$5, [loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_8$4, (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.searching")), 1)) : error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_9$3, (0, vue.toDisplayString)(error.value), 1)) : keyword.value.trim() ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 2 }, [
4507
- (0, vue.createElementVNode)("div", _hoisted_10$3, (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.documentation")), 1),
4876
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_7$6, [loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_8$6, (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.searching")), 1)) : error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_9$4, (0, vue.toDisplayString)(error.value), 1)) : keyword.value.trim() ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 2 }, [
4877
+ (0, vue.createElementVNode)("div", _hoisted_10$4, (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.documentation")), 1),
4508
4878
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(results.value, (item, index) => {
4509
4879
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4510
4880
  key: `${item.id}:${item.kind}`,
@@ -4517,11 +4887,11 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4517
4887
  onMouseenter: ($event) => handleMouseenter(index),
4518
4888
  onClick: ($event) => handleSelect(item)
4519
4889
  }, [
4520
- (0, vue.createElementVNode)("span", _hoisted_12$3, (0, vue.toDisplayString)(item.kind === "section" ? "#" : "▤"), 1),
4521
- (0, vue.createElementVNode)("span", _hoisted_13$2, [(0, vue.createElementVNode)("span", _hoisted_14$1, [(0, vue.createVNode)(highlight_text_default, {
4890
+ (0, vue.createElementVNode)("span", _hoisted_12$4, (0, vue.toDisplayString)(item.kind === "section" ? "#" : "▤"), 1),
4891
+ (0, vue.createElementVNode)("span", _hoisted_13$3, [(0, vue.createElementVNode)("span", _hoisted_14$2, [(0, vue.createVNode)(highlight_text_default, {
4522
4892
  text: item.sectionTitle || item.title,
4523
4893
  keyword: keyword.value
4524
- }, null, 8, ["text", "keyword"])]), item.kind === "section" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_15$1, (0, vue.toDisplayString)(item.title), 1)) : item.excerpt ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_16$1, [(0, vue.createVNode)(highlight_text_default, {
4894
+ }, null, 8, ["text", "keyword"])]), item.kind === "section" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_15$2, (0, vue.toDisplayString)(item.title), 1)) : item.excerpt ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_16$2, [(0, vue.createVNode)(highlight_text_default, {
4525
4895
  text: item.excerpt,
4526
4896
  keyword: keyword.value
4527
4897
  }, null, 8, ["text", "keyword"])])) : (0, vue.createCommentVNode)("v-if", true)]),
@@ -4529,11 +4899,11 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4529
4899
  class: "docs-search__enter",
4530
4900
  "aria-hidden": "true"
4531
4901
  }, "↵", -1))
4532
- ], 42, _hoisted_11$3);
4902
+ ], 42, _hoisted_11$4);
4533
4903
  }), 128)),
4534
- !results.value.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_17$1, (0, vue.toDisplayString)(preparedCount.value ? (0, vue.unref)(t)("client.search.noResults") : (0, vue.unref)(t)("client.search.noCachedDocuments")), 1)) : (0, vue.createCommentVNode)("v-if", true)
4904
+ !results.value.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_17$2, (0, vue.toDisplayString)(preparedCount.value ? (0, vue.unref)(t)("client.search.noResults") : (0, vue.unref)(t)("client.search.noCachedDocuments")), 1)) : (0, vue.createCommentVNode)("v-if", true)
4535
4905
  ], 64)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 3 }, [
4536
- (0, vue.createElementVNode)("div", _hoisted_18, (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.recent")), 1),
4906
+ (0, vue.createElementVNode)("div", _hoisted_18$1, (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.recent")), 1),
4537
4907
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(history.value, (item, index) => {
4538
4908
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
4539
4909
  key: item.id,
@@ -4548,7 +4918,7 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4548
4918
  class: "docs-search__history-icon",
4549
4919
  "aria-hidden": "true"
4550
4920
  }, "↶", -1)),
4551
- (0, vue.createElementVNode)("span", _hoisted_20, [(0, vue.createElementVNode)("span", _hoisted_21, (0, vue.toDisplayString)(item.sectionTitle || item.title), 1), item.sectionTitle ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_22, (0, vue.toDisplayString)(item.title), 1)) : (0, vue.createCommentVNode)("v-if", true)]),
4921
+ (0, vue.createElementVNode)("span", _hoisted_20$1, [(0, vue.createElementVNode)("span", _hoisted_21, (0, vue.toDisplayString)(item.sectionTitle || item.title), 1), item.sectionTitle ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_22, (0, vue.toDisplayString)(item.title), 1)) : (0, vue.createCommentVNode)("v-if", true)]),
4552
4922
  (0, vue.createElementVNode)("button", {
4553
4923
  class: (0, vue.normalizeClass)(["docs-search__history-action", { "docs-search__history-action--active": item.pinned }]),
4554
4924
  type: "button",
@@ -4561,7 +4931,7 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4561
4931
  "aria-label": (0, vue.unref)(t)("client.search.remove"),
4562
4932
  onClick: (0, vue.withModifiers)(($event) => handleRemoveHistory(item.id), ["stop"])
4563
4933
  }, " × ", 8, _hoisted_24)
4564
- ], 42, _hoisted_19);
4934
+ ], 42, _hoisted_19$1);
4565
4935
  }), 128)),
4566
4936
  !history.value.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_25, (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.noRecent")), 1)) : (0, vue.createCommentVNode)("v-if", true)
4567
4937
  ], 64))])]),
@@ -4576,7 +4946,7 @@ var search_default = /* @__PURE__ */ (0, vue.defineComponent)({
4576
4946
  (0, vue.createElementVNode)("span", null, [_cache[7] || (_cache[7] = (0, vue.createElementVNode)("kbd", null, "↵", -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.selectHint")), 1)]),
4577
4947
  (0, vue.createElementVNode)("span", null, [_cache[8] || (_cache[8] = (0, vue.createElementVNode)("kbd", null, "ESC", -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.search.closeHint")), 1)])
4578
4948
  ])
4579
- ], 40, _hoisted_1$24)]);
4949
+ ], 40, _hoisted_1$25)]);
4580
4950
  };
4581
4951
  }
4582
4952
  });
@@ -4593,8 +4963,8 @@ var DocsSearch = new _deot_vc.Portal(search_default, {
4593
4963
  });
4594
4964
  //#endregion
4595
4965
  //#region packages/client/src/components/search/trigger.vue?vue&type=script&setup=true&lang.ts
4596
- var _hoisted_1$23 = ["aria-label"];
4597
- var _hoisted_2$19 = { class: "docs-search-trigger__shortcut" };
4966
+ var _hoisted_1$24 = ["aria-label"];
4967
+ var _hoisted_2$20 = { class: "docs-search-trigger__shortcut" };
4598
4968
  //#endregion
4599
4969
  //#region packages/client/src/components/search/trigger.vue
4600
4970
  var trigger_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -4638,7 +5008,7 @@ var trigger_default = /* @__PURE__ */ (0, vue.defineComponent)({
4638
5008
  }, [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("span", {
4639
5009
  class: "docs-search-trigger__icon",
4640
5010
  "aria-hidden": "true"
4641
- }, null, -1)), (0, vue.createElementVNode)("kbd", _hoisted_2$19, (0, vue.toDisplayString)((0, vue.unref)(shortcut)), 1)], 8, _hoisted_1$23);
5011
+ }, null, -1)), (0, vue.createElementVNode)("kbd", _hoisted_2$20, (0, vue.toDisplayString)((0, vue.unref)(shortcut)), 1)], 8, _hoisted_1$24);
4642
5012
  };
4643
5013
  }
4644
5014
  });
@@ -4747,12 +5117,12 @@ var CLIENT_ICON_DEFINITIONS = {
4747
5117
  };
4748
5118
  //#endregion
4749
5119
  //#region packages/client/src/components/icon/icon.vue?vue&type=script&setup=true&lang.ts
4750
- var _hoisted_1$22 = [
5120
+ var _hoisted_1$23 = [
4751
5121
  "data-icon",
4752
5122
  "fill",
4753
5123
  "stroke"
4754
5124
  ];
4755
- var _hoisted_2$18 = ["d"];
5125
+ var _hoisted_2$19 = ["d"];
4756
5126
  //#endregion
4757
5127
  //#region packages/client/src/components/icon/icon.vue
4758
5128
  var icon_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -4784,13 +5154,13 @@ var icon_default = /* @__PURE__ */ (0, vue.defineComponent)({
4784
5154
  "stroke-linecap": "round",
4785
5155
  "stroke-linejoin": "round",
4786
5156
  "aria-hidden": "true"
4787
- }, [(0, vue.createElementVNode)("path", { d: definition.value.path }, null, 8, _hoisted_2$18)], 12, _hoisted_1$22);
5157
+ }, [(0, vue.createElementVNode)("path", { d: definition.value.path }, null, 8, _hoisted_2$19)], 12, _hoisted_1$23);
4788
5158
  };
4789
5159
  }
4790
5160
  });
4791
5161
  //#endregion
4792
5162
  //#region packages/client/src/components/theme-toggler/index.vue?vue&type=script&setup=true&lang.ts
4793
- var _hoisted_1$21 = [
5163
+ var _hoisted_1$22 = [
4794
5164
  "aria-checked",
4795
5165
  "aria-label",
4796
5166
  "onKeydown"
@@ -4828,7 +5198,7 @@ var theme_toggler_default = /* @__PURE__ */ (0, vue.defineComponent)({
4828
5198
  }, null, 8, ["model-value"]), (0, vue.createVNode)((0, vue.unref)(icon_default), {
4829
5199
  name: isDark.value ? "moon" : "sun",
4830
5200
  class: (0, vue.normalizeClass)(["theme-toggler__icon", isDark.value ? "is-dark" : "is-light"])
4831
- }, null, 8, ["name", "class"])], 40, _hoisted_1$21)) : (0, vue.createCommentVNode)("v-if", true);
5201
+ }, null, 8, ["name", "class"])], 40, _hoisted_1$22)) : (0, vue.createCommentVNode)("v-if", true);
4832
5202
  };
4833
5203
  }
4834
5204
  });
@@ -4876,37 +5246,37 @@ var takeInlineRendererDocument = (from) => {
4876
5246
  };
4877
5247
  //#endregion
4878
5248
  //#region packages/client/src/components/layout/default-header.vue?vue&type=script&setup=true&lang.ts
4879
- var _hoisted_1$20 = { class: "docs-header" };
4880
- var _hoisted_2$17 = ["href"];
4881
- var _hoisted_3$13 = ["src"];
4882
- var _hoisted_4$8 = ["src"];
4883
- var _hoisted_5$6 = { class: "docs-header__search" };
4884
- var _hoisted_6$4 = ["aria-label"];
4885
- var _hoisted_7$4 = ["aria-expanded"];
4886
- var _hoisted_8$3 = ["href"];
4887
- var _hoisted_9$2 = { key: 2 };
4888
- var _hoisted_10$2 = ["href"];
4889
- var _hoisted_11$2 = {
5249
+ var _hoisted_1$21 = { class: "docs-header" };
5250
+ var _hoisted_2$18 = ["href"];
5251
+ var _hoisted_3$14 = ["src"];
5252
+ var _hoisted_4$9 = ["src"];
5253
+ var _hoisted_5$7 = { class: "docs-header__search" };
5254
+ var _hoisted_6$5 = ["aria-label"];
5255
+ var _hoisted_7$5 = ["aria-expanded"];
5256
+ var _hoisted_8$5 = ["href"];
5257
+ var _hoisted_9$3 = { key: 2 };
5258
+ var _hoisted_10$3 = ["href"];
5259
+ var _hoisted_11$3 = {
4890
5260
  key: 3,
4891
5261
  class: "docs-header__nav-item"
4892
5262
  };
4893
- var _hoisted_12$2 = { class: "docs-header__actions" };
4894
- var _hoisted_13$1 = {
5263
+ var _hoisted_12$3 = { class: "docs-header__actions" };
5264
+ var _hoisted_13$2 = {
4895
5265
  key: 0,
4896
5266
  class: "docs-header__locales"
4897
5267
  };
4898
- var _hoisted_14 = [
5268
+ var _hoisted_14$1 = [
4899
5269
  "title",
4900
5270
  "aria-label",
4901
5271
  "aria-expanded"
4902
5272
  ];
4903
- var _hoisted_15 = [
5273
+ var _hoisted_15$1 = [
4904
5274
  "href",
4905
5275
  "title",
4906
5276
  "aria-label"
4907
5277
  ];
4908
- var _hoisted_16 = { class: "docs-header__tools" };
4909
- var _hoisted_17 = [
5278
+ var _hoisted_16$1 = { class: "docs-header__tools" };
5279
+ var _hoisted_17$1 = [
4910
5280
  "title",
4911
5281
  "aria-label",
4912
5282
  "aria-expanded"
@@ -5069,7 +5439,7 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5069
5439
  if (action === "database") router.push(databasePath.value);
5070
5440
  };
5071
5441
  return (_ctx, _cache) => {
5072
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("header", _hoisted_1$20, [
5442
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("header", _hoisted_1$21, [
5073
5443
  brandExternal.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
5074
5444
  key: 0,
5075
5445
  class: "docs-header__brand",
@@ -5081,7 +5451,7 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5081
5451
  class: "docs-header__brand-logo",
5082
5452
  src: brandLogo.value,
5083
5453
  alt: ""
5084
- }, null, 8, _hoisted_3$13)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)], 8, _hoisted_2$17)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5454
+ }, null, 8, _hoisted_3$14)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)], 8, _hoisted_2$18)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5085
5455
  key: 1,
5086
5456
  class: "docs-header__brand",
5087
5457
  to: brandPath.value
@@ -5091,10 +5461,10 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5091
5461
  class: "docs-header__brand-logo",
5092
5462
  src: brandLogo.value,
5093
5463
  alt: ""
5094
- }, null, 8, _hoisted_4$8)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)]),
5464
+ }, null, 8, _hoisted_4$9)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(brandLabel.value), 1)]),
5095
5465
  _: 1
5096
5466
  }, 8, ["to"])),
5097
- (0, vue.createElementVNode)("div", _hoisted_5$6, [(0, vue.createVNode)((0, vue.unref)(trigger_default))]),
5467
+ (0, vue.createElementVNode)("div", _hoisted_5$7, [(0, vue.createVNode)((0, vue.unref)(trigger_default))]),
5098
5468
  navItems.value.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("nav", {
5099
5469
  key: 2,
5100
5470
  class: "docs-header__nav",
@@ -5126,13 +5496,13 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5126
5496
  href: child.value,
5127
5497
  target: "_blank",
5128
5498
  rel: "noopener noreferrer"
5129
- }, (0, vue.toDisplayString)(child.label), 9, _hoisted_8$3)) : child.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5499
+ }, (0, vue.toDisplayString)(child.label), 9, _hoisted_8$5)) : child.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5130
5500
  key: 1,
5131
5501
  to: (0, vue.unref)(localizePath)((0, vue.unref)(config), lang.value, child.value)
5132
5502
  }, {
5133
5503
  default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)(child.label), 1)]),
5134
5504
  _: 2
5135
- }, 1032, ["to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_9$2, (0, vue.toDisplayString)(child.label), 1))]),
5505
+ }, 1032, ["to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_9$3, (0, vue.toDisplayString)(child.label), 1))]),
5136
5506
  _: 2
5137
5507
  }, 1032, ["value"]);
5138
5508
  }), 128))]),
@@ -5143,7 +5513,7 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5143
5513
  class: (0, vue.normalizeClass)(["docs-header__nav-item docs-header__nav-trigger", { "is-active": isNavItemActive(item) }]),
5144
5514
  "aria-expanded": Boolean(navMenuVisible.value[index]),
5145
5515
  "aria-haspopup": "menu"
5146
- }, (0, vue.toDisplayString)(item.label), 11, _hoisted_7$4)]),
5516
+ }, (0, vue.toDisplayString)(item.label), 11, _hoisted_7$5)]),
5147
5517
  _: 2
5148
5518
  }, 1032, ["model-value", "onUpdate:modelValue"])) : item.value && (0, vue.unref)(isExternalLink)(item.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
5149
5519
  key: 1,
@@ -5151,18 +5521,18 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5151
5521
  href: item.value,
5152
5522
  target: "_blank",
5153
5523
  rel: "noopener noreferrer"
5154
- }, (0, vue.toDisplayString)(item.label), 9, _hoisted_10$2)) : item.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5524
+ }, (0, vue.toDisplayString)(item.label), 9, _hoisted_10$3)) : item.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5155
5525
  key: 2,
5156
5526
  class: (0, vue.normalizeClass)(["docs-header__nav-item", { "is-active": isNavItemActive(item) }]),
5157
5527
  to: (0, vue.unref)(localizePath)((0, vue.unref)(config), lang.value, item.value)
5158
5528
  }, {
5159
5529
  default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)(item.label), 1)]),
5160
5530
  _: 2
5161
- }, 1032, ["class", "to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_11$2, (0, vue.toDisplayString)(item.label), 1))], 64);
5162
- }), 128))], 8, _hoisted_6$4)) : (0, vue.createCommentVNode)("v-if", true),
5163
- (0, vue.createElementVNode)("div", _hoisted_12$2, [
5531
+ }, 1032, ["class", "to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_11$3, (0, vue.toDisplayString)(item.label), 1))], 64);
5532
+ }), 128))], 8, _hoisted_6$5)) : (0, vue.createCommentVNode)("v-if", true),
5533
+ (0, vue.createElementVNode)("div", _hoisted_12$3, [
5164
5534
  (0, vue.createVNode)((0, vue.unref)(theme_toggler_default), { class: "docs-header__theme" }),
5165
- localeOptions.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("nav", _hoisted_13$1, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Dropdown), {
5535
+ localeOptions.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("nav", _hoisted_13$2, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Dropdown), {
5166
5536
  modelValue: localeMenuVisible.value,
5167
5537
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => localeMenuVisible.value = $event),
5168
5538
  class: "docs-header__locale-dropdown",
@@ -5205,7 +5575,7 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5205
5575
  }, [(0, vue.createVNode)((0, vue.unref)(icon_default), {
5206
5576
  name: "language",
5207
5577
  size: 22
5208
- })], 8, _hoisted_14)]),
5578
+ })], 8, _hoisted_14$1)]),
5209
5579
  _: 1
5210
5580
  }, 8, ["modelValue"])])) : (0, vue.createCommentVNode)("v-if", true),
5211
5581
  repositoryHref.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
@@ -5219,8 +5589,8 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5219
5589
  }, [(0, vue.createVNode)((0, vue.unref)(icon_default), {
5220
5590
  name: repositoryIcon.value,
5221
5591
  size: 24
5222
- }, null, 8, ["name"])], 8, _hoisted_15)) : (0, vue.createCommentVNode)("v-if", true),
5223
- (0, vue.createElementVNode)("nav", _hoisted_16, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Dropdown), {
5592
+ }, null, 8, ["name"])], 8, _hoisted_15$1)) : (0, vue.createCommentVNode)("v-if", true),
5593
+ (0, vue.createElementVNode)("nav", _hoisted_16$1, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Dropdown), {
5224
5594
  modelValue: toolsMenuVisible.value,
5225
5595
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => toolsMenuVisible.value = $event),
5226
5596
  class: "docs-header__tools-dropdown",
@@ -5261,7 +5631,7 @@ var default_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5261
5631
  }, [(0, vue.createVNode)((0, vue.unref)(icon_default), {
5262
5632
  name: "more",
5263
5633
  size: 22
5264
- })], 8, _hoisted_17)]),
5634
+ })], 8, _hoisted_17$1)]),
5265
5635
  _: 1
5266
5636
  }, 8, ["modelValue"])])
5267
5637
  ])
@@ -5326,11 +5696,11 @@ var pickSidebarIconValue = (icon, selected) => {
5326
5696
  };
5327
5697
  //#endregion
5328
5698
  //#region packages/client/src/components/layout/sidebar-glyph.vue?vue&type=script&setup=true&lang.ts
5329
- var _hoisted_1$19 = {
5699
+ var _hoisted_1$20 = {
5330
5700
  key: 0,
5331
5701
  class: "docs-sidebar__icon"
5332
5702
  };
5333
- var _hoisted_2$16 = ["src"];
5703
+ var _hoisted_2$17 = ["src"];
5334
5704
  //#endregion
5335
5705
  //#region packages/client/src/components/layout/sidebar-glyph.vue
5336
5706
  var sidebar_glyph_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -5346,12 +5716,12 @@ var sidebar_glyph_default = /* @__PURE__ */ (0, vue.defineComponent)({
5346
5716
  const kind = (0, vue.computed)(() => resolveSidebarIconKind(value.value));
5347
5717
  const src = (0, vue.computed)(() => toSidebarIconSrc(value.value));
5348
5718
  return (_ctx, _cache) => {
5349
- return value.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_1$19, [kind.value === "url" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("img", {
5719
+ return value.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_1$20, [kind.value === "url" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("img", {
5350
5720
  key: 0,
5351
5721
  class: "docs-sidebar__media",
5352
5722
  src: src.value,
5353
5723
  alt: ""
5354
- }, null, 8, _hoisted_2$16)) : kind.value === "type" ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_vc.Icon), {
5724
+ }, null, 8, _hoisted_2$17)) : kind.value === "type" ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_vc.Icon), {
5355
5725
  key: 1,
5356
5726
  class: "docs-sidebar__glyph",
5357
5727
  type: value.value,
@@ -5362,23 +5732,23 @@ var sidebar_glyph_default = /* @__PURE__ */ (0, vue.defineComponent)({
5362
5732
  });
5363
5733
  //#endregion
5364
5734
  //#region packages/client/src/components/layout/default-sidebar.vue?vue&type=script&setup=true&lang.ts
5365
- var _hoisted_1$18 = ["href"];
5366
- var _hoisted_2$15 = { class: "docs-sidebar__text" };
5367
- var _hoisted_3$12 = {
5735
+ var _hoisted_1$19 = ["href"];
5736
+ var _hoisted_2$16 = { class: "docs-sidebar__text" };
5737
+ var _hoisted_3$13 = {
5368
5738
  key: 0,
5369
5739
  class: "docs-sidebar__tag"
5370
5740
  };
5371
- var _hoisted_4$7 = { class: "docs-sidebar__text" };
5372
- var _hoisted_5$5 = {
5741
+ var _hoisted_4$8 = { class: "docs-sidebar__text" };
5742
+ var _hoisted_5$6 = {
5373
5743
  key: 0,
5374
5744
  class: "docs-sidebar__tag"
5375
5745
  };
5376
- var _hoisted_6$3 = {
5746
+ var _hoisted_6$4 = {
5377
5747
  key: 2,
5378
5748
  class: "docs-sidebar__label"
5379
5749
  };
5380
- var _hoisted_7$3 = { class: "docs-sidebar__text" };
5381
- var _hoisted_8$2 = {
5750
+ var _hoisted_7$4 = { class: "docs-sidebar__text" };
5751
+ var _hoisted_8$4 = {
5382
5752
  key: 0,
5383
5753
  class: "docs-sidebar__tag"
5384
5754
  };
@@ -5417,9 +5787,9 @@ var default_sidebar_default = /* @__PURE__ */ (0, vue.defineComponent)({
5417
5787
  href: item.value
5418
5788
  }, [
5419
5789
  (0, vue.createVNode)(sidebar_glyph_default, { item }, null, 8, ["item"]),
5420
- (0, vue.createElementVNode)("span", _hoisted_2$15, (0, vue.toDisplayString)(item.label), 1),
5421
- item.tag ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_3$12, (0, vue.toDisplayString)(item.tag), 1)) : (0, vue.createCommentVNode)("v-if", true)
5422
- ], 8, _hoisted_1$18)) : item.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5790
+ (0, vue.createElementVNode)("span", _hoisted_2$16, (0, vue.toDisplayString)(item.label), 1),
5791
+ item.tag ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_3$13, (0, vue.toDisplayString)(item.tag), 1)) : (0, vue.createCommentVNode)("v-if", true)
5792
+ ], 8, _hoisted_1$19)) : item.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterLink), {
5423
5793
  key: 1,
5424
5794
  class: (0, vue.normalizeClass)(["docs-sidebar__link", { "is-active": isItemActive(item.value) }]),
5425
5795
  to: toPath(item.value)
@@ -5429,14 +5799,14 @@ var default_sidebar_default = /* @__PURE__ */ (0, vue.defineComponent)({
5429
5799
  item,
5430
5800
  selected: isItemActive(item.value)
5431
5801
  }, null, 8, ["item", "selected"]),
5432
- (0, vue.createElementVNode)("span", _hoisted_4$7, (0, vue.toDisplayString)(item.label), 1),
5433
- item.tag ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_5$5, (0, vue.toDisplayString)(item.tag), 1)) : (0, vue.createCommentVNode)("v-if", true)
5802
+ (0, vue.createElementVNode)("span", _hoisted_4$8, (0, vue.toDisplayString)(item.label), 1),
5803
+ item.tag ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_5$6, (0, vue.toDisplayString)(item.tag), 1)) : (0, vue.createCommentVNode)("v-if", true)
5434
5804
  ]),
5435
5805
  _: 2
5436
- }, 1032, ["class", "to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_6$3, [
5806
+ }, 1032, ["class", "to"])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_6$4, [
5437
5807
  (0, vue.createVNode)(sidebar_glyph_default, { item }, null, 8, ["item"]),
5438
- (0, vue.createElementVNode)("span", _hoisted_7$3, (0, vue.toDisplayString)(item.label), 1),
5439
- item.tag ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8$2, (0, vue.toDisplayString)(item.tag), 1)) : (0, vue.createCommentVNode)("v-if", true)
5808
+ (0, vue.createElementVNode)("span", _hoisted_7$4, (0, vue.toDisplayString)(item.label), 1),
5809
+ item.tag ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8$4, (0, vue.toDisplayString)(item.tag), 1)) : (0, vue.createCommentVNode)("v-if", true)
5440
5810
  ])), item.children?.length ? ((0, vue.openBlock)(), (0, vue.createBlock)(_component_DefaultSidebar, {
5441
5811
  key: 3,
5442
5812
  items: item.children,
@@ -5449,8 +5819,8 @@ var default_sidebar_default = /* @__PURE__ */ (0, vue.defineComponent)({
5449
5819
  });
5450
5820
  //#endregion
5451
5821
  //#region packages/client/src/components/layout/content-width-toggle.vue?vue&type=script&setup=true&lang.ts
5452
- var _hoisted_1$17 = ["aria-label"];
5453
- var _hoisted_2$14 = [
5822
+ var _hoisted_1$18 = ["aria-label"];
5823
+ var _hoisted_2$15 = [
5454
5824
  "aria-checked",
5455
5825
  "aria-label",
5456
5826
  "tabindex",
@@ -5517,20 +5887,20 @@ var content_width_toggle_default = /* @__PURE__ */ (0, vue.defineComponent)({
5517
5887
  class: "docs-content-width__icon",
5518
5888
  name: option.icon,
5519
5889
  size: 12
5520
- }, null, 8, ["name"])], 10, _hoisted_2$14);
5521
- }), 128))], 40, _hoisted_1$17);
5890
+ }, null, 8, ["name"])], 10, _hoisted_2$15);
5891
+ }), 128))], 40, _hoisted_1$18);
5522
5892
  };
5523
5893
  }
5524
5894
  });
5525
5895
  //#endregion
5526
5896
  //#region packages/client/src/components/layout/page-header.vue?vue&type=script&setup=true&lang.ts
5527
- var _hoisted_1$16 = { class: "docs-page-header" };
5528
- var _hoisted_2$13 = {
5897
+ var _hoisted_1$17 = { class: "docs-page-header" };
5898
+ var _hoisted_2$14 = {
5529
5899
  key: 0,
5530
5900
  class: "docs-page-header__start"
5531
5901
  };
5532
- var _hoisted_3$11 = { class: "docs-page-header__eyebrow" };
5533
- var _hoisted_4$6 = { class: "docs-page-header__end" };
5902
+ var _hoisted_3$12 = { class: "docs-page-header__eyebrow" };
5903
+ var _hoisted_4$7 = { class: "docs-page-header__end" };
5534
5904
  //#endregion
5535
5905
  //#region packages/client/src/components/layout/page-header.vue
5536
5906
  var page_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -5544,13 +5914,13 @@ var page_header_default = /* @__PURE__ */ (0, vue.defineComponent)({
5544
5914
  return findSidebarSection(sidebarItems.value, route.path, lang.value);
5545
5915
  });
5546
5916
  return (_ctx, _cache) => {
5547
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("header", _hoisted_1$16, [section.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$13, [(0, vue.createElementVNode)("p", _hoisted_3$11, (0, vue.toDisplayString)(section.value.label), 1)])) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createElementVNode)("div", _hoisted_4$6, [(0, vue.createVNode)(content_width_toggle_default)])]);
5917
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("header", _hoisted_1$17, [section.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$14, [(0, vue.createElementVNode)("p", _hoisted_3$12, (0, vue.toDisplayString)(section.value.label), 1)])) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createElementVNode)("div", _hoisted_4$7, [(0, vue.createVNode)(content_width_toggle_default)])]);
5548
5918
  };
5549
5919
  }
5550
5920
  });
5551
5921
  //#endregion
5552
5922
  //#region packages/client/src/components/layout/page-footer.vue?vue&type=script&setup=true&lang.ts
5553
- var _hoisted_1$15 = ["aria-label"];
5923
+ var _hoisted_1$16 = ["aria-label"];
5554
5924
  //#endregion
5555
5925
  //#region packages/client/src/components/layout/page-footer.vue
5556
5926
  var page_footer_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -5606,7 +5976,7 @@ var page_footer_default = /* @__PURE__ */ (0, vue.defineComponent)({
5606
5976
  d: "M6.22 4.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1 0\n 1.06l-3.25 3.25a.75.75 0 0 1-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 0 1 0-1.06Z"
5607
5977
  })], -1))]),
5608
5978
  _: 1
5609
- }, 8, ["to", "aria-label"])) : (0, vue.createCommentVNode)("v-if", true)], 8, _hoisted_1$15)) : (0, vue.createCommentVNode)("v-if", true);
5979
+ }, 8, ["to", "aria-label"])) : (0, vue.createCommentVNode)("v-if", true)], 8, _hoisted_1$16)) : (0, vue.createCommentVNode)("v-if", true);
5610
5980
  };
5611
5981
  }
5612
5982
  });
@@ -5734,8 +6104,8 @@ var resolveOutlineScrollerHeight = (maxHeight, listSize) => {
5734
6104
  };
5735
6105
  //#endregion
5736
6106
  //#region packages/client/src/components/layout/page-outline.vue?vue&type=script&setup=true&lang.ts
5737
- var _hoisted_1$14 = ["aria-label"];
5738
- var _hoisted_2$12 = { class: "docs-page-outline__title" };
6107
+ var _hoisted_1$15 = ["aria-label"];
6108
+ var _hoisted_2$13 = { class: "docs-page-outline__title" };
5739
6109
  var SCROLL_THRESHOLD = 80;
5740
6110
  //#endregion
5741
6111
  //#region packages/client/src/components/layout/page-outline.vue
@@ -5975,7 +6345,7 @@ var page_outline_default = /* @__PURE__ */ (0, vue.defineComponent)({
5975
6345
  class: "docs-page-outline",
5976
6346
  style: (0, vue.normalizeStyle)(rootStyle.value),
5977
6347
  "aria-label": (0, vue.unref)(t)("client.page.outline")
5978
- }, [(0, vue.createElementVNode)("p", _hoisted_2$12, (0, vue.toDisplayString)((0, vue.unref)(t)("client.page.outline")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Scroller), {
6348
+ }, [(0, vue.createElementVNode)("p", _hoisted_2$13, (0, vue.toDisplayString)((0, vue.unref)(t)("client.page.outline")), 1), (0, vue.createVNode)((0, vue.unref)(_deot_vc.Scroller), {
5979
6349
  ref_key: "outlineScroller",
5980
6350
  ref: outlineScroller,
5981
6351
  class: "docs-page-outline__scroller",
@@ -5991,7 +6361,7 @@ var page_outline_default = /* @__PURE__ */ (0, vue.defineComponent)({
5991
6361
  onSelect: handleSelect
5992
6362
  }, null, 8, ["items", "active-id"])]),
5993
6363
  _: 1
5994
- }, 8, ["show-bar", "height"])], 12, _hoisted_1$14)) : (0, vue.createCommentVNode)("v-if", true);
6364
+ }, 8, ["show-bar", "height"])], 12, _hoisted_1$15)) : (0, vue.createCommentVNode)("v-if", true);
5995
6365
  };
5996
6366
  }
5997
6367
  });
@@ -6014,32 +6384,37 @@ var omitRouteQuery = (query, keys) => {
6014
6384
  };
6015
6385
  //#endregion
6016
6386
  //#region packages/client/src/components/layout/resource-slot.vue?vue&type=script&setup=true&lang.ts
6017
- var _hoisted_1$13 = [
6387
+ var _hoisted_1$14 = [
6018
6388
  "data-slot",
6019
6389
  "data-resource-type",
6020
6390
  "data-content-width"
6021
6391
  ];
6022
- var _hoisted_2$11 = {
6023
- key: 4,
6392
+ var _hoisted_2$12 = {
6393
+ key: 0,
6394
+ class: "docs-resource-slot__error",
6395
+ role: "alert"
6396
+ };
6397
+ var _hoisted_3$11 = {
6398
+ key: 5,
6024
6399
  class: "docs-resource-slot__page"
6025
6400
  };
6026
- var _hoisted_3$10 = {
6401
+ var _hoisted_4$6 = {
6027
6402
  key: 0,
6028
6403
  class: "docs-resource-slot__error"
6029
6404
  };
6030
- var _hoisted_4$5 = {
6031
- key: 5,
6405
+ var _hoisted_5$5 = {
6406
+ key: 6,
6032
6407
  class: "docs-resource-slot__error"
6033
6408
  };
6034
- var _hoisted_5$4 = {
6035
- key: 6,
6409
+ var _hoisted_6$3 = {
6410
+ key: 7,
6036
6411
  class: "docs-resource-slot__loading"
6037
6412
  };
6038
- var _hoisted_6$2 = {
6039
- key: 7,
6413
+ var _hoisted_7$3 = {
6414
+ key: 8,
6040
6415
  class: "docs-resource-slot__body"
6041
6416
  };
6042
- var _hoisted_7$2 = ["data-builtin"];
6417
+ var _hoisted_8$3 = ["data-builtin"];
6043
6418
  //#endregion
6044
6419
  //#region packages/client/src/components/layout/resource-slot.vue
6045
6420
  var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -6060,6 +6435,26 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6060
6435
  const contentWidth = ContentWidth.current;
6061
6436
  const content = (0, vue.ref)("");
6062
6437
  const error = (0, vue.ref)("");
6438
+ const styleError = (0, vue.ref)("");
6439
+ let releaseStyles;
6440
+ const preview = (0, vue.computed)(() => {
6441
+ if (!route.meta.docsPreview || props.name !== "content") return {
6442
+ config: void 0,
6443
+ error: ""
6444
+ };
6445
+ try {
6446
+ return {
6447
+ config: readPreviewConfig(route.query),
6448
+ error: ""
6449
+ };
6450
+ } catch (reason) {
6451
+ return {
6452
+ config: void 0,
6453
+ error: t("client.common.previewConfigFailed", { message: reason instanceof Error ? reason.message : String(reason) })
6454
+ };
6455
+ }
6456
+ });
6457
+ (0, vue.provide)(previewConfigKey, (0, vue.computed)(() => preview.value.config));
6063
6458
  const loading = (0, vue.ref)(false);
6064
6459
  const source = (0, vue.ref)("");
6065
6460
  const resourceType = (0, vue.ref)("");
@@ -6304,6 +6699,15 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6304
6699
  if (current === generation && stableSlotKey) activeStableSlotKey = stableSlotKey;
6305
6700
  };
6306
6701
  try {
6702
+ let directType;
6703
+ if (route.meta.docsPreview && props.name === "content") {
6704
+ if (preview.value.error) throw new TypeError(preview.value.error);
6705
+ const url = preview.value.config?.url;
6706
+ if (typeof url !== "string" || !url.trim()) throw new TypeError(t("client.common.previewUrlRequired"));
6707
+ slot = url.trim();
6708
+ directType = resolvePreviewType(slot, location.href);
6709
+ if (!directType) throw new TypeError(t("client.common.previewUrlUnsupported"));
6710
+ }
6307
6711
  if (slot === null) {
6308
6712
  markStableSlot();
6309
6713
  return;
@@ -6334,7 +6738,7 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6334
6738
  }) || `./${getRouteValue(route, config)}.md`;
6335
6739
  if (current !== generation || typeof slot !== "string") return;
6336
6740
  source.value = slot;
6337
- resourceType.value = classifyResourceSource(slot);
6741
+ resourceType.value = directType || classifyResourceSource(slot);
6338
6742
  if (resourceType.value === "sfc") {
6339
6743
  markStableSlot();
6340
6744
  return;
@@ -6370,9 +6774,32 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6370
6774
  }
6371
6775
  }
6372
6776
  };
6777
+ (0, vue.watch)(() => JSON.stringify([
6778
+ route.meta.docsPreview,
6779
+ route.path,
6780
+ preview.value.config?.url,
6781
+ preview.value.config?.styles,
6782
+ props.name
6783
+ ]), () => {
6784
+ releaseStyles?.();
6785
+ releaseStyles = void 0;
6786
+ styleError.value = "";
6787
+ if (!preview.value.config) return;
6788
+ try {
6789
+ releaseStyles = acquirePreviewStyles(parsePreviewStyleUrls(preview.value.config.styles, location.href), (url) => {
6790
+ styleError.value = t("client.common.previewStyleFailed", { url });
6791
+ });
6792
+ } catch (reason) {
6793
+ styleError.value = reason instanceof Error ? reason.message : String(reason);
6794
+ }
6795
+ }, { immediate: true });
6373
6796
  (0, vue.watch)([
6374
6797
  () => route.path,
6375
- () => JSON.stringify(omitRouteQuery(route.query, ["tab"])),
6798
+ () => route.meta.docsPreview ? JSON.stringify([
6799
+ preview.value.error,
6800
+ preview.value.config?.url,
6801
+ lang.value
6802
+ ]) : JSON.stringify(omitRouteQuery(route.query, ["tab"])),
6376
6803
  () => props.name
6377
6804
  ], load, { immediate: true });
6378
6805
  (0, vue.watch)(() => route.hash, (hash) => {
@@ -6395,6 +6822,7 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6395
6822
  });
6396
6823
  (0, vue.onBeforeUnmount)(() => {
6397
6824
  generation += 1;
6825
+ releaseStyles?.();
6398
6826
  clear();
6399
6827
  if (props.name === "sidebar") setSidebarItems(null);
6400
6828
  });
@@ -6407,14 +6835,14 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6407
6835
  "data-resource-type": resourceType.value || void 0,
6408
6836
  "data-content-width": __props.name === "content" && resourceType.value === "markdown" ? (0, vue.unref)(contentWidth) : void 0,
6409
6837
  style: (0, vue.normalizeStyle)({ minHeight: transitionMinHeight.value })
6410
- }, [builtin.value === "header" ? ((0, vue.openBlock)(), (0, vue.createBlock)(default_header_default, { key: 0 })) : builtin.value === "footer" ? ((0, vue.openBlock)(), (0, vue.createBlock)(default_footer_default, { key: 1 })) : sidebarItems.value ? ((0, vue.openBlock)(), (0, vue.createBlock)(default_sidebar_default, {
6411
- key: 2,
6838
+ }, [styleError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$12, (0, vue.toDisplayString)(styleError.value), 1)) : (0, vue.createCommentVNode)("v-if", true), builtin.value === "header" ? ((0, vue.openBlock)(), (0, vue.createBlock)(default_header_default, { key: 1 })) : builtin.value === "footer" ? ((0, vue.openBlock)(), (0, vue.createBlock)(default_footer_default, { key: 2 })) : sidebarItems.value ? ((0, vue.openBlock)(), (0, vue.createBlock)(default_sidebar_default, {
6839
+ key: 3,
6412
6840
  items: sidebarItems.value
6413
6841
  }, null, 8, ["items"])) : resourceType.value === "sfc" && source.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(remote_sfc_default), {
6414
- key: 3,
6842
+ key: 4,
6415
6843
  source: source.value,
6416
6844
  lang: lang.value
6417
- }, null, 8, ["source", "lang"])) : pageDocument.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$11, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$10, (0, vue.toDisplayString)(error.value), 1)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createVNode)((0, vue.unref)(_deot_docs_renderer.Renderer), {
6845
+ }, null, 8, ["source", "lang"])) : pageDocument.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$11, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_4$6, (0, vue.toDisplayString)(error.value), 1)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createVNode)((0, vue.unref)(_deot_docs_renderer.Renderer), {
6418
6846
  document: pageDocument.value,
6419
6847
  modules: (0, vue.unref)(rendererModules),
6420
6848
  context: rendererContext.value,
@@ -6424,7 +6852,7 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6424
6852
  "modules",
6425
6853
  "context",
6426
6854
  "fit"
6427
- ])])) : error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_4$5, (0, vue.toDisplayString)(error.value), 1)) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_5$4, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : resourceType.value === "markdown" && __props.name === "content" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_6$2, [(0, vue.createElementVNode)("div", {
6855
+ ])])) : error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_5$5, (0, vue.toDisplayString)(error.value), 1)) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_6$3, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : resourceType.value === "markdown" && __props.name === "content" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_7$3, [(0, vue.createElementVNode)("div", {
6428
6856
  ref: bindArticle,
6429
6857
  class: "docs-resource-slot__article"
6430
6858
  }, [
@@ -6443,7 +6871,7 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6443
6871
  ]),
6444
6872
  (0, vue.createVNode)(page_footer_default)
6445
6873
  ], 512), (0, vue.createVNode)(page_outline_default, { target: article.value }, null, 8, ["target"])])) : resourceType.value === "markdown" ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_markdown.Markdown), {
6446
- key: 8,
6874
+ key: 9,
6447
6875
  value: content.value,
6448
6876
  theme: markdownTheme.value,
6449
6877
  indicator: markdownIndicator.value,
@@ -6455,10 +6883,10 @@ var resource_slot_default = /* @__PURE__ */ (0, vue.defineComponent)({
6455
6883
  "indicator",
6456
6884
  "playground"
6457
6885
  ])) : builtin.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
6458
- key: 9,
6886
+ key: 10,
6459
6887
  class: "docs-resource-slot__builtin",
6460
6888
  "data-builtin": builtin.value
6461
- }, null, 8, _hoisted_7$2)) : (0, vue.createCommentVNode)("v-if", true)], 12, _hoisted_1$13);
6889
+ }, null, 8, _hoisted_8$3)) : (0, vue.createCommentVNode)("v-if", true)], 12, _hoisted_1$14);
6462
6890
  };
6463
6891
  }
6464
6892
  });
@@ -7577,11 +8005,11 @@ var listRendererEditorDemos = (lang) => RENDERER_EDITOR_DEMOS.map((name) => ({
7577
8005
  var createRendererEditorDemoDocument = (demo, lang) => factories[demo](lang);
7578
8006
  //#endregion
7579
8007
  //#region packages/client/src/app.vue?vue&type=script&setup=true&lang.ts
7580
- var _hoisted_1$12 = { class: "docs-app__header" };
7581
- var _hoisted_2$10 = ["aria-label", "aria-expanded"];
7582
- var _hoisted_3$9 = ["aria-label"];
7583
- var _hoisted_4$4 = { class: "docs-layout__main" };
7584
- var _hoisted_5$3 = { class: "docs-layout__footer" };
8008
+ var _hoisted_1$13 = { class: "docs-app__header" };
8009
+ var _hoisted_2$11 = ["aria-label", "aria-expanded"];
8010
+ var _hoisted_3$10 = ["aria-label"];
8011
+ var _hoisted_4$5 = { class: "docs-layout__main" };
8012
+ var _hoisted_5$4 = { class: "docs-layout__footer" };
7585
8013
  //#endregion
7586
8014
  //#region packages/client/src/app.vue
7587
8015
  var app_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -7589,6 +8017,7 @@ var app_default = /* @__PURE__ */ (0, vue.defineComponent)({
7589
8017
  setup(__props) {
7590
8018
  const route = (0, vue_router.useRoute)();
7591
8019
  const router = (0, vue_router.useRouter)();
8020
+ const routeLayout = (0, vue.computed)(() => route.meta.docsRoute?.layout ?? "default");
7592
8021
  const { t } = (0, _deot_docs_locale.useLocale)();
7593
8022
  const mainScroller = (0, vue.ref)();
7594
8023
  const mobileSidebarOpen = (0, vue.ref)(false);
@@ -7626,21 +8055,25 @@ var app_default = /* @__PURE__ */ (0, vue.defineComponent)({
7626
8055
  mainScroller.value?.setScrollTop(0);
7627
8056
  });
7628
8057
  return (_ctx, _cache) => {
7629
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
8058
+ return routeLayout.value === "none" ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(vue_router.RouterView), {
8059
+ key: 0,
8060
+ class: "docs-page--none"
8061
+ })) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
8062
+ key: 1,
7630
8063
  class: (0, vue.normalizeClass)(["docs-app", {
7631
8064
  "docs-app--database": isUtilityShell.value,
7632
8065
  "docs-app--editor": isEditorShell.value,
7633
8066
  "docs-app--mobile-sidebar-open": mobileSidebarOpen.value
7634
8067
  }]),
7635
8068
  onKeydown: (0, vue.withKeys)(closeMobileSidebar, ["esc"])
7636
- }, [(0, vue.createElementVNode)("div", _hoisted_1$12, [(0, vue.createElementVNode)("button", {
8069
+ }, [(0, vue.createElementVNode)("div", _hoisted_1$13, [(0, vue.createElementVNode)("button", {
7637
8070
  type: "button",
7638
8071
  class: (0, vue.normalizeClass)(["docs-app__sidebar-toggle", { "is-open": mobileSidebarOpen.value }]),
7639
8072
  "aria-label": (0, vue.unref)(t)(mobileSidebarOpen.value ? "client.header.closeSidebar" : "client.header.openSidebar"),
7640
8073
  "aria-expanded": mobileSidebarOpen.value,
7641
8074
  "aria-controls": "docs-mobile-sidebar",
7642
8075
  onClick: toggleMobileSidebar
7643
- }, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: mobileSidebarOpen.value ? "close" : "menu" }, null, 8, ["name"])], 10, _hoisted_2$10), (0, vue.createVNode)((0, vue.unref)(resource_slot_default), { name: "header" })]), (0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)(["docs-layout", {
8076
+ }, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: mobileSidebarOpen.value ? "close" : "menu" }, null, 8, ["name"])], 10, _hoisted_2$11), (0, vue.createVNode)((0, vue.unref)(resource_slot_default), { name: "header" })]), (0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)(["docs-layout", {
7644
8077
  "docs-layout--database": isUtilityShell.value,
7645
8078
  "docs-layout--editor": isEditorShell.value,
7646
8079
  "docs-layout--home": (0, vue.unref)(route).meta?.docsHome
@@ -7665,7 +8098,7 @@ var app_default = /* @__PURE__ */ (0, vue.defineComponent)({
7665
8098
  class: "docs-layout__sidebar-mask",
7666
8099
  "aria-label": (0, vue.unref)(t)("client.header.closeSidebar"),
7667
8100
  onClick: closeMobileSidebar
7668
- }, null, 8, _hoisted_3$9),
8101
+ }, null, 8, _hoisted_3$10),
7669
8102
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Scroller), {
7670
8103
  ref_key: "mainScroller",
7671
8104
  ref: mainScroller,
@@ -7682,16 +8115,16 @@ var app_default = /* @__PURE__ */ (0, vue.defineComponent)({
7682
8115
  class: "docs-layout__rail docs-layout__rail--start",
7683
8116
  "aria-hidden": "true"
7684
8117
  }, null, -1)),
7685
- (0, vue.createElementVNode)("main", _hoisted_4$4, [(0, vue.createVNode)((0, vue.unref)(vue_router.RouterView)), (0, vue.createVNode)((0, vue.unref)(vue_router.RouterView), { name: "extra" })]),
8118
+ (0, vue.createElementVNode)("main", _hoisted_4$5, [(0, vue.createVNode)((0, vue.unref)(vue_router.RouterView)), (0, vue.createVNode)((0, vue.unref)(vue_router.RouterView), { name: "extra" })]),
7686
8119
  _cache[1] || (_cache[1] = (0, vue.createElementVNode)("div", {
7687
8120
  class: "docs-layout__rail docs-layout__rail--end",
7688
8121
  "aria-hidden": "true"
7689
8122
  }, null, -1)),
7690
- (0, vue.createElementVNode)("div", _hoisted_5$3, [(0, vue.createVNode)((0, vue.unref)(resource_slot_default), { name: "footer" })])
8123
+ (0, vue.createElementVNode)("div", _hoisted_5$4, [(0, vue.createVNode)((0, vue.unref)(resource_slot_default), { name: "footer" })])
7691
8124
  ]),
7692
8125
  _: 1
7693
8126
  }, 512)
7694
- ], 2)], 34);
8127
+ ], 2)], 34));
7695
8128
  };
7696
8129
  }
7697
8130
  });
@@ -7815,16 +8248,16 @@ var prune = async () => {
7815
8248
  };
7816
8249
  //#endregion
7817
8250
  //#region packages/client/src/components/paging/filter/filter-item.vue?vue&type=script&setup=true&lang.ts
7818
- var _hoisted_1$11 = { class: "docs-paging-filter-item" };
7819
- var _hoisted_2$9 = {
8251
+ var _hoisted_1$12 = { class: "docs-paging-filter-item" };
8252
+ var _hoisted_2$10 = {
7820
8253
  key: 0,
7821
8254
  class: "docs-paging-filter-item__label"
7822
8255
  };
7823
- var _hoisted_3$8 = {
8256
+ var _hoisted_3$9 = {
7824
8257
  key: 1,
7825
8258
  class: "docs-paging-filter-item__range"
7826
8259
  };
7827
- var _hoisted_4$3 = { class: "docs-paging-filter-item__separator" };
8260
+ var _hoisted_4$4 = { class: "docs-paging-filter-item__separator" };
7828
8261
  //#endregion
7829
8262
  //#region packages/client/src/components/paging/filter/filter-item.vue
7830
8263
  var filter_item_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -7873,7 +8306,7 @@ var filter_item_default = /* @__PURE__ */ (0, vue.defineComponent)({
7873
8306
  emit("search");
7874
8307
  };
7875
8308
  return (_ctx, _cache) => {
7876
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$11, [__props.module.label ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_2$9, (0, vue.toDisplayString)(__props.module.label), 1)) : (0, vue.createCommentVNode)("v-if", true), __props.module.type === "range" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$8, [
8309
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$12, [__props.module.label ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_2$10, (0, vue.toDisplayString)(__props.module.label), 1)) : (0, vue.createCommentVNode)("v-if", true), __props.module.type === "range" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$9, [
7877
8310
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.InputNumber), (0, vue.mergeProps)({
7878
8311
  "model-value": getNumberValue(__props.startValue),
7879
8312
  "data-filter": __props.module.field[0],
@@ -7886,7 +8319,7 @@ var filter_item_default = /* @__PURE__ */ (0, vue.defineComponent)({
7886
8319
  "data-filter",
7887
8320
  "placeholder"
7888
8321
  ]),
7889
- (0, vue.createElementVNode)("span", _hoisted_4$3, (0, vue.toDisplayString)(__props.module.separator || "-"), 1),
8322
+ (0, vue.createElementVNode)("span", _hoisted_4$4, (0, vue.toDisplayString)(__props.module.separator || "-"), 1),
7890
8323
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.InputNumber), (0, vue.mergeProps)({
7891
8324
  "model-value": getNumberValue(__props.endValue),
7892
8325
  "data-filter": __props.module.field[1],
@@ -7949,8 +8382,8 @@ var filter_item_default = /* @__PURE__ */ (0, vue.defineComponent)({
7949
8382
  });
7950
8383
  //#endregion
7951
8384
  //#region packages/client/src/components/paging/filter/index.vue?vue&type=script&setup=true&lang.ts
7952
- var _hoisted_1$10 = { class: "docs-paging-filter" };
7953
- var _hoisted_2$8 = { class: "docs-paging-filter__operate" };
8385
+ var _hoisted_1$11 = { class: "docs-paging-filter" };
8386
+ var _hoisted_2$9 = { class: "docs-paging-filter__operate" };
7954
8387
  //#endregion
7955
8388
  //#region packages/client/src/components/paging/filter/index.vue
7956
8389
  var filter_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -8004,7 +8437,7 @@ var filter_default = /* @__PURE__ */ (0, vue.defineComponent)({
8004
8437
  emit("search", value);
8005
8438
  };
8006
8439
  return (_ctx, _cache) => {
8007
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$10, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(__props.modules, (module) => {
8440
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$11, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(__props.modules, (module) => {
8008
8441
  return (0, vue.openBlock)(), (0, vue.createBlock)(filter_item_default, {
8009
8442
  key: getModuleKey(module),
8010
8443
  module,
@@ -8024,7 +8457,7 @@ var filter_default = /* @__PURE__ */ (0, vue.defineComponent)({
8024
8457
  "onUpdate:startValue",
8025
8458
  "onUpdate:endValue"
8026
8459
  ]);
8027
- }), 128)), (0, vue.createElementVNode)("div", _hoisted_2$8, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
8460
+ }), 128)), (0, vue.createElementVNode)("div", _hoisted_2$9, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
8028
8461
  type: "primary",
8029
8462
  onClick: handleSearch
8030
8463
  }, {
@@ -8039,9 +8472,9 @@ var filter_default = /* @__PURE__ */ (0, vue.defineComponent)({
8039
8472
  });
8040
8473
  //#endregion
8041
8474
  //#region packages/client/src/components/paging/paging.vue?vue&type=script&setup=true&lang.ts
8042
- var _hoisted_1$9 = { class: "docs-paging" };
8043
- var _hoisted_2$7 = { class: "docs-paging__pagination" };
8044
- var _hoisted_3$7 = { class: "docs-paging__pagination-control" };
8475
+ var _hoisted_1$10 = { class: "docs-paging" };
8476
+ var _hoisted_2$8 = { class: "docs-paging__pagination" };
8477
+ var _hoisted_3$8 = { class: "docs-paging__pagination-control" };
8045
8478
  //#endregion
8046
8479
  //#region packages/client/src/components/paging/paging.vue
8047
8480
  var paging_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -8187,7 +8620,7 @@ var paging_default = /* @__PURE__ */ (0, vue.defineComponent)({
8187
8620
  refreshAffix
8188
8621
  });
8189
8622
  return (_ctx, _cache) => {
8190
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$9, [
8623
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$10, [
8191
8624
  __props.filterModules.length ? ((0, vue.openBlock)(), (0, vue.createBlock)(filter_default, {
8192
8625
  key: 0,
8193
8626
  modules: __props.filterModules,
@@ -8221,12 +8654,12 @@ var paging_default = /* @__PURE__ */ (0, vue.defineComponent)({
8221
8654
  ref_key: "footerAffix",
8222
8655
  ref: footerAffix
8223
8656
  }, affixOptions.value[1]), {
8224
- default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("footer", _hoisted_2$7, [(0, vue.renderSlot)(_ctx.$slots, "footer-extra", {
8657
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("footer", _hoisted_2$8, [(0, vue.renderSlot)(_ctx.$slots, "footer-extra", {
8225
8658
  current: current.value,
8226
8659
  pageSize: pageSize.value,
8227
8660
  total: total.value,
8228
8661
  loading: loading.value
8229
- }), (0, vue.createElementVNode)("div", _hoisted_3$7, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Pagination), {
8662
+ }), (0, vue.createElementVNode)("div", _hoisted_3$8, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Pagination), {
8230
8663
  count: total.value,
8231
8664
  current: current.value,
8232
8665
  "page-size": pageSize.value,
@@ -8250,7 +8683,7 @@ var paging_default = /* @__PURE__ */ (0, vue.defineComponent)({
8250
8683
  });
8251
8684
  //#endregion
8252
8685
  //#region packages/client/src/components/tag/tag.vue?vue&type=script&setup=true&lang.ts
8253
- var _hoisted_1$8 = ["data-type"];
8686
+ var _hoisted_1$9 = ["data-type"];
8254
8687
  //#endregion
8255
8688
  //#region packages/client/src/components/tag/tag.vue
8256
8689
  var tag_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -8295,24 +8728,24 @@ var tag_default = /* @__PURE__ */ (0, vue.defineComponent)({
8295
8728
  backgroundColor: currentColor.value[0],
8296
8729
  color: currentColor.value[1]
8297
8730
  })
8298
- }, [(0, vue.createElementVNode)("span", { class: (0, vue.normalizeClass)(["docs-tag__label", { "docs-tag__label--ellipsis": __props.ellipsis }]) }, [(0, vue.renderSlot)(_ctx.$slots, "default", {}, () => [(0, vue.createTextVNode)((0, vue.toDisplayString)(currentLabel.value), 1)])], 2)], 12, _hoisted_1$8);
8731
+ }, [(0, vue.createElementVNode)("span", { class: (0, vue.normalizeClass)(["docs-tag__label", { "docs-tag__label--ellipsis": __props.ellipsis }]) }, [(0, vue.renderSlot)(_ctx.$slots, "default", {}, () => [(0, vue.createTextVNode)((0, vue.toDisplayString)(currentLabel.value), 1)])], 2)], 12, _hoisted_1$9);
8299
8732
  };
8300
8733
  }
8301
8734
  });
8302
8735
  //#endregion
8303
8736
  //#region packages/client/src/pages/database/index.vue?vue&type=script&setup=true&lang.ts
8304
- var _hoisted_1$7 = { class: "docs-database" };
8305
- var _hoisted_2$6 = { class: "docs-database__header" };
8306
- var _hoisted_3$6 = ["title"];
8307
- var _hoisted_4$2 = { class: "docs-database__toolbar" };
8308
- var _hoisted_5$2 = { class: "docs-database__toolbar-primary" };
8309
- var _hoisted_6$1 = { class: "docs-database__button-content" };
8310
- var _hoisted_7$1 = { class: "docs-database__button-content" };
8311
- var _hoisted_8$1 = { class: "docs-database__columns" };
8312
- var _hoisted_9$1 = { class: "docs-database__toolbar-danger" };
8313
- var _hoisted_10$1 = ["title"];
8314
- var _hoisted_11$1 = ["title"];
8315
- var _hoisted_12$1 = { class: "docs-database__actions" };
8737
+ var _hoisted_1$8 = { class: "docs-database" };
8738
+ var _hoisted_2$7 = { class: "docs-database__header" };
8739
+ var _hoisted_3$7 = ["title"];
8740
+ var _hoisted_4$3 = { class: "docs-database__toolbar" };
8741
+ var _hoisted_5$3 = { class: "docs-database__toolbar-primary" };
8742
+ var _hoisted_6$2 = { class: "docs-database__button-content" };
8743
+ var _hoisted_7$2 = { class: "docs-database__button-content" };
8744
+ var _hoisted_8$2 = { class: "docs-database__columns" };
8745
+ var _hoisted_9$2 = { class: "docs-database__toolbar-danger" };
8746
+ var _hoisted_10$2 = ["title"];
8747
+ var _hoisted_11$2 = ["title"];
8748
+ var _hoisted_12$2 = { class: "docs-database__actions" };
8316
8749
  //#endregion
8317
8750
  //#region packages/client/src/pages/database/index.vue
8318
8751
  var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -8541,17 +8974,17 @@ var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
8541
8974
  statusRefreshTimer = void 0;
8542
8975
  });
8543
8976
  return (_ctx, _cache) => {
8544
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1$7, [(0, vue.createElementVNode)("header", _hoisted_2$6, [(0, vue.createElementVNode)("div", null, [(0, vue.createElementVNode)("h1", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.title")), 1), (0, vue.createElementVNode)("p", null, [
8977
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1$8, [(0, vue.createElementVNode)("header", _hoisted_2$7, [(0, vue.createElementVNode)("div", null, [(0, vue.createElementVNode)("h1", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.title")), 1), (0, vue.createElementVNode)("p", null, [
8545
8978
  (0, vue.createTextVNode)(" deot-docs / resources · " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.records", { count: records.value.length })) + " · ", 1),
8546
- (0, vue.createElementVNode)("span", { title: (0, vue.unref)(currentNamespace) }, (0, vue.toDisplayString)((0, vue.unref)(currentNamespace)), 9, _hoisted_3$6),
8979
+ (0, vue.createElementVNode)("span", { title: (0, vue.unref)(currentNamespace) }, (0, vue.toDisplayString)((0, vue.unref)(currentNamespace)), 9, _hoisted_3$7),
8547
8980
  (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.cache", { size: namespaceCacheSize.value })), 1)
8548
- ])]), (0, vue.createElementVNode)("div", _hoisted_4$2, [(0, vue.createElementVNode)("div", _hoisted_5$2, [
8981
+ ])]), (0, vue.createElementVNode)("div", _hoisted_4$3, [(0, vue.createElementVNode)("div", _hoisted_5$3, [
8549
8982
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
8550
8983
  type: "primary",
8551
8984
  disabled: loading.value,
8552
8985
  onClick: handleBack
8553
8986
  }, {
8554
- default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_6$1, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "back" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.back")), 1)])]),
8987
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_6$2, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "back" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.back")), 1)])]),
8555
8988
  _: 1
8556
8989
  }, 8, ["disabled"]),
8557
8990
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
@@ -8559,14 +8992,14 @@ var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
8559
8992
  disabled: loading.value,
8560
8993
  onClick: handleHome
8561
8994
  }, {
8562
- default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_7$1, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "home" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.home")), 1)])]),
8995
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_7$2, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "home" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.database.home")), 1)])]),
8563
8996
  _: 1
8564
8997
  }, 8, ["disabled"]),
8565
8998
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Popover), {
8566
8999
  trigger: "click",
8567
9000
  placement: "bottom-right"
8568
9001
  }, {
8569
- content: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_8$1, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(optionalColumns.value, (item) => {
9002
+ content: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_8$2, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(optionalColumns.value, (item) => {
8570
9003
  return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_vc.Checkbox), {
8571
9004
  key: item.value,
8572
9005
  "model-value": isColumnVisible(item.value),
@@ -8611,7 +9044,7 @@ var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
8611
9044
  default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)((0, vue.unref)(t)("client.database.prefetch")), 1)]),
8612
9045
  _: 1
8613
9046
  }, 8, ["disabled"])
8614
- ]), (0, vue.createElementVNode)("div", _hoisted_9$1, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
9047
+ ]), (0, vue.createElementVNode)("div", _hoisted_9$2, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
8615
9048
  type: "error",
8616
9049
  disabled: loading.value || !records.value.length,
8617
9050
  onClick: handleClearAll
@@ -8643,7 +9076,7 @@ var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
8643
9076
  default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("span", {
8644
9077
  class: "docs-database__ellipsis",
8645
9078
  title: row.url
8646
- }, (0, vue.toDisplayString)(row.url), 9, _hoisted_10$1)]),
9079
+ }, (0, vue.toDisplayString)(row.url), 9, _hoisted_10$2)]),
8647
9080
  _: 1
8648
9081
  }, 8, ["label"]),
8649
9082
  isColumnVisible("source") ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_vc.TableColumn), {
@@ -8654,7 +9087,7 @@ var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
8654
9087
  default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("span", {
8655
9088
  class: "docs-database__ellipsis",
8656
9089
  title: row.identity.source
8657
- }, (0, vue.toDisplayString)(row.identity.source), 9, _hoisted_11$1)]),
9090
+ }, (0, vue.toDisplayString)(row.identity.source), 9, _hoisted_11$2)]),
8658
9091
  _: 1
8659
9092
  }, 8, ["label"])) : (0, vue.createCommentVNode)("v-if", true),
8660
9093
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.TableColumn), {
@@ -8768,7 +9201,7 @@ var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
8768
9201
  align: "center",
8769
9202
  fixed: "right"
8770
9203
  }, {
8771
- default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("div", _hoisted_12$1, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
9204
+ default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("div", _hoisted_12$2, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
8772
9205
  class: "docs-database__action",
8773
9206
  type: "text",
8774
9207
  disabled: loading.value || busyKeys.value.has(getKey(row)),
@@ -8795,14 +9228,14 @@ var database_default = /* @__PURE__ */ (0, vue.defineComponent)({
8795
9228
  });
8796
9229
  //#endregion
8797
9230
  //#region packages/client/src/pages/renderer-editor-demos/components/card.vue?vue&type=script&setup=true&lang.ts
8798
- var _hoisted_1$6 = { class: "docs-renderer-editor-demos-card__name" };
8799
- var _hoisted_2$5 = { class: "docs-renderer-editor-demos-card__title" };
8800
- var _hoisted_3$5 = { class: "docs-renderer-editor-demos-card__desc" };
8801
- var _hoisted_4$1 = {
9231
+ var _hoisted_1$7 = { class: "docs-renderer-editor-demos-card__name" };
9232
+ var _hoisted_2$6 = { class: "docs-renderer-editor-demos-card__title" };
9233
+ var _hoisted_3$6 = { class: "docs-renderer-editor-demos-card__desc" };
9234
+ var _hoisted_4$2 = {
8802
9235
  key: 0,
8803
9236
  class: "docs-renderer-editor-demos-card__modules"
8804
9237
  };
8805
- var _hoisted_5$1 = { class: "docs-renderer-editor-demos-card__action" };
9238
+ var _hoisted_5$2 = { class: "docs-renderer-editor-demos-card__action" };
8806
9239
  //#endregion
8807
9240
  //#region packages/client/src/pages/renderer-editor-demos/components/card.vue
8808
9241
  var card_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -8826,22 +9259,22 @@ var card_default = /* @__PURE__ */ (0, vue.defineComponent)({
8826
9259
  class: "docs-renderer-editor-demos-card__accent",
8827
9260
  "aria-hidden": "true"
8828
9261
  }, null, -1)),
8829
- (0, vue.createElementVNode)("span", _hoisted_1$6, (0, vue.toDisplayString)(__props.item.name), 1),
8830
- (0, vue.createElementVNode)("strong", _hoisted_2$5, (0, vue.toDisplayString)(__props.item.title), 1),
8831
- (0, vue.createElementVNode)("p", _hoisted_3$5, (0, vue.toDisplayString)(__props.item.description), 1),
8832
- __props.item.modules.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("ul", _hoisted_4$1, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(__props.item.modules, (type) => {
9262
+ (0, vue.createElementVNode)("span", _hoisted_1$7, (0, vue.toDisplayString)(__props.item.name), 1),
9263
+ (0, vue.createElementVNode)("strong", _hoisted_2$6, (0, vue.toDisplayString)(__props.item.title), 1),
9264
+ (0, vue.createElementVNode)("p", _hoisted_3$6, (0, vue.toDisplayString)(__props.item.description), 1),
9265
+ __props.item.modules.length ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("ul", _hoisted_4$2, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(__props.item.modules, (type) => {
8833
9266
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("li", { key: type }, (0, vue.toDisplayString)(type), 1);
8834
9267
  }), 128))])) : (0, vue.createCommentVNode)("v-if", true),
8835
- (0, vue.createElementVNode)("span", _hoisted_5$1, (0, vue.toDisplayString)(__props.action || (0, vue.unref)(t)("client.demos.open")), 1)
9268
+ (0, vue.createElementVNode)("span", _hoisted_5$2, (0, vue.toDisplayString)(__props.action || (0, vue.unref)(t)("client.demos.open")), 1)
8836
9269
  ], 4);
8837
9270
  };
8838
9271
  }
8839
9272
  });
8840
9273
  //#endregion
8841
9274
  //#region packages/client/src/pages/renderer-editor-demos/components/gallery.vue?vue&type=script&setup=true&lang.ts
8842
- var _hoisted_1$5 = { class: "docs-renderer-editor-demos-gallery" };
8843
- var _hoisted_2$4 = { class: "docs-renderer-editor-demos-gallery__intro" };
8844
- var _hoisted_3$4 = { class: "docs-renderer-editor-demos-gallery__grid" };
9275
+ var _hoisted_1$6 = { class: "docs-renderer-editor-demos-gallery" };
9276
+ var _hoisted_2$5 = { class: "docs-renderer-editor-demos-gallery__intro" };
9277
+ var _hoisted_3$5 = { class: "docs-renderer-editor-demos-gallery__grid" };
8845
9278
  //#endregion
8846
9279
  //#region packages/client/src/pages/renderer-editor-demos/components/gallery.vue
8847
9280
  var gallery_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -8862,7 +9295,7 @@ var gallery_default = /* @__PURE__ */ (0, vue.defineComponent)({
8862
9295
  if (isRendererEditorDemo(name)) emit("open", name);
8863
9296
  };
8864
9297
  return (_ctx, _cache) => {
8865
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1$5, [(0, vue.createElementVNode)("header", _hoisted_2$4, [(0, vue.createElementVNode)("h1", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.demos.title")), 1), (0, vue.createElementVNode)("p", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.demos.subtitle")), 1)]), (0, vue.createElementVNode)("div", _hoisted_3$4, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(items.value, (item) => {
9298
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1$6, [(0, vue.createElementVNode)("header", _hoisted_2$5, [(0, vue.createElementVNode)("h1", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.demos.title")), 1), (0, vue.createElementVNode)("p", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.demos.subtitle")), 1)]), (0, vue.createElementVNode)("div", _hoisted_3$5, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(items.value, (item) => {
8866
9299
  return (0, vue.openBlock)(), (0, vue.createBlock)(card_default, {
8867
9300
  key: item.name,
8868
9301
  item,
@@ -8878,7 +9311,7 @@ var gallery_default = /* @__PURE__ */ (0, vue.defineComponent)({
8878
9311
  });
8879
9312
  //#endregion
8880
9313
  //#region packages/client/src/pages/renderer-editor-demos/components/stage.vue?vue&type=script&setup=true&lang.ts
8881
- var _hoisted_1$4 = { class: "docs-renderer-editor-demos-stage" };
9314
+ var _hoisted_1$5 = { class: "docs-renderer-editor-demos-stage" };
8882
9315
  //#endregion
8883
9316
  //#region packages/client/src/pages/renderer-editor-demos/components/stage.vue
8884
9317
  var stage_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -8941,7 +9374,7 @@ var stage_default = /* @__PURE__ */ (0, vue.defineComponent)({
8941
9374
  document.value = createRendererEditorDemoDocument(props.name, lang.value);
8942
9375
  }, { immediate: true });
8943
9376
  return (_ctx, _cache) => {
8944
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$4, [document.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_renderer.Combo), {
9377
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$5, [document.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_renderer.Combo), {
8945
9378
  key: 0,
8946
9379
  modelValue: document.value,
8947
9380
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => document.value = $event),
@@ -9001,12 +9434,12 @@ var renderer_editor_demos_default = /* @__PURE__ */ (0, vue.defineComponent)({
9001
9434
  });
9002
9435
  //#endregion
9003
9436
  //#region packages/client/src/pages/renderer-editor/index.vue?vue&type=script&setup=true&lang.ts
9004
- var _hoisted_1$3 = { class: "docs-renderer-editor-page" };
9005
- var _hoisted_2$3 = {
9437
+ var _hoisted_1$4 = { class: "docs-renderer-editor-page" };
9438
+ var _hoisted_2$4 = {
9006
9439
  key: 0,
9007
9440
  class: "docs-renderer-editor-page__error"
9008
9441
  };
9009
- var _hoisted_3$3 = {
9442
+ var _hoisted_3$4 = {
9010
9443
  key: 1,
9011
9444
  class: "docs-renderer-editor-page__loading"
9012
9445
  };
@@ -9209,7 +9642,7 @@ var renderer_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
9209
9642
  controller?.abort();
9210
9643
  });
9211
9644
  return (_ctx, _cache) => {
9212
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$3, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$3, (0, vue.toDisplayString)(error.value), 1)) : loading.value || !document.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$3, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_renderer.Combo), {
9645
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$4, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$4, (0, vue.toDisplayString)(error.value), 1)) : loading.value || !document.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$4, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_renderer.Combo), {
9213
9646
  key: 2,
9214
9647
  modelValue: document.value,
9215
9648
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => document.value = $event),
@@ -9229,12 +9662,12 @@ var renderer_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
9229
9662
  });
9230
9663
  //#endregion
9231
9664
  //#region packages/client/src/pages/home/index.vue?vue&type=script&setup=true&lang.ts
9232
- var _hoisted_1$2 = { class: "docs-home" };
9233
- var _hoisted_2$2 = {
9665
+ var _hoisted_1$3 = { class: "docs-home" };
9666
+ var _hoisted_2$3 = {
9234
9667
  key: 0,
9235
9668
  class: "docs-home__error"
9236
9669
  };
9237
- var _hoisted_3$2 = {
9670
+ var _hoisted_3$3 = {
9238
9671
  key: 2,
9239
9672
  class: "docs-home__loading"
9240
9673
  };
@@ -9330,7 +9763,7 @@ var home_default = /* @__PURE__ */ (0, vue.defineComponent)({
9330
9763
  unsubscribe?.();
9331
9764
  });
9332
9765
  return (_ctx, _cache) => {
9333
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1$2, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$2, (0, vue.toDisplayString)(error.value), 1)) : (0, vue.createCommentVNode)("v-if", true), document.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_renderer.Renderer), {
9766
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1$3, [error.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$3, (0, vue.toDisplayString)(error.value), 1)) : (0, vue.createCommentVNode)("v-if", true), document.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_docs_renderer.Renderer), {
9334
9767
  key: 1,
9335
9768
  document: document.value,
9336
9769
  modules: (0, vue.unref)(rendererModules),
@@ -9341,7 +9774,7 @@ var home_default = /* @__PURE__ */ (0, vue.defineComponent)({
9341
9774
  "modules",
9342
9775
  "context",
9343
9776
  "fit"
9344
- ])) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$2, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : (0, vue.createCommentVNode)("v-if", true)]);
9777
+ ])) : loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3$3, (0, vue.toDisplayString)((0, vue.unref)(t)("client.common.loading")), 1)) : (0, vue.createCommentVNode)("v-if", true)]);
9345
9778
  };
9346
9779
  }
9347
9780
  });
@@ -9357,9 +9790,9 @@ var retry = async (row) => Resource.playground.retry(getNamespace(), row);
9357
9790
  var subscribeStatus = (listener) => Resource.playground.subscribeStatus(listener);
9358
9791
  //#endregion
9359
9792
  //#region packages/client/src/pages/playground-resource/components/source-editor.vue?vue&type=script&setup=true&lang.ts
9360
- var _hoisted_1$1 = { class: "docs-playground-resource-source-editor__meta" };
9361
- var _hoisted_2$1 = ["title"];
9362
- var _hoisted_3$1 = { class: "docs-playground-resource-source-editor__label" };
9793
+ var _hoisted_1$2 = { class: "docs-playground-resource-source-editor__meta" };
9794
+ var _hoisted_2$2 = ["title"];
9795
+ var _hoisted_3$2 = { class: "docs-playground-resource-source-editor__label" };
9363
9796
  //#endregion
9364
9797
  //#region packages/client/src/pages/playground-resource/components/source-editor.vue
9365
9798
  var source_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -9401,15 +9834,15 @@ var source_editor_default = /* @__PURE__ */ (0, vue.defineComponent)({
9401
9834
  onClose: handleClose
9402
9835
  }, {
9403
9836
  default: (0, vue.withCtx)(() => [
9404
- (0, vue.createElementVNode)("div", _hoisted_1$1, [
9837
+ (0, vue.createElementVNode)("div", _hoisted_1$2, [
9405
9838
  (0, vue.createElementVNode)("p", null, [(0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.kind")), 1), (0, vue.createElementVNode)("span", { class: (0, vue.normalizeClass)(["docs-playground-resource__kind", { "is-style": __props.row.kind === "style" }]) }, (0, vue.toDisplayString)(kindLabel.value), 3)]),
9406
9839
  (0, vue.createElementVNode)("p", null, [(0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.alias")), 1), (0, vue.createElementVNode)("code", null, (0, vue.toDisplayString)(__props.row.alias), 1)]),
9407
9840
  (0, vue.createElementVNode)("p", null, [(0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.defaultUrl")), 1), (0, vue.createElementVNode)("code", {
9408
9841
  class: "docs-playground-resource__ellipsis",
9409
9842
  title: __props.row.defaultUrl || "-"
9410
- }, (0, vue.toDisplayString)(__props.row.defaultUrl || "-"), 9, _hoisted_2$1)])
9843
+ }, (0, vue.toDisplayString)(__props.row.defaultUrl || "-"), 9, _hoisted_2$2)])
9411
9844
  ]),
9412
- (0, vue.createElementVNode)("label", _hoisted_3$1, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.currentUrl")), 1),
9845
+ (0, vue.createElementVNode)("label", _hoisted_3$2, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.currentUrl")), 1),
9413
9846
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Textarea), {
9414
9847
  modelValue: draft.value,
9415
9848
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => draft.value = $event),
@@ -9434,19 +9867,19 @@ var SourceEditor = new _deot_vc.Portal(source_editor_default, {
9434
9867
  });
9435
9868
  //#endregion
9436
9869
  //#region packages/client/src/pages/playground-resource/index.vue?vue&type=script&setup=true&lang.ts
9437
- var _hoisted_1 = { class: "docs-playground-resource" };
9438
- var _hoisted_2 = { class: "docs-playground-resource__header" };
9439
- var _hoisted_3 = ["title"];
9440
- var _hoisted_4 = { class: "docs-playground-resource__hint" };
9441
- var _hoisted_5 = { class: "docs-playground-resource__toolbar" };
9442
- var _hoisted_6 = { class: "docs-playground-resource__toolbar-primary" };
9443
- var _hoisted_7 = { class: "docs-playground-resource__button-content" };
9444
- var _hoisted_8 = { class: "docs-playground-resource__button-content" };
9445
- var _hoisted_9 = { class: "docs-playground-resource__columns" };
9446
- var _hoisted_10 = { class: "docs-playground-resource__toolbar-danger" };
9447
- var _hoisted_11 = ["title"];
9448
- var _hoisted_12 = ["title"];
9449
- var _hoisted_13 = { class: "docs-playground-resource__actions" };
9870
+ var _hoisted_1$1 = { class: "docs-playground-resource" };
9871
+ var _hoisted_2$1 = { class: "docs-playground-resource__header" };
9872
+ var _hoisted_3$1 = ["title"];
9873
+ var _hoisted_4$1 = { class: "docs-playground-resource__hint" };
9874
+ var _hoisted_5$1 = { class: "docs-playground-resource__toolbar" };
9875
+ var _hoisted_6$1 = { class: "docs-playground-resource__toolbar-primary" };
9876
+ var _hoisted_7$1 = { class: "docs-playground-resource__button-content" };
9877
+ var _hoisted_8$1 = { class: "docs-playground-resource__button-content" };
9878
+ var _hoisted_9$1 = { class: "docs-playground-resource__columns" };
9879
+ var _hoisted_10$1 = { class: "docs-playground-resource__toolbar-danger" };
9880
+ var _hoisted_11$1 = ["title"];
9881
+ var _hoisted_12$1 = ["title"];
9882
+ var _hoisted_13$1 = { class: "docs-playground-resource__actions" };
9450
9883
  //#endregion
9451
9884
  //#region packages/client/src/pages/playground-resource/index.vue
9452
9885
  var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -9672,21 +10105,21 @@ var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
9672
10105
  SourceEditor.destroy();
9673
10106
  });
9674
10107
  return (_ctx, _cache) => {
9675
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1, [(0, vue.createElementVNode)("header", _hoisted_2, [(0, vue.createElementVNode)("div", null, [
10108
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1$1, [(0, vue.createElementVNode)("header", _hoisted_2$1, [(0, vue.createElementVNode)("div", null, [
9676
10109
  (0, vue.createElementVNode)("h1", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.title")), 1),
9677
10110
  (0, vue.createElementVNode)("p", null, [
9678
10111
  (0, vue.createTextVNode)(" deot-docs-playground-resource / resources · " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.records", { count: rows.value.length })) + " · ", 1),
9679
- (0, vue.createElementVNode)("span", { title: (0, vue.unref)(currentNamespace) }, (0, vue.toDisplayString)((0, vue.unref)(currentNamespace)), 9, _hoisted_3),
10112
+ (0, vue.createElementVNode)("span", { title: (0, vue.unref)(currentNamespace) }, (0, vue.toDisplayString)((0, vue.unref)(currentNamespace)), 9, _hoisted_3$1),
9680
10113
  (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.cache", { size: namespaceCacheSize.value })), 1)
9681
10114
  ]),
9682
- (0, vue.createElementVNode)("p", _hoisted_4, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.hint")), 1)
9683
- ]), (0, vue.createElementVNode)("div", _hoisted_5, [(0, vue.createElementVNode)("div", _hoisted_6, [
10115
+ (0, vue.createElementVNode)("p", _hoisted_4$1, (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.hint")), 1)
10116
+ ]), (0, vue.createElementVNode)("div", _hoisted_5$1, [(0, vue.createElementVNode)("div", _hoisted_6$1, [
9684
10117
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
9685
10118
  type: "primary",
9686
10119
  disabled: loading.value,
9687
10120
  onClick: handleBack
9688
10121
  }, {
9689
- default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_7, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "back" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.back")), 1)])]),
10122
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_7$1, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "back" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.back")), 1)])]),
9690
10123
  _: 1
9691
10124
  }, 8, ["disabled"]),
9692
10125
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
@@ -9694,14 +10127,14 @@ var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
9694
10127
  disabled: loading.value,
9695
10128
  onClick: handleHome
9696
10129
  }, {
9697
- default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_8, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "home" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.home")), 1)])]),
10130
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", _hoisted_8$1, [(0, vue.createVNode)((0, vue.unref)(icon_default), { name: "home" }), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.home")), 1)])]),
9698
10131
  _: 1
9699
10132
  }, 8, ["disabled"]),
9700
10133
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Popover), {
9701
10134
  trigger: "click",
9702
10135
  placement: "bottom-right"
9703
10136
  }, {
9704
- content: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_9, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(optionalColumns.value, (item) => {
10137
+ content: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_9$1, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(optionalColumns.value, (item) => {
9705
10138
  return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_deot_vc.Checkbox), {
9706
10139
  key: item.value,
9707
10140
  "model-value": isColumnVisible(item.value),
@@ -9738,7 +10171,7 @@ var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
9738
10171
  default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)((0, vue.unref)(t)("client.playgroundResource.prefetch")), 1)]),
9739
10172
  _: 1
9740
10173
  }, 8, ["disabled"])
9741
- ]), (0, vue.createElementVNode)("div", _hoisted_10, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
10174
+ ]), (0, vue.createElementVNode)("div", _hoisted_10$1, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
9742
10175
  type: "error",
9743
10176
  disabled: loading.value || !rows.value.length,
9744
10177
  onClick: handleClear
@@ -9779,7 +10212,7 @@ var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
9779
10212
  default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("span", {
9780
10213
  class: "docs-playground-resource__ellipsis",
9781
10214
  title: row.defaultUrl || "-"
9782
- }, (0, vue.toDisplayString)(row.defaultUrl || "-"), 9, _hoisted_11)]),
10215
+ }, (0, vue.toDisplayString)(row.defaultUrl || "-"), 9, _hoisted_11$1)]),
9783
10216
  _: 1
9784
10217
  }, 8, ["label"])) : (0, vue.createCommentVNode)("v-if", true),
9785
10218
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.TableColumn), {
@@ -9789,7 +10222,7 @@ var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
9789
10222
  default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("span", {
9790
10223
  class: "docs-playground-resource__ellipsis",
9791
10224
  title: row.currentUrl || "-"
9792
- }, (0, vue.toDisplayString)(row.currentUrl || "-"), 9, _hoisted_12)]),
10225
+ }, (0, vue.toDisplayString)(row.currentUrl || "-"), 9, _hoisted_12$1)]),
9793
10226
  _: 1
9794
10227
  }, 8, ["label"]),
9795
10228
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.TableColumn), {
@@ -9840,7 +10273,7 @@ var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
9840
10273
  align: "center",
9841
10274
  fixed: "right"
9842
10275
  }, {
9843
- default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("div", _hoisted_13, [
10276
+ default: (0, vue.withCtx)(({ row }) => [(0, vue.createElementVNode)("div", _hoisted_13$1, [
9844
10277
  (0, vue.createVNode)((0, vue.unref)(_deot_vc.Button), {
9845
10278
  class: "docs-playground-resource__action",
9846
10279
  type: "text",
@@ -9879,6 +10312,199 @@ var playground_resource_default = /* @__PURE__ */ (0, vue.defineComponent)({
9879
10312
  }
9880
10313
  });
9881
10314
  //#endregion
10315
+ //#region packages/client/src/pages/preview-config-generate/index.vue?vue&type=script&setup=true&lang.ts
10316
+ var _hoisted_1 = { class: "docs-preview-config-generate" };
10317
+ var _hoisted_2 = { class: "docs-preview-config-generate__body" };
10318
+ var _hoisted_3 = { class: "docs-preview-config-generate__import" };
10319
+ var _hoisted_4 = { for: "preview-import" };
10320
+ var _hoisted_5 = { class: "docs-preview-config-generate__actions" };
10321
+ var _hoisted_6 = ["placeholder"];
10322
+ var _hoisted_7 = ["disabled"];
10323
+ var _hoisted_8 = {
10324
+ key: 0,
10325
+ role: "alert",
10326
+ class: "docs-preview-config-generate__error"
10327
+ };
10328
+ var _hoisted_9 = { class: "docs-preview-config-generate__fields" };
10329
+ var _hoisted_10 = ["placeholder"];
10330
+ var _hoisted_11 = ["for"];
10331
+ var _hoisted_12 = ["id", "onUpdate:modelValue"];
10332
+ var _hoisted_13 = { for: "preview-lang" };
10333
+ var _hoisted_14 = {
10334
+ key: 0,
10335
+ role: "alert",
10336
+ class: "docs-preview-config-generate__error"
10337
+ };
10338
+ var _hoisted_15 = { class: "docs-preview-config-generate__output" };
10339
+ var _hoisted_16 = { for: "preview-link" };
10340
+ var _hoisted_17 = ["value"];
10341
+ var _hoisted_18 = { class: "docs-preview-config-generate__actions" };
10342
+ var _hoisted_19 = ["href"];
10343
+ var _hoisted_20 = { key: 0 };
10344
+ //#endregion
10345
+ //#region packages/client/src/pages/preview-config-generate/index.vue
10346
+ var preview_config_generate_default = /* @__PURE__ */ (0, vue.defineComponent)({
10347
+ __name: "index",
10348
+ setup(__props) {
10349
+ const route = (0, vue_router.useRoute)();
10350
+ const docs = getDocsConfig();
10351
+ const { t } = (0, _deot_docs_locale.useLocale)();
10352
+ const languageOptions = (0, vue.computed)(() => [{
10353
+ value: "",
10354
+ label: t("client.previewConfigGenerate.defaultLanguage")
10355
+ }, ...Object.entries(docs.locales).map(([value, item]) => ({
10356
+ value,
10357
+ label: item.label || value
10358
+ }))]);
10359
+ const defaults = {
10360
+ url: "",
10361
+ styles: "[]",
10362
+ modules: "{}",
10363
+ playground: "{}",
10364
+ lang: ""
10365
+ };
10366
+ const form = (0, vue.reactive)({ ...defaults });
10367
+ const jsonFields = [
10368
+ "styles",
10369
+ "modules",
10370
+ "playground"
10371
+ ];
10372
+ const importUrl = (0, vue.ref)("");
10373
+ const parseError = (0, vue.ref)("");
10374
+ const messageOf = (reason) => t("client.common.previewConfigFailed", { message: reason instanceof Error ? reason.message : String(reason) });
10375
+ const result = (0, vue.computed)(() => {
10376
+ try {
10377
+ const config = normalizePreviewConfig({
10378
+ url: form.url,
10379
+ lang: form.lang,
10380
+ ...Object.fromEntries(jsonFields.map((field) => [field, JSON.parse(form[field])]))
10381
+ });
10382
+ if (!resolvePreviewType(config.url, location.href)) throw new TypeError(t("client.common.previewUrlUnsupported"));
10383
+ parsePreviewStyleUrls(config.styles, location.href);
10384
+ return {
10385
+ config,
10386
+ href: createPreviewUrl(config, getDocsDeploymentBase(docs)),
10387
+ error: ""
10388
+ };
10389
+ } catch (reason) {
10390
+ return {
10391
+ config: void 0,
10392
+ href: "",
10393
+ error: form.url || jsonFields.some((field) => form[field] !== defaults[field]) ? messageOf(reason) : ""
10394
+ };
10395
+ }
10396
+ });
10397
+ const applyQuery = (query) => {
10398
+ try {
10399
+ const config = readPreviewConfig(query);
10400
+ if (!config.url) throw new TypeError(t("client.common.previewUrlRequired"));
10401
+ form.url = config.url;
10402
+ form.lang = config.lang || "";
10403
+ jsonFields.forEach((field) => form[field] = JSON.stringify(config[field] || {}, null, 2));
10404
+ parseError.value = "";
10405
+ } catch (reason) {
10406
+ parseError.value = messageOf(reason);
10407
+ }
10408
+ };
10409
+ const parseLink = () => {
10410
+ try {
10411
+ const target = new URL(importUrl.value.trim(), location.href);
10412
+ const query = {};
10413
+ target.searchParams.forEach((_, key) => {
10414
+ const values = target.searchParams.getAll(key);
10415
+ query[key] = values.length === 1 ? values[0] : values;
10416
+ });
10417
+ applyQuery(query);
10418
+ } catch (reason) {
10419
+ parseError.value = messageOf(reason);
10420
+ }
10421
+ };
10422
+ (0, vue.watch)(() => route.query, (query) => {
10423
+ if (query.raw !== void 0 || query.url !== void 0) applyQuery(query);
10424
+ }, { immediate: true });
10425
+ return (_ctx, _cache) => {
10426
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("section", _hoisted_1, [(0, vue.createElementVNode)("div", _hoisted_2, [
10427
+ (0, vue.createElementVNode)("header", null, [(0, vue.createElementVNode)("h1", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.title")), 1), (0, vue.createElementVNode)("p", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.description")), 1)]),
10428
+ (0, vue.createElementVNode)("div", _hoisted_3, [
10429
+ (0, vue.createElementVNode)("label", _hoisted_4, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.importLabel")), 1),
10430
+ (0, vue.createElementVNode)("div", _hoisted_5, [(0, vue.withDirectives)((0, vue.createElementVNode)("input", {
10431
+ id: "preview-import",
10432
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => importUrl.value = $event),
10433
+ class: "docs-preview-config-generate__input",
10434
+ placeholder: (0, vue.unref)(t)("client.previewConfigGenerate.parseHint")
10435
+ }, null, 8, _hoisted_6), [[vue.vModelText, importUrl.value]]), (0, vue.createElementVNode)("button", {
10436
+ type: "button",
10437
+ disabled: !importUrl.value.trim(),
10438
+ onClick: parseLink
10439
+ }, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.parse")), 9, _hoisted_7)]),
10440
+ parseError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("p", _hoisted_8, (0, vue.toDisplayString)(parseError.value), 1)) : (0, vue.createCommentVNode)("v-if", true)
10441
+ ]),
10442
+ (0, vue.createElementVNode)("div", _hoisted_9, [
10443
+ _cache[3] || (_cache[3] = (0, vue.createElementVNode)("label", { for: "preview-url" }, "url", -1)),
10444
+ (0, vue.withDirectives)((0, vue.createElementVNode)("input", {
10445
+ id: "preview-url",
10446
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => form.url = $event),
10447
+ class: "docs-preview-config-generate__input",
10448
+ placeholder: (0, vue.unref)(t)("client.previewConfigGenerate.urlHint")
10449
+ }, null, 8, _hoisted_10), [[vue.vModelText, form.url]]),
10450
+ ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(jsonFields, (field) => {
10451
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: field }, [
10452
+ (0, vue.createElementVNode)("label", { for: `preview-${field}` }, (0, vue.toDisplayString)(field), 9, _hoisted_11),
10453
+ (0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
10454
+ id: `preview-${field}`,
10455
+ "onUpdate:modelValue": ($event) => form[field] = $event,
10456
+ rows: "4",
10457
+ spellcheck: "false"
10458
+ }, null, 8, _hoisted_12), [[vue.vModelText, form[field]]]),
10459
+ (0, vue.createElementVNode)("p", null, (0, vue.toDisplayString)((0, vue.unref)(t)(`client.previewConfigGenerate.${field}Hint`)), 1)
10460
+ ], 64);
10461
+ }), 64)),
10462
+ (0, vue.createElementVNode)("label", _hoisted_13, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.language")), 1),
10463
+ (0, vue.createVNode)((0, vue.unref)(_deot_vc.Select), {
10464
+ id: "preview-lang",
10465
+ modelValue: form.lang,
10466
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => form.lang = $event),
10467
+ class: "docs-preview-config-generate__select",
10468
+ data: languageOptions.value,
10469
+ "null-value": "",
10470
+ placeholder: (0, vue.unref)(t)("client.previewConfigGenerate.defaultLanguage")
10471
+ }, null, 8, [
10472
+ "modelValue",
10473
+ "data",
10474
+ "placeholder"
10475
+ ])
10476
+ ]),
10477
+ result.value.error ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("p", _hoisted_14, (0, vue.toDisplayString)(result.value.error), 1)) : (0, vue.createCommentVNode)("v-if", true),
10478
+ (0, vue.createElementVNode)("div", _hoisted_15, [
10479
+ (0, vue.createElementVNode)("label", _hoisted_16, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.link")), 1),
10480
+ (0, vue.createElementVNode)("textarea", {
10481
+ id: "preview-link",
10482
+ value: result.value.href,
10483
+ rows: "4",
10484
+ readonly: "",
10485
+ spellcheck: "false"
10486
+ }, null, 8, _hoisted_17),
10487
+ (0, vue.createElementVNode)("div", _hoisted_18, [(0, vue.createVNode)((0, vue.unref)(_deot_vc.Clipboard), {
10488
+ tag: "button",
10489
+ type: "button",
10490
+ value: result.value.href,
10491
+ disabled: !result.value.href
10492
+ }, {
10493
+ default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.copy")), 1)]),
10494
+ _: 1
10495
+ }, 8, ["value", "disabled"]), result.value.href ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
10496
+ key: 0,
10497
+ href: result.value.href,
10498
+ target: "_blank",
10499
+ rel: "noopener"
10500
+ }, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.preview")), 9, _hoisted_19)) : (0, vue.createCommentVNode)("v-if", true)]),
10501
+ result.value.config ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("details", _hoisted_20, [(0, vue.createElementVNode)("summary", null, (0, vue.toDisplayString)((0, vue.unref)(t)("client.previewConfigGenerate.configuration")), 1), (0, vue.createElementVNode)("pre", null, (0, vue.toDisplayString)(JSON.stringify(result.value.config, null, 2)), 1)])) : (0, vue.createCommentVNode)("v-if", true)
10502
+ ])
10503
+ ])]);
10504
+ };
10505
+ }
10506
+ });
10507
+ //#endregion
9882
10508
  //#region packages/client/src/router/index.ts
9883
10509
  var slotComponents = {
9884
10510
  default: resource_slot_default,
@@ -9942,6 +10568,29 @@ var createDocsRouter = (config, options = {}) => {
9942
10568
  const hasConfiguredDemosRoute = Object.keys(config.routes).some((path) => (path.startsWith("/") ? path : `/${path}`) === "/renderer-editor-demos");
9943
10569
  const isDevelopment = config.runtime?.mode === "development";
9944
10570
  const routes = [
10571
+ {
10572
+ path: "/__docs/preview-config-generate",
10573
+ component: preview_config_generate_default,
10574
+ meta: {
10575
+ docsPreviewConfigGenerate: true,
10576
+ docsRoute: {
10577
+ layout: "none",
10578
+ content: null
10579
+ }
10580
+ }
10581
+ },
10582
+ {
10583
+ path: "/__docs/preview",
10584
+ component: resource_slot_default,
10585
+ props: { name: "content" },
10586
+ meta: {
10587
+ docsPreview: true,
10588
+ docsRoute: {
10589
+ layout: "none",
10590
+ content: null
10591
+ }
10592
+ }
10593
+ },
9945
10594
  {
9946
10595
  path: "/:lang/__docs/database",
9947
10596
  component: database_default,
@@ -10060,6 +10709,14 @@ var createDocsRouter = (config, options = {}) => {
10060
10709
  routes
10061
10710
  });
10062
10711
  router.beforeEach((to) => {
10712
+ if (to.meta.docsPreview || to.meta.docsPreviewConfigGenerate) {
10713
+ let language = "";
10714
+ try {
10715
+ language = readPreviewConfig(to.query).lang || "";
10716
+ } catch {}
10717
+ to.params.lang = hasConfiguredLanguage(config, language) ? language : defaultLanguage;
10718
+ return true;
10719
+ }
10063
10720
  const lang = String(to.params.lang || "");
10064
10721
  const configuredLanguages = Object.keys(config.locales);
10065
10722
  if (lang && (hasConfiguredLanguage(config, lang) || !configuredLanguages.length && lang === defaultLanguage)) {