@oj-module/cli 0.1.15 → 0.1.17
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/devkit/SKILL.md +3 -0
- package/devkit/framework-dev.md +2 -2
- package/devkit/manual.md +60 -5
- package/package.json +3 -2
- package/shell-dist/assets/runtime.js +34 -3
- package/shell-dist/assets/vditor-index-css.js +7 -0
- package/shell-dist/assets/vditor.js +15223 -0
- package/shell-dist/index.html +4 -2
- package/shell-dist/versions.json +7 -5
- package/src/contract/check.ts +254 -73
- package/src/contract/emit-stub.ts +1 -1
- package/src/index.ts +7 -0
- package/src/shared-deps.ts +18 -0
- package/src/usage.ts +2 -0
- package/src/versions.ts +10 -0
- package/templates/api/src/notification/contract.ts +51 -5
- package/templates/web/src/notification/client/api.schemas.ts +30 -2
- package/templates/web/src/notification/client/api.ts +52 -1
- package/templates/web/src/notification/entry.ts +13 -4
- package/vendor/host-versions.json +7 -5
package/devkit/SKILL.md
CHANGED
|
@@ -110,6 +110,9 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
|
|
|
110
110
|
| 通知铃 404 `no route matched` | 缺 root 级 `/api/notifications` | 补 `api/src/notifications` 模块 |
|
|
111
111
|
| `oj serve` 启动即退,报 `config uses removed server.* site keys (v0.1.58): api_prefix` | 用了 oj v0.1.58 起删除的旧站点键(`api_prefix`/`app_path`/`app_prefix`/`static_sites`/`app_spa_fallback`) | 改 `server.api_prefix: /api` 为顶层 `mounts: [{prefix: "/api", api: "src"}]`;迁移完整 YAML 由报错给出 |
|
|
112
112
|
| 改完 `mounts:` 仍全 404 | `api:` 指向目录不是 oj 启动目录下的 `src` | `mounts[].api` 写 `"src"`,`-c` 指向 `api/config.yaml`(ojm dev/preview 已内置) |
|
|
113
|
+
| `oj serve` 启动即退,报 `module '_shared' missing manifest.yaml` | 把共享后端代码放到了顶层 `api/src/_shared/`(oj 把 `api/src` 顶层目录都当模块,缺 `manifest.yaml`) | 嵌进所属模块目录:`api/src/<模块>/_shared/`,相对导入 |
|
|
114
|
+
| 后端 `import '@oj-module/runtime/...'` 报 `escapes project root` | oj 解析裸 specifier 以 `api/` 为项目根并钳制不越界,`@oj-module/runtime` 符号链接在 `packages/runtime`(项目根外) | 后端原语/类型放 `api/src` 内相对导入;跨模块共享类型仍以 runtime 为单一真源,两端形状手动同步 |
|
|
115
|
+
| 跨用户删/读他人通知不报错却像没生效 | 原语对不存在/非本人的行 `UPDATE 0` 行返回 `ok`,没区分归属 | 原语(`delNotice`/`markRead`)返回 `boolean`/`count`,端点据 `false`/`0` 映射 `json.fail(403, "forbidden")` |
|
|
113
116
|
|
|
114
117
|
## 手册
|
|
115
118
|
|
package/devkit/framework-dev.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
> ⚠️ 那两份 guide 有**已知陈旧处**,以源码为准:
|
|
21
21
|
> dev 端口实际是 **3333**(guide 写的 5173 已过时);包版本以
|
|
22
|
-
> `packages/*/package.json` 为准(guide 内部 0.1.6 / 0.1.8 不一致,实际 **0.1.
|
|
22
|
+
> `packages/*/package.json` 为准(guide 内部 0.1.6 / 0.1.8 不一致,实际 **0.1.16**)。
|
|
23
23
|
|
|
24
24
|
## §2 两包结构与依赖方向
|
|
25
25
|
|
|
@@ -132,7 +132,7 @@ pnpm test tests/shell # 宿主全量
|
|
|
132
132
|
**一键发布**:`node scripts/publish-packages.mjs`(lockstep 四包校验 → 构建 → 守卫测试 →
|
|
133
133
|
runtime → cli → registry 复核;`--dry-run` 只演练)。下面的手动步骤是它的展开参考。
|
|
134
134
|
|
|
135
|
-
- 两包**同版本号**(当前 `0.1.
|
|
135
|
+
- 两包**同版本号**(当前 `0.1.16`),后续发版保持 lockstep。
|
|
136
136
|
- **必须 `pnpm publish`**——用 `npm publish` 会漏出 `workspace:*` / `catalog:` 字面量。
|
|
137
137
|
- **顺序:先 `runtime` 后 `cli`**。`runtime` 未公开时,新 `cli` 的精确依赖会悬空,
|
|
138
138
|
消费者直接装不上。
|
package/devkit/manual.md
CHANGED
|
@@ -224,12 +224,25 @@ export default defineModule({
|
|
|
224
224
|
`antd`(含 `locale/*`)、`@ant-design/icons`、`@ant-design/pro-components`、
|
|
225
225
|
`i18next`、`react-i18next`、`zustand`、`dayjs`、`echarts`、`echarts-for-react`、
|
|
226
226
|
`motion`、`@dnd-kit/*`、`keepalive-for-react`、`simplebar-react`、`nprogress`、
|
|
227
|
-
`react-countup`、`ahooks`、`ky`、`clsx`、`tailwind-merge`、`pinyin-pro`。
|
|
227
|
+
`react-countup`、`ahooks`、`ky`、`clsx`、`tailwind-merge`、`pinyin-pro`、`vditor`。
|
|
228
228
|
查实际矩阵:`pnpm exec ojm info`。
|
|
229
229
|
|
|
230
|
-
|
|
230
|
+
#### vditor(Markdown 编辑器,软共享)
|
|
231
231
|
|
|
232
|
-
|
|
232
|
+
模块侧写法不变:`import Vditor from "vditor"` + `import "vditor/dist/index.css"`。
|
|
233
|
+
两个说明符均由宿主 importmap 供包(`/assets/vditor.js`、`/assets/vditor-index-css.js`),
|
|
234
|
+
模块**不得**再把 vditor 写进 `dependencies` 自打包——放 `devDependencies` 对齐版本供 `tsc` 用。
|
|
235
|
+
资产惰性加载:importmap 只做映射,宿主自身不 import vditor,`/assets/vditor.js` 仅在
|
|
236
|
+
模块产物真正 import 它(进编辑器页)时才被浏览器拉取,不进宿主首屏。
|
|
237
|
+
|
|
238
|
+
注意:vditor 运行期还要按需加载 lute / i18n / 图标 / 主题 CSS 等资源(默认走第三方 CDN,
|
|
239
|
+
宿主 CSP 通常不放行)。这部分**不随共享资产分发**,由模块自行处理(自注入或指向宿主
|
|
240
|
+
可服务的同源路径)。直接 `import "vditor/dist/..."` 其它深路径会命中前缀 external 但无
|
|
241
|
+
importmap 键,构建期报错——需要新深路径请联系框架方在共享表登记。
|
|
242
|
+
|
|
243
|
+
### 2.7 本版本共享依赖钉版(0.1.16 快照)
|
|
244
|
+
|
|
245
|
+
宿主经 importmap 提供以下单例(模块 `devDependencies` 须对齐,供 `tsc` 用);完整 68 项矩阵以
|
|
233
246
|
`pnpm exec ojm info` 或 `packages/cli/shell-dist/versions.json`(构建期生成)为准。
|
|
234
247
|
|
|
235
248
|
| 包 | 钉版 |
|
|
@@ -254,9 +267,10 @@ export default defineModule({
|
|
|
254
267
|
| `ky` | 2.0.2 |
|
|
255
268
|
| `clsx` / `tailwind-merge` | 2.1.1 / 3.6.0 |
|
|
256
269
|
| `pinyin-pro` | 3.29.3 |
|
|
270
|
+
| `vditor` | 4.0.0 |
|
|
257
271
|
|
|
258
|
-
框架包版本:`@oj-module/runtime` / `@oj-module/cli` / `@plane/kit` / `@plane/editor` 均为 `0.1.
|
|
259
|
-
(lockstep
|
|
272
|
+
框架包版本:`@oj-module/runtime` / `@oj-module/cli` / `@plane/kit` / `@plane/editor` 均为 `0.1.16`
|
|
273
|
+
(lockstep;本版实际改动仅 cli——vditor 入共享表);`oj` 二进制最低版本门禁 `MIN_OJ_VERSION = 0.1.50`。
|
|
260
274
|
|
|
261
275
|
> **`@oj-module/runtime` 到底导出哪些东西?** 权威清单随包发布在
|
|
262
276
|
> `node_modules/@oj-module/runtime/dist/index.d.ts`——直接 Read 它,或在编辑器里
|
|
@@ -570,6 +584,47 @@ export default defineModule({
|
|
|
570
584
|
});
|
|
571
585
|
```
|
|
572
586
|
|
|
587
|
+
**⑤ 跨模块发射原语(任何后端模块都能推通知)**
|
|
588
|
+
|
|
589
|
+
通知不是「只有通知模块自己用」的功能——下单、审核、@我等其它模块也需要给某个人推一条提醒。
|
|
590
|
+
把发射逻辑收敛成 `api/src/notification/_shared/notify.ts` 里的纯函数原语,其它模块**相对导入直接调用,
|
|
591
|
+
无需走 HTTP**:
|
|
592
|
+
|
|
593
|
+
```ts
|
|
594
|
+
// 在其它模块的 handler 里
|
|
595
|
+
import { pushNotice } from "../../notification/_shared/notify";
|
|
596
|
+
|
|
597
|
+
export default {
|
|
598
|
+
async post() {
|
|
599
|
+
// ...业务逻辑...
|
|
600
|
+
const id = await pushNotice({ userId: 2, title: "你的订单已发货", message: "单号 SO123" });
|
|
601
|
+
json.ok({ id }); // 返回命名空间 id "u:<id>"
|
|
602
|
+
},
|
|
603
|
+
};
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
原语清单(`_shared/notify.ts`,设计文档 §4.3 / §6):
|
|
607
|
+
|
|
608
|
+
| 原语 | 作用 | 返回 |
|
|
609
|
+
|---|---|---|
|
|
610
|
+
| `pushNotice({ userId, title, message, link?, avatar?, category? })` | 给指定用户推一条按人通知(一行 `notifications`) | 命名空间 id `"u:<id>"` |
|
|
611
|
+
| `pushBroadcastNotice({ title, message, ... })` | 广播一条(一行 `notifications_broadcast`,全员可见、一行存储) | 命名空间 id `"b:<id>"` |
|
|
612
|
+
| `delNotice(id, userId)` | 删按人项(校验归属,非本人返回 `false`);广播项仅删本人回执 | `boolean`(是否命中) |
|
|
613
|
+
| `noticesFor(userId)` | 合并列表:广播 LEFT JOIN 回执算 `is_read` UNION 按人 `WHERE user_id=?` | `NoticeItem[]` |
|
|
614
|
+
| `markRead(id, userId)` | 按人项校验归属(非本人 `false` → 端点映射 403);广播项 upsert 回执 | `boolean` |
|
|
615
|
+
| `markAllRead(userId)` / `clearNotices(userId)` | 全部已读 / 清空(按当前用户) | `void` |
|
|
616
|
+
|
|
617
|
+
约定:
|
|
618
|
+
- **原语不做业务判断**(不判空间/角色/可见性),收件人过滤是发送方责任(`pushNotice` 的 `userId` 谁都能传,按人隔离靠存储 `user_id` 保证)。
|
|
619
|
+
- **后端不能 `import '@oj-module/runtime'`**:oj 解析裸 specifier 以 `api/` 为项目根并钳制不越界(越界报
|
|
620
|
+
`escapes project root`);`@oj-module/runtime` 符号链接在 `packages/runtime`,属项目根之外。原语必须落在
|
|
621
|
+
`api/src` 内(相对导入);类型与 runtime 的 `@oj-module/runtime/notify` 保持同形即可,共享契约类型单一真源在 runtime。
|
|
622
|
+
- **`_shared` 必须嵌进所属模块目录**(`api/src/notification/_shared/`),不能放 `api/src/_shared/`——oj 把
|
|
623
|
+
`api/src` 的**顶层**目录都当模块(须有 `manifest.yaml`),顶层 `_shared` 会被当成缺 manifest 的模块,
|
|
624
|
+
`oj serve` 直接退(`module '_shared' missing manifest.yaml`)。
|
|
625
|
+
- **归属校验返回 403**:跨用户 `del` / `read` 他人按人项,原语返回 `false`,端点 `json.fail(403, "forbidden")`——
|
|
626
|
+
与「按人隔离」对称(A 推给 B 后 A 不可见、B 不可删/读 A 的)。
|
|
627
|
+
|
|
573
628
|
**验证**:`pnpm dev` → `admin / 123456` 登录 → 右上角铃铛有蓝点 → 点开 →
|
|
574
629
|
点任意一条蓝点消失 → 「全部已读」全清 → 「清空」列表变空。
|
|
575
630
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oj-module/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.17",
|
|
5
5
|
"description": "React Antd Admin 模块工程命令行工具(含预构建宿主 shell-dist)",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"exports": {
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
],
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@faker-js/faker": "^10.4.0",
|
|
52
|
-
"@oj-module/runtime": "0.1.
|
|
52
|
+
"@oj-module/runtime": "0.1.17",
|
|
53
53
|
"@redocly/cli": "^2.51.0",
|
|
54
54
|
"@tailwindcss/vite": "^4.3.0",
|
|
55
55
|
"esbuild": "^0.28.2",
|
|
@@ -93,6 +93,7 @@
|
|
|
93
93
|
"spin-delay": "^2.0.1",
|
|
94
94
|
"tailwind-merge": "^3.6.0",
|
|
95
95
|
"use-sync-external-store": "^1.6.0",
|
|
96
|
+
"vditor": "^4.0.0",
|
|
96
97
|
"zustand": "^5.0.13"
|
|
97
98
|
},
|
|
98
99
|
"publishConfig": {
|
|
@@ -122,6 +122,36 @@ function unregisterApiProviders(moduleName) {
|
|
|
122
122
|
var systemCurrent, notificationsCurrent, uploadCurrent, routesCurrent;
|
|
123
123
|
var init_api_provider = __esmMin((() => {}));
|
|
124
124
|
//#endregion
|
|
125
|
+
//#region src/api/notify/index.ts
|
|
126
|
+
init_api_provider();
|
|
127
|
+
var NOT_REGISTERED = "NotificationsBackendNotRegistered";
|
|
128
|
+
function requirePushProvider() {
|
|
129
|
+
const p = getNotificationsApiProvider();
|
|
130
|
+
if (!p || typeof p.push !== "function" || typeof p.pushBroadcast !== "function" || typeof p.del !== "function") throw new Error(`[notify] ${NOT_REGISTERED}:未注册 notificationsApi provider 的发射方法(push/pushBroadcast/del)。`);
|
|
131
|
+
return p;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 跨模块通知发射原语(前端侧 facade)。委托给已注册 notificationsApi provider 的
|
|
135
|
+
* 发射方法(经 HTTP 落到后端通知模块)。后端模块请改用 `api/src/_shared/notify`
|
|
136
|
+
* (直接 db 写入两表)——那是真正的服务端原语。
|
|
137
|
+
*
|
|
138
|
+
* 语义:原语不做任何业务判断(不判空间/角色/可见性),收件人过滤是发送方责任。
|
|
139
|
+
*/
|
|
140
|
+
var notify = {
|
|
141
|
+
/** 给指定用户推一条按人通知,返回命名空间 id "u:<id>" */
|
|
142
|
+
push(input) {
|
|
143
|
+
return requirePushProvider().push(input);
|
|
144
|
+
},
|
|
145
|
+
/** 广播一条通知(全员可见,一行存储),返回命名空间 id "b:<id>" */
|
|
146
|
+
pushBroadcast(input) {
|
|
147
|
+
return requirePushProvider().pushBroadcast(input);
|
|
148
|
+
},
|
|
149
|
+
/** 删除通知:按人项校验归属(非本人删自己);广播项仅删本人回执 */
|
|
150
|
+
del(id, userId) {
|
|
151
|
+
return requirePushProvider().del(id, userId);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
//#endregion
|
|
125
155
|
//#region src/router/extra-info/route-path.ts
|
|
126
156
|
/**
|
|
127
157
|
* 判断 pathname 是否为登录页(basename 感知,P0)。
|
|
@@ -225,10 +255,10 @@ function getAppInfo() {
|
|
|
225
255
|
return {
|
|
226
256
|
"pkg": {
|
|
227
257
|
"name": "@oj-module/runtime",
|
|
228
|
-
"version": "0.1.
|
|
258
|
+
"version": "0.1.17",
|
|
229
259
|
"license": "MIT"
|
|
230
260
|
},
|
|
231
|
-
"lastBuildTime": "2026-10-
|
|
261
|
+
"lastBuildTime": "2026-10-13 22:01:51"
|
|
232
262
|
};
|
|
233
263
|
}
|
|
234
264
|
var init_get_app_info = __esmMin((() => {}));
|
|
@@ -4429,6 +4459,7 @@ var init_notification = __esmMin((() => {
|
|
|
4429
4459
|
const handleClick = (item) => {
|
|
4430
4460
|
if (readOnly) return;
|
|
4431
4461
|
onEventChange && onEventChange("read", item);
|
|
4462
|
+
if (item.link) window.open(item.link, "_blank", "noopener");
|
|
4432
4463
|
};
|
|
4433
4464
|
dot = useMemo(() => {
|
|
4434
4465
|
return !!notifications?.filter((item) => !item?.isRead).length;
|
|
@@ -27416,4 +27447,4 @@ init_ri();
|
|
|
27416
27447
|
init_menu_icons();
|
|
27417
27448
|
init_tree();
|
|
27418
27449
|
//#endregion
|
|
27419
|
-
export { AccessControl, AccessControlRoles, AntdApp, BasicButton, BasicContent, BasicTable, EmbeddedIcon, ErrorBoundary, ExternalIcon, FormAvatarItem, FormTreeItem, Iframe, LayoutCenterIcon, LayoutEffects, LayoutLeftIcon, LayoutRightIcon, MixedNavigationIcon, OutsidePageIcon, PageError, ProfileCardIcon, RiAccountCircleLine, RiContrastFill, RiFullscreenExitLine, RiFullscreenLine, RiMailCheckLine, RiMoonIcon, RiReactjsLine, RiSunIcon, RiUserSettingsLine, ServerErrorIcon, SideNavigationIcon, TopNavigationIcon, TwoColumnNavigationIcon, accessControlCodes, defineModule, fetchAddMenuItem, fetchAddRoleItem, fetchAsyncRoutes, fetchDeleteMenuItem, fetchDeleteRoleItem, fetchLogin, fetchLogout, fetchMenuByRoleId, fetchMenuList, fetchRefreshToken, fetchRoleList, fetchRoleMenu, fetchUpdateMenuItem, fetchUpdateRoleItem, fetchUserInfo, filterTree, getAllExpandedKeys, getAppInfo, getBooleanOptions, getModule, getModules, getRedirectPath, getRegisteredApiPrefix, getRegisteredStore, getRoutes, getYesNoOptions, handleTree, loadAll, mapTree, menuIcons, permissionPrefix, setupI18n, traverseTreeValues, unloadModule, useAccess, useAuthStore, usePreferences, useSlotNodes, useTabsStore, useUserStore, external_exports as z };
|
|
27450
|
+
export { AccessControl, AccessControlRoles, AntdApp, BasicButton, BasicContent, BasicTable, EmbeddedIcon, ErrorBoundary, ExternalIcon, FormAvatarItem, FormTreeItem, Iframe, LayoutCenterIcon, LayoutEffects, LayoutLeftIcon, LayoutRightIcon, MixedNavigationIcon, OutsidePageIcon, PageError, ProfileCardIcon, RiAccountCircleLine, RiContrastFill, RiFullscreenExitLine, RiFullscreenLine, RiMailCheckLine, RiMoonIcon, RiReactjsLine, RiSunIcon, RiUserSettingsLine, ServerErrorIcon, SideNavigationIcon, TopNavigationIcon, TwoColumnNavigationIcon, accessControlCodes, defineModule, fetchAddMenuItem, fetchAddRoleItem, fetchAsyncRoutes, fetchDeleteMenuItem, fetchDeleteRoleItem, fetchLogin, fetchLogout, fetchMenuByRoleId, fetchMenuList, fetchRefreshToken, fetchRoleList, fetchRoleMenu, fetchUpdateMenuItem, fetchUpdateRoleItem, fetchUserInfo, filterTree, getAllExpandedKeys, getAppInfo, getBooleanOptions, getModule, getModules, getRedirectPath, getRegisteredApiPrefix, getRegisteredStore, getRoutes, getYesNoOptions, handleTree, loadAll, mapTree, menuIcons, notify, permissionPrefix, setupI18n, traverseTreeValues, unloadModule, useAccess, useAuthStore, usePreferences, useSlotNodes, useTabsStore, useUserStore, external_exports as z };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const __css = "/*!\n * Vditor v4.0.0 - A markdown editor written in TypeScript.\n *\n * MIT License\n *\n * Copyright (c) 2018-present B3log 开源, b3log.org\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\n/*!\n * Vditor v4.0.0 - A markdown editor written in TypeScript.\n *\n * MIT License\n *\n * Copyright (c) 2018-present B3log 开源, b3log.org\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\n.vditor {\n --border-color: #d1d5da;\n --second-color: rgba(88, 96, 105, 0.36);\n --panel-background-color: #fff;\n --panel-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n --toolbar-background-color: #f6f8fa;\n --toolbar-icon-color: #586069;\n --toolbar-icon-hover-color: #4285f4;\n --toolbar-height: 35px;\n --toolbar-divider-margin-top: 8px;\n --textarea-background-color: #fafbfc;\n --textarea-text-color: #24292e;\n --resize-icon-color: var(--toolbar-icon-color);\n --resize-background-color: var(--toolbar-background-color);\n --resize-hover-icon-color: var(--panel-background-color);\n --resize-hover-background-color: var(--toolbar-icon-hover-color);\n --count-background-color: rgba(27, 31, 35, 0.05);\n --heading-border-color: #eaecef;\n --blockquote-color: #6a737d;\n --callout-note-color: #0969da;\n --callout-note-background-color: rgba(9, 105, 218, 0.08);\n --callout-tip-color: #1a7f37;\n --callout-tip-background-color: rgba(26, 127, 55, 0.08);\n --callout-important-color: #8250df;\n --callout-important-background-color: rgba(130, 80, 223, 0.08);\n --callout-warning-color: #9a6700;\n --callout-warning-background-color: rgba(154, 103, 0, 0.08);\n --callout-caution-color: #cf222e;\n --callout-caution-background-color: rgba(207, 34, 46, 0.08);\n --ir-heading-color: #660e7a;\n --ir-title-color: #808080;\n --ir-bi-color: #0033b3;\n --ir-link-color: #008000;\n --ir-bracket-color: #0000ff;\n --ir-paren-color: #008000;\n}\n.vditor--dark {\n --border-color: #141414;\n --second-color: rgba(185, 185, 185, 0.36);\n --panel-background-color: #24292e;\n --panel-shadow: 0 1px 2px rgba(255, 255, 255, 0.2);\n --toolbar-background-color: #1d2125;\n --toolbar-icon-color: #b9b9b9;\n --toolbar-icon-hover-color: #fff;\n --textarea-background-color: #2f363d;\n --textarea-text-color: #d1d5da;\n --resize-icon-color: var(--border-color);\n --resize-background-color: var(--second-color);\n --resize-hover-icon-color: var(--toolbar-icon-hover-color);\n --resize-hover-background-color: rgba(185, 185, 185, 0.86);\n --count-background-color: rgba(66, 133, 244, 0.36);\n --heading-border-color: var(--textarea-text-color);\n --blockquote-color: var(--toolbar-icon-color);\n --callout-note-color: #58a6ff;\n --callout-note-background-color: rgba(56, 139, 253, 0.15);\n --callout-tip-color: #3fb950;\n --callout-tip-background-color: rgba(46, 160, 67, 0.15);\n --callout-important-color: #a371f7;\n --callout-important-background-color: rgba(163, 113, 247, 0.15);\n --callout-warning-color: #d29922;\n --callout-warning-background-color: rgba(187, 128, 9, 0.15);\n --callout-caution-color: #f85149;\n --callout-caution-background-color: rgba(248, 81, 73, 0.15);\n --ir-heading-color: #9876aa;\n --ir-title-color: #808080;\n --ir-bi-color: #cc7832;\n --ir-link-color: #ffc66d;\n --ir-bracket-color: #287bde;\n --ir-paren-color: #6a8759;\n}\n/**\n * tool tip.\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @version 0.1.0.0, Jan 25, 2019\n */\n@keyframes tooltip-appear {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.vditor-tooltipped {\n position: relative;\n cursor: pointer;\n}\n.vditor-tooltipped::after {\n position: absolute;\n z-index: 1000000;\n display: none;\n padding: 5px 8px;\n font-size: 11px;\n font-weight: normal;\n -webkit-font-smoothing: subpixel-antialiased;\n color: #fff;\n text-align: center;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-wrap: break-word;\n white-space: pre;\n pointer-events: none;\n content: attr(aria-label);\n background: #3b3e43;\n border-radius: 3px;\n line-height: 16px;\n opacity: 0;\n}\n.vditor-tooltipped::before {\n position: absolute;\n z-index: 1000001;\n display: none;\n width: 0;\n height: 0;\n color: #3b3e43;\n pointer-events: none;\n content: \"\";\n border: 5px solid transparent;\n opacity: 0;\n}\n.vditor-tooltipped--hover::before,\n.vditor-tooltipped--hover::after,\n.vditor-tooltipped:hover::before,\n.vditor-tooltipped:hover::after,\n.vditor-tooltipped:active::before,\n.vditor-tooltipped:active::after,\n.vditor-tooltipped:focus::before,\n.vditor-tooltipped:focus::after {\n display: inline-block;\n text-decoration: none;\n animation-name: tooltip-appear;\n animation-duration: 0.15s;\n animation-fill-mode: forwards;\n animation-timing-function: ease-in;\n}\n.vditor-tooltipped__s::after,\n.vditor-tooltipped__se::after,\n.vditor-tooltipped__sw::after {\n top: 100%;\n right: 50%;\n margin-top: 5px;\n}\n.vditor-tooltipped__s::before,\n.vditor-tooltipped__se::before,\n.vditor-tooltipped__sw::before {\n top: auto;\n right: 50%;\n bottom: -5px;\n margin-right: -5px;\n border-bottom-color: #3b3e43;\n}\n.vditor-tooltipped__se::after {\n right: auto;\n left: 50%;\n margin-left: -15px;\n}\n.vditor-tooltipped__sw::after {\n margin-right: -15px;\n}\n.vditor-tooltipped__n::after,\n.vditor-tooltipped__ne::after,\n.vditor-tooltipped__nw::after {\n right: 50%;\n bottom: 100%;\n margin-bottom: 5px;\n}\n.vditor-tooltipped__n::before,\n.vditor-tooltipped__ne::before,\n.vditor-tooltipped__nw::before {\n top: -5px;\n right: 50%;\n bottom: auto;\n margin-right: -5px;\n border-top-color: #3b3e43;\n}\n.vditor-tooltipped__ne::after {\n right: auto;\n left: 50%;\n margin-left: -15px;\n}\n.vditor-tooltipped__nw::after {\n margin-right: -15px;\n}\n.vditor-tooltipped__s::after,\n.vditor-tooltipped__n::after {\n transform: translateX(50%);\n}\n.vditor-tooltipped__w::after {\n right: 100%;\n bottom: 50%;\n margin-right: 5px;\n transform: translateY(50%);\n}\n.vditor-tooltipped__w::before {\n top: 50%;\n bottom: 50%;\n left: -5px;\n margin-top: -5px;\n border-left-color: #3b3e43;\n}\n.vditor-tooltipped__e::after {\n bottom: 50%;\n left: 100%;\n margin-left: 5px;\n transform: translateY(50%);\n}\n.vditor-tooltipped__e::before {\n top: 50%;\n right: -5px;\n bottom: 50%;\n margin-top: -5px;\n border-right-color: #3b3e43;\n}\n@media screen and (max-width: 520px) {\n .vditor-tooltipped:before,\n .vditor-tooltipped:after {\n content: none;\n }\n}\n/**\n * panel.\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @version 1.0.0.0, Jan 22, 2020\n */\n@keyframes scale-in {\n 0% {\n opacity: 0;\n transform: scale(0.5);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n.vditor-panel {\n background-color: var(--panel-background-color);\n position: absolute;\n box-shadow: var(--panel-shadow);\n border-radius: 3px;\n padding: 5px;\n z-index: 3;\n font-size: 14px;\n display: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n max-width: 320px;\n min-width: 80px;\n animation-duration: 0.15s;\n animation-name: scale-in;\n animation-timing-function: cubic-bezier(0.2, 0, 0.13, 1.5);\n color: var(--toolbar-icon-color);\n}\n.vditor-panel--none {\n padding: 0;\n animation: none;\n min-width: auto;\n max-width: none;\n white-space: nowrap;\n opacity: 0.86;\n}\n.vditor-panel--arrow:before {\n position: absolute;\n width: 0;\n height: 0;\n pointer-events: none;\n content: \" \";\n border: 7px solid transparent;\n top: -14px;\n left: 5px;\n border-bottom-color: var(--panel-background-color);\n}\n.vditor-panel--left {\n right: 0;\n}\n.vditor-panel--left.vditor-panel--arrow:before {\n right: 5px;\n left: auto;\n}\n.vditor-input {\n border: 0;\n padding: 3px 5px;\n background-color: var(--panel-background-color);\n font-size: 12px;\n color: var(--textarea-text-color);\n}\n.vditor-input:focus {\n background-color: var(--toolbar-background-color);\n outline: none;\n}\n.vditor-icon {\n color: var(--toolbar-icon-color);\n cursor: pointer;\n float: left;\n padding: 4px 5px;\n height: 21px;\n width: 23px;\n background-color: transparent;\n border: 0;\n box-sizing: border-box;\n}\n.vditor-icon:hover,\n.vditor-icon--current {\n color: var(--toolbar-icon-hover-color);\n background-color: transparent;\n}\n.vditor-icon:focus {\n outline: none;\n}\n.vditor-icon svg {\n height: 13px !important;\n width: 13px !important;\n float: left;\n fill: currentColor;\n pointer-events: none;\n}\n.vditor-toolbar {\n background-color: var(--toolbar-background-color);\n border-bottom: 1px solid var(--border-color);\n padding: 0 5px;\n line-height: 1;\n}\n.vditor-toolbar--pin {\n position: sticky;\n top: 0;\n z-index: 1;\n}\n.vditor-toolbar--hide {\n transition: all 0.15s ease-in-out;\n height: 5px;\n overflow: hidden;\n}\n.vditor-toolbar--hide:hover {\n background-color: var(--toolbar-background-color);\n height: auto;\n overflow: visible;\n}\n.vditor-toolbar__item {\n float: left;\n position: relative;\n}\n.vditor-toolbar__item .vditor-tooltipped {\n color: var(--toolbar-icon-color);\n border: 0;\n padding: 10px 5px;\n background-color: transparent;\n height: var(--toolbar-height);\n width: 25px;\n box-sizing: border-box;\n font-size: 0;\n}\n.vditor-toolbar__item .vditor-tooltipped:focus {\n outline: none;\n}\n.vditor-toolbar__item .vditor-tooltipped:focus {\n cursor: pointer;\n color: var(--toolbar-icon-hover-color);\n}\n.vditor-toolbar__item svg {\n fill: currentColor;\n display: inline-block;\n stroke-width: 0;\n stroke: currentColor;\n width: 15px;\n height: 15px;\n}\n.vditor-toolbar__item input {\n position: absolute;\n width: 25px;\n height: var(--toolbar-height);\n top: 0;\n left: 0;\n cursor: pointer;\n opacity: 0.001;\n overflow: hidden;\n}\n.vditor-toolbar__divider {\n float: left;\n height: calc(var(--toolbar-height) - (var(--toolbar-divider-margin-top) * 2));\n border-left: 1px solid var(--second-color);\n margin: var(--toolbar-divider-margin-top) 8px;\n}\n.vditor-toolbar__br {\n width: 100%;\n padding: 0 !important;\n height: 0 !important;\n}\n.vditor-menu--current {\n color: var(--toolbar-icon-hover-color) !important;\n}\n.vditor-menu--disabled {\n color: var(--second-color) !important;\n cursor: not-allowed !important;\n}\n.vditor-emojis {\n display: inline-block;\n overflow: auto;\n}\n.vditor-emojis::-webkit-scrollbar {\n display: none;\n}\n.vditor-emojis__tip {\n flex: 1;\n min-width: 1px;\n width: 200px;\n margin-right: 10px;\n color: var(--toolbar-icon-color);\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.vditor-emojis__tail {\n margin-top: 5px;\n font-size: 12px;\n color: var(--toolbar-icon-color);\n display: flex;\n}\n.vditor-emojis__tail a {\n text-decoration: none;\n color: var(--toolbar-icon-color);\n}\n.vditor-emojis__tail a:hover {\n color: var(--toolbar-icon-hover-color);\n}\n.vditor-emojis button {\n cursor: pointer;\n border-radius: 3px;\n float: left;\n height: 30px;\n width: 30px;\n text-align: center;\n line-height: 26px;\n padding: 3px;\n box-sizing: border-box;\n font-size: 16px;\n transition: all 0.15s ease-in-out;\n border: 0;\n margin: 0;\n background-color: transparent;\n overflow: hidden;\n}\n.vditor-emojis button:focus {\n outline: none;\n}\n.vditor-emojis button:hover .vditor-emojis__icon {\n display: inline-block;\n transform: scale(1.2);\n}\n.vditor-emojis img {\n height: 20px;\n width: 20px;\n float: left;\n margin: 3px 0 0 3px;\n}\n@media screen and (max-width: 520px) {\n .vditor-toolbar__item {\n padding: 0 12px;\n }\n .vditor-panel--left.vditor-panel--arrow:before {\n right: 17px;\n }\n}\n@media (hover: hover) and (pointer: fine) {\n .vditor-toolbar__item .vditor-tooltipped:hover {\n color: var(--toolbar-icon-hover-color);\n }\n}\n@keyframes slideInDown {\n from {\n transform: translate3d(0, -100%, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n.vditor {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--border-color);\n border-radius: 3px;\n box-sizing: border-box;\n font-family: \"Helvetica Neue\", \"Luxi Sans\", \"DejaVu Sans\", \"Hiragino Sans GB\", \"Microsoft Yahei\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Segoe UI Symbol\", \"Android Emoji\", \"EmojiSymbols\";\n}\n.vditor--fullscreen {\n position: fixed;\n top: 0;\n width: 100% !important;\n left: 0;\n height: 100vh !important;\n z-index: 90;\n border-radius: 0;\n}\n.vditor-content {\n display: flex;\n min-height: 60px;\n flex: 1;\n min-width: 1px;\n position: relative;\n}\n.vditor-preview {\n flex: 1;\n min-width: 1px;\n overflow: auto;\n margin-left: -1px;\n border-left: 1px solid var(--border-color);\n box-sizing: border-box;\n border-radius: 0 0 3px 0;\n background-color: var(--textarea-background-color);\n}\n.vditor-preview::-webkit-scrollbar {\n display: none;\n}\n.vditor-preview__action {\n text-align: center;\n padding: 10px;\n background-color: var(--toolbar-background-color);\n}\n.vditor-preview__action button {\n background-color: var(--toolbar-background-color);\n color: var(--toolbar-icon-color);\n line-height: 20px;\n border: 0;\n margin: 0 10px;\n cursor: pointer;\n padding: 0 7px;\n font-size: 12px;\n}\n.vditor-preview__action button.vditor-preview__action--current,\n.vditor-preview__action button:hover {\n color: var(--toolbar-icon-hover-color);\n background-color: var(--toolbar-background-color);\n}\n.vditor-preview__action button:focus {\n outline: none;\n}\n.vditor-preview__action button svg {\n fill: currentColor;\n height: 15px;\n width: 15px;\n vertical-align: middle;\n}\n.vditor-preview > .vditor-reset {\n padding: 10px;\n margin: 0 auto;\n}\n.vditor-preview img:not(.emoji) {\n cursor: pointer;\n}\n.vditor-devtools {\n display: none;\n background-color: var(--textarea-background-color);\n overflow: auto;\n flex: 1;\n min-width: 1px;\n box-shadow: inset 1px 0 var(--border-color);\n box-sizing: border-box;\n border-radius: 0 0 3px 0;\n padding: 10px;\n}\n.vditor-counter {\n padding: 3px;\n color: var(--toolbar-icon-color);\n background-color: var(--count-background-color);\n border-radius: 3px;\n font-size: 12px;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n float: right;\n margin: 8px 3px 0 0;\n}\n.vditor-counter--error {\n color: #d23f31;\n background-color: rgba(210, 63, 49, 0.1);\n}\n.vditor-resize {\n padding: 3px 0;\n cursor: row-resize;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n position: absolute;\n width: 100%;\n}\n.vditor-resize--top {\n top: -3px;\n}\n.vditor-resize--bottom {\n bottom: -3px;\n}\n.vditor-resize > div {\n height: 3px;\n background-color: var(--resize-background-color);\n transition: all 0.15s ease-in-out;\n}\n.vditor-resize:hover > div,\n.vditor-resize--selected > div {\n background-color: var(--resize-hover-background-color);\n}\n.vditor-resize:hover svg,\n.vditor-resize--selected svg {\n color: var(--resize-hover-icon-color);\n}\n.vditor-resize svg {\n fill: currentColor;\n stroke-width: 0;\n stroke: currentColor;\n width: 13px;\n height: 3px;\n display: block;\n margin: 0 auto;\n color: var(--resize-icon-color);\n}\n.vditor-upload {\n position: absolute;\n height: 3px;\n left: 0;\n top: -2px;\n transition: all 0.15s ease-in-out;\n background-color: #4285f4;\n}\n.vditor-tip {\n position: absolute;\n font-size: 12px;\n top: 10px;\n animation-duration: 0.15s;\n animation-fill-mode: both;\n left: 50%;\n z-index: 5;\n}\n.vditor-tip--show {\n display: block;\n animation-name: slideInDown;\n}\n.vditor-tip__content {\n text-align: left;\n display: inline-block;\n line-height: 16px;\n padding: 3px 10px;\n border-radius: 3px;\n background: var(--toolbar-background-color);\n position: relative;\n margin-left: -50%;\n color: var(--toolbar-icon-color);\n max-width: 100%;\n box-shadow: var(--panel-shadow);\n}\n.vditor-tip__content ul {\n margin: 2px 0;\n padding: 0 0 0 18px;\n}\n.vditor-tip__content a {\n color: #4285f4;\n}\n.vditor-tip__close {\n position: absolute;\n color: var(--toolbar-icon-color);\n top: -7px;\n right: -15px;\n font-weight: bold;\n cursor: pointer;\n}\n.vditor-tip__close:hover {\n color: var(--toolbar-icon-hover-color);\n}\n.vditor-img {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n z-index: 100;\n}\n.vditor-img__bar {\n border-bottom: 1px solid var(--border-color);\n background-color: var(--toolbar-background-color);\n text-align: center;\n height: 36px;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.vditor-img__btn {\n display: flex;\n align-items: center;\n cursor: pointer;\n margin-left: 24px;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n color: var(--toolbar-icon-color);\n}\n.vditor-img__btn:hover {\n color: var(--toolbar-icon-hover-color);\n}\n.vditor-img__btn svg {\n height: 14px;\n width: 14px;\n margin-right: 8px;\n fill: currentColor;\n}\n.vditor-img__img {\n flex: 1;\n background-color: var(--textarea-background-color);\n overflow: auto;\n cursor: zoom-out;\n}\n.vditor-img__img img {\n max-width: none;\n}\n.vditor-hint {\n background-color: var(--panel-background-color);\n position: absolute;\n box-shadow: var(--panel-shadow);\n border-radius: 3px;\n padding: 5px 0;\n z-index: 4;\n line-height: 20px;\n list-style: none;\n font-size: 12px;\n margin: 0;\n max-width: 250px;\n min-width: 80px;\n display: none;\n}\n.vditor-hint .vditor-hint {\n margin-top: -31px;\n left: 100%;\n right: auto;\n}\n.vditor-hint .vditor-hint.vditor-panel--left {\n right: 100%;\n left: auto;\n}\n.vditor-hint button {\n color: var(--toolbar-icon-color);\n display: block;\n padding: 3px 10px;\n border: 0;\n border-radius: 0;\n line-height: 20px;\n width: 100%;\n box-sizing: border-box;\n text-align: left;\n margin: 0;\n background-color: transparent;\n cursor: pointer;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.vditor-hint button:focus {\n outline: none;\n}\n.vditor-hint--current,\n.vditor-hint button:not(.vditor-menu--disabled):hover {\n background-color: var(--toolbar-background-color) !important;\n color: var(--toolbar-icon-hover-color) !important;\n}\n.vditor-hint__emoji {\n font-size: 16px;\n float: left;\n margin-right: 3px;\n}\n.vditor-hint img {\n height: 20px;\n width: 20px;\n float: left;\n margin-right: 3px;\n}\n.vditor-reset {\n color: #24292e;\n font-variant-ligatures: no-common-ligatures;\n font-family: \"Helvetica Neue\", \"Luxi Sans\", \"DejaVu Sans\", \"Hiragino Sans GB\", \"Microsoft Yahei\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Segoe UI Symbol\", \"Android Emoji\", \"EmojiSymbols\";\n word-wrap: break-word;\n overflow: auto;\n line-height: 1.5;\n font-size: 16px;\n word-break: break-word;\n}\n.vditor-reset--anchor {\n padding-left: 20px;\n}\n.vditor-reset--error {\n color: #d23f31;\n font-size: 12px;\n display: block;\n line-height: 16px;\n}\n.vditor-reset ul ul ul {\n list-style-type: square;\n}\n.vditor-reset ul ul {\n list-style-type: circle;\n}\n.vditor-reset ul {\n list-style-type: disc;\n}\n.vditor-reset ul,\n.vditor-reset ol {\n padding-left: 2em;\n margin-top: 0;\n margin-bottom: 16px;\n}\n.vditor-reset li + li {\n margin-top: 0.25em;\n}\n.vditor-reset li p {\n margin-top: 16px;\n}\n.vditor-reset audio {\n max-width: 100%;\n}\n.vditor-reset audio:focus {\n outline: none;\n}\n.vditor-reset video {\n max-height: 90vh;\n max-width: 100%;\n}\n.vditor-reset img {\n max-width: 100%;\n}\n.vditor-reset img.emoji {\n cursor: auto;\n max-width: 20px;\n vertical-align: sub;\n}\n.vditor-reset figure.vditor-image {\n margin: 0 0 16px;\n text-align: center;\n}\n.vditor-reset figure.vditor-image figcaption {\n font-size: 0.875em;\n margin-top: 4px;\n opacity: 0.65;\n white-space: pre-wrap;\n}\n.vditor-reset span.vditor-image[data-image-caption] {\n display: inline-block;\n max-width: 100%;\n text-align: center;\n vertical-align: top;\n}\n.vditor-reset span.vditor-image[data-image-caption]::after {\n content: attr(data-image-caption);\n display: block;\n font-size: 0.875em;\n line-height: 1.5;\n margin-top: 4px;\n opacity: 0.65;\n white-space: pre-wrap;\n}\n.vditor-reset h1,\n.vditor-reset h2,\n.vditor-reset h3,\n.vditor-reset h4,\n.vditor-reset h5,\n.vditor-reset h6 {\n margin-top: 24px;\n margin-bottom: 16px;\n font-weight: 600;\n line-height: 1.25;\n}\n.vditor-reset h1:hover .vditor-anchor svg,\n.vditor-reset h2:hover .vditor-anchor svg,\n.vditor-reset h3:hover .vditor-anchor svg,\n.vditor-reset h4:hover .vditor-anchor svg,\n.vditor-reset h5:hover .vditor-anchor svg,\n.vditor-reset h6:hover .vditor-anchor svg {\n visibility: visible;\n}\n.vditor-reset h1 {\n font-size: 1.75em;\n}\n.vditor-reset h2 {\n font-size: 1.55em;\n}\n.vditor-reset h3 {\n font-size: 1.38em;\n}\n.vditor-reset h4 {\n font-size: 1.25em;\n}\n.vditor-reset h5 {\n font-size: 1.13em;\n}\n.vditor-reset h6 {\n font-size: 1em;\n}\n.vditor-reset hr {\n height: 2px;\n padding: 0;\n margin: 24px 0;\n background-color: #eaecef;\n border: 0;\n}\n.vditor-reset p {\n margin-top: 0;\n margin-bottom: 16px;\n}\n.vditor-reset blockquote {\n padding: 0 1em;\n color: #6a737d;\n border-left: 0.25em solid #eaecef;\n margin: 0 0 16px 0;\n}\n.vditor-reset blockquote > :first-child {\n margin-top: 0;\n}\n.vditor-reset blockquote > :last-child {\n margin-bottom: 0;\n}\n.vditor-reset ins > iframe {\n border: 0;\n}\n.vditor-reset iframe {\n border: 1px solid #d1d5da;\n max-width: 100%;\n box-sizing: border-box;\n}\n.vditor-reset iframe.iframe__video {\n min-width: 80%;\n min-height: 36vh;\n}\n.vditor-reset table {\n border-collapse: collapse;\n empty-cells: show;\n margin-bottom: 16px;\n overflow: auto;\n border-spacing: 0;\n display: block;\n word-break: keep-all;\n width: 100%;\n}\n.vditor-reset table tr {\n background-color: #fafbfc;\n border-top: 1px solid #c6cbd1;\n}\n.vditor-reset table td,\n.vditor-reset table th {\n padding: 6px 13px;\n border: 1px solid #dfe2e5;\n word-break: normal;\n white-space: nowrap;\n}\n.vditor-reset table td:first-child::after,\n.vditor-reset table th:first-child::after {\n content: \"\";\n display: inline-block;\n vertical-align: top;\n min-height: 24px;\n}\n.vditor-reset table th {\n font-weight: 600;\n}\n.vditor-reset table tbody tr:nth-child(2n) {\n background-color: #fff;\n}\n.vditor-reset code:not(.hljs):not(.highlight-chroma) {\n padding: 0.2em 0.4em;\n margin: 0;\n font-size: 85%;\n border-radius: 3px;\n font-family: mononoki, Consolas, \"Liberation Mono\", Menlo, Courier, monospace, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Segoe UI Symbol\", \"Android Emoji\", \"EmojiSymbols\";\n word-break: break-word;\n background-size: 20px 20px;\n white-space: pre-wrap;\n}\n.vditor-reset pre {\n margin: 1em 0;\n}\n.vditor-reset pre > code {\n margin: 0;\n font-size: 85%;\n padding: 0.5em;\n border-radius: 5px;\n display: block;\n overflow: auto;\n white-space: pre;\n font-family: mononoki, Consolas, \"Liberation Mono\", Menlo, Courier, monospace, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Segoe UI Symbol\", \"Android Emoji\", \"EmojiSymbols\";\n background-size: 20px 20px;\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8AgMAAABHkjHhAAAACVBMVEWAgIBaWlo+Pj7rTFvWAAAAA3RSTlMHCAw+VhR4AAAA+klEQVQoz4WSMW7EQAhFPxKWNh2FCx+HkaZI6RRb5DYbyVfIJXLKDCFoMbaTKSw/8ZnPAPjaH2xgZcUNUDADD7D9LtDBCLZ45fbkvo/30K8yeI64pPwl6znd/3n/Oe93P3ho9qeh72btTFzqkz0rsJle8Zr81OLEwZ1dv/713uWqvu2pl+k0fy7MWtj9r/tN5q/02z89qa/L4Dc2LvM93kezPfXlME/O86EbY/V9GB9ePX8G1/6W+/9h1dq/HGfTfzT3j/xNo7522Bfnqe5jO/fvhVthlfk434v3iO9zG/UOphyPeinPl1J8Gtaa7xPTa/Dk+RIs4deMvwGvcGsmsCvJ0AAAAABJRU5ErkJggg==);\n word-break: initial;\n word-wrap: normal;\n}\n.vditor-reset pre:hover div.vditor-copy {\n display: block;\n}\n.vditor-reset .language-math,\n.vditor-reset .language-echarts,\n.vditor-reset .language-mindmap,\n.vditor-reset .language-plantuml,\n.vditor-reset .language-mermaid,\n.vditor-reset .language-smiles,\n.vditor-reset .language-markmap,\n.vditor-reset .language-abc,\n.vditor-reset .language-flowchart,\n.vditor-reset .language-graphviz,\n.vditor-reset .language-wavedrom {\n margin-bottom: 16px;\n}\n.vditor-reset .language-math mjx-container:focus {\n outline: none;\n cursor: context-menu;\n}\n.vditor-reset .language-math .katex-display > .katex > .katex-html > .tag {\n display: inline-block;\n font-size: 1.21rem;\n right: 2px;\n}\n.vditor-reset .language-echarts,\n.vditor-reset .language-mindmap {\n overflow: hidden;\n height: 420px;\n}\n.vditor-reset .language-mermaid,\n.vditor-reset .language-markmap,\n.vditor-reset .language-flowchart,\n.vditor-reset .language-graphviz,\n.vditor-reset .language-wavedrom {\n text-align: center;\n}\n.vditor-reset .language-graphviz parsererror {\n overflow: auto;\n}\n.vditor-reset kbd {\n display: inline-block;\n padding: 3px 5px;\n font: 11px Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n line-height: 10px;\n color: #24292e;\n vertical-align: middle;\n background-color: #fafbfc;\n border: solid 1px #d1d5da;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 #d1d5da;\n}\n.vditor-reset summary {\n cursor: pointer;\n}\n.vditor-reset summary:focus {\n outline: none;\n}\n.vditor-reset svg {\n height: auto;\n width: auto;\n stroke-width: initial;\n}\n.vditor-reset p:last-child,\n.vditor-reset blockquote:last-child,\n.vditor-reset pre:last-child,\n.vditor-reset ul:last-child,\n.vditor-reset ol:last-child,\n.vditor-reset hr:last-child {\n margin-bottom: 0;\n}\n.vditor-comment {\n border-bottom: 2px solid #f8e6ab;\n}\n.vditor-comment--focus,\n.vditor-comment--hover {\n background-color: #faf1d1;\n border-bottom: 2px solid #ffc60a;\n}\n.vditor-comment--focus .vditor-comment,\n.vditor-comment--hover .vditor-comment {\n border-bottom: 2px solid #ffc60a;\n}\n.vditor-task {\n list-style: none !important;\n word-break: break-all;\n}\n.vditor-task input {\n margin: 0 0.2em 0.25em -1.6em;\n font-size: 12px;\n vertical-align: middle;\n}\n.vditor-copy {\n position: relative;\n display: none;\n z-index: 1;\n}\n.vditor-copy textarea {\n position: absolute;\n left: -100000px;\n height: 10px;\n}\n.vditor-copy span {\n cursor: pointer;\n position: absolute;\n right: 15px;\n top: 0.5em;\n}\n.vditor-copy svg {\n color: #586069;\n height: 14px;\n width: 14px !important;\n display: block;\n fill: currentColor;\n}\n.vditor-linenumber {\n padding-left: 4em !important;\n position: relative;\n}\n.vditor-linenumber__rows {\n position: absolute;\n pointer-events: none;\n top: 1em;\n left: 0;\n width: 3em;\n /* works for line-numbers below 1000 lines */\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n counter-reset: linenumber;\n}\n.vditor-linenumber__rows > span {\n pointer-events: none;\n display: block;\n}\n.vditor-linenumber__rows > span::before {\n counter-increment: linenumber;\n content: counter(linenumber);\n color: rgba(158, 150, 150, 0.38);\n display: block;\n padding-right: 1em;\n text-align: right;\n}\n.vditor-speech {\n position: absolute;\n display: none;\n background-color: #f6f8fa;\n border: 1px solid #d1d5da;\n border-radius: 3px;\n padding: 3px;\n cursor: pointer;\n color: #586069;\n}\n.vditor-speech:hover,\n.vditor-speech--current {\n color: #4285f4;\n}\n.vditor-speech svg {\n height: 14px;\n width: 14px;\n fill: currentColor;\n display: block;\n stroke-width: 0;\n stroke: currentColor;\n}\n.vditor-anchor {\n margin-left: 5px;\n}\n.vditor-anchor--left {\n float: left;\n padding-right: 4px;\n margin-left: -20px;\n}\n.vditor-anchor svg {\n visibility: hidden;\n}\n.vditor-anchor:hover svg {\n visibility: visible;\n}\n.vditor-anchor:focus {\n outline: none;\n}\n.vditor-linkcard {\n margin: 31px auto 16px;\n transition: all 0.15s ease-in-out;\n cursor: pointer;\n max-width: 768px;\n padding: 0 10px;\n}\n.vditor-linkcard a {\n border-radius: 3px;\n background-color: #f6f8fa;\n overflow: hidden;\n max-height: 250px;\n display: flex;\n text-decoration: none;\n flex-wrap: wrap-reverse;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n}\n.vditor-linkcard a:hover {\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.13), 0 3px 6px rgba(0, 0, 0, 0.26);\n text-decoration: none;\n}\n.vditor-linkcard a:visited .vditor-linkcard__abstract {\n color: rgba(88, 96, 105, 0.36);\n}\n.vditor-linkcard__info {\n padding: 10px;\n min-width: 200px;\n box-sizing: border-box;\n flex: 1;\n}\n.vditor-linkcard__title {\n font-size: 14px;\n font-weight: 400;\n color: #24292e;\n display: flex;\n align-items: center;\n}\n.vditor-linkcard__title img {\n cursor: pointer;\n height: 20px;\n width: 20px;\n border-radius: 3px;\n flex-shrink: 0;\n margin-right: 5px;\n}\n.vditor-linkcard__abstract {\n word-wrap: break-word;\n word-break: break-all;\n -webkit-line-clamp: 2;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n font-size: 13px;\n color: #586069;\n margin: 5px 0;\n}\n.vditor-linkcard__site {\n font-size: 12px;\n color: #4285f4;\n}\n.vditor-linkcard__image {\n background-size: cover;\n background-repeat: no-repeat;\n background-position: center center;\n max-width: 250px;\n min-width: 126px;\n cursor: pointer;\n background-color: rgba(88, 96, 105, 0.36);\n}\n.vditor-footnotes__goto-ref {\n text-decoration: none;\n}\n.vditor-toc {\n margin-bottom: 16px;\n -webkit-user-select: text;\n -moz-user-select: text;\n user-select: text;\n color: #4285f4;\n}\n.vditor-toc .vditor-outline__action {\n display: none;\n}\n.vditor-toc ul {\n list-style: none !important;\n padding-left: 1em;\n}\n.vditor-toc > ul {\n padding-left: 0;\n}\n.vditor-toc span {\n cursor: pointer;\n}\n.vditor-toc li > span > svg {\n width: 0;\n height: 0;\n}\n.vditor-outline {\n width: 250px;\n border-right: 1px solid var(--border-color);\n background-color: var(--panel-background-color);\n display: none;\n overflow: auto;\n}\n.vditor-outline--right {\n border-right: 0;\n border-left: 1px solid var(--border-color);\n}\n.vditor-outline::-webkit-scrollbar {\n display: none;\n}\n.vditor-outline ul {\n list-style: none !important;\n padding-left: 1em;\n margin: 0;\n}\n.vditor-outline__content > ul {\n padding-left: 0;\n}\n.vditor-outline li > span {\n display: flex;\n align-items: center;\n padding: 5px 10px;\n cursor: pointer;\n color: var(--textarea-text-color);\n}\n.vditor-outline li > span > svg {\n height: 10px;\n width: 10px;\n flex-shrink: 0;\n}\n.vditor-outline li > span:hover {\n color: var(--toolbar-icon-hover-color);\n}\n.vditor-outline li > span > span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.vditor-outline__title {\n border-bottom: 1px dashed var(--border-color);\n padding: 5px 10px;\n color: var(--toolbar-icon-color);\n font-size: 12px;\n}\n.vditor-outline__action {\n transition: all 0.15s ease-in-out;\n fill: currentColor;\n margin-right: 5px;\n flex-shrink: 0;\n}\n.vditor-outline__action--close {\n transform: rotate(-90deg);\n}\n.vditor-reset .callout,\n.vditor-wysiwyg blockquote.callout,\n.vditor-ir blockquote.callout {\n --callout-color: var(--callout-note-color, #0969da);\n --callout-background-color: var(--callout-note-background-color, rgba(9, 105, 218, 0.08));\n position: relative;\n margin: 0 0 16px;\n padding: 0.75em 1em;\n color: inherit;\n background-color: var(--callout-background-color);\n border: 0;\n border-left: 0.25em solid var(--callout-color);\n}\n.vditor-reset .callout[data-subtype=\"TIP\"],\n.vditor-wysiwyg blockquote.callout[data-subtype=\"TIP\"],\n.vditor-ir blockquote.callout[data-subtype=\"TIP\"] {\n --callout-color: var(--callout-tip-color, #1a7f37);\n --callout-background-color: var(--callout-tip-background-color, rgba(26, 127, 55, 0.08));\n}\n.vditor-reset .callout[data-subtype=\"IMPORTANT\"],\n.vditor-wysiwyg blockquote.callout[data-subtype=\"IMPORTANT\"],\n.vditor-ir blockquote.callout[data-subtype=\"IMPORTANT\"] {\n --callout-color: var(--callout-important-color, #8250df);\n --callout-background-color: var(--callout-important-background-color, rgba(130, 80, 223, 0.08));\n}\n.vditor-reset .callout[data-subtype=\"WARNING\"],\n.vditor-wysiwyg blockquote.callout[data-subtype=\"WARNING\"],\n.vditor-ir blockquote.callout[data-subtype=\"WARNING\"] {\n --callout-color: var(--callout-warning-color, #9a6700);\n --callout-background-color: var(--callout-warning-background-color, rgba(154, 103, 0, 0.08));\n}\n.vditor-reset .callout[data-subtype=\"CAUTION\"],\n.vditor-wysiwyg blockquote.callout[data-subtype=\"CAUTION\"],\n.vditor-ir blockquote.callout[data-subtype=\"CAUTION\"] {\n --callout-color: var(--callout-caution-color, #cf222e);\n --callout-background-color: var(--callout-caution-background-color, rgba(207, 34, 46, 0.08));\n}\n.vditor-reset .callout > .callout-info,\n.vditor-wysiwyg blockquote.callout > .callout-info,\n.vditor-ir blockquote.callout > .callout-info {\n display: flex;\n align-items: center;\n min-height: 1.5em;\n margin: 0 0 0.5em;\n color: var(--callout-color);\n font-weight: 600;\n}\n.vditor-reset .callout > .callout-info .callout-icon,\n.vditor-wysiwyg blockquote.callout > .callout-info .callout-icon,\n.vditor-ir blockquote.callout > .callout-info .callout-icon {\n display: inline-flex;\n align-items: center;\n margin-right: 0.35em;\n}\n.vditor-reset .callout > .callout-info .callout-title,\n.vditor-wysiwyg blockquote.callout > .callout-info .callout-title,\n.vditor-ir blockquote.callout > .callout-info .callout-title {\n min-width: 1px;\n}\n.vditor-reset .callout > .callout-info .callout-img,\n.vditor-wysiwyg blockquote.callout > .callout-info .callout-img,\n.vditor-ir blockquote.callout > .callout-info .callout-img,\n.vditor-reset .callout > .callout-info > .callout-img,\n.vditor-wysiwyg blockquote.callout > .callout-info > .callout-img,\n.vditor-ir blockquote.callout > .callout-info > .callout-img {\n width: 1.2em;\n height: 1.2em;\n margin-right: 0.35em;\n -o-object-fit: contain;\n object-fit: contain;\n}\n.vditor-reset .callout > .callout-content > :last-child,\n.vditor-wysiwyg blockquote.callout > .callout-content > :last-child,\n.vditor-ir blockquote.callout > .callout-content > :last-child,\n.vditor-reset .callout > :last-child,\n.vditor-wysiwyg blockquote.callout > :last-child,\n.vditor-ir blockquote.callout > :last-child {\n margin-bottom: 0;\n}\n.vditor-wysiwyg__callout-marker {\n display: none;\n}\n.vditor-wysiwyg {\n box-sizing: border-box;\n flex: 1;\n position: relative;\n width: 100%;\n min-width: 1px;\n}\n.vditor-wysiwyg pre.vditor-reset {\n background-color: var(--panel-background-color);\n margin: 0;\n white-space: pre-wrap;\n height: 100%;\n box-sizing: border-box;\n}\n.vditor-wysiwyg pre.vditor-reset[contenteditable=\"false\"] {\n opacity: 0.3;\n cursor: not-allowed;\n}\n.vditor-wysiwyg pre.vditor-reset:empty::before {\n content: attr(placeholder);\n color: var(--second-color);\n}\n.vditor-wysiwyg pre.vditor-reset:focus {\n outline: none;\n background-color: var(--textarea-background-color);\n}\n.vditor-wysiwyg pre.vditor-reset:after {\n content: \"\";\n height: var(--editor-bottom);\n display: block;\n}\n.vditor-wysiwyg blockquote:empty::before,\n.vditor-wysiwyg pre > code:empty::before,\n.vditor-wysiwyg p:empty::before,\n.vditor-wysiwyg h1:empty::after,\n.vditor-wysiwyg h2:empty::after,\n.vditor-wysiwyg h3:empty::after,\n.vditor-wysiwyg h4:empty::after,\n.vditor-wysiwyg h5:empty::after,\n.vditor-wysiwyg h6:empty::after {\n content: ' ';\n}\n.vditor-wysiwyg code[data-marker=\"`\"] {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n.vditor-wysiwyg__block pre:first-child {\n margin-bottom: -1em;\n}\n.vditor-wysiwyg__block pre:first-child code {\n color: var(--textarea-text-color);\n height: auto;\n text-align: left;\n}\n.vditor-wysiwyg__block pre:last-child {\n margin-bottom: 1em;\n}\n.vditor-wysiwyg__preview {\n cursor: pointer;\n white-space: initial;\n min-height: 27px;\n}\n.vditor-wysiwyg > .vditor-reset > h1:before,\n.vditor-wysiwyg > .vditor-reset > h2:before,\n.vditor-wysiwyg > .vditor-reset > h3:before,\n.vditor-wysiwyg > .vditor-reset > h4:before,\n.vditor-wysiwyg > .vditor-reset > h5:before,\n.vditor-wysiwyg > .vditor-reset > h6:before,\n.vditor-wysiwyg div.vditor-wysiwyg__block:before,\n.vditor-wysiwyg div[data-type=\"link-ref-defs-block\"]:before,\n.vditor-wysiwyg div[data-type=\"footnotes-block\"]:before,\n.vditor-wysiwyg .vditor-toc:before {\n float: left;\n padding-right: 4px;\n margin-left: -29px;\n content: 'H1';\n font-size: 0.85rem;\n font-weight: normal;\n color: var(--second-color);\n}\n.vditor-wysiwyg > .vditor-reset > h2:before {\n content: 'H2';\n}\n.vditor-wysiwyg > .vditor-reset > h3:before {\n content: 'H3';\n}\n.vditor-wysiwyg > .vditor-reset > h4:before {\n content: 'H4';\n}\n.vditor-wysiwyg > .vditor-reset > h5:before {\n content: 'H5';\n}\n.vditor-wysiwyg > .vditor-reset > h6:before {\n content: 'H6';\n}\n.vditor-wysiwyg div[data-type=\"link-ref-defs-block\"]:before {\n content: '\"A\"';\n}\n.vditor-wysiwyg div[data-type=\"footnotes-block\"]:before {\n content: '^F';\n}\n.vditor-wysiwyg div.vditor-wysiwyg__block:before {\n content: \"</>\";\n}\n.vditor-wysiwyg div.vditor-wysiwyg__block[data-type=\"yaml-front-matter\"]:before {\n content: \"F\";\n}\n.vditor-wysiwyg div.vditor-wysiwyg__block[data-type=\"math-block\"]:before {\n content: \"$$\";\n}\n.vditor-wysiwyg .vditor-toc:before {\n content: \"ToC\";\n}\n.vditor-wysiwyg hr {\n display: inline-block;\n margin: 12px 0;\n width: 100%;\n}\n.vditor-wysiwyg details {\n white-space: initial;\n}\n.vditor-wysiwyg a {\n cursor: pointer;\n}\n.vditor-wysiwyg span[data-type=\"backslash\"] > span {\n display: none;\n color: var(--second-color);\n}\n.vditor-wysiwyg span[data-type=\"link-ref\"],\n.vditor-wysiwyg sup[data-type=\"footnotes-ref\"] {\n color: #4285f4;\n}\n.vditor-wysiwyg span[data-type=\"toc-h\"] {\n color: #4285f4;\n text-decoration: underline;\n}\n.vditor-wysiwyg div[data-type=\"footnotes-block\"] {\n border-top: 2px solid var(--heading-border-color);\n padding-top: 24px;\n margin-top: 24px;\n}\n.vditor-wysiwyg div[data-type=\"link-ref-defs-block\"] {\n color: var(--blockquote-color);\n}\n.vditor-wysiwyg__mobile-toolbar {\n display: none;\n}\n@media screen and (max-width: 520px) {\n .vditor-wysiwyg__mobile-toolbar {\n display: block;\n float: left;\n height: 21px;\n position: relative;\n width: 23px;\n }\n .vditor-wysiwyg__mobile-actions {\n box-sizing: border-box;\n flex-wrap: wrap;\n left: 0;\n padding: 5px;\n top: 26px;\n white-space: normal;\n }\n .vditor-wysiwyg__mobile-actions.vditor-panel--left {\n left: auto;\n right: 0;\n }\n .vditor-wysiwyg__mobile-actions--open {\n display: flex;\n }\n .vditor-wysiwyg h1:before,\n .vditor-wysiwyg h2:before,\n .vditor-wysiwyg h3:before,\n .vditor-wysiwyg h4:before,\n .vditor-wysiwyg h5:before,\n .vditor-wysiwyg h6:before,\n .vditor-wysiwyg div.vditor-wysiwyg__block:before,\n .vditor-wysiwyg div[data-type=\"link-ref-defs-block\"]:before,\n .vditor-wysiwyg div[data-type=\"footnotes-block\"]:before,\n .vditor-wysiwyg .vditor-toc:before {\n content: none;\n }\n}\n.vditor-ir {\n box-sizing: border-box;\n flex: 1;\n min-width: 1px;\n position: relative;\n width: 100%;\n}\n.vditor-ir__node[data-type=\"code-block\"]:before,\n.vditor-ir__node[data-type=\"code-block\"]:after,\n.vditor-ir__node[data-type=\"yaml-front-matter\"]:before,\n.vditor-ir__node[data-type=\"yaml-front-matter\"]:after,\n.vditor-ir__node[data-type=\"math-block\"]:before,\n.vditor-ir__node[data-type=\"math-block\"]:after {\n content: ' ';\n color: var(--second-color);\n}\n.vditor-ir__node:not(.vditor-ir__node--expand) .vditor-ir__marker {\n padding: 0 !important;\n}\n.vditor-ir__node:not(.vditor-ir__node--expand)[data-type=\"a\"] {\n cursor: pointer;\n}\n.vditor-ir__node[data-type=\"link-ref\"],\n.vditor-ir__node[data-type=\"footnotes-ref\"] {\n color: #4285f4;\n}\n.vditor-ir__node[data-type=\"html-block\"] {\n margin-bottom: 1em;\n}\n.vditor-ir__node .vditor-ir__marker {\n width: 0;\n overflow: hidden;\n display: inline-block;\n height: 0;\n transition: all 0.15s ease-in-out;\n}\n.vditor-ir__node--hidden .vditor-ir__marker {\n visibility: hidden;\n}\n.vditor-ir__node--expand .vditor-ir__marker {\n color: var(--second-color);\n display: inline;\n height: auto;\n width: auto;\n}\n.vditor-ir__node--expand .vditor-ir__marker--hide {\n display: none;\n}\n.vditor-ir__node--expand .vditor-ir__marker--heading {\n color: var(--ir-heading-color);\n}\n.vditor-ir__node--expand .vditor-ir__marker--bi {\n color: var(--ir-bi-color);\n}\n.vditor-ir__node--expand .vditor-ir__marker--link {\n color: var(--ir-link-color);\n}\n.vditor-ir__node--expand .vditor-ir__marker--title {\n color: var(--ir-title-color);\n}\n.vditor-ir__node--expand .vditor-ir__marker--bracket {\n color: var(--ir-bracket-color);\n text-decoration: underline;\n}\n.vditor-ir__node--expand .vditor-ir__marker--paren {\n color: var(--ir-paren-color);\n}\n.vditor-ir__node--expand .vditor-ir__marker--info {\n color: var(--ir-heading-color);\n}\n.vditor-ir__node--expand .vditor-ir__marker--pre code {\n color: var(--textarea-text-color);\n height: auto;\n text-align: left;\n}\n.vditor-ir__node--expand[data-type=\"code-block\"]:before,\n.vditor-ir__node--expand[data-type=\"code-block\"]:after {\n content: '```';\n}\n.vditor-ir__node--expand[data-type=\"yaml-front-matter\"]:before,\n.vditor-ir__node--expand[data-type=\"yaml-front-matter\"]:after {\n content: '---';\n}\n.vditor-ir__node--expand[data-type=\"math-block\"]:before,\n.vditor-ir__node--expand[data-type=\"math-block\"]:after {\n content: '$$';\n}\n.vditor-ir__node span[data-type=\"code-block-open-marker\"],\n.vditor-ir__node span[data-type=\"code-block-close-marker\"],\n.vditor-ir__node span[data-type=\"yaml-front-matter-open-marker\"],\n.vditor-ir__node span[data-type=\"yaml-front-matter-close-marker\"],\n.vditor-ir__node span[data-type=\"math-block-open-marker\"],\n.vditor-ir__node span[data-type=\"math-block-close-marker\"] {\n display: none;\n}\n.vditor-ir__preview {\n cursor: pointer;\n white-space: initial;\n min-height: 27px;\n}\n.vditor-ir__link {\n color: var(--ir-bracket-color);\n text-decoration: underline;\n}\n.vditor-ir pre.vditor-reset {\n background-color: var(--panel-background-color);\n margin: 0;\n white-space: pre-wrap;\n height: 100%;\n box-sizing: border-box;\n}\n.vditor-ir pre.vditor-reset[contenteditable=\"false\"] {\n opacity: 0.3;\n cursor: not-allowed;\n}\n.vditor-ir pre.vditor-reset:empty::before {\n content: attr(placeholder);\n color: var(--second-color);\n}\n.vditor-ir pre.vditor-reset:focus {\n outline: none;\n background-color: var(--textarea-background-color);\n}\n.vditor-ir pre.vditor-reset:after {\n content: \"\";\n height: var(--editor-bottom);\n display: block;\n}\n.vditor-ir pre.vditor-reset pre {\n margin: 0;\n}\n.vditor-ir hr {\n display: inline-block;\n margin: 12px 0;\n width: 100%;\n}\n.vditor-ir blockquote:empty::before,\n.vditor-ir pre > code:empty::before,\n.vditor-ir p:empty::before,\n.vditor-ir h1:empty::after,\n.vditor-ir h2:empty::after,\n.vditor-ir h3:empty::after,\n.vditor-ir h4:empty::after,\n.vditor-ir h5:empty::after,\n.vditor-ir h6:empty::after {\n content: ' ';\n}\n.vditor-ir .vditor-reset > h1:before,\n.vditor-ir .vditor-reset > h2:before,\n.vditor-ir .vditor-reset > h3:before,\n.vditor-ir .vditor-reset > h4:before,\n.vditor-ir .vditor-reset > h5:before,\n.vditor-ir .vditor-reset > h6:before,\n.vditor-ir div[data-type=\"link-ref-defs-block\"]:before,\n.vditor-ir div[data-type=\"footnotes-block\"]:before,\n.vditor-ir .vditor-toc:before {\n float: left;\n padding-right: 4px;\n margin-left: -29px;\n content: 'H1';\n font-size: 0.85rem;\n font-weight: normal;\n color: var(--second-color);\n}\n.vditor-ir .vditor-reset > h2:before {\n content: 'H2';\n}\n.vditor-ir .vditor-reset > h3:before {\n content: 'H3';\n}\n.vditor-ir .vditor-reset > h4:before {\n content: 'H4';\n}\n.vditor-ir .vditor-reset > h5:before {\n content: 'H5';\n}\n.vditor-ir .vditor-reset > h6:before {\n content: 'H6';\n}\n.vditor-ir div[data-type=\"link-ref-defs-block\"] {\n color: var(--blockquote-color);\n}\n.vditor-ir div[data-type=\"link-ref-defs-block\"]:before {\n content: '\"A\"';\n}\n.vditor-ir div[data-type=\"footnotes-block\"] {\n border-top: 2px solid var(--heading-border-color);\n padding-top: 24px;\n margin-top: 24px;\n}\n.vditor-ir div[data-type=\"footnotes-block\"]:before {\n content: '^F';\n}\n.vditor-ir div[data-type=\"footnotes-block\"] > div[data-type=\"footnotes-def\"] > ul,\n.vditor-ir div[data-type=\"footnotes-block\"] > div[data-type=\"footnotes-def\"] > ol,\n.vditor-ir div[data-type=\"footnotes-block\"] > div[data-type=\"footnotes-def\"] > p,\n.vditor-ir div[data-type=\"footnotes-block\"] > div[data-type=\"footnotes-def\"] > blockquote,\n.vditor-ir div[data-type=\"footnotes-block\"] > div[data-type=\"footnotes-def\"] > pre,\n.vditor-ir div[data-type=\"footnotes-block\"] > div[data-type=\"footnotes-def\"] > table,\n.vditor-ir div[data-type=\"footnotes-block\"] > div[data-type=\"footnotes-def\"] > hr {\n margin-left: 8px;\n}\n.vditor-ir .vditor-toc:before {\n content: \"ToC\";\n}\n.vditor-ir .vditor-toc span[data-type=\"toc-h\"] {\n color: #4285f4;\n text-decoration: underline;\n}\n@media screen and (max-width: 520px) {\n .vditor-ir h1:before,\n .vditor-ir h2:before,\n .vditor-ir h3:before,\n .vditor-ir h4:before,\n .vditor-ir h5:before,\n .vditor-ir h6:before,\n .vditor-ir div[data-type=\"link-ref-defs-block\"]:before,\n .vditor-ir div[data-type=\"footnotes-block\"]:before,\n .vditor-ir .vditor-toc:before {\n content: none;\n }\n}\n.vditor-sv {\n font-family: \"Helvetica Neue\", \"Luxi Sans\", \"DejaVu Sans\", \"Hiragino Sans GB\", \"Microsoft Yahei\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Segoe UI Symbol\", \"Android Emoji\", \"EmojiSymbols\";\n margin: 0 1px 0 0;\n overflow: auto;\n width: 100%;\n flex: 1;\n min-width: 1px;\n border: 0;\n resize: none;\n padding: 10px 9px 10px 10px;\n box-sizing: border-box;\n background-color: var(--panel-background-color);\n outline: 0 none;\n font-size: 16px;\n line-height: 22px;\n color: var(--textarea-text-color);\n border-radius: 0 0 3px 3px;\n font-variant-ligatures: no-common-ligatures;\n white-space: pre-wrap;\n word-break: break-word;\n word-wrap: break-word;\n}\n.vditor-sv:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n.vditor-sv::-moz-placeholder {\n color: var(--second-color);\n}\n.vditor-sv::placeholder {\n color: var(--second-color);\n}\n.vditor-sv:focus {\n background-color: var(--textarea-background-color);\n}\n\n";
|
|
2
|
+
if (!document.querySelector('style[data-ojm-css="vditor/dist/index.css"]')) {
|
|
3
|
+
const __s = document.createElement("style");
|
|
4
|
+
__s.setAttribute("data-ojm-css", "vditor/dist/index.css");
|
|
5
|
+
__s.textContent = __css;
|
|
6
|
+
document.head.appendChild(__s);
|
|
7
|
+
}
|