@deot/docs-playground 1.1.5 → 1.1.6
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/README.md +6 -6
- package/dist/index.cjs +104 -67
- package/dist/index.js +105 -68
- package/dist/index.style.css +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -53,7 +53,7 @@ const files = ref({
|
|
|
53
53
|
| `id` | `string` | `''` | 标题锚点 id;未传时从 `title` 自动生成。仅挂在内联 runtime 标题上,弹窗不重复。 |
|
|
54
54
|
| `expandable` | `true \| number` | `undefined` | 开启预览高度展开;未传不显示控件;`true` 展开到剩余视口;正数为目标高度(px)。 |
|
|
55
55
|
| `previewScroller` | `boolean` | `false` | 在 iframe 内用 `@deot/vc` Scroller 替换原生滚动条;开启后会动态探测 `Scroller`,不存在则回退原生滚动。 |
|
|
56
|
-
| `local` | `boolean` | `
|
|
56
|
+
| `local` | `boolean` | `true` | 在当前文档编译并挂载。内置模块默认继承宿主,可通过 import map 逐个覆盖;预览使用所选 Vue 运行时挂载。 |
|
|
57
57
|
| `options` | `PlaygroundOptions` | `{}` | 传给 Vue REPL store 的实例级选项;`cdnURL` 会同时作用于预览样式和默认 import map。 |
|
|
58
58
|
| `previewOptions` | `SandboxProps['previewOptions']` | `undefined` | 传给当前 iframe 的 preview 选项。 |
|
|
59
59
|
| `locale` | `Language` | `en-US` | 界面语言;未传入时使用上层 Locale Provider。 |
|
|
@@ -149,18 +149,18 @@ const handleMessage = async () => {
|
|
|
149
149
|
|
|
150
150
|
同时导出 `PlaygroundFiles`、`PlaygroundView`、`PlaygroundViewport`、`PlaygroundOptions`、`PlaygroundPreviewOptions`、`EditorFilesChange` 和 `EditorFilesChangeAction` 类型。
|
|
151
151
|
|
|
152
|
-
站点级 Playground 模块与预览 CSS 默认由 Client 的 `$docs.modules` 与 `$docs.styles` 管理(见 [`@deot/docs-client`](../client/README.md)
|
|
152
|
+
站点级 Playground 模块与预览 CSS 默认由 Client 的 `$docs.modules` 与 `$docs.styles` 管理(见 [`@deot/docs-client`](../client/README.md))。模块地址优先级由低到高为:内置默认 → `$docs.modules` → 管理页覆盖 → 实例 `options.builtinImportMap.imports`。实例只覆盖声明的模块,其余继承默认配置;也可通过 `options.cdnURL` 调整默认 CDN。
|
|
153
153
|
|
|
154
154
|
## 运行环境
|
|
155
155
|
|
|
156
|
-
-
|
|
156
|
+
- iframe 运行时通过公共 CDN 加载 Vue 和默认 import map 中的依赖;local 运行时加载 URL 覆盖或宿主未提供的模块时也需要网络访问。
|
|
157
157
|
- 默认 CDN 为 `https://cdn.jsdelivr.net/npm`,可通过 `options.cdnURL` 换成 unpkg 等兼容 `/{package}/{file}` 路径的镜像;该地址用于预览样式和内置 import map。
|
|
158
158
|
- `lodash-es` 和在线 Sass 编译器使用 jsDelivr 的 `/+esm` 入口;unpkg 等 CDN 不支持该路径。
|
|
159
|
-
-
|
|
159
|
+
- 直接渲染时,宿主未提供且未配置的 npm 模块(含作用域包和子路径)自动从 jsDelivr 的 `/+esm` 入口加载;组件包的传递依赖也适用,`import()` 在调用时加载。可用 `options.builtinImportMap.imports` 指定依赖的版本和 URL。
|
|
160
160
|
- Vue SFC 的 `<style lang="scss">` / `lang="sass"` 以及独立 `.scss` / `.sass` 文件会在浏览器里编译;`_partial.scss` 只作为 `@use` 依赖。
|
|
161
|
-
-
|
|
161
|
+
- local 模式按模块识别显式 URL 覆盖,即使地址与内置默认相同也会加载该 URL。覆盖 `vue` 时,预览的编译产物、挂载、组件引用和注入使用这份 Vue;内置组件、hooks、locale、Pinia 和 vue-router 随之重新加载以匹配 Vue,未覆盖的普通工具模块继续复用宿主。不同预览的覆盖互不影响,显式覆盖的模块在各自预览内执行。
|
|
162
162
|
- 每个 Playground 实例都使用自己的 preview 配置和 iframe 消息来源校验。
|
|
163
|
-
- `local` 默认开启:同一份 `files`
|
|
163
|
+
- `local` 默认开启:同一份 `files` 在当前文档里编译。直接渲染不撑开预览高度,`expandable` 固定为关闭,`docs:playground.run` 不会申请临时高度;`<DocsLink>` 仍通过 `docs:navigate` 通知。`local: false` 改回 iframe Sandbox。
|
|
164
164
|
|
|
165
165
|
## 仓库内 examples
|
|
166
166
|
|
package/dist/index.cjs
CHANGED
|
@@ -170,10 +170,10 @@ var icon_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
170
170
|
});
|
|
171
171
|
//#endregion
|
|
172
172
|
//#region packages/playground/src/core/code-preview/github.css?inline
|
|
173
|
-
var github_default = "pre code.hljs{display:block;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{font-weight:700;color:#005cc5}.hljs-bullet{color:#735c0f}.hljs-emphasis{font-style:italic;color:#24292e}.hljs-strong{font-weight:700;color:#24292e}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}[data-doc-theme=dark] .hljs,[data-vc-theme=dark] .hljs{color:#c9d1d9;background:#0d1117}[data-doc-theme=dark] .hljs-doctag,[data-doc-theme=dark] .hljs-keyword,[data-doc-theme=dark] .hljs-meta .hljs-keyword,[data-doc-theme=dark] .hljs-template-tag,[data-doc-theme=dark] .hljs-template-variable,[data-doc-theme=dark] .hljs-type,[data-doc-theme=dark] .hljs-variable.language_,[data-vc-theme=dark] .hljs-doctag,[data-vc-theme=dark] .hljs-keyword,[data-vc-theme=dark] .hljs-meta .hljs-keyword,[data-vc-theme=dark] .hljs-template-tag,[data-vc-theme=dark] .hljs-template-variable,[data-vc-theme=dark] .hljs-type,[data-vc-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-doc-theme=dark] .hljs-title,[data-doc-theme=dark] .hljs-title.class_,[data-doc-theme=dark] .hljs-title.function_,[data-vc-theme=dark] .hljs-title,[data-vc-theme=dark] .hljs-title.class_,[data-vc-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-doc-theme=dark] .hljs-attr,[data-doc-theme=dark] .hljs-literal,[data-doc-theme=dark] .hljs-number,[data-doc-theme=dark] .hljs-variable,[data-vc-theme=dark] .hljs-attr,[data-vc-theme=dark] .hljs-literal,[data-vc-theme=dark] .hljs-number,[data-vc-theme=dark] .hljs-variable{color:#79c0ff}[data-doc-theme=dark] .hljs-regexp,[data-doc-theme=dark] .hljs-string,[data-vc-theme=dark] .hljs-regexp,[data-vc-theme=dark] .hljs-string{color:#a5d6ff}[data-doc-theme=dark] .hljs-code,[data-doc-theme=dark] .hljs-comment,[data-vc-theme=dark] .hljs-code,[data-vc-theme=dark] .hljs-comment{color:#8b949e}[data-doc-theme=dark] .hljs-name,[data-doc-theme=dark] .hljs-selector-tag,[data-vc-theme=dark] .hljs-name,[data-vc-theme=dark] .hljs-selector-tag{color:#7ee787}";
|
|
173
|
+
var github_default = "pre code.hljs{display:block;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{font-weight:700;color:#005cc5}.hljs-bullet{color:#735c0f}.hljs-emphasis{font-style:italic;color:#24292e}.hljs-strong{font-weight:700;color:#24292e}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}@media screen{[data-doc-theme=dark] .hljs,[data-vc-theme=dark] .hljs{color:#c9d1d9;background:#0d1117}[data-doc-theme=dark] .hljs-doctag,[data-doc-theme=dark] .hljs-keyword,[data-doc-theme=dark] .hljs-meta .hljs-keyword,[data-doc-theme=dark] .hljs-template-tag,[data-doc-theme=dark] .hljs-template-variable,[data-doc-theme=dark] .hljs-type,[data-doc-theme=dark] .hljs-variable.language_,[data-vc-theme=dark] .hljs-doctag,[data-vc-theme=dark] .hljs-keyword,[data-vc-theme=dark] .hljs-meta .hljs-keyword,[data-vc-theme=dark] .hljs-template-tag,[data-vc-theme=dark] .hljs-template-variable,[data-vc-theme=dark] .hljs-type,[data-vc-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-doc-theme=dark] .hljs-title,[data-doc-theme=dark] .hljs-title.class_,[data-doc-theme=dark] .hljs-title.function_,[data-vc-theme=dark] .hljs-title,[data-vc-theme=dark] .hljs-title.class_,[data-vc-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-doc-theme=dark] .hljs-attr,[data-doc-theme=dark] .hljs-literal,[data-doc-theme=dark] .hljs-number,[data-doc-theme=dark] .hljs-variable,[data-vc-theme=dark] .hljs-attr,[data-vc-theme=dark] .hljs-literal,[data-vc-theme=dark] .hljs-number,[data-vc-theme=dark] .hljs-variable{color:#79c0ff}[data-doc-theme=dark] .hljs-regexp,[data-doc-theme=dark] .hljs-string,[data-vc-theme=dark] .hljs-regexp,[data-vc-theme=dark] .hljs-string{color:#a5d6ff}[data-doc-theme=dark] .hljs-code,[data-doc-theme=dark] .hljs-comment,[data-vc-theme=dark] .hljs-code,[data-vc-theme=dark] .hljs-comment{color:#8b949e}[data-doc-theme=dark] .hljs-name,[data-doc-theme=dark] .hljs-selector-tag,[data-vc-theme=dark] .hljs-name,[data-vc-theme=dark] .hljs-selector-tag{color:#7ee787}}";
|
|
174
174
|
//#endregion
|
|
175
175
|
//#region packages/playground/src/core/code-preview/code-preview.scss?inline
|
|
176
|
-
var code_preview_default$1 = ".docs-code-preview{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border-radius:8px}.docs-code-preview__language{z-index:1;min-width:28px;padding:0 8px;font-size:12px;line-height:18px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:opacity .15s;transition:opacity .15s}.docs-code-preview__copy,.docs-code-preview__language{position:absolute;top:6px;right:12px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:28px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-code-preview__copy{z-index:2;width:28px;padding:0;pointer-events:none;cursor:pointer;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border:1px solid var(--docs-border-color,var(--vc-color
|
|
176
|
+
var code_preview_default$1 = ".docs-code-preview{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border-radius:8px}.docs-code-preview__language{z-index:1;min-width:28px;padding:0 8px;font-size:12px;line-height:18px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:opacity .15s;transition:opacity .15s}.docs-code-preview__copy,.docs-code-preview__language{position:absolute;top:6px;right:12px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:28px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-code-preview__copy{z-index:2;width:28px;padding:0;pointer-events:none;cursor:pointer;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border:1px solid var(--docs-border-color,var(--vc-border-color,#d4d4d8));border-radius:8px;opacity:0;-webkit-transition:opacity .15s,background-color .15s;transition:opacity .15s,background-color .15s}.docs-code-preview__copy:hover{background:var(--docs-background-color,var(--vc-background-color-lightest,#fff))}.docs-code-preview__copy:focus-visible{pointer-events:auto;opacity:1}.docs-code-preview:has(.docs-code-preview__copy:focus-visible) .docs-code-preview__language,.docs-code-preview:hover .docs-code-preview__language{opacity:0}.docs-code-preview:has(.docs-code-preview__copy:focus-visible) .docs-code-preview__copy,.docs-code-preview:hover .docs-code-preview__copy{pointer-events:auto;opacity:1}.docs-code-preview__scroller{width:100%;height:100%;min-width:0;min-height:0;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-code-preview__code{width:-webkit-max-content;width:-moz-max-content;width:max-content;margin:0}.docs-code-preview__code,.docs-code-preview__code code.hljs{min-width:100%;min-height:100%;overflow:visible;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa))}.docs-code-preview__code code.hljs{display:block;padding:12px 96px 12px 24px;-webkit-box-sizing:border-box;box-sizing:border-box}";
|
|
177
177
|
//#endregion
|
|
178
178
|
//#region packages/playground/src/core/code-preview/style.ts
|
|
179
179
|
var CODE_PREVIEW_STYLE_ID = "docs-code-preview-style";
|
|
@@ -2201,9 +2201,9 @@ var escapeHtmlAttr = (value) => value.replace(/&/gu, "&").replace(/"/gu, "&q
|
|
|
2201
2201
|
/**
|
|
2202
2202
|
* runtime 画布色。`previewInset` 露出的 padding、iframe chrome 和 sandbox
|
|
2203
2203
|
* `html`/`body` 必须共用这一变量,暗色下 `--docs-background-color` 与
|
|
2204
|
-
* `--vc-background-color-
|
|
2204
|
+
* `--vc-background-color-lightest` 不同,否则会出现色带割裂。
|
|
2205
2205
|
*/
|
|
2206
|
-
var PLAYGROUND_RUNTIME_CANVAS_BACKGROUND = "var(--vc-background-color-
|
|
2206
|
+
var PLAYGROUND_RUNTIME_CANVAS_BACKGROUND = "var(--vc-background-color-lightest, var(--docs-background-color, #fff))";
|
|
2207
2207
|
var createRuntimePreviewOptions = (cdnURL = require_css.DEFAULT_CDN_URL, options = {}) => {
|
|
2208
2208
|
const previewScroller = options.previewScroller === true;
|
|
2209
2209
|
const hrefs = Object.values({
|
|
@@ -2233,22 +2233,30 @@ var createRuntimePreviewOptions = (cdnURL = require_css.DEFAULT_CDN_URL, options
|
|
|
2233
2233
|
}
|
|
2234
2234
|
};
|
|
2235
2235
|
};
|
|
2236
|
-
var toReplFilename = (filename) => filename.startsWith("src/") ? filename : `src/${filename}`;
|
|
2236
|
+
var toReplFilename = (filename) => filename === "import-map.json" || filename.startsWith("src/") ? filename : `src/${filename}`;
|
|
2237
2237
|
var createReplFile = (filename, code) => {
|
|
2238
2238
|
const replFilename = toReplFilename(filename);
|
|
2239
2239
|
return new _vue_repl.File(replFilename, code);
|
|
2240
2240
|
};
|
|
2241
2241
|
/**
|
|
2242
|
-
*
|
|
2242
|
+
* 保留显式配置的模块,供 local 区分宿主默认与 URL 覆盖。
|
|
2243
|
+
* @param builtinImportMap 实例层 import map。
|
|
2244
|
+
* @returns 按优先级合并的显式模块地址。
|
|
2245
|
+
*/
|
|
2246
|
+
var createRuntimeImportOverrides = (builtinImportMap) => ({
|
|
2247
|
+
...getPlaygroundSiteModules(),
|
|
2248
|
+
...getPlaygroundImportMapOverrides(),
|
|
2249
|
+
...filterSafeHrefs(builtinImportMap?.imports)
|
|
2250
|
+
});
|
|
2251
|
+
/**
|
|
2252
|
+
* 默认 CDN → 站点 modules → 管理页覆盖 → 实例 builtinImportMap。
|
|
2243
2253
|
* iframe import map 与直接渲染加载的是同一份地址表。
|
|
2244
2254
|
* @param cdnURL
|
|
2245
2255
|
* @param builtinImportMap
|
|
2246
2256
|
*/
|
|
2247
2257
|
var createRuntimeImports = (cdnURL = require_css.DEFAULT_CDN_URL, builtinImportMap) => ({
|
|
2248
2258
|
...require_css.createBuiltinImports(cdnURL),
|
|
2249
|
-
...
|
|
2250
|
-
...filterSafeHrefs(builtinImportMap?.imports),
|
|
2251
|
-
...getPlaygroundImportMapOverrides()
|
|
2259
|
+
...createRuntimeImportOverrides(builtinImportMap)
|
|
2252
2260
|
});
|
|
2253
2261
|
var createRuntimeStore = (files, entry, options) => {
|
|
2254
2262
|
const { cdnURL, builtinImportMap, ...storeOptions } = options;
|
|
@@ -2256,6 +2264,7 @@ var createRuntimeStore = (files, entry, options) => {
|
|
|
2256
2264
|
const file = createReplFile(filename, code);
|
|
2257
2265
|
return [file.filename, file];
|
|
2258
2266
|
})));
|
|
2267
|
+
replFiles.value["import-map.json"] ??= new _vue_repl.File("import-map.json", "{}");
|
|
2259
2268
|
const mainFile = (0, vue.ref)(toReplFilename(entry));
|
|
2260
2269
|
const activeFilename = (0, vue.ref)(toReplFilename(entry));
|
|
2261
2270
|
const imports = createRuntimeImports(cdnURL, builtinImportMap);
|
|
@@ -2274,6 +2283,11 @@ var createRuntimeStore = (files, entry, options) => {
|
|
|
2274
2283
|
})
|
|
2275
2284
|
});
|
|
2276
2285
|
require_css.bindPlaygroundScss(store);
|
|
2286
|
+
const setFiles = store.setFiles.bind(store);
|
|
2287
|
+
store.setFiles = (nextFiles, nextEntry) => setFiles({
|
|
2288
|
+
"import-map.json": store.files["import-map.json"].code,
|
|
2289
|
+
...nextFiles
|
|
2290
|
+
}, nextEntry);
|
|
2277
2291
|
bindReplModules(store);
|
|
2278
2292
|
require_css.whenSassReady(files, () => {
|
|
2279
2293
|
const specifiers = require_css.collectBareSpecifiers(files, Object.keys(files));
|
|
@@ -2525,7 +2539,7 @@ var Alone = new _deot_vc.Portal(wrapper_default, {
|
|
|
2525
2539
|
/**
|
|
2526
2540
|
* 直接渲染与页面同文档,弹层不需要临时撑高。
|
|
2527
2541
|
* `run` 仍返回可调用函数,但不会申请高度,也不会改动预览尺寸。
|
|
2528
|
-
* @param vue
|
|
2542
|
+
* @param vue 当前预览的 Vue,只用其中的 `isRef`。
|
|
2529
2543
|
* @returns 注入给预览的 `docs:playground`。
|
|
2530
2544
|
*/
|
|
2531
2545
|
var createLocalPlayground = (vue) => {
|
|
@@ -2776,6 +2790,15 @@ var resolveHostModule = (id, modules) => {
|
|
|
2776
2790
|
return null;
|
|
2777
2791
|
};
|
|
2778
2792
|
var HOST_VUE_SPECIFIERS = /* @__PURE__ */ new Set(["vue", "vue/server-renderer"]);
|
|
2793
|
+
var VUE_DEPENDENT_BUILTINS = /* @__PURE__ */ new Set([
|
|
2794
|
+
"vue/server-renderer",
|
|
2795
|
+
"vue-router",
|
|
2796
|
+
"pinia",
|
|
2797
|
+
"@deot/vc",
|
|
2798
|
+
"@deot/vc-components",
|
|
2799
|
+
"@deot/vc-hooks",
|
|
2800
|
+
"@deot/vc-locale"
|
|
2801
|
+
]);
|
|
2779
2802
|
var messageOf = (error) => error instanceof Error ? error.message : String(error);
|
|
2780
2803
|
/**
|
|
2781
2804
|
* 找到 import map 里能覆盖该说明符的键。子路径没有独立 URL 时回退到父包。
|
|
@@ -2794,24 +2817,23 @@ var resolveImportTarget = (id, imports) => {
|
|
|
2794
2817
|
cursor = parent;
|
|
2795
2818
|
}
|
|
2796
2819
|
};
|
|
2797
|
-
var prefersLocalBuiltin = (id, imports,
|
|
2820
|
+
var prefersLocalBuiltin = (id, imports, overrides = new Set(Object.keys(imports))) => {
|
|
2798
2821
|
if (!localBuiltinIds.has(id) && !HOST_VUE_SPECIFIERS.has(id)) return false;
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
return url === require_css.createBuiltinImports(cdnURL)[id];
|
|
2822
|
+
if (overrides.has(id)) return false;
|
|
2823
|
+
return !VUE_DEPENDENT_BUILTINS.has(id) || !overrides.has("vue");
|
|
2802
2824
|
};
|
|
2803
2825
|
/**
|
|
2804
|
-
*
|
|
2826
|
+
* 内置依赖默认注入宿主副本,显式 URL 按模块覆盖,包括与默认 CDN 相同的地址。
|
|
2805
2827
|
* @param specifiers 本次预览用到的裸模块说明符。
|
|
2806
2828
|
* @param imports 合并后的 import map。
|
|
2807
2829
|
* @param builtins 宿主 Vue 与 vue-router。
|
|
2808
2830
|
* @param builtins.vue 当前页面的 Vue 模块。
|
|
2809
2831
|
* @param builtins.vueRouter 打包进来的 vue-router,可被 import map 覆盖。
|
|
2810
2832
|
* @param loader 按 URL 加载远程模块。
|
|
2811
|
-
* @param
|
|
2833
|
+
* @param overrides 显式配置的模块名,与自动补齐的默认地址区分。
|
|
2812
2834
|
* @returns 模块表和加载错误。
|
|
2813
2835
|
*/
|
|
2814
|
-
var loadLocalModules = async (specifiers, imports, builtins, loader,
|
|
2836
|
+
var loadLocalModules = async (specifiers, imports, builtins, loader, overrides = new Set(Object.keys(imports))) => {
|
|
2815
2837
|
const modules = {
|
|
2816
2838
|
"vue": builtins.vue,
|
|
2817
2839
|
"vue-router": builtins.vueRouter
|
|
@@ -2821,14 +2843,14 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2821
2843
|
const localIds = /* @__PURE__ */ new Set();
|
|
2822
2844
|
specifiers.forEach((specifier) => {
|
|
2823
2845
|
let local = false;
|
|
2824
|
-
if (prefersLocalBuiltin(specifier, imports,
|
|
2846
|
+
if (prefersLocalBuiltin(specifier, imports, overrides)) localIds.add(specifier);
|
|
2825
2847
|
else {
|
|
2826
2848
|
let cursor = specifier;
|
|
2827
2849
|
while (true) {
|
|
2828
2850
|
const slash = cursor.lastIndexOf("/");
|
|
2829
2851
|
if (slash <= 0) break;
|
|
2830
2852
|
const parent = cursor.slice(0, slash);
|
|
2831
|
-
if (prefersLocalBuiltin(parent, imports,
|
|
2853
|
+
if (prefersLocalBuiltin(parent, imports, overrides)) {
|
|
2832
2854
|
localIds.add(parent);
|
|
2833
2855
|
local = true;
|
|
2834
2856
|
break;
|
|
@@ -2836,12 +2858,8 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2836
2858
|
cursor = parent;
|
|
2837
2859
|
}
|
|
2838
2860
|
}
|
|
2839
|
-
if (specifier === "vue-router") {
|
|
2840
|
-
if (imports["vue-router"]) targets.add("vue-router");
|
|
2841
|
-
return;
|
|
2842
|
-
}
|
|
2843
2861
|
const target = resolveImportTarget(specifier, imports);
|
|
2844
|
-
if (target && prefersLocalBuiltin(target, imports,
|
|
2862
|
+
if (target && prefersLocalBuiltin(target, imports, overrides)) localIds.add(target);
|
|
2845
2863
|
else if (target) targets.add(target);
|
|
2846
2864
|
else if (!local && !localIds.has(specifier)) {
|
|
2847
2865
|
imports[specifier] = require_css.resolveNpmImport(specifier);
|
|
@@ -2858,7 +2876,7 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2858
2876
|
}));
|
|
2859
2877
|
for (const id of targets) {
|
|
2860
2878
|
const url = imports[id];
|
|
2861
|
-
if (!url || prefersLocalBuiltin(id, imports,
|
|
2879
|
+
if (!url || prefersLocalBuiltin(id, imports, overrides)) continue;
|
|
2862
2880
|
try {
|
|
2863
2881
|
modules[id] = await loader(url);
|
|
2864
2882
|
} catch (error) {
|
|
@@ -2873,12 +2891,13 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2873
2891
|
//#endregion
|
|
2874
2892
|
//#region packages/playground/src/core/runtime/local/vue-guard.ts
|
|
2875
2893
|
/**
|
|
2876
|
-
* 给 files
|
|
2894
|
+
* 给 files 注入选定的 Vue,但 `createApp().mount` 不会卸掉页面。
|
|
2877
2895
|
* 防护按本次 link 创建,多个 Playground 互不覆盖。
|
|
2878
2896
|
* @param capture 本次链接收集到的根组件、局部组件和 provide。
|
|
2897
|
+
* @param vue 当前预览选定的 Vue。
|
|
2879
2898
|
* @returns 带防护的 Vue 模块。
|
|
2880
2899
|
*/
|
|
2881
|
-
var createGuardedVue = (capture) => {
|
|
2900
|
+
var createGuardedVue = (capture, vue$4 = vue) => {
|
|
2882
2901
|
const createApp = (rootComponent, rootProps) => {
|
|
2883
2902
|
const fakeApp = {
|
|
2884
2903
|
_component: rootComponent,
|
|
@@ -2918,14 +2937,14 @@ var createGuardedVue = (capture) => {
|
|
|
2918
2937
|
mount() {
|
|
2919
2938
|
capture.components = { ...fakeApp._context.components };
|
|
2920
2939
|
capture.provides = { ...fakeApp._context.provides };
|
|
2921
|
-
capture.mountedComponent =
|
|
2940
|
+
capture.mountedComponent = vue$4.defineComponent({
|
|
2922
2941
|
name: "PlaygroundCapturedApp",
|
|
2923
2942
|
components: fakeApp._context.components,
|
|
2924
2943
|
setup() {
|
|
2925
2944
|
Reflect.ownKeys(fakeApp._context.provides).forEach((key) => {
|
|
2926
|
-
|
|
2945
|
+
vue$4.provide(key, fakeApp._context.provides[key]);
|
|
2927
2946
|
});
|
|
2928
|
-
return () =>
|
|
2947
|
+
return () => vue$4.h(rootComponent, rootProps || null);
|
|
2929
2948
|
}
|
|
2930
2949
|
});
|
|
2931
2950
|
return capture.mountedComponent;
|
|
@@ -2937,7 +2956,7 @@ var createGuardedVue = (capture) => {
|
|
|
2937
2956
|
};
|
|
2938
2957
|
return fakeApp;
|
|
2939
2958
|
};
|
|
2940
|
-
return new Proxy(vue, { get(target, prop, receiver) {
|
|
2959
|
+
return new Proxy(vue$4, { get(target, prop, receiver) {
|
|
2941
2960
|
if (prop === "createApp" || prop === "createSSRApp") return createApp;
|
|
2942
2961
|
if (prop === "default") return receiver;
|
|
2943
2962
|
return Reflect.get(target, prop, receiver);
|
|
@@ -2947,7 +2966,7 @@ var createGuardedVue = (capture) => {
|
|
|
2947
2966
|
//#region packages/playground/src/core/runtime/local/linker.ts
|
|
2948
2967
|
/**
|
|
2949
2968
|
* 在当前页面链接编译结果,返回入口组件。
|
|
2950
|
-
*
|
|
2969
|
+
* 给选定的 Vue 加上 mount 防护,避免字符串入口卸掉页面。
|
|
2951
2970
|
* @param compiled 浏览器编译结果。
|
|
2952
2971
|
* @param files 当前 Playground 文件表。
|
|
2953
2972
|
* @param options 可选的宿主模块表。
|
|
@@ -2966,7 +2985,7 @@ var linkPlayground = (compiled, files, options = {}) => {
|
|
|
2966
2985
|
provides: {}
|
|
2967
2986
|
};
|
|
2968
2987
|
const modules = { ...options.modules || {} };
|
|
2969
|
-
|
|
2988
|
+
modules.vue = createGuardedVue(capture, modules.vue || vue);
|
|
2970
2989
|
const fileIndex = require_css.createFileIndex(files);
|
|
2971
2990
|
const root = require_css.getCommonRoot([...fileIndex.keys()]);
|
|
2972
2991
|
const cache = /* @__PURE__ */ new Map();
|
|
@@ -3034,16 +3053,17 @@ var linkPlayground = (compiled, files, options = {}) => {
|
|
|
3034
3053
|
//#endregion
|
|
3035
3054
|
//#region packages/playground/src/core/runtime/local/remote.ts
|
|
3036
3055
|
var HOST_VUE = /* @__PURE__ */ new Set(["vue", "vue/server-renderer"]);
|
|
3056
|
+
var moduleUrl = (url) => new URL(url, globalThis.location?.href).href;
|
|
3037
3057
|
/**
|
|
3038
3058
|
* 把 CDN 上的 ESM 先拉完整张依赖图,再在当前页面里执行。
|
|
3039
3059
|
* 裸导入优先走 import map,缺失的 npm 依赖回退到 CDN ESM;import() 按需加载。
|
|
3040
3060
|
* @param imports 合并后的 import map。
|
|
3041
3061
|
* @param builtins 宿主 Vue 与 vue-router。
|
|
3042
|
-
* @param
|
|
3062
|
+
* @param overrides 显式配置的模块名,与自动补齐的默认地址区分。
|
|
3043
3063
|
* @param importModule 浏览器原生 ESM 加载器。
|
|
3044
3064
|
* @returns 按 URL 加载并执行远程模块的加载器。
|
|
3045
3065
|
*/
|
|
3046
|
-
var createRemoteLoader = (imports, builtins,
|
|
3066
|
+
var createRemoteLoader = (imports, builtins, overrides = new Set(Object.keys(imports)), importModule = (url) => import(
|
|
3047
3067
|
/* @vite-ignore */
|
|
3048
3068
|
url
|
|
3049
3069
|
)) => {
|
|
@@ -3069,24 +3089,34 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3069
3089
|
return pending;
|
|
3070
3090
|
};
|
|
3071
3091
|
const localBuiltinId = (id) => {
|
|
3072
|
-
if (imports[id] && !prefersLocalBuiltin(id, imports,
|
|
3073
|
-
if (prefersLocalBuiltin(id, imports,
|
|
3092
|
+
if (imports[id] && !prefersLocalBuiltin(id, imports, overrides)) return null;
|
|
3093
|
+
if (prefersLocalBuiltin(id, imports, overrides)) return id;
|
|
3074
3094
|
let cursor = id;
|
|
3075
3095
|
while (true) {
|
|
3076
3096
|
const slash = cursor.lastIndexOf("/");
|
|
3077
3097
|
if (slash <= 0) return null;
|
|
3078
3098
|
const parent = cursor.slice(0, slash);
|
|
3079
|
-
if (prefersLocalBuiltin(parent, imports,
|
|
3099
|
+
if (prefersLocalBuiltin(parent, imports, overrides)) return parent;
|
|
3080
3100
|
cursor = parent;
|
|
3081
3101
|
}
|
|
3082
3102
|
};
|
|
3083
|
-
const
|
|
3084
|
-
if (require_css.isRelativeSpecifier(specifier) || /^https?:\/\//.test(specifier))
|
|
3085
|
-
|
|
3086
|
-
|
|
3103
|
+
const dependencySpecifier = (from, specifier) => {
|
|
3104
|
+
if (require_css.isRelativeSpecifier(specifier) || /^https?:\/\//.test(specifier)) {
|
|
3105
|
+
const url = new URL(specifier, from);
|
|
3106
|
+
const match = url.origin === "https://cdn.jsdelivr.net" ? url.pathname.match(/^\/npm\/((?:@[^/]+\/)?[^/@]+)(?:@[^/]+)?\/\+esm$/) : null;
|
|
3107
|
+
if (match && (imports[match[1]] || localBuiltinIds.has(match[1]))) return match[1];
|
|
3108
|
+
return url.href;
|
|
3109
|
+
}
|
|
3110
|
+
return specifier;
|
|
3111
|
+
};
|
|
3112
|
+
const dependencyUrl = (from, id) => {
|
|
3113
|
+
const specifier = dependencySpecifier(from, id);
|
|
3114
|
+
if (/^https?:\/\//.test(specifier)) return specifier;
|
|
3115
|
+
if (imports[specifier] && !prefersLocalBuiltin(specifier, imports, overrides)) return moduleUrl(imports[specifier]);
|
|
3116
|
+
if (HOST_VUE.has(specifier) && prefersLocalBuiltin(specifier, imports, overrides)) return null;
|
|
3087
3117
|
let cursor = specifier;
|
|
3088
3118
|
while (cursor) {
|
|
3089
|
-
if (localBuiltinIds.has(cursor) && prefersLocalBuiltin(cursor, imports,
|
|
3119
|
+
if (localBuiltinIds.has(cursor) && prefersLocalBuiltin(cursor, imports, overrides)) {
|
|
3090
3120
|
pendingBuiltins.add(cursor);
|
|
3091
3121
|
return null;
|
|
3092
3122
|
}
|
|
@@ -3099,10 +3129,10 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3099
3129
|
imports[specifier] = require_css.resolveNpmImport(specifier);
|
|
3100
3130
|
return imports[specifier];
|
|
3101
3131
|
}
|
|
3102
|
-
return imports[target];
|
|
3132
|
+
return moduleUrl(imports[target]);
|
|
3103
3133
|
};
|
|
3104
3134
|
const crawl = async (url) => {
|
|
3105
|
-
if (/\/\+esm(?:[?#]|$)/.test(url)) {
|
|
3135
|
+
if (!overrides.size && /\/\+esm(?:[?#]|$)/.test(url)) {
|
|
3106
3136
|
await loadNative(url);
|
|
3107
3137
|
return;
|
|
3108
3138
|
}
|
|
@@ -3122,14 +3152,15 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3122
3152
|
if (next) await crawl(next);
|
|
3123
3153
|
}));
|
|
3124
3154
|
};
|
|
3125
|
-
const requireFrom = (from) => (
|
|
3126
|
-
|
|
3155
|
+
const requireFrom = (from) => (specifier) => {
|
|
3156
|
+
const id = dependencySpecifier(from, specifier);
|
|
3157
|
+
if (HOST_VUE.has(id) && prefersLocalBuiltin(id, imports, overrides)) return toHostModule(builtins.vue);
|
|
3127
3158
|
const builtinId = localBuiltinId(id);
|
|
3128
3159
|
if (builtinId) return toHostModule(hostModules[builtinId]);
|
|
3129
|
-
if (require_css.isRelativeSpecifier(id) || /^https?:\/\//.test(id)) return evaluate(
|
|
3160
|
+
if (require_css.isRelativeSpecifier(id) || /^https?:\/\//.test(id)) return evaluate(dependencyUrl(from, id));
|
|
3130
3161
|
const target = imports[id] ? id : resolveImportTarget(id, imports);
|
|
3131
3162
|
if (!target || !imports[target]) throw new Error(`[Playground] 未注册的模块 "${id}"`);
|
|
3132
|
-
const loaded = evaluate(imports[target]);
|
|
3163
|
+
const loaded = evaluate(moduleUrl(imports[target]));
|
|
3133
3164
|
if (target === id) return loaded;
|
|
3134
3165
|
if (!resolveHostModule(id, { [target]: loaded }))
|
|
3135
3166
|
/* istanbul ignore next -- 父包没有对应导出时才拒绝 */
|
|
@@ -3152,7 +3183,7 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3152
3183
|
const next = dependencyUrl(url, id);
|
|
3153
3184
|
if (next) await load(next);
|
|
3154
3185
|
else {
|
|
3155
|
-
const builtinId = localBuiltinId(id);
|
|
3186
|
+
const builtinId = localBuiltinId(dependencySpecifier(url, id));
|
|
3156
3187
|
if (builtinId && !(builtinId in hostModules)) hostModules[builtinId] = await ensureLocalBuiltin(builtinId);
|
|
3157
3188
|
}
|
|
3158
3189
|
return requireFrom(url)(id);
|
|
@@ -3161,7 +3192,8 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3161
3192
|
return module.exports;
|
|
3162
3193
|
};
|
|
3163
3194
|
const loading = /* @__PURE__ */ new Map();
|
|
3164
|
-
const load = (
|
|
3195
|
+
const load = (sourceUrl) => {
|
|
3196
|
+
const url = moduleUrl(sourceUrl);
|
|
3165
3197
|
const pending = loading.get(url);
|
|
3166
3198
|
if (pending) return pending;
|
|
3167
3199
|
const task = (async () => {
|
|
@@ -3222,14 +3254,14 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0
|
|
|
3222
3254
|
});
|
|
3223
3255
|
};
|
|
3224
3256
|
(0, vue.watch)([compileError, runtimeError], publishError);
|
|
3225
|
-
const createDocsLink = (preview) =>
|
|
3257
|
+
const createDocsLink = (preview, vue$2) => vue$2.defineComponent({
|
|
3226
3258
|
name: "DocsLink",
|
|
3227
3259
|
props: { to: {
|
|
3228
3260
|
type: String,
|
|
3229
3261
|
default: ""
|
|
3230
3262
|
} },
|
|
3231
3263
|
setup(linkProps, { slots }) {
|
|
3232
|
-
return () =>
|
|
3264
|
+
return () => vue$2.h("a", {
|
|
3233
3265
|
href: linkProps.to,
|
|
3234
3266
|
style: {
|
|
3235
3267
|
color: "inherit",
|
|
@@ -3250,27 +3282,27 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0
|
|
|
3250
3282
|
previewApp = null;
|
|
3251
3283
|
require_css.removeStyle(styleId);
|
|
3252
3284
|
};
|
|
3253
|
-
const mountPreview = (
|
|
3285
|
+
const mountPreview = (job, preview) => {
|
|
3254
3286
|
if (!mountEl.value) return;
|
|
3287
|
+
const { component, vue: vue$3, scroller, css } = job;
|
|
3255
3288
|
destroyPreview();
|
|
3256
3289
|
require_css.injectStyle(styleId, css);
|
|
3257
3290
|
if (props.clearConsole) console.clear();
|
|
3258
|
-
const
|
|
3259
|
-
const app = vue.createApp({
|
|
3291
|
+
const app = vue$3.createApp({
|
|
3260
3292
|
name: "LocalSandboxRoot",
|
|
3261
3293
|
setup() {
|
|
3262
|
-
const service = createLocalPlayground(vue);
|
|
3263
|
-
|
|
3264
|
-
|
|
3294
|
+
const service = createLocalPlayground(vue$3);
|
|
3295
|
+
vue$3.provide("docs:playground", service);
|
|
3296
|
+
vue$3.onErrorCaptured((error) => {
|
|
3265
3297
|
const message = formatPlaygroundRuntimeError(error);
|
|
3266
3298
|
if (message) runtimeError.value = message;
|
|
3267
3299
|
return false;
|
|
3268
3300
|
});
|
|
3269
|
-
|
|
3301
|
+
vue$3.onBeforeUnmount(() => service.dispose());
|
|
3270
3302
|
return () => {
|
|
3271
|
-
const content =
|
|
3272
|
-
if (!
|
|
3273
|
-
return
|
|
3303
|
+
const content = vue$3.h(component);
|
|
3304
|
+
if (!scroller) return content;
|
|
3305
|
+
return vue$3.h(scroller, {
|
|
3274
3306
|
height: "100%",
|
|
3275
3307
|
native: false,
|
|
3276
3308
|
autoResize: true,
|
|
@@ -3280,7 +3312,7 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0
|
|
|
3280
3312
|
};
|
|
3281
3313
|
}
|
|
3282
3314
|
});
|
|
3283
|
-
app.component("DocsLink", createDocsLink(preview));
|
|
3315
|
+
app.component("DocsLink", createDocsLink(preview, vue$3));
|
|
3284
3316
|
app.config.errorHandler = (error) => {
|
|
3285
3317
|
const message = formatPlaygroundRuntimeError(error);
|
|
3286
3318
|
if (message) runtimeError.value = message;
|
|
@@ -3311,7 +3343,7 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0
|
|
|
3311
3343
|
/* istanbul ignore if -- 桥接 iframe 尚未就绪或编译已被取代 */
|
|
3312
3344
|
if (pendingMount !== job || !mountEl.value) return;
|
|
3313
3345
|
pendingMount = null;
|
|
3314
|
-
mountPreview(job
|
|
3346
|
+
mountPreview(job, preview);
|
|
3315
3347
|
};
|
|
3316
3348
|
const run = async () => {
|
|
3317
3349
|
const current = ++version;
|
|
@@ -3333,15 +3365,18 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0
|
|
|
3333
3365
|
return;
|
|
3334
3366
|
}
|
|
3335
3367
|
const imports = createRuntimeImports(props.options.cdnURL, props.options.builtinImportMap);
|
|
3368
|
+
const overrides = new Set(Object.keys(createRuntimeImportOverrides(props.options.builtinImportMap)));
|
|
3336
3369
|
const specifiers = require_css.collectBareSpecifiers(props.files, require_css.collectReachableFilenames(props.files, compiled.entry));
|
|
3370
|
+
specifiers.push("vue");
|
|
3371
|
+
if (props.previewScroller === true) specifiers.push("@deot/vc");
|
|
3337
3372
|
const remote = createRemoteLoader(imports, {
|
|
3338
3373
|
vue,
|
|
3339
3374
|
vueRouter: vue_router
|
|
3340
|
-
},
|
|
3375
|
+
}, overrides);
|
|
3341
3376
|
const loaded = await loadLocalModules(specifiers, imports, {
|
|
3342
3377
|
vue,
|
|
3343
3378
|
vueRouter: vue_router
|
|
3344
|
-
}, (url) => remote.load(url),
|
|
3379
|
+
}, (url) => remote.load(url), overrides);
|
|
3345
3380
|
/* istanbul ignore if -- 并发编译时只保留最后一次 */
|
|
3346
3381
|
if (current !== version) return;
|
|
3347
3382
|
if (loaded.errors.length) {
|
|
@@ -3359,6 +3394,8 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0
|
|
|
3359
3394
|
}
|
|
3360
3395
|
pendingMount = {
|
|
3361
3396
|
component: linked.component,
|
|
3397
|
+
vue: loaded.modules.vue,
|
|
3398
|
+
scroller: props.previewScroller === true ? loaded.modules["@deot/vc"].Scroller : void 0,
|
|
3362
3399
|
css: linked.css,
|
|
3363
3400
|
version: current
|
|
3364
3401
|
};
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { C as normalizeCdnURL, D as NEW_SFC_CODE, E as DEFAULT_ENTRY, S as createBuiltinStyles, T as DEFAULT_CDN_URL, _ as bindPlaygroundScss, a as transformScript, b as whenSassReady, c as createFileIndex, d as isIgnoredFilename, f as isInsideRoot, g as resolveModulePath, i as rewriteImportMeta, l as getCommonRoot, m as normalizeVirtualPath, n as injectStyle, o as collectBareSpecifiers, p as isRelativeSpecifier, r as removeStyle, s as collectReachableFilenames, w as resolveNpmImport, x as createBuiltinImports } from "./css-DleINdoA.js";
|
|
2
2
|
import * as Vue from "vue";
|
|
3
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent,
|
|
3
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, shallowRef, toDisplayString, unref, vModelText, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
|
|
4
4
|
import * as Vc from "@deot/vc";
|
|
5
5
|
import { Clipboard, Dropdown, DropdownItem, DropdownMenu, Message, Popconfirm, Portal, Scroller, TransitionFade } from "@deot/vc";
|
|
6
6
|
import { provideLocale, useLocale } from "@deot/docs-locale";
|
|
@@ -175,10 +175,10 @@ var icon_default = /* @__PURE__ */ defineComponent({
|
|
|
175
175
|
});
|
|
176
176
|
//#endregion
|
|
177
177
|
//#region packages/playground/src/core/code-preview/github.css?inline
|
|
178
|
-
var github_default = "pre code.hljs{display:block;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{font-weight:700;color:#005cc5}.hljs-bullet{color:#735c0f}.hljs-emphasis{font-style:italic;color:#24292e}.hljs-strong{font-weight:700;color:#24292e}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}[data-doc-theme=dark] .hljs,[data-vc-theme=dark] .hljs{color:#c9d1d9;background:#0d1117}[data-doc-theme=dark] .hljs-doctag,[data-doc-theme=dark] .hljs-keyword,[data-doc-theme=dark] .hljs-meta .hljs-keyword,[data-doc-theme=dark] .hljs-template-tag,[data-doc-theme=dark] .hljs-template-variable,[data-doc-theme=dark] .hljs-type,[data-doc-theme=dark] .hljs-variable.language_,[data-vc-theme=dark] .hljs-doctag,[data-vc-theme=dark] .hljs-keyword,[data-vc-theme=dark] .hljs-meta .hljs-keyword,[data-vc-theme=dark] .hljs-template-tag,[data-vc-theme=dark] .hljs-template-variable,[data-vc-theme=dark] .hljs-type,[data-vc-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-doc-theme=dark] .hljs-title,[data-doc-theme=dark] .hljs-title.class_,[data-doc-theme=dark] .hljs-title.function_,[data-vc-theme=dark] .hljs-title,[data-vc-theme=dark] .hljs-title.class_,[data-vc-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-doc-theme=dark] .hljs-attr,[data-doc-theme=dark] .hljs-literal,[data-doc-theme=dark] .hljs-number,[data-doc-theme=dark] .hljs-variable,[data-vc-theme=dark] .hljs-attr,[data-vc-theme=dark] .hljs-literal,[data-vc-theme=dark] .hljs-number,[data-vc-theme=dark] .hljs-variable{color:#79c0ff}[data-doc-theme=dark] .hljs-regexp,[data-doc-theme=dark] .hljs-string,[data-vc-theme=dark] .hljs-regexp,[data-vc-theme=dark] .hljs-string{color:#a5d6ff}[data-doc-theme=dark] .hljs-code,[data-doc-theme=dark] .hljs-comment,[data-vc-theme=dark] .hljs-code,[data-vc-theme=dark] .hljs-comment{color:#8b949e}[data-doc-theme=dark] .hljs-name,[data-doc-theme=dark] .hljs-selector-tag,[data-vc-theme=dark] .hljs-name,[data-vc-theme=dark] .hljs-selector-tag{color:#7ee787}";
|
|
178
|
+
var github_default = "pre code.hljs{display:block;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{font-weight:700;color:#005cc5}.hljs-bullet{color:#735c0f}.hljs-emphasis{font-style:italic;color:#24292e}.hljs-strong{font-weight:700;color:#24292e}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}@media screen{[data-doc-theme=dark] .hljs,[data-vc-theme=dark] .hljs{color:#c9d1d9;background:#0d1117}[data-doc-theme=dark] .hljs-doctag,[data-doc-theme=dark] .hljs-keyword,[data-doc-theme=dark] .hljs-meta .hljs-keyword,[data-doc-theme=dark] .hljs-template-tag,[data-doc-theme=dark] .hljs-template-variable,[data-doc-theme=dark] .hljs-type,[data-doc-theme=dark] .hljs-variable.language_,[data-vc-theme=dark] .hljs-doctag,[data-vc-theme=dark] .hljs-keyword,[data-vc-theme=dark] .hljs-meta .hljs-keyword,[data-vc-theme=dark] .hljs-template-tag,[data-vc-theme=dark] .hljs-template-variable,[data-vc-theme=dark] .hljs-type,[data-vc-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-doc-theme=dark] .hljs-title,[data-doc-theme=dark] .hljs-title.class_,[data-doc-theme=dark] .hljs-title.function_,[data-vc-theme=dark] .hljs-title,[data-vc-theme=dark] .hljs-title.class_,[data-vc-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-doc-theme=dark] .hljs-attr,[data-doc-theme=dark] .hljs-literal,[data-doc-theme=dark] .hljs-number,[data-doc-theme=dark] .hljs-variable,[data-vc-theme=dark] .hljs-attr,[data-vc-theme=dark] .hljs-literal,[data-vc-theme=dark] .hljs-number,[data-vc-theme=dark] .hljs-variable{color:#79c0ff}[data-doc-theme=dark] .hljs-regexp,[data-doc-theme=dark] .hljs-string,[data-vc-theme=dark] .hljs-regexp,[data-vc-theme=dark] .hljs-string{color:#a5d6ff}[data-doc-theme=dark] .hljs-code,[data-doc-theme=dark] .hljs-comment,[data-vc-theme=dark] .hljs-code,[data-vc-theme=dark] .hljs-comment{color:#8b949e}[data-doc-theme=dark] .hljs-name,[data-doc-theme=dark] .hljs-selector-tag,[data-vc-theme=dark] .hljs-name,[data-vc-theme=dark] .hljs-selector-tag{color:#7ee787}}";
|
|
179
179
|
//#endregion
|
|
180
180
|
//#region packages/playground/src/core/code-preview/code-preview.scss?inline
|
|
181
|
-
var code_preview_default$1 = ".docs-code-preview{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border-radius:8px}.docs-code-preview__language{z-index:1;min-width:28px;padding:0 8px;font-size:12px;line-height:18px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:opacity .15s;transition:opacity .15s}.docs-code-preview__copy,.docs-code-preview__language{position:absolute;top:6px;right:12px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:28px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-code-preview__copy{z-index:2;width:28px;padding:0;pointer-events:none;cursor:pointer;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border:1px solid var(--docs-border-color,var(--vc-color
|
|
181
|
+
var code_preview_default$1 = ".docs-code-preview{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border-radius:8px}.docs-code-preview__language{z-index:1;min-width:28px;padding:0 8px;font-size:12px;line-height:18px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:opacity .15s;transition:opacity .15s}.docs-code-preview__copy,.docs-code-preview__language{position:absolute;top:6px;right:12px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:28px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-code-preview__copy{z-index:2;width:28px;padding:0;pointer-events:none;cursor:pointer;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border:1px solid var(--docs-border-color,var(--vc-border-color,#d4d4d8));border-radius:8px;opacity:0;-webkit-transition:opacity .15s,background-color .15s;transition:opacity .15s,background-color .15s}.docs-code-preview__copy:hover{background:var(--docs-background-color,var(--vc-background-color-lightest,#fff))}.docs-code-preview__copy:focus-visible{pointer-events:auto;opacity:1}.docs-code-preview:has(.docs-code-preview__copy:focus-visible) .docs-code-preview__language,.docs-code-preview:hover .docs-code-preview__language{opacity:0}.docs-code-preview:has(.docs-code-preview__copy:focus-visible) .docs-code-preview__copy,.docs-code-preview:hover .docs-code-preview__copy{pointer-events:auto;opacity:1}.docs-code-preview__scroller{width:100%;height:100%;min-width:0;min-height:0;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-code-preview__code{width:-webkit-max-content;width:-moz-max-content;width:max-content;margin:0}.docs-code-preview__code,.docs-code-preview__code code.hljs{min-width:100%;min-height:100%;overflow:visible;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa))}.docs-code-preview__code code.hljs{display:block;padding:12px 96px 12px 24px;-webkit-box-sizing:border-box;box-sizing:border-box}";
|
|
182
182
|
//#endregion
|
|
183
183
|
//#region packages/playground/src/core/code-preview/style.ts
|
|
184
184
|
var CODE_PREVIEW_STYLE_ID = "docs-code-preview-style";
|
|
@@ -2203,9 +2203,9 @@ var escapeHtmlAttr = (value) => value.replace(/&/gu, "&").replace(/"/gu, "&q
|
|
|
2203
2203
|
/**
|
|
2204
2204
|
* runtime 画布色。`previewInset` 露出的 padding、iframe chrome 和 sandbox
|
|
2205
2205
|
* `html`/`body` 必须共用这一变量,暗色下 `--docs-background-color` 与
|
|
2206
|
-
* `--vc-background-color-
|
|
2206
|
+
* `--vc-background-color-lightest` 不同,否则会出现色带割裂。
|
|
2207
2207
|
*/
|
|
2208
|
-
var PLAYGROUND_RUNTIME_CANVAS_BACKGROUND = "var(--vc-background-color-
|
|
2208
|
+
var PLAYGROUND_RUNTIME_CANVAS_BACKGROUND = "var(--vc-background-color-lightest, var(--docs-background-color, #fff))";
|
|
2209
2209
|
var createRuntimePreviewOptions = (cdnURL = DEFAULT_CDN_URL, options = {}) => {
|
|
2210
2210
|
const previewScroller = options.previewScroller === true;
|
|
2211
2211
|
const hrefs = Object.values({
|
|
@@ -2235,22 +2235,30 @@ var createRuntimePreviewOptions = (cdnURL = DEFAULT_CDN_URL, options = {}) => {
|
|
|
2235
2235
|
}
|
|
2236
2236
|
};
|
|
2237
2237
|
};
|
|
2238
|
-
var toReplFilename = (filename) => filename.startsWith("src/") ? filename : `src/${filename}`;
|
|
2238
|
+
var toReplFilename = (filename) => filename === "import-map.json" || filename.startsWith("src/") ? filename : `src/${filename}`;
|
|
2239
2239
|
var createReplFile = (filename, code) => {
|
|
2240
2240
|
const replFilename = toReplFilename(filename);
|
|
2241
2241
|
return new File(replFilename, code);
|
|
2242
2242
|
};
|
|
2243
2243
|
/**
|
|
2244
|
-
*
|
|
2244
|
+
* 保留显式配置的模块,供 local 区分宿主默认与 URL 覆盖。
|
|
2245
|
+
* @param builtinImportMap 实例层 import map。
|
|
2246
|
+
* @returns 按优先级合并的显式模块地址。
|
|
2247
|
+
*/
|
|
2248
|
+
var createRuntimeImportOverrides = (builtinImportMap) => ({
|
|
2249
|
+
...getPlaygroundSiteModules(),
|
|
2250
|
+
...getPlaygroundImportMapOverrides(),
|
|
2251
|
+
...filterSafeHrefs(builtinImportMap?.imports)
|
|
2252
|
+
});
|
|
2253
|
+
/**
|
|
2254
|
+
* 默认 CDN → 站点 modules → 管理页覆盖 → 实例 builtinImportMap。
|
|
2245
2255
|
* iframe import map 与直接渲染加载的是同一份地址表。
|
|
2246
2256
|
* @param cdnURL
|
|
2247
2257
|
* @param builtinImportMap
|
|
2248
2258
|
*/
|
|
2249
2259
|
var createRuntimeImports = (cdnURL = DEFAULT_CDN_URL, builtinImportMap) => ({
|
|
2250
2260
|
...createBuiltinImports(cdnURL),
|
|
2251
|
-
...
|
|
2252
|
-
...filterSafeHrefs(builtinImportMap?.imports),
|
|
2253
|
-
...getPlaygroundImportMapOverrides()
|
|
2261
|
+
...createRuntimeImportOverrides(builtinImportMap)
|
|
2254
2262
|
});
|
|
2255
2263
|
var createRuntimeStore = (files, entry, options) => {
|
|
2256
2264
|
const { cdnURL, builtinImportMap, ...storeOptions } = options;
|
|
@@ -2258,6 +2266,7 @@ var createRuntimeStore = (files, entry, options) => {
|
|
|
2258
2266
|
const file = createReplFile(filename, code);
|
|
2259
2267
|
return [file.filename, file];
|
|
2260
2268
|
})));
|
|
2269
|
+
replFiles.value["import-map.json"] ??= new File("import-map.json", "{}");
|
|
2261
2270
|
const mainFile = ref(toReplFilename(entry));
|
|
2262
2271
|
const activeFilename = ref(toReplFilename(entry));
|
|
2263
2272
|
const imports = createRuntimeImports(cdnURL, builtinImportMap);
|
|
@@ -2276,6 +2285,11 @@ var createRuntimeStore = (files, entry, options) => {
|
|
|
2276
2285
|
})
|
|
2277
2286
|
});
|
|
2278
2287
|
bindPlaygroundScss(store);
|
|
2288
|
+
const setFiles = store.setFiles.bind(store);
|
|
2289
|
+
store.setFiles = (nextFiles, nextEntry) => setFiles({
|
|
2290
|
+
"import-map.json": store.files["import-map.json"].code,
|
|
2291
|
+
...nextFiles
|
|
2292
|
+
}, nextEntry);
|
|
2279
2293
|
bindReplModules(store);
|
|
2280
2294
|
whenSassReady(files, () => {
|
|
2281
2295
|
const specifiers = collectBareSpecifiers(files, Object.keys(files));
|
|
@@ -2524,7 +2538,7 @@ var Alone = new Portal(/* @__PURE__ */ defineComponent({
|
|
|
2524
2538
|
/**
|
|
2525
2539
|
* 直接渲染与页面同文档,弹层不需要临时撑高。
|
|
2526
2540
|
* `run` 仍返回可调用函数,但不会申请高度,也不会改动预览尺寸。
|
|
2527
|
-
* @param vue
|
|
2541
|
+
* @param vue 当前预览的 Vue,只用其中的 `isRef`。
|
|
2528
2542
|
* @returns 注入给预览的 `docs:playground`。
|
|
2529
2543
|
*/
|
|
2530
2544
|
var createLocalPlayground = (vue) => {
|
|
@@ -2775,6 +2789,15 @@ var resolveHostModule = (id, modules) => {
|
|
|
2775
2789
|
return null;
|
|
2776
2790
|
};
|
|
2777
2791
|
var HOST_VUE_SPECIFIERS = /* @__PURE__ */ new Set(["vue", "vue/server-renderer"]);
|
|
2792
|
+
var VUE_DEPENDENT_BUILTINS = /* @__PURE__ */ new Set([
|
|
2793
|
+
"vue/server-renderer",
|
|
2794
|
+
"vue-router",
|
|
2795
|
+
"pinia",
|
|
2796
|
+
"@deot/vc",
|
|
2797
|
+
"@deot/vc-components",
|
|
2798
|
+
"@deot/vc-hooks",
|
|
2799
|
+
"@deot/vc-locale"
|
|
2800
|
+
]);
|
|
2778
2801
|
var messageOf = (error) => error instanceof Error ? error.message : String(error);
|
|
2779
2802
|
/**
|
|
2780
2803
|
* 找到 import map 里能覆盖该说明符的键。子路径没有独立 URL 时回退到父包。
|
|
@@ -2793,24 +2816,23 @@ var resolveImportTarget = (id, imports) => {
|
|
|
2793
2816
|
cursor = parent;
|
|
2794
2817
|
}
|
|
2795
2818
|
};
|
|
2796
|
-
var prefersLocalBuiltin = (id, imports,
|
|
2819
|
+
var prefersLocalBuiltin = (id, imports, overrides = new Set(Object.keys(imports))) => {
|
|
2797
2820
|
if (!localBuiltinIds.has(id) && !HOST_VUE_SPECIFIERS.has(id)) return false;
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
return url === createBuiltinImports(cdnURL)[id];
|
|
2821
|
+
if (overrides.has(id)) return false;
|
|
2822
|
+
return !VUE_DEPENDENT_BUILTINS.has(id) || !overrides.has("vue");
|
|
2801
2823
|
};
|
|
2802
2824
|
/**
|
|
2803
|
-
*
|
|
2825
|
+
* 内置依赖默认注入宿主副本,显式 URL 按模块覆盖,包括与默认 CDN 相同的地址。
|
|
2804
2826
|
* @param specifiers 本次预览用到的裸模块说明符。
|
|
2805
2827
|
* @param imports 合并后的 import map。
|
|
2806
2828
|
* @param builtins 宿主 Vue 与 vue-router。
|
|
2807
2829
|
* @param builtins.vue 当前页面的 Vue 模块。
|
|
2808
2830
|
* @param builtins.vueRouter 打包进来的 vue-router,可被 import map 覆盖。
|
|
2809
2831
|
* @param loader 按 URL 加载远程模块。
|
|
2810
|
-
* @param
|
|
2832
|
+
* @param overrides 显式配置的模块名,与自动补齐的默认地址区分。
|
|
2811
2833
|
* @returns 模块表和加载错误。
|
|
2812
2834
|
*/
|
|
2813
|
-
var loadLocalModules = async (specifiers, imports, builtins, loader,
|
|
2835
|
+
var loadLocalModules = async (specifiers, imports, builtins, loader, overrides = new Set(Object.keys(imports))) => {
|
|
2814
2836
|
const modules = {
|
|
2815
2837
|
"vue": builtins.vue,
|
|
2816
2838
|
"vue-router": builtins.vueRouter
|
|
@@ -2820,14 +2842,14 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2820
2842
|
const localIds = /* @__PURE__ */ new Set();
|
|
2821
2843
|
specifiers.forEach((specifier) => {
|
|
2822
2844
|
let local = false;
|
|
2823
|
-
if (prefersLocalBuiltin(specifier, imports,
|
|
2845
|
+
if (prefersLocalBuiltin(specifier, imports, overrides)) localIds.add(specifier);
|
|
2824
2846
|
else {
|
|
2825
2847
|
let cursor = specifier;
|
|
2826
2848
|
while (true) {
|
|
2827
2849
|
const slash = cursor.lastIndexOf("/");
|
|
2828
2850
|
if (slash <= 0) break;
|
|
2829
2851
|
const parent = cursor.slice(0, slash);
|
|
2830
|
-
if (prefersLocalBuiltin(parent, imports,
|
|
2852
|
+
if (prefersLocalBuiltin(parent, imports, overrides)) {
|
|
2831
2853
|
localIds.add(parent);
|
|
2832
2854
|
local = true;
|
|
2833
2855
|
break;
|
|
@@ -2835,12 +2857,8 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2835
2857
|
cursor = parent;
|
|
2836
2858
|
}
|
|
2837
2859
|
}
|
|
2838
|
-
if (specifier === "vue-router") {
|
|
2839
|
-
if (imports["vue-router"]) targets.add("vue-router");
|
|
2840
|
-
return;
|
|
2841
|
-
}
|
|
2842
2860
|
const target = resolveImportTarget(specifier, imports);
|
|
2843
|
-
if (target && prefersLocalBuiltin(target, imports,
|
|
2861
|
+
if (target && prefersLocalBuiltin(target, imports, overrides)) localIds.add(target);
|
|
2844
2862
|
else if (target) targets.add(target);
|
|
2845
2863
|
else if (!local && !localIds.has(specifier)) {
|
|
2846
2864
|
imports[specifier] = resolveNpmImport(specifier);
|
|
@@ -2857,7 +2875,7 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2857
2875
|
}));
|
|
2858
2876
|
for (const id of targets) {
|
|
2859
2877
|
const url = imports[id];
|
|
2860
|
-
if (!url || prefersLocalBuiltin(id, imports,
|
|
2878
|
+
if (!url || prefersLocalBuiltin(id, imports, overrides)) continue;
|
|
2861
2879
|
try {
|
|
2862
2880
|
modules[id] = await loader(url);
|
|
2863
2881
|
} catch (error) {
|
|
@@ -2872,12 +2890,13 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2872
2890
|
//#endregion
|
|
2873
2891
|
//#region packages/playground/src/core/runtime/local/vue-guard.ts
|
|
2874
2892
|
/**
|
|
2875
|
-
* 给 files
|
|
2893
|
+
* 给 files 注入选定的 Vue,但 `createApp().mount` 不会卸掉页面。
|
|
2876
2894
|
* 防护按本次 link 创建,多个 Playground 互不覆盖。
|
|
2877
2895
|
* @param capture 本次链接收集到的根组件、局部组件和 provide。
|
|
2896
|
+
* @param vue 当前预览选定的 Vue。
|
|
2878
2897
|
* @returns 带防护的 Vue 模块。
|
|
2879
2898
|
*/
|
|
2880
|
-
var createGuardedVue = (capture) => {
|
|
2899
|
+
var createGuardedVue = (capture, vue = Vue) => {
|
|
2881
2900
|
const createApp = (rootComponent, rootProps) => {
|
|
2882
2901
|
const fakeApp = {
|
|
2883
2902
|
_component: rootComponent,
|
|
@@ -2917,14 +2936,14 @@ var createGuardedVue = (capture) => {
|
|
|
2917
2936
|
mount() {
|
|
2918
2937
|
capture.components = { ...fakeApp._context.components };
|
|
2919
2938
|
capture.provides = { ...fakeApp._context.provides };
|
|
2920
|
-
capture.mountedComponent = defineComponent({
|
|
2939
|
+
capture.mountedComponent = vue.defineComponent({
|
|
2921
2940
|
name: "PlaygroundCapturedApp",
|
|
2922
2941
|
components: fakeApp._context.components,
|
|
2923
2942
|
setup() {
|
|
2924
2943
|
Reflect.ownKeys(fakeApp._context.provides).forEach((key) => {
|
|
2925
|
-
provide(key, fakeApp._context.provides[key]);
|
|
2944
|
+
vue.provide(key, fakeApp._context.provides[key]);
|
|
2926
2945
|
});
|
|
2927
|
-
return () => h(rootComponent, rootProps || null);
|
|
2946
|
+
return () => vue.h(rootComponent, rootProps || null);
|
|
2928
2947
|
}
|
|
2929
2948
|
});
|
|
2930
2949
|
return capture.mountedComponent;
|
|
@@ -2936,7 +2955,7 @@ var createGuardedVue = (capture) => {
|
|
|
2936
2955
|
};
|
|
2937
2956
|
return fakeApp;
|
|
2938
2957
|
};
|
|
2939
|
-
return new Proxy(
|
|
2958
|
+
return new Proxy(vue, { get(target, prop, receiver) {
|
|
2940
2959
|
if (prop === "createApp" || prop === "createSSRApp") return createApp;
|
|
2941
2960
|
if (prop === "default") return receiver;
|
|
2942
2961
|
return Reflect.get(target, prop, receiver);
|
|
@@ -2946,7 +2965,7 @@ var createGuardedVue = (capture) => {
|
|
|
2946
2965
|
//#region packages/playground/src/core/runtime/local/linker.ts
|
|
2947
2966
|
/**
|
|
2948
2967
|
* 在当前页面链接编译结果,返回入口组件。
|
|
2949
|
-
*
|
|
2968
|
+
* 给选定的 Vue 加上 mount 防护,避免字符串入口卸掉页面。
|
|
2950
2969
|
* @param compiled 浏览器编译结果。
|
|
2951
2970
|
* @param files 当前 Playground 文件表。
|
|
2952
2971
|
* @param options 可选的宿主模块表。
|
|
@@ -2965,7 +2984,7 @@ var linkPlayground = (compiled, files, options = {}) => {
|
|
|
2965
2984
|
provides: {}
|
|
2966
2985
|
};
|
|
2967
2986
|
const modules = { ...options.modules || {} };
|
|
2968
|
-
|
|
2987
|
+
modules.vue = createGuardedVue(capture, modules.vue || Vue);
|
|
2969
2988
|
const fileIndex = createFileIndex(files);
|
|
2970
2989
|
const root = getCommonRoot([...fileIndex.keys()]);
|
|
2971
2990
|
const cache = /* @__PURE__ */ new Map();
|
|
@@ -3033,16 +3052,17 @@ var linkPlayground = (compiled, files, options = {}) => {
|
|
|
3033
3052
|
//#endregion
|
|
3034
3053
|
//#region packages/playground/src/core/runtime/local/remote.ts
|
|
3035
3054
|
var HOST_VUE = /* @__PURE__ */ new Set(["vue", "vue/server-renderer"]);
|
|
3055
|
+
var moduleUrl = (url) => new URL(url, globalThis.location?.href).href;
|
|
3036
3056
|
/**
|
|
3037
3057
|
* 把 CDN 上的 ESM 先拉完整张依赖图,再在当前页面里执行。
|
|
3038
3058
|
* 裸导入优先走 import map,缺失的 npm 依赖回退到 CDN ESM;import() 按需加载。
|
|
3039
3059
|
* @param imports 合并后的 import map。
|
|
3040
3060
|
* @param builtins 宿主 Vue 与 vue-router。
|
|
3041
|
-
* @param
|
|
3061
|
+
* @param overrides 显式配置的模块名,与自动补齐的默认地址区分。
|
|
3042
3062
|
* @param importModule 浏览器原生 ESM 加载器。
|
|
3043
3063
|
* @returns 按 URL 加载并执行远程模块的加载器。
|
|
3044
3064
|
*/
|
|
3045
|
-
var createRemoteLoader = (imports, builtins,
|
|
3065
|
+
var createRemoteLoader = (imports, builtins, overrides = new Set(Object.keys(imports)), importModule = (url) => import(
|
|
3046
3066
|
/* @vite-ignore */
|
|
3047
3067
|
url
|
|
3048
3068
|
)) => {
|
|
@@ -3068,24 +3088,34 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3068
3088
|
return pending;
|
|
3069
3089
|
};
|
|
3070
3090
|
const localBuiltinId = (id) => {
|
|
3071
|
-
if (imports[id] && !prefersLocalBuiltin(id, imports,
|
|
3072
|
-
if (prefersLocalBuiltin(id, imports,
|
|
3091
|
+
if (imports[id] && !prefersLocalBuiltin(id, imports, overrides)) return null;
|
|
3092
|
+
if (prefersLocalBuiltin(id, imports, overrides)) return id;
|
|
3073
3093
|
let cursor = id;
|
|
3074
3094
|
while (true) {
|
|
3075
3095
|
const slash = cursor.lastIndexOf("/");
|
|
3076
3096
|
if (slash <= 0) return null;
|
|
3077
3097
|
const parent = cursor.slice(0, slash);
|
|
3078
|
-
if (prefersLocalBuiltin(parent, imports,
|
|
3098
|
+
if (prefersLocalBuiltin(parent, imports, overrides)) return parent;
|
|
3079
3099
|
cursor = parent;
|
|
3080
3100
|
}
|
|
3081
3101
|
};
|
|
3082
|
-
const
|
|
3083
|
-
if (isRelativeSpecifier(specifier) || /^https?:\/\//.test(specifier))
|
|
3084
|
-
|
|
3085
|
-
|
|
3102
|
+
const dependencySpecifier = (from, specifier) => {
|
|
3103
|
+
if (isRelativeSpecifier(specifier) || /^https?:\/\//.test(specifier)) {
|
|
3104
|
+
const url = new URL(specifier, from);
|
|
3105
|
+
const match = url.origin === "https://cdn.jsdelivr.net" ? url.pathname.match(/^\/npm\/((?:@[^/]+\/)?[^/@]+)(?:@[^/]+)?\/\+esm$/) : null;
|
|
3106
|
+
if (match && (imports[match[1]] || localBuiltinIds.has(match[1]))) return match[1];
|
|
3107
|
+
return url.href;
|
|
3108
|
+
}
|
|
3109
|
+
return specifier;
|
|
3110
|
+
};
|
|
3111
|
+
const dependencyUrl = (from, id) => {
|
|
3112
|
+
const specifier = dependencySpecifier(from, id);
|
|
3113
|
+
if (/^https?:\/\//.test(specifier)) return specifier;
|
|
3114
|
+
if (imports[specifier] && !prefersLocalBuiltin(specifier, imports, overrides)) return moduleUrl(imports[specifier]);
|
|
3115
|
+
if (HOST_VUE.has(specifier) && prefersLocalBuiltin(specifier, imports, overrides)) return null;
|
|
3086
3116
|
let cursor = specifier;
|
|
3087
3117
|
while (cursor) {
|
|
3088
|
-
if (localBuiltinIds.has(cursor) && prefersLocalBuiltin(cursor, imports,
|
|
3118
|
+
if (localBuiltinIds.has(cursor) && prefersLocalBuiltin(cursor, imports, overrides)) {
|
|
3089
3119
|
pendingBuiltins.add(cursor);
|
|
3090
3120
|
return null;
|
|
3091
3121
|
}
|
|
@@ -3098,10 +3128,10 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3098
3128
|
imports[specifier] = resolveNpmImport(specifier);
|
|
3099
3129
|
return imports[specifier];
|
|
3100
3130
|
}
|
|
3101
|
-
return imports[target];
|
|
3131
|
+
return moduleUrl(imports[target]);
|
|
3102
3132
|
};
|
|
3103
3133
|
const crawl = async (url) => {
|
|
3104
|
-
if (/\/\+esm(?:[?#]|$)/.test(url)) {
|
|
3134
|
+
if (!overrides.size && /\/\+esm(?:[?#]|$)/.test(url)) {
|
|
3105
3135
|
await loadNative(url);
|
|
3106
3136
|
return;
|
|
3107
3137
|
}
|
|
@@ -3121,14 +3151,15 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3121
3151
|
if (next) await crawl(next);
|
|
3122
3152
|
}));
|
|
3123
3153
|
};
|
|
3124
|
-
const requireFrom = (from) => (
|
|
3125
|
-
|
|
3154
|
+
const requireFrom = (from) => (specifier) => {
|
|
3155
|
+
const id = dependencySpecifier(from, specifier);
|
|
3156
|
+
if (HOST_VUE.has(id) && prefersLocalBuiltin(id, imports, overrides)) return toHostModule(builtins.vue);
|
|
3126
3157
|
const builtinId = localBuiltinId(id);
|
|
3127
3158
|
if (builtinId) return toHostModule(hostModules[builtinId]);
|
|
3128
|
-
if (isRelativeSpecifier(id) || /^https?:\/\//.test(id)) return evaluate(
|
|
3159
|
+
if (isRelativeSpecifier(id) || /^https?:\/\//.test(id)) return evaluate(dependencyUrl(from, id));
|
|
3129
3160
|
const target = imports[id] ? id : resolveImportTarget(id, imports);
|
|
3130
3161
|
if (!target || !imports[target]) throw new Error(`[Playground] 未注册的模块 "${id}"`);
|
|
3131
|
-
const loaded = evaluate(imports[target]);
|
|
3162
|
+
const loaded = evaluate(moduleUrl(imports[target]));
|
|
3132
3163
|
if (target === id) return loaded;
|
|
3133
3164
|
if (!resolveHostModule(id, { [target]: loaded }))
|
|
3134
3165
|
/* istanbul ignore next -- 父包没有对应导出时才拒绝 */
|
|
@@ -3151,7 +3182,7 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3151
3182
|
const next = dependencyUrl(url, id);
|
|
3152
3183
|
if (next) await load(next);
|
|
3153
3184
|
else {
|
|
3154
|
-
const builtinId = localBuiltinId(id);
|
|
3185
|
+
const builtinId = localBuiltinId(dependencySpecifier(url, id));
|
|
3155
3186
|
if (builtinId && !(builtinId in hostModules)) hostModules[builtinId] = await ensureLocalBuiltin(builtinId);
|
|
3156
3187
|
}
|
|
3157
3188
|
return requireFrom(url)(id);
|
|
@@ -3160,7 +3191,8 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3160
3191
|
return module.exports;
|
|
3161
3192
|
};
|
|
3162
3193
|
const loading = /* @__PURE__ */ new Map();
|
|
3163
|
-
const load = (
|
|
3194
|
+
const load = (sourceUrl) => {
|
|
3195
|
+
const url = moduleUrl(sourceUrl);
|
|
3164
3196
|
const pending = loading.get(url);
|
|
3165
3197
|
if (pending) return pending;
|
|
3166
3198
|
const task = (async () => {
|
|
@@ -3221,14 +3253,14 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3221
3253
|
});
|
|
3222
3254
|
};
|
|
3223
3255
|
watch([compileError, runtimeError], publishError);
|
|
3224
|
-
const createDocsLink = (preview) => defineComponent({
|
|
3256
|
+
const createDocsLink = (preview, vue) => vue.defineComponent({
|
|
3225
3257
|
name: "DocsLink",
|
|
3226
3258
|
props: { to: {
|
|
3227
3259
|
type: String,
|
|
3228
3260
|
default: ""
|
|
3229
3261
|
} },
|
|
3230
3262
|
setup(linkProps, { slots }) {
|
|
3231
|
-
return () => h("a", {
|
|
3263
|
+
return () => vue.h("a", {
|
|
3232
3264
|
href: linkProps.to,
|
|
3233
3265
|
style: {
|
|
3234
3266
|
color: "inherit",
|
|
@@ -3249,27 +3281,27 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3249
3281
|
previewApp = null;
|
|
3250
3282
|
removeStyle(styleId);
|
|
3251
3283
|
};
|
|
3252
|
-
const mountPreview = (
|
|
3284
|
+
const mountPreview = (job, preview) => {
|
|
3253
3285
|
if (!mountEl.value) return;
|
|
3286
|
+
const { component, vue, scroller, css } = job;
|
|
3254
3287
|
destroyPreview();
|
|
3255
3288
|
injectStyle(styleId, css);
|
|
3256
3289
|
if (props.clearConsole) console.clear();
|
|
3257
|
-
const
|
|
3258
|
-
const app = Vue.createApp({
|
|
3290
|
+
const app = vue.createApp({
|
|
3259
3291
|
name: "LocalSandboxRoot",
|
|
3260
3292
|
setup() {
|
|
3261
|
-
const service = createLocalPlayground(
|
|
3262
|
-
provide("docs:playground", service);
|
|
3263
|
-
onErrorCaptured((error) => {
|
|
3293
|
+
const service = createLocalPlayground(vue);
|
|
3294
|
+
vue.provide("docs:playground", service);
|
|
3295
|
+
vue.onErrorCaptured((error) => {
|
|
3264
3296
|
const message = formatPlaygroundRuntimeError(error);
|
|
3265
3297
|
if (message) runtimeError.value = message;
|
|
3266
3298
|
return false;
|
|
3267
3299
|
});
|
|
3268
|
-
onBeforeUnmount(() => service.dispose());
|
|
3300
|
+
vue.onBeforeUnmount(() => service.dispose());
|
|
3269
3301
|
return () => {
|
|
3270
|
-
const content = h(component);
|
|
3271
|
-
if (!
|
|
3272
|
-
return h(
|
|
3302
|
+
const content = vue.h(component);
|
|
3303
|
+
if (!scroller) return content;
|
|
3304
|
+
return vue.h(scroller, {
|
|
3273
3305
|
height: "100%",
|
|
3274
3306
|
native: false,
|
|
3275
3307
|
autoResize: true,
|
|
@@ -3279,7 +3311,7 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3279
3311
|
};
|
|
3280
3312
|
}
|
|
3281
3313
|
});
|
|
3282
|
-
app.component("DocsLink", createDocsLink(preview));
|
|
3314
|
+
app.component("DocsLink", createDocsLink(preview, vue));
|
|
3283
3315
|
app.config.errorHandler = (error) => {
|
|
3284
3316
|
const message = formatPlaygroundRuntimeError(error);
|
|
3285
3317
|
if (message) runtimeError.value = message;
|
|
@@ -3310,7 +3342,7 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3310
3342
|
/* istanbul ignore if -- 桥接 iframe 尚未就绪或编译已被取代 */
|
|
3311
3343
|
if (pendingMount !== job || !mountEl.value) return;
|
|
3312
3344
|
pendingMount = null;
|
|
3313
|
-
mountPreview(job
|
|
3345
|
+
mountPreview(job, preview);
|
|
3314
3346
|
};
|
|
3315
3347
|
const run = async () => {
|
|
3316
3348
|
const current = ++version;
|
|
@@ -3332,15 +3364,18 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3332
3364
|
return;
|
|
3333
3365
|
}
|
|
3334
3366
|
const imports = createRuntimeImports(props.options.cdnURL, props.options.builtinImportMap);
|
|
3367
|
+
const overrides = new Set(Object.keys(createRuntimeImportOverrides(props.options.builtinImportMap)));
|
|
3335
3368
|
const specifiers = collectBareSpecifiers(props.files, collectReachableFilenames(props.files, compiled.entry));
|
|
3369
|
+
specifiers.push("vue");
|
|
3370
|
+
if (props.previewScroller === true) specifiers.push("@deot/vc");
|
|
3336
3371
|
const remote = createRemoteLoader(imports, {
|
|
3337
3372
|
vue: Vue,
|
|
3338
3373
|
vueRouter: VueRouter
|
|
3339
|
-
},
|
|
3374
|
+
}, overrides);
|
|
3340
3375
|
const loaded = await loadLocalModules(specifiers, imports, {
|
|
3341
3376
|
vue: Vue,
|
|
3342
3377
|
vueRouter: VueRouter
|
|
3343
|
-
}, (url) => remote.load(url),
|
|
3378
|
+
}, (url) => remote.load(url), overrides);
|
|
3344
3379
|
/* istanbul ignore if -- 并发编译时只保留最后一次 */
|
|
3345
3380
|
if (current !== version) return;
|
|
3346
3381
|
if (loaded.errors.length) {
|
|
@@ -3358,6 +3393,8 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3358
3393
|
}
|
|
3359
3394
|
pendingMount = {
|
|
3360
3395
|
component: linked.component,
|
|
3396
|
+
vue: loaded.modules.vue,
|
|
3397
|
+
scroller: props.previewScroller === true ? loaded.modules["@deot/vc"].Scroller : void 0,
|
|
3361
3398
|
css: linked.css,
|
|
3362
3399
|
version: current
|
|
3363
3400
|
};
|
package/dist/index.style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.docs-playground-icon{display:block;width:18px;height:18px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.docs-playground-files{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;max-height:100%;min-height:0;overflow:hidden;background:var(--docs-code-background,var(--vc-background-color,#f6f8fa));border:1px solid var(--docs-border-color,var(--vc-color-light-deeper,#e2e8f0));border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-files__tabs-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;background:transparent;border-bottom:1px solid var(--docs-border-color,var(--vc-color-light-deeper,#e2e8f0));-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 0 40px;-ms-flex:0 0 40px;flex:0 0 40px}.docs-playground-files__scroller{width:0;height:40px;min-width:0;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;scrollbar-width:none}.docs-playground-files__scroller::-webkit-scrollbar{display:none}.docs-playground-files__scroller .vc-scroller-track.is-vertical{display:none!important}.docs-playground-files__tabs{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:40px;min-width:100%;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box;gap:4px}.docs-playground-files__tab{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:40px;padding:0 12px;font:inherit;font-size:13px;font-weight:500;line-height:40px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));white-space:nowrap;cursor:pointer;background:transparent;border:0;-webkit-box-sizing:border-box;box-sizing:border-box;gap:5px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-files__tab.is-active{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground-files__tab.is-active:after{position:absolute;right:8px;bottom:0;left:8px;height:3px;background:var(--docs-primary-color,var(--vc-color-primary,#5495f6));border-radius:2px 2px 0 0;content:""}.docs-playground-files__entry{font-size:10px;line-height:16px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a))}.docs-playground-files__body{min-height:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground-editor button{padding:3px 7px;color:var(--docs-foreground-color-light,var(--vc-color-dark-lighter));white-space:nowrap;cursor:pointer;background:var(--docs-background-color,var(--vc-background-color-light));border:1px solid var(--docs-border-color,var(--vc-color-light-deeper));border-radius:8px}.docs-playground-editor button:disabled{cursor:not-allowed;opacity:.5}.docs-playground-editor__wrapper{position:fixed;right:10px;bottom:10px;z-index:1001;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:680px;max-height:calc(100vh - 20px);overflow:hidden;font-size:13px;color:var(--docs-foreground-color-light,var(--vc-color-dark-lighter));background:var(--docs-background-color,var(--vc-background-color-light));border-radius:8px;opacity:1;-webkit-box-shadow:0 0 50px rgba(0,0,0,.2);box-shadow:0 0 50px rgba(0,0,0,.2);-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-editor__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:10px;font-size:20px;line-height:20px;cursor:move;background:var(--docs-background-color-soft,var(--vc-background-color))!important;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground-editor__files{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-width:0;padding:6px 8px;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color));border-top:1px solid var(--docs-border-color,var(--vc-color-light-deeper));border-bottom:1px solid var(--docs-border-color,var(--vc-color-light-deeper));-webkit-box-sizing:border-box;box-sizing:border-box;gap:8px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground-editor__actions{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;gap:4px}.docs-playground-editor__scroller{width:0;min-width:0;-webkit-box-flex:1;-webkit-flex:1 1;-ms-flex:1 1;flex:1 1;scrollbar-width:none}.docs-playground-editor__scroller::-webkit-scrollbar{display:none}.docs-playground-editor__tabs{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-width:100%;padding:6px 6px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box;gap:8px}.docs-playground-editor__tab{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:26px;padding:3px 12px 3px 7px;line-height:18px;white-space:nowrap;cursor:pointer;background:var(--docs-background-color,var(--vc-background-color-light));border:1px solid var(--docs-border-color,var(--vc-color-light-deeper));border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;gap:5px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-editor__tab.is-active{color:#fff;background:#2563eb;border-color:#2563eb}.docs-playground-editor__filename{width:100px;height:18px;padding:0 3px;font:inherit;line-height:16px;color:var(--docs-foreground-color-light,var(--vc-color-dark-lighter));background:var(--docs-background-color,var(--vc-background-color-light));border:1px solid var(--docs-border-color,var(--vc-color-light-deeper));-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-editor__close{position:absolute;top:-6px;right:-6px;z-index:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:14px;height:14px;padding:0;font-size:0;line-height:0;color:#fff;background-color:#5495f6!important;border:0;border-radius:7px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-editor__close:after,.docs-playground-editor__close:before{position:absolute;top:50%;left:50%;width:8px;height:1px;background-color:currentcolor;content:""}.docs-playground-editor__close:before{-webkit-transform:translate(-50%,-50%) rotate(45deg);-ms-transform:translate(-50%,-50%) rotate(45deg);transform:translate(-50%,-50%) rotate(45deg)}.docs-playground-editor__close:after{-webkit-transform:translate(-50%,-50%) rotate(-45deg);-ms-transform:translate(-50%,-50%) rotate(-45deg);transform:translate(-50%,-50%) rotate(-45deg)}.docs-playground-editor__delete{position:static!important}.docs-playground-editor__error{max-height:calc(min(160px,25vh));padding:5px 10px;overflow:auto;color:var(--vc-color-error,#b91c1c);white-space:pre-wrap;overflow-wrap:anywhere;background:var(--docs-error-background,#fef2f2);-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground-editor__body{min-width:0;min-height:240px;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.docs-playground-editor__editor{min-height:240px;padding:1px;background:var(--docs-code-background,var(--vc-background-color))!important}.docs-playground-editor__editor .cm-editor{height:auto}.docs-playground-editor__editor .cm-scroller{overflow:visible!important}.docs-playground-popup{position:fixed;inset:0;z-index:1000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:20px 40px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-popup__mask{position:absolute;inset:0;background:rgba(15,23,42,.45)}.docs-playground-popup__shell{position:relative;z-index:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-width:100%;max-height:100%;overflow:hidden;background:var(--docs-background-color,var(--vc-background-color-light,#fff));border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-popup__frame{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-popup__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 4px 0 0;background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;gap:12px;-webkit-box-flex:0;-webkit-flex:0 0 44px;-ms-flex:0 0 44px;flex:0 0 44px}.docs-playground-popup__body{min-width:0;min-height:0;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground-popup__scroller{width:100%;height:100%}.docs-playground-popup__scroller-content{min-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-popup__canvas{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-popup__canvas .iframe-container,.docs-playground-popup__canvas .iframe-container iframe,.docs-playground-popup__canvas .sandbox{display:block;width:100%;height:100%;min-height:100%;background:var(--vc-background-color-light,var(--docs-background-color,#fff))!important}.docs-playground-popup__canvas .iframe-container iframe{border:0}.docs-playground-local{position:relative;width:100%;height:100%;min-width:0;min-height:0}.docs-playground-local__bridge{position:absolute;width:100%;height:100%;pointer-events:none;border:0;opacity:0;inset:0}.docs-playground-local__mount{position:relative;width:100%;height:100%;min-width:0;min-height:0}.docs-playground-local__mount--auto{display:flow-root;height:auto}.docs-playground-runtime-host{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-height:0;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-runtime-host--direct,.docs-playground-runtime-host--direct .docs-playground-runtime--styleless,.docs-playground-runtime-host--direct .docs-playground-runtime__viewport{overflow:visible}.docs-playground-runtime{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground-runtime,.docs-playground-runtime--styleless{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-height:0;overflow:hidden;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-runtime--styleless{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-runtime--styleless .docs-playground__runtime-error{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.docs-playground-runtime__viewport-stage{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:100%;min-width:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.docs-playground-runtime__viewport{position:relative;height:100%;min-width:0;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.docs-playground .iframe-container,.docs-playground .iframe-container iframe{width:100%;height:100%;background:var(--vc-background-color-light,var(--docs-background-color,#fff))!important}.docs-playground .iframe-container iframe{display:block;border:0}.docs-playground__preview{position:relative;min-height:0;overflow:hidden;border:1px solid var(--docs-border-color,var(--vc-color-light-deeper,#e2e8f0));border-radius:12px;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground__expand,.docs-playground__preview{background:var(--vc-background-color-light,var(--docs-background-color,#fff));-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground__expand{position:absolute;bottom:2px;left:50%;z-index:2;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:32px;height:24px;min-width:24px;min-height:24px;padding:0;color:var(--docs-foreground-color-mute,var(--vc-color-dark-lightest,#64748b));cursor:pointer;border:0;border-radius:8px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);-webkit-transition:color .15s,background-color .15s;transition:color .15s,background-color .15s;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__expand .docs-playground-icon{width:14px;height:14px;-webkit-transition:-webkit-transform .15s;transition:-webkit-transform .15s;transition:transform .15s;transition:transform .15s, -webkit-transform .15s}.docs-playground__expand:hover{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground__expand:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px}.docs-playground__expand.is-expanded .docs-playground-icon{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-playground__runtime-error{max-height:240px;padding:12px 16px;margin:0 0 8px;overflow:auto;font:inherit;font-size:13px;line-height:1.6;color:var(--vc-color-error,#b91c1c);white-space:pre-wrap;background:var(--docs-error-background,#fef2f2);border:1px solid #f5c2c2;border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow-wrap:anywhere}@media(prefers-color-scheme:light){:root{--docs-background-color:#fff;--docs-background-color-soft:#f7f8fa;--docs-background-color-mute:#f2f3f5;--docs-foreground-color:#030712;--docs-foreground-color-light:#364153;--docs-foreground-color-mute:#4a5565;--docs-border-color:#e8eaec;--docs-border-color-light:#f0f1f2;--docs-primary-color:#873bf4;--docs-primary-color-light:#f2ebfe;--docs-link-color:#2d8cf0;--docs-mask-color:hsla(0,0%,100%,.72);--docs-shadow-color:rgba(0,0,0,.14);--docs-code-background:#f6f8fa;--docs-pattern-fg:rgba(3,7,18,.05);--docs-footer-background:#141313;--docs-footer-foreground:#364153;--docs-tip-background:#f9f0ff;--docs-warning-background:#fff6f7;--docs-error-color:#ed4014;--docs-error-background:#fef2f2}}@media(prefers-color-scheme:dark){:root{--docs-background-color:#171b24;--docs-background-color-soft:#252b3a;--docs-background-color-mute:#303748;--docs-foreground-color:#f8f8f8;--docs-foreground-color-light:#d1d5dc;--docs-foreground-color-mute:#b9b9b9;--docs-border-color:#3b4355;--docs-border-color-light:#303748;--docs-primary-color:#873bf4;--docs-primary-color-light:#35244d;--docs-link-color:#6daeff;--docs-mask-color:rgba(10,13,18,.76);--docs-shadow-color:rgba(0,0,0,.45);--docs-code-background:#202630;--docs-pattern-fg:hsla(0,0%,100%,.1);--docs-footer-background:#0d0f14;--docs-footer-foreground:#9ca3af;--docs-tip-background:#30223f;--docs-warning-background:#3d2529;--docs-error-color:#ff6b6b;--docs-error-background:#41272b}}[data-doc-theme=light],[data-vc-theme=light]{--docs-background-color:#fff;--docs-background-color-soft:#f7f8fa;--docs-background-color-mute:#f2f3f5;--docs-foreground-color:#030712;--docs-foreground-color-light:#364153;--docs-foreground-color-mute:#4a5565;--docs-border-color:#e8eaec;--docs-border-color-light:#f0f1f2;--docs-primary-color:#873bf4;--docs-primary-color-light:#f2ebfe;--docs-link-color:#2d8cf0;--docs-mask-color:hsla(0,0%,100%,.72);--docs-shadow-color:rgba(0,0,0,.14);--docs-code-background:#f6f8fa;--docs-pattern-fg:rgba(3,7,18,.05);--docs-footer-background:#141313;--docs-footer-foreground:#364153;--docs-tip-background:#f9f0ff;--docs-warning-background:#fff6f7;--docs-error-color:#ed4014;--docs-error-background:#fef2f2}[data-doc-theme=dark],[data-vc-theme=dark]{--docs-background-color:#171b24;--docs-background-color-soft:#252b3a;--docs-background-color-mute:#303748;--docs-foreground-color:#f8f8f8;--docs-foreground-color-light:#d1d5dc;--docs-foreground-color-mute:#b9b9b9;--docs-border-color:#3b4355;--docs-border-color-light:#303748;--docs-primary-color:#873bf4;--docs-primary-color-light:#35244d;--docs-link-color:#6daeff;--docs-mask-color:rgba(10,13,18,.76);--docs-shadow-color:rgba(0,0,0,.45);--docs-code-background:#202630;--docs-pattern-fg:hsla(0,0%,100%,.1);--docs-footer-background:#0d0f14;--docs-footer-foreground:#9ca3af;--docs-tip-background:#30223f;--docs-warning-background:#3d2529;--docs-error-color:#ff6b6b;--docs-error-background:#41272b}.docs-playground{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;margin-bottom:16px;overflow:hidden;background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:8px}.docs-playground--files{height:100%;min-height:0;overflow:hidden}.docs-playground__error{height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.docs-playground__error,.docs-playground__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__header{padding:0 4px 0 0;background:transparent;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;gap:12px;-webkit-box-flex:0;-webkit-flex:0 0 44px;-ms-flex:0 0 44px;flex:0 0 44px}.docs-playground__title{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-width:0;padding-right:12px;overflow:hidden;font-size:14px;font-weight:600;line-height:20px;color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b));-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__title-anchor{position:absolute;top:50%;right:100%;width:14px;font-size:12px;line-height:1;color:inherit;text-align:center;text-decoration:none;opacity:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:opacity .2s;transition:opacity .2s}.docs-playground__title-anchor:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px;opacity:1}.docs-playground__title-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-playground .docs-playground__title:hover .docs-playground__title-anchor{opacity:1}.docs-playground__tools{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:auto;font-size:13px;line-height:20px;gap:8px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground__tool-group{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;padding:2px;background:var(--docs-background-color-soft,var(--vc-background-color,#f1f5f9));border-radius:999px;gap:0;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__tool-divider{display:inline-block;width:1px;height:16px;background:var(--docs-border-color,var(--vc-color-light-deeper,#e2e8f0));-webkit-box-flex:0;-webkit-flex:0 0 1px;-ms-flex:0 0 1px;flex:0 0 1px}.docs-playground__views{padding:2px;background:var(--docs-background-color-soft,var(--vc-background-color,#f1f5f9));gap:0}.docs-playground__tool,.docs-playground__view,.docs-playground__views{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;border-radius:999px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__view{height:28px;padding:0 12px;font:inherit;font-size:13px;font-weight:500;line-height:20px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-lightest,#64748b));cursor:pointer;background:transparent;border:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s,-webkit-box-shadow .15s}.docs-playground__view.is-active,.docs-playground__view:hover{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground__view:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px}.docs-playground__view.is-active{background:var(--docs-background-color,var(--vc-background-color-light,#fff));-webkit-box-shadow:0 1px 2px rgba(15,23,42,.08);box-shadow:0 1px 2px rgba(15,23,42,.08)}.docs-playground__tool{width:28px;height:28px;padding:0;font:inherit;color:var(--docs-foreground-color-mute,var(--vc-color-dark-lightest,#64748b));cursor:pointer;background:transparent;border:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s,-webkit-box-shadow .15s}.docs-playground__editor .docs-playground-icon,.docs-playground__tool .docs-playground-icon,.docs-playground__viewport-trigger .docs-playground-icon{width:16px;height:16px}.docs-playground__tool.is-active,.docs-playground__tool:hover{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground__tool:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px}.docs-playground__tool.is-active{background:var(--docs-background-color,var(--vc-background-color-light,#fff));-webkit-box-shadow:0 1px 2px rgba(15,23,42,.08);box-shadow:0 1px 2px rgba(15,23,42,.08)}.docs-playground__viewport-menu{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.docs-playground__viewport-options{min-width:136px}.docs-playground__viewport-option{white-space:nowrap}.docs-playground__popup-close-mark{font-size:16px;line-height:1}/*$vite$:1*/
|
|
1
|
+
.docs-playground-icon{display:block;width:18px;height:18px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.docs-playground-files{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;max-height:100%;min-height:0;overflow:hidden;background:var(--docs-code-background,var(--vc-background-color,#f6f8fa));border:1px solid var(--docs-border-color,var(--vc-border-color,#e2e8f0));border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-files__tabs-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;background:transparent;border-bottom:1px solid var(--docs-border-color,var(--vc-border-color,#e2e8f0));-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 0 40px;-ms-flex:0 0 40px;flex:0 0 40px}.docs-playground-files__scroller{width:0;height:40px;min-width:0;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;scrollbar-width:none}.docs-playground-files__scroller::-webkit-scrollbar{display:none}.docs-playground-files__scroller .vc-scroller-track.is-vertical{display:none!important}.docs-playground-files__tabs{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:40px;min-width:100%;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box;gap:4px}.docs-playground-files__tab{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:40px;padding:0 12px;font:inherit;font-size:13px;font-weight:500;line-height:40px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));white-space:nowrap;cursor:pointer;background:transparent;border:0;-webkit-box-sizing:border-box;box-sizing:border-box;gap:5px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-files__tab.is-active{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground-files__tab.is-active:after{position:absolute;right:8px;bottom:0;left:8px;height:3px;background:var(--docs-primary-color,var(--vc-color-primary,#5495f6));border-radius:2px 2px 0 0;content:""}.docs-playground-files__entry{font-size:10px;line-height:16px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a))}.docs-playground-files__body{min-height:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground-editor button{padding:3px 7px;color:var(--docs-foreground-color-light,var(--vc-color-dark-lighter));white-space:nowrap;cursor:pointer;background:var(--docs-background-color,var(--vc-background-color-lightest));border:1px solid var(--docs-border-color,var(--vc-border-color));border-radius:8px}.docs-playground-editor button:disabled{cursor:not-allowed;opacity:.5}.docs-playground-editor__wrapper{position:fixed;right:10px;bottom:10px;z-index:1001;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:680px;max-height:calc(100vh - 20px);overflow:hidden;font-size:13px;color:var(--docs-foreground-color-light,var(--vc-color-dark-lighter));background:var(--docs-background-color,var(--vc-background-color-lightest));border-radius:8px;opacity:1;-webkit-box-shadow:0 0 50px rgba(0,0,0,.2);box-shadow:0 0 50px rgba(0,0,0,.2);-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-editor__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:10px;font-size:20px;line-height:20px;cursor:move;background:var(--docs-background-color-soft,var(--vc-background-color))!important;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground-editor__files{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-width:0;padding:6px 8px;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color));border-top:1px solid var(--docs-border-color,var(--vc-border-color));border-bottom:1px solid var(--docs-border-color,var(--vc-border-color));-webkit-box-sizing:border-box;box-sizing:border-box;gap:8px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground-editor__actions{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;gap:4px}.docs-playground-editor__scroller{width:0;min-width:0;-webkit-box-flex:1;-webkit-flex:1 1;-ms-flex:1 1;flex:1 1;scrollbar-width:none}.docs-playground-editor__scroller::-webkit-scrollbar{display:none}.docs-playground-editor__tabs{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-width:100%;padding:6px 6px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box;gap:8px}.docs-playground-editor__tab{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:26px;padding:3px 12px 3px 7px;line-height:18px;white-space:nowrap;cursor:pointer;background:var(--docs-background-color,var(--vc-background-color-lightest));border:1px solid var(--docs-border-color,var(--vc-border-color));border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;gap:5px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-editor__tab.is-active{color:#fff;background:#2563eb;border-color:#2563eb}.docs-playground-editor__filename{width:100px;height:18px;padding:0 3px;font:inherit;line-height:16px;color:var(--docs-foreground-color-light,var(--vc-color-dark-lighter));background:var(--docs-background-color,var(--vc-background-color-lightest));border:1px solid var(--docs-border-color,var(--vc-border-color));-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-editor__close{position:absolute;top:-6px;right:-6px;z-index:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:14px;height:14px;padding:0;font-size:0;line-height:0;color:#fff;background-color:#5495f6!important;border:0;border-radius:7px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-editor__close:after,.docs-playground-editor__close:before{position:absolute;top:50%;left:50%;width:8px;height:1px;background-color:currentcolor;content:""}.docs-playground-editor__close:before{-webkit-transform:translate(-50%,-50%) rotate(45deg);-ms-transform:translate(-50%,-50%) rotate(45deg);transform:translate(-50%,-50%) rotate(45deg)}.docs-playground-editor__close:after{-webkit-transform:translate(-50%,-50%) rotate(-45deg);-ms-transform:translate(-50%,-50%) rotate(-45deg);transform:translate(-50%,-50%) rotate(-45deg)}.docs-playground-editor__delete{position:static!important}.docs-playground-editor__error{max-height:calc(min(160px,25vh));padding:5px 10px;overflow:auto;color:var(--vc-color-error,#b91c1c);white-space:pre-wrap;overflow-wrap:anywhere;background:var(--docs-error-background,#fef2f2);-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground-editor__body{min-width:0;min-height:240px;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.docs-playground-editor__editor{min-height:240px;padding:1px;background:var(--docs-code-background,var(--vc-background-color))!important}.docs-playground-editor__editor .cm-editor{height:auto}.docs-playground-editor__editor .cm-scroller{overflow:visible!important}.docs-playground-popup{position:fixed;inset:0;z-index:1000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:20px 40px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-popup__mask{position:absolute;inset:0;background:rgba(15,23,42,.45)}.docs-playground-popup__shell{position:relative;z-index:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-width:100%;max-height:100%;overflow:hidden;background:var(--docs-background-color,var(--vc-background-color-lightest,#fff));border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-popup__frame{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-popup__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 4px 0 0;background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;gap:12px;-webkit-box-flex:0;-webkit-flex:0 0 44px;-ms-flex:0 0 44px;flex:0 0 44px}.docs-playground-popup__body{min-width:0;min-height:0;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground-popup__scroller{width:100%;height:100%}.docs-playground-popup__scroller-content{min-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-popup__canvas{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground-popup__canvas .iframe-container,.docs-playground-popup__canvas .iframe-container iframe,.docs-playground-popup__canvas .sandbox{display:block;width:100%;height:100%;min-height:100%;background:var(--vc-background-color-lightest,var(--docs-background-color,#fff))!important}.docs-playground-popup__canvas .iframe-container iframe{border:0}.docs-playground-local{position:relative;width:100%;height:100%;min-width:0;min-height:0}.docs-playground-local__bridge{position:absolute;width:100%;height:100%;pointer-events:none;border:0;opacity:0;inset:0}.docs-playground-local__mount{position:relative;width:100%;height:100%;min-width:0;min-height:0}.docs-playground-local__mount--auto{display:flow-root;height:auto}.docs-playground-runtime-host{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-height:0;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-runtime-host--direct,.docs-playground-runtime-host--direct .docs-playground-runtime--styleless,.docs-playground-runtime-host--direct .docs-playground-runtime__viewport{overflow:visible}.docs-playground-runtime{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground-runtime,.docs-playground-runtime--styleless{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-height:0;overflow:hidden;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.docs-playground-runtime--styleless{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground-runtime--styleless .docs-playground__runtime-error{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.docs-playground-runtime__viewport-stage{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:100%;min-width:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.docs-playground-runtime__viewport{position:relative;height:100%;min-width:0;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.docs-playground .iframe-container,.docs-playground .iframe-container iframe{width:100%;height:100%;background:var(--vc-background-color-lightest,var(--docs-background-color,#fff))!important}.docs-playground .iframe-container iframe{display:block;border:0}.docs-playground__preview{position:relative;min-height:0;overflow:hidden;border:1px solid var(--docs-border-color,var(--vc-border-color,#e2e8f0));border-radius:12px;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-playground__expand,.docs-playground__preview{background:var(--vc-background-color-lightest,var(--docs-background-color,#fff));-webkit-box-sizing:border-box;box-sizing:border-box}.docs-playground__expand{position:absolute;bottom:2px;left:50%;z-index:2;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:32px;height:24px;min-width:24px;min-height:24px;padding:0;color:var(--docs-foreground-color-mute,var(--vc-color-dark-lightest,#64748b));cursor:pointer;border:0;border-radius:8px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);-webkit-transition:color .15s,background-color .15s;transition:color .15s,background-color .15s;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__expand .docs-playground-icon{width:14px;height:14px;-webkit-transition:-webkit-transform .15s;transition:-webkit-transform .15s;transition:transform .15s;transition:transform .15s, -webkit-transform .15s}.docs-playground__expand:hover{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground__expand:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px}.docs-playground__expand.is-expanded .docs-playground-icon{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-playground__runtime-error{max-height:240px;padding:12px 16px;margin:0 0 8px;overflow:auto;font:inherit;font-size:13px;line-height:1.6;color:var(--vc-color-error,#b91c1c);white-space:pre-wrap;background:var(--docs-error-background,#fef2f2);border:1px solid #f5c2c2;border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow-wrap:anywhere}@media(prefers-color-scheme:light){:root{--docs-background-color:#fff;--docs-background-color-soft:#f7f8fa;--docs-background-color-mute:#f2f3f5;--docs-foreground-color:#030712;--docs-foreground-color-light:#364153;--docs-foreground-color-mute:#4a5565;--docs-border-color:#e8eaec;--docs-border-color-light:#f0f1f2;--docs-primary-color:#873bf4;--docs-primary-color-light:#f2ebfe;--docs-link-color:#2d8cf0;--docs-mask-color:hsla(0,0%,100%,.72);--docs-shadow-color:rgba(0,0,0,.14);--docs-code-background:#f6f8fa;--docs-pattern-fg:rgba(3,7,18,.05);--docs-footer-background:#141313;--docs-footer-foreground:#364153;--docs-tip-background:#f9f0ff;--docs-warning-background:#fff6f7;--docs-error-color:#ed4014;--docs-error-background:#fef2f2}}@media(prefers-color-scheme:dark){:root{--docs-background-color:#171b24;--docs-background-color-soft:#252b3a;--docs-background-color-mute:#303748;--docs-foreground-color:#f8f8f8;--docs-foreground-color-light:#d1d5dc;--docs-foreground-color-mute:#b9b9b9;--docs-border-color:#3b4355;--docs-border-color-light:#303748;--docs-primary-color:#873bf4;--docs-primary-color-light:#35244d;--docs-link-color:#6daeff;--docs-mask-color:rgba(10,13,18,.76);--docs-shadow-color:rgba(0,0,0,.45);--docs-code-background:#202630;--docs-pattern-fg:hsla(0,0%,100%,.1);--docs-footer-background:#0d0f14;--docs-footer-foreground:#9ca3af;--docs-tip-background:#30223f;--docs-warning-background:#3d2529;--docs-error-color:#ff6b6b;--docs-error-background:#41272b}}[data-doc-theme=light],[data-vc-theme=light]{--docs-background-color:#fff;--docs-background-color-soft:#f7f8fa;--docs-background-color-mute:#f2f3f5;--docs-foreground-color:#030712;--docs-foreground-color-light:#364153;--docs-foreground-color-mute:#4a5565;--docs-border-color:#e8eaec;--docs-border-color-light:#f0f1f2;--docs-primary-color:#873bf4;--docs-primary-color-light:#f2ebfe;--docs-link-color:#2d8cf0;--docs-mask-color:hsla(0,0%,100%,.72);--docs-shadow-color:rgba(0,0,0,.14);--docs-code-background:#f6f8fa;--docs-pattern-fg:rgba(3,7,18,.05);--docs-footer-background:#141313;--docs-footer-foreground:#364153;--docs-tip-background:#f9f0ff;--docs-warning-background:#fff6f7;--docs-error-color:#ed4014;--docs-error-background:#fef2f2}[data-doc-theme=dark],[data-vc-theme=dark]{--docs-background-color:#171b24;--docs-background-color-soft:#252b3a;--docs-background-color-mute:#303748;--docs-foreground-color:#f8f8f8;--docs-foreground-color-light:#d1d5dc;--docs-foreground-color-mute:#b9b9b9;--docs-border-color:#3b4355;--docs-border-color-light:#303748;--docs-primary-color:#873bf4;--docs-primary-color-light:#35244d;--docs-link-color:#6daeff;--docs-mask-color:rgba(10,13,18,.76);--docs-shadow-color:rgba(0,0,0,.45);--docs-code-background:#202630;--docs-pattern-fg:hsla(0,0%,100%,.1);--docs-footer-background:#0d0f14;--docs-footer-foreground:#9ca3af;--docs-tip-background:#30223f;--docs-warning-background:#3d2529;--docs-error-color:#ff6b6b;--docs-error-background:#41272b}.docs-playground{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;margin-bottom:16px;overflow:hidden;background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:8px}.docs-playground--files{height:100%;min-height:0;overflow:hidden}.docs-playground__error{height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.docs-playground__error,.docs-playground__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__header{padding:0 4px 0 0;background:transparent;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;gap:12px;-webkit-box-flex:0;-webkit-flex:0 0 44px;-ms-flex:0 0 44px;flex:0 0 44px}.docs-playground__title{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-width:0;padding-right:12px;overflow:hidden;font-size:14px;font-weight:600;line-height:20px;color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b));-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__title-anchor{position:absolute;top:50%;right:100%;width:14px;font-size:12px;line-height:1;color:inherit;text-align:center;text-decoration:none;opacity:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:opacity .2s;transition:opacity .2s}.docs-playground__title-anchor:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px;opacity:1}.docs-playground__title-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-playground .docs-playground__title:hover .docs-playground__title-anchor{opacity:1}.docs-playground__tools{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:auto;font-size:13px;line-height:20px;gap:8px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.docs-playground__tool-group{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;padding:2px;background:var(--docs-background-color-soft,var(--vc-background-color,#f1f5f9));border-radius:999px;gap:0;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__tool-divider{display:inline-block;width:1px;height:16px;background:var(--docs-border-color,var(--vc-border-color,#e2e8f0));-webkit-box-flex:0;-webkit-flex:0 0 1px;-ms-flex:0 0 1px;flex:0 0 1px}.docs-playground__views{padding:2px;background:var(--docs-background-color-soft,var(--vc-background-color,#f1f5f9));gap:0}.docs-playground__tool,.docs-playground__view,.docs-playground__views{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;border-radius:999px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-playground__view{height:28px;padding:0 12px;font:inherit;font-size:13px;font-weight:500;line-height:20px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-lightest,#64748b));cursor:pointer;background:transparent;border:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s,-webkit-box-shadow .15s}.docs-playground__view.is-active,.docs-playground__view:hover{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground__view:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px}.docs-playground__view.is-active{background:var(--docs-background-color,var(--vc-background-color-lightest,#fff));-webkit-box-shadow:0 1px 2px rgba(15,23,42,.08);box-shadow:0 1px 2px rgba(15,23,42,.08)}.docs-playground__tool{width:28px;height:28px;padding:0;font:inherit;color:var(--docs-foreground-color-mute,var(--vc-color-dark-lightest,#64748b));cursor:pointer;background:transparent;border:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,-webkit-box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s;transition:color .15s,background-color .15s,box-shadow .15s,-webkit-box-shadow .15s}.docs-playground__editor .docs-playground-icon,.docs-playground__tool .docs-playground-icon,.docs-playground__viewport-trigger .docs-playground-icon{width:16px;height:16px}.docs-playground__tool.is-active,.docs-playground__tool:hover{color:var(--docs-foreground-color,var(--vc-foreground-color,#18181b))}.docs-playground__tool:focus-visible{outline:2px solid var(--docs-primary-color,var(--vc-color-primary,#2563eb));outline-offset:1px}.docs-playground__tool.is-active{background:var(--docs-background-color,var(--vc-background-color-lightest,#fff));-webkit-box-shadow:0 1px 2px rgba(15,23,42,.08);box-shadow:0 1px 2px rgba(15,23,42,.08)}.docs-playground__viewport-menu{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.docs-playground__viewport-options{min-width:136px}.docs-playground__viewport-option{white-space:nowrap}.docs-playground__popup-close-mark{font-size:16px;line-height:1}/*$vite$:1*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deot/docs-playground",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"access": "public"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@deot/docs-locale": "^1.1.
|
|
22
|
-
"@deot/docs-theme": "^1.1.
|
|
21
|
+
"@deot/docs-locale": "^1.1.4",
|
|
22
|
+
"@deot/docs-theme": "^1.1.4",
|
|
23
23
|
"@deot/helper": "^1.1.21",
|
|
24
24
|
"@deot/http": "^1.1.10",
|
|
25
25
|
"@deot/vc": "^1.2.3",
|