diff --git a/404.html b/404.html index a3e9f295..f23b779f 100644 --- a/404.html +++ b/404.html @@ -6,15 +6,15 @@ 404 | ZiuChen - + -
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

- - +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/【2023】青训营 - 前端练习题汇总解析.html b/article/【2023】青训营 - 前端练习题汇总解析.html index 598feaa3..f33d7609 100644 --- a/article/【2023】青训营 - 前端练习题汇总解析.html +++ b/article/【2023】青训营 - 前端练习题汇总解析.html @@ -6,14 +6,14 @@ 【2023】青训营 - 前端练习题汇总解析 | ZiuChen - - + + -
Skip to content
On this page

【2023】青训营 - 前端练习题汇总解析

汇总了青训营官方账号每天发布的练习题,并且给出了答案、做了简单解析与知识扩充,有不足之处欢迎一起交流学习。

每天的选择题不同,而编程题是一样的,直接去Leetcode刷题即可。

选择题

DAY 1

题目描述

text
选择题 1:  
+    
Skip to content
On this page

【2023】青训营 - 前端练习题汇总解析

汇总了青训营官方账号每天发布的练习题,并且给出了答案、做了简单解析与知识扩充,有不足之处欢迎一起交流学习。

每天的选择题不同,而编程题是一样的,直接去Leetcode刷题即可。

选择题

DAY 1

题目描述

text
选择题 1:  
 下列哪些是 HTML5 的新特性?  
 A. 语义标签  
 B. Canvas 绘图  
@@ -306,9 +306,9 @@
     return true
   }
 }
-

Released under the MIT License.

- - +

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/一文读懂事件冒泡与事件捕获.html b/article/一文读懂事件冒泡与事件捕获.html index e78dea7e..2022ccf6 100644 --- a/article/一文读懂事件冒泡与事件捕获.html +++ b/article/一文读懂事件冒泡与事件捕获.html @@ -6,14 +6,14 @@ 一文读懂事件冒泡与事件捕获 | ZiuChen - - + + -
Skip to content
On this page

一文读懂事件冒泡与事件捕获

💡 从例子入手

这是一个简单的 Demo,点击的 Display video 按钮后,将视频展示出来。

其中的视频 <video> 标签被 <div> 包裹,<div><video> 上都绑定了自己的 click 事件。

代码片段

我们的预期是:点击 <video> 时播放视频,点击 <div> 时隐藏视频,然而实际上你会发现,点击视频后,不仅视频虽然正常播放,但同时也被隐藏了。

点击子元素,父元素的事件也被触发,导致这种现象的原因正是:浏览器的事件冒泡机制

🤔 什么是事件冒泡机制?事件捕获又是什么?

现代浏览器提供了两种事件处理阶段:捕获阶段与冒泡阶段

bubbling-capturing.png

在捕获阶段:

  • 浏览器检查元素的最外层祖先 <html> ,是否在捕获阶段中注册了一个 onclick 事件处理程序,如果是,则运行它。
  • 然后,它移动到 <html> 中单击元素的下一个祖先元素,执行相同的操作,然后是单击元素再下一个祖先元素,依此类推,直到到达实际点击的元素。

在冒泡阶段,与上述顺序相反:

  • 浏览器检查实际点击的元素是否在冒泡阶段中注册了一个 onclick 事件处理程序,如果是,则运行它
  • 然后它移动到下一个直接的祖先元素,并做同样的事情,然后是下一个,等等,直到它到达 <html> 元素。

当一个事件被触发时,浏览器先运行捕获阶段,后运行冒泡阶段,并且在默认情况下,所有事件处理程序都在冒泡阶段进行注册

针对上面提到的问题,我们可以知道:当 <video> 点击事件触发后,虽然我们没有主动触发 <div> 上绑定的点击事件,但由于冒泡机制,点击事件冒泡到了 <div> 上,并触发了绑定在其上的监听回调函数,将 <video> 标签隐藏。

📌 用例子验证结论

下面是一个用于验证上述结论的Demo:

页面中包括由外向内的三个类名不同的div标签: div1 div2 div3,并为他们在捕获阶段/冒泡阶段分别绑定了不同的事件函数 clickdblclick

代码片段

当点击最内部的 div3 后,浏览器控制台输出:

> 捕获 click div1
+    
Skip to content
On this page

一文读懂事件冒泡与事件捕获

💡 从例子入手

这是一个简单的 Demo,点击的 Display video 按钮后,将视频展示出来。

其中的视频 <video> 标签被 <div> 包裹,<div><video> 上都绑定了自己的 click 事件。

代码片段

我们的预期是:点击 <video> 时播放视频,点击 <div> 时隐藏视频,然而实际上你会发现,点击视频后,不仅视频虽然正常播放,但同时也被隐藏了。

点击子元素,父元素的事件也被触发,导致这种现象的原因正是:浏览器的事件冒泡机制

🤔 什么是事件冒泡机制?事件捕获又是什么?

现代浏览器提供了两种事件处理阶段:捕获阶段与冒泡阶段

bubbling-capturing.png

在捕获阶段:

  • 浏览器检查元素的最外层祖先 <html> ,是否在捕获阶段中注册了一个 onclick 事件处理程序,如果是,则运行它。
  • 然后,它移动到 <html> 中单击元素的下一个祖先元素,执行相同的操作,然后是单击元素再下一个祖先元素,依此类推,直到到达实际点击的元素。

在冒泡阶段,与上述顺序相反:

  • 浏览器检查实际点击的元素是否在冒泡阶段中注册了一个 onclick 事件处理程序,如果是,则运行它
  • 然后它移动到下一个直接的祖先元素,并做同样的事情,然后是下一个,等等,直到它到达 <html> 元素。

当一个事件被触发时,浏览器先运行捕获阶段,后运行冒泡阶段,并且在默认情况下,所有事件处理程序都在冒泡阶段进行注册

针对上面提到的问题,我们可以知道:当 <video> 点击事件触发后,虽然我们没有主动触发 <div> 上绑定的点击事件,但由于冒泡机制,点击事件冒泡到了 <div> 上,并触发了绑定在其上的监听回调函数,将 <video> 标签隐藏。

📌 用例子验证结论

下面是一个用于验证上述结论的Demo:

页面中包括由外向内的三个类名不同的div标签: div1 div2 div3,并为他们在捕获阶段/冒泡阶段分别绑定了不同的事件函数 clickdblclick

代码片段

当点击最内部的 div3 后,浏览器控制台输出:

> 捕获 click div1
 > 捕获 click div2
 > 捕获 click div3
 > 冒泡 click div3
@@ -57,9 +57,9 @@
   // some code ...
   e.preventDefault()
 });
-

相关链接

事件冒泡及捕获

Released under the MIT License.

- - +

相关链接

事件冒泡及捕获

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/一文读懂伪类与伪元素.html b/article/一文读懂伪类与伪元素.html index e6c81f9b..5c2752a9 100644 --- a/article/一文读懂伪类与伪元素.html +++ b/article/一文读懂伪类与伪元素.html @@ -6,14 +6,14 @@ 一文读懂伪类与伪元素 | ZiuChen - - + + -
Skip to content
On this page

一文读懂伪类与伪元素

🔰 什么是伪类?

伪类是添加到选择器的 关键字 ,指定要选择的元素的特殊状态。

典型的伪类关键字

在大多数情况下,伪类都与基础选择器搭配使用,下述是伪类在一些典型场景下的应用。

:hover

指针在 <button> 上悬停,但没有激活它时,按钮颜色变为蓝色

css
button:hover {
+    
Skip to content
On this page

一文读懂伪类与伪元素

🔰 什么是伪类?

伪类是添加到选择器的 关键字 ,指定要选择的元素的特殊状态。

典型的伪类关键字

在大多数情况下,伪类都与基础选择器搭配使用,下述是伪类在一些典型场景下的应用。

:hover

指针在 <button> 上悬停,但没有激活它时,按钮颜色变为蓝色

css
button:hover {
   color: blue;
 }
 

注意: 在触摸屏上 :hover 基本不可用。不同的浏览器上:hover 伪类表现不同。网页开发人员不要让任何内容只能通过悬停才能展示出来,不然这些内容对于触摸屏使用者来说是很难或者说不可能看到。

:not

:not() 用来匹配不符合一组选择器的元素。由于它的作用是防止特定的元素被选中,它也被称为反选伪类negation pseudo-class)。

将所有不是<p>的元素颜色改为蓝色:

css
body:not(p) {
@@ -79,9 +79,9 @@
 .father {
   width: 100px;
 }
-

相关链接

代码片段

CSS选择器

Released under the MIT License.

- - +

相关链接

代码片段

CSS选择器

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/一文读懂函数中this指向问题.html b/article/一文读懂函数中this指向问题.html index aa57e70c..f4afaf0c 100644 --- a/article/一文读懂函数中this指向问题.html +++ b/article/一文读懂函数中this指向问题.html @@ -6,14 +6,14 @@ 一文读懂函数中this指向问题 | ZiuChen - - + + -
Skip to content
On this page

一文读懂函数中this指向问题

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

// 定义一个函数
+    
Skip to content
On this page

一文读懂函数中this指向问题

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

// 定义一个函数
 function foo() {
   console.log(this)
 }
@@ -166,9 +166,9 @@
 person1.foo4()() // 隐式绑定: person1
 person1.foo4.call(person2)() // 显式绑定: person2
 person1.foo4().call(person2) // 隐式绑定: person1
-

Released under the MIT License.

- - +

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/从0实现一个年度报告.html b/article/从0实现一个年度报告.html index 437fe9af..7af770ba 100644 --- a/article/从0实现一个年度报告.html +++ b/article/从0实现一个年度报告.html @@ -6,14 +6,14 @@ 从0实现一个年度报告 | ZiuChen - - + + -
Skip to content
On this page

从0实现一个年度报告

每到年底各大应用都会推出自己的年终总结报告,统计出用户一年来在应用内的行为展示给用户,供用户记录、分享。

今年掘金社区推出了自己的2022掘友年度报告,这次我们仿照这个报告,从0开始自己实现一个年终总结报告页面

实现难点

1. 数据模拟

一般情况下是根据用户UID,到后端去请求相关接口获得统计数据。

例如掘金的接口为https://api.juejin.cn/event_api/v1/annual/annual_summary?aid=xxxxxx

本次后端使用NodeJS实现了一个爬虫,可以将用户数据统计完成后导出JSON格式的数据,将此数据粘贴到前端页面的输入框即可生成自己的报告

2. 屏幕适配

可以观察到,在PC端和在手机端访问年度报告展示的效果是不一样的。

本次考虑使用媒体查询来实现这个功能:

  • 宽屏则展示背景,页面切换也使用背景中的上下切换按钮
  • 小屏则隐藏背景,让内容填满屏幕,页面切换通过滑动事件监听

3. 动画效果

动画分为文本与背景元素的动画

  • 背景元素的动画使用了SVG动画
    • 动画中不动的部分直接使用.png图片
    • 运动的部分使用SVG动画绘制,如克里克的眼睛、尾巴
  • 文本的动画使用了CSS Animation渐显的效果
    • 不同段落之间通过animation-delay属性,彼此相差1000ms

背景动画容器的四个位置:左上角 右下角 中间部分 中间(悬浮气泡)。不同位置的动画容器都采用绝对定位position: absolute;,辅以z-index实现层叠

囿于工期,本次的背景动画直接采用静态图片+CSS Animation实现上下浮动的效果

4. 音乐播放

通过Audio接口访问网络音乐链接,控制音乐相关功能

  • 进入页面开始播放
  • 离开页面暂停播放
  • 支持点击按钮切换播放状态

用户数据

用户数据内容

- 用户名
+    
Skip to content
On this page

从0实现一个年度报告

每到年底各大应用都会推出自己的年终总结报告,统计出用户一年来在应用内的行为展示给用户,供用户记录、分享。

今年掘金社区推出了自己的2022掘友年度报告,这次我们仿照这个报告,从0开始自己实现一个年终总结报告页面

实现难点

1. 数据模拟

一般情况下是根据用户UID,到后端去请求相关接口获得统计数据。

例如掘金的接口为https://api.juejin.cn/event_api/v1/annual/annual_summary?aid=xxxxxx

本次后端使用NodeJS实现了一个爬虫,可以将用户数据统计完成后导出JSON格式的数据,将此数据粘贴到前端页面的输入框即可生成自己的报告

2. 屏幕适配

可以观察到,在PC端和在手机端访问年度报告展示的效果是不一样的。

本次考虑使用媒体查询来实现这个功能:

  • 宽屏则展示背景,页面切换也使用背景中的上下切换按钮
  • 小屏则隐藏背景,让内容填满屏幕,页面切换通过滑动事件监听

3. 动画效果

动画分为文本与背景元素的动画

  • 背景元素的动画使用了SVG动画
    • 动画中不动的部分直接使用.png图片
    • 运动的部分使用SVG动画绘制,如克里克的眼睛、尾巴
  • 文本的动画使用了CSS Animation渐显的效果
    • 不同段落之间通过animation-delay属性,彼此相差1000ms

背景动画容器的四个位置:左上角 右下角 中间部分 中间(悬浮气泡)。不同位置的动画容器都采用绝对定位position: absolute;,辅以z-index实现层叠

囿于工期,本次的背景动画直接采用静态图片+CSS Animation实现上下浮动的效果

4. 音乐播放

通过Audio接口访问网络音乐链接,控制音乐相关功能

  • 进入页面开始播放
  • 离开页面暂停播放
  • 支持点击按钮切换播放状态

用户数据

用户数据内容

- 用户名
 - 注册时间 距今天数
 - 创作相关
     - 发布文章数
@@ -106,9 +106,9 @@
       nextPage()
     }
   })
-

代码打包

由于最后需要将项目放到码上掘金平台运行,所以需要考虑静态资源的加载问题

这里我使用到了Vite提供的类似file-loader的功能,可以将大小在指定阈值下的图片资源直接转为行内的DataURL,配置选项是config.build.assetsInlineLimit,这样所有的图片资源都不必考虑外部引入的问题,直接内嵌进代码。

技术介绍

主界面使用的是Vue3的SFC,主要逻辑都在单文件组件中完成。通过JSX语法编写不同页面的内容,这样更方便我们为每个节点添加不同的动画。

JSX编写的组件通过全局注册后,在SFC中通过<Component>动态加载。

图片资源方面,使用到了雪碧图,部署后可以降低客户端发起HTTP请求频次,提高性能

代码复用方面,样式代码都抽离为单个的xxxx.less文件,哪里用到了直接导入即可

使用到了Pinia状态管理库,将switching pageId audioStatus等全局状态放到其中管理非常方便,避免了provideinject的繁琐

功能介绍

  • 支持PC端/移动端展示不同样式
    • PC端左侧有控制栏 支持控制音乐播放 切换页面
    • 移动端右上角控制音乐 滑动切换页面
  • 页面之间切换有动态效果 文字逐行展示
  • 左上角、右下角会出现矢量动图

Demo展示

Demo(Vercel)

jcode

Released under the MIT License.

- - +

代码打包

由于最后需要将项目放到码上掘金平台运行,所以需要考虑静态资源的加载问题

这里我使用到了Vite提供的类似file-loader的功能,可以将大小在指定阈值下的图片资源直接转为行内的DataURL,配置选项是config.build.assetsInlineLimit,这样所有的图片资源都不必考虑外部引入的问题,直接内嵌进代码。

技术介绍

主界面使用的是Vue3的SFC,主要逻辑都在单文件组件中完成。通过JSX语法编写不同页面的内容,这样更方便我们为每个节点添加不同的动画。

JSX编写的组件通过全局注册后,在SFC中通过<Component>动态加载。

图片资源方面,使用到了雪碧图,部署后可以降低客户端发起HTTP请求频次,提高性能

代码复用方面,样式代码都抽离为单个的xxxx.less文件,哪里用到了直接导入即可

使用到了Pinia状态管理库,将switching pageId audioStatus等全局状态放到其中管理非常方便,避免了provideinject的繁琐

功能介绍

  • 支持PC端/移动端展示不同样式
    • PC端左侧有控制栏 支持控制音乐播放 切换页面
    • 移动端右上角控制音乐 滑动切换页面
  • 页面之间切换有动态效果 文字逐行展示
  • 左上角、右下角会出现矢量动图

Demo展示

Demo(Vercel)

jcode

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/彻底搞懂对象的数据属性描述符、存储属性描述符.html b/article/彻底搞懂对象的数据属性描述符、存储属性描述符.html index e6111f96..054dd87e 100644 --- a/article/彻底搞懂对象的数据属性描述符、存储属性描述符.html +++ b/article/彻底搞懂对象的数据属性描述符、存储属性描述符.html @@ -6,14 +6,14 @@ 彻底搞懂对象的数据属性描述符、存储属性描述符 | ZiuChen - - + + -
Skip to content
On this page

彻底搞懂对象的数据属性描述符、存储属性描述符

属性描述符

js
  let obj = {
+    
-    
-    
+

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/深入Vue3源码,看看Vue.use后究竟发生了什么?.html b/article/深入Vue3源码,看看Vue.use后究竟发生了什么?.html index 32f5b6ca..4dd51bc1 100644 --- a/article/深入Vue3源码,看看Vue.use后究竟发生了什么?.html +++ b/article/深入Vue3源码,看看Vue.use后究竟发生了什么?.html @@ -6,14 +6,14 @@ 深入Vue3源码,看看Vue.use后究竟发生了什么? | ZiuChen - - + + -
Skip to content
On this page

深入Vue3源码,看看Vue.use后究竟发生了什么?

从全局注册组件库入手

如果我们自定义了几个自定义组件,当我们想在.vue文件中使用它们时,需要手动import导入组件并在component中注册:

html
<script>
+    
Skip to content
On this page

深入Vue3源码,看看Vue.use后究竟发生了什么?

从全局注册组件库入手

如果我们自定义了几个自定义组件,当我们想在.vue文件中使用它们时,需要手动import导入组件并在component中注册:

html
<script>
 import CustomInput from '@/component/CustomInput.vue'
 
 export default {
@@ -119,9 +119,9 @@
 
 const app = createApp(App).use(registerElement)
 app.mount('#app')
-

当有新的需要使用的组件时,只需要到register-element.ts文件中引入一次即可。

参考阅读

Vue文档: App.use

Vue文档: Plugins

Released under the MIT License.

- - +

当有新的需要使用的组件时,只需要到register-element.ts文件中引入一次即可。

参考阅读

Vue文档: App.use

Vue文档: Plugins

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/深入理解Proxy与Reflect.html b/article/深入理解Proxy与Reflect.html index f17dc163..32e6d02d 100644 --- a/article/深入理解Proxy与Reflect.html +++ b/article/深入理解Proxy与Reflect.html @@ -6,14 +6,14 @@ 深入理解Proxy与Reflect | ZiuChen - - + + -
Skip to content
On this page

深入理解Proxy与Reflect

监听对象的操作

可以使用Proxy对象将原对象包裹,此后的操作都对proxy进行,每次getset被触发时都会自动执行相应代码

js
const obj = {
+    
-    
-    
+

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/深入理解浏览器缓存机制.html b/article/深入理解浏览器缓存机制.html index a291d715..044a36f1 100644 --- a/article/深入理解浏览器缓存机制.html +++ b/article/深入理解浏览器缓存机制.html @@ -6,14 +6,14 @@ 深入理解浏览器缓存机制 | ZiuChen - - + + -
Skip to content
On this page

深入理解浏览器缓存机制

浏览器有两种缓存规则:强制缓存与协商缓存

  1. 强制缓存:不会向服务器发送请求,直接从缓存中读取资源
  2. 协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源
  • 共同点:都是从客户端缓存中读取资源
  • 不同点:强制缓存不会发请求,协商缓存会发请求

强制缓存

什么是强制缓存

浏览器在服务器发起真正请求前,先检查浏览器缓存:

  • 如果命中缓存,且缓存未过期,那么直接使用缓存资源
  • 如果未命中缓存,或缓存已过期失效,那么向服务器发出请求

强制缓存的规则

服务器通过向响应头添加ExpiresCache-Control字段来标识强制缓存的状态,浏览器会将这两个信息缓存到本地,后续有相同请求时,优先到浏览器缓存中检查资源是否到期。

其中Cache-Control优先级比Expires高,即:二者同时存在时,浏览器以Cache-Control为标准,检查缓存资源是否过期

Expires与Cache-Control

Expires

Expires表示当前资源的失效时间,它的值是一个HTTP-日期时间戳,例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT

使用Expires存在一些弊端:

  • 代表的是绝对时间,如果浏览器和服务器的时间不同步,会导致缓存目标时间存在偏差
  • 如果服务端设置的日期格式不规范,那么等同于无缓存
  • ExpiresHTTP/1.0的字段,但是现在浏览器默认使用的是HTTP/1.1

在某些不支持HTTP1.1的环境下,Expires就会发挥用处

所以Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法

Cache-Control

如果在Cache-Control响应头设置了"max-age"或者"s-max-age"指令,那么Expires头会被忽略

设置Cache-Control的值有以下规则:

  • 不区分大小写,但建议使用小写
  • 多个指令以逗号分隔
  • 具有可选参数,可以用令牌或者带引号的字符串语法

常用的指令:

  • public:所有内容都将被缓存,即使是通常不可缓存的内容(如POST请求)。
  • private:所有内容只有客户端可以缓存,不能作为共享缓存(即代理服务器不能缓存它),这也是Cache-Control的默认取值
  • no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
  • no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存,即不使用任何缓存。
  • max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

举几个例子:

此次请求之后的600秒内,如果浏览器再次发起请求,那么直接使用缓存中的资源:

Cache-Control: max-age=600
+    
Skip to content
On this page

深入理解浏览器缓存机制

浏览器有两种缓存规则:强制缓存与协商缓存

  1. 强制缓存:不会向服务器发送请求,直接从缓存中读取资源
  2. 协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源
  • 共同点:都是从客户端缓存中读取资源
  • 不同点:强制缓存不会发请求,协商缓存会发请求

强制缓存

什么是强制缓存

浏览器在服务器发起真正请求前,先检查浏览器缓存:

  • 如果命中缓存,且缓存未过期,那么直接使用缓存资源
  • 如果未命中缓存,或缓存已过期失效,那么向服务器发出请求

强制缓存的规则

服务器通过向响应头添加ExpiresCache-Control字段来标识强制缓存的状态,浏览器会将这两个信息缓存到本地,后续有相同请求时,优先到浏览器缓存中检查资源是否到期。

其中Cache-Control优先级比Expires高,即:二者同时存在时,浏览器以Cache-Control为标准,检查缓存资源是否过期

Expires与Cache-Control

Expires

Expires表示当前资源的失效时间,它的值是一个HTTP-日期时间戳,例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT

使用Expires存在一些弊端:

  • 代表的是绝对时间,如果浏览器和服务器的时间不同步,会导致缓存目标时间存在偏差
  • 如果服务端设置的日期格式不规范,那么等同于无缓存
  • ExpiresHTTP/1.0的字段,但是现在浏览器默认使用的是HTTP/1.1

在某些不支持HTTP1.1的环境下,Expires就会发挥用处

所以Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法

Cache-Control

如果在Cache-Control响应头设置了"max-age"或者"s-max-age"指令,那么Expires头会被忽略

设置Cache-Control的值有以下规则:

  • 不区分大小写,但建议使用小写
  • 多个指令以逗号分隔
  • 具有可选参数,可以用令牌或者带引号的字符串语法

常用的指令:

  • public:所有内容都将被缓存,即使是通常不可缓存的内容(如POST请求)。
  • private:所有内容只有客户端可以缓存,不能作为共享缓存(即代理服务器不能缓存它),这也是Cache-Control的默认取值
  • no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
  • no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存,即不使用任何缓存。
  • max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

举几个例子:

此次请求之后的600秒内,如果浏览器再次发起请求,那么直接使用缓存中的资源:

Cache-Control: max-age=600
 

浏览器可以缓存资源,但每次使用缓存资源前都必须重新验证其有效性:

Cache-Control: no-cache
 
Cache-Control: max-age=0, must-revalidate
 

这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载

协商缓存

当浏览器检查本地的强制缓存已经失效后,浏览器携带该资源的协商缓存标识向服务器发起请求,由服务器根据缓存标识决定是否继续使用本地缓存。

  • 协商缓存生效,服务器返回304,通知浏览器继续使用本地缓存
  • 协商缓存失效,服务器返回200,与最新的请求资源

协商缓存的规则

服务器与浏览器通过两两成对的请求头来控制协商缓存:

  • Etag If-None-Match
  • Last-Modified If-Modified-Since

其中,EtagLast-Modified是由服务器设置的响应头的字段,If-None-MatchIf-Modified-Since则是浏览器向服务器发送的请求头的字段

Etag与Last-Modified

Etag是上一次加载资源时,服务器返回的ResponseHeader,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到RequestHeader里的If-None-Match里,服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值做比较,如果相同,则表示资源文件没有发生改变,命中协商缓存。

  • Etag由服务器生成,标志当前资源的唯一标识,一般包含大小、修改时间等信息
  • If-None-Match浏览器缓存到本地的Etag

HTTP协议并未规定Etag的内容是如何生成的,但一般包含大小、修改时间等信息

Node.js下生成Etag的示例:

js
// 根据文件的fs.Stats信息计算出etag
@@ -23,9 +23,9 @@
   // 数字都用16进制表示
   return `${fileLength.toString(16)}-${fileLastModifiedTime.toString(16)}`
 }
-

Last-Modified与If-Modified-Since

Last-Modified是该资源文件最后一次更改时间,服务器会在ResponseHeader里返回,同时浏览器会将这个值保存起来,在下一次发送请求时,放到RequestHeader里的If-Modified-Since里,服务器在接收到后也会做比对,如果相同则命中协商缓存。

  • Last-Modified由服务器添加,标志资源文件上次被修改的时间
  • If-Modified-Since浏览器缓存到本地的Last-Modified

If-None-Match的优先级要高于If-Modified-Since,即:如果浏览器同时存在

两种协商缓存的区别

  • 精确度上,Etag要优于Last-ModifiedLast-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度;如果是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。
  • 性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个值。
  • 优先级上,服务器校验优先使用Etag

内存缓存与硬盘缓存

当我们打开一个新网页,服务器返回200,将资源发送给浏览器,浏览器做本地缓存

当我们刷新标签页,浏览器从内存缓存获得资源

当我们关闭标签页重新打开,浏览器从硬盘缓存获得资源

  • 内存缓存(MemoryCache):内存缓存具有两个特点,分别是快速读取和时效性
    • 快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。
    • 时效性:一旦该进程关闭,则该进程的内存则会清空。
  • 硬盘缓存(DiskCache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(MemoryCache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(DiskCache)。

用户对浏览器缓存的控制

  • 地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制
  • F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断
  • Ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源

参考资料

[稀土掘金] 彻底理解浏览器的缓存机制

[微信公众号] 浏览器的缓存机制小结

[微信公众号] 浏览器缓存机制剖析

[RFC-9111] Expires

[MDN] Expires

[MDN] Cache-Control

[MDN] ETag

Released under the MIT License.

- - +

Last-Modified与If-Modified-Since

Last-Modified是该资源文件最后一次更改时间,服务器会在ResponseHeader里返回,同时浏览器会将这个值保存起来,在下一次发送请求时,放到RequestHeader里的If-Modified-Since里,服务器在接收到后也会做比对,如果相同则命中协商缓存。

  • Last-Modified由服务器添加,标志资源文件上次被修改的时间
  • If-Modified-Since浏览器缓存到本地的Last-Modified

If-None-Match的优先级要高于If-Modified-Since,即:如果浏览器同时存在

两种协商缓存的区别

  • 精确度上,Etag要优于Last-ModifiedLast-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度;如果是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。
  • 性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个值。
  • 优先级上,服务器校验优先使用Etag

内存缓存与硬盘缓存

当我们打开一个新网页,服务器返回200,将资源发送给浏览器,浏览器做本地缓存

当我们刷新标签页,浏览器从内存缓存获得资源

当我们关闭标签页重新打开,浏览器从硬盘缓存获得资源

  • 内存缓存(MemoryCache):内存缓存具有两个特点,分别是快速读取和时效性
    • 快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。
    • 时效性:一旦该进程关闭,则该进程的内存则会清空。
  • 硬盘缓存(DiskCache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(MemoryCache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(DiskCache)。

用户对浏览器缓存的控制

  • 地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制
  • F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断
  • Ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源

参考资料

[稀土掘金] 彻底理解浏览器的缓存机制

[微信公众号] 浏览器的缓存机制小结

[微信公众号] 浏览器缓存机制剖析

[RFC-9111] Expires

[MDN] Expires

[MDN] Cache-Control

[MDN] ETag

Released under the MIT License.

+ + \ No newline at end of file diff --git a/article/深入理解浏览器运行原理.html b/article/深入理解浏览器运行原理.html index b3a28ade..3aed42d1 100644 --- a/article/深入理解浏览器运行原理.html +++ b/article/深入理解浏览器运行原理.html @@ -6,14 +6,14 @@ 深入理解浏览器运行原理 | ZiuChen - - + + -
Skip to content
On this page

深入理解浏览器运行原理

网页解析过程

输入域名 => DNS解析为IP => 目标服务器返回index.html

DNS:Domain Name System

HTML解析过程

  • 浏览器开始解析index.html文件,当遇到<link>则向服务器请求下载.css文件
  • 遇到<script>标签则向服务器请求下载.js文件
浏览器解析HTML过程浏览器是和如何工作的

How browsers work

生成CSS规则

在解析的过程中,如果遇到<link>元素,那么会由浏览器负责下载对应的CSS文件

  • 注意:下载CSS文件不会影响到DOM解析
  • 有单独一个线程对CSS文件进行下载与解析

浏览器下载完CSS文件后,就会对CSS文件进行解析,解析出对应的规则树:

  • 我们可以称之为CSSOM(CSS Object Model,CSS对象模型)

构建Render Tree

有了DOM Tree和CSSOM Tree之后,就可以将二者结合,构建Render Tree了

此时,如果有某些元素的CSS属性display: none;那么这个元素就不会出现在Render Tree中

  • 下载和解析CSS文件时,不会阻塞DOM Tree的构建过程
  • 但会阻塞Render Tree的构建过程:因为需要对应的CSSOM Tree

布局和绘制(Layout & Paint)

第四步是在渲染树(Render Tree)上运行布局(Layout),以计算每个节点的几何体

  • 渲染树会表示显示哪些节点以及其他的样式,但是不表示每个节点的尺寸、位置等信息
  • 布局是确定呈现树中所有节点的宽度、高度和位置信息

第五步是将每个节点绘制(Paint)到屏幕上

  • 在绘制阶段,浏览器布局阶段计算的每个frame转为屏幕上实际的像素点
  • 包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素

回流和重绘(Reflow & )

回流也可称为重排

理解回流(Reflow):

  • 第一次确定节点的大小和位置,称之为布局(layout)
  • 之后对节点的大小、位置修改重新计算,称之为回流

什么情况下会引起回流?

  • DOM 结构发生改变(添加新的节点或者移除节点)
  • 改变了布局(修改了width height padding font-size等值)
  • 窗口resize(修改了窗口的尺寸等)
  • 调用getComputedStyle方法获取尺寸、位置信息

理解重绘(Repaint):

  • 第一次渲染内容称之为绘制(paint)
  • 之后的重新渲染称之为重绘

什么情况下会引起重绘?

  • 修改背景色、文字颜色、边框颜色、样式等

回流一定会引起重绘,所以回流是一件很消耗性能的事情

  • 开发中要尽量避免发生回流

  • 修改样式尽量一次性修改完毕

    • 例如通过cssText一次性设置样式,或通过修改class的方式修改样式
  • 尽量避免频繁的操作DOM

    • 可以在一个DocumentFragment或者父元素中,将要操作的DOM操作完成,再一次性插入到DOM树中
  • 尽量避免通过getComputedStyle获取元素尺寸、位置等信息

  • 对某些元素使用position的absolute或fixed属性

    • 并不是不会引起回流,而是开销相对较小,不会对其他元素产生影响

特殊解析: composite合成

在绘制的过程中,可以将布局后的元素绘制到多个合成图层中

  • 这是浏览器的一种优化手段
  • 将不同流生成的不同Layer进行合并
标准流 => LayouTree => RenderLayer
+    
Skip to content
On this page

深入理解浏览器运行原理

网页解析过程

输入域名 => DNS解析为IP => 目标服务器返回index.html

DNS:Domain Name System

HTML解析过程

  • 浏览器开始解析index.html文件,当遇到<link>则向服务器请求下载.css文件
  • 遇到<script>标签则向服务器请求下载.js文件
浏览器解析HTML过程浏览器是和如何工作的

How browsers work

生成CSS规则

在解析的过程中,如果遇到<link>元素,那么会由浏览器负责下载对应的CSS文件

  • 注意:下载CSS文件不会影响到DOM解析
  • 有单独一个线程对CSS文件进行下载与解析

浏览器下载完CSS文件后,就会对CSS文件进行解析,解析出对应的规则树:

  • 我们可以称之为CSSOM(CSS Object Model,CSS对象模型)

构建Render Tree

有了DOM Tree和CSSOM Tree之后,就可以将二者结合,构建Render Tree了

此时,如果有某些元素的CSS属性display: none;那么这个元素就不会出现在Render Tree中

  • 下载和解析CSS文件时,不会阻塞DOM Tree的构建过程
  • 但会阻塞Render Tree的构建过程:因为需要对应的CSSOM Tree

布局和绘制(Layout & Paint)

第四步是在渲染树(Render Tree)上运行布局(Layout),以计算每个节点的几何体

  • 渲染树会表示显示哪些节点以及其他的样式,但是不表示每个节点的尺寸、位置等信息
  • 布局是确定呈现树中所有节点的宽度、高度和位置信息

第五步是将每个节点绘制(Paint)到屏幕上

  • 在绘制阶段,浏览器布局阶段计算的每个frame转为屏幕上实际的像素点
  • 包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素

回流和重绘(Reflow & )

回流也可称为重排

理解回流(Reflow):

  • 第一次确定节点的大小和位置,称之为布局(layout)
  • 之后对节点的大小、位置修改重新计算,称之为回流

什么情况下会引起回流?

  • DOM 结构发生改变(添加新的节点或者移除节点)
  • 改变了布局(修改了width height padding font-size等值)
  • 窗口resize(修改了窗口的尺寸等)
  • 调用getComputedStyle方法获取尺寸、位置信息

理解重绘(Repaint):

  • 第一次渲染内容称之为绘制(paint)
  • 之后的重新渲染称之为重绘

什么情况下会引起重绘?

  • 修改背景色、文字颜色、边框颜色、样式等

回流一定会引起重绘,所以回流是一件很消耗性能的事情

  • 开发中要尽量避免发生回流

  • 修改样式尽量一次性修改完毕

    • 例如通过cssText一次性设置样式,或通过修改class的方式修改样式
  • 尽量避免频繁的操作DOM

    • 可以在一个DocumentFragment或者父元素中,将要操作的DOM操作完成,再一次性插入到DOM树中
  • 尽量避免通过getComputedStyle获取元素尺寸、位置等信息

  • 对某些元素使用position的absolute或fixed属性

    • 并不是不会引起回流,而是开销相对较小,不会对其他元素产生影响

特殊解析: composite合成

在绘制的过程中,可以将布局后的元素绘制到多个合成图层中

  • 这是浏览器的一种优化手段
  • 将不同流生成的不同Layer进行合并
标准流 => LayouTree => RenderLayer
 `position:fixed;` => RenderLayer
 

默认情况,标准流中的内容都是被绘制在同一个图层(Layer)中的

而一些特殊的属性,浏览器会创建一个新的合成层(CompositingLayer),并且新的图层可以利用GPU来加速绘制

  • 每个合成层都是单独渲染的
  • 单独渲染可以避免所有的动画都在同一层中渲染导致性能问题
  • 在各自的层中渲染完成后,只需要将渲染结果更新回合成层即可

当元素具有哪些属性时,浏览器会为其创建新的合成层呢?

  • 3D Transforms
  • video canvas iframe
  • opacity 动画转换时
  • position: fixed
  • will-change: 一个实验性的属性,提前告诉浏览器此元素可能发生哪些变化
  • animation 或 transition设置了opacity、transform

案例1:同一层渲染

.box1 {
   width: 100px;
@@ -73,9 +73,9 @@
 

上述代码在控制台的输出为:

script enter
 defer script enter
 DOMContentLoaded enter
-
  • 多个带defer的脚本也是按照自上至下的顺序执行的
  • 从某种角度来说,defer可以提高页面的性能,并且推荐放到head元素中
  • 注意:defer仅适用于外部脚本,对于script标签内编写的默认JS代码会被忽略掉

async属性

async属性也可以做到:让脚本异步加载而不阻塞DOM树的构建,它与defer的区别:

  • async标记的脚本是完全独立
  • async脚本不能保证执行顺序,因为它是独立下载、独立运行,不会等待其他脚本
  • 使用async标记的脚本不会保证它将在DOMContentLoaded之前或之后被执行

要使用async属性标记的script操作DOM,必须在其中使用DOMContentLoaded监听器的回调函数,在该事件触发(DOM树构建完毕)后,执行相应的回调函数

Released under the MIT License.

- - +
  • 多个带defer的脚本也是按照自上至下的顺序执行的
  • 从某种角度来说,defer可以提高页面的性能,并且推荐放到head元素中
  • 注意:defer仅适用于外部脚本,对于script标签内编写的默认JS代码会被忽略掉

async属性

async属性也可以做到:让脚本异步加载而不阻塞DOM树的构建,它与defer的区别:

  • async标记的脚本是完全独立
  • async脚本不能保证执行顺序,因为它是独立下载、独立运行,不会等待其他脚本
  • 使用async标记的脚本不会保证它将在DOMContentLoaded之前或之后被执行

要使用async属性标记的script操作DOM,必须在其中使用DOMContentLoaded监听器的回调函数,在该事件触发(DOM树构建完毕)后,执行相应的回调函数

Released under the MIT License.

+ + \ No newline at end of file diff --git a/assets/app.a81d7d4f.js b/assets/app.94d5b31a.js similarity index 92% rename from assets/app.a81d7d4f.js rename to assets/app.94d5b31a.js index d0b76b8b..e285fb20 100644 --- a/assets/app.a81d7d4f.js +++ b/assets/app.94d5b31a.js @@ -1,10 +1,10 @@ -function Gs(e,t){const n=Object.create(null),s=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}function Qn(e){if(Q(e)){const t={};for(let n=0;n{if(n){const s=n.split(ji);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ge(e){let t="";if(xe(e))t=e;else if(Q(e))for(let n=0;nxe(e)?e:e==null?"":Q(e)||ye(e)&&(e.toString===Lr||!re(e.toString))?JSON.stringify(e,Pr,2):String(e),Pr=(e,t)=>t&&t.__v_isRef?Pr(e,t.value):Kt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o])=>(n[`${s} =>`]=o,n),{})}:Cr(t)?{[`Set(${t.size})`]:[...t.values()]}:ye(t)&&!Q(t)&&!Er(t)?String(t):t,be={},jt=[],Je=()=>{},Gi=()=>!1,Ji=/^on[^a-z]/,Pn=e=>Ji.test(e),Js=e=>e.startsWith("onUpdate:"),Pe=Object.assign,Zs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Zi=Object.prototype.hasOwnProperty,de=(e,t)=>Zi.call(e,t),Q=Array.isArray,Kt=e=>es(e)==="[object Map]",Cr=e=>es(e)==="[object Set]",re=e=>typeof e=="function",xe=e=>typeof e=="string",Xs=e=>typeof e=="symbol",ye=e=>e!==null&&typeof e=="object",Sr=e=>ye(e)&&re(e.then)&&re(e.catch),Lr=Object.prototype.toString,es=e=>Lr.call(e),Xi=e=>es(e).slice(8,-1),Er=e=>es(e)==="[object Object]",Qs=e=>xe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,un=Gs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ts=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Qi=/-(\w)/g,nt=ts(e=>e.replace(Qi,(t,n)=>n?n.toUpperCase():"")),el=/\B([A-Z])/g,nn=ts(e=>e.replace(el,"-$1").toLowerCase()),ns=ts(e=>e.charAt(0).toUpperCase()+e.slice(1)),ys=ts(e=>e?`on${ns(e)}`:""),mn=(e,t)=>!Object.is(e,t),bs=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},eo=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let To;const tl=()=>To||(To=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Oe;class nl{constructor(t=!1){this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Oe,!t&&Oe&&(this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Oe;try{return Oe=this,t()}finally{Oe=n}}}on(){Oe=this}off(){Oe=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Tr=e=>(e.w>)>0,Ar=e=>(e.n>)>0,il=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=a)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":Q(e)?Qs(n)&&l.push(i.get("length")):(l.push(i.get(Ot)),Kt(e)&&l.push(i.get(Vs)));break;case"delete":Q(e)||(l.push(i.get(Ot)),Kt(e)&&l.push(i.get(Vs)));break;case"set":Kt(e)&&l.push(i.get(Ot));break}if(l.length===1)l[0]&&Ms(l[0]);else{const a=[];for(const u of l)u&&a.push(...u);Ms(to(a))}}function Ms(e,t){const n=Q(e)?e:[...e];for(const s of n)s.computed&&Vo(s);for(const s of n)s.computed||Vo(s)}function Vo(e,t){(e!==Ye||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const al=Gs("__proto__,__v_isRef,__isVue"),Ir=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xs)),cl=so(),ul=so(!1,!0),dl=so(!0),Mo=fl();function fl(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=fe(this);for(let r=0,i=this.length;r{e[t]=function(...n){sn();const s=fe(this)[t].apply(this,n);return on(),s}}),e}function so(e=!1,t=!1){return function(s,o,r){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&r===(e?t?Ll:zr:t?Br:Hr).get(s))return s;const i=Q(s);if(!e&&i&&de(Mo,o))return Reflect.get(Mo,o,r);const l=Reflect.get(s,o,r);return(Xs(o)?Ir.has(o):al(o))||(e||Be(s,"get",o),t)?l:Se(l)?i&&Qs(o)?l:l.value:ye(l)?e?io(l):os(l):l}}const hl=Nr(),pl=Nr(!0);function Nr(e=!1){return function(n,s,o,r){let i=n[s];if(Qt(i)&&Se(i)&&!Se(o))return!1;if(!e&&(!Un(o)&&!Qt(o)&&(i=fe(i),o=fe(o)),!Q(n)&&Se(i)&&!Se(o)))return i.value=o,!0;const l=Q(n)&&Qs(s)?Number(s)e,ss=e=>Reflect.getPrototypeOf(e);function En(e,t,n=!1,s=!1){e=e.__v_raw;const o=fe(e),r=fe(t);n||(t!==r&&Be(o,"get",t),Be(o,"get",r));const{has:i}=ss(o),l=s?oo:n?ao:vn;if(i.call(o,t))return l(e.get(t));if(i.call(o,r))return l(e.get(r));e!==o&&e.get(t)}function Tn(e,t=!1){const n=this.__v_raw,s=fe(n),o=fe(e);return t||(e!==o&&Be(s,"has",e),Be(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function An(e,t=!1){return e=e.__v_raw,!t&&Be(fe(e),"iterate",Ot),Reflect.get(e,"size",e)}function Io(e){e=fe(e);const t=fe(this);return ss(t).has.call(t,e)||(t.add(e),it(t,"add",e,e)),this}function No(e,t){t=fe(t);const n=fe(this),{has:s,get:o}=ss(n);let r=s.call(n,e);r||(e=fe(e),r=s.call(n,e));const i=o.call(n,e);return n.set(e,t),r?mn(t,i)&&it(n,"set",e,t):it(n,"add",e,t),this}function Oo(e){const t=fe(this),{has:n,get:s}=ss(t);let o=n.call(t,e);o||(e=fe(e),o=n.call(t,e)),s&&s.call(t,e);const r=t.delete(e);return o&&it(t,"delete",e,void 0),r}function Ho(){const e=fe(this),t=e.size!==0,n=e.clear();return t&&it(e,"clear",void 0,void 0),n}function Vn(e,t){return function(s,o){const r=this,i=r.__v_raw,l=fe(i),a=t?oo:e?ao:vn;return!e&&Be(l,"iterate",Ot),i.forEach((u,f)=>s.call(o,a(u),a(f),r))}}function Mn(e,t,n){return function(...s){const o=this.__v_raw,r=fe(o),i=Kt(r),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,u=o[e](...s),f=n?oo:t?ao:vn;return!t&&Be(r,"iterate",a?Vs:Ot),{next(){const{value:m,done:g}=u.next();return g?{value:m,done:g}:{value:l?[f(m[0]),f(m[1])]:f(m),done:g}},[Symbol.iterator](){return this}}}}function ut(e){return function(...t){return e==="delete"?!1:this}}function bl(){const e={get(r){return En(this,r)},get size(){return An(this)},has:Tn,add:Io,set:No,delete:Oo,clear:Ho,forEach:Vn(!1,!1)},t={get(r){return En(this,r,!1,!0)},get size(){return An(this)},has:Tn,add:Io,set:No,delete:Oo,clear:Ho,forEach:Vn(!1,!0)},n={get(r){return En(this,r,!0)},get size(){return An(this,!0)},has(r){return Tn.call(this,r,!0)},add:ut("add"),set:ut("set"),delete:ut("delete"),clear:ut("clear"),forEach:Vn(!0,!1)},s={get(r){return En(this,r,!0,!0)},get size(){return An(this,!0)},has(r){return Tn.call(this,r,!0)},add:ut("add"),set:ut("set"),delete:ut("delete"),clear:ut("clear"),forEach:Vn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(r=>{e[r]=Mn(r,!1,!1),n[r]=Mn(r,!0,!1),t[r]=Mn(r,!1,!0),s[r]=Mn(r,!0,!0)}),[e,n,t,s]}const[xl,wl,kl,$l]=bl();function ro(e,t){const n=t?e?$l:kl:e?wl:xl;return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(de(n,o)&&o in s?n:s,o,r)}const Pl={get:ro(!1,!1)},Cl={get:ro(!1,!0)},Sl={get:ro(!0,!1)},Hr=new WeakMap,Br=new WeakMap,zr=new WeakMap,Ll=new WeakMap;function El(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Tl(e){return e.__v_skip||!Object.isExtensible(e)?0:El(Xi(e))}function os(e){return Qt(e)?e:lo(e,!1,Or,Pl,Hr)}function Al(e){return lo(e,!1,yl,Cl,Br)}function io(e){return lo(e,!0,gl,Sl,zr)}function lo(e,t,n,s,o){if(!ye(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=o.get(e);if(r)return r;const i=Tl(e);if(i===0)return e;const l=new Proxy(e,i===2?s:n);return o.set(e,l),l}function qt(e){return Qt(e)?qt(e.__v_raw):!!(e&&e.__v_isReactive)}function Qt(e){return!!(e&&e.__v_isReadonly)}function Un(e){return!!(e&&e.__v_isShallow)}function Fr(e){return qt(e)||Qt(e)}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function dn(e){return Dn(e,"__v_skip",!0),e}const vn=e=>ye(e)?os(e):e,ao=e=>ye(e)?io(e):e;function Rr(e){mt&&Ye&&(e=fe(e),Mr(e.dep||(e.dep=to())))}function Dr(e,t){e=fe(e),e.dep&&Ms(e.dep)}function Se(e){return!!(e&&e.__v_isRef===!0)}function pe(e){return Ur(e,!1)}function Vl(e){return Ur(e,!0)}function Ur(e,t){return Se(e)?e:new Ml(e,t)}class Ml{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:fe(t),this._value=n?t:vn(t)}get value(){return Rr(this),this._value}set value(t){const n=this.__v_isShallow||Un(t)||Qt(t);t=n?t:fe(t),mn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:vn(t),Dr(this))}}function _(e){return Se(e)?e.value:e}const Il={get:(e,t,n)=>_(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return Se(o)&&!Se(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function jr(e){return qt(e)?e:new Proxy(e,Il)}var Kr;class Nl{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[Kr]=!1,this._dirty=!0,this.effect=new no(t,()=>{this._dirty||(this._dirty=!0,Dr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=fe(this);return Rr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}Kr="__v_isReadonly";function Ol(e,t,n=!1){let s,o;const r=re(e);return r?(s=e,o=Je):(s=e.get,o=e.set),new Nl(s,o,r||!o,n)}function vt(e,t,n,s){let o;try{o=s?e(...s):e()}catch(r){rs(r,t,n)}return o}function Ue(e,t,n,s){if(re(e)){const r=vt(e,t,n,s);return r&&Sr(r)&&r.catch(i=>{rs(i,t,n)}),r}const o=[];for(let r=0;r>>1;yn(Ce[s])et&&Ce.splice(t,1)}function Fl(e){Q(e)?Wt.push(...e):(!rt||!rt.includes(e,e.allowRecurse?Vt+1:Vt))&&Wt.push(e),Wr()}function Bo(e,t=gn?et+1:0){for(;tyn(n)-yn(s)),Vt=0;Vte.id==null?1/0:e.id,Rl=(e,t)=>{const n=yn(e)-yn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Yr(e){Is=!1,gn=!0,Ce.sort(Rl);const t=Je;try{for(et=0;etxe(C)?C.trim():C)),m&&(o=n.map(eo))}let l,a=s[l=ys(t)]||s[l=ys(nt(t))];!a&&r&&(a=s[l=ys(nn(t))]),a&&Ue(a,e,6,o);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ue(u,e,6,o)}}function Gr(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!re(e)){const a=u=>{const f=Gr(u,t,!0);f&&(l=!0,Pe(i,f))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(ye(e)&&s.set(e,null),null):(Q(r)?r.forEach(a=>i[a]=null):Pe(i,r),ye(e)&&s.set(e,i),i)}function ls(e,t){return!e||!Pn(t)?!1:(t=t.slice(2).replace(/Once$/,""),de(e,t[0].toLowerCase()+t.slice(1))||de(e,nn(t))||de(e,t))}let Le=null,as=null;function Kn(e){const t=Le;return Le=e,as=e&&e.type.__scopeId||null,t}function st(e){as=e}function ot(){as=null}function H(e,t=Le,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&Yo(-1);const r=Kn(t);let i;try{i=e(...o)}finally{Kn(r),s._d&&Yo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function xs(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:r,propsOptions:[i],slots:l,attrs:a,emit:u,render:f,renderCache:m,data:g,setupState:C,ctx:z,inheritAttrs:B}=e;let se,x;const V=Kn(e);try{if(n.shapeFlag&4){const J=o||s;se=We(f.call(J,J,m,r,C,g,z)),x=a}else{const J=t;se=We(J.length>1?J(r,{attrs:a,slots:l,emit:u}):J(r,null)),x=t.props?a:Ul(a)}}catch(J){hn.length=0,rs(J,e,1),se=N(He)}let E=se;if(x&&B!==!1){const J=Object.keys(x),{shapeFlag:ee}=E;J.length&&ee&7&&(i&&J.some(Js)&&(x=jl(x,i)),E=bt(E,x))}return n.dirs&&(E=bt(E),E.dirs=E.dirs?E.dirs.concat(n.dirs):n.dirs),n.transition&&(E.transition=n.transition),se=E,Kn(V),se}const Ul=e=>{let t;for(const n in e)(n==="class"||n==="style"||Pn(n))&&((t||(t={}))[n]=e[n]);return t},jl=(e,t)=>{const n={};for(const s in e)(!Js(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Kl(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,u=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?zo(s,i,u):!!i;if(a&8){const f=t.dynamicProps;for(let m=0;me.__isSuspense;function Jr(e,t){t&&t.pendingBranch?Q(e)?t.effects.push(...e):t.effects.push(e):Fl(e)}function Yt(e,t){if(ke){let n=ke.provides;const s=ke.parent&&ke.parent.provides;s===n&&(n=ke.provides=Object.create(s)),n[e]=t}}function Ze(e,t,n=!1){const s=ke||Le;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&re(t)?t.call(s.proxy):t}}function yt(e,t){return cs(e,null,t)}function Zr(e,t){return cs(e,null,{flush:"post"})}const In={};function tt(e,t,n){return cs(e,t,n)}function cs(e,t,{immediate:n,deep:s,flush:o,onTrack:r,onTrigger:i}=be){const l=ke;let a,u=!1,f=!1;if(Se(e)?(a=()=>e.value,u=Un(e)):qt(e)?(a=()=>e,s=!0):Q(e)?(f=!0,u=e.some(E=>qt(E)||Un(E)),a=()=>e.map(E=>{if(Se(E))return E.value;if(qt(E))return Ut(E);if(re(E))return vt(E,l,2)})):re(e)?t?a=()=>vt(e,l,2):a=()=>{if(!(l&&l.isUnmounted))return m&&m(),Ue(e,l,3,[g])}:a=Je,t&&s){const E=a;a=()=>Ut(E())}let m,g=E=>{m=x.onStop=()=>{vt(E,l,4)}},C;if(wn)if(g=Je,t?n&&Ue(t,l,3,[a(),f?[]:void 0,g]):a(),o==="sync"){const E=za();C=E.__watcherHandles||(E.__watcherHandles=[])}else return Je;let z=f?new Array(e.length).fill(In):In;const B=()=>{if(x.active)if(t){const E=x.run();(s||u||(f?E.some((J,ee)=>mn(J,z[ee])):mn(E,z)))&&(m&&m(),Ue(t,l,3,[E,z===In?void 0:f&&z[0]===In?[]:z,g]),z=E)}else x.run()};B.allowRecurse=!!t;let se;o==="sync"?se=B:o==="post"?se=()=>Me(B,l&&l.suspense):(B.pre=!0,l&&(B.id=l.uid),se=()=>uo(B));const x=new no(a,se);t?n?B():z=x.run():o==="post"?Me(x.run.bind(x),l&&l.suspense):x.run();const V=()=>{x.stop(),l&&l.scope&&Zs(l.scope.effects,x)};return C&&C.push(V),V}function Yl(e,t,n){const s=this.proxy,o=xe(e)?e.includes(".")?Xr(s,e):()=>s[e]:e.bind(s,s);let r;re(t)?r=t:(r=t.handler,n=t);const i=ke;tn(this);const l=cs(o,r.bind(s),n);return i?tn(i):Ht(),l}function Xr(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o{Ut(n,t)});else if(Er(e))for(const n in e)Ut(e[n],t);return e}function Gl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return ze(()=>{e.isMounted=!0}),si(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],Jl={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},setup(e,{slots:t}){const n=hs(),s=Gl();let o;return()=>{const r=t.default&&ti(t.default(),!0);if(!r||!r.length)return;let i=r[0];if(r.length>1){for(const B of r)if(B.type!==He){i=B;break}}const l=fe(e),{mode:a}=l;if(s.isLeaving)return ws(i);const u=Fo(i);if(!u)return ws(i);const f=Ns(u,l,s,n);Os(u,f);const m=n.subTree,g=m&&Fo(m);let C=!1;const{getTransitionKey:z}=u.type;if(z){const B=z();o===void 0?o=B:B!==o&&(o=B,C=!0)}if(g&&g.type!==He&&(!Mt(u,g)||C)){const B=Ns(g,l,s,n);if(Os(g,B),a==="out-in")return s.isLeaving=!0,B.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},ws(i);a==="in-out"&&u.type!==He&&(B.delayLeave=(se,x,V)=>{const E=ei(s,g);E[String(g.key)]=g,se._leaveCb=()=>{x(),se._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=V})}return i}}},Qr=Jl;function ei(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Ns(e,t,n,s){const{appear:o,mode:r,persisted:i=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:m,onLeave:g,onAfterLeave:C,onLeaveCancelled:z,onBeforeAppear:B,onAppear:se,onAfterAppear:x,onAppearCancelled:V}=t,E=String(e.key),J=ei(n,e),ee=(p,ne)=>{p&&Ue(p,s,9,ne)},he=(p,ne)=>{const U=ne[1];ee(p,ne),Q(p)?p.every(Z=>Z.length<=1)&&U():p.length<=1&&U()},D={mode:r,persisted:i,beforeEnter(p){let ne=l;if(!n.isMounted)if(o)ne=B||l;else return;p._leaveCb&&p._leaveCb(!0);const U=J[E];U&&Mt(e,U)&&U.el._leaveCb&&U.el._leaveCb(),ee(ne,[p])},enter(p){let ne=a,U=u,Z=f;if(!n.isMounted)if(o)ne=se||a,U=x||u,Z=V||f;else return;let $=!1;const I=p._enterCb=A=>{$||($=!0,A?ee(Z,[p]):ee(U,[p]),D.delayedLeave&&D.delayedLeave(),p._enterCb=void 0)};ne?he(ne,[p,I]):I()},leave(p,ne){const U=String(e.key);if(p._enterCb&&p._enterCb(!0),n.isUnmounting)return ne();ee(m,[p]);let Z=!1;const $=p._leaveCb=I=>{Z||(Z=!0,ne(),I?ee(z,[p]):ee(C,[p]),p._leaveCb=void 0,J[U]===e&&delete J[U])};J[U]=e,g?he(g,[p,$]):$()},clone(p){return Ns(p,t,n,s)}};return D}function ws(e){if(us(e))return e=bt(e),e.children=null,e}function Fo(e){return us(e)?e.children?e.children[0]:void 0:e}function Os(e,t){e.shapeFlag&6&&e.component?Os(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ti(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;r!!e.type.__asyncLoader,us=e=>e.type.__isKeepAlive;function Zl(e,t){ni(e,"a",t)}function Xl(e,t){ni(e,"da",t)}function ni(e,t,n=ke){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ds(t,s,n),n){let o=n.parent;for(;o&&o.parent;)us(o.parent.vnode)&&Ql(s,t,n,o),o=o.parent}}function Ql(e,t,n,s){const o=ds(t,e,s,!0);xt(()=>{Zs(s[t],o)},n)}function ds(e,t,n=ke,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;sn(),tn(n);const l=Ue(t,n,e,i);return Ht(),on(),l});return s?o.unshift(r):o.push(r),r}}const lt=e=>(t,n=ke)=>(!wn||e==="sp")&&ds(e,(...s)=>t(...s),n),ea=lt("bm"),ze=lt("m"),ta=lt("bu"),fo=lt("u"),si=lt("bum"),xt=lt("um"),na=lt("sp"),sa=lt("rtg"),oa=lt("rtc");function ra(e,t=ke){ds("ec",e,t)}function Qe(e,t,n,s){const o=e.dirs,r=t&&t.dirs;for(let i=0;it(i,l,void 0,r&&r[l]));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,a=i.length;lYn(t)?!(t.type===He||t.type===oe&&!ii(t.children)):!0)?e:null}const Hs=e=>e?vi(e)?vo(e)||e.proxy:Hs(e.parent):null,fn=Pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hs(e.parent),$root:e=>Hs(e.root),$emit:e=>e.emit,$options:e=>po(e),$forceUpdate:e=>e.f||(e.f=()=>uo(e.update)),$nextTick:e=>e.n||(e.n=is.bind(e.proxy)),$watch:e=>Yl.bind(e)}),ks=(e,t)=>e!==be&&!e.__isScriptSetup&&de(e,t),ia={get({_:e},t){const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;let u;if(t[0]!=="$"){const C=i[t];if(C!==void 0)switch(C){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(ks(s,t))return i[t]=1,s[t];if(o!==be&&de(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&de(u,t))return i[t]=3,r[t];if(n!==be&&de(n,t))return i[t]=4,n[t];Bs&&(i[t]=0)}}const f=fn[t];let m,g;if(f)return t==="$attrs"&&Be(e,"get",t),f(e);if((m=l.__cssModules)&&(m=m[t]))return m;if(n!==be&&de(n,t))return i[t]=4,n[t];if(g=a.config.globalProperties,de(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return ks(o,t)?(o[t]=n,!0):s!==be&&de(s,t)?(s[t]=n,!0):de(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:r}},i){let l;return!!n[i]||e!==be&&de(e,i)||ks(t,i)||(l=r[0])&&de(l,i)||de(s,i)||de(fn,i)||de(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:de(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let Bs=!0;function la(e){const t=po(e),n=e.proxy,s=e.ctx;Bs=!1,t.beforeCreate&&Do(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:u,created:f,beforeMount:m,mounted:g,beforeUpdate:C,updated:z,activated:B,deactivated:se,beforeDestroy:x,beforeUnmount:V,destroyed:E,unmounted:J,render:ee,renderTracked:he,renderTriggered:D,errorCaptured:p,serverPrefetch:ne,expose:U,inheritAttrs:Z,components:$,directives:I,filters:A}=t;if(u&&aa(u,s,null,e.appContext.config.unwrapInjectedRef),i)for(const ie in i){const le=i[ie];re(le)&&(s[ie]=le.bind(n))}if(o){const ie=o.call(n,n);ye(ie)&&(e.data=os(ie))}if(Bs=!0,r)for(const ie in r){const le=r[ie],Ve=re(le)?le.bind(n,n):re(le.get)?le.get.bind(n,n):Je,Ie=!re(le)&&re(le.set)?le.set.bind(n):Je,je=G({get:Ve,set:Ie});Object.defineProperty(s,ie,{enumerable:!0,configurable:!0,get:()=>je.value,set:Fe=>je.value=Fe})}if(l)for(const ie in l)li(l[ie],s,n,ie);if(a){const ie=re(a)?a.call(n):a;Reflect.ownKeys(ie).forEach(le=>{Yt(le,ie[le])})}f&&Do(f,e,"c");function F(ie,le){Q(le)?le.forEach(Ve=>ie(Ve.bind(n))):le&&ie(le.bind(n))}if(F(ea,m),F(ze,g),F(ta,C),F(fo,z),F(Zl,B),F(Xl,se),F(ra,p),F(oa,he),F(sa,D),F(si,V),F(xt,J),F(na,ne),Q(U))if(U.length){const ie=e.exposed||(e.exposed={});U.forEach(le=>{Object.defineProperty(ie,le,{get:()=>n[le],set:Ve=>n[le]=Ve})})}else e.exposed||(e.exposed={});ee&&e.render===Je&&(e.render=ee),Z!=null&&(e.inheritAttrs=Z),$&&(e.components=$),I&&(e.directives=I)}function aa(e,t,n=Je,s=!1){Q(e)&&(e=zs(e));for(const o in e){const r=e[o];let i;ye(r)?"default"in r?i=Ze(r.from||o,r.default,!0):i=Ze(r.from||o):i=Ze(r),Se(i)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>i.value,set:l=>i.value=l}):t[o]=i}}function Do(e,t,n){Ue(Q(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function li(e,t,n,s){const o=s.includes(".")?Xr(n,s):()=>n[s];if(xe(e)){const r=t[e];re(r)&&tt(o,r)}else if(re(e))tt(o,e.bind(n));else if(ye(e))if(Q(e))e.forEach(r=>li(r,t,n,s));else{const r=re(e.handler)?e.handler.bind(n):t[e.handler];re(r)&&tt(o,r,e)}}function po(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(u=>qn(a,u,i,!0)),qn(a,t,i)),ye(t)&&r.set(t,a),a}function qn(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&qn(e,r,n,!0),o&&o.forEach(i=>qn(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=ca[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const ca={data:Uo,props:Tt,emits:Tt,methods:Tt,computed:Tt,beforeCreate:Ae,created:Ae,beforeMount:Ae,mounted:Ae,beforeUpdate:Ae,updated:Ae,beforeDestroy:Ae,beforeUnmount:Ae,destroyed:Ae,unmounted:Ae,activated:Ae,deactivated:Ae,errorCaptured:Ae,serverPrefetch:Ae,components:Tt,directives:Tt,watch:da,provide:Uo,inject:ua};function Uo(e,t){return t?e?function(){return Pe(re(e)?e.call(this,this):e,re(t)?t.call(this,this):t)}:t:e}function ua(e,t){return Tt(zs(e),zs(t))}function zs(e){if(Q(e)){const t={};for(let n=0;n0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let m=0;m{a=!0;const[g,C]=ci(m,t,!0);Pe(i,g),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!r&&!a)return ye(e)&&s.set(e,jt),jt;if(Q(r))for(let f=0;f-1,C[1]=B<0||z-1||de(C,"default"))&&l.push(m)}}}const u=[i,l];return ye(e)&&s.set(e,u),u}function jo(e){return e[0]!=="$"}function Ko(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function qo(e,t){return Ko(e)===Ko(t)}function Wo(e,t){return Q(t)?t.findIndex(n=>qo(n,e)):re(t)&&qo(t,e)?0:-1}const ui=e=>e[0]==="_"||e==="$stable",_o=e=>Q(e)?e.map(We):[We(e)],pa=(e,t,n)=>{if(t._n)return t;const s=H((...o)=>_o(t(...o)),n);return s._c=!1,s},di=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ui(o))continue;const r=e[o];if(re(r))t[o]=pa(o,r,s);else if(r!=null){const i=_o(r);t[o]=()=>i}}},fi=(e,t)=>{const n=_o(t);e.slots.default=()=>n},_a=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=fe(t),Dn(t,"_",n)):di(t,e.slots={})}else e.slots={},t&&fi(e,t);Dn(e.slots,fs,1)},ma=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=be;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:(Pe(o,t),!n&&l===1&&delete o._):(r=!t.$stable,di(t,o)),i=t}else t&&(fi(e,t),i={default:1});if(r)for(const l in o)!ui(l)&&!(l in i)&&delete o[l]};function hi(){return{app:null,config:{isNativeTag:Gi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let va=0;function ga(e,t){return function(s,o=null){re(s)||(s=Object.assign({},s)),o!=null&&!ye(o)&&(o=null);const r=hi(),i=new Set;let l=!1;const a=r.app={_uid:va++,_component:s,_props:o,_container:null,_context:r,_instance:null,version:Fa,get config(){return r.config},set config(u){},use(u,...f){return i.has(u)||(u&&re(u.install)?(i.add(u),u.install(a,...f)):re(u)&&(i.add(u),u(a,...f))),a},mixin(u){return r.mixins.includes(u)||r.mixins.push(u),a},component(u,f){return f?(r.components[u]=f,a):r.components[u]},directive(u,f){return f?(r.directives[u]=f,a):r.directives[u]},mount(u,f,m){if(!l){const g=N(s,o);return g.appContext=r,f&&t?t(g,u):e(g,u,m),l=!0,a._container=u,u.__vue_app__=a,vo(g.component)||g.component.proxy}},unmount(){l&&(e(null,a._container),delete a._container.__vue_app__)},provide(u,f){return r.provides[u]=f,a}};return a}}function Wn(e,t,n,s,o=!1){if(Q(e)){e.forEach((g,C)=>Wn(g,t&&(Q(t)?t[C]:t),n,s,o));return}if(Gt(s)&&!o)return;const r=s.shapeFlag&4?vo(s.component)||s.component.proxy:s.el,i=o?null:r,{i:l,r:a}=e,u=t&&t.r,f=l.refs===be?l.refs={}:l.refs,m=l.setupState;if(u!=null&&u!==a&&(xe(u)?(f[u]=null,de(m,u)&&(m[u]=null)):Se(u)&&(u.value=null)),re(a))vt(a,l,12,[i,f]);else{const g=xe(a),C=Se(a);if(g||C){const z=()=>{if(e.f){const B=g?de(m,a)?m[a]:f[a]:a.value;o?Q(B)&&Zs(B,r):Q(B)?B.includes(r)||B.push(r):g?(f[a]=[r],de(m,a)&&(m[a]=f[a])):(a.value=[r],e.k&&(f[e.k]=a.value))}else g?(f[a]=i,de(m,a)&&(m[a]=i)):C&&(a.value=i,e.k&&(f[e.k]=i))};i?(z.id=-1,Me(z,n)):z()}}}let dt=!1;const Nn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",On=e=>e.nodeType===8;function ya(e){const{mt:t,p:n,o:{patchProp:s,createText:o,nextSibling:r,parentNode:i,remove:l,insert:a,createComment:u}}=e,f=(x,V)=>{if(!V.hasChildNodes()){n(null,x,V),jn(),V._vnode=x;return}dt=!1,m(V.firstChild,x,null,null,null),jn(),V._vnode=x,dt&&console.error("Hydration completed but contains mismatches.")},m=(x,V,E,J,ee,he=!1)=>{const D=On(x)&&x.data==="[",p=()=>B(x,V,E,J,ee,D),{type:ne,ref:U,shapeFlag:Z,patchFlag:$}=V;let I=x.nodeType;V.el=x,$===-2&&(he=!1,V.dynamicChildren=null);let A=null;switch(ne){case en:I!==3?V.children===""?(a(V.el=o(""),i(x),x),A=x):A=p():(x.data!==V.children&&(dt=!0,x.data=V.children),A=r(x));break;case He:I!==8||D?A=p():A=r(x);break;case Jt:if(D&&(x=r(x),I=x.nodeType),I===1||I===3){A=x;const ue=!V.children.length;for(let F=0;F{he=he||!!V.dynamicChildren;const{type:D,props:p,patchFlag:ne,shapeFlag:U,dirs:Z}=V,$=D==="input"&&Z||D==="option";if($||ne!==-1){if(Z&&Qe(V,null,E,"created"),p)if($||!he||ne&48)for(const A in p)($&&A.endsWith("value")||Pn(A)&&!un(A))&&s(x,A,null,p[A],!1,void 0,E);else p.onClick&&s(x,"onClick",null,p.onClick,!1,void 0,E);let I;if((I=p&&p.onVnodeBeforeMount)&&De(I,E,V),Z&&Qe(V,null,E,"beforeMount"),((I=p&&p.onVnodeMounted)||Z)&&Jr(()=>{I&&De(I,E,V),Z&&Qe(V,null,E,"mounted")},J),U&16&&!(p&&(p.innerHTML||p.textContent))){let A=C(x.firstChild,V,x,E,J,ee,he);for(;A;){dt=!0;const ue=A;A=A.nextSibling,l(ue)}}else U&8&&x.textContent!==V.children&&(dt=!0,x.textContent=V.children)}return x.nextSibling},C=(x,V,E,J,ee,he,D)=>{D=D||!!V.dynamicChildren;const p=V.children,ne=p.length;for(let U=0;U{const{slotScopeIds:D}=V;D&&(ee=ee?ee.concat(D):D);const p=i(x),ne=C(r(x),V,p,E,J,ee,he);return ne&&On(ne)&&ne.data==="]"?r(V.anchor=ne):(dt=!0,a(V.anchor=u("]"),p,ne),ne)},B=(x,V,E,J,ee,he)=>{if(dt=!0,V.el=null,he){const ne=se(x);for(;;){const U=r(x);if(U&&U!==ne)l(U);else break}}const D=r(x),p=i(x);return l(x),n(null,V,p,D,E,J,Nn(p),ee),D},se=x=>{let V=0;for(;x;)if(x=r(x),x&&On(x)&&(x.data==="["&&V++,x.data==="]")){if(V===0)return r(x);V--}return x};return[f,m]}const Me=Jr;function ba(e){return xa(e,ya)}function xa(e,t){const n=tl();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:u,setElementText:f,parentNode:m,nextSibling:g,setScopeId:C=Je,insertStaticContent:z}=e,B=(c,d,v,w=null,k=null,S=null,O=!1,L=null,M=!!d.dynamicChildren)=>{if(c===d)return;c&&!Mt(c,d)&&(w=Ft(c),Fe(c,k,S,!0),c=null),d.patchFlag===-2&&(M=!1,d.dynamicChildren=null);const{type:P,ref:W,shapeFlag:j}=d;switch(P){case en:se(c,d,v,w);break;case He:x(c,d,v,w);break;case Jt:c==null&&V(d,v,w,O);break;case oe:$(c,d,v,w,k,S,O,L,M);break;default:j&1?ee(c,d,v,w,k,S,O,L,M):j&6?I(c,d,v,w,k,S,O,L,M):(j&64||j&128)&&P.process(c,d,v,w,k,S,O,L,M,ct)}W!=null&&k&&Wn(W,c&&c.ref,S,d||c,!d)},se=(c,d,v,w)=>{if(c==null)s(d.el=l(d.children),v,w);else{const k=d.el=c.el;d.children!==c.children&&u(k,d.children)}},x=(c,d,v,w)=>{c==null?s(d.el=a(d.children||""),v,w):d.el=c.el},V=(c,d,v,w)=>{[c.el,c.anchor]=z(c.children,d,v,w,c.el,c.anchor)},E=({el:c,anchor:d},v,w)=>{let k;for(;c&&c!==d;)k=g(c),s(c,v,w),c=k;s(d,v,w)},J=({el:c,anchor:d})=>{let v;for(;c&&c!==d;)v=g(c),o(c),c=v;o(d)},ee=(c,d,v,w,k,S,O,L,M)=>{O=O||d.type==="svg",c==null?he(d,v,w,k,S,O,L,M):ne(c,d,k,S,O,L,M)},he=(c,d,v,w,k,S,O,L)=>{let M,P;const{type:W,props:j,shapeFlag:Y,transition:te,dirs:ae}=c;if(M=c.el=i(c.type,S,j&&j.is,j),Y&8?f(M,c.children):Y&16&&p(c.children,M,null,w,k,S&&W!=="foreignObject",O,L),ae&&Qe(c,null,w,"created"),j){for(const me in j)me!=="value"&&!un(me)&&r(M,me,null,j[me],S,c.children,w,k,Ke);"value"in j&&r(M,"value",null,j.value),(P=j.onVnodeBeforeMount)&&De(P,w,c)}D(M,c,c.scopeId,O,w),ae&&Qe(c,null,w,"beforeMount");const ve=(!k||k&&!k.pendingBranch)&&te&&!te.persisted;ve&&te.beforeEnter(M),s(M,d,v),((P=j&&j.onVnodeMounted)||ve||ae)&&Me(()=>{P&&De(P,w,c),ve&&te.enter(M),ae&&Qe(c,null,w,"mounted")},k)},D=(c,d,v,w,k)=>{if(v&&C(c,v),w)for(let S=0;S{for(let P=M;P{const L=d.el=c.el;let{patchFlag:M,dynamicChildren:P,dirs:W}=d;M|=c.patchFlag&16;const j=c.props||be,Y=d.props||be;let te;v&&St(v,!1),(te=Y.onVnodeBeforeUpdate)&&De(te,v,d,c),W&&Qe(d,c,v,"beforeUpdate"),v&&St(v,!0);const ae=k&&d.type!=="foreignObject";if(P?U(c.dynamicChildren,P,L,v,w,ae,S):O||le(c,d,L,null,v,w,ae,S,!1),M>0){if(M&16)Z(L,d,j,Y,v,w,k);else if(M&2&&j.class!==Y.class&&r(L,"class",null,Y.class,k),M&4&&r(L,"style",j.style,Y.style,k),M&8){const ve=d.dynamicProps;for(let me=0;me{te&&De(te,v,d,c),W&&Qe(d,c,v,"updated")},w)},U=(c,d,v,w,k,S,O)=>{for(let L=0;L{if(v!==w){if(v!==be)for(const L in v)!un(L)&&!(L in w)&&r(c,L,v[L],null,O,d.children,k,S,Ke);for(const L in w){if(un(L))continue;const M=w[L],P=v[L];M!==P&&L!=="value"&&r(c,L,P,M,O,d.children,k,S,Ke)}"value"in w&&r(c,"value",v.value,w.value)}},$=(c,d,v,w,k,S,O,L,M)=>{const P=d.el=c?c.el:l(""),W=d.anchor=c?c.anchor:l("");let{patchFlag:j,dynamicChildren:Y,slotScopeIds:te}=d;te&&(L=L?L.concat(te):te),c==null?(s(P,v,w),s(W,v,w),p(d.children,v,W,k,S,O,L,M)):j>0&&j&64&&Y&&c.dynamicChildren?(U(c.dynamicChildren,Y,v,k,S,O,L),(d.key!=null||k&&d===k.subTree)&&pi(c,d,!0)):le(c,d,v,W,k,S,O,L,M)},I=(c,d,v,w,k,S,O,L,M)=>{d.slotScopeIds=L,c==null?d.shapeFlag&512?k.ctx.activate(d,v,w,O,M):A(d,v,w,k,S,O,M):ue(c,d,M)},A=(c,d,v,w,k,S,O)=>{const L=c.component=Ta(c,w,k);if(us(c)&&(L.ctx.renderer=ct),Aa(L),L.asyncDep){if(k&&k.registerDep(L,F),!c.el){const M=L.subTree=N(He);x(null,M,d,v)}return}F(L,c,d,v,k,S,O)},ue=(c,d,v)=>{const w=d.component=c.component;if(Kl(c,d,v))if(w.asyncDep&&!w.asyncResolved){ie(w,d,v);return}else w.next=d,zl(w.update),w.update();else d.el=c.el,w.vnode=d},F=(c,d,v,w,k,S,O)=>{const L=()=>{if(c.isMounted){let{next:W,bu:j,u:Y,parent:te,vnode:ae}=c,ve=W,me;St(c,!1),W?(W.el=ae.el,ie(c,W,O)):W=ae,j&&bs(j),(me=W.props&&W.props.onVnodeBeforeUpdate)&&De(me,te,W,ae),St(c,!0);const we=xs(c),qe=c.subTree;c.subTree=we,B(qe,we,m(qe.el),Ft(qe),c,k,S),W.el=we.el,ve===null&&ql(c,we.el),Y&&Me(Y,k),(me=W.props&&W.props.onVnodeUpdated)&&Me(()=>De(me,te,W,ae),k)}else{let W;const{el:j,props:Y}=d,{bm:te,m:ae,parent:ve}=c,me=Gt(d);if(St(c,!1),te&&bs(te),!me&&(W=Y&&Y.onVnodeBeforeMount)&&De(W,ve,d),St(c,!0),j&&Ct){const we=()=>{c.subTree=xs(c),Ct(j,c.subTree,c,k,null)};me?d.type.__asyncLoader().then(()=>!c.isUnmounted&&we()):we()}else{const we=c.subTree=xs(c);B(null,we,v,w,c,k,S),d.el=we.el}if(ae&&Me(ae,k),!me&&(W=Y&&Y.onVnodeMounted)){const we=d;Me(()=>De(W,ve,we),k)}(d.shapeFlag&256||ve&&Gt(ve.vnode)&&ve.vnode.shapeFlag&256)&&c.a&&Me(c.a,k),c.isMounted=!0,d=v=w=null}},M=c.effect=new no(L,()=>uo(P),c.scope),P=c.update=()=>M.run();P.id=c.uid,St(c,!0),P()},ie=(c,d,v)=>{d.component=c;const w=c.vnode.props;c.vnode=d,c.next=null,ha(c,d.props,w,v),ma(c,d.children,v),sn(),Bo(),on()},le=(c,d,v,w,k,S,O,L,M=!1)=>{const P=c&&c.children,W=c?c.shapeFlag:0,j=d.children,{patchFlag:Y,shapeFlag:te}=d;if(Y>0){if(Y&128){Ie(P,j,v,w,k,S,O,L,M);return}else if(Y&256){Ve(P,j,v,w,k,S,O,L,M);return}}te&8?(W&16&&Ke(P,k,S),j!==P&&f(v,j)):W&16?te&16?Ie(P,j,v,w,k,S,O,L,M):Ke(P,k,S,!0):(W&8&&f(v,""),te&16&&p(j,v,w,k,S,O,L,M))},Ve=(c,d,v,w,k,S,O,L,M)=>{c=c||jt,d=d||jt;const P=c.length,W=d.length,j=Math.min(P,W);let Y;for(Y=0;YW?Ke(c,k,S,!0,!1,j):p(d,v,w,k,S,O,L,M,j)},Ie=(c,d,v,w,k,S,O,L,M)=>{let P=0;const W=d.length;let j=c.length-1,Y=W-1;for(;P<=j&&P<=Y;){const te=c[P],ae=d[P]=M?pt(d[P]):We(d[P]);if(Mt(te,ae))B(te,ae,v,null,k,S,O,L,M);else break;P++}for(;P<=j&&P<=Y;){const te=c[j],ae=d[Y]=M?pt(d[Y]):We(d[Y]);if(Mt(te,ae))B(te,ae,v,null,k,S,O,L,M);else break;j--,Y--}if(P>j){if(P<=Y){const te=Y+1,ae=teY)for(;P<=j;)Fe(c[P],k,S,!0),P++;else{const te=P,ae=P,ve=new Map;for(P=ae;P<=Y;P++){const Ne=d[P]=M?pt(d[P]):We(d[P]);Ne.key!=null&&ve.set(Ne.key,P)}let me,we=0;const qe=Y-ae+1;let Rt=!1,So=0;const ln=new Array(qe);for(P=0;P=qe){Fe(Ne,k,S,!0);continue}let Xe;if(Ne.key!=null)Xe=ve.get(Ne.key);else for(me=ae;me<=Y;me++)if(ln[me-ae]===0&&Mt(Ne,d[me])){Xe=me;break}Xe===void 0?Fe(Ne,k,S,!0):(ln[Xe-ae]=P+1,Xe>=So?So=Xe:Rt=!0,B(Ne,d[Xe],v,null,k,S,O,L,M),we++)}const Lo=Rt?wa(ln):jt;for(me=Lo.length-1,P=qe-1;P>=0;P--){const Ne=ae+P,Xe=d[Ne],Eo=Ne+1{const{el:S,type:O,transition:L,children:M,shapeFlag:P}=c;if(P&6){je(c.component.subTree,d,v,w);return}if(P&128){c.suspense.move(d,v,w);return}if(P&64){O.move(c,d,v,ct);return}if(O===oe){s(S,d,v);for(let j=0;jL.enter(S),k);else{const{leave:j,delayLeave:Y,afterLeave:te}=L,ae=()=>s(S,d,v),ve=()=>{j(S,()=>{ae(),te&&te()})};Y?Y(S,ae,ve):ve()}else s(S,d,v)},Fe=(c,d,v,w=!1,k=!1)=>{const{type:S,props:O,ref:L,children:M,dynamicChildren:P,shapeFlag:W,patchFlag:j,dirs:Y}=c;if(L!=null&&Wn(L,null,v,c,!0),W&256){d.ctx.deactivate(c);return}const te=W&1&&Y,ae=!Gt(c);let ve;if(ae&&(ve=O&&O.onVnodeBeforeUnmount)&&De(ve,d,c),W&6)$t(c.component,v,w);else{if(W&128){c.suspense.unmount(v,w);return}te&&Qe(c,null,d,"beforeUnmount"),W&64?c.type.remove(c,d,v,k,ct,w):P&&(S!==oe||j>0&&j&64)?Ke(P,d,v,!1,!0):(S===oe&&j&384||!k&&W&16)&&Ke(M,d,v),w&&Ln(c)}(ae&&(ve=O&&O.onVnodeUnmounted)||te)&&Me(()=>{ve&&De(ve,d,c),te&&Qe(c,null,d,"unmounted")},v)},Ln=c=>{const{type:d,el:v,anchor:w,transition:k}=c;if(d===oe){gs(v,w);return}if(d===Jt){J(c);return}const S=()=>{o(v),k&&!k.persisted&&k.afterLeave&&k.afterLeave()};if(c.shapeFlag&1&&k&&!k.persisted){const{leave:O,delayLeave:L}=k,M=()=>O(v,S);L?L(c.el,S,M):M()}else S()},gs=(c,d)=>{let v;for(;c!==d;)v=g(c),o(c),c=v;o(d)},$t=(c,d,v)=>{const{bum:w,scope:k,update:S,subTree:O,um:L}=c;w&&bs(w),k.stop(),S&&(S.active=!1,Fe(O,c,d,v)),L&&Me(L,d),Me(()=>{c.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&c.asyncDep&&!c.asyncResolved&&c.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Ke=(c,d,v,w=!1,k=!1,S=0)=>{for(let O=S;Oc.shapeFlag&6?Ft(c.component.subTree):c.shapeFlag&128?c.suspense.next():g(c.anchor||c.el),Pt=(c,d,v)=>{c==null?d._vnode&&Fe(d._vnode,null,null,!0):B(d._vnode||null,c,d,null,null,null,v),Bo(),jn(),d._vnode=c},ct={p:B,um:Fe,m:je,r:Ln,mt:A,mc:p,pc:le,pbc:U,n:Ft,o:e};let rn,Ct;return t&&([rn,Ct]=t(ct)),{render:Pt,hydrate:rn,createApp:ga(Pt,rn)}}function St({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function pi(e,t,n=!1){const s=e.children,o=t.children;if(Q(s)&&Q(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}const ka=e=>e.__isTeleport,oe=Symbol(void 0),en=Symbol(void 0),He=Symbol(void 0),Jt=Symbol(void 0),hn=[];let Ge=null;function h(e=!1){hn.push(Ge=e?null:[])}function $a(){hn.pop(),Ge=hn[hn.length-1]||null}let xn=1;function Yo(e){xn+=e}function _i(e){return e.dynamicChildren=xn>0?Ge||jt:null,$a(),xn>0&&Ge&&Ge.push(e),e}function y(e,t,n,s,o,r){return _i(b(e,t,n,s,o,r,!0))}function X(e,t,n,s,o){return _i(N(e,t,n,s,o,!0))}function Yn(e){return e?e.__v_isVNode===!0:!1}function Mt(e,t){return e.type===t.type&&e.key===t.key}const fs="__vInternal",mi=({key:e})=>e??null,zn=({ref:e,ref_key:t,ref_for:n})=>e!=null?xe(e)||Se(e)||re(e)?{i:Le,r:e,k:t,f:!!n}:e:null;function b(e,t=null,n=null,s=0,o=null,r=e===oe?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&mi(t),ref:t&&zn(t),scopeId:as,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Le};return l?(mo(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=xe(n)?8:16),xn>0&&!i&&Ge&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&Ge.push(a),a}const N=Pa;function Pa(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===oi)&&(e=He),Yn(e)){const l=bt(e,t,!0);return n&&mo(l,n),xn>0&&!r&&Ge&&(l.shapeFlag&6?Ge[Ge.indexOf(e)]=l:Ge.push(l)),l.patchFlag|=-2,l}if(Na(e)&&(e=e.__vccOpts),t){t=Ca(t);let{class:l,style:a}=t;l&&!xe(l)&&(t.class=ge(l)),ye(a)&&(Fr(a)&&!Q(a)&&(a=Pe({},a)),t.style=Qn(a))}const i=xe(e)?1:Wl(e)?128:ka(e)?64:ye(e)?4:re(e)?2:0;return b(e,t,n,s,o,i,r,!0)}function Ca(e){return e?Fr(e)||fs in e?Pe({},e):e:null}function bt(e,t,n=!1){const{props:s,ref:o,patchFlag:r,children:i}=e,l=t?Fn(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&mi(l),ref:t&&t.ref?n&&o?Q(o)?o.concat(zn(t)):[o,zn(t)]:zn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==oe?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&bt(e.ssContent),ssFallback:e.ssFallback&&bt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx}}function Ee(e=" ",t=0){return N(en,null,e,t)}function Sa(e,t){const n=N(Jt,null,e);return n.staticCount=t,n}function q(e="",t=!1){return t?(h(),X(He,null,e)):N(He,null,e)}function We(e){return e==null||typeof e=="boolean"?N(He):Q(e)?N(oe,null,e.slice()):typeof e=="object"?pt(e):N(en,null,String(e))}function pt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:bt(e)}function mo(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(Q(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),mo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(fs in t)?t._ctx=Le:o===3&&Le&&(Le.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else re(t)?(t={default:t,_ctx:Le},n=32):(t=String(t),s&64?(n=16,t=[Ee(t)]):n=8);e.children=t,e.shapeFlag|=n}function Fn(...e){const t={};for(let n=0;nke||Le,tn=e=>{ke=e,e.scope.on()},Ht=()=>{ke&&ke.scope.off(),ke=null};function vi(e){return e.vnode.shapeFlag&4}let wn=!1;function Aa(e,t=!1){wn=t;const{props:n,children:s}=e.vnode,o=vi(e);fa(e,n,o,t),_a(e,s);const r=o?Va(e,t):void 0;return wn=!1,r}function Va(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=dn(new Proxy(e.ctx,ia));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?yi(e):null;tn(e),sn();const r=vt(s,e,0,[e.props,o]);if(on(),Ht(),Sr(r)){if(r.then(Ht,Ht),t)return r.then(i=>{Go(e,i,t)}).catch(i=>{rs(i,e,0)});e.asyncDep=r}else Go(e,r,t)}else gi(e,t)}function Go(e,t,n){re(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ye(t)&&(e.setupState=jr(t)),gi(e,n)}let Jo;function gi(e,t,n){const s=e.type;if(!e.render){if(!t&&Jo&&!s.render){const o=s.template||po(e).template;if(o){const{isCustomElement:r,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:a}=s,u=Pe(Pe({isCustomElement:r,delimiters:l},i),a);s.render=Jo(o,u)}}e.render=s.render||Je}tn(e),sn(),la(e),on(),Ht()}function Ma(e){return new Proxy(e.attrs,{get(t,n){return Be(e,"get","$attrs"),t[n]}})}function yi(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=Ma(e))},slots:e.slots,emit:e.emit,expose:t}}function vo(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(jr(dn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in fn)return fn[n](e)},has(t,n){return n in t||n in fn}}))}function Ia(e,t=!0){return re(e)?e.displayName||e.name:e.name||t&&e.__name}function Na(e){return re(e)&&"__vccOpts"in e}const G=(e,t)=>Ol(e,t,wn);function Oa(){return Ha().slots}function Ha(){const e=hs();return e.setupContext||(e.setupContext=yi(e))}function Gn(e,t,n){const s=arguments.length;return s===2?ye(t)&&!Q(t)?Yn(t)?N(e,null,[t]):N(e,t):N(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Yn(n)&&(n=[n]),N(e,t,n))}const Ba=Symbol(""),za=()=>Ze(Ba),Fa="3.2.45",Ra="http://www.w3.org/2000/svg",It=typeof document<"u"?document:null,Zo=It&&It.createElement("template"),Da={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t?It.createElementNS(Ra,e):It.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>It.createTextNode(e),createComment:e=>It.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>It.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Zo.innerHTML=s?`${e}`:e;const l=Zo.content;if(s){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Ua(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function ja(e,t,n){const s=e.style,o=xe(n);if(n&&!o){for(const r in n)Rs(s,r,n[r]);if(t&&!xe(t))for(const r in t)n[r]==null&&Rs(s,r,"")}else{const r=s.display;o?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=r)}}const Xo=/\s*!important$/;function Rs(e,t,n){if(Q(n))n.forEach(s=>Rs(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ka(e,t);Xo.test(n)?e.setProperty(nn(s),n.replace(Xo,""),"important"):e[s]=n}}const Qo=["Webkit","Moz","ms"],$s={};function Ka(e,t){const n=$s[t];if(n)return n;let s=nt(t);if(s!=="filter"&&s in e)return $s[t]=s;s=ns(s);for(let o=0;oPs||(Xa.then(()=>Ps=0),Ps=Date.now());function ec(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ue(tc(s,n.value),t,5,[s])};return n.value=e,n.attached=Qa(),n}function tc(e,t){if(Q(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const nr=/^on[a-z]/,nc=(e,t,n,s,o=!1,r,i,l,a)=>{t==="class"?Ua(e,s,o):t==="style"?ja(e,n,s):Pn(t)?Js(t)||Ja(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):sc(e,t,s,o))?Wa(e,t,s,r,i,l,a):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),qa(e,t,s,o))};function sc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&nr.test(t)&&re(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||nr.test(t)&&xe(n)?!1:t in e}function oc(e){const t=hs();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(r=>Us(r,o))},s=()=>{const o=e(t.proxy);Ds(t.subTree,o),n(o)};Zr(s),ze(()=>{const o=new MutationObserver(s);o.observe(t.subTree.el.parentNode,{childList:!0}),xt(()=>o.disconnect())})}function Ds(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Ds(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Us(e.el,t);else if(e.type===oe)e.children.forEach(n=>Ds(n,t));else if(e.type===Jt){let{el:n,anchor:s}=e;for(;n&&(Us(n,t),n!==s);)n=n.nextSibling}}function Us(e,t){if(e.nodeType===1){const n=e.style;for(const s in t)n.setProperty(`--${s}`,t[s])}}const ft="transition",an="animation",ps=(e,{slots:t})=>Gn(Qr,rc(e),t);ps.displayName="Transition";const bi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ps.props=Pe({},Qr.props,bi);const Lt=(e,t=[])=>{Q(e)?e.forEach(n=>n(...t)):e&&e(...t)},sr=e=>e?Q(e)?e.some(t=>t.length>1):e.length>1:!1;function rc(e){const t={};for(const $ in e)$ in bi||(t[$]=e[$]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:u=i,appearToClass:f=l,leaveFromClass:m=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:C=`${n}-leave-to`}=e,z=ic(o),B=z&&z[0],se=z&&z[1],{onBeforeEnter:x,onEnter:V,onEnterCancelled:E,onLeave:J,onLeaveCancelled:ee,onBeforeAppear:he=x,onAppear:D=V,onAppearCancelled:p=E}=t,ne=($,I,A)=>{Et($,I?f:l),Et($,I?u:i),A&&A()},U=($,I)=>{$._isLeaving=!1,Et($,m),Et($,C),Et($,g),I&&I()},Z=$=>(I,A)=>{const ue=$?D:V,F=()=>ne(I,$,A);Lt(ue,[I,F]),or(()=>{Et(I,$?a:r),ht(I,$?f:l),sr(ue)||rr(I,s,B,F)})};return Pe(t,{onBeforeEnter($){Lt(x,[$]),ht($,r),ht($,i)},onBeforeAppear($){Lt(he,[$]),ht($,a),ht($,u)},onEnter:Z(!1),onAppear:Z(!0),onLeave($,I){$._isLeaving=!0;const A=()=>U($,I);ht($,m),cc(),ht($,g),or(()=>{$._isLeaving&&(Et($,m),ht($,C),sr(J)||rr($,s,se,A))}),Lt(J,[$,A])},onEnterCancelled($){ne($,!1),Lt(E,[$])},onAppearCancelled($){ne($,!0),Lt(p,[$])},onLeaveCancelled($){U($),Lt(ee,[$])}})}function ic(e){if(e==null)return null;if(ye(e))return[Cs(e.enter),Cs(e.leave)];{const t=Cs(e);return[t,t]}}function Cs(e){return eo(e)}function ht(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Et(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function or(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let lc=0;function rr(e,t,n,s){const o=e._endId=++lc,r=()=>{o===e._endId&&s()};if(n)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=ac(e,t);if(!i)return s();const u=i+"end";let f=0;const m=()=>{e.removeEventListener(u,g),r()},g=C=>{C.target===e&&++f>=a&&m()};setTimeout(()=>{f(n[z]||"").split(", "),o=s(`${ft}Delay`),r=s(`${ft}Duration`),i=ir(o,r),l=s(`${an}Delay`),a=s(`${an}Duration`),u=ir(l,a);let f=null,m=0,g=0;t===ft?i>0&&(f=ft,m=i,g=r.length):t===an?u>0&&(f=an,m=u,g=a.length):(m=Math.max(i,u),f=m>0?i>u?ft:an:null,g=f?f===ft?r.length:a.length:0);const C=f===ft&&/\b(transform|all)(,|$)/.test(s(`${ft}Property`).toString());return{type:f,timeout:m,propCount:g,hasTransform:C}}function ir(e,t){for(;e.lengthlr(n)+lr(e[s])))}function lr(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function cc(){return document.body.offsetHeight}const uc=["ctrl","shift","alt","meta"],dc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>uc.some(n=>e[`${n}Key`]&&!t.includes(n))},fc=(e,t)=>(n,...s)=>{for(let o=0;o{const t=pc().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=mc(s);if(o)return n(o,!0,o instanceof SVGElement)},t};function mc(e){return xe(e)?document.querySelector(e):e}const R=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},vc="modulepreload",gc=function(e){return"/"+e},cr={},yc=function(t,n,s){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(r=>{if(r=gc(r),r in cr)return;cr[r]=!0;const i=r.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!s)for(let f=o.length-1;f>=0;f--){const m=o[f];if(m.href===r&&(!i||m.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${r}"]${l}`))return;const u=document.createElement("link");if(u.rel=i?"stylesheet":vc,i||(u.as="script",u.crossOrigin=""),u.href=r,document.head.appendChild(u),i)return new Promise((f,m)=>{u.addEventListener("load",f),u.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${r}`)))})})).then(()=>t())};const bc=K({__name:"VPBadge",props:{text:null,type:null},setup(e){return(t,n)=>(h(),y("span",{class:ge(["VPBadge",e.type??"tip"])},[T(t.$slots,"default",{},()=>[Ee(ce(e.text),1)],!0)],2))}});const xc=R(bc,[["__scopeId","data-v-db439330"]]),wc=JSON.parse('{"lang":"en-US","dir":"ltr","title":"ZiuChen","description":"Unlimited Progress.","base":"/","head":[],"appearance":true,"themeConfig":{"logo":"/logo.png","nav":[{"text":"首页","link":"/"},{"text":"我的项目","items":[{"text":"超级剪贴板","link":"/project/ClipboardManager/"},{"text":"超级分词","link":"/project/SmartWordBreak/"}]},{"text":"开源作品","items":[{"text":"个人作品","link":"/works/opensource"},{"text":"社区贡献","link":"/works/contribution"}]},{"text":"学习笔记","items":[{"text":"JavaScript基础","link":"/note/JavaScript"},{"text":"CSS基础","link":"/note/CSS"},{"text":"JavaScript进阶","link":"/note/JavaScriptEnhanced"}]},{"text":"文章创作","link":"/article/一文读懂伪类与伪元素"},{"text":"个人介绍","link":"/self/"}],"sidebar":[{"text":"我的项目","collapsible":true,"items":[{"text":"超级剪贴板","link":"/project/ClipboardManager/"},{"text":"超级分词","link":"/project/SmartWordBreak/"}]},{"text":"开源作品","collapsible":true,"items":[{"text":"个人作品","link":"/works/opensource"},{"text":"社区贡献","link":"/works/contribution"}]},{"text":"文章创作","collapsible":true,"items":[{"text":"【2023】青训营 - 前端练习题汇总解析","link":"/article/【2023】青训营 - 前端练习题汇总解析"},{"text":"一文读懂事件冒泡与事件捕获","link":"/article/一文读懂事件冒泡与事件捕获"},{"text":"一文读懂伪类与伪元素","link":"/article/一文读懂伪类与伪元素"},{"text":"一文读懂函数中this指向问题","link":"/article/一文读懂函数中this指向问题"},{"text":"从0实现一个年度报告","link":"/article/从0实现一个年度报告"},{"text":"彻底搞懂对象的数据属性描述符、存储属性描述符","link":"/article/彻底搞懂对象的数据属性描述符、存储属性描述符"},{"text":"深入Vue3源码,看看Vue.use后究竟发生了什么?","link":"/article/深入Vue3源码,看看Vue.use后究竟发生了什么?"},{"text":"深入理解Proxy与Reflect","link":"/article/深入理解Proxy与Reflect"},{"text":"深入理解浏览器缓存机制","link":"/article/深入理解浏览器缓存机制"},{"text":"深入理解浏览器运行原理","link":"/article/深入理解浏览器运行原理"}]},{"text":"学习笔记","collapsible":true,"items":[{"text":"JavaScript基础","link":"/note/JavaScript"},{"text":"CSS基础","link":"/note/CSS"},{"text":"JavaScript进阶","link":"/note/JavaScriptEnhanced"}]}],"socialLinks":[{"icon":"github","link":"https://ziuchen.github.io/"},{"icon":{"svg":""},"link":"https://juejin.cn/user/1887205216238477"}],"editLink":{"pattern":"https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/:path","text":"Edit this page on GitHub"},"footer":{"message":"Released under the MIT License.","copyright":"Copyright © 2019-present Ziu Chen"},"lastUpdatedText":"Updated Date"},"locales":{},"scrollOffset":90,"cleanUrls":false}'),_s=/^[a-z]+:/i,kc=/^pathname:\/\//,ur="vitepress-theme-appearance",xi=/#.*$/,$c=/(index)?\.(md|html)$/,$e=typeof document<"u",wi={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0};function zt(e,t,n=!1){if(t===void 0)return!1;if(e=dr(`/${e}`),n)return new RegExp(t).test(e);if(dr(t)!==e)return!1;const s=t.match(xi);return s?($e?location.hash:"")===s[0]:!0}function dr(e){return decodeURI(e).replace(xi,"").replace($c,"")}function ki(e){return _s.test(e)}function Pc(e,t){var s,o,r,i,l,a,u;const n=Object.keys(e.locales).find(f=>f!=="root"&&!ki(f)&&zt(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((o=e.locales[n])==null?void 0:o.dir)??e.dir,title:((r=e.locales[n])==null?void 0:r.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Pi(e.head,((a=e.locales[n])==null?void 0:a.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function $i(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const o=Cc(e.title,s);return`${n}${o}`}function Cc(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Sc(e,t){const[n,s]=t;if(n!=="meta")return!1;const o=Object.entries(s)[0];return o==null?!1:e.some(([r,i])=>r===n&&i[o[0]]===o[1])}function Pi(e,t){return[...e.filter(n=>!Sc(t,n)),...t]}const Lc=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Ec=/^[a-z]:/i;function fr(e){const t=Ec.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Lc,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Ci=Symbol(),_t=Vl(wc);function Tc(e){const t=G(()=>Pc(_t.value,e.data.relativePath));return{site:t,theme:G(()=>t.value.themeConfig),page:G(()=>e.data),frontmatter:G(()=>e.data.frontmatter),lang:G(()=>t.value.lang),dir:G(()=>t.value.dir),localeIndex:G(()=>t.value.localeIndex||"root"),title:G(()=>$i(t.value,e.data)),description:G(()=>e.data.description||t.value.description),isDark:pe(!1)}}function Si(){const e=Ze(Ci);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ac(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function kn(e){return _s.test(e)||e.startsWith(".")?e:Ac(_t.value.base,e)}function Li(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),$e){const n="/";t=fr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${fr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}const Ei=Symbol(),hr="http://a.com",Vc=()=>({path:"/",component:null,data:wi});function Mc(e,t){const n=os(Vc()),s={route:n,go:o};async function o(l=$e?location.href:"/"){var u,f;await((u=s.onBeforeRouteChange)==null?void 0:u.call(s,l));const a=new URL(l,hr);_t.value.cleanUrls||!a.pathname.endsWith("/")&&!a.pathname.endsWith(".html")&&(a.pathname+=".html",l=a.pathname+a.search+a.hash),$e&&l!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await i(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l))}let r=null;async function i(l,a=0,u=!1){const f=new URL(l,hr),m=r=f.pathname;try{let g=await e(m);if(r===m){r=null;const{default:C,__pageData:z}=g;if(!C)throw new Error(`Invalid route component: ${C}`);n.path=$e?m:kn(m),n.component=dn(C),n.data=dn(z),$e&&is(()=>{let B=_t.value.base+z.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!_t.value.cleanUrls&&!B.endsWith("/")&&(B+=".html"),B!==f.pathname&&(f.pathname=B,l=B+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!a){let se=null;try{se=document.querySelector(decodeURIComponent(f.hash))}catch(x){console.warn(x)}if(se){pr(se,f.hash);return}}window.scrollTo(0,a)})}}catch(g){if(!/fetch/.test(g.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(g),!u)try{const C=await fetch(_t.value.base+"hashmap.json");window.__VP_HASH_MAP__=await C.json(),await i(l,a,!0);return}catch{}r===m&&(r=null,n.path=$e?m:kn(m),n.component=t?dn(t):null,n.data=wi)}}return $e&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const u=l.target.closest("a");if(u&&!u.closest(".vp-raw")&&!u.download){const{href:f,origin:m,pathname:g,hash:C,search:z,target:B}=u,se=window.location,x=g.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&B!=="_blank"&&m===se.origin&&!(x&&x[0]!==".html")&&(l.preventDefault(),g===se.pathname&&z===se.search?C&&C!==se.hash&&(history.pushState(null,"",C),window.dispatchEvent(new Event("hashchange")),pr(u,C,u.classList.contains("header-anchor"))):o(f))}},{capture:!0}),window.addEventListener("popstate",l=>{i(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function go(){const e=Ze(Ei);if(!e)throw new Error("useRouter() is called without provider.");return e}function wt(){return go().route}function pr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(o){console.warn(o)}if(s){let o=_t.value.scrollOffset;typeof o=="string"&&(o=document.querySelector(o).getBoundingClientRect().bottom+24);const r=parseInt(window.getComputedStyle(s).paddingTop,10),i=window.scrollY+s.getBoundingClientRect().top-o+r;!n||Math.abs(i-window.scrollY)>window.innerHeight?window.scrollTo(0,i):window.scrollTo({left:0,top:i,behavior:"smooth"})}}const Ic=K({name:"VitePressContent",props:{onContentUpdated:Function},setup(e){const t=wt();return fo(()=>{var n;(n=e.onContentUpdated)==null||n.call(e)}),()=>Gn("div",{style:{position:"relative"}},[t.component?Gn(t.component):null])}}),_e=Si;var _r;const Cn=typeof window<"u",Nc=e=>typeof e=="string",Oc=()=>{};Cn&&((_r=window==null?void 0:window.navigator)!=null&&_r.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Hc(e){return typeof e=="function"?e():_(e)}function Bc(e){return e}function Ti(e){return ol()?(rl(e),!0):!1}function zc(e){return typeof e=="function"?G(e):pe(e)}function Fc(e,t=!0){hs()?ze(e):t?e():is(e)}function Rc(e){var t;const n=Hc(e);return(t=n==null?void 0:n.$el)!=null?t:n}const yo=Cn?window:void 0;Cn&&window.document;Cn&&window.navigator;Cn&&window.location;function Dc(...e){let t,n,s,o;if(Nc(e[0])||Array.isArray(e[0])?([n,s,o]=e,t=yo):[t,n,s,o]=e,!t)return Oc;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const r=[],i=()=>{r.forEach(f=>f()),r.length=0},l=(f,m,g)=>(f.addEventListener(m,g,o),()=>f.removeEventListener(m,g,o)),a=tt(()=>Rc(t),f=>{i(),f&&r.push(...n.flatMap(m=>s.map(g=>l(f,m,g))))},{immediate:!0,flush:"post"}),u=()=>{a(),i()};return Ti(u),u}function Uc(e,t=!1){const n=pe(),s=()=>n.value=Boolean(e());return s(),Fc(s,t),n}function js(e,t={}){const{window:n=yo}=t,s=Uc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const r=pe(!1),i=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",l):o.removeListener(l))},l=()=>{s.value&&(i(),o=n.matchMedia(zc(e).value),r.value=o.matches,"addEventListener"in o?o.addEventListener("change",l):o.addListener(l))};return yt(l),Ti(()=>i()),r}const Ks=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},qs="__vueuse_ssr_handlers__";Ks[qs]=Ks[qs]||{};Ks[qs];var mr;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(mr||(mr={}));var jc=Object.defineProperty,vr=Object.getOwnPropertySymbols,Kc=Object.prototype.hasOwnProperty,qc=Object.prototype.propertyIsEnumerable,gr=(e,t,n)=>t in e?jc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Wc=(e,t)=>{for(var n in t||(t={}))Kc.call(t,n)&&gr(e,n,t[n]);if(vr)for(var n of vr(t))qc.call(t,n)&&gr(e,n,t[n]);return e};const Yc={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};Wc({linear:Bc},Yc);function Gc({window:e=yo}={}){if(!e)return{x:pe(0),y:pe(0)};const t=pe(e.pageXOffset),n=pe(e.pageYOffset);return Dc(e,"scroll",()=>{t.value=e.pageXOffset,n.value=e.pageYOffset},{capture:!1,passive:!0}),{x:t,y:n}}function Jc(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),s=!0,setTimeout(()=>{s=!1},t))}}function Ws(e){return/^\//.test(e)?e:`/${e}`}function $n(e){if(ki(e))return e.replace(kc,"");const{site:t}=_e(),{pathname:n,search:s,hash:o}=new URL(e,"http://example.com"),r=n.endsWith("/")||n.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,t.value.cleanUrls?"":".html")}${s}${o}`);return kn(r)}function Ai(e,t){if(Array.isArray(e))return e;if(e==null)return[];t=Ws(t);const n=Object.keys(e).sort((s,o)=>o.split("/").length-s.split("/").length).find(s=>t.startsWith(Ws(s)));return n?e[n]:[]}function Zc(e){const t=[];let n=0;for(const s in e){const o=e[s];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function Xc(e){const t=[];function n(s){for(const o of s)o.text&&o.link&&t.push({text:o.text,link:o.link}),o.items&&n(o.items)}return n(e),t}function Ys(e,t){return Array.isArray(t)?t.some(n=>Ys(e,n)):zt(e,t.link)?!0:t.items?Ys(e,t.items):!1}function at(){const e=wt(),{theme:t,frontmatter:n}=_e(),s=js("(min-width: 960px)"),o=pe(!1),r=G(()=>{const C=t.value.sidebar,z=e.data.relativePath;return C?Ai(C,z):[]}),i=G(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),l=G(()=>n.value.layout!=="home"&&n.value.aside!==!1),a=G(()=>i.value&&s.value),u=G(()=>i.value?Zc(r.value):[]);function f(){o.value=!0}function m(){o.value=!1}function g(){o.value?m():f()}return{isOpen:o,sidebar:r,sidebarGroups:u,hasSidebar:i,hasAside:l,isSidebarEnabled:a,open:f,close:m,toggle:g}}function Qc(e,t){let n;yt(()=>{n=e.value?document.activeElement:void 0}),ze(()=>{window.addEventListener("keyup",s)}),xt(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function eu(e){const{page:t}=_e(),n=pe(!1),s=G(()=>!!e.value.collapsible),o=G(()=>!!e.value.link),r=G(()=>zt(t.value.relativePath,e.value.link)),i=G(()=>r.value?!0:e.value.items?Ys(t.value.relativePath,e.value.items):!1),l=G(()=>!!(e.value.items&&e.value.items.length));yt(()=>{n.value=!!(e.value.collapsible&&e.value.collapsed)}),yt(()=>{(r.value||i.value)&&(n.value=!1)});function a(){e.value.collapsible&&(n.value=!n.value)}return{collapsed:n,collapsible:s,isLink:o,isActiveLink:r,hasActiveLink:i,hasChildren:l,toggle:a}}const tu=K({__name:"VPSkipLink",setup(e){const t=wt(),n=pe();tt(()=>t.path,()=>n.value.focus());function s({target:o}){const r=document.querySelector(o.hash);if(r){const i=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",i)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",i),r.focus(),window.scrollTo(0,0)}}return(o,r)=>(h(),y(oe,null,[b("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),b("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const nu=R(tu,[["__scopeId","data-v-4510101b"]]),su={key:0,class:"VPBackdrop"},ou=K({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(h(),X(ps,{name:"fade"},{default:H(()=>[e.show?(h(),y("div",su)):q("",!0)]),_:1}))}});const ru=R(ou,[["__scopeId","data-v-c976f692"]]);function iu(){const e=pe(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=wt();return tt(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}function Sn({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:n,localeIndex:s,page:o,theme:r}=_e(),i=G(()=>{var a,u;return{label:(a=n.value.locales[s.value])==null?void 0:a.label,link:((u=n.value.locales[s.value])==null?void 0:u.link)||(s.value==="root"?"/":`/${s.value}/`)}});return{localeLinks:G(()=>Object.entries(n.value.locales).flatMap(([a,u])=>e&&i.value.label===u.label?[]:{text:u.label,link:lu(u.link||(a==="root"?"/":`/${a}/`),r.value.i18nRouting!==!1&&t,o.value.relativePath.slice(i.value.link.length-1),!n.value.cleanUrls)})),currentLang:i}}function lu(e,t,n,s){return t?e.replace(/\/$/,"")+Ws(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,s?".html":"")):e}const au=["src","alt"],cu={inheritAttrs:!1},uu=K({...cu,__name:"VPImage",props:{image:null,alt:null},setup(e){return(t,n)=>{const s=Bt("VPImage",!0);return e.image?(h(),y(oe,{key:0},[typeof e.image=="string"||"src"in e.image?(h(),y("img",Fn({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:_(kn)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,au)):(h(),y(oe,{key:1},[N(s,Fn({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),N(s,Fn({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):q("",!0)}}});const bo=R(uu,[["__scopeId","data-v-079e60c3"]]),du=["href"],fu=K({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=_e(),{hasSidebar:s}=at(),{currentLang:o}=Sn();return(r,i)=>(h(),y("div",{class:ge(["VPNavBarTitle",{"has-sidebar":_(s)}])},[b("a",{class:"title",href:_($n)(_(o).link)},[T(r.$slots,"nav-bar-title-before",{},void 0,!0),_(n).logo?(h(),X(bo,{key:0,class:"logo",image:_(n).logo},null,8,["image"])):q("",!0),_(n).siteTitle?(h(),y(oe,{key:1},[Ee(ce(_(n).siteTitle),1)],64)):_(n).siteTitle===void 0?(h(),y(oe,{key:2},[Ee(ce(_(t).title),1)],64)):q("",!0),T(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,du)],2))}});const hu=R(fu,[["__scopeId","data-v-549de4de"]]);const pu={key:0,class:"VPNavBarSearch"},_u={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},mu={class:"DocSearch-Button-Container"},vu=b("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},[b("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),gu={class:"DocSearch-Button-Placeholder"},yu=b("span",{class:"DocSearch-Button-Keys"},[b("kbd",{class:"DocSearch-Button-Key"}),b("kbd",{class:"DocSearch-Button-Key"},"K")],-1),bu=K({__name:"VPNavBarSearch",setup(e){oc(u=>({"1163dab0":r.value}));const t=()=>null,{theme:n,localeIndex:s}=_e(),o=pe(!1),r=pe("'Meta'"),i=G(()=>{var u,f,m,g,C,z,B,se;return((C=(g=(m=(f=(u=n.value.algolia)==null?void 0:u.locales)==null?void 0:f[s.value])==null?void 0:m.translations)==null?void 0:g.button)==null?void 0:C.buttonText)||((se=(B=(z=n.value.algolia)==null?void 0:z.translations)==null?void 0:B.button)==null?void 0:se.buttonText)||"Search"});ze(()=>{if(!n.value.algolia)return;r.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'";const u=m=>{m.key==="k"&&(m.ctrlKey||m.metaKey)&&(m.preventDefault(),l(),f())},f=()=>{window.removeEventListener("keydown",u)};window.addEventListener("keydown",u),xt(f)});function l(){o.value||(o.value=!0,setTimeout(a,16))}function a(){const u=new Event("keydown");u.key="k",u.metaKey=!0,window.dispatchEvent(u),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||a()},16)}return(u,f)=>_(n).algolia?(h(),y("div",pu,[o.value?(h(),X(_(t),{key:0,algolia:_(n).algolia},null,8,["algolia"])):(h(),y("div",{key:1,id:"docsearch",onClick:l},[b("button",_u,[b("span",mu,[vu,b("span",gu,ce(_(i)),1)]),yu])]))])):q("",!0)}});const xu={},wu={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},ku=b("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),$u=b("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),Pu=[ku,$u];function Cu(e,t){return h(),y("svg",wu,Pu)}const Su=R(xu,[["render",Cu]]),Lu=K({__name:"VPLink",props:{tag:null,href:null,noIcon:{type:Boolean}},setup(e){const t=e,n=G(()=>t.tag??t.href?"a":"span"),s=G(()=>t.href&&_s.test(t.href));return(o,r)=>(h(),X(bn(_(n)),{class:ge(["VPLink",{link:e.href}]),href:e.href?_($n)(e.href):void 0,target:_(s)?"_blank":void 0,rel:_(s)?"noreferrer":void 0},{default:H(()=>[T(o.$slots,"default",{},void 0,!0),_(s)&&!e.noIcon?(h(),X(Su,{key:0,class:"icon"})):q("",!0)]),_:3},8,["class","href","target","rel"]))}});const kt=R(Lu,[["__scopeId","data-v-857b9044"]]),Eu=K({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=_e();return(n,s)=>(h(),X(kt,{class:ge({VPNavBarMenuLink:!0,active:_(zt)(_(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,noIcon:!0},{default:H(()=>[Ee(ce(e.item.text),1)]),_:1},8,["class","href"]))}});const Tu=R(Eu,[["__scopeId","data-v-b293d4cd"]]),xo=pe();let Vi=!1,Ls=0;function Au(e){const t=pe(!1);if($e){!Vi&&Vu(),Ls++;const n=tt(xo,s=>{var o,r,i;s===e.el.value||(o=e.el.value)!=null&&o.contains(s)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});xt(()=>{n(),Ls--,Ls||Mu()})}return io(t)}function Vu(){document.addEventListener("focusin",Mi),Vi=!0,xo.value=document.activeElement}function Mu(){document.removeEventListener("focusin",Mi)}function Mi(){xo.value=document.activeElement}const Iu={},Nu={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ou=b("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Hu=[Ou];function Bu(e,t){return h(),y("svg",Nu,Hu)}const Ii=R(Iu,[["render",Bu]]),zu={},Fu={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ru=b("circle",{cx:"12",cy:"12",r:"2"},null,-1),Du=b("circle",{cx:"19",cy:"12",r:"2"},null,-1),Uu=b("circle",{cx:"5",cy:"12",r:"2"},null,-1),ju=[Ru,Du,Uu];function Ku(e,t){return h(),y("svg",Fu,ju)}const qu=R(zu,[["render",Ku]]),Wu={class:"VPMenuLink"},Yu=K({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=_e();return(n,s)=>(h(),y("div",Wu,[N(kt,{class:ge({active:_(zt)(_(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link},{default:H(()=>[Ee(ce(e.item.text),1)]),_:1},8,["class","href"])]))}});const ms=R(Yu,[["__scopeId","data-v-4055455f"]]),Gu={class:"VPMenuGroup"},Ju={key:0,class:"title"},Zu=K({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(h(),y("div",Gu,[e.text?(h(),y("p",Ju,ce(e.text),1)):q("",!0),(h(!0),y(oe,null,Te(e.items,s=>(h(),y(oe,null,["link"in s?(h(),X(ms,{key:0,item:s},null,8,["item"])):q("",!0)],64))),256))]))}});const Xu=R(Zu,[["__scopeId","data-v-06e40d8f"]]),Qu={class:"VPMenu"},ed={key:0,class:"items"},td=K({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(h(),y("div",Qu,[e.items?(h(),y("div",ed,[(h(!0),y(oe,null,Te(e.items,s=>(h(),y(oe,{key:s.text},["link"in s?(h(),X(ms,{key:0,item:s},null,8,["item"])):(h(),X(Xu,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):q("",!0),T(t.$slots,"default",{},void 0,!0)]))}});const nd=R(td,[["__scopeId","data-v-5ba41aea"]]),sd=["aria-expanded","aria-label"],od={key:0,class:"text"},rd={class:"menu"},id=K({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=pe(!1),n=pe();Au({el:n,onBlur:s});function s(){t.value=!1}return(o,r)=>(h(),y("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=i=>t.value=!0),onMouseleave:r[2]||(r[2]=i=>t.value=!1)},[b("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=i=>t.value=!t.value)},[e.button||e.icon?(h(),y("span",od,[e.icon?(h(),X(bn(e.icon),{key:0,class:"option-icon"})):q("",!0),Ee(" "+ce(e.button)+" ",1),N(Ii,{class:"text-icon"})])):(h(),X(qu,{key:1,class:"icon"}))],8,sd),b("div",rd,[N(nd,{items:e.items},{default:H(()=>[T(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const wo=R(id,[["__scopeId","data-v-49ae13ed"]]),ld=K({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const{page:t}=_e();return(n,s)=>(h(),X(wo,{class:ge({VPNavBarMenuGroup:!0,active:_(zt)(_(t).relativePath,e.item.activeMatch,!!e.item.activeMatch)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ad=e=>(st("data-v-33721c64"),e=e(),ot(),e),cd={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},ud=ad(()=>b("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),dd=K({__name:"VPNavBarMenu",setup(e){const{theme:t}=_e();return(n,s)=>_(t).nav?(h(),y("nav",cd,[ud,(h(!0),y(oe,null,Te(_(t).nav,o=>(h(),y(oe,{key:o.text},["link"in o?(h(),X(Tu,{key:0,item:o},null,8,["item"])):(h(),X(ld,{key:1,item:o},null,8,["item"]))],64))),128))])):q("",!0)}});const fd=R(dd,[["__scopeId","data-v-33721c64"]]),hd={},pd={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_d=b("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),md=b("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),vd=[_d,md];function gd(e,t){return h(),y("svg",pd,vd)}const Ni=R(hd,[["render",gd]]),yd={class:"items"},bd={class:"title"},xd=K({__name:"VPNavBarTranslations",setup(e){const{localeLinks:t,currentLang:n}=Sn({correspondingLink:!0});return(s,o)=>_(t).length&&_(n).label?(h(),X(wo,{key:0,class:"VPNavBarTranslations",icon:Ni},{default:H(()=>[b("div",yd,[b("p",bd,ce(_(n).label),1),(h(!0),y(oe,null,Te(_(t),r=>(h(),X(ms,{key:r.link,item:r},null,8,["item"]))),128))])]),_:1})):q("",!0)}});const wd=R(xd,[["__scopeId","data-v-c624b2dc"]]);const kd={},$d={class:"VPSwitch",type:"button",role:"switch"},Pd={class:"check"},Cd={key:0,class:"icon"};function Sd(e,t){return h(),y("button",$d,[b("span",Pd,[e.$slots.default?(h(),y("span",Cd,[T(e.$slots,"default",{},void 0,!0)])):q("",!0)])])}const Ld=R(kd,[["render",Sd],["__scopeId","data-v-d161f211"]]),Ed={},Td={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ad=Sa('',9),Vd=[Ad];function Md(e,t){return h(),y("svg",Td,Vd)}const Id=R(Ed,[["render",Md]]),Nd={},Od={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Hd=b("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Bd=[Hd];function zd(e,t){return h(),y("svg",Od,Bd)}const Fd=R(Nd,[["render",zd]]),Rd=K({__name:"VPSwitchAppearance",setup(e){const{site:t,isDark:n}=_e(),s=pe(!1),o=typeof localStorage<"u"?r():()=>{};ze(()=>{s.value=document.documentElement.classList.contains("dark")});function r(){const i=window.matchMedia("(prefers-color-scheme: dark)"),l=document.documentElement.classList;let a=localStorage.getItem(ur),u=t.value.appearance==="dark"&&a==null||(a==="auto"||a==null?i.matches:a==="dark");i.onchange=g=>{a==="auto"&&m(u=g.matches)};function f(){m(u=!u),a=u?i.matches?"auto":"dark":i.matches?"light":"auto",localStorage.setItem(ur,a)}function m(g){const C=document.createElement("style");C.type="text/css",C.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { +function Gs(e,t){const n=Object.create(null),s=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}function Qn(e){if(Q(e)){const t={};for(let n=0;n{if(n){const s=n.split(ji);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ge(e){let t="";if(xe(e))t=e;else if(Q(e))for(let n=0;nxe(e)?e:e==null?"":Q(e)||ye(e)&&(e.toString===Lr||!re(e.toString))?JSON.stringify(e,Pr,2):String(e),Pr=(e,t)=>t&&t.__v_isRef?Pr(e,t.value):Kt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o])=>(n[`${s} =>`]=o,n),{})}:Cr(t)?{[`Set(${t.size})`]:[...t.values()]}:ye(t)&&!Q(t)&&!Er(t)?String(t):t,be={},jt=[],Je=()=>{},Gi=()=>!1,Ji=/^on[^a-z]/,Pn=e=>Ji.test(e),Js=e=>e.startsWith("onUpdate:"),Pe=Object.assign,Zs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Zi=Object.prototype.hasOwnProperty,de=(e,t)=>Zi.call(e,t),Q=Array.isArray,Kt=e=>es(e)==="[object Map]",Cr=e=>es(e)==="[object Set]",re=e=>typeof e=="function",xe=e=>typeof e=="string",Xs=e=>typeof e=="symbol",ye=e=>e!==null&&typeof e=="object",Sr=e=>ye(e)&&re(e.then)&&re(e.catch),Lr=Object.prototype.toString,es=e=>Lr.call(e),Xi=e=>es(e).slice(8,-1),Er=e=>es(e)==="[object Object]",Qs=e=>xe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,un=Gs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ts=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Qi=/-(\w)/g,nt=ts(e=>e.replace(Qi,(t,n)=>n?n.toUpperCase():"")),el=/\B([A-Z])/g,nn=ts(e=>e.replace(el,"-$1").toLowerCase()),ns=ts(e=>e.charAt(0).toUpperCase()+e.slice(1)),ys=ts(e=>e?`on${ns(e)}`:""),mn=(e,t)=>!Object.is(e,t),bs=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},eo=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let To;const tl=()=>To||(To=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Oe;class nl{constructor(t=!1){this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Oe,!t&&Oe&&(this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Oe;try{return Oe=this,t()}finally{Oe=n}}}on(){Oe=this}off(){Oe=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Tr=e=>(e.w>)>0,Ar=e=>(e.n>)>0,il=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=a)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":Q(e)?Qs(n)&&l.push(i.get("length")):(l.push(i.get(Ot)),Kt(e)&&l.push(i.get(Vs)));break;case"delete":Q(e)||(l.push(i.get(Ot)),Kt(e)&&l.push(i.get(Vs)));break;case"set":Kt(e)&&l.push(i.get(Ot));break}if(l.length===1)l[0]&&Ms(l[0]);else{const a=[];for(const u of l)u&&a.push(...u);Ms(to(a))}}function Ms(e,t){const n=Q(e)?e:[...e];for(const s of n)s.computed&&Vo(s);for(const s of n)s.computed||Vo(s)}function Vo(e,t){(e!==Ye||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const al=Gs("__proto__,__v_isRef,__isVue"),Ir=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xs)),cl=so(),ul=so(!1,!0),dl=so(!0),Mo=fl();function fl(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=fe(this);for(let r=0,i=this.length;r{e[t]=function(...n){sn();const s=fe(this)[t].apply(this,n);return on(),s}}),e}function so(e=!1,t=!1){return function(s,o,r){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&r===(e?t?Ll:Fr:t?Br:Hr).get(s))return s;const i=Q(s);if(!e&&i&&de(Mo,o))return Reflect.get(Mo,o,r);const l=Reflect.get(s,o,r);return(Xs(o)?Ir.has(o):al(o))||(e||Be(s,"get",o),t)?l:Se(l)?i&&Qs(o)?l:l.value:ye(l)?e?io(l):os(l):l}}const hl=Nr(),pl=Nr(!0);function Nr(e=!1){return function(n,s,o,r){let i=n[s];if(Qt(i)&&Se(i)&&!Se(o))return!1;if(!e&&(!Un(o)&&!Qt(o)&&(i=fe(i),o=fe(o)),!Q(n)&&Se(i)&&!Se(o)))return i.value=o,!0;const l=Q(n)&&Qs(s)?Number(s)e,ss=e=>Reflect.getPrototypeOf(e);function En(e,t,n=!1,s=!1){e=e.__v_raw;const o=fe(e),r=fe(t);n||(t!==r&&Be(o,"get",t),Be(o,"get",r));const{has:i}=ss(o),l=s?oo:n?ao:vn;if(i.call(o,t))return l(e.get(t));if(i.call(o,r))return l(e.get(r));e!==o&&e.get(t)}function Tn(e,t=!1){const n=this.__v_raw,s=fe(n),o=fe(e);return t||(e!==o&&Be(s,"has",e),Be(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function An(e,t=!1){return e=e.__v_raw,!t&&Be(fe(e),"iterate",Ot),Reflect.get(e,"size",e)}function Io(e){e=fe(e);const t=fe(this);return ss(t).has.call(t,e)||(t.add(e),it(t,"add",e,e)),this}function No(e,t){t=fe(t);const n=fe(this),{has:s,get:o}=ss(n);let r=s.call(n,e);r||(e=fe(e),r=s.call(n,e));const i=o.call(n,e);return n.set(e,t),r?mn(t,i)&&it(n,"set",e,t):it(n,"add",e,t),this}function Oo(e){const t=fe(this),{has:n,get:s}=ss(t);let o=n.call(t,e);o||(e=fe(e),o=n.call(t,e)),s&&s.call(t,e);const r=t.delete(e);return o&&it(t,"delete",e,void 0),r}function Ho(){const e=fe(this),t=e.size!==0,n=e.clear();return t&&it(e,"clear",void 0,void 0),n}function Vn(e,t){return function(s,o){const r=this,i=r.__v_raw,l=fe(i),a=t?oo:e?ao:vn;return!e&&Be(l,"iterate",Ot),i.forEach((u,f)=>s.call(o,a(u),a(f),r))}}function Mn(e,t,n){return function(...s){const o=this.__v_raw,r=fe(o),i=Kt(r),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,u=o[e](...s),f=n?oo:t?ao:vn;return!t&&Be(r,"iterate",a?Vs:Ot),{next(){const{value:m,done:g}=u.next();return g?{value:m,done:g}:{value:l?[f(m[0]),f(m[1])]:f(m),done:g}},[Symbol.iterator](){return this}}}}function ut(e){return function(...t){return e==="delete"?!1:this}}function bl(){const e={get(r){return En(this,r)},get size(){return An(this)},has:Tn,add:Io,set:No,delete:Oo,clear:Ho,forEach:Vn(!1,!1)},t={get(r){return En(this,r,!1,!0)},get size(){return An(this)},has:Tn,add:Io,set:No,delete:Oo,clear:Ho,forEach:Vn(!1,!0)},n={get(r){return En(this,r,!0)},get size(){return An(this,!0)},has(r){return Tn.call(this,r,!0)},add:ut("add"),set:ut("set"),delete:ut("delete"),clear:ut("clear"),forEach:Vn(!0,!1)},s={get(r){return En(this,r,!0,!0)},get size(){return An(this,!0)},has(r){return Tn.call(this,r,!0)},add:ut("add"),set:ut("set"),delete:ut("delete"),clear:ut("clear"),forEach:Vn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(r=>{e[r]=Mn(r,!1,!1),n[r]=Mn(r,!0,!1),t[r]=Mn(r,!1,!0),s[r]=Mn(r,!0,!0)}),[e,n,t,s]}const[xl,wl,kl,$l]=bl();function ro(e,t){const n=t?e?$l:kl:e?wl:xl;return(s,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(de(n,o)&&o in s?n:s,o,r)}const Pl={get:ro(!1,!1)},Cl={get:ro(!1,!0)},Sl={get:ro(!0,!1)},Hr=new WeakMap,Br=new WeakMap,Fr=new WeakMap,Ll=new WeakMap;function El(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Tl(e){return e.__v_skip||!Object.isExtensible(e)?0:El(Xi(e))}function os(e){return Qt(e)?e:lo(e,!1,Or,Pl,Hr)}function Al(e){return lo(e,!1,yl,Cl,Br)}function io(e){return lo(e,!0,gl,Sl,Fr)}function lo(e,t,n,s,o){if(!ye(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=o.get(e);if(r)return r;const i=Tl(e);if(i===0)return e;const l=new Proxy(e,i===2?s:n);return o.set(e,l),l}function qt(e){return Qt(e)?qt(e.__v_raw):!!(e&&e.__v_isReactive)}function Qt(e){return!!(e&&e.__v_isReadonly)}function Un(e){return!!(e&&e.__v_isShallow)}function zr(e){return qt(e)||Qt(e)}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function dn(e){return Dn(e,"__v_skip",!0),e}const vn=e=>ye(e)?os(e):e,ao=e=>ye(e)?io(e):e;function Rr(e){mt&&Ye&&(e=fe(e),Mr(e.dep||(e.dep=to())))}function Dr(e,t){e=fe(e),e.dep&&Ms(e.dep)}function Se(e){return!!(e&&e.__v_isRef===!0)}function pe(e){return Ur(e,!1)}function Vl(e){return Ur(e,!0)}function Ur(e,t){return Se(e)?e:new Ml(e,t)}class Ml{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:fe(t),this._value=n?t:vn(t)}get value(){return Rr(this),this._value}set value(t){const n=this.__v_isShallow||Un(t)||Qt(t);t=n?t:fe(t),mn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:vn(t),Dr(this))}}function _(e){return Se(e)?e.value:e}const Il={get:(e,t,n)=>_(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return Se(o)&&!Se(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function jr(e){return qt(e)?e:new Proxy(e,Il)}var Kr;class Nl{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[Kr]=!1,this._dirty=!0,this.effect=new no(t,()=>{this._dirty||(this._dirty=!0,Dr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=fe(this);return Rr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}Kr="__v_isReadonly";function Ol(e,t,n=!1){let s,o;const r=re(e);return r?(s=e,o=Je):(s=e.get,o=e.set),new Nl(s,o,r||!o,n)}function vt(e,t,n,s){let o;try{o=s?e(...s):e()}catch(r){rs(r,t,n)}return o}function Ue(e,t,n,s){if(re(e)){const r=vt(e,t,n,s);return r&&Sr(r)&&r.catch(i=>{rs(i,t,n)}),r}const o=[];for(let r=0;r>>1;yn(Ce[s])et&&Ce.splice(t,1)}function zl(e){Q(e)?Wt.push(...e):(!rt||!rt.includes(e,e.allowRecurse?Vt+1:Vt))&&Wt.push(e),Wr()}function Bo(e,t=gn?et+1:0){for(;tyn(n)-yn(s)),Vt=0;Vte.id==null?1/0:e.id,Rl=(e,t)=>{const n=yn(e)-yn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Yr(e){Is=!1,gn=!0,Ce.sort(Rl);const t=Je;try{for(et=0;etxe(C)?C.trim():C)),m&&(o=n.map(eo))}let l,a=s[l=ys(t)]||s[l=ys(nt(t))];!a&&r&&(a=s[l=ys(nn(t))]),a&&Ue(a,e,6,o);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ue(u,e,6,o)}}function Gr(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const r=e.emits;let i={},l=!1;if(!re(e)){const a=u=>{const f=Gr(u,t,!0);f&&(l=!0,Pe(i,f))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!l?(ye(e)&&s.set(e,null),null):(Q(r)?r.forEach(a=>i[a]=null):Pe(i,r),ye(e)&&s.set(e,i),i)}function ls(e,t){return!e||!Pn(t)?!1:(t=t.slice(2).replace(/Once$/,""),de(e,t[0].toLowerCase()+t.slice(1))||de(e,nn(t))||de(e,t))}let Le=null,as=null;function Kn(e){const t=Le;return Le=e,as=e&&e.type.__scopeId||null,t}function st(e){as=e}function ot(){as=null}function H(e,t=Le,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&Yo(-1);const r=Kn(t);let i;try{i=e(...o)}finally{Kn(r),s._d&&Yo(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function xs(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:r,propsOptions:[i],slots:l,attrs:a,emit:u,render:f,renderCache:m,data:g,setupState:C,ctx:F,inheritAttrs:B}=e;let se,x;const V=Kn(e);try{if(n.shapeFlag&4){const J=o||s;se=We(f.call(J,J,m,r,C,g,F)),x=a}else{const J=t;se=We(J.length>1?J(r,{attrs:a,slots:l,emit:u}):J(r,null)),x=t.props?a:Ul(a)}}catch(J){hn.length=0,rs(J,e,1),se=N(He)}let E=se;if(x&&B!==!1){const J=Object.keys(x),{shapeFlag:ee}=E;J.length&&ee&7&&(i&&J.some(Js)&&(x=jl(x,i)),E=bt(E,x))}return n.dirs&&(E=bt(E),E.dirs=E.dirs?E.dirs.concat(n.dirs):n.dirs),n.transition&&(E.transition=n.transition),se=E,Kn(V),se}const Ul=e=>{let t;for(const n in e)(n==="class"||n==="style"||Pn(n))&&((t||(t={}))[n]=e[n]);return t},jl=(e,t)=>{const n={};for(const s in e)(!Js(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Kl(e,t,n){const{props:s,children:o,component:r}=e,{props:i,children:l,patchFlag:a}=t,u=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?Fo(s,i,u):!!i;if(a&8){const f=t.dynamicProps;for(let m=0;me.__isSuspense;function Jr(e,t){t&&t.pendingBranch?Q(e)?t.effects.push(...e):t.effects.push(e):zl(e)}function Yt(e,t){if(ke){let n=ke.provides;const s=ke.parent&&ke.parent.provides;s===n&&(n=ke.provides=Object.create(s)),n[e]=t}}function Ze(e,t,n=!1){const s=ke||Le;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&re(t)?t.call(s.proxy):t}}function yt(e,t){return cs(e,null,t)}function Zr(e,t){return cs(e,null,{flush:"post"})}const In={};function tt(e,t,n){return cs(e,t,n)}function cs(e,t,{immediate:n,deep:s,flush:o,onTrack:r,onTrigger:i}=be){const l=ke;let a,u=!1,f=!1;if(Se(e)?(a=()=>e.value,u=Un(e)):qt(e)?(a=()=>e,s=!0):Q(e)?(f=!0,u=e.some(E=>qt(E)||Un(E)),a=()=>e.map(E=>{if(Se(E))return E.value;if(qt(E))return Ut(E);if(re(E))return vt(E,l,2)})):re(e)?t?a=()=>vt(e,l,2):a=()=>{if(!(l&&l.isUnmounted))return m&&m(),Ue(e,l,3,[g])}:a=Je,t&&s){const E=a;a=()=>Ut(E())}let m,g=E=>{m=x.onStop=()=>{vt(E,l,4)}},C;if(wn)if(g=Je,t?n&&Ue(t,l,3,[a(),f?[]:void 0,g]):a(),o==="sync"){const E=Fa();C=E.__watcherHandles||(E.__watcherHandles=[])}else return Je;let F=f?new Array(e.length).fill(In):In;const B=()=>{if(x.active)if(t){const E=x.run();(s||u||(f?E.some((J,ee)=>mn(J,F[ee])):mn(E,F)))&&(m&&m(),Ue(t,l,3,[E,F===In?void 0:f&&F[0]===In?[]:F,g]),F=E)}else x.run()};B.allowRecurse=!!t;let se;o==="sync"?se=B:o==="post"?se=()=>Me(B,l&&l.suspense):(B.pre=!0,l&&(B.id=l.uid),se=()=>uo(B));const x=new no(a,se);t?n?B():F=x.run():o==="post"?Me(x.run.bind(x),l&&l.suspense):x.run();const V=()=>{x.stop(),l&&l.scope&&Zs(l.scope.effects,x)};return C&&C.push(V),V}function Yl(e,t,n){const s=this.proxy,o=xe(e)?e.includes(".")?Xr(s,e):()=>s[e]:e.bind(s,s);let r;re(t)?r=t:(r=t.handler,n=t);const i=ke;tn(this);const l=cs(o,r.bind(s),n);return i?tn(i):Ht(),l}function Xr(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o{Ut(n,t)});else if(Er(e))for(const n in e)Ut(e[n],t);return e}function Gl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Fe(()=>{e.isMounted=!0}),si(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],Jl={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},setup(e,{slots:t}){const n=hs(),s=Gl();let o;return()=>{const r=t.default&&ti(t.default(),!0);if(!r||!r.length)return;let i=r[0];if(r.length>1){for(const B of r)if(B.type!==He){i=B;break}}const l=fe(e),{mode:a}=l;if(s.isLeaving)return ws(i);const u=zo(i);if(!u)return ws(i);const f=Ns(u,l,s,n);Os(u,f);const m=n.subTree,g=m&&zo(m);let C=!1;const{getTransitionKey:F}=u.type;if(F){const B=F();o===void 0?o=B:B!==o&&(o=B,C=!0)}if(g&&g.type!==He&&(!Mt(u,g)||C)){const B=Ns(g,l,s,n);if(Os(g,B),a==="out-in")return s.isLeaving=!0,B.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},ws(i);a==="in-out"&&u.type!==He&&(B.delayLeave=(se,x,V)=>{const E=ei(s,g);E[String(g.key)]=g,se._leaveCb=()=>{x(),se._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=V})}return i}}},Qr=Jl;function ei(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Ns(e,t,n,s){const{appear:o,mode:r,persisted:i=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:m,onLeave:g,onAfterLeave:C,onLeaveCancelled:F,onBeforeAppear:B,onAppear:se,onAfterAppear:x,onAppearCancelled:V}=t,E=String(e.key),J=ei(n,e),ee=(p,ne)=>{p&&Ue(p,s,9,ne)},he=(p,ne)=>{const U=ne[1];ee(p,ne),Q(p)?p.every(Z=>Z.length<=1)&&U():p.length<=1&&U()},D={mode:r,persisted:i,beforeEnter(p){let ne=l;if(!n.isMounted)if(o)ne=B||l;else return;p._leaveCb&&p._leaveCb(!0);const U=J[E];U&&Mt(e,U)&&U.el._leaveCb&&U.el._leaveCb(),ee(ne,[p])},enter(p){let ne=a,U=u,Z=f;if(!n.isMounted)if(o)ne=se||a,U=x||u,Z=V||f;else return;let $=!1;const I=p._enterCb=A=>{$||($=!0,A?ee(Z,[p]):ee(U,[p]),D.delayedLeave&&D.delayedLeave(),p._enterCb=void 0)};ne?he(ne,[p,I]):I()},leave(p,ne){const U=String(e.key);if(p._enterCb&&p._enterCb(!0),n.isUnmounting)return ne();ee(m,[p]);let Z=!1;const $=p._leaveCb=I=>{Z||(Z=!0,ne(),I?ee(F,[p]):ee(C,[p]),p._leaveCb=void 0,J[U]===e&&delete J[U])};J[U]=e,g?he(g,[p,$]):$()},clone(p){return Ns(p,t,n,s)}};return D}function ws(e){if(us(e))return e=bt(e),e.children=null,e}function zo(e){return us(e)?e.children?e.children[0]:void 0:e}function Os(e,t){e.shapeFlag&6&&e.component?Os(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ti(e,t=!1,n){let s=[],o=0;for(let r=0;r1)for(let r=0;r!!e.type.__asyncLoader,us=e=>e.type.__isKeepAlive;function Zl(e,t){ni(e,"a",t)}function Xl(e,t){ni(e,"da",t)}function ni(e,t,n=ke){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ds(t,s,n),n){let o=n.parent;for(;o&&o.parent;)us(o.parent.vnode)&&Ql(s,t,n,o),o=o.parent}}function Ql(e,t,n,s){const o=ds(t,e,s,!0);xt(()=>{Zs(s[t],o)},n)}function ds(e,t,n=ke,s=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;sn(),tn(n);const l=Ue(t,n,e,i);return Ht(),on(),l});return s?o.unshift(r):o.push(r),r}}const lt=e=>(t,n=ke)=>(!wn||e==="sp")&&ds(e,(...s)=>t(...s),n),ea=lt("bm"),Fe=lt("m"),ta=lt("bu"),fo=lt("u"),si=lt("bum"),xt=lt("um"),na=lt("sp"),sa=lt("rtg"),oa=lt("rtc");function ra(e,t=ke){ds("ec",e,t)}function Qe(e,t,n,s){const o=e.dirs,r=t&&t.dirs;for(let i=0;it(i,l,void 0,r&&r[l]));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,a=i.length;lYn(t)?!(t.type===He||t.type===oe&&!ii(t.children)):!0)?e:null}const Hs=e=>e?vi(e)?vo(e)||e.proxy:Hs(e.parent):null,fn=Pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hs(e.parent),$root:e=>Hs(e.root),$emit:e=>e.emit,$options:e=>po(e),$forceUpdate:e=>e.f||(e.f=()=>uo(e.update)),$nextTick:e=>e.n||(e.n=is.bind(e.proxy)),$watch:e=>Yl.bind(e)}),ks=(e,t)=>e!==be&&!e.__isScriptSetup&&de(e,t),ia={get({_:e},t){const{ctx:n,setupState:s,data:o,props:r,accessCache:i,type:l,appContext:a}=e;let u;if(t[0]!=="$"){const C=i[t];if(C!==void 0)switch(C){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return r[t]}else{if(ks(s,t))return i[t]=1,s[t];if(o!==be&&de(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&de(u,t))return i[t]=3,r[t];if(n!==be&&de(n,t))return i[t]=4,n[t];Bs&&(i[t]=0)}}const f=fn[t];let m,g;if(f)return t==="$attrs"&&Be(e,"get",t),f(e);if((m=l.__cssModules)&&(m=m[t]))return m;if(n!==be&&de(n,t))return i[t]=4,n[t];if(g=a.config.globalProperties,de(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:r}=e;return ks(o,t)?(o[t]=n,!0):s!==be&&de(s,t)?(s[t]=n,!0):de(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:r}},i){let l;return!!n[i]||e!==be&&de(e,i)||ks(t,i)||(l=r[0])&&de(l,i)||de(s,i)||de(fn,i)||de(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:de(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let Bs=!0;function la(e){const t=po(e),n=e.proxy,s=e.ctx;Bs=!1,t.beforeCreate&&Do(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:i,watch:l,provide:a,inject:u,created:f,beforeMount:m,mounted:g,beforeUpdate:C,updated:F,activated:B,deactivated:se,beforeDestroy:x,beforeUnmount:V,destroyed:E,unmounted:J,render:ee,renderTracked:he,renderTriggered:D,errorCaptured:p,serverPrefetch:ne,expose:U,inheritAttrs:Z,components:$,directives:I,filters:A}=t;if(u&&aa(u,s,null,e.appContext.config.unwrapInjectedRef),i)for(const ie in i){const le=i[ie];re(le)&&(s[ie]=le.bind(n))}if(o){const ie=o.call(n,n);ye(ie)&&(e.data=os(ie))}if(Bs=!0,r)for(const ie in r){const le=r[ie],Ve=re(le)?le.bind(n,n):re(le.get)?le.get.bind(n,n):Je,Ie=!re(le)&&re(le.set)?le.set.bind(n):Je,je=G({get:Ve,set:Ie});Object.defineProperty(s,ie,{enumerable:!0,configurable:!0,get:()=>je.value,set:ze=>je.value=ze})}if(l)for(const ie in l)li(l[ie],s,n,ie);if(a){const ie=re(a)?a.call(n):a;Reflect.ownKeys(ie).forEach(le=>{Yt(le,ie[le])})}f&&Do(f,e,"c");function z(ie,le){Q(le)?le.forEach(Ve=>ie(Ve.bind(n))):le&&ie(le.bind(n))}if(z(ea,m),z(Fe,g),z(ta,C),z(fo,F),z(Zl,B),z(Xl,se),z(ra,p),z(oa,he),z(sa,D),z(si,V),z(xt,J),z(na,ne),Q(U))if(U.length){const ie=e.exposed||(e.exposed={});U.forEach(le=>{Object.defineProperty(ie,le,{get:()=>n[le],set:Ve=>n[le]=Ve})})}else e.exposed||(e.exposed={});ee&&e.render===Je&&(e.render=ee),Z!=null&&(e.inheritAttrs=Z),$&&(e.components=$),I&&(e.directives=I)}function aa(e,t,n=Je,s=!1){Q(e)&&(e=Fs(e));for(const o in e){const r=e[o];let i;ye(r)?"default"in r?i=Ze(r.from||o,r.default,!0):i=Ze(r.from||o):i=Ze(r),Se(i)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>i.value,set:l=>i.value=l}):t[o]=i}}function Do(e,t,n){Ue(Q(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function li(e,t,n,s){const o=s.includes(".")?Xr(n,s):()=>n[s];if(xe(e)){const r=t[e];re(r)&&tt(o,r)}else if(re(e))tt(o,e.bind(n));else if(ye(e))if(Q(e))e.forEach(r=>li(r,t,n,s));else{const r=re(e.handler)?e.handler.bind(n):t[e.handler];re(r)&&tt(o,r,e)}}function po(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:i}}=e.appContext,l=r.get(t);let a;return l?a=l:!o.length&&!n&&!s?a=t:(a={},o.length&&o.forEach(u=>qn(a,u,i,!0)),qn(a,t,i)),ye(t)&&r.set(t,a),a}function qn(e,t,n,s=!1){const{mixins:o,extends:r}=t;r&&qn(e,r,n,!0),o&&o.forEach(i=>qn(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=ca[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const ca={data:Uo,props:Tt,emits:Tt,methods:Tt,computed:Tt,beforeCreate:Ae,created:Ae,beforeMount:Ae,mounted:Ae,beforeUpdate:Ae,updated:Ae,beforeDestroy:Ae,beforeUnmount:Ae,destroyed:Ae,unmounted:Ae,activated:Ae,deactivated:Ae,errorCaptured:Ae,serverPrefetch:Ae,components:Tt,directives:Tt,watch:da,provide:Uo,inject:ua};function Uo(e,t){return t?e?function(){return Pe(re(e)?e.call(this,this):e,re(t)?t.call(this,this):t)}:t:e}function ua(e,t){return Tt(Fs(e),Fs(t))}function Fs(e){if(Q(e)){const t={};for(let n=0;n0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let m=0;m{a=!0;const[g,C]=ci(m,t,!0);Pe(i,g),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!r&&!a)return ye(e)&&s.set(e,jt),jt;if(Q(r))for(let f=0;f-1,C[1]=B<0||F-1||de(C,"default"))&&l.push(m)}}}const u=[i,l];return ye(e)&&s.set(e,u),u}function jo(e){return e[0]!=="$"}function Ko(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function qo(e,t){return Ko(e)===Ko(t)}function Wo(e,t){return Q(t)?t.findIndex(n=>qo(n,e)):re(t)&&qo(t,e)?0:-1}const ui=e=>e[0]==="_"||e==="$stable",_o=e=>Q(e)?e.map(We):[We(e)],pa=(e,t,n)=>{if(t._n)return t;const s=H((...o)=>_o(t(...o)),n);return s._c=!1,s},di=(e,t,n)=>{const s=e._ctx;for(const o in e){if(ui(o))continue;const r=e[o];if(re(r))t[o]=pa(o,r,s);else if(r!=null){const i=_o(r);t[o]=()=>i}}},fi=(e,t)=>{const n=_o(t);e.slots.default=()=>n},_a=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=fe(t),Dn(t,"_",n)):di(t,e.slots={})}else e.slots={},t&&fi(e,t);Dn(e.slots,fs,1)},ma=(e,t,n)=>{const{vnode:s,slots:o}=e;let r=!0,i=be;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:(Pe(o,t),!n&&l===1&&delete o._):(r=!t.$stable,di(t,o)),i=t}else t&&(fi(e,t),i={default:1});if(r)for(const l in o)!ui(l)&&!(l in i)&&delete o[l]};function hi(){return{app:null,config:{isNativeTag:Gi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let va=0;function ga(e,t){return function(s,o=null){re(s)||(s=Object.assign({},s)),o!=null&&!ye(o)&&(o=null);const r=hi(),i=new Set;let l=!1;const a=r.app={_uid:va++,_component:s,_props:o,_container:null,_context:r,_instance:null,version:za,get config(){return r.config},set config(u){},use(u,...f){return i.has(u)||(u&&re(u.install)?(i.add(u),u.install(a,...f)):re(u)&&(i.add(u),u(a,...f))),a},mixin(u){return r.mixins.includes(u)||r.mixins.push(u),a},component(u,f){return f?(r.components[u]=f,a):r.components[u]},directive(u,f){return f?(r.directives[u]=f,a):r.directives[u]},mount(u,f,m){if(!l){const g=N(s,o);return g.appContext=r,f&&t?t(g,u):e(g,u,m),l=!0,a._container=u,u.__vue_app__=a,vo(g.component)||g.component.proxy}},unmount(){l&&(e(null,a._container),delete a._container.__vue_app__)},provide(u,f){return r.provides[u]=f,a}};return a}}function Wn(e,t,n,s,o=!1){if(Q(e)){e.forEach((g,C)=>Wn(g,t&&(Q(t)?t[C]:t),n,s,o));return}if(Gt(s)&&!o)return;const r=s.shapeFlag&4?vo(s.component)||s.component.proxy:s.el,i=o?null:r,{i:l,r:a}=e,u=t&&t.r,f=l.refs===be?l.refs={}:l.refs,m=l.setupState;if(u!=null&&u!==a&&(xe(u)?(f[u]=null,de(m,u)&&(m[u]=null)):Se(u)&&(u.value=null)),re(a))vt(a,l,12,[i,f]);else{const g=xe(a),C=Se(a);if(g||C){const F=()=>{if(e.f){const B=g?de(m,a)?m[a]:f[a]:a.value;o?Q(B)&&Zs(B,r):Q(B)?B.includes(r)||B.push(r):g?(f[a]=[r],de(m,a)&&(m[a]=f[a])):(a.value=[r],e.k&&(f[e.k]=a.value))}else g?(f[a]=i,de(m,a)&&(m[a]=i)):C&&(a.value=i,e.k&&(f[e.k]=i))};i?(F.id=-1,Me(F,n)):F()}}}let dt=!1;const Nn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",On=e=>e.nodeType===8;function ya(e){const{mt:t,p:n,o:{patchProp:s,createText:o,nextSibling:r,parentNode:i,remove:l,insert:a,createComment:u}}=e,f=(x,V)=>{if(!V.hasChildNodes()){n(null,x,V),jn(),V._vnode=x;return}dt=!1,m(V.firstChild,x,null,null,null),jn(),V._vnode=x,dt&&console.error("Hydration completed but contains mismatches.")},m=(x,V,E,J,ee,he=!1)=>{const D=On(x)&&x.data==="[",p=()=>B(x,V,E,J,ee,D),{type:ne,ref:U,shapeFlag:Z,patchFlag:$}=V;let I=x.nodeType;V.el=x,$===-2&&(he=!1,V.dynamicChildren=null);let A=null;switch(ne){case en:I!==3?V.children===""?(a(V.el=o(""),i(x),x),A=x):A=p():(x.data!==V.children&&(dt=!0,x.data=V.children),A=r(x));break;case He:I!==8||D?A=p():A=r(x);break;case Jt:if(D&&(x=r(x),I=x.nodeType),I===1||I===3){A=x;const ue=!V.children.length;for(let z=0;z{he=he||!!V.dynamicChildren;const{type:D,props:p,patchFlag:ne,shapeFlag:U,dirs:Z}=V,$=D==="input"&&Z||D==="option";if($||ne!==-1){if(Z&&Qe(V,null,E,"created"),p)if($||!he||ne&48)for(const A in p)($&&A.endsWith("value")||Pn(A)&&!un(A))&&s(x,A,null,p[A],!1,void 0,E);else p.onClick&&s(x,"onClick",null,p.onClick,!1,void 0,E);let I;if((I=p&&p.onVnodeBeforeMount)&&De(I,E,V),Z&&Qe(V,null,E,"beforeMount"),((I=p&&p.onVnodeMounted)||Z)&&Jr(()=>{I&&De(I,E,V),Z&&Qe(V,null,E,"mounted")},J),U&16&&!(p&&(p.innerHTML||p.textContent))){let A=C(x.firstChild,V,x,E,J,ee,he);for(;A;){dt=!0;const ue=A;A=A.nextSibling,l(ue)}}else U&8&&x.textContent!==V.children&&(dt=!0,x.textContent=V.children)}return x.nextSibling},C=(x,V,E,J,ee,he,D)=>{D=D||!!V.dynamicChildren;const p=V.children,ne=p.length;for(let U=0;U{const{slotScopeIds:D}=V;D&&(ee=ee?ee.concat(D):D);const p=i(x),ne=C(r(x),V,p,E,J,ee,he);return ne&&On(ne)&&ne.data==="]"?r(V.anchor=ne):(dt=!0,a(V.anchor=u("]"),p,ne),ne)},B=(x,V,E,J,ee,he)=>{if(dt=!0,V.el=null,he){const ne=se(x);for(;;){const U=r(x);if(U&&U!==ne)l(U);else break}}const D=r(x),p=i(x);return l(x),n(null,V,p,D,E,J,Nn(p),ee),D},se=x=>{let V=0;for(;x;)if(x=r(x),x&&On(x)&&(x.data==="["&&V++,x.data==="]")){if(V===0)return r(x);V--}return x};return[f,m]}const Me=Jr;function ba(e){return xa(e,ya)}function xa(e,t){const n=tl();n.__VUE__=!0;const{insert:s,remove:o,patchProp:r,createElement:i,createText:l,createComment:a,setText:u,setElementText:f,parentNode:m,nextSibling:g,setScopeId:C=Je,insertStaticContent:F}=e,B=(c,d,v,w=null,k=null,S=null,O=!1,L=null,M=!!d.dynamicChildren)=>{if(c===d)return;c&&!Mt(c,d)&&(w=zt(c),ze(c,k,S,!0),c=null),d.patchFlag===-2&&(M=!1,d.dynamicChildren=null);const{type:P,ref:W,shapeFlag:j}=d;switch(P){case en:se(c,d,v,w);break;case He:x(c,d,v,w);break;case Jt:c==null&&V(d,v,w,O);break;case oe:$(c,d,v,w,k,S,O,L,M);break;default:j&1?ee(c,d,v,w,k,S,O,L,M):j&6?I(c,d,v,w,k,S,O,L,M):(j&64||j&128)&&P.process(c,d,v,w,k,S,O,L,M,ct)}W!=null&&k&&Wn(W,c&&c.ref,S,d||c,!d)},se=(c,d,v,w)=>{if(c==null)s(d.el=l(d.children),v,w);else{const k=d.el=c.el;d.children!==c.children&&u(k,d.children)}},x=(c,d,v,w)=>{c==null?s(d.el=a(d.children||""),v,w):d.el=c.el},V=(c,d,v,w)=>{[c.el,c.anchor]=F(c.children,d,v,w,c.el,c.anchor)},E=({el:c,anchor:d},v,w)=>{let k;for(;c&&c!==d;)k=g(c),s(c,v,w),c=k;s(d,v,w)},J=({el:c,anchor:d})=>{let v;for(;c&&c!==d;)v=g(c),o(c),c=v;o(d)},ee=(c,d,v,w,k,S,O,L,M)=>{O=O||d.type==="svg",c==null?he(d,v,w,k,S,O,L,M):ne(c,d,k,S,O,L,M)},he=(c,d,v,w,k,S,O,L)=>{let M,P;const{type:W,props:j,shapeFlag:Y,transition:te,dirs:ae}=c;if(M=c.el=i(c.type,S,j&&j.is,j),Y&8?f(M,c.children):Y&16&&p(c.children,M,null,w,k,S&&W!=="foreignObject",O,L),ae&&Qe(c,null,w,"created"),j){for(const me in j)me!=="value"&&!un(me)&&r(M,me,null,j[me],S,c.children,w,k,Ke);"value"in j&&r(M,"value",null,j.value),(P=j.onVnodeBeforeMount)&&De(P,w,c)}D(M,c,c.scopeId,O,w),ae&&Qe(c,null,w,"beforeMount");const ve=(!k||k&&!k.pendingBranch)&&te&&!te.persisted;ve&&te.beforeEnter(M),s(M,d,v),((P=j&&j.onVnodeMounted)||ve||ae)&&Me(()=>{P&&De(P,w,c),ve&&te.enter(M),ae&&Qe(c,null,w,"mounted")},k)},D=(c,d,v,w,k)=>{if(v&&C(c,v),w)for(let S=0;S{for(let P=M;P{const L=d.el=c.el;let{patchFlag:M,dynamicChildren:P,dirs:W}=d;M|=c.patchFlag&16;const j=c.props||be,Y=d.props||be;let te;v&&St(v,!1),(te=Y.onVnodeBeforeUpdate)&&De(te,v,d,c),W&&Qe(d,c,v,"beforeUpdate"),v&&St(v,!0);const ae=k&&d.type!=="foreignObject";if(P?U(c.dynamicChildren,P,L,v,w,ae,S):O||le(c,d,L,null,v,w,ae,S,!1),M>0){if(M&16)Z(L,d,j,Y,v,w,k);else if(M&2&&j.class!==Y.class&&r(L,"class",null,Y.class,k),M&4&&r(L,"style",j.style,Y.style,k),M&8){const ve=d.dynamicProps;for(let me=0;me{te&&De(te,v,d,c),W&&Qe(d,c,v,"updated")},w)},U=(c,d,v,w,k,S,O)=>{for(let L=0;L{if(v!==w){if(v!==be)for(const L in v)!un(L)&&!(L in w)&&r(c,L,v[L],null,O,d.children,k,S,Ke);for(const L in w){if(un(L))continue;const M=w[L],P=v[L];M!==P&&L!=="value"&&r(c,L,P,M,O,d.children,k,S,Ke)}"value"in w&&r(c,"value",v.value,w.value)}},$=(c,d,v,w,k,S,O,L,M)=>{const P=d.el=c?c.el:l(""),W=d.anchor=c?c.anchor:l("");let{patchFlag:j,dynamicChildren:Y,slotScopeIds:te}=d;te&&(L=L?L.concat(te):te),c==null?(s(P,v,w),s(W,v,w),p(d.children,v,W,k,S,O,L,M)):j>0&&j&64&&Y&&c.dynamicChildren?(U(c.dynamicChildren,Y,v,k,S,O,L),(d.key!=null||k&&d===k.subTree)&&pi(c,d,!0)):le(c,d,v,W,k,S,O,L,M)},I=(c,d,v,w,k,S,O,L,M)=>{d.slotScopeIds=L,c==null?d.shapeFlag&512?k.ctx.activate(d,v,w,O,M):A(d,v,w,k,S,O,M):ue(c,d,M)},A=(c,d,v,w,k,S,O)=>{const L=c.component=Ta(c,w,k);if(us(c)&&(L.ctx.renderer=ct),Aa(L),L.asyncDep){if(k&&k.registerDep(L,z),!c.el){const M=L.subTree=N(He);x(null,M,d,v)}return}z(L,c,d,v,k,S,O)},ue=(c,d,v)=>{const w=d.component=c.component;if(Kl(c,d,v))if(w.asyncDep&&!w.asyncResolved){ie(w,d,v);return}else w.next=d,Fl(w.update),w.update();else d.el=c.el,w.vnode=d},z=(c,d,v,w,k,S,O)=>{const L=()=>{if(c.isMounted){let{next:W,bu:j,u:Y,parent:te,vnode:ae}=c,ve=W,me;St(c,!1),W?(W.el=ae.el,ie(c,W,O)):W=ae,j&&bs(j),(me=W.props&&W.props.onVnodeBeforeUpdate)&&De(me,te,W,ae),St(c,!0);const we=xs(c),qe=c.subTree;c.subTree=we,B(qe,we,m(qe.el),zt(qe),c,k,S),W.el=we.el,ve===null&&ql(c,we.el),Y&&Me(Y,k),(me=W.props&&W.props.onVnodeUpdated)&&Me(()=>De(me,te,W,ae),k)}else{let W;const{el:j,props:Y}=d,{bm:te,m:ae,parent:ve}=c,me=Gt(d);if(St(c,!1),te&&bs(te),!me&&(W=Y&&Y.onVnodeBeforeMount)&&De(W,ve,d),St(c,!0),j&&Ct){const we=()=>{c.subTree=xs(c),Ct(j,c.subTree,c,k,null)};me?d.type.__asyncLoader().then(()=>!c.isUnmounted&&we()):we()}else{const we=c.subTree=xs(c);B(null,we,v,w,c,k,S),d.el=we.el}if(ae&&Me(ae,k),!me&&(W=Y&&Y.onVnodeMounted)){const we=d;Me(()=>De(W,ve,we),k)}(d.shapeFlag&256||ve&&Gt(ve.vnode)&&ve.vnode.shapeFlag&256)&&c.a&&Me(c.a,k),c.isMounted=!0,d=v=w=null}},M=c.effect=new no(L,()=>uo(P),c.scope),P=c.update=()=>M.run();P.id=c.uid,St(c,!0),P()},ie=(c,d,v)=>{d.component=c;const w=c.vnode.props;c.vnode=d,c.next=null,ha(c,d.props,w,v),ma(c,d.children,v),sn(),Bo(),on()},le=(c,d,v,w,k,S,O,L,M=!1)=>{const P=c&&c.children,W=c?c.shapeFlag:0,j=d.children,{patchFlag:Y,shapeFlag:te}=d;if(Y>0){if(Y&128){Ie(P,j,v,w,k,S,O,L,M);return}else if(Y&256){Ve(P,j,v,w,k,S,O,L,M);return}}te&8?(W&16&&Ke(P,k,S),j!==P&&f(v,j)):W&16?te&16?Ie(P,j,v,w,k,S,O,L,M):Ke(P,k,S,!0):(W&8&&f(v,""),te&16&&p(j,v,w,k,S,O,L,M))},Ve=(c,d,v,w,k,S,O,L,M)=>{c=c||jt,d=d||jt;const P=c.length,W=d.length,j=Math.min(P,W);let Y;for(Y=0;YW?Ke(c,k,S,!0,!1,j):p(d,v,w,k,S,O,L,M,j)},Ie=(c,d,v,w,k,S,O,L,M)=>{let P=0;const W=d.length;let j=c.length-1,Y=W-1;for(;P<=j&&P<=Y;){const te=c[P],ae=d[P]=M?pt(d[P]):We(d[P]);if(Mt(te,ae))B(te,ae,v,null,k,S,O,L,M);else break;P++}for(;P<=j&&P<=Y;){const te=c[j],ae=d[Y]=M?pt(d[Y]):We(d[Y]);if(Mt(te,ae))B(te,ae,v,null,k,S,O,L,M);else break;j--,Y--}if(P>j){if(P<=Y){const te=Y+1,ae=teY)for(;P<=j;)ze(c[P],k,S,!0),P++;else{const te=P,ae=P,ve=new Map;for(P=ae;P<=Y;P++){const Ne=d[P]=M?pt(d[P]):We(d[P]);Ne.key!=null&&ve.set(Ne.key,P)}let me,we=0;const qe=Y-ae+1;let Rt=!1,So=0;const ln=new Array(qe);for(P=0;P=qe){ze(Ne,k,S,!0);continue}let Xe;if(Ne.key!=null)Xe=ve.get(Ne.key);else for(me=ae;me<=Y;me++)if(ln[me-ae]===0&&Mt(Ne,d[me])){Xe=me;break}Xe===void 0?ze(Ne,k,S,!0):(ln[Xe-ae]=P+1,Xe>=So?So=Xe:Rt=!0,B(Ne,d[Xe],v,null,k,S,O,L,M),we++)}const Lo=Rt?wa(ln):jt;for(me=Lo.length-1,P=qe-1;P>=0;P--){const Ne=ae+P,Xe=d[Ne],Eo=Ne+1{const{el:S,type:O,transition:L,children:M,shapeFlag:P}=c;if(P&6){je(c.component.subTree,d,v,w);return}if(P&128){c.suspense.move(d,v,w);return}if(P&64){O.move(c,d,v,ct);return}if(O===oe){s(S,d,v);for(let j=0;jL.enter(S),k);else{const{leave:j,delayLeave:Y,afterLeave:te}=L,ae=()=>s(S,d,v),ve=()=>{j(S,()=>{ae(),te&&te()})};Y?Y(S,ae,ve):ve()}else s(S,d,v)},ze=(c,d,v,w=!1,k=!1)=>{const{type:S,props:O,ref:L,children:M,dynamicChildren:P,shapeFlag:W,patchFlag:j,dirs:Y}=c;if(L!=null&&Wn(L,null,v,c,!0),W&256){d.ctx.deactivate(c);return}const te=W&1&&Y,ae=!Gt(c);let ve;if(ae&&(ve=O&&O.onVnodeBeforeUnmount)&&De(ve,d,c),W&6)$t(c.component,v,w);else{if(W&128){c.suspense.unmount(v,w);return}te&&Qe(c,null,d,"beforeUnmount"),W&64?c.type.remove(c,d,v,k,ct,w):P&&(S!==oe||j>0&&j&64)?Ke(P,d,v,!1,!0):(S===oe&&j&384||!k&&W&16)&&Ke(M,d,v),w&&Ln(c)}(ae&&(ve=O&&O.onVnodeUnmounted)||te)&&Me(()=>{ve&&De(ve,d,c),te&&Qe(c,null,d,"unmounted")},v)},Ln=c=>{const{type:d,el:v,anchor:w,transition:k}=c;if(d===oe){gs(v,w);return}if(d===Jt){J(c);return}const S=()=>{o(v),k&&!k.persisted&&k.afterLeave&&k.afterLeave()};if(c.shapeFlag&1&&k&&!k.persisted){const{leave:O,delayLeave:L}=k,M=()=>O(v,S);L?L(c.el,S,M):M()}else S()},gs=(c,d)=>{let v;for(;c!==d;)v=g(c),o(c),c=v;o(d)},$t=(c,d,v)=>{const{bum:w,scope:k,update:S,subTree:O,um:L}=c;w&&bs(w),k.stop(),S&&(S.active=!1,ze(O,c,d,v)),L&&Me(L,d),Me(()=>{c.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&c.asyncDep&&!c.asyncResolved&&c.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Ke=(c,d,v,w=!1,k=!1,S=0)=>{for(let O=S;Oc.shapeFlag&6?zt(c.component.subTree):c.shapeFlag&128?c.suspense.next():g(c.anchor||c.el),Pt=(c,d,v)=>{c==null?d._vnode&&ze(d._vnode,null,null,!0):B(d._vnode||null,c,d,null,null,null,v),Bo(),jn(),d._vnode=c},ct={p:B,um:ze,m:je,r:Ln,mt:A,mc:p,pc:le,pbc:U,n:zt,o:e};let rn,Ct;return t&&([rn,Ct]=t(ct)),{render:Pt,hydrate:rn,createApp:ga(Pt,rn)}}function St({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function pi(e,t,n=!1){const s=e.children,o=t.children;if(Q(s)&&Q(o))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,i=n[r-1];r-- >0;)n[r]=i,i=t[i];return n}const ka=e=>e.__isTeleport,oe=Symbol(void 0),en=Symbol(void 0),He=Symbol(void 0),Jt=Symbol(void 0),hn=[];let Ge=null;function h(e=!1){hn.push(Ge=e?null:[])}function $a(){hn.pop(),Ge=hn[hn.length-1]||null}let xn=1;function Yo(e){xn+=e}function _i(e){return e.dynamicChildren=xn>0?Ge||jt:null,$a(),xn>0&&Ge&&Ge.push(e),e}function y(e,t,n,s,o,r){return _i(b(e,t,n,s,o,r,!0))}function X(e,t,n,s,o){return _i(N(e,t,n,s,o,!0))}function Yn(e){return e?e.__v_isVNode===!0:!1}function Mt(e,t){return e.type===t.type&&e.key===t.key}const fs="__vInternal",mi=({key:e})=>e??null,Fn=({ref:e,ref_key:t,ref_for:n})=>e!=null?xe(e)||Se(e)||re(e)?{i:Le,r:e,k:t,f:!!n}:e:null;function b(e,t=null,n=null,s=0,o=null,r=e===oe?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&mi(t),ref:t&&Fn(t),scopeId:as,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Le};return l?(mo(a,n),r&128&&e.normalize(a)):n&&(a.shapeFlag|=xe(n)?8:16),xn>0&&!i&&Ge&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&Ge.push(a),a}const N=Pa;function Pa(e,t=null,n=null,s=0,o=null,r=!1){if((!e||e===oi)&&(e=He),Yn(e)){const l=bt(e,t,!0);return n&&mo(l,n),xn>0&&!r&&Ge&&(l.shapeFlag&6?Ge[Ge.indexOf(e)]=l:Ge.push(l)),l.patchFlag|=-2,l}if(Na(e)&&(e=e.__vccOpts),t){t=Ca(t);let{class:l,style:a}=t;l&&!xe(l)&&(t.class=ge(l)),ye(a)&&(zr(a)&&!Q(a)&&(a=Pe({},a)),t.style=Qn(a))}const i=xe(e)?1:Wl(e)?128:ka(e)?64:ye(e)?4:re(e)?2:0;return b(e,t,n,s,o,i,r,!0)}function Ca(e){return e?zr(e)||fs in e?Pe({},e):e:null}function bt(e,t,n=!1){const{props:s,ref:o,patchFlag:r,children:i}=e,l=t?zn(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&mi(l),ref:t&&t.ref?n&&o?Q(o)?o.concat(Fn(t)):[o,Fn(t)]:Fn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==oe?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&bt(e.ssContent),ssFallback:e.ssFallback&&bt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx}}function Ee(e=" ",t=0){return N(en,null,e,t)}function Sa(e,t){const n=N(Jt,null,e);return n.staticCount=t,n}function q(e="",t=!1){return t?(h(),X(He,null,e)):N(He,null,e)}function We(e){return e==null||typeof e=="boolean"?N(He):Q(e)?N(oe,null,e.slice()):typeof e=="object"?pt(e):N(en,null,String(e))}function pt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:bt(e)}function mo(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(Q(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),mo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(fs in t)?t._ctx=Le:o===3&&Le&&(Le.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else re(t)?(t={default:t,_ctx:Le},n=32):(t=String(t),s&64?(n=16,t=[Ee(t)]):n=8);e.children=t,e.shapeFlag|=n}function zn(...e){const t={};for(let n=0;nke||Le,tn=e=>{ke=e,e.scope.on()},Ht=()=>{ke&&ke.scope.off(),ke=null};function vi(e){return e.vnode.shapeFlag&4}let wn=!1;function Aa(e,t=!1){wn=t;const{props:n,children:s}=e.vnode,o=vi(e);fa(e,n,o,t),_a(e,s);const r=o?Va(e,t):void 0;return wn=!1,r}function Va(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=dn(new Proxy(e.ctx,ia));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?yi(e):null;tn(e),sn();const r=vt(s,e,0,[e.props,o]);if(on(),Ht(),Sr(r)){if(r.then(Ht,Ht),t)return r.then(i=>{Go(e,i,t)}).catch(i=>{rs(i,e,0)});e.asyncDep=r}else Go(e,r,t)}else gi(e,t)}function Go(e,t,n){re(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ye(t)&&(e.setupState=jr(t)),gi(e,n)}let Jo;function gi(e,t,n){const s=e.type;if(!e.render){if(!t&&Jo&&!s.render){const o=s.template||po(e).template;if(o){const{isCustomElement:r,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:a}=s,u=Pe(Pe({isCustomElement:r,delimiters:l},i),a);s.render=Jo(o,u)}}e.render=s.render||Je}tn(e),sn(),la(e),on(),Ht()}function Ma(e){return new Proxy(e.attrs,{get(t,n){return Be(e,"get","$attrs"),t[n]}})}function yi(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=Ma(e))},slots:e.slots,emit:e.emit,expose:t}}function vo(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(jr(dn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in fn)return fn[n](e)},has(t,n){return n in t||n in fn}}))}function Ia(e,t=!0){return re(e)?e.displayName||e.name:e.name||t&&e.__name}function Na(e){return re(e)&&"__vccOpts"in e}const G=(e,t)=>Ol(e,t,wn);function Oa(){return Ha().slots}function Ha(){const e=hs();return e.setupContext||(e.setupContext=yi(e))}function Gn(e,t,n){const s=arguments.length;return s===2?ye(t)&&!Q(t)?Yn(t)?N(e,null,[t]):N(e,t):N(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Yn(n)&&(n=[n]),N(e,t,n))}const Ba=Symbol(""),Fa=()=>Ze(Ba),za="3.2.45",Ra="http://www.w3.org/2000/svg",It=typeof document<"u"?document:null,Zo=It&&It.createElement("template"),Da={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t?It.createElementNS(Ra,e):It.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>It.createTextNode(e),createComment:e=>It.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>It.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,r){const i=n?n.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===r||!(o=o.nextSibling)););else{Zo.innerHTML=s?`${e}`:e;const l=Zo.content;if(s){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Ua(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function ja(e,t,n){const s=e.style,o=xe(n);if(n&&!o){for(const r in n)Rs(s,r,n[r]);if(t&&!xe(t))for(const r in t)n[r]==null&&Rs(s,r,"")}else{const r=s.display;o?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=r)}}const Xo=/\s*!important$/;function Rs(e,t,n){if(Q(n))n.forEach(s=>Rs(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ka(e,t);Xo.test(n)?e.setProperty(nn(s),n.replace(Xo,""),"important"):e[s]=n}}const Qo=["Webkit","Moz","ms"],$s={};function Ka(e,t){const n=$s[t];if(n)return n;let s=nt(t);if(s!=="filter"&&s in e)return $s[t]=s;s=ns(s);for(let o=0;oPs||(Xa.then(()=>Ps=0),Ps=Date.now());function ec(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ue(tc(s,n.value),t,5,[s])};return n.value=e,n.attached=Qa(),n}function tc(e,t){if(Q(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const nr=/^on[a-z]/,nc=(e,t,n,s,o=!1,r,i,l,a)=>{t==="class"?Ua(e,s,o):t==="style"?ja(e,n,s):Pn(t)?Js(t)||Ja(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):sc(e,t,s,o))?Wa(e,t,s,r,i,l,a):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),qa(e,t,s,o))};function sc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&nr.test(t)&&re(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||nr.test(t)&&xe(n)?!1:t in e}function oc(e){const t=hs();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(r=>Us(r,o))},s=()=>{const o=e(t.proxy);Ds(t.subTree,o),n(o)};Zr(s),Fe(()=>{const o=new MutationObserver(s);o.observe(t.subTree.el.parentNode,{childList:!0}),xt(()=>o.disconnect())})}function Ds(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Ds(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Us(e.el,t);else if(e.type===oe)e.children.forEach(n=>Ds(n,t));else if(e.type===Jt){let{el:n,anchor:s}=e;for(;n&&(Us(n,t),n!==s);)n=n.nextSibling}}function Us(e,t){if(e.nodeType===1){const n=e.style;for(const s in t)n.setProperty(`--${s}`,t[s])}}const ft="transition",an="animation",ps=(e,{slots:t})=>Gn(Qr,rc(e),t);ps.displayName="Transition";const bi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ps.props=Pe({},Qr.props,bi);const Lt=(e,t=[])=>{Q(e)?e.forEach(n=>n(...t)):e&&e(...t)},sr=e=>e?Q(e)?e.some(t=>t.length>1):e.length>1:!1;function rc(e){const t={};for(const $ in e)$ in bi||(t[$]=e[$]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=r,appearActiveClass:u=i,appearToClass:f=l,leaveFromClass:m=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:C=`${n}-leave-to`}=e,F=ic(o),B=F&&F[0],se=F&&F[1],{onBeforeEnter:x,onEnter:V,onEnterCancelled:E,onLeave:J,onLeaveCancelled:ee,onBeforeAppear:he=x,onAppear:D=V,onAppearCancelled:p=E}=t,ne=($,I,A)=>{Et($,I?f:l),Et($,I?u:i),A&&A()},U=($,I)=>{$._isLeaving=!1,Et($,m),Et($,C),Et($,g),I&&I()},Z=$=>(I,A)=>{const ue=$?D:V,z=()=>ne(I,$,A);Lt(ue,[I,z]),or(()=>{Et(I,$?a:r),ht(I,$?f:l),sr(ue)||rr(I,s,B,z)})};return Pe(t,{onBeforeEnter($){Lt(x,[$]),ht($,r),ht($,i)},onBeforeAppear($){Lt(he,[$]),ht($,a),ht($,u)},onEnter:Z(!1),onAppear:Z(!0),onLeave($,I){$._isLeaving=!0;const A=()=>U($,I);ht($,m),cc(),ht($,g),or(()=>{$._isLeaving&&(Et($,m),ht($,C),sr(J)||rr($,s,se,A))}),Lt(J,[$,A])},onEnterCancelled($){ne($,!1),Lt(E,[$])},onAppearCancelled($){ne($,!0),Lt(p,[$])},onLeaveCancelled($){U($),Lt(ee,[$])}})}function ic(e){if(e==null)return null;if(ye(e))return[Cs(e.enter),Cs(e.leave)];{const t=Cs(e);return[t,t]}}function Cs(e){return eo(e)}function ht(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Et(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function or(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let lc=0;function rr(e,t,n,s){const o=e._endId=++lc,r=()=>{o===e._endId&&s()};if(n)return setTimeout(r,n);const{type:i,timeout:l,propCount:a}=ac(e,t);if(!i)return s();const u=i+"end";let f=0;const m=()=>{e.removeEventListener(u,g),r()},g=C=>{C.target===e&&++f>=a&&m()};setTimeout(()=>{f(n[F]||"").split(", "),o=s(`${ft}Delay`),r=s(`${ft}Duration`),i=ir(o,r),l=s(`${an}Delay`),a=s(`${an}Duration`),u=ir(l,a);let f=null,m=0,g=0;t===ft?i>0&&(f=ft,m=i,g=r.length):t===an?u>0&&(f=an,m=u,g=a.length):(m=Math.max(i,u),f=m>0?i>u?ft:an:null,g=f?f===ft?r.length:a.length:0);const C=f===ft&&/\b(transform|all)(,|$)/.test(s(`${ft}Property`).toString());return{type:f,timeout:m,propCount:g,hasTransform:C}}function ir(e,t){for(;e.lengthlr(n)+lr(e[s])))}function lr(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function cc(){return document.body.offsetHeight}const uc=["ctrl","shift","alt","meta"],dc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>uc.some(n=>e[`${n}Key`]&&!t.includes(n))},fc=(e,t)=>(n,...s)=>{for(let o=0;o{const t=pc().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=mc(s);if(o)return n(o,!0,o instanceof SVGElement)},t};function mc(e){return xe(e)?document.querySelector(e):e}const R=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},vc="modulepreload",gc=function(e){return"/"+e},cr={},yc=function(t,n,s){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(r=>{if(r=gc(r),r in cr)return;cr[r]=!0;const i=r.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!s)for(let f=o.length-1;f>=0;f--){const m=o[f];if(m.href===r&&(!i||m.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${r}"]${l}`))return;const u=document.createElement("link");if(u.rel=i?"stylesheet":vc,i||(u.as="script",u.crossOrigin=""),u.href=r,document.head.appendChild(u),i)return new Promise((f,m)=>{u.addEventListener("load",f),u.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${r}`)))})})).then(()=>t())};const bc=K({__name:"VPBadge",props:{text:null,type:null},setup(e){return(t,n)=>(h(),y("span",{class:ge(["VPBadge",e.type??"tip"])},[T(t.$slots,"default",{},()=>[Ee(ce(e.text),1)],!0)],2))}});const xc=R(bc,[["__scopeId","data-v-db439330"]]),wc=JSON.parse('{"lang":"en-US","dir":"ltr","title":"ZiuChen","description":"Unlimited Progress.","base":"/","head":[],"appearance":true,"themeConfig":{"logo":"/logo.png","nav":[{"text":"首页","link":"/"},{"text":"我的项目","items":[{"text":"超级剪贴板","link":"/project/ClipboardManager/"},{"text":"超级分词","link":"/project/SmartWordBreak/"}]},{"text":"开源作品","items":[{"text":"个人作品","link":"/works/opensource"},{"text":"社区贡献","link":"/works/contribution"}]},{"text":"学习笔记","items":[{"text":"JavaScript基础","link":"/note/JavaScript"},{"text":"CSS基础","link":"/note/CSS"},{"text":"JavaScript进阶","link":"/note/JavaScriptEnhanced"},{"text":"前端工程化","link":"/note/Front-end Engineering"}]},{"text":"文章创作","link":"/article/一文读懂伪类与伪元素"},{"text":"个人介绍","link":"/self/"}],"sidebar":[{"text":"我的项目","collapsible":true,"items":[{"text":"超级剪贴板","link":"/project/ClipboardManager/"},{"text":"超级分词","link":"/project/SmartWordBreak/"}]},{"text":"开源作品","collapsible":true,"items":[{"text":"个人作品","link":"/works/opensource"},{"text":"社区贡献","link":"/works/contribution"}]},{"text":"文章创作","collapsible":true,"items":[{"text":"【2023】青训营 - 前端练习题汇总解析","link":"/article/【2023】青训营 - 前端练习题汇总解析"},{"text":"一文读懂事件冒泡与事件捕获","link":"/article/一文读懂事件冒泡与事件捕获"},{"text":"一文读懂伪类与伪元素","link":"/article/一文读懂伪类与伪元素"},{"text":"一文读懂函数中this指向问题","link":"/article/一文读懂函数中this指向问题"},{"text":"从0实现一个年度报告","link":"/article/从0实现一个年度报告"},{"text":"彻底搞懂对象的数据属性描述符、存储属性描述符","link":"/article/彻底搞懂对象的数据属性描述符、存储属性描述符"},{"text":"深入Vue3源码,看看Vue.use后究竟发生了什么?","link":"/article/深入Vue3源码,看看Vue.use后究竟发生了什么?"},{"text":"深入理解Proxy与Reflect","link":"/article/深入理解Proxy与Reflect"},{"text":"深入理解浏览器缓存机制","link":"/article/深入理解浏览器缓存机制"},{"text":"深入理解浏览器运行原理","link":"/article/深入理解浏览器运行原理"}]},{"text":"学习笔记","collapsible":true,"items":[{"text":"JavaScript基础","link":"/note/JavaScript"},{"text":"CSS基础","link":"/note/CSS"},{"text":"JavaScript进阶","link":"/note/JavaScriptEnhanced"},{"text":"前端工程化","link":"/note/Front-end Engineering"}]}],"socialLinks":[{"icon":"github","link":"https://ziuchen.github.io/"},{"icon":{"svg":""},"link":"https://juejin.cn/user/1887205216238477"}],"editLink":{"pattern":"https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/:path","text":"Edit this page on GitHub"},"footer":{"message":"Released under the MIT License.","copyright":"Copyright © 2019-present Ziu Chen"},"lastUpdatedText":"Updated Date"},"locales":{},"scrollOffset":90,"cleanUrls":false}'),_s=/^[a-z]+:/i,kc=/^pathname:\/\//,ur="vitepress-theme-appearance",xi=/#.*$/,$c=/(index)?\.(md|html)$/,$e=typeof document<"u",wi={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0};function Ft(e,t,n=!1){if(t===void 0)return!1;if(e=dr(`/${e}`),n)return new RegExp(t).test(e);if(dr(t)!==e)return!1;const s=t.match(xi);return s?($e?location.hash:"")===s[0]:!0}function dr(e){return decodeURI(e).replace(xi,"").replace($c,"")}function ki(e){return _s.test(e)}function Pc(e,t){var s,o,r,i,l,a,u;const n=Object.keys(e.locales).find(f=>f!=="root"&&!ki(f)&&Ft(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((o=e.locales[n])==null?void 0:o.dir)??e.dir,title:((r=e.locales[n])==null?void 0:r.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Pi(e.head,((a=e.locales[n])==null?void 0:a.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function $i(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const o=Cc(e.title,s);return`${n}${o}`}function Cc(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Sc(e,t){const[n,s]=t;if(n!=="meta")return!1;const o=Object.entries(s)[0];return o==null?!1:e.some(([r,i])=>r===n&&i[o[0]]===o[1])}function Pi(e,t){return[...e.filter(n=>!Sc(t,n)),...t]}const Lc=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Ec=/^[a-z]:/i;function fr(e){const t=Ec.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Lc,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Ci=Symbol(),_t=Vl(wc);function Tc(e){const t=G(()=>Pc(_t.value,e.data.relativePath));return{site:t,theme:G(()=>t.value.themeConfig),page:G(()=>e.data),frontmatter:G(()=>e.data.frontmatter),lang:G(()=>t.value.lang),dir:G(()=>t.value.dir),localeIndex:G(()=>t.value.localeIndex||"root"),title:G(()=>$i(t.value,e.data)),description:G(()=>e.data.description||t.value.description),isDark:pe(!1)}}function Si(){const e=Ze(Ci);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ac(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function kn(e){return _s.test(e)||e.startsWith(".")?e:Ac(_t.value.base,e)}function Li(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),$e){const n="/";t=fr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${fr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}const Ei=Symbol(),hr="http://a.com",Vc=()=>({path:"/",component:null,data:wi});function Mc(e,t){const n=os(Vc()),s={route:n,go:o};async function o(l=$e?location.href:"/"){var u,f;await((u=s.onBeforeRouteChange)==null?void 0:u.call(s,l));const a=new URL(l,hr);_t.value.cleanUrls||!a.pathname.endsWith("/")&&!a.pathname.endsWith(".html")&&(a.pathname+=".html",l=a.pathname+a.search+a.hash),$e&&l!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await i(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l))}let r=null;async function i(l,a=0,u=!1){const f=new URL(l,hr),m=r=f.pathname;try{let g=await e(m);if(r===m){r=null;const{default:C,__pageData:F}=g;if(!C)throw new Error(`Invalid route component: ${C}`);n.path=$e?m:kn(m),n.component=dn(C),n.data=dn(F),$e&&is(()=>{let B=_t.value.base+F.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!_t.value.cleanUrls&&!B.endsWith("/")&&(B+=".html"),B!==f.pathname&&(f.pathname=B,l=B+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!a){let se=null;try{se=document.querySelector(decodeURIComponent(f.hash))}catch(x){console.warn(x)}if(se){pr(se,f.hash);return}}window.scrollTo(0,a)})}}catch(g){if(!/fetch/.test(g.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(g),!u)try{const C=await fetch(_t.value.base+"hashmap.json");window.__VP_HASH_MAP__=await C.json(),await i(l,a,!0);return}catch{}r===m&&(r=null,n.path=$e?m:kn(m),n.component=t?dn(t):null,n.data=wi)}}return $e&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const u=l.target.closest("a");if(u&&!u.closest(".vp-raw")&&!u.download){const{href:f,origin:m,pathname:g,hash:C,search:F,target:B}=u,se=window.location,x=g.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&B!=="_blank"&&m===se.origin&&!(x&&x[0]!==".html")&&(l.preventDefault(),g===se.pathname&&F===se.search?C&&C!==se.hash&&(history.pushState(null,"",C),window.dispatchEvent(new Event("hashchange")),pr(u,C,u.classList.contains("header-anchor"))):o(f))}},{capture:!0}),window.addEventListener("popstate",l=>{i(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function go(){const e=Ze(Ei);if(!e)throw new Error("useRouter() is called without provider.");return e}function wt(){return go().route}function pr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(o){console.warn(o)}if(s){let o=_t.value.scrollOffset;typeof o=="string"&&(o=document.querySelector(o).getBoundingClientRect().bottom+24);const r=parseInt(window.getComputedStyle(s).paddingTop,10),i=window.scrollY+s.getBoundingClientRect().top-o+r;!n||Math.abs(i-window.scrollY)>window.innerHeight?window.scrollTo(0,i):window.scrollTo({left:0,top:i,behavior:"smooth"})}}const Ic=K({name:"VitePressContent",props:{onContentUpdated:Function},setup(e){const t=wt();return fo(()=>{var n;(n=e.onContentUpdated)==null||n.call(e)}),()=>Gn("div",{style:{position:"relative"}},[t.component?Gn(t.component):null])}}),_e=Si;var _r;const Cn=typeof window<"u",Nc=e=>typeof e=="string",Oc=()=>{};Cn&&((_r=window==null?void 0:window.navigator)!=null&&_r.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Hc(e){return typeof e=="function"?e():_(e)}function Bc(e){return e}function Ti(e){return ol()?(rl(e),!0):!1}function Fc(e){return typeof e=="function"?G(e):pe(e)}function zc(e,t=!0){hs()?Fe(e):t?e():is(e)}function Rc(e){var t;const n=Hc(e);return(t=n==null?void 0:n.$el)!=null?t:n}const yo=Cn?window:void 0;Cn&&window.document;Cn&&window.navigator;Cn&&window.location;function Dc(...e){let t,n,s,o;if(Nc(e[0])||Array.isArray(e[0])?([n,s,o]=e,t=yo):[t,n,s,o]=e,!t)return Oc;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const r=[],i=()=>{r.forEach(f=>f()),r.length=0},l=(f,m,g)=>(f.addEventListener(m,g,o),()=>f.removeEventListener(m,g,o)),a=tt(()=>Rc(t),f=>{i(),f&&r.push(...n.flatMap(m=>s.map(g=>l(f,m,g))))},{immediate:!0,flush:"post"}),u=()=>{a(),i()};return Ti(u),u}function Uc(e,t=!1){const n=pe(),s=()=>n.value=Boolean(e());return s(),zc(s,t),n}function js(e,t={}){const{window:n=yo}=t,s=Uc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const r=pe(!1),i=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",l):o.removeListener(l))},l=()=>{s.value&&(i(),o=n.matchMedia(Fc(e).value),r.value=o.matches,"addEventListener"in o?o.addEventListener("change",l):o.addListener(l))};return yt(l),Ti(()=>i()),r}const Ks=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},qs="__vueuse_ssr_handlers__";Ks[qs]=Ks[qs]||{};Ks[qs];var mr;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(mr||(mr={}));var jc=Object.defineProperty,vr=Object.getOwnPropertySymbols,Kc=Object.prototype.hasOwnProperty,qc=Object.prototype.propertyIsEnumerable,gr=(e,t,n)=>t in e?jc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Wc=(e,t)=>{for(var n in t||(t={}))Kc.call(t,n)&&gr(e,n,t[n]);if(vr)for(var n of vr(t))qc.call(t,n)&&gr(e,n,t[n]);return e};const Yc={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};Wc({linear:Bc},Yc);function Gc({window:e=yo}={}){if(!e)return{x:pe(0),y:pe(0)};const t=pe(e.pageXOffset),n=pe(e.pageYOffset);return Dc(e,"scroll",()=>{t.value=e.pageXOffset,n.value=e.pageYOffset},{capture:!1,passive:!0}),{x:t,y:n}}function Jc(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),s=!0,setTimeout(()=>{s=!1},t))}}function Ws(e){return/^\//.test(e)?e:`/${e}`}function $n(e){if(ki(e))return e.replace(kc,"");const{site:t}=_e(),{pathname:n,search:s,hash:o}=new URL(e,"http://example.com"),r=n.endsWith("/")||n.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,t.value.cleanUrls?"":".html")}${s}${o}`);return kn(r)}function Ai(e,t){if(Array.isArray(e))return e;if(e==null)return[];t=Ws(t);const n=Object.keys(e).sort((s,o)=>o.split("/").length-s.split("/").length).find(s=>t.startsWith(Ws(s)));return n?e[n]:[]}function Zc(e){const t=[];let n=0;for(const s in e){const o=e[s];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function Xc(e){const t=[];function n(s){for(const o of s)o.text&&o.link&&t.push({text:o.text,link:o.link}),o.items&&n(o.items)}return n(e),t}function Ys(e,t){return Array.isArray(t)?t.some(n=>Ys(e,n)):Ft(e,t.link)?!0:t.items?Ys(e,t.items):!1}function at(){const e=wt(),{theme:t,frontmatter:n}=_e(),s=js("(min-width: 960px)"),o=pe(!1),r=G(()=>{const C=t.value.sidebar,F=e.data.relativePath;return C?Ai(C,F):[]}),i=G(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),l=G(()=>n.value.layout!=="home"&&n.value.aside!==!1),a=G(()=>i.value&&s.value),u=G(()=>i.value?Zc(r.value):[]);function f(){o.value=!0}function m(){o.value=!1}function g(){o.value?m():f()}return{isOpen:o,sidebar:r,sidebarGroups:u,hasSidebar:i,hasAside:l,isSidebarEnabled:a,open:f,close:m,toggle:g}}function Qc(e,t){let n;yt(()=>{n=e.value?document.activeElement:void 0}),Fe(()=>{window.addEventListener("keyup",s)}),xt(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function eu(e){const{page:t}=_e(),n=pe(!1),s=G(()=>!!e.value.collapsible),o=G(()=>!!e.value.link),r=G(()=>Ft(t.value.relativePath,e.value.link)),i=G(()=>r.value?!0:e.value.items?Ys(t.value.relativePath,e.value.items):!1),l=G(()=>!!(e.value.items&&e.value.items.length));yt(()=>{n.value=!!(e.value.collapsible&&e.value.collapsed)}),yt(()=>{(r.value||i.value)&&(n.value=!1)});function a(){e.value.collapsible&&(n.value=!n.value)}return{collapsed:n,collapsible:s,isLink:o,isActiveLink:r,hasActiveLink:i,hasChildren:l,toggle:a}}const tu=K({__name:"VPSkipLink",setup(e){const t=wt(),n=pe();tt(()=>t.path,()=>n.value.focus());function s({target:o}){const r=document.querySelector(o.hash);if(r){const i=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",i)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",i),r.focus(),window.scrollTo(0,0)}}return(o,r)=>(h(),y(oe,null,[b("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),b("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const nu=R(tu,[["__scopeId","data-v-4510101b"]]),su={key:0,class:"VPBackdrop"},ou=K({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(h(),X(ps,{name:"fade"},{default:H(()=>[e.show?(h(),y("div",su)):q("",!0)]),_:1}))}});const ru=R(ou,[["__scopeId","data-v-c976f692"]]);function iu(){const e=pe(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=wt();return tt(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}function Sn({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:n,localeIndex:s,page:o,theme:r}=_e(),i=G(()=>{var a,u;return{label:(a=n.value.locales[s.value])==null?void 0:a.label,link:((u=n.value.locales[s.value])==null?void 0:u.link)||(s.value==="root"?"/":`/${s.value}/`)}});return{localeLinks:G(()=>Object.entries(n.value.locales).flatMap(([a,u])=>e&&i.value.label===u.label?[]:{text:u.label,link:lu(u.link||(a==="root"?"/":`/${a}/`),r.value.i18nRouting!==!1&&t,o.value.relativePath.slice(i.value.link.length-1),!n.value.cleanUrls)})),currentLang:i}}function lu(e,t,n,s){return t?e.replace(/\/$/,"")+Ws(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,s?".html":"")):e}const au=["src","alt"],cu={inheritAttrs:!1},uu=K({...cu,__name:"VPImage",props:{image:null,alt:null},setup(e){return(t,n)=>{const s=Bt("VPImage",!0);return e.image?(h(),y(oe,{key:0},[typeof e.image=="string"||"src"in e.image?(h(),y("img",zn({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:_(kn)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,au)):(h(),y(oe,{key:1},[N(s,zn({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),N(s,zn({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):q("",!0)}}});const bo=R(uu,[["__scopeId","data-v-079e60c3"]]),du=["href"],fu=K({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=_e(),{hasSidebar:s}=at(),{currentLang:o}=Sn();return(r,i)=>(h(),y("div",{class:ge(["VPNavBarTitle",{"has-sidebar":_(s)}])},[b("a",{class:"title",href:_($n)(_(o).link)},[T(r.$slots,"nav-bar-title-before",{},void 0,!0),_(n).logo?(h(),X(bo,{key:0,class:"logo",image:_(n).logo},null,8,["image"])):q("",!0),_(n).siteTitle?(h(),y(oe,{key:1},[Ee(ce(_(n).siteTitle),1)],64)):_(n).siteTitle===void 0?(h(),y(oe,{key:2},[Ee(ce(_(t).title),1)],64)):q("",!0),T(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,du)],2))}});const hu=R(fu,[["__scopeId","data-v-549de4de"]]);const pu={key:0,class:"VPNavBarSearch"},_u={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},mu={class:"DocSearch-Button-Container"},vu=b("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},[b("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),gu={class:"DocSearch-Button-Placeholder"},yu=b("span",{class:"DocSearch-Button-Keys"},[b("kbd",{class:"DocSearch-Button-Key"}),b("kbd",{class:"DocSearch-Button-Key"},"K")],-1),bu=K({__name:"VPNavBarSearch",setup(e){oc(u=>({"1163dab0":r.value}));const t=()=>null,{theme:n,localeIndex:s}=_e(),o=pe(!1),r=pe("'Meta'"),i=G(()=>{var u,f,m,g,C,F,B,se;return((C=(g=(m=(f=(u=n.value.algolia)==null?void 0:u.locales)==null?void 0:f[s.value])==null?void 0:m.translations)==null?void 0:g.button)==null?void 0:C.buttonText)||((se=(B=(F=n.value.algolia)==null?void 0:F.translations)==null?void 0:B.button)==null?void 0:se.buttonText)||"Search"});Fe(()=>{if(!n.value.algolia)return;r.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'";const u=m=>{m.key==="k"&&(m.ctrlKey||m.metaKey)&&(m.preventDefault(),l(),f())},f=()=>{window.removeEventListener("keydown",u)};window.addEventListener("keydown",u),xt(f)});function l(){o.value||(o.value=!0,setTimeout(a,16))}function a(){const u=new Event("keydown");u.key="k",u.metaKey=!0,window.dispatchEvent(u),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||a()},16)}return(u,f)=>_(n).algolia?(h(),y("div",pu,[o.value?(h(),X(_(t),{key:0,algolia:_(n).algolia},null,8,["algolia"])):(h(),y("div",{key:1,id:"docsearch",onClick:l},[b("button",_u,[b("span",mu,[vu,b("span",gu,ce(_(i)),1)]),yu])]))])):q("",!0)}});const xu={},wu={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},ku=b("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),$u=b("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),Pu=[ku,$u];function Cu(e,t){return h(),y("svg",wu,Pu)}const Su=R(xu,[["render",Cu]]),Lu=K({__name:"VPLink",props:{tag:null,href:null,noIcon:{type:Boolean}},setup(e){const t=e,n=G(()=>t.tag??t.href?"a":"span"),s=G(()=>t.href&&_s.test(t.href));return(o,r)=>(h(),X(bn(_(n)),{class:ge(["VPLink",{link:e.href}]),href:e.href?_($n)(e.href):void 0,target:_(s)?"_blank":void 0,rel:_(s)?"noreferrer":void 0},{default:H(()=>[T(o.$slots,"default",{},void 0,!0),_(s)&&!e.noIcon?(h(),X(Su,{key:0,class:"icon"})):q("",!0)]),_:3},8,["class","href","target","rel"]))}});const kt=R(Lu,[["__scopeId","data-v-857b9044"]]),Eu=K({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=_e();return(n,s)=>(h(),X(kt,{class:ge({VPNavBarMenuLink:!0,active:_(Ft)(_(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,noIcon:!0},{default:H(()=>[Ee(ce(e.item.text),1)]),_:1},8,["class","href"]))}});const Tu=R(Eu,[["__scopeId","data-v-b293d4cd"]]),xo=pe();let Vi=!1,Ls=0;function Au(e){const t=pe(!1);if($e){!Vi&&Vu(),Ls++;const n=tt(xo,s=>{var o,r,i;s===e.el.value||(o=e.el.value)!=null&&o.contains(s)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});xt(()=>{n(),Ls--,Ls||Mu()})}return io(t)}function Vu(){document.addEventListener("focusin",Mi),Vi=!0,xo.value=document.activeElement}function Mu(){document.removeEventListener("focusin",Mi)}function Mi(){xo.value=document.activeElement}const Iu={},Nu={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ou=b("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Hu=[Ou];function Bu(e,t){return h(),y("svg",Nu,Hu)}const Ii=R(Iu,[["render",Bu]]),Fu={},zu={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ru=b("circle",{cx:"12",cy:"12",r:"2"},null,-1),Du=b("circle",{cx:"19",cy:"12",r:"2"},null,-1),Uu=b("circle",{cx:"5",cy:"12",r:"2"},null,-1),ju=[Ru,Du,Uu];function Ku(e,t){return h(),y("svg",zu,ju)}const qu=R(Fu,[["render",Ku]]),Wu={class:"VPMenuLink"},Yu=K({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=_e();return(n,s)=>(h(),y("div",Wu,[N(kt,{class:ge({active:_(Ft)(_(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link},{default:H(()=>[Ee(ce(e.item.text),1)]),_:1},8,["class","href"])]))}});const ms=R(Yu,[["__scopeId","data-v-4055455f"]]),Gu={class:"VPMenuGroup"},Ju={key:0,class:"title"},Zu=K({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(h(),y("div",Gu,[e.text?(h(),y("p",Ju,ce(e.text),1)):q("",!0),(h(!0),y(oe,null,Te(e.items,s=>(h(),y(oe,null,["link"in s?(h(),X(ms,{key:0,item:s},null,8,["item"])):q("",!0)],64))),256))]))}});const Xu=R(Zu,[["__scopeId","data-v-06e40d8f"]]),Qu={class:"VPMenu"},ed={key:0,class:"items"},td=K({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(h(),y("div",Qu,[e.items?(h(),y("div",ed,[(h(!0),y(oe,null,Te(e.items,s=>(h(),y(oe,{key:s.text},["link"in s?(h(),X(ms,{key:0,item:s},null,8,["item"])):(h(),X(Xu,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):q("",!0),T(t.$slots,"default",{},void 0,!0)]))}});const nd=R(td,[["__scopeId","data-v-5ba41aea"]]),sd=["aria-expanded","aria-label"],od={key:0,class:"text"},rd={class:"menu"},id=K({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=pe(!1),n=pe();Au({el:n,onBlur:s});function s(){t.value=!1}return(o,r)=>(h(),y("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=i=>t.value=!0),onMouseleave:r[2]||(r[2]=i=>t.value=!1)},[b("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=i=>t.value=!t.value)},[e.button||e.icon?(h(),y("span",od,[e.icon?(h(),X(bn(e.icon),{key:0,class:"option-icon"})):q("",!0),Ee(" "+ce(e.button)+" ",1),N(Ii,{class:"text-icon"})])):(h(),X(qu,{key:1,class:"icon"}))],8,sd),b("div",rd,[N(nd,{items:e.items},{default:H(()=>[T(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const wo=R(id,[["__scopeId","data-v-49ae13ed"]]),ld=K({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const{page:t}=_e();return(n,s)=>(h(),X(wo,{class:ge({VPNavBarMenuGroup:!0,active:_(Ft)(_(t).relativePath,e.item.activeMatch,!!e.item.activeMatch)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ad=e=>(st("data-v-33721c64"),e=e(),ot(),e),cd={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},ud=ad(()=>b("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),dd=K({__name:"VPNavBarMenu",setup(e){const{theme:t}=_e();return(n,s)=>_(t).nav?(h(),y("nav",cd,[ud,(h(!0),y(oe,null,Te(_(t).nav,o=>(h(),y(oe,{key:o.text},["link"in o?(h(),X(Tu,{key:0,item:o},null,8,["item"])):(h(),X(ld,{key:1,item:o},null,8,["item"]))],64))),128))])):q("",!0)}});const fd=R(dd,[["__scopeId","data-v-33721c64"]]),hd={},pd={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_d=b("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),md=b("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),vd=[_d,md];function gd(e,t){return h(),y("svg",pd,vd)}const Ni=R(hd,[["render",gd]]),yd={class:"items"},bd={class:"title"},xd=K({__name:"VPNavBarTranslations",setup(e){const{localeLinks:t,currentLang:n}=Sn({correspondingLink:!0});return(s,o)=>_(t).length&&_(n).label?(h(),X(wo,{key:0,class:"VPNavBarTranslations",icon:Ni},{default:H(()=>[b("div",yd,[b("p",bd,ce(_(n).label),1),(h(!0),y(oe,null,Te(_(t),r=>(h(),X(ms,{key:r.link,item:r},null,8,["item"]))),128))])]),_:1})):q("",!0)}});const wd=R(xd,[["__scopeId","data-v-c624b2dc"]]);const kd={},$d={class:"VPSwitch",type:"button",role:"switch"},Pd={class:"check"},Cd={key:0,class:"icon"};function Sd(e,t){return h(),y("button",$d,[b("span",Pd,[e.$slots.default?(h(),y("span",Cd,[T(e.$slots,"default",{},void 0,!0)])):q("",!0)])])}const Ld=R(kd,[["render",Sd],["__scopeId","data-v-d161f211"]]),Ed={},Td={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ad=Sa('',9),Vd=[Ad];function Md(e,t){return h(),y("svg",Td,Vd)}const Id=R(Ed,[["render",Md]]),Nd={},Od={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Hd=b("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Bd=[Hd];function Fd(e,t){return h(),y("svg",Od,Bd)}const zd=R(Nd,[["render",Fd]]),Rd=K({__name:"VPSwitchAppearance",setup(e){const{site:t,isDark:n}=_e(),s=pe(!1),o=typeof localStorage<"u"?r():()=>{};Fe(()=>{s.value=document.documentElement.classList.contains("dark")});function r(){const i=window.matchMedia("(prefers-color-scheme: dark)"),l=document.documentElement.classList;let a=localStorage.getItem(ur),u=t.value.appearance==="dark"&&a==null||(a==="auto"||a==null?i.matches:a==="dark");i.onchange=g=>{a==="auto"&&m(u=g.matches)};function f(){m(u=!u),a=u?i.matches?"auto":"dark":i.matches?"light":"auto",localStorage.setItem(ur,a)}function m(g){const C=document.createElement("style");C.type="text/css",C.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { -webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; -ms-transition: none !important; transition: none !important; -}`)),document.head.appendChild(C),s.value=g,l[g?"add":"remove"]("dark"),window.getComputedStyle(C).opacity,document.head.removeChild(C)}return f}return tt(s,i=>{n.value=i}),(i,l)=>(h(),X(Ld,{class:"VPSwitchAppearance","aria-label":"toggle dark mode","aria-checked":s.value,onClick:_(o)},{default:H(()=>[N(Id,{class:"sun"}),N(Fd,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const ko=R(Rd,[["__scopeId","data-v-b602623b"]]),Dd={key:0,class:"VPNavBarAppearance"},Ud=K({__name:"VPNavBarAppearance",setup(e){const{site:t}=_e();return(n,s)=>_(t).appearance?(h(),y("div",Dd,[N(ko)])):q("",!0)}});const jd=R(Ud,[["__scopeId","data-v-368654cb"]]),Kd={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},qd=["href","innerHTML"],Wd=K({__name:"VPSocialLink",props:{icon:null,link:null},setup(e){const t=e,n=G(()=>typeof t.icon=="object"?t.icon.svg:Kd[t.icon]);return(s,o)=>(h(),y("a",{class:"VPSocialLink",href:e.link,target:"_blank",rel:"noopener",innerHTML:_(n)},null,8,qd))}});const Yd=R(Wd,[["__scopeId","data-v-51a76c22"]]),Gd={class:"VPSocialLinks"},Jd=K({__name:"VPSocialLinks",props:{links:null},setup(e){return(t,n)=>(h(),y("div",Gd,[(h(!0),y(oe,null,Te(e.links,({link:s,icon:o})=>(h(),X(Yd,{key:s,icon:o,link:s},null,8,["icon","link"]))),128))]))}});const $o=R(Jd,[["__scopeId","data-v-6f460e71"]]),Zd=K({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=_e();return(n,s)=>_(t).socialLinks?(h(),X($o,{key:0,class:"VPNavBarSocialLinks",links:_(t).socialLinks},null,8,["links"])):q("",!0)}});const Xd=R(Zd,[["__scopeId","data-v-b74b5d6b"]]),Qd={key:0,class:"group"},ef={class:"trans-title"},tf={key:1,class:"group"},nf={class:"item appearance"},sf={class:"label"},of={class:"appearance-action"},rf={key:2,class:"group"},lf={class:"item social-links"},af=K({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=_e(),{localeLinks:s,currentLang:o}=Sn({correspondingLink:!0}),r=G(()=>s.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(i,l)=>_(r)?(h(),X(wo,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:H(()=>[_(s).length&&_(o).label?(h(),y("div",Qd,[b("p",ef,ce(_(o).label),1),(h(!0),y(oe,null,Te(_(s),a=>(h(),X(ms,{key:a.link,item:a},null,8,["item"]))),128))])):q("",!0),_(t).appearance?(h(),y("div",tf,[b("div",nf,[b("p",sf,ce(_(n).darkModeSwitchLabel||"Appearance"),1),b("div",of,[N(ko)])])])):q("",!0),_(n).socialLinks?(h(),y("div",rf,[b("div",lf,[N($o,{class:"social-links-list",links:_(n).socialLinks},null,8,["links"])])])):q("",!0)]),_:1})):q("",!0)}});const cf=R(af,[["__scopeId","data-v-d5f0985d"]]),uf=e=>(st("data-v-7b6c7fd5"),e=e(),ot(),e),df=["aria-expanded"],ff=uf(()=>b("span",{class:"container"},[b("span",{class:"top"}),b("span",{class:"middle"}),b("span",{class:"bottom"})],-1)),hf=[ff],pf=K({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(h(),y("button",{type:"button",class:ge(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},hf,10,df))}});const _f=R(pf,[["__scopeId","data-v-7b6c7fd5"]]),mf=e=>(st("data-v-b274701f"),e=e(),ot(),e),vf={class:"container"},gf={class:"title"},yf={class:"content"},bf=mf(()=>b("div",{class:"curtain"},null,-1)),xf={class:"content-body"},wf=K({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Gc(),{hasSidebar:n}=at(),s=G(()=>({"has-sidebar":n.value,fill:t.value>0}));return(o,r)=>(h(),y("div",{class:ge(["VPNavBar",_(s)])},[b("div",vf,[b("div",gf,[N(hu,null,{"nav-bar-title-before":H(()=>[T(o.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":H(()=>[T(o.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),b("div",yf,[bf,b("div",xf,[T(o.$slots,"nav-bar-content-before",{},void 0,!0),N(bu,{class:"search"}),N(fd,{class:"menu"}),N(wd,{class:"translations"}),N(jd,{class:"appearance"}),N(Xd,{class:"social-links"}),N(cf,{class:"extra"}),T(o.$slots,"nav-bar-content-after",{},void 0,!0),N(_f,{class:"hamburger",active:e.isScreenOpen,onClick:r[0]||(r[0]=i=>o.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const kf=R(wf,[["__scopeId","data-v-b274701f"]]);function $f(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1),Zt=[],Zn=!1,Co=-1,pn=void 0,Nt=void 0,_n=void 0,Oi=function(t){return Zt.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(t))})},Xn=function(t){var n=t||window.event;return Oi(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},Pf=function(t){if(_n===void 0){var n=!!t&&t.reserveScrollBarGap===!0,s=window.innerWidth-document.documentElement.clientWidth;if(n&&s>0){var o=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);_n=document.body.style.paddingRight,document.body.style.paddingRight=o+s+"px"}}pn===void 0&&(pn=document.body.style.overflow,document.body.style.overflow="hidden")},Cf=function(){_n!==void 0&&(document.body.style.paddingRight=_n,_n=void 0),pn!==void 0&&(document.body.style.overflow=pn,pn=void 0)},Sf=function(){return window.requestAnimationFrame(function(){if(Nt===void 0){Nt={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var t=window,n=t.scrollY,s=t.scrollX,o=t.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-s,setTimeout(function(){return window.requestAnimationFrame(function(){var r=o-window.innerHeight;r&&n>=o&&(document.body.style.top=-(n+r))})},300)}})},Lf=function(){if(Nt!==void 0){var t=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=Nt.position,document.body.style.top=Nt.top,document.body.style.left=Nt.left,window.scrollTo(n,t),Nt=void 0}},Ef=function(t){return t?t.scrollHeight-t.scrollTop<=t.clientHeight:!1},Tf=function(t,n){var s=t.targetTouches[0].clientY-Co;return Oi(t.target)?!1:n&&n.scrollTop===0&&s>0||Ef(n)&&s<0?Xn(t):(t.stopPropagation(),!0)},Hi=function(t,n){if(!t){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!Zt.some(function(o){return o.targetElement===t})){var s={targetElement:t,options:n||{}};Zt=[].concat($f(Zt),[s]),Jn?Sf():Pf(n),Jn&&(t.ontouchstart=function(o){o.targetTouches.length===1&&(Co=o.targetTouches[0].clientY)},t.ontouchmove=function(o){o.targetTouches.length===1&&Tf(o,t)},Zn||(document.addEventListener("touchmove",Xn,Po?{passive:!1}:void 0),Zn=!0))}},Bi=function(){Jn&&(Zt.forEach(function(t){t.targetElement.ontouchstart=null,t.targetElement.ontouchmove=null}),Zn&&(document.removeEventListener("touchmove",Xn,Po?{passive:!1}:void 0),Zn=!1),Co=-1),Jn?Lf():Cf(),Zt=[]};const Af=K({__name:"VPNavScreenMenuLink",props:{text:null,link:null},setup(e){const t=Ze("close-screen");return(n,s)=>(h(),X(kt,{class:"VPNavScreenMenuLink",href:e.link,onClick:_(t)},{default:H(()=>[Ee(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const Vf=R(Af,[["__scopeId","data-v-a0f93cab"]]),Mf={},If={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Nf=b("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),Of=[Nf];function Hf(e,t){return h(),y("svg",If,Of)}const Bf=R(Mf,[["render",Hf]]),zf=K({__name:"VPNavScreenMenuGroupLink",props:{text:null,link:null},setup(e){const t=Ze("close-screen");return(n,s)=>(h(),X(kt,{class:"VPNavScreenMenuGroupLink",href:e.link,onClick:_(t)},{default:H(()=>[Ee(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const zi=R(zf,[["__scopeId","data-v-5506f05e"]]),Ff={class:"VPNavScreenMenuGroupSection"},Rf={key:0,class:"title"},Df=K({__name:"VPNavScreenMenuGroupSection",props:{text:null,items:null},setup(e){return(t,n)=>(h(),y("div",Ff,[e.text?(h(),y("p",Rf,ce(e.text),1)):q("",!0),(h(!0),y(oe,null,Te(e.items,s=>(h(),X(zi,{key:s.text,text:s.text,link:s.link},null,8,["text","link"]))),128))]))}});const Uf=R(Df,[["__scopeId","data-v-f51d079d"]]),jf=["aria-controls","aria-expanded"],Kf={class:"button-text"},qf=["id"],Wf={key:1,class:"group"},Yf=K({__name:"VPNavScreenMenuGroup",props:{text:null,items:null},setup(e){const t=e,n=pe(!1),s=G(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,i)=>(h(),y("div",{class:ge(["VPNavScreenMenuGroup",{open:n.value}])},[b("button",{class:"button","aria-controls":_(s),"aria-expanded":n.value,onClick:o},[b("span",Kf,ce(e.text),1),N(Bf,{class:"button-icon"})],8,jf),b("div",{id:_(s),class:"items"},[(h(!0),y(oe,null,Te(e.items,l=>(h(),y(oe,{key:l.text},["link"in l?(h(),y("div",{key:l.text,class:"item"},[N(zi,{text:l.text,link:l.link},null,8,["text","link"])])):(h(),y("div",Wf,[N(Uf,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,qf)],2))}});const Gf=R(Yf,[["__scopeId","data-v-822d3f2a"]]),Jf={key:0,class:"VPNavScreenMenu"},Zf=K({__name:"VPNavScreenMenu",setup(e){const{theme:t}=_e();return(n,s)=>_(t).nav?(h(),y("nav",Jf,[(h(!0),y(oe,null,Te(_(t).nav,o=>(h(),y(oe,{key:o.text},["link"in o?(h(),X(Vf,{key:0,text:o.text,link:o.link},null,8,["text","link"])):(h(),X(Gf,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):q("",!0)}}),Xf={key:0,class:"VPNavScreenAppearance"},Qf={class:"text"},eh=K({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=_e();return(s,o)=>_(t).appearance?(h(),y("div",Xf,[b("p",Qf,ce(_(n).darkModeSwitchLabel||"Appearance"),1),N(ko)])):q("",!0)}});const th=R(eh,[["__scopeId","data-v-4bca1ae7"]]),nh={class:"list"},sh=K({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=Sn({correspondingLink:!0}),s=pe(!1);function o(){s.value=!s.value}return(r,i)=>_(t).length&&_(n).label?(h(),y("div",{key:0,class:ge(["VPNavScreenTranslations",{open:s.value}])},[b("button",{class:"title",onClick:o},[N(Ni,{class:"icon lang"}),Ee(" "+ce(_(n).label)+" ",1),N(Ii,{class:"icon chevron"})]),b("ul",nh,[(h(!0),y(oe,null,Te(_(t),l=>(h(),y("li",{key:l.link,class:"item"},[N(kt,{class:"link",href:l.link},{default:H(()=>[Ee(ce(l.text),1)]),_:2},1032,["href"])]))),128))])],2)):q("",!0)}});const oh=R(sh,[["__scopeId","data-v-0cf8d6f2"]]),rh=K({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=_e();return(n,s)=>_(t).socialLinks?(h(),X($o,{key:0,class:"VPNavScreenSocialLinks",links:_(t).socialLinks},null,8,["links"])):q("",!0)}}),ih={class:"container"},lh=K({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=pe(null);function n(){Hi(t.value,{reserveScrollBarGap:!0})}function s(){Bi()}return(o,r)=>(h(),X(ps,{name:"fade",onEnter:n,onAfterLeave:s},{default:H(()=>[e.open?(h(),y("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t},[b("div",ih,[T(o.$slots,"nav-screen-content-before",{},void 0,!0),N(Zf,{class:"menu"}),N(oh,{class:"translations"}),N(th,{class:"appearance"}),N(rh,{class:"social-links"}),T(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):q("",!0)]),_:3}))}});const ah=R(lh,[["__scopeId","data-v-d1f53b3f"]]),ch={class:"VPNav"},uh=K({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=iu();return Yt("close-screen",n),(o,r)=>(h(),y("header",ch,[N(kf,{"is-screen-open":_(t),onToggleScreen:_(s)},{"nav-bar-title-before":H(()=>[T(o.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":H(()=>[T(o.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":H(()=>[T(o.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":H(()=>[T(o.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),N(ah,{open:_(t)},{"nav-screen-content-before":H(()=>[T(o.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":H(()=>[T(o.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const dh=R(uh,[["__scopeId","data-v-55561c08"]]),fh={},hh={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ph=b("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),_h=b("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),mh=b("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),vh=b("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),gh=[ph,_h,mh,vh];function yh(e,t){return h(),y("svg",hh,gh)}const bh=R(fh,[["render",yh]]),xh={key:0,class:"VPLocalNav"},wh=["aria-expanded"],kh={class:"menu-text"},$h=K({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t}=_e(),{hasSidebar:n}=at();function s(){window.scrollTo({top:0,left:0,behavior:"smooth"})}return(o,r)=>_(n)?(h(),y("div",xh,[b("button",{class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:r[0]||(r[0]=i=>o.$emit("open-menu"))},[N(bh,{class:"menu-icon"}),b("span",kh,ce(_(t).sidebarMenuLabel||"Menu"),1)],8,wh),b("a",{class:"top-link",href:"#",onClick:s},ce(_(t).returnToTopLabel||"Return to top"),1)])):q("",!0)}});const Ph=R($h,[["__scopeId","data-v-9fc14245"]]),Ch={},Sh={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Lh=b("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Eh=[Lh];function Th(e,t){return h(),y("svg",Sh,Eh)}const Ah=R(Ch,[["render",Th]]),Vh=e=>(st("data-v-6646d2d3"),e=e(),ot(),e),Mh=["role"],Ih=Vh(()=>b("div",{class:"indicator"},null,-1)),Nh={key:1,class:"items"},Oh=K({__name:"VPSidebarItem",props:{item:null,depth:null},setup(e){const t=e,{collapsed:n,collapsible:s,isLink:o,isActiveLink:r,hasActiveLink:i,hasChildren:l,toggle:a}=eu(G(()=>t.item)),u=G(()=>l.value?"section":"div"),f=G(()=>o.value?"a":"div"),m=G(()=>l.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),g=G(()=>o.value?void 0:"button"),C=G(()=>[[`level-${t.depth}`],{collapsible:s.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":i.value}]);function z(){!t.item.link&&a()}function B(){t.item.link&&a()}return(se,x)=>{const V=Bt("VPSidebarItem",!0);return h(),X(bn(_(u)),{class:ge(["VPSidebarItem",_(C)])},{default:H(()=>[e.item.text?(h(),y("div",{key:0,class:"item",role:_(g),onClick:z},[Ih,N(kt,{tag:_(f),class:"link",href:e.item.link},{default:H(()=>[(h(),X(bn(_(m)),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"]),b("div",{class:"caret",role:"button",onClick:B},[e.item.collapsible?(h(),X(Ah,{key:0,class:"caret-icon"})):q("",!0)])],8,Mh)):q("",!0),e.item.items&&e.item.items.length?(h(),y("div",Nh,[e.depth<5?(h(!0),y(oe,{key:0},Te(e.item.items,E=>(h(),X(V,{key:E.text,item:E,depth:e.depth+1},null,8,["item","depth"]))),128)):q("",!0)])):q("",!0)]),_:1},8,["class"])}}});const Hh=R(Oh,[["__scopeId","data-v-6646d2d3"]]),Fi=e=>(st("data-v-8a8550ea"),e=e(),ot(),e),Bh=Fi(()=>b("div",{class:"curtain"},null,-1)),zh={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Fh=Fi(()=>b("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Rh=K({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebarGroups:n,hasSidebar:s}=at();let o=pe(null);function r(){Hi(o.value,{reserveScrollBarGap:!0})}function i(){Bi()}return Zr(async()=>{var l;t.open?(r(),(l=o.value)==null||l.focus()):i()}),(l,a)=>_(s)?(h(),y("aside",{key:0,class:ge(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:a[0]||(a[0]=fc(()=>{},["stop"]))},[Bh,b("nav",zh,[Fh,T(l.$slots,"sidebar-nav-before",{},void 0,!0),(h(!0),y(oe,null,Te(_(n),u=>(h(),y("div",{key:u.text,class:"group"},[N(Hh,{item:u,depth:0},null,8,["item"])]))),128)),T(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):q("",!0)}});const Dh=R(Rh,[["__scopeId","data-v-8a8550ea"]]),Uh={},jh={class:"VPPage"};function Kh(e,t){const n=Bt("Content");return h(),y("div",jh,[N(n)])}const qh=R(Uh,[["render",Kh]]),Wh=K({__name:"VPButton",props:{tag:null,size:null,theme:null,text:null,href:null},setup(e){const t=e,n=G(()=>[t.size??"medium",t.theme??"brand"]),s=G(()=>t.href&&_s.test(t.href)),o=G(()=>t.tag?t.tag:t.href?"a":"button");return(r,i)=>(h(),X(bn(_(o)),{class:ge(["VPButton",_(n)]),href:e.href?_($n)(e.href):void 0,target:_(s)?"_blank":void 0,rel:_(s)?"noreferrer":void 0},{default:H(()=>[Ee(ce(e.text),1)]),_:1},8,["class","href","target","rel"]))}});const Yh=R(Wh,[["__scopeId","data-v-fc99c671"]]),Gh=e=>(st("data-v-425d0d05"),e=e(),ot(),e),Jh={class:"container"},Zh={class:"main"},Xh={key:0,class:"name"},Qh={class:"clip"},e0={key:1,class:"text"},t0={key:2,class:"tagline"},n0={key:3,class:"actions"},s0={key:0,class:"image"},o0={class:"image-container"},r0=Gh(()=>b("div",{class:"image-bg"},null,-1)),i0=K({__name:"VPHero",props:{name:null,text:null,tagline:null,image:null,actions:null},setup(e){const t=Ze("hero-image-slot-exists");return(n,s)=>(h(),y("div",{class:ge(["VPHero",{"has-image":e.image||_(t)}])},[b("div",Jh,[b("div",Zh,[e.name?(h(),y("h1",Xh,[b("span",Qh,ce(e.name),1)])):q("",!0),e.text?(h(),y("p",e0,ce(e.text),1)):q("",!0),e.tagline?(h(),y("p",t0,ce(e.tagline),1)):q("",!0),e.actions?(h(),y("div",n0,[(h(!0),y(oe,null,Te(e.actions,o=>(h(),y("div",{key:o.link,class:"action"},[N(Yh,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):q("",!0)]),e.image||_(t)?(h(),y("div",s0,[b("div",o0,[r0,T(n.$slots,"home-hero-image",{},()=>[e.image?(h(),X(bo,{key:0,class:"image-src",image:e.image},null,8,["image"])):q("",!0)],!0)])])):q("",!0)])],2))}});const l0=R(i0,[["__scopeId","data-v-425d0d05"]]),a0=K({__name:"VPHomeHero",setup(e){const{frontmatter:t}=_e();return(n,s)=>_(t).hero?(h(),X(l0,{key:0,class:"VPHomeHero",name:_(t).hero.name,text:_(t).hero.text,tagline:_(t).hero.tagline,image:_(t).hero.image,actions:_(t).hero.actions},{"home-hero-image":H(()=>[T(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):q("",!0)}}),c0={},u0={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},d0=b("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),f0=[d0];function h0(e,t){return h(),y("svg",u0,f0)}const p0=R(c0,[["render",h0]]),_0={class:"box"},m0={key:1,class:"icon"},v0={class:"title"},g0={class:"details"},y0={key:2,class:"link-text"},b0={class:"link-text-value"},x0=K({__name:"VPFeature",props:{icon:null,title:null,details:null,link:null,linkText:null},setup(e){return(t,n)=>(h(),X(kt,{class:"VPFeature",href:e.link,"no-icon":!0},{default:H(()=>[b("article",_0,[typeof e.icon=="object"?(h(),X(bo,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(h(),y("div",m0,ce(e.icon),1)):q("",!0),b("h2",v0,ce(e.title),1),b("p",g0,ce(e.details),1),e.linkText?(h(),y("div",y0,[b("p",b0,[Ee(ce(e.linkText)+" ",1),N(p0,{class:"link-text-icon"})])])):q("",!0)])]),_:1},8,["href"]))}});const w0=R(x0,[["__scopeId","data-v-cdca53ce"]]),k0={key:0,class:"VPFeatures"},$0={class:"container"},P0={class:"items"},C0=K({__name:"VPFeatures",props:{features:null},setup(e){const t=e,n=G(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s%2===0)return"grid-4"}else return});return(s,o)=>e.features?(h(),y("div",k0,[b("div",$0,[b("div",P0,[(h(!0),y(oe,null,Te(e.features,r=>(h(),y("div",{key:r.title,class:ge(["item",[_(n)]])},[N(w0,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):q("",!0)}});const S0=R(C0,[["__scopeId","data-v-1c679899"]]),L0=K({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=_e();return(n,s)=>_(t).features?(h(),X(S0,{key:0,class:"VPHomeFeatures",features:_(t).features},null,8,["features"])):q("",!0)}}),E0={class:"VPHome"},T0=K({__name:"VPHome",setup(e){return(t,n)=>{const s=Bt("Content");return h(),y("div",E0,[T(t.$slots,"home-hero-before",{},void 0,!0),N(a0,null,{"home-hero-image":H(()=>[T(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),T(t.$slots,"home-hero-after",{},void 0,!0),T(t.$slots,"home-features-before",{},void 0,!0),N(L0),T(t.$slots,"home-features-after",{},void 0,!0),N(s)])}}});const A0=R(T0,[["__scopeId","data-v-1d0c2f41"]]);function V0(){const{hasSidebar:e}=at(),t=js("(min-width: 960px)"),n=js("(min-width: 1280px)");return{isAsideEnabled:G(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const M0=71;function I0(e,t){if(e===!1)return[];let n=[];return document.querySelectorAll("h2, h3, h4, h5, h6").forEach(s=>{if(s.textContent&&s.id){let o=s.textContent;if(t===!1){const r=s.cloneNode(!0);for(const i of r.querySelectorAll(".VPBadge"))i.remove();o=r.textContent||""}n.push({level:Number(s.tagName[1]),title:o.replace(/\s+#\s*$/,""),link:`#${s.id}`})}}),N0(n,e)}function N0(e,t){const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2;return O0(e,typeof n=="number"?[n,n]:n==="deep"?[2,6]:n)}function O0(e,t){const n=[];return e=e.map(s=>({...s})),e.forEach((s,o)=>{s.level>=t[0]&&s.level<=t[1]&&H0(o,e,t)&&n.push(s)}),n}function H0(e,t,n){if(e===0)return!0;const s=t[e];for(let o=e-1;o>=0;o--){const r=t[o];if(r.level=n[0]&&r.level<=n[1])return r.children==null&&(r.children=[]),r.children.push(s),!1}return!0}function B0(e,t){const{isAsideEnabled:n}=V0(),s=Jc(r,100);let o=null;ze(()=>{requestAnimationFrame(r),window.addEventListener("scroll",s)}),fo(()=>{i(location.hash)}),xt(()=>{window.removeEventListener("scroll",s)});function r(){if(!n.value)return;const l=[].slice.call(e.value.querySelectorAll(".outline-link")),a=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(C=>l.some(z=>z.hash===C.hash&&C.offsetParent!==null)),u=window.scrollY,f=window.innerHeight,m=document.body.offsetHeight,g=Math.abs(u+f-m)<1;if(a.length&&g){i(a[a.length-1].hash);return}for(let C=0;C{const s=Bt("VPDocAsideOutlineItem",!0);return h(),y("ul",{class:ge(e.root?"root":"nested")},[(h(!0),y(oe,null,Te(e.headers,({children:o,link:r,title:i})=>(h(),y("li",null,[b("a",{class:"outline-link",href:r,onClick:n[0]||(n[0]=(...l)=>e.onClick&&e.onClick(...l))},ce(i),9,F0),o!=null&&o.length?(h(),X(s,{key:0,headers:o,onClick:e.onClick},null,8,["headers","onClick"])):q("",!0)]))),256))],2)}}});const D0=R(R0,[["__scopeId","data-v-e23b97f7"]]),U0=e=>(st("data-v-ac019323"),e=e(),ot(),e),j0={class:"content"},K0={class:"outline-title"},q0={"aria-labelledby":"doc-outline-aria-label"},W0=U0(()=>b("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Y0=K({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=_e(),s=G(()=>t.value.outline??n.value.outline),o=Ze("onContentUpdated");o.value=()=>{r.value=I0(s.value,n.value.outlineBadges)};const r=pe([]),i=G(()=>r.value.length>0),l=pe(),a=pe();B0(l,a);function u({target:f}){const m="#"+f.href.split("#")[1],g=document.querySelector(decodeURIComponent(m));g==null||g.focus()}return(f,m)=>(h(),y("div",{class:ge(["VPDocAsideOutline",{"has-outline":_(i)}]),ref_key:"container",ref:l},[b("div",j0,[b("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),b("div",K0,ce(typeof _(n).outline=="object"&&!Array.isArray(_(n).outline)&&_(n).outline.label||_(n).outlineTitle||"On this page"),1),b("nav",q0,[W0,N(D0,{headers:r.value,root:!0,onClick:u},null,8,["headers"])])])],2))}});const G0=R(Y0,[["__scopeId","data-v-ac019323"]]),J0={class:"VPDocAsideCarbonAds"},Z0=K({__name:"VPDocAsideCarbonAds",props:{carbonAds:null},setup(e){const t=()=>null;return(n,s)=>(h(),y("div",J0,[N(_(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),X0=e=>(st("data-v-1b364ca7"),e=e(),ot(),e),Q0={class:"VPDocAside"},ep=X0(()=>b("div",{class:"spacer"},null,-1)),tp=K({__name:"VPDocAside",setup(e){const{theme:t}=_e();return(n,s)=>(h(),y("div",Q0,[T(n.$slots,"aside-top",{},void 0,!0),T(n.$slots,"aside-outline-before",{},void 0,!0),N(G0),T(n.$slots,"aside-outline-after",{},void 0,!0),ep,T(n.$slots,"aside-ads-before",{},void 0,!0),_(t).carbonAds?(h(),X(Z0,{key:0,"carbon-ads":_(t).carbonAds},null,8,["carbon-ads"])):q("",!0),T(n.$slots,"aside-ads-after",{},void 0,!0),T(n.$slots,"aside-bottom",{},void 0,!0)]))}});const np=R(tp,[["__scopeId","data-v-1b364ca7"]]);function sp(){const{theme:e,page:t}=_e();return G(()=>{const{text:n="Edit this page",pattern:s=""}=e.value.editLink||{},{relativePath:o}=t.value;return{url:s.replace(/:path/g,o),text:n}})}function op(){const{page:e,theme:t,frontmatter:n}=_e();return G(()=>{const s=Ai(t.value.sidebar,e.value.relativePath),o=Xc(s),r=o.findIndex(i=>zt(e.value.relativePath,i.link));return{prev:n.value.prev?{...o[r-1],text:n.value.prev}:o[r-1],next:n.value.next?{...o[r+1],text:n.value.next}:o[r+1]}})}const rp={},ip={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},lp=b("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),ap=b("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),cp=[lp,ap];function up(e,t){return h(),y("svg",ip,cp)}const dp=R(rp,[["render",up]]),fp={class:"VPLastUpdated"},hp=["datetime"],pp=K({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n}=_e(),s=G(()=>new Date(n.value.lastUpdated)),o=G(()=>s.value.toISOString()),r=pe("");return ze(()=>{yt(()=>{r.value=s.value.toLocaleString(window.navigator.language)})}),(i,l)=>(h(),y("p",fp,[Ee(ce(_(t).lastUpdatedText||"Last updated")+": ",1),b("time",{datetime:_(o)},ce(r.value),9,hp)]))}});const _p=R(pp,[["__scopeId","data-v-a6a422eb"]]),mp={key:0,class:"VPDocFooter"},vp={key:0,class:"edit-info"},gp={key:0,class:"edit-link"},yp={key:1,class:"last-updated"},bp={key:1,class:"prev-next"},xp={class:"pager"},wp=["href"],kp=["innerHTML"],$p=["innerHTML"],Pp=["href"],Cp=["innerHTML"],Sp=["innerHTML"],Lp=K({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=_e(),o=sp(),r=op(),i=G(()=>t.value.editLink&&s.value.editLink!==!1),l=G(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),a=G(()=>i.value||l.value||r.value.prev||r.value.next);return(u,f)=>{var m,g;return _(a)?(h(),y("footer",mp,[_(i)||_(l)?(h(),y("div",vp,[_(i)?(h(),y("div",gp,[N(kt,{class:"edit-link-button",href:_(o).url,"no-icon":!0},{default:H(()=>[N(dp,{class:"edit-link-icon"}),Ee(" "+ce(_(o).text),1)]),_:1},8,["href"])])):q("",!0),_(l)?(h(),y("div",yp,[N(_p)])):q("",!0)])):q("",!0),_(r).prev||_(r).next?(h(),y("div",bp,[b("div",xp,[_(r).prev?(h(),y("a",{key:0,class:"pager-link prev",href:_($n)(_(r).prev.link)},[b("span",{class:"desc",innerHTML:((m=_(t).docFooter)==null?void 0:m.prev)||"Previous page"},null,8,kp),b("span",{class:"title",innerHTML:_(r).prev.text},null,8,$p)],8,wp)):q("",!0)]),b("div",{class:ge(["pager",{"has-prev":_(r).prev}])},[_(r).next?(h(),y("a",{key:0,class:"pager-link next",href:_($n)(_(r).next.link)},[b("span",{class:"desc",innerHTML:((g=_(t).docFooter)==null?void 0:g.next)||"Next page"},null,8,Cp),b("span",{class:"title",innerHTML:_(r).next.text},null,8,Sp)],8,Pp)):q("",!0)],2)])):q("",!0)])):q("",!0)}}});const Ep=R(Lp,[["__scopeId","data-v-26128c3c"]]),Tp=e=>(st("data-v-e32ad3fb"),e=e(),ot(),e),Ap={class:"container"},Vp={key:0,class:"aside"},Mp=Tp(()=>b("div",{class:"aside-curtain"},null,-1)),Ip={class:"aside-container"},Np={class:"aside-content"},Op={class:"content"},Hp={class:"content-container"},Bp={class:"main"},zp=K({__name:"VPDoc",setup(e){const t=wt(),{hasSidebar:n,hasAside:s}=at(),o=G(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,"")),r=pe();return Yt("onContentUpdated",r),(i,l)=>{const a=Bt("Content");return h(),y("div",{class:ge(["VPDoc",{"has-sidebar":_(n),"has-aside":_(s)}])},[b("div",Ap,[_(s)?(h(),y("div",Vp,[Mp,b("div",Ip,[b("div",Np,[N(np,null,{"aside-top":H(()=>[T(i.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":H(()=>[T(i.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":H(()=>[T(i.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":H(()=>[T(i.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":H(()=>[T(i.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":H(()=>[T(i.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])])):q("",!0),b("div",Op,[b("div",Hp,[T(i.$slots,"doc-before",{},void 0,!0),b("main",Bp,[N(a,{class:ge(["vp-doc",_(o)]),onContentUpdated:r.value},null,8,["class","onContentUpdated"])]),T(i.$slots,"doc-footer-before",{},void 0,!0),N(Ep),T(i.$slots,"doc-after",{},void 0,!0)])])])],2)}}});const Fp=R(zp,[["__scopeId","data-v-e32ad3fb"]]),Rp=K({__name:"VPContent",setup(e){const t=wt(),{frontmatter:n}=_e(),{hasSidebar:s}=at(),o=Ze("NotFound");return(r,i)=>(h(),y("div",{class:ge(["VPContent",{"has-sidebar":_(s),"is-home":_(n).layout==="home"}]),id:"VPContent"},[_(t).component===_(o)?(h(),X(_(o),{key:0})):_(n).layout==="page"?(h(),X(qh,{key:1})):_(n).layout==="home"?(h(),X(A0,{key:2},{"home-hero-before":H(()=>[T(r.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":H(()=>[T(r.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":H(()=>[T(r.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":H(()=>[T(r.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":H(()=>[T(r.$slots,"home-features-after",{},void 0,!0)]),_:3})):(h(),X(Fp,{key:3},{"doc-footer-before":H(()=>[T(r.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":H(()=>[T(r.$slots,"doc-before",{},void 0,!0)]),"doc-after":H(()=>[T(r.$slots,"doc-after",{},void 0,!0)]),"aside-top":H(()=>[T(r.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":H(()=>[T(r.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":H(()=>[T(r.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":H(()=>[T(r.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":H(()=>[T(r.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":H(()=>[T(r.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Dp=R(Rp,[["__scopeId","data-v-f76a1d95"]]),Up={class:"container"},jp=["innerHTML"],Kp=["innerHTML"],qp=K({__name:"VPFooter",setup(e){const{theme:t}=_e(),{hasSidebar:n}=at();return(s,o)=>_(t).footer?(h(),y("footer",{key:0,class:ge(["VPFooter",{"has-sidebar":_(n)}])},[b("div",Up,[_(t).footer.message?(h(),y("p",{key:0,class:"message",innerHTML:_(t).footer.message},null,8,jp)):q("",!0),_(t).footer.copyright?(h(),y("p",{key:1,class:"copyright",innerHTML:_(t).footer.copyright},null,8,Kp)):q("",!0)])],2)):q("",!0)}});const Wp=R(qp,[["__scopeId","data-v-bfc7af0b"]]),Yp={key:0,class:"Layout"},Gp=K({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=at(),o=wt();tt(()=>o.path,s),Qc(t,s),Yt("close-sidebar",s),Yt("is-sidebar-open",t);const{frontmatter:r}=_e(),i=Oa(),l=G(()=>!!i["home-hero-image"]);return Yt("hero-image-slot-exists",l),(a,u)=>{const f=Bt("Content");return _(r).layout!==!1?(h(),y("div",Yp,[T(a.$slots,"layout-top",{},void 0,!0),N(nu),N(ru,{class:"backdrop",show:_(t),onClick:_(s)},null,8,["show","onClick"]),N(dh,null,{"nav-bar-title-before":H(()=>[T(a.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":H(()=>[T(a.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":H(()=>[T(a.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":H(()=>[T(a.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":H(()=>[T(a.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":H(()=>[T(a.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),N(Ph,{open:_(t),onOpenMenu:_(n)},null,8,["open","onOpenMenu"]),N(Dh,{open:_(t)},{"sidebar-nav-before":H(()=>[T(a.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":H(()=>[T(a.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),N(Dp,null,{"home-hero-before":H(()=>[T(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":H(()=>[T(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":H(()=>[T(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":H(()=>[T(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":H(()=>[T(a.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":H(()=>[T(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":H(()=>[T(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":H(()=>[T(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":H(()=>[T(a.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":H(()=>[T(a.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":H(()=>[T(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":H(()=>[T(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":H(()=>[T(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":H(()=>[T(a.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),N(Wp),T(a.$slots,"layout-bottom",{},void 0,!0)])):(h(),X(f,{key:1}))}}});const Jp=R(Gp,[["__scopeId","data-v-23299678"]]),vs=e=>(st("data-v-72a723af"),e=e(),ot(),e),Zp={class:"NotFound"},Xp=vs(()=>b("p",{class:"code"},"404",-1)),Qp=vs(()=>b("h1",{class:"title"},"PAGE NOT FOUND",-1)),e1=vs(()=>b("div",{class:"divider"},null,-1)),t1=vs(()=>b("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),n1={class:"action"},s1=["href"],o1=K({__name:"NotFound",setup(e){const{site:t}=_e(),{localeLinks:n}=Sn({removeCurrent:!1}),s=pe("/");return ze(()=>{var r;const o=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(s.value=((r=n.value.find(({link:i})=>i.startsWith(o)))==null?void 0:r.link)||n.value[0].link)}),(o,r)=>(h(),y("div",Zp,[Xp,Qp,e1,t1,b("div",n1,[b("a",{class:"link",href:_(kn)(s.value),"aria-label":"go to home"}," Take me home ",8,s1)])]))}});const r1=R(o1,[["__scopeId","data-v-72a723af"]]);const xr={Layout:Jp,NotFound:r1,enhanceApp:({app:e})=>{e.component("Badge",xc)}};/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */var At=Object.assign||function(e){for(var t=1;t{n.value=i}),(i,l)=>(h(),X(Ld,{class:"VPSwitchAppearance","aria-label":"toggle dark mode","aria-checked":s.value,onClick:_(o)},{default:H(()=>[N(Id,{class:"sun"}),N(zd,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const ko=R(Rd,[["__scopeId","data-v-b602623b"]]),Dd={key:0,class:"VPNavBarAppearance"},Ud=K({__name:"VPNavBarAppearance",setup(e){const{site:t}=_e();return(n,s)=>_(t).appearance?(h(),y("div",Dd,[N(ko)])):q("",!0)}});const jd=R(Ud,[["__scopeId","data-v-368654cb"]]),Kd={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},qd=["href","innerHTML"],Wd=K({__name:"VPSocialLink",props:{icon:null,link:null},setup(e){const t=e,n=G(()=>typeof t.icon=="object"?t.icon.svg:Kd[t.icon]);return(s,o)=>(h(),y("a",{class:"VPSocialLink",href:e.link,target:"_blank",rel:"noopener",innerHTML:_(n)},null,8,qd))}});const Yd=R(Wd,[["__scopeId","data-v-51a76c22"]]),Gd={class:"VPSocialLinks"},Jd=K({__name:"VPSocialLinks",props:{links:null},setup(e){return(t,n)=>(h(),y("div",Gd,[(h(!0),y(oe,null,Te(e.links,({link:s,icon:o})=>(h(),X(Yd,{key:s,icon:o,link:s},null,8,["icon","link"]))),128))]))}});const $o=R(Jd,[["__scopeId","data-v-6f460e71"]]),Zd=K({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=_e();return(n,s)=>_(t).socialLinks?(h(),X($o,{key:0,class:"VPNavBarSocialLinks",links:_(t).socialLinks},null,8,["links"])):q("",!0)}});const Xd=R(Zd,[["__scopeId","data-v-b74b5d6b"]]),Qd={key:0,class:"group"},ef={class:"trans-title"},tf={key:1,class:"group"},nf={class:"item appearance"},sf={class:"label"},of={class:"appearance-action"},rf={key:2,class:"group"},lf={class:"item social-links"},af=K({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=_e(),{localeLinks:s,currentLang:o}=Sn({correspondingLink:!0}),r=G(()=>s.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(i,l)=>_(r)?(h(),X(wo,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:H(()=>[_(s).length&&_(o).label?(h(),y("div",Qd,[b("p",ef,ce(_(o).label),1),(h(!0),y(oe,null,Te(_(s),a=>(h(),X(ms,{key:a.link,item:a},null,8,["item"]))),128))])):q("",!0),_(t).appearance?(h(),y("div",tf,[b("div",nf,[b("p",sf,ce(_(n).darkModeSwitchLabel||"Appearance"),1),b("div",of,[N(ko)])])])):q("",!0),_(n).socialLinks?(h(),y("div",rf,[b("div",lf,[N($o,{class:"social-links-list",links:_(n).socialLinks},null,8,["links"])])])):q("",!0)]),_:1})):q("",!0)}});const cf=R(af,[["__scopeId","data-v-d5f0985d"]]),uf=e=>(st("data-v-7b6c7fd5"),e=e(),ot(),e),df=["aria-expanded"],ff=uf(()=>b("span",{class:"container"},[b("span",{class:"top"}),b("span",{class:"middle"}),b("span",{class:"bottom"})],-1)),hf=[ff],pf=K({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(h(),y("button",{type:"button",class:ge(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},hf,10,df))}});const _f=R(pf,[["__scopeId","data-v-7b6c7fd5"]]),mf=e=>(st("data-v-b274701f"),e=e(),ot(),e),vf={class:"container"},gf={class:"title"},yf={class:"content"},bf=mf(()=>b("div",{class:"curtain"},null,-1)),xf={class:"content-body"},wf=K({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Gc(),{hasSidebar:n}=at(),s=G(()=>({"has-sidebar":n.value,fill:t.value>0}));return(o,r)=>(h(),y("div",{class:ge(["VPNavBar",_(s)])},[b("div",vf,[b("div",gf,[N(hu,null,{"nav-bar-title-before":H(()=>[T(o.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":H(()=>[T(o.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),b("div",yf,[bf,b("div",xf,[T(o.$slots,"nav-bar-content-before",{},void 0,!0),N(bu,{class:"search"}),N(fd,{class:"menu"}),N(wd,{class:"translations"}),N(jd,{class:"appearance"}),N(Xd,{class:"social-links"}),N(cf,{class:"extra"}),T(o.$slots,"nav-bar-content-after",{},void 0,!0),N(_f,{class:"hamburger",active:e.isScreenOpen,onClick:r[0]||(r[0]=i=>o.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const kf=R(wf,[["__scopeId","data-v-b274701f"]]);function $f(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1),Zt=[],Zn=!1,Co=-1,pn=void 0,Nt=void 0,_n=void 0,Oi=function(t){return Zt.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(t))})},Xn=function(t){var n=t||window.event;return Oi(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},Pf=function(t){if(_n===void 0){var n=!!t&&t.reserveScrollBarGap===!0,s=window.innerWidth-document.documentElement.clientWidth;if(n&&s>0){var o=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);_n=document.body.style.paddingRight,document.body.style.paddingRight=o+s+"px"}}pn===void 0&&(pn=document.body.style.overflow,document.body.style.overflow="hidden")},Cf=function(){_n!==void 0&&(document.body.style.paddingRight=_n,_n=void 0),pn!==void 0&&(document.body.style.overflow=pn,pn=void 0)},Sf=function(){return window.requestAnimationFrame(function(){if(Nt===void 0){Nt={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var t=window,n=t.scrollY,s=t.scrollX,o=t.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-s,setTimeout(function(){return window.requestAnimationFrame(function(){var r=o-window.innerHeight;r&&n>=o&&(document.body.style.top=-(n+r))})},300)}})},Lf=function(){if(Nt!==void 0){var t=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=Nt.position,document.body.style.top=Nt.top,document.body.style.left=Nt.left,window.scrollTo(n,t),Nt=void 0}},Ef=function(t){return t?t.scrollHeight-t.scrollTop<=t.clientHeight:!1},Tf=function(t,n){var s=t.targetTouches[0].clientY-Co;return Oi(t.target)?!1:n&&n.scrollTop===0&&s>0||Ef(n)&&s<0?Xn(t):(t.stopPropagation(),!0)},Hi=function(t,n){if(!t){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!Zt.some(function(o){return o.targetElement===t})){var s={targetElement:t,options:n||{}};Zt=[].concat($f(Zt),[s]),Jn?Sf():Pf(n),Jn&&(t.ontouchstart=function(o){o.targetTouches.length===1&&(Co=o.targetTouches[0].clientY)},t.ontouchmove=function(o){o.targetTouches.length===1&&Tf(o,t)},Zn||(document.addEventListener("touchmove",Xn,Po?{passive:!1}:void 0),Zn=!0))}},Bi=function(){Jn&&(Zt.forEach(function(t){t.targetElement.ontouchstart=null,t.targetElement.ontouchmove=null}),Zn&&(document.removeEventListener("touchmove",Xn,Po?{passive:!1}:void 0),Zn=!1),Co=-1),Jn?Lf():Cf(),Zt=[]};const Af=K({__name:"VPNavScreenMenuLink",props:{text:null,link:null},setup(e){const t=Ze("close-screen");return(n,s)=>(h(),X(kt,{class:"VPNavScreenMenuLink",href:e.link,onClick:_(t)},{default:H(()=>[Ee(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const Vf=R(Af,[["__scopeId","data-v-a0f93cab"]]),Mf={},If={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Nf=b("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),Of=[Nf];function Hf(e,t){return h(),y("svg",If,Of)}const Bf=R(Mf,[["render",Hf]]),Ff=K({__name:"VPNavScreenMenuGroupLink",props:{text:null,link:null},setup(e){const t=Ze("close-screen");return(n,s)=>(h(),X(kt,{class:"VPNavScreenMenuGroupLink",href:e.link,onClick:_(t)},{default:H(()=>[Ee(ce(e.text),1)]),_:1},8,["href","onClick"]))}});const Fi=R(Ff,[["__scopeId","data-v-5506f05e"]]),zf={class:"VPNavScreenMenuGroupSection"},Rf={key:0,class:"title"},Df=K({__name:"VPNavScreenMenuGroupSection",props:{text:null,items:null},setup(e){return(t,n)=>(h(),y("div",zf,[e.text?(h(),y("p",Rf,ce(e.text),1)):q("",!0),(h(!0),y(oe,null,Te(e.items,s=>(h(),X(Fi,{key:s.text,text:s.text,link:s.link},null,8,["text","link"]))),128))]))}});const Uf=R(Df,[["__scopeId","data-v-f51d079d"]]),jf=["aria-controls","aria-expanded"],Kf={class:"button-text"},qf=["id"],Wf={key:1,class:"group"},Yf=K({__name:"VPNavScreenMenuGroup",props:{text:null,items:null},setup(e){const t=e,n=pe(!1),s=G(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,i)=>(h(),y("div",{class:ge(["VPNavScreenMenuGroup",{open:n.value}])},[b("button",{class:"button","aria-controls":_(s),"aria-expanded":n.value,onClick:o},[b("span",Kf,ce(e.text),1),N(Bf,{class:"button-icon"})],8,jf),b("div",{id:_(s),class:"items"},[(h(!0),y(oe,null,Te(e.items,l=>(h(),y(oe,{key:l.text},["link"in l?(h(),y("div",{key:l.text,class:"item"},[N(Fi,{text:l.text,link:l.link},null,8,["text","link"])])):(h(),y("div",Wf,[N(Uf,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,qf)],2))}});const Gf=R(Yf,[["__scopeId","data-v-822d3f2a"]]),Jf={key:0,class:"VPNavScreenMenu"},Zf=K({__name:"VPNavScreenMenu",setup(e){const{theme:t}=_e();return(n,s)=>_(t).nav?(h(),y("nav",Jf,[(h(!0),y(oe,null,Te(_(t).nav,o=>(h(),y(oe,{key:o.text},["link"in o?(h(),X(Vf,{key:0,text:o.text,link:o.link},null,8,["text","link"])):(h(),X(Gf,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):q("",!0)}}),Xf={key:0,class:"VPNavScreenAppearance"},Qf={class:"text"},eh=K({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=_e();return(s,o)=>_(t).appearance?(h(),y("div",Xf,[b("p",Qf,ce(_(n).darkModeSwitchLabel||"Appearance"),1),N(ko)])):q("",!0)}});const th=R(eh,[["__scopeId","data-v-4bca1ae7"]]),nh={class:"list"},sh=K({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=Sn({correspondingLink:!0}),s=pe(!1);function o(){s.value=!s.value}return(r,i)=>_(t).length&&_(n).label?(h(),y("div",{key:0,class:ge(["VPNavScreenTranslations",{open:s.value}])},[b("button",{class:"title",onClick:o},[N(Ni,{class:"icon lang"}),Ee(" "+ce(_(n).label)+" ",1),N(Ii,{class:"icon chevron"})]),b("ul",nh,[(h(!0),y(oe,null,Te(_(t),l=>(h(),y("li",{key:l.link,class:"item"},[N(kt,{class:"link",href:l.link},{default:H(()=>[Ee(ce(l.text),1)]),_:2},1032,["href"])]))),128))])],2)):q("",!0)}});const oh=R(sh,[["__scopeId","data-v-0cf8d6f2"]]),rh=K({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=_e();return(n,s)=>_(t).socialLinks?(h(),X($o,{key:0,class:"VPNavScreenSocialLinks",links:_(t).socialLinks},null,8,["links"])):q("",!0)}}),ih={class:"container"},lh=K({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=pe(null);function n(){Hi(t.value,{reserveScrollBarGap:!0})}function s(){Bi()}return(o,r)=>(h(),X(ps,{name:"fade",onEnter:n,onAfterLeave:s},{default:H(()=>[e.open?(h(),y("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t},[b("div",ih,[T(o.$slots,"nav-screen-content-before",{},void 0,!0),N(Zf,{class:"menu"}),N(oh,{class:"translations"}),N(th,{class:"appearance"}),N(rh,{class:"social-links"}),T(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):q("",!0)]),_:3}))}});const ah=R(lh,[["__scopeId","data-v-d1f53b3f"]]),ch={class:"VPNav"},uh=K({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=iu();return Yt("close-screen",n),(o,r)=>(h(),y("header",ch,[N(kf,{"is-screen-open":_(t),onToggleScreen:_(s)},{"nav-bar-title-before":H(()=>[T(o.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":H(()=>[T(o.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":H(()=>[T(o.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":H(()=>[T(o.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),N(ah,{open:_(t)},{"nav-screen-content-before":H(()=>[T(o.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":H(()=>[T(o.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const dh=R(uh,[["__scopeId","data-v-55561c08"]]),fh={},hh={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ph=b("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),_h=b("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),mh=b("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),vh=b("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),gh=[ph,_h,mh,vh];function yh(e,t){return h(),y("svg",hh,gh)}const bh=R(fh,[["render",yh]]),xh={key:0,class:"VPLocalNav"},wh=["aria-expanded"],kh={class:"menu-text"},$h=K({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t}=_e(),{hasSidebar:n}=at();function s(){window.scrollTo({top:0,left:0,behavior:"smooth"})}return(o,r)=>_(n)?(h(),y("div",xh,[b("button",{class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:r[0]||(r[0]=i=>o.$emit("open-menu"))},[N(bh,{class:"menu-icon"}),b("span",kh,ce(_(t).sidebarMenuLabel||"Menu"),1)],8,wh),b("a",{class:"top-link",href:"#",onClick:s},ce(_(t).returnToTopLabel||"Return to top"),1)])):q("",!0)}});const Ph=R($h,[["__scopeId","data-v-9fc14245"]]),Ch={},Sh={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Lh=b("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Eh=[Lh];function Th(e,t){return h(),y("svg",Sh,Eh)}const Ah=R(Ch,[["render",Th]]),Vh=e=>(st("data-v-6646d2d3"),e=e(),ot(),e),Mh=["role"],Ih=Vh(()=>b("div",{class:"indicator"},null,-1)),Nh={key:1,class:"items"},Oh=K({__name:"VPSidebarItem",props:{item:null,depth:null},setup(e){const t=e,{collapsed:n,collapsible:s,isLink:o,isActiveLink:r,hasActiveLink:i,hasChildren:l,toggle:a}=eu(G(()=>t.item)),u=G(()=>l.value?"section":"div"),f=G(()=>o.value?"a":"div"),m=G(()=>l.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),g=G(()=>o.value?void 0:"button"),C=G(()=>[[`level-${t.depth}`],{collapsible:s.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":i.value}]);function F(){!t.item.link&&a()}function B(){t.item.link&&a()}return(se,x)=>{const V=Bt("VPSidebarItem",!0);return h(),X(bn(_(u)),{class:ge(["VPSidebarItem",_(C)])},{default:H(()=>[e.item.text?(h(),y("div",{key:0,class:"item",role:_(g),onClick:F},[Ih,N(kt,{tag:_(f),class:"link",href:e.item.link},{default:H(()=>[(h(),X(bn(_(m)),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"]),b("div",{class:"caret",role:"button",onClick:B},[e.item.collapsible?(h(),X(Ah,{key:0,class:"caret-icon"})):q("",!0)])],8,Mh)):q("",!0),e.item.items&&e.item.items.length?(h(),y("div",Nh,[e.depth<5?(h(!0),y(oe,{key:0},Te(e.item.items,E=>(h(),X(V,{key:E.text,item:E,depth:e.depth+1},null,8,["item","depth"]))),128)):q("",!0)])):q("",!0)]),_:1},8,["class"])}}});const Hh=R(Oh,[["__scopeId","data-v-6646d2d3"]]),zi=e=>(st("data-v-8a8550ea"),e=e(),ot(),e),Bh=zi(()=>b("div",{class:"curtain"},null,-1)),Fh={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},zh=zi(()=>b("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Rh=K({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebarGroups:n,hasSidebar:s}=at();let o=pe(null);function r(){Hi(o.value,{reserveScrollBarGap:!0})}function i(){Bi()}return Zr(async()=>{var l;t.open?(r(),(l=o.value)==null||l.focus()):i()}),(l,a)=>_(s)?(h(),y("aside",{key:0,class:ge(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:a[0]||(a[0]=fc(()=>{},["stop"]))},[Bh,b("nav",Fh,[zh,T(l.$slots,"sidebar-nav-before",{},void 0,!0),(h(!0),y(oe,null,Te(_(n),u=>(h(),y("div",{key:u.text,class:"group"},[N(Hh,{item:u,depth:0},null,8,["item"])]))),128)),T(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):q("",!0)}});const Dh=R(Rh,[["__scopeId","data-v-8a8550ea"]]),Uh={},jh={class:"VPPage"};function Kh(e,t){const n=Bt("Content");return h(),y("div",jh,[N(n)])}const qh=R(Uh,[["render",Kh]]),Wh=K({__name:"VPButton",props:{tag:null,size:null,theme:null,text:null,href:null},setup(e){const t=e,n=G(()=>[t.size??"medium",t.theme??"brand"]),s=G(()=>t.href&&_s.test(t.href)),o=G(()=>t.tag?t.tag:t.href?"a":"button");return(r,i)=>(h(),X(bn(_(o)),{class:ge(["VPButton",_(n)]),href:e.href?_($n)(e.href):void 0,target:_(s)?"_blank":void 0,rel:_(s)?"noreferrer":void 0},{default:H(()=>[Ee(ce(e.text),1)]),_:1},8,["class","href","target","rel"]))}});const Yh=R(Wh,[["__scopeId","data-v-fc99c671"]]),Gh=e=>(st("data-v-425d0d05"),e=e(),ot(),e),Jh={class:"container"},Zh={class:"main"},Xh={key:0,class:"name"},Qh={class:"clip"},e0={key:1,class:"text"},t0={key:2,class:"tagline"},n0={key:3,class:"actions"},s0={key:0,class:"image"},o0={class:"image-container"},r0=Gh(()=>b("div",{class:"image-bg"},null,-1)),i0=K({__name:"VPHero",props:{name:null,text:null,tagline:null,image:null,actions:null},setup(e){const t=Ze("hero-image-slot-exists");return(n,s)=>(h(),y("div",{class:ge(["VPHero",{"has-image":e.image||_(t)}])},[b("div",Jh,[b("div",Zh,[e.name?(h(),y("h1",Xh,[b("span",Qh,ce(e.name),1)])):q("",!0),e.text?(h(),y("p",e0,ce(e.text),1)):q("",!0),e.tagline?(h(),y("p",t0,ce(e.tagline),1)):q("",!0),e.actions?(h(),y("div",n0,[(h(!0),y(oe,null,Te(e.actions,o=>(h(),y("div",{key:o.link,class:"action"},[N(Yh,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):q("",!0)]),e.image||_(t)?(h(),y("div",s0,[b("div",o0,[r0,T(n.$slots,"home-hero-image",{},()=>[e.image?(h(),X(bo,{key:0,class:"image-src",image:e.image},null,8,["image"])):q("",!0)],!0)])])):q("",!0)])],2))}});const l0=R(i0,[["__scopeId","data-v-425d0d05"]]),a0=K({__name:"VPHomeHero",setup(e){const{frontmatter:t}=_e();return(n,s)=>_(t).hero?(h(),X(l0,{key:0,class:"VPHomeHero",name:_(t).hero.name,text:_(t).hero.text,tagline:_(t).hero.tagline,image:_(t).hero.image,actions:_(t).hero.actions},{"home-hero-image":H(()=>[T(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):q("",!0)}}),c0={},u0={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},d0=b("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),f0=[d0];function h0(e,t){return h(),y("svg",u0,f0)}const p0=R(c0,[["render",h0]]),_0={class:"box"},m0={key:1,class:"icon"},v0={class:"title"},g0={class:"details"},y0={key:2,class:"link-text"},b0={class:"link-text-value"},x0=K({__name:"VPFeature",props:{icon:null,title:null,details:null,link:null,linkText:null},setup(e){return(t,n)=>(h(),X(kt,{class:"VPFeature",href:e.link,"no-icon":!0},{default:H(()=>[b("article",_0,[typeof e.icon=="object"?(h(),X(bo,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(h(),y("div",m0,ce(e.icon),1)):q("",!0),b("h2",v0,ce(e.title),1),b("p",g0,ce(e.details),1),e.linkText?(h(),y("div",y0,[b("p",b0,[Ee(ce(e.linkText)+" ",1),N(p0,{class:"link-text-icon"})])])):q("",!0)])]),_:1},8,["href"]))}});const w0=R(x0,[["__scopeId","data-v-cdca53ce"]]),k0={key:0,class:"VPFeatures"},$0={class:"container"},P0={class:"items"},C0=K({__name:"VPFeatures",props:{features:null},setup(e){const t=e,n=G(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s%2===0)return"grid-4"}else return});return(s,o)=>e.features?(h(),y("div",k0,[b("div",$0,[b("div",P0,[(h(!0),y(oe,null,Te(e.features,r=>(h(),y("div",{key:r.title,class:ge(["item",[_(n)]])},[N(w0,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):q("",!0)}});const S0=R(C0,[["__scopeId","data-v-1c679899"]]),L0=K({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=_e();return(n,s)=>_(t).features?(h(),X(S0,{key:0,class:"VPHomeFeatures",features:_(t).features},null,8,["features"])):q("",!0)}}),E0={class:"VPHome"},T0=K({__name:"VPHome",setup(e){return(t,n)=>{const s=Bt("Content");return h(),y("div",E0,[T(t.$slots,"home-hero-before",{},void 0,!0),N(a0,null,{"home-hero-image":H(()=>[T(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),T(t.$slots,"home-hero-after",{},void 0,!0),T(t.$slots,"home-features-before",{},void 0,!0),N(L0),T(t.$slots,"home-features-after",{},void 0,!0),N(s)])}}});const A0=R(T0,[["__scopeId","data-v-1d0c2f41"]]);function V0(){const{hasSidebar:e}=at(),t=js("(min-width: 960px)"),n=js("(min-width: 1280px)");return{isAsideEnabled:G(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const M0=71;function I0(e,t){if(e===!1)return[];let n=[];return document.querySelectorAll("h2, h3, h4, h5, h6").forEach(s=>{if(s.textContent&&s.id){let o=s.textContent;if(t===!1){const r=s.cloneNode(!0);for(const i of r.querySelectorAll(".VPBadge"))i.remove();o=r.textContent||""}n.push({level:Number(s.tagName[1]),title:o.replace(/\s+#\s*$/,""),link:`#${s.id}`})}}),N0(n,e)}function N0(e,t){const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2;return O0(e,typeof n=="number"?[n,n]:n==="deep"?[2,6]:n)}function O0(e,t){const n=[];return e=e.map(s=>({...s})),e.forEach((s,o)=>{s.level>=t[0]&&s.level<=t[1]&&H0(o,e,t)&&n.push(s)}),n}function H0(e,t,n){if(e===0)return!0;const s=t[e];for(let o=e-1;o>=0;o--){const r=t[o];if(r.level=n[0]&&r.level<=n[1])return r.children==null&&(r.children=[]),r.children.push(s),!1}return!0}function B0(e,t){const{isAsideEnabled:n}=V0(),s=Jc(r,100);let o=null;Fe(()=>{requestAnimationFrame(r),window.addEventListener("scroll",s)}),fo(()=>{i(location.hash)}),xt(()=>{window.removeEventListener("scroll",s)});function r(){if(!n.value)return;const l=[].slice.call(e.value.querySelectorAll(".outline-link")),a=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(C=>l.some(F=>F.hash===C.hash&&C.offsetParent!==null)),u=window.scrollY,f=window.innerHeight,m=document.body.offsetHeight,g=Math.abs(u+f-m)<1;if(a.length&&g){i(a[a.length-1].hash);return}for(let C=0;C{const s=Bt("VPDocAsideOutlineItem",!0);return h(),y("ul",{class:ge(e.root?"root":"nested")},[(h(!0),y(oe,null,Te(e.headers,({children:o,link:r,title:i})=>(h(),y("li",null,[b("a",{class:"outline-link",href:r,onClick:n[0]||(n[0]=(...l)=>e.onClick&&e.onClick(...l))},ce(i),9,z0),o!=null&&o.length?(h(),X(s,{key:0,headers:o,onClick:e.onClick},null,8,["headers","onClick"])):q("",!0)]))),256))],2)}}});const D0=R(R0,[["__scopeId","data-v-e23b97f7"]]),U0=e=>(st("data-v-ac019323"),e=e(),ot(),e),j0={class:"content"},K0={class:"outline-title"},q0={"aria-labelledby":"doc-outline-aria-label"},W0=U0(()=>b("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Y0=K({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=_e(),s=G(()=>t.value.outline??n.value.outline),o=Ze("onContentUpdated");o.value=()=>{r.value=I0(s.value,n.value.outlineBadges)};const r=pe([]),i=G(()=>r.value.length>0),l=pe(),a=pe();B0(l,a);function u({target:f}){const m="#"+f.href.split("#")[1],g=document.querySelector(decodeURIComponent(m));g==null||g.focus()}return(f,m)=>(h(),y("div",{class:ge(["VPDocAsideOutline",{"has-outline":_(i)}]),ref_key:"container",ref:l},[b("div",j0,[b("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),b("div",K0,ce(typeof _(n).outline=="object"&&!Array.isArray(_(n).outline)&&_(n).outline.label||_(n).outlineTitle||"On this page"),1),b("nav",q0,[W0,N(D0,{headers:r.value,root:!0,onClick:u},null,8,["headers"])])])],2))}});const G0=R(Y0,[["__scopeId","data-v-ac019323"]]),J0={class:"VPDocAsideCarbonAds"},Z0=K({__name:"VPDocAsideCarbonAds",props:{carbonAds:null},setup(e){const t=()=>null;return(n,s)=>(h(),y("div",J0,[N(_(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),X0=e=>(st("data-v-1b364ca7"),e=e(),ot(),e),Q0={class:"VPDocAside"},ep=X0(()=>b("div",{class:"spacer"},null,-1)),tp=K({__name:"VPDocAside",setup(e){const{theme:t}=_e();return(n,s)=>(h(),y("div",Q0,[T(n.$slots,"aside-top",{},void 0,!0),T(n.$slots,"aside-outline-before",{},void 0,!0),N(G0),T(n.$slots,"aside-outline-after",{},void 0,!0),ep,T(n.$slots,"aside-ads-before",{},void 0,!0),_(t).carbonAds?(h(),X(Z0,{key:0,"carbon-ads":_(t).carbonAds},null,8,["carbon-ads"])):q("",!0),T(n.$slots,"aside-ads-after",{},void 0,!0),T(n.$slots,"aside-bottom",{},void 0,!0)]))}});const np=R(tp,[["__scopeId","data-v-1b364ca7"]]);function sp(){const{theme:e,page:t}=_e();return G(()=>{const{text:n="Edit this page",pattern:s=""}=e.value.editLink||{},{relativePath:o}=t.value;return{url:s.replace(/:path/g,o),text:n}})}function op(){const{page:e,theme:t,frontmatter:n}=_e();return G(()=>{const s=Ai(t.value.sidebar,e.value.relativePath),o=Xc(s),r=o.findIndex(i=>Ft(e.value.relativePath,i.link));return{prev:n.value.prev?{...o[r-1],text:n.value.prev}:o[r-1],next:n.value.next?{...o[r+1],text:n.value.next}:o[r+1]}})}const rp={},ip={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},lp=b("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),ap=b("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),cp=[lp,ap];function up(e,t){return h(),y("svg",ip,cp)}const dp=R(rp,[["render",up]]),fp={class:"VPLastUpdated"},hp=["datetime"],pp=K({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n}=_e(),s=G(()=>new Date(n.value.lastUpdated)),o=G(()=>s.value.toISOString()),r=pe("");return Fe(()=>{yt(()=>{r.value=s.value.toLocaleString(window.navigator.language)})}),(i,l)=>(h(),y("p",fp,[Ee(ce(_(t).lastUpdatedText||"Last updated")+": ",1),b("time",{datetime:_(o)},ce(r.value),9,hp)]))}});const _p=R(pp,[["__scopeId","data-v-a6a422eb"]]),mp={key:0,class:"VPDocFooter"},vp={key:0,class:"edit-info"},gp={key:0,class:"edit-link"},yp={key:1,class:"last-updated"},bp={key:1,class:"prev-next"},xp={class:"pager"},wp=["href"],kp=["innerHTML"],$p=["innerHTML"],Pp=["href"],Cp=["innerHTML"],Sp=["innerHTML"],Lp=K({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=_e(),o=sp(),r=op(),i=G(()=>t.value.editLink&&s.value.editLink!==!1),l=G(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),a=G(()=>i.value||l.value||r.value.prev||r.value.next);return(u,f)=>{var m,g;return _(a)?(h(),y("footer",mp,[_(i)||_(l)?(h(),y("div",vp,[_(i)?(h(),y("div",gp,[N(kt,{class:"edit-link-button",href:_(o).url,"no-icon":!0},{default:H(()=>[N(dp,{class:"edit-link-icon"}),Ee(" "+ce(_(o).text),1)]),_:1},8,["href"])])):q("",!0),_(l)?(h(),y("div",yp,[N(_p)])):q("",!0)])):q("",!0),_(r).prev||_(r).next?(h(),y("div",bp,[b("div",xp,[_(r).prev?(h(),y("a",{key:0,class:"pager-link prev",href:_($n)(_(r).prev.link)},[b("span",{class:"desc",innerHTML:((m=_(t).docFooter)==null?void 0:m.prev)||"Previous page"},null,8,kp),b("span",{class:"title",innerHTML:_(r).prev.text},null,8,$p)],8,wp)):q("",!0)]),b("div",{class:ge(["pager",{"has-prev":_(r).prev}])},[_(r).next?(h(),y("a",{key:0,class:"pager-link next",href:_($n)(_(r).next.link)},[b("span",{class:"desc",innerHTML:((g=_(t).docFooter)==null?void 0:g.next)||"Next page"},null,8,Cp),b("span",{class:"title",innerHTML:_(r).next.text},null,8,Sp)],8,Pp)):q("",!0)],2)])):q("",!0)])):q("",!0)}}});const Ep=R(Lp,[["__scopeId","data-v-26128c3c"]]),Tp=e=>(st("data-v-e32ad3fb"),e=e(),ot(),e),Ap={class:"container"},Vp={key:0,class:"aside"},Mp=Tp(()=>b("div",{class:"aside-curtain"},null,-1)),Ip={class:"aside-container"},Np={class:"aside-content"},Op={class:"content"},Hp={class:"content-container"},Bp={class:"main"},Fp=K({__name:"VPDoc",setup(e){const t=wt(),{hasSidebar:n,hasAside:s}=at(),o=G(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,"")),r=pe();return Yt("onContentUpdated",r),(i,l)=>{const a=Bt("Content");return h(),y("div",{class:ge(["VPDoc",{"has-sidebar":_(n),"has-aside":_(s)}])},[b("div",Ap,[_(s)?(h(),y("div",Vp,[Mp,b("div",Ip,[b("div",Np,[N(np,null,{"aside-top":H(()=>[T(i.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":H(()=>[T(i.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":H(()=>[T(i.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":H(()=>[T(i.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":H(()=>[T(i.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":H(()=>[T(i.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])])):q("",!0),b("div",Op,[b("div",Hp,[T(i.$slots,"doc-before",{},void 0,!0),b("main",Bp,[N(a,{class:ge(["vp-doc",_(o)]),onContentUpdated:r.value},null,8,["class","onContentUpdated"])]),T(i.$slots,"doc-footer-before",{},void 0,!0),N(Ep),T(i.$slots,"doc-after",{},void 0,!0)])])])],2)}}});const zp=R(Fp,[["__scopeId","data-v-e32ad3fb"]]),Rp=K({__name:"VPContent",setup(e){const t=wt(),{frontmatter:n}=_e(),{hasSidebar:s}=at(),o=Ze("NotFound");return(r,i)=>(h(),y("div",{class:ge(["VPContent",{"has-sidebar":_(s),"is-home":_(n).layout==="home"}]),id:"VPContent"},[_(t).component===_(o)?(h(),X(_(o),{key:0})):_(n).layout==="page"?(h(),X(qh,{key:1})):_(n).layout==="home"?(h(),X(A0,{key:2},{"home-hero-before":H(()=>[T(r.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":H(()=>[T(r.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":H(()=>[T(r.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":H(()=>[T(r.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":H(()=>[T(r.$slots,"home-features-after",{},void 0,!0)]),_:3})):(h(),X(zp,{key:3},{"doc-footer-before":H(()=>[T(r.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":H(()=>[T(r.$slots,"doc-before",{},void 0,!0)]),"doc-after":H(()=>[T(r.$slots,"doc-after",{},void 0,!0)]),"aside-top":H(()=>[T(r.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":H(()=>[T(r.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":H(()=>[T(r.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":H(()=>[T(r.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":H(()=>[T(r.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":H(()=>[T(r.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Dp=R(Rp,[["__scopeId","data-v-f76a1d95"]]),Up={class:"container"},jp=["innerHTML"],Kp=["innerHTML"],qp=K({__name:"VPFooter",setup(e){const{theme:t}=_e(),{hasSidebar:n}=at();return(s,o)=>_(t).footer?(h(),y("footer",{key:0,class:ge(["VPFooter",{"has-sidebar":_(n)}])},[b("div",Up,[_(t).footer.message?(h(),y("p",{key:0,class:"message",innerHTML:_(t).footer.message},null,8,jp)):q("",!0),_(t).footer.copyright?(h(),y("p",{key:1,class:"copyright",innerHTML:_(t).footer.copyright},null,8,Kp)):q("",!0)])],2)):q("",!0)}});const Wp=R(qp,[["__scopeId","data-v-bfc7af0b"]]),Yp={key:0,class:"Layout"},Gp=K({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=at(),o=wt();tt(()=>o.path,s),Qc(t,s),Yt("close-sidebar",s),Yt("is-sidebar-open",t);const{frontmatter:r}=_e(),i=Oa(),l=G(()=>!!i["home-hero-image"]);return Yt("hero-image-slot-exists",l),(a,u)=>{const f=Bt("Content");return _(r).layout!==!1?(h(),y("div",Yp,[T(a.$slots,"layout-top",{},void 0,!0),N(nu),N(ru,{class:"backdrop",show:_(t),onClick:_(s)},null,8,["show","onClick"]),N(dh,null,{"nav-bar-title-before":H(()=>[T(a.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":H(()=>[T(a.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":H(()=>[T(a.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":H(()=>[T(a.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":H(()=>[T(a.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":H(()=>[T(a.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),N(Ph,{open:_(t),onOpenMenu:_(n)},null,8,["open","onOpenMenu"]),N(Dh,{open:_(t)},{"sidebar-nav-before":H(()=>[T(a.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":H(()=>[T(a.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),N(Dp,null,{"home-hero-before":H(()=>[T(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-image":H(()=>[T(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":H(()=>[T(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":H(()=>[T(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":H(()=>[T(a.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":H(()=>[T(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":H(()=>[T(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":H(()=>[T(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":H(()=>[T(a.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":H(()=>[T(a.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":H(()=>[T(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":H(()=>[T(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":H(()=>[T(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":H(()=>[T(a.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),N(Wp),T(a.$slots,"layout-bottom",{},void 0,!0)])):(h(),X(f,{key:1}))}}});const Jp=R(Gp,[["__scopeId","data-v-23299678"]]),vs=e=>(st("data-v-72a723af"),e=e(),ot(),e),Zp={class:"NotFound"},Xp=vs(()=>b("p",{class:"code"},"404",-1)),Qp=vs(()=>b("h1",{class:"title"},"PAGE NOT FOUND",-1)),e1=vs(()=>b("div",{class:"divider"},null,-1)),t1=vs(()=>b("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),n1={class:"action"},s1=["href"],o1=K({__name:"NotFound",setup(e){const{site:t}=_e(),{localeLinks:n}=Sn({removeCurrent:!1}),s=pe("/");return Fe(()=>{var r;const o=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(s.value=((r=n.value.find(({link:i})=>i.startsWith(o)))==null?void 0:r.link)||n.value[0].link)}),(o,r)=>(h(),y("div",Zp,[Xp,Qp,e1,t1,b("div",n1,[b("a",{class:"link",href:_(kn)(s.value),"aria-label":"go to home"}," Take me home ",8,s1)])]))}});const r1=R(o1,[["__scopeId","data-v-72a723af"]]);const xr={Layout:Jp,NotFound:r1,enhanceApp:({app:e})=>{e.component("Badge",xc)}};/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */var At=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},s=window.Promise||function($){function I(){}$(I,I)},o=function($){var I=$.target;if(I===ne){z();return}E.indexOf(I)!==-1&&B({target:I})},r=function(){if(!(ee||!p.original)){var $=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(he-$)>D.scrollOffset&&setTimeout(z,150)}},i=function($){var I=$.key||$.keyCode;(I==="Escape"||I==="Esc"||I===27)&&z()},l=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},I=$;if($.background&&(ne.style.background=$.background),$.container&&$.container instanceof Object&&(I.container=At({},D.container,$.container)),$.template){var A=Rn($.template)?$.template:document.querySelector($.template);I.template=A}return D=At({},D,I),E.forEach(function(ue){ue.dispatchEvent(Dt("medium-zoom:update",{detail:{zoom:U}}))}),U},a=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(At({},D,$))},u=function(){for(var $=arguments.length,I=Array($),A=0;A<$;A++)I[A]=arguments[A];var ue=I.reduce(function(F,ie){return[].concat(F,kr(ie))},[]);return ue.filter(function(F){return E.indexOf(F)===-1}).forEach(function(F){E.push(F),F.classList.add("medium-zoom-image")}),J.forEach(function(F){var ie=F.type,le=F.listener,Ve=F.options;ue.forEach(function(Ie){Ie.addEventListener(ie,le,Ve)})}),U},f=function(){for(var $=arguments.length,I=Array($),A=0;A<$;A++)I[A]=arguments[A];p.zoomed&&z();var ue=I.length>0?I.reduce(function(F,ie){return[].concat(F,kr(ie))},[]):E;return ue.forEach(function(F){F.classList.remove("medium-zoom-image"),F.dispatchEvent(Dt("medium-zoom:detach",{detail:{zoom:U}}))}),E=E.filter(function(F){return ue.indexOf(F)===-1}),U},m=function($,I){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return E.forEach(function(ue){ue.addEventListener("medium-zoom:"+$,I,A)}),J.push({type:"medium-zoom:"+$,listener:I,options:A}),U},g=function($,I){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return E.forEach(function(ue){ue.removeEventListener("medium-zoom:"+$,I,A)}),J=J.filter(function(ue){return!(ue.type==="medium-zoom:"+$&&ue.listener.toString()===I.toString())}),U},C=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},I=$.target,A=function(){var F={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},ie=void 0,le=void 0;if(D.container)if(D.container instanceof Object)F=At({},F,D.container),ie=F.width-F.left-F.right-D.margin*2,le=F.height-F.top-F.bottom-D.margin*2;else{var Ve=Rn(D.container)?D.container:document.querySelector(D.container),Ie=Ve.getBoundingClientRect(),je=Ie.width,Fe=Ie.height,Ln=Ie.left,gs=Ie.top;F=At({},F,{width:je,height:Fe,left:Ln,top:gs})}ie=ie||F.width-D.margin*2,le=le||F.height-D.margin*2;var $t=p.zoomedHd||p.original,Ke=wr($t)?ie:$t.naturalWidth||ie,Ft=wr($t)?le:$t.naturalHeight||le,Pt=$t.getBoundingClientRect(),ct=Pt.top,rn=Pt.left,Ct=Pt.width,c=Pt.height,d=Math.min(Math.max(Ct,Ke),ie)/Ct,v=Math.min(Math.max(c,Ft),le)/c,w=Math.min(d,v),k=(-rn+(ie-Ct)/2+D.margin+F.left)/w,S=(-ct+(le-c)/2+D.margin+F.top)/w,O="scale("+w+") translate3d("+k+"px, "+S+"px, 0)";p.zoomed.style.transform=O,p.zoomedHd&&(p.zoomedHd.style.transform=O)};return new s(function(ue){if(I&&E.indexOf(I)===-1){ue(U);return}var F=function je(){ee=!1,p.zoomed.removeEventListener("transitionend",je),p.original.dispatchEvent(Dt("medium-zoom:opened",{detail:{zoom:U}})),ue(U)};if(p.zoomed){ue(U);return}if(I)p.original=I;else if(E.length>0){var ie=E;p.original=ie[0]}else{ue(U);return}if(p.original.dispatchEvent(Dt("medium-zoom:open",{detail:{zoom:U}})),he=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,ee=!0,p.zoomed=a1(p.original),document.body.appendChild(ne),D.template){var le=Rn(D.template)?D.template:document.querySelector(D.template);p.template=document.createElement("div"),p.template.appendChild(le.content.cloneNode(!0)),document.body.appendChild(p.template)}if(p.original.parentElement&&p.original.parentElement.tagName==="PICTURE"&&p.original.currentSrc&&(p.zoomed.src=p.original.currentSrc),document.body.appendChild(p.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),p.original.classList.add("medium-zoom-image--hidden"),p.zoomed.classList.add("medium-zoom-image--opened"),p.zoomed.addEventListener("click",z),p.zoomed.addEventListener("transitionend",F),p.original.getAttribute("data-zoom-src")){p.zoomedHd=p.zoomed.cloneNode(),p.zoomedHd.removeAttribute("srcset"),p.zoomedHd.removeAttribute("sizes"),p.zoomedHd.removeAttribute("loading"),p.zoomedHd.src=p.zoomed.getAttribute("data-zoom-src"),p.zoomedHd.onerror=function(){clearInterval(Ve),console.warn("Unable to reach the zoom image target "+p.zoomedHd.src),p.zoomedHd=null,A()};var Ve=setInterval(function(){p.zoomedHd.complete&&(clearInterval(Ve),p.zoomedHd.classList.add("medium-zoom-image--opened"),p.zoomedHd.addEventListener("click",z),document.body.appendChild(p.zoomedHd),A())},10)}else if(p.original.hasAttribute("srcset")){p.zoomedHd=p.zoomed.cloneNode(),p.zoomedHd.removeAttribute("sizes"),p.zoomedHd.removeAttribute("loading");var Ie=p.zoomedHd.addEventListener("load",function(){p.zoomedHd.removeEventListener("load",Ie),p.zoomedHd.classList.add("medium-zoom-image--opened"),p.zoomedHd.addEventListener("click",z),document.body.appendChild(p.zoomedHd),A()})}else A()})},z=function(){return new s(function($){if(ee||!p.original){$(U);return}var I=function A(){p.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(p.zoomed),p.zoomedHd&&document.body.removeChild(p.zoomedHd),document.body.removeChild(ne),p.zoomed.classList.remove("medium-zoom-image--opened"),p.template&&document.body.removeChild(p.template),ee=!1,p.zoomed.removeEventListener("transitionend",A),p.original.dispatchEvent(Dt("medium-zoom:closed",{detail:{zoom:U}})),p.original=null,p.zoomed=null,p.zoomedHd=null,p.template=null,$(U)};ee=!0,document.body.classList.remove("medium-zoom--opened"),p.zoomed.style.transform="",p.zoomedHd&&(p.zoomedHd.style.transform=""),p.template&&(p.template.style.transition="opacity 150ms",p.template.style.opacity=0),p.original.dispatchEvent(Dt("medium-zoom:close",{detail:{zoom:U}})),p.zoomed.addEventListener("transitionend",I)})},B=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},I=$.target;return p.original?z():C({target:I})},se=function(){return D},x=function(){return E},V=function(){return p.original},E=[],J=[],ee=!1,he=0,D=n,p={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?D=t:(t||typeof t=="string")&&u(t),D=At({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},D);var ne=l1(D.background);document.addEventListener("click",o),document.addEventListener("keyup",i),document.addEventListener("scroll",r),window.addEventListener("resize",z);var U={open:C,close:z,toggle:B,update:l,clone:a,attach:u,detach:f,on:m,off:g,getOptions:se,getImages:x,getZoomedImage:V};return U};function u1(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>"u")){var s=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&s.firstChild?s.insertBefore(o,s.firstChild):s.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var d1=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";u1(d1);const f1=c1,h1=K({__name:"Link",props:{c:{type:String,required:!0},t:{type:String,required:!0}},setup(e){const t=e,n=go(),s=()=>{t.t.startsWith("http")?window.open(t.t,"_blank"):t.t.endsWith("/")?window&&window.location&&(window.location=t.t):n.go(t.t)};return(o,r)=>(h(),y("a",{class:"link",href:"javascript:;",onClick:s},ce(e.c),1))}});const p1=R(h1,[["__scopeId","data-v-04a5294c"]]),_1={class:"title"},m1=["src"],v1={style:{"text-align":"center"}},g1=K({__name:"Title",props:{subTitle:{type:String,required:!0},logo:{type:String,required:!0},linkList:{type:Array,required:!0}},setup(e){return(t,n)=>(h(),y("div",_1,[b("img",{src:e.logo,alt:"logo",style:{margin:"0 auto"}},null,8,m1),b("p",v1,ce(e.subTitle),1),(h(!0),y(oe,null,Te(e.linkList,s=>(h(),X(p1,{key:s.content,c:s.content,t:s.target},null,8,["c","t"]))),128))]))}});const Xt={...xr,enhanceApp(e){xr.enhanceApp(e);const{app:t}=e;t.component("Title",g1)},setup(){const e=go();yt(()=>{e.route.path,is(()=>$e?f1(".main img",{background:"var(--vp-c-bg)"}):null)})}};function y1(e,t){let n=[],s=!0;const o=r=>{if(s){s=!1;return}n.forEach(i=>document.head.removeChild(i)),n=[],r.forEach(i=>{const l=b1(i);document.head.appendChild(l),n.push(l)})};yt(()=>{const r=e.data,i=t.value,l=r&&r.description,a=r&&r.frontmatter.head||[];document.title=$i(i,r),document.querySelector("meta[name=description]").setAttribute("content",l||i.description),o(Pi(i.head,w1(a)))})}function b1([e,t,n]){const s=document.createElement(e);for(const o in t)s.setAttribute(o,t[o]);return n&&(s.innerHTML=n),s}function x1(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function w1(e){return e.filter(t=>!x1(t))}const Es=new Set,Ri=()=>document.createElement("link"),k1=e=>{const t=Ri();t.rel="prefetch",t.href=e,document.head.appendChild(t)},$1=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Bn;const P1=$e&&(Bn=Ri())&&Bn.relList&&Bn.relList.supports&&Bn.relList.supports("prefetch")?k1:$1;function C1(){if(!$e||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(r=>{r.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:a}=l;if(!Es.has(a)){Es.add(a);const u=Li(a);P1(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(r=>{const{target:i,hostname:l,pathname:a}=r,u=a.match(/\.\w+$/);u&&u[0]!==".html"||i!=="_blank"&&l===location.hostname&&(a!==location.pathname?n.observe(r):Es.add(a))})})};ze(s);const o=wt();tt(()=>o.path,s),xt(()=>{n&&n.disconnect()})}const S1=K({setup(e,{slots:t}){const n=pe(!1);return ze(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function L1(){if($e){const e=new Map;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const o=n.parentElement,r=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!o||!r)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(o.className);let l="";r.querySelectorAll("span.line:not(.diff.remove)").forEach(a=>l+=(a.textContent||"")+` -`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),E1(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function E1(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),o=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),o&&(s.removeAllRanges(),s.addRange(o)),n&&n.focus()}}function T1(){$e&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const o=(n=t.parentElement)==null?void 0:n.parentElement,r=Array.from((o==null?void 0:o.querySelectorAll("input"))||[]).indexOf(t),i=o==null?void 0:o.querySelector('div[class*="language-"].active'),l=(s=o==null?void 0:o.querySelectorAll('div[class*="language-"]'))==null?void 0:s[r];i&&l&&i!==l&&(i.classList.remove("active"),l.classList.add("active"))}})}const Di=Xt.NotFound||(()=>"404 Not Found"),A1=K({name:"VitePressApp",setup(){const{site:e}=Si();return ze(()=>{yt(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),C1(),L1(),T1(),Xt.setup&&Xt.setup(),()=>Gn(Xt.Layout)}});async function V1(){const e=I1(),t=M1();t.provide(Ei,e);const n=Tc(e.route);return t.provide(Ci,n),t.provide("NotFound",Di),t.component("Content",Ic),t.component("ClientOnly",S1),Object.defineProperty(t.config.globalProperties,"$frontmatter",{get(){return n.frontmatter.value}}),Xt.enhanceApp&&await Xt.enhanceApp({app:t,router:e,siteData:_t}),{app:t,router:e,data:n}}function M1(){return _c(A1)}function I1(){let e=$e,t;return Mc(n=>{let s=Li(n);return e&&(t=s),(e||t===s)&&(s=s.replace(/\.js$/,".lean.js")),$e&&(e=!1),yc(()=>import(s),[])},Di)}$e&&V1().then(({app:e,router:t,data:n})=>{t.go().then(()=>{y1(t.route,n.site),e.mount("#app")})});export{R as _,Sa as a,b,y as c,V1 as createApp,Ee as d,N as e,Ca as g,N1 as n,h as o,Bt as r}; +See: https://github.com/francoischalifour/medium-zoom`)}},l1=function(t){var n=document.createElement("div");return n.classList.add("medium-zoom-overlay"),n.style.background=t,n},a1=function(t){var n=t.getBoundingClientRect(),s=n.top,o=n.left,r=n.width,i=n.height,l=t.cloneNode(),a=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,u=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return l.removeAttribute("id"),l.style.position="absolute",l.style.top=s+a+"px",l.style.left=o+u+"px",l.style.width=r+"px",l.style.height=i+"px",l.style.transform="",l},Dt=function(t,n){var s=At({bubbles:!1,cancelable:!1,detail:void 0},n);if(typeof window.CustomEvent=="function")return new CustomEvent(t,s);var o=document.createEvent("CustomEvent");return o.initCustomEvent(t,s.bubbles,s.cancelable,s.detail),o},c1=function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},s=window.Promise||function($){function I(){}$(I,I)},o=function($){var I=$.target;if(I===ne){F();return}E.indexOf(I)!==-1&&B({target:I})},r=function(){if(!(ee||!p.original)){var $=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(he-$)>D.scrollOffset&&setTimeout(F,150)}},i=function($){var I=$.key||$.keyCode;(I==="Escape"||I==="Esc"||I===27)&&F()},l=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},I=$;if($.background&&(ne.style.background=$.background),$.container&&$.container instanceof Object&&(I.container=At({},D.container,$.container)),$.template){var A=Rn($.template)?$.template:document.querySelector($.template);I.template=A}return D=At({},D,I),E.forEach(function(ue){ue.dispatchEvent(Dt("medium-zoom:update",{detail:{zoom:U}}))}),U},a=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(At({},D,$))},u=function(){for(var $=arguments.length,I=Array($),A=0;A<$;A++)I[A]=arguments[A];var ue=I.reduce(function(z,ie){return[].concat(z,kr(ie))},[]);return ue.filter(function(z){return E.indexOf(z)===-1}).forEach(function(z){E.push(z),z.classList.add("medium-zoom-image")}),J.forEach(function(z){var ie=z.type,le=z.listener,Ve=z.options;ue.forEach(function(Ie){Ie.addEventListener(ie,le,Ve)})}),U},f=function(){for(var $=arguments.length,I=Array($),A=0;A<$;A++)I[A]=arguments[A];p.zoomed&&F();var ue=I.length>0?I.reduce(function(z,ie){return[].concat(z,kr(ie))},[]):E;return ue.forEach(function(z){z.classList.remove("medium-zoom-image"),z.dispatchEvent(Dt("medium-zoom:detach",{detail:{zoom:U}}))}),E=E.filter(function(z){return ue.indexOf(z)===-1}),U},m=function($,I){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return E.forEach(function(ue){ue.addEventListener("medium-zoom:"+$,I,A)}),J.push({type:"medium-zoom:"+$,listener:I,options:A}),U},g=function($,I){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return E.forEach(function(ue){ue.removeEventListener("medium-zoom:"+$,I,A)}),J=J.filter(function(ue){return!(ue.type==="medium-zoom:"+$&&ue.listener.toString()===I.toString())}),U},C=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},I=$.target,A=function(){var z={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},ie=void 0,le=void 0;if(D.container)if(D.container instanceof Object)z=At({},z,D.container),ie=z.width-z.left-z.right-D.margin*2,le=z.height-z.top-z.bottom-D.margin*2;else{var Ve=Rn(D.container)?D.container:document.querySelector(D.container),Ie=Ve.getBoundingClientRect(),je=Ie.width,ze=Ie.height,Ln=Ie.left,gs=Ie.top;z=At({},z,{width:je,height:ze,left:Ln,top:gs})}ie=ie||z.width-D.margin*2,le=le||z.height-D.margin*2;var $t=p.zoomedHd||p.original,Ke=wr($t)?ie:$t.naturalWidth||ie,zt=wr($t)?le:$t.naturalHeight||le,Pt=$t.getBoundingClientRect(),ct=Pt.top,rn=Pt.left,Ct=Pt.width,c=Pt.height,d=Math.min(Math.max(Ct,Ke),ie)/Ct,v=Math.min(Math.max(c,zt),le)/c,w=Math.min(d,v),k=(-rn+(ie-Ct)/2+D.margin+z.left)/w,S=(-ct+(le-c)/2+D.margin+z.top)/w,O="scale("+w+") translate3d("+k+"px, "+S+"px, 0)";p.zoomed.style.transform=O,p.zoomedHd&&(p.zoomedHd.style.transform=O)};return new s(function(ue){if(I&&E.indexOf(I)===-1){ue(U);return}var z=function je(){ee=!1,p.zoomed.removeEventListener("transitionend",je),p.original.dispatchEvent(Dt("medium-zoom:opened",{detail:{zoom:U}})),ue(U)};if(p.zoomed){ue(U);return}if(I)p.original=I;else if(E.length>0){var ie=E;p.original=ie[0]}else{ue(U);return}if(p.original.dispatchEvent(Dt("medium-zoom:open",{detail:{zoom:U}})),he=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,ee=!0,p.zoomed=a1(p.original),document.body.appendChild(ne),D.template){var le=Rn(D.template)?D.template:document.querySelector(D.template);p.template=document.createElement("div"),p.template.appendChild(le.content.cloneNode(!0)),document.body.appendChild(p.template)}if(p.original.parentElement&&p.original.parentElement.tagName==="PICTURE"&&p.original.currentSrc&&(p.zoomed.src=p.original.currentSrc),document.body.appendChild(p.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),p.original.classList.add("medium-zoom-image--hidden"),p.zoomed.classList.add("medium-zoom-image--opened"),p.zoomed.addEventListener("click",F),p.zoomed.addEventListener("transitionend",z),p.original.getAttribute("data-zoom-src")){p.zoomedHd=p.zoomed.cloneNode(),p.zoomedHd.removeAttribute("srcset"),p.zoomedHd.removeAttribute("sizes"),p.zoomedHd.removeAttribute("loading"),p.zoomedHd.src=p.zoomed.getAttribute("data-zoom-src"),p.zoomedHd.onerror=function(){clearInterval(Ve),console.warn("Unable to reach the zoom image target "+p.zoomedHd.src),p.zoomedHd=null,A()};var Ve=setInterval(function(){p.zoomedHd.complete&&(clearInterval(Ve),p.zoomedHd.classList.add("medium-zoom-image--opened"),p.zoomedHd.addEventListener("click",F),document.body.appendChild(p.zoomedHd),A())},10)}else if(p.original.hasAttribute("srcset")){p.zoomedHd=p.zoomed.cloneNode(),p.zoomedHd.removeAttribute("sizes"),p.zoomedHd.removeAttribute("loading");var Ie=p.zoomedHd.addEventListener("load",function(){p.zoomedHd.removeEventListener("load",Ie),p.zoomedHd.classList.add("medium-zoom-image--opened"),p.zoomedHd.addEventListener("click",F),document.body.appendChild(p.zoomedHd),A()})}else A()})},F=function(){return new s(function($){if(ee||!p.original){$(U);return}var I=function A(){p.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(p.zoomed),p.zoomedHd&&document.body.removeChild(p.zoomedHd),document.body.removeChild(ne),p.zoomed.classList.remove("medium-zoom-image--opened"),p.template&&document.body.removeChild(p.template),ee=!1,p.zoomed.removeEventListener("transitionend",A),p.original.dispatchEvent(Dt("medium-zoom:closed",{detail:{zoom:U}})),p.original=null,p.zoomed=null,p.zoomedHd=null,p.template=null,$(U)};ee=!0,document.body.classList.remove("medium-zoom--opened"),p.zoomed.style.transform="",p.zoomedHd&&(p.zoomedHd.style.transform=""),p.template&&(p.template.style.transition="opacity 150ms",p.template.style.opacity=0),p.original.dispatchEvent(Dt("medium-zoom:close",{detail:{zoom:U}})),p.zoomed.addEventListener("transitionend",I)})},B=function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},I=$.target;return p.original?F():C({target:I})},se=function(){return D},x=function(){return E},V=function(){return p.original},E=[],J=[],ee=!1,he=0,D=n,p={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?D=t:(t||typeof t=="string")&&u(t),D=At({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},D);var ne=l1(D.background);document.addEventListener("click",o),document.addEventListener("keyup",i),document.addEventListener("scroll",r),window.addEventListener("resize",F);var U={open:C,close:F,toggle:B,update:l,clone:a,attach:u,detach:f,on:m,off:g,getOptions:se,getImages:x,getZoomedImage:V};return U};function u1(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>"u")){var s=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&s.firstChild?s.insertBefore(o,s.firstChild):s.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var d1=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";u1(d1);const f1=c1,h1=K({__name:"Link",props:{c:{type:String,required:!0},t:{type:String,required:!0}},setup(e){const t=e,n=go(),s=()=>{t.t.startsWith("http")?window.open(t.t,"_blank"):t.t.endsWith("/")?window&&window.location&&(window.location=t.t):n.go(t.t)};return(o,r)=>(h(),y("a",{class:"link",href:"javascript:;",onClick:s},ce(e.c),1))}});const p1=R(h1,[["__scopeId","data-v-04a5294c"]]),_1={class:"title"},m1=["src"],v1={style:{"text-align":"center"}},g1=K({__name:"Title",props:{subTitle:{type:String,required:!0},logo:{type:String,required:!0},linkList:{type:Array,required:!0}},setup(e){return(t,n)=>(h(),y("div",_1,[b("img",{src:e.logo,alt:"logo",style:{margin:"0 auto"}},null,8,m1),b("p",v1,ce(e.subTitle),1),(h(!0),y(oe,null,Te(e.linkList,s=>(h(),X(p1,{key:s.content,c:s.content,t:s.target},null,8,["c","t"]))),128))]))}});const Xt={...xr,enhanceApp(e){xr.enhanceApp(e);const{app:t}=e;t.component("Title",g1)},setup(){const e=go();yt(()=>{e.route.path,is(()=>$e?f1(".main img",{background:"var(--vp-c-bg)"}):null)})}};function y1(e,t){let n=[],s=!0;const o=r=>{if(s){s=!1;return}n.forEach(i=>document.head.removeChild(i)),n=[],r.forEach(i=>{const l=b1(i);document.head.appendChild(l),n.push(l)})};yt(()=>{const r=e.data,i=t.value,l=r&&r.description,a=r&&r.frontmatter.head||[];document.title=$i(i,r),document.querySelector("meta[name=description]").setAttribute("content",l||i.description),o(Pi(i.head,w1(a)))})}function b1([e,t,n]){const s=document.createElement(e);for(const o in t)s.setAttribute(o,t[o]);return n&&(s.innerHTML=n),s}function x1(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function w1(e){return e.filter(t=>!x1(t))}const Es=new Set,Ri=()=>document.createElement("link"),k1=e=>{const t=Ri();t.rel="prefetch",t.href=e,document.head.appendChild(t)},$1=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Bn;const P1=$e&&(Bn=Ri())&&Bn.relList&&Bn.relList.supports&&Bn.relList.supports("prefetch")?k1:$1;function C1(){if(!$e||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(r=>{r.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:a}=l;if(!Es.has(a)){Es.add(a);const u=Li(a);P1(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(r=>{const{target:i,hostname:l,pathname:a}=r,u=a.match(/\.\w+$/);u&&u[0]!==".html"||i!=="_blank"&&l===location.hostname&&(a!==location.pathname?n.observe(r):Es.add(a))})})};Fe(s);const o=wt();tt(()=>o.path,s),xt(()=>{n&&n.disconnect()})}const S1=K({setup(e,{slots:t}){const n=pe(!1);return Fe(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function L1(){if($e){const e=new Map;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const o=n.parentElement,r=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!o||!r)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(o.className);let l="";r.querySelectorAll("span.line:not(.diff.remove)").forEach(a=>l+=(a.textContent||"")+` +`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),E1(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function E1(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),o=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),o&&(s.removeAllRanges(),s.addRange(o)),n&&n.focus()}}function T1(){$e&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const o=(n=t.parentElement)==null?void 0:n.parentElement,r=Array.from((o==null?void 0:o.querySelectorAll("input"))||[]).indexOf(t),i=o==null?void 0:o.querySelector('div[class*="language-"].active'),l=(s=o==null?void 0:o.querySelectorAll('div[class*="language-"]'))==null?void 0:s[r];i&&l&&i!==l&&(i.classList.remove("active"),l.classList.add("active"))}})}const Di=Xt.NotFound||(()=>"404 Not Found"),A1=K({name:"VitePressApp",setup(){const{site:e}=Si();return Fe(()=>{yt(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),C1(),L1(),T1(),Xt.setup&&Xt.setup(),()=>Gn(Xt.Layout)}});async function V1(){const e=I1(),t=M1();t.provide(Ei,e);const n=Tc(e.route);return t.provide(Ci,n),t.provide("NotFound",Di),t.component("Content",Ic),t.component("ClientOnly",S1),Object.defineProperty(t.config.globalProperties,"$frontmatter",{get(){return n.frontmatter.value}}),Xt.enhanceApp&&await Xt.enhanceApp({app:t,router:e,siteData:_t}),{app:t,router:e,data:n}}function M1(){return _c(A1)}function I1(){let e=$e,t;return Mc(n=>{let s=Li(n);return e&&(t=s),(e||t===s)&&(s=s.replace(/\.js$/,".lean.js")),$e&&(e=!1),yc(()=>import(s),[])},Di)}$e&&V1().then(({app:e,router:t,data:n})=>{t.go().then(()=>{y1(t.route,n.site),e.mount("#app")})});export{R as _,Sa as a,b,y as c,V1 as createApp,Ee as d,N as e,Ca as g,N1 as n,h as o,Bt as r}; diff --git a/assets/article_【2023】青训营 - 前端练习题汇总解析.md.1e0e60ae.js b/assets/article_【2023】青训营 - 前端练习题汇总解析.md.d551ee63.js similarity index 99% rename from assets/article_【2023】青训营 - 前端练习题汇总解析.md.1e0e60ae.js rename to assets/article_【2023】青训营 - 前端练习题汇总解析.md.d551ee63.js index 53531fef..08342bf5 100644 --- a/assets/article_【2023】青训营 - 前端练习题汇总解析.md.1e0e60ae.js +++ b/assets/article_【2023】青训营 - 前端练习题汇总解析.md.d551ee63.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const A=JSON.parse('{"title":"【2023】青训营 - 前端练习题汇总解析","description":"","frontmatter":{},"headers":[{"level":2,"title":"选择题","slug":"选择题","link":"#选择题","children":[{"level":3,"title":"DAY 1","slug":"day-1","link":"#day-1","children":[]},{"level":3,"title":"DAY 2","slug":"day-2","link":"#day-2","children":[]},{"level":3,"title":"DAY 3","slug":"day-3","link":"#day-3","children":[]},{"level":3,"title":"DAY 4","slug":"day-4","link":"#day-4","children":[]},{"level":3,"title":"DAY 5","slug":"day-5","link":"#day-5","children":[]},{"level":3,"title":"DAY 6","slug":"day-6","link":"#day-6","children":[]},{"level":3,"title":"DAY 7","slug":"day-7","link":"#day-7","children":[]},{"level":3,"title":"DAY 8","slug":"day-8","link":"#day-8","children":[]},{"level":3,"title":"DAY 9","slug":"day-9","link":"#day-9","children":[]}]},{"level":2,"title":"编程题","slug":"编程题","link":"#编程题","children":[{"level":3,"title":"题目 1","slug":"题目-1","link":"#题目-1","children":[]},{"level":3,"title":"题目 2","slug":"题目-2","link":"#题目-2","children":[]},{"level":3,"title":"题目 3","slug":"题目-3","link":"#题目-3","children":[]}]}],"relativePath":"article/【2023】青训营 - 前端练习题汇总解析.md","lastUpdated":1675780846000}'),p={name:"article/【2023】青训营 - 前端练习题汇总解析.md"},e=l(`

【2023】青训营 - 前端练习题汇总解析

汇总了青训营官方账号每天发布的练习题,并且给出了答案、做了简单解析与知识扩充,有不足之处欢迎一起交流学习。

每天的选择题不同,而编程题是一样的,直接去Leetcode刷题即可。

选择题

DAY 1

题目描述

text
选择题 1:  
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const A=JSON.parse('{"title":"【2023】青训营 - 前端练习题汇总解析","description":"","frontmatter":{},"headers":[{"level":2,"title":"选择题","slug":"选择题","link":"#选择题","children":[{"level":3,"title":"DAY 1","slug":"day-1","link":"#day-1","children":[]},{"level":3,"title":"DAY 2","slug":"day-2","link":"#day-2","children":[]},{"level":3,"title":"DAY 3","slug":"day-3","link":"#day-3","children":[]},{"level":3,"title":"DAY 4","slug":"day-4","link":"#day-4","children":[]},{"level":3,"title":"DAY 5","slug":"day-5","link":"#day-5","children":[]},{"level":3,"title":"DAY 6","slug":"day-6","link":"#day-6","children":[]},{"level":3,"title":"DAY 7","slug":"day-7","link":"#day-7","children":[]},{"level":3,"title":"DAY 8","slug":"day-8","link":"#day-8","children":[]},{"level":3,"title":"DAY 9","slug":"day-9","link":"#day-9","children":[]}]},{"level":2,"title":"编程题","slug":"编程题","link":"#编程题","children":[{"level":3,"title":"题目 1","slug":"题目-1","link":"#题目-1","children":[]},{"level":3,"title":"题目 2","slug":"题目-2","link":"#题目-2","children":[]},{"level":3,"title":"题目 3","slug":"题目-3","link":"#题目-3","children":[]}]}],"relativePath":"article/【2023】青训营 - 前端练习题汇总解析.md","lastUpdated":1675783866000}'),p={name:"article/【2023】青训营 - 前端练习题汇总解析.md"},e=l(`

【2023】青训营 - 前端练习题汇总解析

汇总了青训营官方账号每天发布的练习题,并且给出了答案、做了简单解析与知识扩充,有不足之处欢迎一起交流学习。

每天的选择题不同,而编程题是一样的,直接去Leetcode刷题即可。

选择题

DAY 1

题目描述

text
选择题 1:  
 下列哪些是 HTML5 的新特性?  
 A. 语义标签  
 B. Canvas 绘图  
diff --git a/assets/article_【2023】青训营 - 前端练习题汇总解析.md.1e0e60ae.lean.js b/assets/article_【2023】青训营 - 前端练习题汇总解析.md.d551ee63.lean.js
similarity index 91%
rename from assets/article_【2023】青训营 - 前端练习题汇总解析.md.1e0e60ae.lean.js
rename to assets/article_【2023】青训营 - 前端练习题汇总解析.md.d551ee63.lean.js
index df41ca04..e8d4812d 100644
--- a/assets/article_【2023】青训营 - 前端练习题汇总解析.md.1e0e60ae.lean.js	
+++ b/assets/article_【2023】青训营 - 前端练习题汇总解析.md.d551ee63.lean.js	
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const A=JSON.parse('{"title":"【2023】青训营 - 前端练习题汇总解析","description":"","frontmatter":{},"headers":[{"level":2,"title":"选择题","slug":"选择题","link":"#选择题","children":[{"level":3,"title":"DAY 1","slug":"day-1","link":"#day-1","children":[]},{"level":3,"title":"DAY 2","slug":"day-2","link":"#day-2","children":[]},{"level":3,"title":"DAY 3","slug":"day-3","link":"#day-3","children":[]},{"level":3,"title":"DAY 4","slug":"day-4","link":"#day-4","children":[]},{"level":3,"title":"DAY 5","slug":"day-5","link":"#day-5","children":[]},{"level":3,"title":"DAY 6","slug":"day-6","link":"#day-6","children":[]},{"level":3,"title":"DAY 7","slug":"day-7","link":"#day-7","children":[]},{"level":3,"title":"DAY 8","slug":"day-8","link":"#day-8","children":[]},{"level":3,"title":"DAY 9","slug":"day-9","link":"#day-9","children":[]}]},{"level":2,"title":"编程题","slug":"编程题","link":"#编程题","children":[{"level":3,"title":"题目 1","slug":"题目-1","link":"#题目-1","children":[]},{"level":3,"title":"题目 2","slug":"题目-2","link":"#题目-2","children":[]},{"level":3,"title":"题目 3","slug":"题目-3","link":"#题目-3","children":[]}]}],"relativePath":"article/【2023】青训营 - 前端练习题汇总解析.md","lastUpdated":1675780846000}'),p={name:"article/【2023】青训营 - 前端练习题汇总解析.md"},e=l("",150),o=[e];function r(c,t,i,y,C,d){return n(),a("div",null,o)}const b=s(p,[["render",r]]);export{A as __pageData,b as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const A=JSON.parse('{"title":"【2023】青训营 - 前端练习题汇总解析","description":"","frontmatter":{},"headers":[{"level":2,"title":"选择题","slug":"选择题","link":"#选择题","children":[{"level":3,"title":"DAY 1","slug":"day-1","link":"#day-1","children":[]},{"level":3,"title":"DAY 2","slug":"day-2","link":"#day-2","children":[]},{"level":3,"title":"DAY 3","slug":"day-3","link":"#day-3","children":[]},{"level":3,"title":"DAY 4","slug":"day-4","link":"#day-4","children":[]},{"level":3,"title":"DAY 5","slug":"day-5","link":"#day-5","children":[]},{"level":3,"title":"DAY 6","slug":"day-6","link":"#day-6","children":[]},{"level":3,"title":"DAY 7","slug":"day-7","link":"#day-7","children":[]},{"level":3,"title":"DAY 8","slug":"day-8","link":"#day-8","children":[]},{"level":3,"title":"DAY 9","slug":"day-9","link":"#day-9","children":[]}]},{"level":2,"title":"编程题","slug":"编程题","link":"#编程题","children":[{"level":3,"title":"题目 1","slug":"题目-1","link":"#题目-1","children":[]},{"level":3,"title":"题目 2","slug":"题目-2","link":"#题目-2","children":[]},{"level":3,"title":"题目 3","slug":"题目-3","link":"#题目-3","children":[]}]}],"relativePath":"article/【2023】青训营 - 前端练习题汇总解析.md","lastUpdated":1675783866000}'),p={name:"article/【2023】青训营 - 前端练习题汇总解析.md"},e=l("",150),o=[e];function r(c,t,i,y,C,d){return n(),a("div",null,o)}const b=s(p,[["render",r]]);export{A as __pageData,b as default};
diff --git a/assets/article_一文读懂事件冒泡与事件捕获.md.23d45e04.js b/assets/article_一文读懂事件冒泡与事件捕获.md.8ffefd80.js
similarity index 99%
rename from assets/article_一文读懂事件冒泡与事件捕获.md.23d45e04.js
rename to assets/article_一文读懂事件冒泡与事件捕获.md.8ffefd80.js
index 31d2ab74..e730b913 100644
--- a/assets/article_一文读懂事件冒泡与事件捕获.md.23d45e04.js
+++ b/assets/article_一文读懂事件冒泡与事件捕获.md.8ffefd80.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as e}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"一文读懂事件冒泡与事件捕获","description":"","frontmatter":{},"headers":[{"level":2,"title":"💡 从例子入手","slug":"💡-从例子入手","link":"#💡-从例子入手","children":[]},{"level":2,"title":"🤔 什么是事件冒泡机制?事件捕获又是什么?","slug":"🤔-什么是事件冒泡机制-事件捕获又是什么","link":"#🤔-什么是事件冒泡机制-事件捕获又是什么","children":[{"level":3,"title":"📌 用例子验证结论","slug":"📌-用例子验证结论","link":"#📌-用例子验证结论","children":[]}]},{"level":2,"title":"🧐 为什么有两个阶段?它们有什么用?","slug":"🧐-为什么有两个阶段-它们有什么用","link":"#🧐-为什么有两个阶段-它们有什么用","children":[{"level":3,"title":"📌 历史渊源","slug":"📌-历史渊源","link":"#📌-历史渊源","children":[]},{"level":3,"title":"📌 事件代理 (Event delegation)","slug":"📌-事件代理-event-delegation","link":"#📌-事件代理-event-delegation","children":[]},{"level":3,"title":"📌 事件对象中的target与currentTarget","slug":"📌-事件对象中的target与currenttarget","link":"#📌-事件对象中的target与currenttarget","children":[]}]},{"level":2,"title":"🥳 如何阻止事件冒泡?","slug":"🥳-如何阻止事件冒泡","link":"#🥳-如何阻止事件冒泡","children":[{"level":3,"title":"📌 .stopPropagation()","slug":"📌-stoppropagation","link":"#📌-stoppropagation","children":[]},{"level":3,"title":"📌 e.target == e.currentTarget","slug":"📌-e-target-e-currenttarget","link":"#📌-e-target-e-currenttarget","children":[]},{"level":3,"title":"📌 return false","slug":"📌-return-false","link":"#📌-return-false","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"article/一文读懂事件冒泡与事件捕获.md","lastUpdated":1675780846000}'),l={name:"article/一文读懂事件冒泡与事件捕获.md"},p=e(`

一文读懂事件冒泡与事件捕获

💡 从例子入手

这是一个简单的 Demo,点击的 Display video 按钮后,将视频展示出来。

其中的视频 <video> 标签被 <div> 包裹,<div><video> 上都绑定了自己的 click 事件。

代码片段

我们的预期是:点击 <video> 时播放视频,点击 <div> 时隐藏视频,然而实际上你会发现,点击视频后,不仅视频虽然正常播放,但同时也被隐藏了。

点击子元素,父元素的事件也被触发,导致这种现象的原因正是:浏览器的事件冒泡机制

🤔 什么是事件冒泡机制?事件捕获又是什么?

现代浏览器提供了两种事件处理阶段:捕获阶段与冒泡阶段

bubbling-capturing.png

在捕获阶段:

  • 浏览器检查元素的最外层祖先 <html> ,是否在捕获阶段中注册了一个 onclick 事件处理程序,如果是,则运行它。
  • 然后,它移动到 <html> 中单击元素的下一个祖先元素,执行相同的操作,然后是单击元素再下一个祖先元素,依此类推,直到到达实际点击的元素。

在冒泡阶段,与上述顺序相反:

  • 浏览器检查实际点击的元素是否在冒泡阶段中注册了一个 onclick 事件处理程序,如果是,则运行它
  • 然后它移动到下一个直接的祖先元素,并做同样的事情,然后是下一个,等等,直到它到达 <html> 元素。

当一个事件被触发时,浏览器先运行捕获阶段,后运行冒泡阶段,并且在默认情况下,所有事件处理程序都在冒泡阶段进行注册

针对上面提到的问题,我们可以知道:当 <video> 点击事件触发后,虽然我们没有主动触发 <div> 上绑定的点击事件,但由于冒泡机制,点击事件冒泡到了 <div> 上,并触发了绑定在其上的监听回调函数,将 <video> 标签隐藏。

📌 用例子验证结论

下面是一个用于验证上述结论的Demo:

页面中包括由外向内的三个类名不同的div标签: div1 div2 div3,并为他们在捕获阶段/冒泡阶段分别绑定了不同的事件函数 clickdblclick

代码片段

当点击最内部的 div3 后,浏览器控制台输出:

> 捕获 click div1
+import{_ as s,o as n,c as a,a as e}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"一文读懂事件冒泡与事件捕获","description":"","frontmatter":{},"headers":[{"level":2,"title":"💡 从例子入手","slug":"💡-从例子入手","link":"#💡-从例子入手","children":[]},{"level":2,"title":"🤔 什么是事件冒泡机制?事件捕获又是什么?","slug":"🤔-什么是事件冒泡机制-事件捕获又是什么","link":"#🤔-什么是事件冒泡机制-事件捕获又是什么","children":[{"level":3,"title":"📌 用例子验证结论","slug":"📌-用例子验证结论","link":"#📌-用例子验证结论","children":[]}]},{"level":2,"title":"🧐 为什么有两个阶段?它们有什么用?","slug":"🧐-为什么有两个阶段-它们有什么用","link":"#🧐-为什么有两个阶段-它们有什么用","children":[{"level":3,"title":"📌 历史渊源","slug":"📌-历史渊源","link":"#📌-历史渊源","children":[]},{"level":3,"title":"📌 事件代理 (Event delegation)","slug":"📌-事件代理-event-delegation","link":"#📌-事件代理-event-delegation","children":[]},{"level":3,"title":"📌 事件对象中的target与currentTarget","slug":"📌-事件对象中的target与currenttarget","link":"#📌-事件对象中的target与currenttarget","children":[]}]},{"level":2,"title":"🥳 如何阻止事件冒泡?","slug":"🥳-如何阻止事件冒泡","link":"#🥳-如何阻止事件冒泡","children":[{"level":3,"title":"📌 .stopPropagation()","slug":"📌-stoppropagation","link":"#📌-stoppropagation","children":[]},{"level":3,"title":"📌 e.target == e.currentTarget","slug":"📌-e-target-e-currenttarget","link":"#📌-e-target-e-currenttarget","children":[]},{"level":3,"title":"📌 return false","slug":"📌-return-false","link":"#📌-return-false","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"article/一文读懂事件冒泡与事件捕获.md","lastUpdated":1675783866000}'),l={name:"article/一文读懂事件冒泡与事件捕获.md"},p=e(`

一文读懂事件冒泡与事件捕获

💡 从例子入手

这是一个简单的 Demo,点击的 Display video 按钮后,将视频展示出来。

其中的视频 <video> 标签被 <div> 包裹,<div><video> 上都绑定了自己的 click 事件。

代码片段

我们的预期是:点击 <video> 时播放视频,点击 <div> 时隐藏视频,然而实际上你会发现,点击视频后,不仅视频虽然正常播放,但同时也被隐藏了。

点击子元素,父元素的事件也被触发,导致这种现象的原因正是:浏览器的事件冒泡机制

🤔 什么是事件冒泡机制?事件捕获又是什么?

现代浏览器提供了两种事件处理阶段:捕获阶段与冒泡阶段

bubbling-capturing.png

在捕获阶段:

  • 浏览器检查元素的最外层祖先 <html> ,是否在捕获阶段中注册了一个 onclick 事件处理程序,如果是,则运行它。
  • 然后,它移动到 <html> 中单击元素的下一个祖先元素,执行相同的操作,然后是单击元素再下一个祖先元素,依此类推,直到到达实际点击的元素。

在冒泡阶段,与上述顺序相反:

  • 浏览器检查实际点击的元素是否在冒泡阶段中注册了一个 onclick 事件处理程序,如果是,则运行它
  • 然后它移动到下一个直接的祖先元素,并做同样的事情,然后是下一个,等等,直到它到达 <html> 元素。

当一个事件被触发时,浏览器先运行捕获阶段,后运行冒泡阶段,并且在默认情况下,所有事件处理程序都在冒泡阶段进行注册

针对上面提到的问题,我们可以知道:当 <video> 点击事件触发后,虽然我们没有主动触发 <div> 上绑定的点击事件,但由于冒泡机制,点击事件冒泡到了 <div> 上,并触发了绑定在其上的监听回调函数,将 <video> 标签隐藏。

📌 用例子验证结论

下面是一个用于验证上述结论的Demo:

页面中包括由外向内的三个类名不同的div标签: div1 div2 div3,并为他们在捕获阶段/冒泡阶段分别绑定了不同的事件函数 clickdblclick

代码片段

当点击最内部的 div3 后,浏览器控制台输出:

> 捕获 click div1
 > 捕获 click div2
 > 捕获 click div3
 > 冒泡 click div3
diff --git a/assets/article_一文读懂事件冒泡与事件捕获.md.23d45e04.lean.js b/assets/article_一文读懂事件冒泡与事件捕获.md.8ffefd80.lean.js
similarity index 94%
rename from assets/article_一文读懂事件冒泡与事件捕获.md.23d45e04.lean.js
rename to assets/article_一文读懂事件冒泡与事件捕获.md.8ffefd80.lean.js
index 9b440246..e75dd8ef 100644
--- a/assets/article_一文读懂事件冒泡与事件捕获.md.23d45e04.lean.js
+++ b/assets/article_一文读懂事件冒泡与事件捕获.md.8ffefd80.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as e}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"一文读懂事件冒泡与事件捕获","description":"","frontmatter":{},"headers":[{"level":2,"title":"💡 从例子入手","slug":"💡-从例子入手","link":"#💡-从例子入手","children":[]},{"level":2,"title":"🤔 什么是事件冒泡机制?事件捕获又是什么?","slug":"🤔-什么是事件冒泡机制-事件捕获又是什么","link":"#🤔-什么是事件冒泡机制-事件捕获又是什么","children":[{"level":3,"title":"📌 用例子验证结论","slug":"📌-用例子验证结论","link":"#📌-用例子验证结论","children":[]}]},{"level":2,"title":"🧐 为什么有两个阶段?它们有什么用?","slug":"🧐-为什么有两个阶段-它们有什么用","link":"#🧐-为什么有两个阶段-它们有什么用","children":[{"level":3,"title":"📌 历史渊源","slug":"📌-历史渊源","link":"#📌-历史渊源","children":[]},{"level":3,"title":"📌 事件代理 (Event delegation)","slug":"📌-事件代理-event-delegation","link":"#📌-事件代理-event-delegation","children":[]},{"level":3,"title":"📌 事件对象中的target与currentTarget","slug":"📌-事件对象中的target与currenttarget","link":"#📌-事件对象中的target与currenttarget","children":[]}]},{"level":2,"title":"🥳 如何阻止事件冒泡?","slug":"🥳-如何阻止事件冒泡","link":"#🥳-如何阻止事件冒泡","children":[{"level":3,"title":"📌 .stopPropagation()","slug":"📌-stoppropagation","link":"#📌-stoppropagation","children":[]},{"level":3,"title":"📌 e.target == e.currentTarget","slug":"📌-e-target-e-currenttarget","link":"#📌-e-target-e-currenttarget","children":[]},{"level":3,"title":"📌 return false","slug":"📌-return-false","link":"#📌-return-false","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"article/一文读懂事件冒泡与事件捕获.md","lastUpdated":1675780846000}'),l={name:"article/一文读懂事件冒泡与事件捕获.md"},p=e("",63),o=[p];function t(r,c,i,d,D,y){return n(),a("div",null,o)}const C=s(l,[["render",t]]);export{u as __pageData,C as default};
+import{_ as s,o as n,c as a,a as e}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"一文读懂事件冒泡与事件捕获","description":"","frontmatter":{},"headers":[{"level":2,"title":"💡 从例子入手","slug":"💡-从例子入手","link":"#💡-从例子入手","children":[]},{"level":2,"title":"🤔 什么是事件冒泡机制?事件捕获又是什么?","slug":"🤔-什么是事件冒泡机制-事件捕获又是什么","link":"#🤔-什么是事件冒泡机制-事件捕获又是什么","children":[{"level":3,"title":"📌 用例子验证结论","slug":"📌-用例子验证结论","link":"#📌-用例子验证结论","children":[]}]},{"level":2,"title":"🧐 为什么有两个阶段?它们有什么用?","slug":"🧐-为什么有两个阶段-它们有什么用","link":"#🧐-为什么有两个阶段-它们有什么用","children":[{"level":3,"title":"📌 历史渊源","slug":"📌-历史渊源","link":"#📌-历史渊源","children":[]},{"level":3,"title":"📌 事件代理 (Event delegation)","slug":"📌-事件代理-event-delegation","link":"#📌-事件代理-event-delegation","children":[]},{"level":3,"title":"📌 事件对象中的target与currentTarget","slug":"📌-事件对象中的target与currenttarget","link":"#📌-事件对象中的target与currenttarget","children":[]}]},{"level":2,"title":"🥳 如何阻止事件冒泡?","slug":"🥳-如何阻止事件冒泡","link":"#🥳-如何阻止事件冒泡","children":[{"level":3,"title":"📌 .stopPropagation()","slug":"📌-stoppropagation","link":"#📌-stoppropagation","children":[]},{"level":3,"title":"📌 e.target == e.currentTarget","slug":"📌-e-target-e-currenttarget","link":"#📌-e-target-e-currenttarget","children":[]},{"level":3,"title":"📌 return false","slug":"📌-return-false","link":"#📌-return-false","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"article/一文读懂事件冒泡与事件捕获.md","lastUpdated":1675783866000}'),l={name:"article/一文读懂事件冒泡与事件捕获.md"},p=e("",63),o=[p];function t(r,c,i,d,D,y){return n(),a("div",null,o)}const C=s(l,[["render",t]]);export{u as __pageData,C as default};
diff --git a/assets/article_一文读懂伪类与伪元素.md.ee081a05.js b/assets/article_一文读懂伪类与伪元素.md.dfb8b26d.js
similarity index 99%
rename from assets/article_一文读懂伪类与伪元素.md.ee081a05.js
rename to assets/article_一文读懂伪类与伪元素.md.dfb8b26d.js
index 28c99801..f9fa14fc 100644
--- a/assets/article_一文读懂伪类与伪元素.md.ee081a05.js
+++ b/assets/article_一文读懂伪类与伪元素.md.dfb8b26d.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const d=JSON.parse('{"title":"一文读懂伪类与伪元素","description":"","frontmatter":{},"headers":[{"level":2,"title":"🔰 什么是伪类?","slug":"🔰-什么是伪类","link":"#🔰-什么是伪类","children":[{"level":3,"title":"典型的伪类关键字","slug":"典型的伪类关键字","link":"#典型的伪类关键字","children":[]},{"level":3,"title":"单独使用的伪类关键字","slug":"单独使用的伪类关键字","link":"#单独使用的伪类关键字","children":[]}]},{"level":2,"title":"🔰 什么是伪元素?","slug":"🔰-什么是伪元素","link":"#🔰-什么是伪元素","children":[]},{"level":2,"title":"📌 伪类与伪元素共同使用","slug":"📌-伪类与伪元素共同使用","link":"#📌-伪类与伪元素共同使用","children":[{"level":3,"title":"题目解读","slug":"题目解读","link":"#题目解读","children":[]},{"level":3,"title":"实现代码","slug":"实现代码","link":"#实现代码","children":[]},{"level":3,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}]}],"relativePath":"article/一文读懂伪类与伪元素.md","lastUpdated":1675780846000}'),p={name:"article/一文读懂伪类与伪元素.md"},e=l(`

一文读懂伪类与伪元素

🔰 什么是伪类?

伪类是添加到选择器的 关键字 ,指定要选择的元素的特殊状态。

典型的伪类关键字

在大多数情况下,伪类都与基础选择器搭配使用,下述是伪类在一些典型场景下的应用。

:hover

指针在 <button> 上悬停,但没有激活它时,按钮颜色变为蓝色

css
button:hover {
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const d=JSON.parse('{"title":"一文读懂伪类与伪元素","description":"","frontmatter":{},"headers":[{"level":2,"title":"🔰 什么是伪类?","slug":"🔰-什么是伪类","link":"#🔰-什么是伪类","children":[{"level":3,"title":"典型的伪类关键字","slug":"典型的伪类关键字","link":"#典型的伪类关键字","children":[]},{"level":3,"title":"单独使用的伪类关键字","slug":"单独使用的伪类关键字","link":"#单独使用的伪类关键字","children":[]}]},{"level":2,"title":"🔰 什么是伪元素?","slug":"🔰-什么是伪元素","link":"#🔰-什么是伪元素","children":[]},{"level":2,"title":"📌 伪类与伪元素共同使用","slug":"📌-伪类与伪元素共同使用","link":"#📌-伪类与伪元素共同使用","children":[{"level":3,"title":"题目解读","slug":"题目解读","link":"#题目解读","children":[]},{"level":3,"title":"实现代码","slug":"实现代码","link":"#实现代码","children":[]},{"level":3,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}]}],"relativePath":"article/一文读懂伪类与伪元素.md","lastUpdated":1675783866000}'),p={name:"article/一文读懂伪类与伪元素.md"},e=l(`

一文读懂伪类与伪元素

🔰 什么是伪类?

伪类是添加到选择器的 关键字 ,指定要选择的元素的特殊状态。

典型的伪类关键字

在大多数情况下,伪类都与基础选择器搭配使用,下述是伪类在一些典型场景下的应用。

:hover

指针在 <button> 上悬停,但没有激活它时,按钮颜色变为蓝色

css
button:hover {
   color: blue;
 }
 

注意: 在触摸屏上 :hover 基本不可用。不同的浏览器上:hover 伪类表现不同。网页开发人员不要让任何内容只能通过悬停才能展示出来,不然这些内容对于触摸屏使用者来说是很难或者说不可能看到。

:not

:not() 用来匹配不符合一组选择器的元素。由于它的作用是防止特定的元素被选中,它也被称为反选伪类negation pseudo-class)。

将所有不是<p>的元素颜色改为蓝色:

css
body:not(p) {
diff --git a/assets/article_一文读懂伪类与伪元素.md.ee081a05.lean.js b/assets/article_一文读懂伪类与伪元素.md.dfb8b26d.lean.js
similarity index 90%
rename from assets/article_一文读懂伪类与伪元素.md.ee081a05.lean.js
rename to assets/article_一文读懂伪类与伪元素.md.dfb8b26d.lean.js
index e1cf1f9b..4b0c8494 100644
--- a/assets/article_一文读懂伪类与伪元素.md.ee081a05.lean.js
+++ b/assets/article_一文读懂伪类与伪元素.md.dfb8b26d.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const d=JSON.parse('{"title":"一文读懂伪类与伪元素","description":"","frontmatter":{},"headers":[{"level":2,"title":"🔰 什么是伪类?","slug":"🔰-什么是伪类","link":"#🔰-什么是伪类","children":[{"level":3,"title":"典型的伪类关键字","slug":"典型的伪类关键字","link":"#典型的伪类关键字","children":[]},{"level":3,"title":"单独使用的伪类关键字","slug":"单独使用的伪类关键字","link":"#单独使用的伪类关键字","children":[]}]},{"level":2,"title":"🔰 什么是伪元素?","slug":"🔰-什么是伪元素","link":"#🔰-什么是伪元素","children":[]},{"level":2,"title":"📌 伪类与伪元素共同使用","slug":"📌-伪类与伪元素共同使用","link":"#📌-伪类与伪元素共同使用","children":[{"level":3,"title":"题目解读","slug":"题目解读","link":"#题目解读","children":[]},{"level":3,"title":"实现代码","slug":"实现代码","link":"#实现代码","children":[]},{"level":3,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}]}],"relativePath":"article/一文读懂伪类与伪元素.md","lastUpdated":1675780846000}'),p={name:"article/一文读懂伪类与伪元素.md"},e=l("",56),o=[e];function c(r,t,i,D,y,C){return n(),a("div",null,o)}const b=s(p,[["render",c]]);export{d as __pageData,b as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const d=JSON.parse('{"title":"一文读懂伪类与伪元素","description":"","frontmatter":{},"headers":[{"level":2,"title":"🔰 什么是伪类?","slug":"🔰-什么是伪类","link":"#🔰-什么是伪类","children":[{"level":3,"title":"典型的伪类关键字","slug":"典型的伪类关键字","link":"#典型的伪类关键字","children":[]},{"level":3,"title":"单独使用的伪类关键字","slug":"单独使用的伪类关键字","link":"#单独使用的伪类关键字","children":[]}]},{"level":2,"title":"🔰 什么是伪元素?","slug":"🔰-什么是伪元素","link":"#🔰-什么是伪元素","children":[]},{"level":2,"title":"📌 伪类与伪元素共同使用","slug":"📌-伪类与伪元素共同使用","link":"#📌-伪类与伪元素共同使用","children":[{"level":3,"title":"题目解读","slug":"题目解读","link":"#题目解读","children":[]},{"level":3,"title":"实现代码","slug":"实现代码","link":"#实现代码","children":[]},{"level":3,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}]}],"relativePath":"article/一文读懂伪类与伪元素.md","lastUpdated":1675783866000}'),p={name:"article/一文读懂伪类与伪元素.md"},e=l("",56),o=[e];function c(r,t,i,D,y,C){return n(),a("div",null,o)}const b=s(p,[["render",c]]);export{d as __pageData,b as default};
diff --git a/assets/article_一文读懂函数中this指向问题.md.5a36a98f.js b/assets/article_一文读懂函数中this指向问题.md.f6508f72.js
similarity index 99%
rename from assets/article_一文读懂函数中this指向问题.md.5a36a98f.js
rename to assets/article_一文读懂函数中this指向问题.md.f6508f72.js
index 49b5fe56..c0fdbe74 100644
--- a/assets/article_一文读懂函数中this指向问题.md.5a36a98f.js
+++ b/assets/article_一文读懂函数中this指向问题.md.f6508f72.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"一文读懂函数中this指向问题","description":"","frontmatter":{},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[]},{"level":2,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]}]},{"level":2,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[{"level":3,"title":"箭头函数中的this","slug":"箭头函数中的this","link":"#箭头函数中的this","children":[]},{"level":3,"title":"箭头函数中this的查找规则","slug":"箭头函数中this的查找规则","link":"#箭头函数中this的查找规则","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]}]},{"level":2,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}],"relativePath":"article/一文读懂函数中this指向问题.md","lastUpdated":1675780846000}'),e={name:"article/一文读懂函数中this指向问题.md"},p=l(`

一文读懂函数中this指向问题

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

// 定义一个函数
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"一文读懂函数中this指向问题","description":"","frontmatter":{},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[]},{"level":2,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]}]},{"level":2,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[{"level":3,"title":"箭头函数中的this","slug":"箭头函数中的this","link":"#箭头函数中的this","children":[]},{"level":3,"title":"箭头函数中this的查找规则","slug":"箭头函数中this的查找规则","link":"#箭头函数中this的查找规则","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]}]},{"level":2,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}],"relativePath":"article/一文读懂函数中this指向问题.md","lastUpdated":1675783866000}'),e={name:"article/一文读懂函数中this指向问题.md"},p=l(`

一文读懂函数中this指向问题

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

// 定义一个函数
 function foo() {
   console.log(this)
 }
diff --git a/assets/article_一文读懂函数中this指向问题.md.5a36a98f.lean.js b/assets/article_一文读懂函数中this指向问题.md.f6508f72.lean.js
similarity index 91%
rename from assets/article_一文读懂函数中this指向问题.md.5a36a98f.lean.js
rename to assets/article_一文读懂函数中this指向问题.md.f6508f72.lean.js
index fd46cbf4..d8430277 100644
--- a/assets/article_一文读懂函数中this指向问题.md.5a36a98f.lean.js
+++ b/assets/article_一文读懂函数中this指向问题.md.f6508f72.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"一文读懂函数中this指向问题","description":"","frontmatter":{},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[]},{"level":2,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]}]},{"level":2,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[{"level":3,"title":"箭头函数中的this","slug":"箭头函数中的this","link":"#箭头函数中的this","children":[]},{"level":3,"title":"箭头函数中this的查找规则","slug":"箭头函数中this的查找规则","link":"#箭头函数中this的查找规则","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]}]},{"level":2,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}],"relativePath":"article/一文读懂函数中this指向问题.md","lastUpdated":1675780846000}'),e={name:"article/一文读懂函数中this指向问题.md"},p=l("",59),o=[p];function c(i,r,t,b,C,d){return n(),a("div",null,o)}const m=s(e,[["render",c]]);export{u as __pageData,m as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"一文读懂函数中this指向问题","description":"","frontmatter":{},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[]},{"level":2,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]}]},{"level":2,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[{"level":3,"title":"箭头函数中的this","slug":"箭头函数中的this","link":"#箭头函数中的this","children":[]},{"level":3,"title":"箭头函数中this的查找规则","slug":"箭头函数中this的查找规则","link":"#箭头函数中this的查找规则","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]}]},{"level":2,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}],"relativePath":"article/一文读懂函数中this指向问题.md","lastUpdated":1675783866000}'),e={name:"article/一文读懂函数中this指向问题.md"},p=l("",59),o=[p];function c(i,r,t,b,C,d){return n(),a("div",null,o)}const m=s(e,[["render",c]]);export{u as __pageData,m as default};
diff --git a/assets/article_从0实现一个年度报告.md.db25d26a.js b/assets/article_从0实现一个年度报告.md.b23f5ee8.js
similarity index 99%
rename from assets/article_从0实现一个年度报告.md.db25d26a.js
rename to assets/article_从0实现一个年度报告.md.b23f5ee8.js
index 272e160d..bacceb11 100644
--- a/assets/article_从0实现一个年度报告.md.db25d26a.js
+++ b/assets/article_从0实现一个年度报告.md.b23f5ee8.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"从0实现一个年度报告","description":"","frontmatter":{},"headers":[{"level":2,"title":"实现难点","slug":"实现难点","link":"#实现难点","children":[{"level":3,"title":"1. 数据模拟","slug":"_1-数据模拟","link":"#_1-数据模拟","children":[]},{"level":3,"title":"2. 屏幕适配","slug":"_2-屏幕适配","link":"#_2-屏幕适配","children":[]},{"level":3,"title":"3. 动画效果","slug":"_3-动画效果","link":"#_3-动画效果","children":[]},{"level":3,"title":"4. 音乐播放","slug":"_4-音乐播放","link":"#_4-音乐播放","children":[]}]},{"level":2,"title":"用户数据","slug":"用户数据","link":"#用户数据","children":[{"level":3,"title":"用户数据内容","slug":"用户数据内容","link":"#用户数据内容","children":[]},{"level":3,"title":"数据模拟","slug":"数据模拟","link":"#数据模拟","children":[]}]},{"level":2,"title":"编码中遇到的问题","slug":"编码中遇到的问题","link":"#编码中遇到的问题","children":[{"level":3,"title":"音乐自动播放的问题","slug":"音乐自动播放的问题","link":"#音乐自动播放的问题","children":[]},{"level":3,"title":"VNode调整样式的问题","slug":"vnode调整样式的问题","link":"#vnode调整样式的问题","children":[]},{"level":3,"title":"监听Animation结束事件并更新响应式变量","slug":"监听animation结束事件并更新响应式变量","link":"#监听animation结束事件并更新响应式变量","children":[]},{"level":3,"title":"切换页面支持触控滑动滚轮键盘","slug":"切换页面支持触控滑动滚轮键盘","link":"#切换页面支持触控滑动滚轮键盘","children":[]},{"level":3,"title":"代码打包","slug":"代码打包","link":"#代码打包","children":[]}]},{"level":2,"title":"技术介绍","slug":"技术介绍","link":"#技术介绍","children":[]},{"level":2,"title":"功能介绍","slug":"功能介绍","link":"#功能介绍","children":[]},{"level":2,"title":"Demo展示","slug":"demo展示","link":"#demo展示","children":[]}],"relativePath":"article/从0实现一个年度报告.md","lastUpdated":1675780846000}'),p={name:"article/从0实现一个年度报告.md"},o=l(`

从0实现一个年度报告

每到年底各大应用都会推出自己的年终总结报告,统计出用户一年来在应用内的行为展示给用户,供用户记录、分享。

今年掘金社区推出了自己的2022掘友年度报告,这次我们仿照这个报告,从0开始自己实现一个年终总结报告页面

实现难点

1. 数据模拟

一般情况下是根据用户UID,到后端去请求相关接口获得统计数据。

例如掘金的接口为https://api.juejin.cn/event_api/v1/annual/annual_summary?aid=xxxxxx

本次后端使用NodeJS实现了一个爬虫,可以将用户数据统计完成后导出JSON格式的数据,将此数据粘贴到前端页面的输入框即可生成自己的报告

2. 屏幕适配

可以观察到,在PC端和在手机端访问年度报告展示的效果是不一样的。

本次考虑使用媒体查询来实现这个功能:

  • 宽屏则展示背景,页面切换也使用背景中的上下切换按钮
  • 小屏则隐藏背景,让内容填满屏幕,页面切换通过滑动事件监听

3. 动画效果

动画分为文本与背景元素的动画

  • 背景元素的动画使用了SVG动画
    • 动画中不动的部分直接使用.png图片
    • 运动的部分使用SVG动画绘制,如克里克的眼睛、尾巴
  • 文本的动画使用了CSS Animation渐显的效果
    • 不同段落之间通过animation-delay属性,彼此相差1000ms

背景动画容器的四个位置:左上角 右下角 中间部分 中间(悬浮气泡)。不同位置的动画容器都采用绝对定位position: absolute;,辅以z-index实现层叠

囿于工期,本次的背景动画直接采用静态图片+CSS Animation实现上下浮动的效果

4. 音乐播放

通过Audio接口访问网络音乐链接,控制音乐相关功能

  • 进入页面开始播放
  • 离开页面暂停播放
  • 支持点击按钮切换播放状态

用户数据

用户数据内容

- 用户名
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"从0实现一个年度报告","description":"","frontmatter":{},"headers":[{"level":2,"title":"实现难点","slug":"实现难点","link":"#实现难点","children":[{"level":3,"title":"1. 数据模拟","slug":"_1-数据模拟","link":"#_1-数据模拟","children":[]},{"level":3,"title":"2. 屏幕适配","slug":"_2-屏幕适配","link":"#_2-屏幕适配","children":[]},{"level":3,"title":"3. 动画效果","slug":"_3-动画效果","link":"#_3-动画效果","children":[]},{"level":3,"title":"4. 音乐播放","slug":"_4-音乐播放","link":"#_4-音乐播放","children":[]}]},{"level":2,"title":"用户数据","slug":"用户数据","link":"#用户数据","children":[{"level":3,"title":"用户数据内容","slug":"用户数据内容","link":"#用户数据内容","children":[]},{"level":3,"title":"数据模拟","slug":"数据模拟","link":"#数据模拟","children":[]}]},{"level":2,"title":"编码中遇到的问题","slug":"编码中遇到的问题","link":"#编码中遇到的问题","children":[{"level":3,"title":"音乐自动播放的问题","slug":"音乐自动播放的问题","link":"#音乐自动播放的问题","children":[]},{"level":3,"title":"VNode调整样式的问题","slug":"vnode调整样式的问题","link":"#vnode调整样式的问题","children":[]},{"level":3,"title":"监听Animation结束事件并更新响应式变量","slug":"监听animation结束事件并更新响应式变量","link":"#监听animation结束事件并更新响应式变量","children":[]},{"level":3,"title":"切换页面支持触控滑动滚轮键盘","slug":"切换页面支持触控滑动滚轮键盘","link":"#切换页面支持触控滑动滚轮键盘","children":[]},{"level":3,"title":"代码打包","slug":"代码打包","link":"#代码打包","children":[]}]},{"level":2,"title":"技术介绍","slug":"技术介绍","link":"#技术介绍","children":[]},{"level":2,"title":"功能介绍","slug":"功能介绍","link":"#功能介绍","children":[]},{"level":2,"title":"Demo展示","slug":"demo展示","link":"#demo展示","children":[]}],"relativePath":"article/从0实现一个年度报告.md","lastUpdated":1675783866000}'),p={name:"article/从0实现一个年度报告.md"},o=l(`

从0实现一个年度报告

每到年底各大应用都会推出自己的年终总结报告,统计出用户一年来在应用内的行为展示给用户,供用户记录、分享。

今年掘金社区推出了自己的2022掘友年度报告,这次我们仿照这个报告,从0开始自己实现一个年终总结报告页面

实现难点

1. 数据模拟

一般情况下是根据用户UID,到后端去请求相关接口获得统计数据。

例如掘金的接口为https://api.juejin.cn/event_api/v1/annual/annual_summary?aid=xxxxxx

本次后端使用NodeJS实现了一个爬虫,可以将用户数据统计完成后导出JSON格式的数据,将此数据粘贴到前端页面的输入框即可生成自己的报告

2. 屏幕适配

可以观察到,在PC端和在手机端访问年度报告展示的效果是不一样的。

本次考虑使用媒体查询来实现这个功能:

  • 宽屏则展示背景,页面切换也使用背景中的上下切换按钮
  • 小屏则隐藏背景,让内容填满屏幕,页面切换通过滑动事件监听

3. 动画效果

动画分为文本与背景元素的动画

  • 背景元素的动画使用了SVG动画
    • 动画中不动的部分直接使用.png图片
    • 运动的部分使用SVG动画绘制,如克里克的眼睛、尾巴
  • 文本的动画使用了CSS Animation渐显的效果
    • 不同段落之间通过animation-delay属性,彼此相差1000ms

背景动画容器的四个位置:左上角 右下角 中间部分 中间(悬浮气泡)。不同位置的动画容器都采用绝对定位position: absolute;,辅以z-index实现层叠

囿于工期,本次的背景动画直接采用静态图片+CSS Animation实现上下浮动的效果

4. 音乐播放

通过Audio接口访问网络音乐链接,控制音乐相关功能

  • 进入页面开始播放
  • 离开页面暂停播放
  • 支持点击按钮切换播放状态

用户数据

用户数据内容

- 用户名
 - 注册时间 距今天数
 - 创作相关
     - 发布文章数
diff --git a/assets/article_从0实现一个年度报告.md.db25d26a.lean.js b/assets/article_从0实现一个年度报告.md.b23f5ee8.lean.js
similarity index 94%
rename from assets/article_从0实现一个年度报告.md.db25d26a.lean.js
rename to assets/article_从0实现一个年度报告.md.b23f5ee8.lean.js
index 31476fd2..20898ad2 100644
--- a/assets/article_从0实现一个年度报告.md.db25d26a.lean.js
+++ b/assets/article_从0实现一个年度报告.md.b23f5ee8.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"从0实现一个年度报告","description":"","frontmatter":{},"headers":[{"level":2,"title":"实现难点","slug":"实现难点","link":"#实现难点","children":[{"level":3,"title":"1. 数据模拟","slug":"_1-数据模拟","link":"#_1-数据模拟","children":[]},{"level":3,"title":"2. 屏幕适配","slug":"_2-屏幕适配","link":"#_2-屏幕适配","children":[]},{"level":3,"title":"3. 动画效果","slug":"_3-动画效果","link":"#_3-动画效果","children":[]},{"level":3,"title":"4. 音乐播放","slug":"_4-音乐播放","link":"#_4-音乐播放","children":[]}]},{"level":2,"title":"用户数据","slug":"用户数据","link":"#用户数据","children":[{"level":3,"title":"用户数据内容","slug":"用户数据内容","link":"#用户数据内容","children":[]},{"level":3,"title":"数据模拟","slug":"数据模拟","link":"#数据模拟","children":[]}]},{"level":2,"title":"编码中遇到的问题","slug":"编码中遇到的问题","link":"#编码中遇到的问题","children":[{"level":3,"title":"音乐自动播放的问题","slug":"音乐自动播放的问题","link":"#音乐自动播放的问题","children":[]},{"level":3,"title":"VNode调整样式的问题","slug":"vnode调整样式的问题","link":"#vnode调整样式的问题","children":[]},{"level":3,"title":"监听Animation结束事件并更新响应式变量","slug":"监听animation结束事件并更新响应式变量","link":"#监听animation结束事件并更新响应式变量","children":[]},{"level":3,"title":"切换页面支持触控滑动滚轮键盘","slug":"切换页面支持触控滑动滚轮键盘","link":"#切换页面支持触控滑动滚轮键盘","children":[]},{"level":3,"title":"代码打包","slug":"代码打包","link":"#代码打包","children":[]}]},{"level":2,"title":"技术介绍","slug":"技术介绍","link":"#技术介绍","children":[]},{"level":2,"title":"功能介绍","slug":"功能介绍","link":"#功能介绍","children":[]},{"level":2,"title":"Demo展示","slug":"demo展示","link":"#demo展示","children":[]}],"relativePath":"article/从0实现一个年度报告.md","lastUpdated":1675780846000}'),p={name:"article/从0实现一个年度报告.md"},o=l("",59),e=[o];function t(c,r,F,D,y,i){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{u as __pageData,d as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"从0实现一个年度报告","description":"","frontmatter":{},"headers":[{"level":2,"title":"实现难点","slug":"实现难点","link":"#实现难点","children":[{"level":3,"title":"1. 数据模拟","slug":"_1-数据模拟","link":"#_1-数据模拟","children":[]},{"level":3,"title":"2. 屏幕适配","slug":"_2-屏幕适配","link":"#_2-屏幕适配","children":[]},{"level":3,"title":"3. 动画效果","slug":"_3-动画效果","link":"#_3-动画效果","children":[]},{"level":3,"title":"4. 音乐播放","slug":"_4-音乐播放","link":"#_4-音乐播放","children":[]}]},{"level":2,"title":"用户数据","slug":"用户数据","link":"#用户数据","children":[{"level":3,"title":"用户数据内容","slug":"用户数据内容","link":"#用户数据内容","children":[]},{"level":3,"title":"数据模拟","slug":"数据模拟","link":"#数据模拟","children":[]}]},{"level":2,"title":"编码中遇到的问题","slug":"编码中遇到的问题","link":"#编码中遇到的问题","children":[{"level":3,"title":"音乐自动播放的问题","slug":"音乐自动播放的问题","link":"#音乐自动播放的问题","children":[]},{"level":3,"title":"VNode调整样式的问题","slug":"vnode调整样式的问题","link":"#vnode调整样式的问题","children":[]},{"level":3,"title":"监听Animation结束事件并更新响应式变量","slug":"监听animation结束事件并更新响应式变量","link":"#监听animation结束事件并更新响应式变量","children":[]},{"level":3,"title":"切换页面支持触控滑动滚轮键盘","slug":"切换页面支持触控滑动滚轮键盘","link":"#切换页面支持触控滑动滚轮键盘","children":[]},{"level":3,"title":"代码打包","slug":"代码打包","link":"#代码打包","children":[]}]},{"level":2,"title":"技术介绍","slug":"技术介绍","link":"#技术介绍","children":[]},{"level":2,"title":"功能介绍","slug":"功能介绍","link":"#功能介绍","children":[]},{"level":2,"title":"Demo展示","slug":"demo展示","link":"#demo展示","children":[]}],"relativePath":"article/从0实现一个年度报告.md","lastUpdated":1675783866000}'),p={name:"article/从0实现一个年度报告.md"},o=l("",59),e=[o];function t(c,r,F,D,y,i){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{u as __pageData,d as default};
diff --git a/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.20b39f0a.js b/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.9cda00db.js
similarity index 99%
rename from assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.20b39f0a.js
rename to assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.9cda00db.js
index f4cbd4b5..2f16dbcb 100644
--- a/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.20b39f0a.js
+++ b/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.9cda00db.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const C=JSON.parse('{"title":"彻底搞懂对象的数据属性描述符、存储属性描述符","description":"","frontmatter":{},"headers":[{"level":2,"title":"属性描述符","slug":"属性描述符","link":"#属性描述符","children":[{"level":3,"title":"数据属性描述符","slug":"数据属性描述符","link":"#数据属性描述符","children":[]},{"level":3,"title":"存储属性描述符","slug":"存储属性描述符","link":"#存储属性描述符","children":[]},{"level":3,"title":"应用场景","slug":"应用场景","link":"#应用场景","children":[]}]}],"relativePath":"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md","lastUpdated":1675780846000}'),p={name:"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md"},o=l(`

彻底搞懂对象的数据属性描述符、存储属性描述符

属性描述符

js
  let obj = {
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const C=JSON.parse('{"title":"彻底搞懂对象的数据属性描述符、存储属性描述符","description":"","frontmatter":{},"headers":[{"level":2,"title":"属性描述符","slug":"属性描述符","link":"#属性描述符","children":[{"level":3,"title":"数据属性描述符","slug":"数据属性描述符","link":"#数据属性描述符","children":[]},{"level":3,"title":"存储属性描述符","slug":"存储属性描述符","link":"#存储属性描述符","children":[]},{"level":3,"title":"应用场景","slug":"应用场景","link":"#应用场景","children":[]}]}],"relativePath":"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md","lastUpdated":1675783866000}'),p={name:"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md"},o=l(`

彻底搞懂对象的数据属性描述符、存储属性描述符

属性描述符

js
  let obj = {
     name: "ziu",
     age: 18
   }
diff --git a/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.20b39f0a.lean.js b/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.9cda00db.lean.js
similarity index 87%
rename from assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.20b39f0a.lean.js
rename to assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.9cda00db.lean.js
index 95039682..97aac391 100644
--- a/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.20b39f0a.lean.js
+++ b/assets/article_彻底搞懂对象的数据属性描述符、存储属性描述符.md.9cda00db.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const C=JSON.parse('{"title":"彻底搞懂对象的数据属性描述符、存储属性描述符","description":"","frontmatter":{},"headers":[{"level":2,"title":"属性描述符","slug":"属性描述符","link":"#属性描述符","children":[{"level":3,"title":"数据属性描述符","slug":"数据属性描述符","link":"#数据属性描述符","children":[]},{"level":3,"title":"存储属性描述符","slug":"存储属性描述符","link":"#存储属性描述符","children":[]},{"level":3,"title":"应用场景","slug":"应用场景","link":"#应用场景","children":[]}]}],"relativePath":"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md","lastUpdated":1675780846000}'),p={name:"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md"},o=l("",18),e=[o];function c(t,r,D,y,F,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{C as __pageData,d as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const C=JSON.parse('{"title":"彻底搞懂对象的数据属性描述符、存储属性描述符","description":"","frontmatter":{},"headers":[{"level":2,"title":"属性描述符","slug":"属性描述符","link":"#属性描述符","children":[{"level":3,"title":"数据属性描述符","slug":"数据属性描述符","link":"#数据属性描述符","children":[]},{"level":3,"title":"存储属性描述符","slug":"存储属性描述符","link":"#存储属性描述符","children":[]},{"level":3,"title":"应用场景","slug":"应用场景","link":"#应用场景","children":[]}]}],"relativePath":"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md","lastUpdated":1675783866000}'),p={name:"article/彻底搞懂对象的数据属性描述符、存储属性描述符.md"},o=l("",18),e=[o];function c(t,r,D,y,F,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{C as __pageData,d as default};
diff --git a/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.21fec897.js b/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.e5df2d33.js
similarity index 99%
rename from assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.21fec897.js
rename to assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.e5df2d33.js
index dc36849e..1ebac186 100644
--- a/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.21fec897.js
+++ b/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.e5df2d33.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"深入Vue3源码,看看Vue.use后究竟发生了什么?","description":"","frontmatter":{},"headers":[{"level":2,"title":"从全局注册组件库入手","slug":"从全局注册组件库入手","link":"#从全局注册组件库入手","children":[]},{"level":2,"title":"深入源码","slug":"深入源码","link":"#深入源码","children":[]},{"level":2,"title":"手动引入&注册组件","slug":"手动引入-注册组件","link":"#手动引入-注册组件","children":[]},{"level":2,"title":"参考阅读","slug":"参考阅读","link":"#参考阅读","children":[]}],"relativePath":"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md","lastUpdated":1675780846000}'),p={name:"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md"},e=l(`

深入Vue3源码,看看Vue.use后究竟发生了什么?

从全局注册组件库入手

如果我们自定义了几个自定义组件,当我们想在.vue文件中使用它们时,需要手动import导入组件并在component中注册:

html
<script>
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"深入Vue3源码,看看Vue.use后究竟发生了什么?","description":"","frontmatter":{},"headers":[{"level":2,"title":"从全局注册组件库入手","slug":"从全局注册组件库入手","link":"#从全局注册组件库入手","children":[]},{"level":2,"title":"深入源码","slug":"深入源码","link":"#深入源码","children":[]},{"level":2,"title":"手动引入&注册组件","slug":"手动引入-注册组件","link":"#手动引入-注册组件","children":[]},{"level":2,"title":"参考阅读","slug":"参考阅读","link":"#参考阅读","children":[]}],"relativePath":"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md","lastUpdated":1675783866000}'),p={name:"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md"},e=l(`

深入Vue3源码,看看Vue.use后究竟发生了什么?

从全局注册组件库入手

如果我们自定义了几个自定义组件,当我们想在.vue文件中使用它们时,需要手动import导入组件并在component中注册:

html
<script>
 import CustomInput from '@/component/CustomInput.vue'
 
 export default {
diff --git a/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.21fec897.lean.js b/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.e5df2d33.lean.js
similarity index 87%
rename from assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.21fec897.lean.js
rename to assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.e5df2d33.lean.js
index d9583de7..50cf8a51 100644
--- a/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.21fec897.lean.js
+++ b/assets/article_深入Vue3源码,看看Vue.use后究竟发生了什么?.md.e5df2d33.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const u=JSON.parse('{"title":"深入Vue3源码,看看Vue.use后究竟发生了什么?","description":"","frontmatter":{},"headers":[{"level":2,"title":"从全局注册组件库入手","slug":"从全局注册组件库入手","link":"#从全局注册组件库入手","children":[]},{"level":2,"title":"深入源码","slug":"深入源码","link":"#深入源码","children":[]},{"level":2,"title":"手动引入&注册组件","slug":"手动引入-注册组件","link":"#手动引入-注册组件","children":[]},{"level":2,"title":"参考阅读","slug":"参考阅读","link":"#参考阅读","children":[]}],"relativePath":"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md","lastUpdated":1675780846000}'),p={name:"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md"},e=l("",26),o=[e];function t(c,r,i,y,F,D){return n(),a("div",null,o)}const C=s(p,[["render",t]]);export{u as __pageData,C as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const u=JSON.parse('{"title":"深入Vue3源码,看看Vue.use后究竟发生了什么?","description":"","frontmatter":{},"headers":[{"level":2,"title":"从全局注册组件库入手","slug":"从全局注册组件库入手","link":"#从全局注册组件库入手","children":[]},{"level":2,"title":"深入源码","slug":"深入源码","link":"#深入源码","children":[]},{"level":2,"title":"手动引入&注册组件","slug":"手动引入-注册组件","link":"#手动引入-注册组件","children":[]},{"level":2,"title":"参考阅读","slug":"参考阅读","link":"#参考阅读","children":[]}],"relativePath":"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md","lastUpdated":1675783866000}'),p={name:"article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md"},e=l("",26),o=[e];function t(c,r,i,y,F,D){return n(),a("div",null,o)}const C=s(p,[["render",t]]);export{u as __pageData,C as default};
diff --git a/assets/article_深入理解Proxy与Reflect.md.b8fd25c3.js b/assets/article_深入理解Proxy与Reflect.md.e5d90d5d.js
similarity index 99%
rename from assets/article_深入理解Proxy与Reflect.md.b8fd25c3.js
rename to assets/article_深入理解Proxy与Reflect.md.e5d90d5d.js
index 08d7318d..ec6ddcac 100644
--- a/assets/article_深入理解Proxy与Reflect.md.b8fd25c3.js
+++ b/assets/article_深入理解Proxy与Reflect.md.e5d90d5d.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const i=JSON.parse('{"title":"深入理解Proxy与Reflect","description":"","frontmatter":{},"headers":[{"level":3,"title":"监听对象的操作","slug":"监听对象的操作","link":"#监听对象的操作","children":[]},{"level":3,"title":"Proxy类基本使用","slug":"proxy类基本使用","link":"#proxy类基本使用","children":[]},{"level":3,"title":"捕获器","slug":"捕获器","link":"#捕获器","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"与Object的区别","slug":"与object的区别","link":"#与object的区别","children":[]},{"level":3,"title":"Reflect常见方法","slug":"reflect常见方法","link":"#reflect常见方法","children":[]},{"level":3,"title":"Reflect.construct方法","slug":"reflect-construct方法","link":"#reflect-construct方法","children":[]}],"relativePath":"article/深入理解Proxy与Reflect.md","lastUpdated":1675780846000}'),p={name:"article/深入理解Proxy与Reflect.md"},o=l(`

深入理解Proxy与Reflect

监听对象的操作

可以使用Proxy对象将原对象包裹,此后的操作都对proxy进行,每次getset被触发时都会自动执行相应代码

js
const obj = {
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const i=JSON.parse('{"title":"深入理解Proxy与Reflect","description":"","frontmatter":{},"headers":[{"level":3,"title":"监听对象的操作","slug":"监听对象的操作","link":"#监听对象的操作","children":[]},{"level":3,"title":"Proxy类基本使用","slug":"proxy类基本使用","link":"#proxy类基本使用","children":[]},{"level":3,"title":"捕获器","slug":"捕获器","link":"#捕获器","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"与Object的区别","slug":"与object的区别","link":"#与object的区别","children":[]},{"level":3,"title":"Reflect常见方法","slug":"reflect常见方法","link":"#reflect常见方法","children":[]},{"level":3,"title":"Reflect.construct方法","slug":"reflect-construct方法","link":"#reflect-construct方法","children":[]}],"relativePath":"article/深入理解Proxy与Reflect.md","lastUpdated":1675783866000}'),p={name:"article/深入理解Proxy与Reflect.md"},o=l(`

深入理解Proxy与Reflect

监听对象的操作

可以使用Proxy对象将原对象包裹,此后的操作都对proxy进行,每次getset被触发时都会自动执行相应代码

js
const obj = {
   name: 'ziu',
   age: 18,
   height: 1.88
diff --git a/assets/article_深入理解Proxy与Reflect.md.b8fd25c3.lean.js b/assets/article_深入理解Proxy与Reflect.md.e5d90d5d.lean.js
similarity index 89%
rename from assets/article_深入理解Proxy与Reflect.md.b8fd25c3.lean.js
rename to assets/article_深入理解Proxy与Reflect.md.e5d90d5d.lean.js
index 68530dfe..37d0e376 100644
--- a/assets/article_深入理解Proxy与Reflect.md.b8fd25c3.lean.js
+++ b/assets/article_深入理解Proxy与Reflect.md.e5d90d5d.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const i=JSON.parse('{"title":"深入理解Proxy与Reflect","description":"","frontmatter":{},"headers":[{"level":3,"title":"监听对象的操作","slug":"监听对象的操作","link":"#监听对象的操作","children":[]},{"level":3,"title":"Proxy类基本使用","slug":"proxy类基本使用","link":"#proxy类基本使用","children":[]},{"level":3,"title":"捕获器","slug":"捕获器","link":"#捕获器","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"与Object的区别","slug":"与object的区别","link":"#与object的区别","children":[]},{"level":3,"title":"Reflect常见方法","slug":"reflect常见方法","link":"#reflect常见方法","children":[]},{"level":3,"title":"Reflect.construct方法","slug":"reflect-construct方法","link":"#reflect-construct方法","children":[]}],"relativePath":"article/深入理解Proxy与Reflect.md","lastUpdated":1675780846000}'),p={name:"article/深入理解Proxy与Reflect.md"},o=l("",44),e=[o];function c(t,r,y,D,F,A){return n(),a("div",null,e)}const b=s(p,[["render",c]]);export{i as __pageData,b as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const i=JSON.parse('{"title":"深入理解Proxy与Reflect","description":"","frontmatter":{},"headers":[{"level":3,"title":"监听对象的操作","slug":"监听对象的操作","link":"#监听对象的操作","children":[]},{"level":3,"title":"Proxy类基本使用","slug":"proxy类基本使用","link":"#proxy类基本使用","children":[]},{"level":3,"title":"捕获器","slug":"捕获器","link":"#捕获器","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"与Object的区别","slug":"与object的区别","link":"#与object的区别","children":[]},{"level":3,"title":"Reflect常见方法","slug":"reflect常见方法","link":"#reflect常见方法","children":[]},{"level":3,"title":"Reflect.construct方法","slug":"reflect-construct方法","link":"#reflect-construct方法","children":[]}],"relativePath":"article/深入理解Proxy与Reflect.md","lastUpdated":1675783866000}'),p={name:"article/深入理解Proxy与Reflect.md"},o=l("",44),e=[o];function c(t,r,y,D,F,A){return n(),a("div",null,e)}const b=s(p,[["render",c]]);export{i as __pageData,b as default};
diff --git a/assets/article_深入理解浏览器缓存机制.md.f2ead021.js b/assets/article_深入理解浏览器缓存机制.md.8bbc1a24.js
similarity index 99%
rename from assets/article_深入理解浏览器缓存机制.md.f2ead021.js
rename to assets/article_深入理解浏览器缓存机制.md.8bbc1a24.js
index a68bd342..480ba523 100644
--- a/assets/article_深入理解浏览器缓存机制.md.f2ead021.js
+++ b/assets/article_深入理解浏览器缓存机制.md.8bbc1a24.js
@@ -1,4 +1,4 @@
-import{_ as e,o as a,c as s,a as l}from"./app.a81d7d4f.js";const f=JSON.parse('{"title":"深入理解浏览器缓存机制","description":"","frontmatter":{},"headers":[{"level":2,"title":"强制缓存","slug":"强制缓存","link":"#强制缓存","children":[{"level":3,"title":"什么是强制缓存","slug":"什么是强制缓存","link":"#什么是强制缓存","children":[]},{"level":3,"title":"强制缓存的规则","slug":"强制缓存的规则","link":"#强制缓存的规则","children":[]},{"level":3,"title":"Expires与Cache-Control","slug":"expires与cache-control","link":"#expires与cache-control","children":[]}]},{"level":2,"title":"协商缓存","slug":"协商缓存","link":"#协商缓存","children":[{"level":3,"title":"协商缓存的规则","slug":"协商缓存的规则","link":"#协商缓存的规则","children":[]}]},{"level":2,"title":"内存缓存与硬盘缓存","slug":"内存缓存与硬盘缓存","link":"#内存缓存与硬盘缓存","children":[]},{"level":2,"title":"用户对浏览器缓存的控制","slug":"用户对浏览器缓存的控制","link":"#用户对浏览器缓存的控制","children":[]},{"level":2,"title":"参考资料","slug":"参考资料","link":"#参考资料","children":[]}],"relativePath":"article/深入理解浏览器缓存机制.md","lastUpdated":1675780846000}'),n={name:"article/深入理解浏览器缓存机制.md"},o=l(`

深入理解浏览器缓存机制

浏览器有两种缓存规则:强制缓存与协商缓存

  1. 强制缓存:不会向服务器发送请求,直接从缓存中读取资源
  2. 协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源
  • 共同点:都是从客户端缓存中读取资源
  • 不同点:强制缓存不会发请求,协商缓存会发请求

强制缓存

什么是强制缓存

浏览器在服务器发起真正请求前,先检查浏览器缓存:

  • 如果命中缓存,且缓存未过期,那么直接使用缓存资源
  • 如果未命中缓存,或缓存已过期失效,那么向服务器发出请求

强制缓存的规则

服务器通过向响应头添加ExpiresCache-Control字段来标识强制缓存的状态,浏览器会将这两个信息缓存到本地,后续有相同请求时,优先到浏览器缓存中检查资源是否到期。

其中Cache-Control优先级比Expires高,即:二者同时存在时,浏览器以Cache-Control为标准,检查缓存资源是否过期

Expires与Cache-Control

Expires

Expires表示当前资源的失效时间,它的值是一个HTTP-日期时间戳,例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT

使用Expires存在一些弊端:

  • 代表的是绝对时间,如果浏览器和服务器的时间不同步,会导致缓存目标时间存在偏差
  • 如果服务端设置的日期格式不规范,那么等同于无缓存
  • ExpiresHTTP/1.0的字段,但是现在浏览器默认使用的是HTTP/1.1

在某些不支持HTTP1.1的环境下,Expires就会发挥用处

所以Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法

Cache-Control

如果在Cache-Control响应头设置了"max-age"或者"s-max-age"指令,那么Expires头会被忽略

设置Cache-Control的值有以下规则:

  • 不区分大小写,但建议使用小写
  • 多个指令以逗号分隔
  • 具有可选参数,可以用令牌或者带引号的字符串语法

常用的指令:

  • public:所有内容都将被缓存,即使是通常不可缓存的内容(如POST请求)。
  • private:所有内容只有客户端可以缓存,不能作为共享缓存(即代理服务器不能缓存它),这也是Cache-Control的默认取值
  • no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
  • no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存,即不使用任何缓存。
  • max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

举几个例子:

此次请求之后的600秒内,如果浏览器再次发起请求,那么直接使用缓存中的资源:

Cache-Control: max-age=600
+import{_ as e,o as a,c as s,a as l}from"./app.94d5b31a.js";const f=JSON.parse('{"title":"深入理解浏览器缓存机制","description":"","frontmatter":{},"headers":[{"level":2,"title":"强制缓存","slug":"强制缓存","link":"#强制缓存","children":[{"level":3,"title":"什么是强制缓存","slug":"什么是强制缓存","link":"#什么是强制缓存","children":[]},{"level":3,"title":"强制缓存的规则","slug":"强制缓存的规则","link":"#强制缓存的规则","children":[]},{"level":3,"title":"Expires与Cache-Control","slug":"expires与cache-control","link":"#expires与cache-control","children":[]}]},{"level":2,"title":"协商缓存","slug":"协商缓存","link":"#协商缓存","children":[{"level":3,"title":"协商缓存的规则","slug":"协商缓存的规则","link":"#协商缓存的规则","children":[]}]},{"level":2,"title":"内存缓存与硬盘缓存","slug":"内存缓存与硬盘缓存","link":"#内存缓存与硬盘缓存","children":[]},{"level":2,"title":"用户对浏览器缓存的控制","slug":"用户对浏览器缓存的控制","link":"#用户对浏览器缓存的控制","children":[]},{"level":2,"title":"参考资料","slug":"参考资料","link":"#参考资料","children":[]}],"relativePath":"article/深入理解浏览器缓存机制.md","lastUpdated":1675783866000}'),n={name:"article/深入理解浏览器缓存机制.md"},o=l(`

深入理解浏览器缓存机制

浏览器有两种缓存规则:强制缓存与协商缓存

  1. 强制缓存:不会向服务器发送请求,直接从缓存中读取资源
  2. 协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源
  • 共同点:都是从客户端缓存中读取资源
  • 不同点:强制缓存不会发请求,协商缓存会发请求

强制缓存

什么是强制缓存

浏览器在服务器发起真正请求前,先检查浏览器缓存:

  • 如果命中缓存,且缓存未过期,那么直接使用缓存资源
  • 如果未命中缓存,或缓存已过期失效,那么向服务器发出请求

强制缓存的规则

服务器通过向响应头添加ExpiresCache-Control字段来标识强制缓存的状态,浏览器会将这两个信息缓存到本地,后续有相同请求时,优先到浏览器缓存中检查资源是否到期。

其中Cache-Control优先级比Expires高,即:二者同时存在时,浏览器以Cache-Control为标准,检查缓存资源是否过期

Expires与Cache-Control

Expires

Expires表示当前资源的失效时间,它的值是一个HTTP-日期时间戳,例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT

使用Expires存在一些弊端:

  • 代表的是绝对时间,如果浏览器和服务器的时间不同步,会导致缓存目标时间存在偏差
  • 如果服务端设置的日期格式不规范,那么等同于无缓存
  • ExpiresHTTP/1.0的字段,但是现在浏览器默认使用的是HTTP/1.1

在某些不支持HTTP1.1的环境下,Expires就会发挥用处

所以Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法

Cache-Control

如果在Cache-Control响应头设置了"max-age"或者"s-max-age"指令,那么Expires头会被忽略

设置Cache-Control的值有以下规则:

  • 不区分大小写,但建议使用小写
  • 多个指令以逗号分隔
  • 具有可选参数,可以用令牌或者带引号的字符串语法

常用的指令:

  • public:所有内容都将被缓存,即使是通常不可缓存的内容(如POST请求)。
  • private:所有内容只有客户端可以缓存,不能作为共享缓存(即代理服务器不能缓存它),这也是Cache-Control的默认取值
  • no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
  • no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存,即不使用任何缓存。
  • max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

举几个例子:

此次请求之后的600秒内,如果浏览器再次发起请求,那么直接使用缓存中的资源:

Cache-Control: max-age=600
 

浏览器可以缓存资源,但每次使用缓存资源前都必须重新验证其有效性:

Cache-Control: no-cache
 
Cache-Control: max-age=0, must-revalidate
 

这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载

协商缓存

当浏览器检查本地的强制缓存已经失效后,浏览器携带该资源的协商缓存标识向服务器发起请求,由服务器根据缓存标识决定是否继续使用本地缓存。

  • 协商缓存生效,服务器返回304,通知浏览器继续使用本地缓存
  • 协商缓存失效,服务器返回200,与最新的请求资源

协商缓存的规则

服务器与浏览器通过两两成对的请求头来控制协商缓存:

  • Etag If-None-Match
  • Last-Modified If-Modified-Since

其中,EtagLast-Modified是由服务器设置的响应头的字段,If-None-MatchIf-Modified-Since则是浏览器向服务器发送的请求头的字段

Etag与Last-Modified

Etag是上一次加载资源时,服务器返回的ResponseHeader,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到RequestHeader里的If-None-Match里,服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值做比较,如果相同,则表示资源文件没有发生改变,命中协商缓存。

  • Etag由服务器生成,标志当前资源的唯一标识,一般包含大小、修改时间等信息
  • If-None-Match浏览器缓存到本地的Etag

HTTP协议并未规定Etag的内容是如何生成的,但一般包含大小、修改时间等信息

Node.js下生成Etag的示例:

js
// 根据文件的fs.Stats信息计算出etag
diff --git a/assets/article_深入理解浏览器缓存机制.md.f2ead021.lean.js b/assets/article_深入理解浏览器缓存机制.md.8bbc1a24.lean.js
similarity index 91%
rename from assets/article_深入理解浏览器缓存机制.md.f2ead021.lean.js
rename to assets/article_深入理解浏览器缓存机制.md.8bbc1a24.lean.js
index 624c3e37..fd16786c 100644
--- a/assets/article_深入理解浏览器缓存机制.md.f2ead021.lean.js
+++ b/assets/article_深入理解浏览器缓存机制.md.8bbc1a24.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as s,a as l}from"./app.a81d7d4f.js";const f=JSON.parse('{"title":"深入理解浏览器缓存机制","description":"","frontmatter":{},"headers":[{"level":2,"title":"强制缓存","slug":"强制缓存","link":"#强制缓存","children":[{"level":3,"title":"什么是强制缓存","slug":"什么是强制缓存","link":"#什么是强制缓存","children":[]},{"level":3,"title":"强制缓存的规则","slug":"强制缓存的规则","link":"#强制缓存的规则","children":[]},{"level":3,"title":"Expires与Cache-Control","slug":"expires与cache-control","link":"#expires与cache-control","children":[]}]},{"level":2,"title":"协商缓存","slug":"协商缓存","link":"#协商缓存","children":[{"level":3,"title":"协商缓存的规则","slug":"协商缓存的规则","link":"#协商缓存的规则","children":[]}]},{"level":2,"title":"内存缓存与硬盘缓存","slug":"内存缓存与硬盘缓存","link":"#内存缓存与硬盘缓存","children":[]},{"level":2,"title":"用户对浏览器缓存的控制","slug":"用户对浏览器缓存的控制","link":"#用户对浏览器缓存的控制","children":[]},{"level":2,"title":"参考资料","slug":"参考资料","link":"#参考资料","children":[]}],"relativePath":"article/深入理解浏览器缓存机制.md","lastUpdated":1675780846000}'),n={name:"article/深入理解浏览器缓存机制.md"},o=l("",66),c=[o];function i(r,p,t,d,h,u){return a(),s("div",null,c)}const b=e(n,[["render",i]]);export{f as __pageData,b as default};
+import{_ as e,o as a,c as s,a as l}from"./app.94d5b31a.js";const f=JSON.parse('{"title":"深入理解浏览器缓存机制","description":"","frontmatter":{},"headers":[{"level":2,"title":"强制缓存","slug":"强制缓存","link":"#强制缓存","children":[{"level":3,"title":"什么是强制缓存","slug":"什么是强制缓存","link":"#什么是强制缓存","children":[]},{"level":3,"title":"强制缓存的规则","slug":"强制缓存的规则","link":"#强制缓存的规则","children":[]},{"level":3,"title":"Expires与Cache-Control","slug":"expires与cache-control","link":"#expires与cache-control","children":[]}]},{"level":2,"title":"协商缓存","slug":"协商缓存","link":"#协商缓存","children":[{"level":3,"title":"协商缓存的规则","slug":"协商缓存的规则","link":"#协商缓存的规则","children":[]}]},{"level":2,"title":"内存缓存与硬盘缓存","slug":"内存缓存与硬盘缓存","link":"#内存缓存与硬盘缓存","children":[]},{"level":2,"title":"用户对浏览器缓存的控制","slug":"用户对浏览器缓存的控制","link":"#用户对浏览器缓存的控制","children":[]},{"level":2,"title":"参考资料","slug":"参考资料","link":"#参考资料","children":[]}],"relativePath":"article/深入理解浏览器缓存机制.md","lastUpdated":1675783866000}'),n={name:"article/深入理解浏览器缓存机制.md"},o=l("",66),c=[o];function i(r,p,t,d,h,u){return a(),s("div",null,c)}const b=e(n,[["render",i]]);export{f as __pageData,b as default};
diff --git a/assets/article_深入理解浏览器运行原理.md.7e80be4c.js b/assets/article_深入理解浏览器运行原理.md.dac12750.js
similarity index 99%
rename from assets/article_深入理解浏览器运行原理.md.7e80be4c.js
rename to assets/article_深入理解浏览器运行原理.md.dac12750.js
index 0a96b161..e02614eb 100644
--- a/assets/article_深入理解浏览器运行原理.md.7e80be4c.js
+++ b/assets/article_深入理解浏览器运行原理.md.dac12750.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as e}from"./app.a81d7d4f.js";const m=JSON.parse('{"title":"深入理解浏览器运行原理","description":"","frontmatter":{},"headers":[{"level":2,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":2,"title":"HTML解析过程","slug":"html解析过程","link":"#html解析过程","children":[]},{"level":2,"title":"生成CSS规则","slug":"生成css规则","link":"#生成css规则","children":[]},{"level":2,"title":"构建Render Tree","slug":"构建render-tree","link":"#构建render-tree","children":[]},{"level":2,"title":"布局和绘制(Layout & Paint)","slug":"布局和绘制-layout-paint","link":"#布局和绘制-layout-paint","children":[]},{"level":2,"title":"回流和重绘(Reflow & )","slug":"回流和重绘-reflow","link":"#回流和重绘-reflow","children":[]},{"level":2,"title":"特殊解析: composite合成","slug":"特殊解析-composite合成","link":"#特殊解析-composite合成","children":[{"level":3,"title":"案例1:同一层渲染","slug":"案例1-同一层渲染","link":"#案例1-同一层渲染","children":[]},{"level":3,"title":"案例2:分层渲染","slug":"案例2-分层渲染","link":"#案例2-分层渲染","children":[]},{"level":3,"title":"案例3:transform 3D","slug":"案例3-transform-3d","link":"#案例3-transform-3d","children":[]},{"level":3,"title":"案例4:transition+transform","slug":"案例4-transition-transform","link":"#案例4-transition-transform","children":[]},{"level":3,"title":"案例5:transition+opacity","slug":"案例5-transition-opacity","link":"#案例5-transition-opacity","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}]},{"level":2,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]},{"level":2,"title":"defer属性","slug":"defer属性","link":"#defer属性","children":[]},{"level":2,"title":"async属性","slug":"async属性","link":"#async属性","children":[]}],"relativePath":"article/深入理解浏览器运行原理.md","lastUpdated":1675780846000}'),l={name:"article/深入理解浏览器运行原理.md"},p=e(`

深入理解浏览器运行原理

网页解析过程

输入域名 => DNS解析为IP => 目标服务器返回index.html

DNS:Domain Name System

HTML解析过程

  • 浏览器开始解析index.html文件,当遇到<link>则向服务器请求下载.css文件
  • 遇到<script>标签则向服务器请求下载.js文件
浏览器解析HTML过程浏览器是和如何工作的

How browsers work

生成CSS规则

在解析的过程中,如果遇到<link>元素,那么会由浏览器负责下载对应的CSS文件

  • 注意:下载CSS文件不会影响到DOM解析
  • 有单独一个线程对CSS文件进行下载与解析

浏览器下载完CSS文件后,就会对CSS文件进行解析,解析出对应的规则树:

  • 我们可以称之为CSSOM(CSS Object Model,CSS对象模型)

构建Render Tree

有了DOM Tree和CSSOM Tree之后,就可以将二者结合,构建Render Tree了

此时,如果有某些元素的CSS属性display: none;那么这个元素就不会出现在Render Tree中

  • 下载和解析CSS文件时,不会阻塞DOM Tree的构建过程
  • 但会阻塞Render Tree的构建过程:因为需要对应的CSSOM Tree

布局和绘制(Layout & Paint)

第四步是在渲染树(Render Tree)上运行布局(Layout),以计算每个节点的几何体

  • 渲染树会表示显示哪些节点以及其他的样式,但是不表示每个节点的尺寸、位置等信息
  • 布局是确定呈现树中所有节点的宽度、高度和位置信息

第五步是将每个节点绘制(Paint)到屏幕上

  • 在绘制阶段,浏览器布局阶段计算的每个frame转为屏幕上实际的像素点
  • 包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素

回流和重绘(Reflow & )

回流也可称为重排

理解回流(Reflow):

  • 第一次确定节点的大小和位置,称之为布局(layout)
  • 之后对节点的大小、位置修改重新计算,称之为回流

什么情况下会引起回流?

  • DOM 结构发生改变(添加新的节点或者移除节点)
  • 改变了布局(修改了width height padding font-size等值)
  • 窗口resize(修改了窗口的尺寸等)
  • 调用getComputedStyle方法获取尺寸、位置信息

理解重绘(Repaint):

  • 第一次渲染内容称之为绘制(paint)
  • 之后的重新渲染称之为重绘

什么情况下会引起重绘?

  • 修改背景色、文字颜色、边框颜色、样式等

回流一定会引起重绘,所以回流是一件很消耗性能的事情

  • 开发中要尽量避免发生回流

  • 修改样式尽量一次性修改完毕

    • 例如通过cssText一次性设置样式,或通过修改class的方式修改样式
  • 尽量避免频繁的操作DOM

    • 可以在一个DocumentFragment或者父元素中,将要操作的DOM操作完成,再一次性插入到DOM树中
  • 尽量避免通过getComputedStyle获取元素尺寸、位置等信息

  • 对某些元素使用position的absolute或fixed属性

    • 并不是不会引起回流,而是开销相对较小,不会对其他元素产生影响

特殊解析: composite合成

在绘制的过程中,可以将布局后的元素绘制到多个合成图层中

  • 这是浏览器的一种优化手段
  • 将不同流生成的不同Layer进行合并
标准流 => LayouTree => RenderLayer
+import{_ as s,o as n,c as a,a as e}from"./app.94d5b31a.js";const m=JSON.parse('{"title":"深入理解浏览器运行原理","description":"","frontmatter":{},"headers":[{"level":2,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":2,"title":"HTML解析过程","slug":"html解析过程","link":"#html解析过程","children":[]},{"level":2,"title":"生成CSS规则","slug":"生成css规则","link":"#生成css规则","children":[]},{"level":2,"title":"构建Render Tree","slug":"构建render-tree","link":"#构建render-tree","children":[]},{"level":2,"title":"布局和绘制(Layout & Paint)","slug":"布局和绘制-layout-paint","link":"#布局和绘制-layout-paint","children":[]},{"level":2,"title":"回流和重绘(Reflow & )","slug":"回流和重绘-reflow","link":"#回流和重绘-reflow","children":[]},{"level":2,"title":"特殊解析: composite合成","slug":"特殊解析-composite合成","link":"#特殊解析-composite合成","children":[{"level":3,"title":"案例1:同一层渲染","slug":"案例1-同一层渲染","link":"#案例1-同一层渲染","children":[]},{"level":3,"title":"案例2:分层渲染","slug":"案例2-分层渲染","link":"#案例2-分层渲染","children":[]},{"level":3,"title":"案例3:transform 3D","slug":"案例3-transform-3d","link":"#案例3-transform-3d","children":[]},{"level":3,"title":"案例4:transition+transform","slug":"案例4-transition-transform","link":"#案例4-transition-transform","children":[]},{"level":3,"title":"案例5:transition+opacity","slug":"案例5-transition-opacity","link":"#案例5-transition-opacity","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}]},{"level":2,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]},{"level":2,"title":"defer属性","slug":"defer属性","link":"#defer属性","children":[]},{"level":2,"title":"async属性","slug":"async属性","link":"#async属性","children":[]}],"relativePath":"article/深入理解浏览器运行原理.md","lastUpdated":1675783866000}'),l={name:"article/深入理解浏览器运行原理.md"},p=e(`

深入理解浏览器运行原理

网页解析过程

输入域名 => DNS解析为IP => 目标服务器返回index.html

DNS:Domain Name System

HTML解析过程

  • 浏览器开始解析index.html文件,当遇到<link>则向服务器请求下载.css文件
  • 遇到<script>标签则向服务器请求下载.js文件
浏览器解析HTML过程浏览器是和如何工作的

How browsers work

生成CSS规则

在解析的过程中,如果遇到<link>元素,那么会由浏览器负责下载对应的CSS文件

  • 注意:下载CSS文件不会影响到DOM解析
  • 有单独一个线程对CSS文件进行下载与解析

浏览器下载完CSS文件后,就会对CSS文件进行解析,解析出对应的规则树:

  • 我们可以称之为CSSOM(CSS Object Model,CSS对象模型)

构建Render Tree

有了DOM Tree和CSSOM Tree之后,就可以将二者结合,构建Render Tree了

此时,如果有某些元素的CSS属性display: none;那么这个元素就不会出现在Render Tree中

  • 下载和解析CSS文件时,不会阻塞DOM Tree的构建过程
  • 但会阻塞Render Tree的构建过程:因为需要对应的CSSOM Tree

布局和绘制(Layout & Paint)

第四步是在渲染树(Render Tree)上运行布局(Layout),以计算每个节点的几何体

  • 渲染树会表示显示哪些节点以及其他的样式,但是不表示每个节点的尺寸、位置等信息
  • 布局是确定呈现树中所有节点的宽度、高度和位置信息

第五步是将每个节点绘制(Paint)到屏幕上

  • 在绘制阶段,浏览器布局阶段计算的每个frame转为屏幕上实际的像素点
  • 包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素

回流和重绘(Reflow & )

回流也可称为重排

理解回流(Reflow):

  • 第一次确定节点的大小和位置,称之为布局(layout)
  • 之后对节点的大小、位置修改重新计算,称之为回流

什么情况下会引起回流?

  • DOM 结构发生改变(添加新的节点或者移除节点)
  • 改变了布局(修改了width height padding font-size等值)
  • 窗口resize(修改了窗口的尺寸等)
  • 调用getComputedStyle方法获取尺寸、位置信息

理解重绘(Repaint):

  • 第一次渲染内容称之为绘制(paint)
  • 之后的重新渲染称之为重绘

什么情况下会引起重绘?

  • 修改背景色、文字颜色、边框颜色、样式等

回流一定会引起重绘,所以回流是一件很消耗性能的事情

  • 开发中要尽量避免发生回流

  • 修改样式尽量一次性修改完毕

    • 例如通过cssText一次性设置样式,或通过修改class的方式修改样式
  • 尽量避免频繁的操作DOM

    • 可以在一个DocumentFragment或者父元素中,将要操作的DOM操作完成,再一次性插入到DOM树中
  • 尽量避免通过getComputedStyle获取元素尺寸、位置等信息

  • 对某些元素使用position的absolute或fixed属性

    • 并不是不会引起回流,而是开销相对较小,不会对其他元素产生影响

特殊解析: composite合成

在绘制的过程中,可以将布局后的元素绘制到多个合成图层中

  • 这是浏览器的一种优化手段
  • 将不同流生成的不同Layer进行合并
标准流 => LayouTree => RenderLayer
 \`position:fixed;\` => RenderLayer
 

默认情况,标准流中的内容都是被绘制在同一个图层(Layer)中的

而一些特殊的属性,浏览器会创建一个新的合成层(CompositingLayer),并且新的图层可以利用GPU来加速绘制

  • 每个合成层都是单独渲染的
  • 单独渲染可以避免所有的动画都在同一层中渲染导致性能问题
  • 在各自的层中渲染完成后,只需要将渲染结果更新回合成层即可

当元素具有哪些属性时,浏览器会为其创建新的合成层呢?

  • 3D Transforms
  • video canvas iframe
  • opacity 动画转换时
  • position: fixed
  • will-change: 一个实验性的属性,提前告诉浏览器此元素可能发生哪些变化
  • animation 或 transition设置了opacity、transform

案例1:同一层渲染

.box1 {
   width: 100px;
diff --git a/assets/article_深入理解浏览器运行原理.md.7e80be4c.lean.js b/assets/article_深入理解浏览器运行原理.md.dac12750.lean.js
similarity index 94%
rename from assets/article_深入理解浏览器运行原理.md.7e80be4c.lean.js
rename to assets/article_深入理解浏览器运行原理.md.dac12750.lean.js
index 59214572..236a49d5 100644
--- a/assets/article_深入理解浏览器运行原理.md.7e80be4c.lean.js
+++ b/assets/article_深入理解浏览器运行原理.md.dac12750.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as e}from"./app.a81d7d4f.js";const m=JSON.parse('{"title":"深入理解浏览器运行原理","description":"","frontmatter":{},"headers":[{"level":2,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":2,"title":"HTML解析过程","slug":"html解析过程","link":"#html解析过程","children":[]},{"level":2,"title":"生成CSS规则","slug":"生成css规则","link":"#生成css规则","children":[]},{"level":2,"title":"构建Render Tree","slug":"构建render-tree","link":"#构建render-tree","children":[]},{"level":2,"title":"布局和绘制(Layout & Paint)","slug":"布局和绘制-layout-paint","link":"#布局和绘制-layout-paint","children":[]},{"level":2,"title":"回流和重绘(Reflow & )","slug":"回流和重绘-reflow","link":"#回流和重绘-reflow","children":[]},{"level":2,"title":"特殊解析: composite合成","slug":"特殊解析-composite合成","link":"#特殊解析-composite合成","children":[{"level":3,"title":"案例1:同一层渲染","slug":"案例1-同一层渲染","link":"#案例1-同一层渲染","children":[]},{"level":3,"title":"案例2:分层渲染","slug":"案例2-分层渲染","link":"#案例2-分层渲染","children":[]},{"level":3,"title":"案例3:transform 3D","slug":"案例3-transform-3d","link":"#案例3-transform-3d","children":[]},{"level":3,"title":"案例4:transition+transform","slug":"案例4-transition-transform","link":"#案例4-transition-transform","children":[]},{"level":3,"title":"案例5:transition+opacity","slug":"案例5-transition-opacity","link":"#案例5-transition-opacity","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}]},{"level":2,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]},{"level":2,"title":"defer属性","slug":"defer属性","link":"#defer属性","children":[]},{"level":2,"title":"async属性","slug":"async属性","link":"#async属性","children":[]}],"relativePath":"article/深入理解浏览器运行原理.md","lastUpdated":1675780846000}'),l={name:"article/深入理解浏览器运行原理.md"},p=e("",87),i=[p];function r(c,t,o,d,u,b){return n(),a("div",null,i)}const C=s(l,[["render",r]]);export{m as __pageData,C as default};
+import{_ as s,o as n,c as a,a as e}from"./app.94d5b31a.js";const m=JSON.parse('{"title":"深入理解浏览器运行原理","description":"","frontmatter":{},"headers":[{"level":2,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":2,"title":"HTML解析过程","slug":"html解析过程","link":"#html解析过程","children":[]},{"level":2,"title":"生成CSS规则","slug":"生成css规则","link":"#生成css规则","children":[]},{"level":2,"title":"构建Render Tree","slug":"构建render-tree","link":"#构建render-tree","children":[]},{"level":2,"title":"布局和绘制(Layout & Paint)","slug":"布局和绘制-layout-paint","link":"#布局和绘制-layout-paint","children":[]},{"level":2,"title":"回流和重绘(Reflow & )","slug":"回流和重绘-reflow","link":"#回流和重绘-reflow","children":[]},{"level":2,"title":"特殊解析: composite合成","slug":"特殊解析-composite合成","link":"#特殊解析-composite合成","children":[{"level":3,"title":"案例1:同一层渲染","slug":"案例1-同一层渲染","link":"#案例1-同一层渲染","children":[]},{"level":3,"title":"案例2:分层渲染","slug":"案例2-分层渲染","link":"#案例2-分层渲染","children":[]},{"level":3,"title":"案例3:transform 3D","slug":"案例3-transform-3d","link":"#案例3-transform-3d","children":[]},{"level":3,"title":"案例4:transition+transform","slug":"案例4-transition-transform","link":"#案例4-transition-transform","children":[]},{"level":3,"title":"案例5:transition+opacity","slug":"案例5-transition-opacity","link":"#案例5-transition-opacity","children":[]},{"level":3,"title":"总结","slug":"总结","link":"#总结","children":[]}]},{"level":2,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]},{"level":2,"title":"defer属性","slug":"defer属性","link":"#defer属性","children":[]},{"level":2,"title":"async属性","slug":"async属性","link":"#async属性","children":[]}],"relativePath":"article/深入理解浏览器运行原理.md","lastUpdated":1675783866000}'),l={name:"article/深入理解浏览器运行原理.md"},p=e("",87),i=[p];function r(c,t,o,d,u,b){return n(),a("div",null,i)}const C=s(l,[["render",r]]);export{m as __pageData,C as default};
diff --git a/assets/index.md.dd81ce4e.js b/assets/index.md.c3e50456.js
similarity index 85%
rename from assets/index.md.dd81ce4e.js
rename to assets/index.md.c3e50456.js
index 810e8d9c..3788bbb0 100644
--- a/assets/index.md.dd81ce4e.js
+++ b/assets/index.md.c3e50456.js
@@ -1 +1 @@
-import{_ as t,o as e,c as i}from"./app.a81d7d4f.js";const p=JSON.parse('{"title":"主页","description":"","frontmatter":{"layout":"home","title":"主页","hero":{"name":"ZiuChen","text":"无限进步.","tagline":"Infinite Progress...","actions":[{"theme":"brand","text":"Get Started","link":"/self/"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/ZiuChen"}]},"features":[{"icon":"🎓","title":"Electronic Information Major","details":"电子信息工程"},{"icon":"🎯","title":"JavaScript & TypeScript","details":"自学前端 热爱技术"},{"icon":"👆","title":"See more information","details":"访问导航栏查看更多信息"}]},"headers":[],"relativePath":"index.md","lastUpdated":1675780846000}'),a={name:"index.md"};function n(o,r,s,c,l,d){return e(),i("div")}const f=t(a,[["render",n]]);export{p as __pageData,f as default};
+import{_ as t,o as e,c as i}from"./app.94d5b31a.js";const p=JSON.parse('{"title":"主页","description":"","frontmatter":{"layout":"home","title":"主页","hero":{"name":"ZiuChen","text":"无限进步.","tagline":"Infinite Progress...","actions":[{"theme":"brand","text":"Get Started","link":"/self/"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/ZiuChen"}]},"features":[{"icon":"🎓","title":"Electronic Information Major","details":"电子信息工程"},{"icon":"🎯","title":"JavaScript & TypeScript","details":"自学前端 热爱技术"},{"icon":"👆","title":"See more information","details":"访问导航栏查看更多信息"}]},"headers":[],"relativePath":"index.md","lastUpdated":1675783866000}'),a={name:"index.md"};function n(o,r,s,c,l,d){return e(),i("div")}const f=t(a,[["render",n]]);export{p as __pageData,f as default};
diff --git a/assets/index.md.dd81ce4e.lean.js b/assets/index.md.c3e50456.lean.js
similarity index 85%
rename from assets/index.md.dd81ce4e.lean.js
rename to assets/index.md.c3e50456.lean.js
index 810e8d9c..3788bbb0 100644
--- a/assets/index.md.dd81ce4e.lean.js
+++ b/assets/index.md.c3e50456.lean.js
@@ -1 +1 @@
-import{_ as t,o as e,c as i}from"./app.a81d7d4f.js";const p=JSON.parse('{"title":"主页","description":"","frontmatter":{"layout":"home","title":"主页","hero":{"name":"ZiuChen","text":"无限进步.","tagline":"Infinite Progress...","actions":[{"theme":"brand","text":"Get Started","link":"/self/"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/ZiuChen"}]},"features":[{"icon":"🎓","title":"Electronic Information Major","details":"电子信息工程"},{"icon":"🎯","title":"JavaScript & TypeScript","details":"自学前端 热爱技术"},{"icon":"👆","title":"See more information","details":"访问导航栏查看更多信息"}]},"headers":[],"relativePath":"index.md","lastUpdated":1675780846000}'),a={name:"index.md"};function n(o,r,s,c,l,d){return e(),i("div")}const f=t(a,[["render",n]]);export{p as __pageData,f as default};
+import{_ as t,o as e,c as i}from"./app.94d5b31a.js";const p=JSON.parse('{"title":"主页","description":"","frontmatter":{"layout":"home","title":"主页","hero":{"name":"ZiuChen","text":"无限进步.","tagline":"Infinite Progress...","actions":[{"theme":"brand","text":"Get Started","link":"/self/"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/ZiuChen"}]},"features":[{"icon":"🎓","title":"Electronic Information Major","details":"电子信息工程"},{"icon":"🎯","title":"JavaScript & TypeScript","details":"自学前端 热爱技术"},{"icon":"👆","title":"See more information","details":"访问导航栏查看更多信息"}]},"headers":[],"relativePath":"index.md","lastUpdated":1675783866000}'),a={name:"index.md"};function n(o,r,s,c,l,d){return e(),i("div")}const f=t(a,[["render",n]]);export{p as __pageData,f as default};
diff --git a/assets/note_CSS.md.4ab48bec.js b/assets/note_CSS.md.504f05e4.js
similarity index 99%
rename from assets/note_CSS.md.4ab48bec.js
rename to assets/note_CSS.md.504f05e4.js
index 5e748cc0..873f25b7 100644
--- a/assets/note_CSS.md.4ab48bec.js
+++ b/assets/note_CSS.md.504f05e4.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const e="/assets/BFC-1.ed3fcfd0.jpg",p="/assets/BFC-2.3c4a8bbc.jpg",o="/assets/BFC-3.7daed619.jpg",c="/assets/BFC-4.b58515a7.jpg",A=JSON.parse('{"title":"CSS基础","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"文本样式(text)","slug":"文本样式-text","link":"#文本样式-text","children":[{"level":3,"title":"text-align(重要)","slug":"text-align-重要","link":"#text-align-重要","children":[]},{"level":3,"title":"letter-spacing word-spacing(了解)","slug":"letter-spacing-word-spacing-了解","link":"#letter-spacing-word-spacing-了解","children":[]}]},{"level":2,"title":"字体样式(font)","slug":"字体样式-font","link":"#字体样式-font","children":[{"level":3,"title":"font-size","slug":"font-size","link":"#font-size","children":[]},{"level":3,"title":"font-family(了解)","slug":"font-family-了解","link":"#font-family-了解","children":[]},{"level":3,"title":"font-weight(重要)","slug":"font-weight-重要","link":"#font-weight-重要","children":[]},{"level":3,"title":"font-style(了解)","slug":"font-style-了解","link":"#font-style-了解","children":[]},{"level":3,"title":"font-variant(了解)","slug":"font-variant-了解","link":"#font-variant-了解","children":[]},{"level":3,"title":"line-height(重要)","slug":"line-height-重要","link":"#line-height-重要","children":[]},{"level":3,"title":"font 缩写属性","slug":"font-缩写属性","link":"#font-缩写属性","children":[]}]},{"level":2,"title":"CSS选择器","slug":"css选择器","link":"#css选择器","children":[{"level":3,"title":"后代选择器","slug":"后代选择器","link":"#后代选择器","children":[]},{"level":3,"title":"直接子代选择器","slug":"直接子代选择器","link":"#直接子代选择器","children":[]},{"level":3,"title":"兄弟选择器","slug":"兄弟选择器","link":"#兄弟选择器","children":[]},{"level":3,"title":"选择器组","slug":"选择器组","link":"#选择器组","children":[]},{"level":3,"title":"伪类","slug":"伪类","link":"#伪类","children":[]},{"level":3,"title":"结构伪类","slug":"结构伪类","link":"#结构伪类","children":[]},{"level":3,"title":"伪元素","slug":"伪元素","link":"#伪元素","children":[]}]},{"level":2,"title":"CSS特性(重要)","slug":"css特性-重要","link":"#css特性-重要","children":[{"level":3,"title":"属性的继承","slug":"属性的继承","link":"#属性的继承","children":[]},{"level":3,"title":"属性的层叠","slug":"属性的层叠","link":"#属性的层叠","children":[]},{"level":3,"title":"HTML元素的类型","slug":"html元素的类型","link":"#html元素的类型","children":[]}]},{"level":2,"title":"CSS技巧","slug":"css技巧","link":"#css技巧","children":[{"level":3,"title":"元素隐藏方法","slug":"元素隐藏方法","link":"#元素隐藏方法","children":[]},{"level":3,"title":"样式不生效","slug":"样式不生效","link":"#样式不生效","children":[]}]},{"level":2,"title":"CSS盒子模型","slug":"css盒子模型","link":"#css盒子模型","children":[{"level":3,"title":"内容 width / height","slug":"内容-width-height","link":"#内容-width-height","children":[]},{"level":3,"title":"内边距 padding","slug":"内边距-padding","link":"#内边距-padding","children":[]},{"level":3,"title":"边框 border","slug":"边框-border","link":"#边框-border","children":[]},{"level":3,"title":"外边距 margin","slug":"外边距-margin","link":"#外边距-margin","children":[]},{"level":3,"title":"额外知识点","slug":"额外知识点","link":"#额外知识点","children":[]},{"level":3,"title":"外轮廓 outline","slug":"外轮廓-outline","link":"#外轮廓-outline","children":[]},{"level":3,"title":"盒子阴影 box-shadow","slug":"盒子阴影-box-shadow","link":"#盒子阴影-box-shadow","children":[]},{"level":3,"title":"行内非替换元素的注意事项","slug":"行内非替换元素的注意事项","link":"#行内非替换元素的注意事项","children":[]}]},{"level":2,"title":"CSS元素定位","slug":"css元素定位","link":"#css元素定位","children":[{"level":3,"title":"标准流","slug":"标准流","link":"#标准流","children":[]},{"level":3,"title":"认识元素的定位","slug":"认识元素的定位","link":"#认识元素的定位","children":[]},{"level":3,"title":"position属性取值","slug":"position属性取值","link":"#position属性取值","children":[]},{"level":3,"title":"绝对定位元素的特点","slug":"绝对定位元素的特点","link":"#绝对定位元素的特点","children":[]},{"level":3,"title":"z-index解析","slug":"z-index解析","link":"#z-index解析","children":[]}]},{"level":2,"title":"浮动布局","slug":"浮动布局","link":"#浮动布局","children":[{"level":3,"title":"认识浮动布局","slug":"认识浮动布局","link":"#认识浮动布局","children":[]},{"level":3,"title":"浮动案例","slug":"浮动案例","link":"#浮动案例","children":[]},{"level":3,"title":"浮动规则","slug":"浮动规则","link":"#浮动规则","children":[]},{"level":3,"title":"通过清除浮动实现布局(TODO)","slug":"通过清除浮动实现布局-todo","link":"#通过清除浮动实现布局-todo","children":[]}]},{"level":2,"title":"Flex布局","slug":"flex布局","link":"#flex布局","children":[{"level":3,"title":"认识Flex布局","slug":"认识flex布局","link":"#认识flex布局","children":[]},{"level":3,"title":"flex布局的重要概念","slug":"flex布局的重要概念","link":"#flex布局的重要概念","children":[]},{"level":3,"title":"flex相关的属性","slug":"flex相关的属性","link":"#flex相关的属性","children":[]},{"level":3,"title":"案例:解决布局问题","slug":"案例-解决布局问题","link":"#案例-解决布局问题","children":[]}]},{"level":2,"title":"CSS中的函数","slug":"css中的函数","link":"#css中的函数","children":[{"level":3,"title":"var  变量","slug":"var-变量","link":"#var-变量","children":[]},{"level":3,"title":"calc 计算","slug":"calc-计算","link":"#calc-计算","children":[]},{"level":3,"title":"blur 高斯模糊","slug":"blur-高斯模糊","link":"#blur-高斯模糊","children":[]},{"level":3,"title":"gradient 颜色渐变","slug":"gradient-颜色渐变","link":"#gradient-颜色渐变","children":[]}]},{"level":2,"title":"CSS求值过程","slug":"css求值过程","link":"#css求值过程","children":[]},{"level":2,"title":"移动端开发","slug":"移动端开发","link":"#移动端开发","children":[]},{"level":2,"title":"额外知识补充","slug":"额外知识补充","link":"#额外知识补充","children":[{"level":3,"title":"浏览器前缀","slug":"浏览器前缀","link":"#浏览器前缀","children":[]},{"level":3,"title":"深入理解BFC(重点)","slug":"深入理解bfc-重点","link":"#深入理解bfc-重点","children":[]},{"level":3,"title":"媒体查询","slug":"媒体查询","link":"#媒体查询","children":[]},{"level":3,"title":"link元素的使用","slug":"link元素的使用","link":"#link元素的使用","children":[]},{"level":3,"title":"CSS颜色的表示方式","slug":"css颜色的表示方式","link":"#css颜色的表示方式","children":[]},{"level":3,"title":"网络字体","slug":"网络字体","link":"#网络字体","children":[]},{"level":3,"title":"字体图标","slug":"字体图标","link":"#字体图标","children":[]},{"level":3,"title":"精灵图 雪碧图","slug":"精灵图-雪碧图","link":"#精灵图-雪碧图","children":[]},{"level":3,"title":"white-space","slug":"white-space","link":"#white-space","children":[]},{"level":3,"title":"text-overflow","slug":"text-overflow","link":"#text-overflow","children":[]},{"level":3,"title":"水平垂直居中方案","slug":"水平垂直居中方案","link":"#水平垂直居中方案","children":[]},{"level":3,"title":"内联元素居中布局","slug":"内联元素居中布局","link":"#内联元素居中布局","children":[]},{"level":3,"title":"块级元素居中布局","slug":"块级元素居中布局","link":"#块级元素居中布局","children":[]}]},{"level":2,"title":"HTML5新增内容","slug":"html5新增内容","link":"#html5新增内容","children":[{"level":3,"title":"语义化元素","slug":"语义化元素","link":"#语义化元素","children":[]},{"level":3,"title":"video标签","slug":"video标签","link":"#video标签","children":[]},{"level":3,"title":"audio标签","slug":"audio标签","link":"#audio标签","children":[]},{"level":3,"title":"input元素","slug":"input元素","link":"#input元素","children":[]},{"level":3,"title":"全局新增属性 data-*","slug":"全局新增属性-data","link":"#全局新增属性-data","children":[]}]}],"relativePath":"note/CSS.md","lastUpdated":1675780846000}'),t={name:"note/CSS.md"},r=l(`

CSS基础

CSS提供了三种方法,可以将CSS样式应用到元素上:

  • 内联样式
    • 直接将样式写到元素的style属性上
  • 内部样式表
    • 将样式通过<style>标签写在<head>标签中,通过选择器应用到元素上
  • 外部样式表
    • 将样式写在外部文件如style.css中,再通过<link>标签引入

文本样式(text)

  • text-decoration 框线样式
    • line-through 删除线
    • overline 上划线
    • underline 下划线
    • none 不设置装饰线
  • text-transform
    • text-transform 属性指定如何将元素的文本大写。
    • 它可以用于使文本显示为全大写或全小写,也可单独对每一个单词进行操作。
  • text-indent
    • text-indent 属性能定义一个块元素首行文本内容之前的缩进量。
  • text-align
  • word/letter-spacing

text-align(重要)

行内内容(例如文字)如何相对它的块父元素对齐,left靠左 center居中 right靠右 justify两端对齐

默认值为left

需要注意的是,当子元素是div时,对父元素设置text-align是不生效的:

css
.box {
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const e="/assets/BFC-1.ed3fcfd0.jpg",p="/assets/BFC-2.3c4a8bbc.jpg",o="/assets/BFC-3.7daed619.jpg",c="/assets/BFC-4.b58515a7.jpg",A=JSON.parse('{"title":"CSS基础","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"文本样式(text)","slug":"文本样式-text","link":"#文本样式-text","children":[{"level":3,"title":"text-align(重要)","slug":"text-align-重要","link":"#text-align-重要","children":[]},{"level":3,"title":"letter-spacing word-spacing(了解)","slug":"letter-spacing-word-spacing-了解","link":"#letter-spacing-word-spacing-了解","children":[]}]},{"level":2,"title":"字体样式(font)","slug":"字体样式-font","link":"#字体样式-font","children":[{"level":3,"title":"font-size","slug":"font-size","link":"#font-size","children":[]},{"level":3,"title":"font-family(了解)","slug":"font-family-了解","link":"#font-family-了解","children":[]},{"level":3,"title":"font-weight(重要)","slug":"font-weight-重要","link":"#font-weight-重要","children":[]},{"level":3,"title":"font-style(了解)","slug":"font-style-了解","link":"#font-style-了解","children":[]},{"level":3,"title":"font-variant(了解)","slug":"font-variant-了解","link":"#font-variant-了解","children":[]},{"level":3,"title":"line-height(重要)","slug":"line-height-重要","link":"#line-height-重要","children":[]},{"level":3,"title":"font 缩写属性","slug":"font-缩写属性","link":"#font-缩写属性","children":[]}]},{"level":2,"title":"CSS选择器","slug":"css选择器","link":"#css选择器","children":[{"level":3,"title":"后代选择器","slug":"后代选择器","link":"#后代选择器","children":[]},{"level":3,"title":"直接子代选择器","slug":"直接子代选择器","link":"#直接子代选择器","children":[]},{"level":3,"title":"兄弟选择器","slug":"兄弟选择器","link":"#兄弟选择器","children":[]},{"level":3,"title":"选择器组","slug":"选择器组","link":"#选择器组","children":[]},{"level":3,"title":"伪类","slug":"伪类","link":"#伪类","children":[]},{"level":3,"title":"结构伪类","slug":"结构伪类","link":"#结构伪类","children":[]},{"level":3,"title":"伪元素","slug":"伪元素","link":"#伪元素","children":[]}]},{"level":2,"title":"CSS特性(重要)","slug":"css特性-重要","link":"#css特性-重要","children":[{"level":3,"title":"属性的继承","slug":"属性的继承","link":"#属性的继承","children":[]},{"level":3,"title":"属性的层叠","slug":"属性的层叠","link":"#属性的层叠","children":[]},{"level":3,"title":"HTML元素的类型","slug":"html元素的类型","link":"#html元素的类型","children":[]}]},{"level":2,"title":"CSS技巧","slug":"css技巧","link":"#css技巧","children":[{"level":3,"title":"元素隐藏方法","slug":"元素隐藏方法","link":"#元素隐藏方法","children":[]},{"level":3,"title":"样式不生效","slug":"样式不生效","link":"#样式不生效","children":[]}]},{"level":2,"title":"CSS盒子模型","slug":"css盒子模型","link":"#css盒子模型","children":[{"level":3,"title":"内容 width / height","slug":"内容-width-height","link":"#内容-width-height","children":[]},{"level":3,"title":"内边距 padding","slug":"内边距-padding","link":"#内边距-padding","children":[]},{"level":3,"title":"边框 border","slug":"边框-border","link":"#边框-border","children":[]},{"level":3,"title":"外边距 margin","slug":"外边距-margin","link":"#外边距-margin","children":[]},{"level":3,"title":"额外知识点","slug":"额外知识点","link":"#额外知识点","children":[]},{"level":3,"title":"外轮廓 outline","slug":"外轮廓-outline","link":"#外轮廓-outline","children":[]},{"level":3,"title":"盒子阴影 box-shadow","slug":"盒子阴影-box-shadow","link":"#盒子阴影-box-shadow","children":[]},{"level":3,"title":"行内非替换元素的注意事项","slug":"行内非替换元素的注意事项","link":"#行内非替换元素的注意事项","children":[]}]},{"level":2,"title":"CSS元素定位","slug":"css元素定位","link":"#css元素定位","children":[{"level":3,"title":"标准流","slug":"标准流","link":"#标准流","children":[]},{"level":3,"title":"认识元素的定位","slug":"认识元素的定位","link":"#认识元素的定位","children":[]},{"level":3,"title":"position属性取值","slug":"position属性取值","link":"#position属性取值","children":[]},{"level":3,"title":"绝对定位元素的特点","slug":"绝对定位元素的特点","link":"#绝对定位元素的特点","children":[]},{"level":3,"title":"z-index解析","slug":"z-index解析","link":"#z-index解析","children":[]}]},{"level":2,"title":"浮动布局","slug":"浮动布局","link":"#浮动布局","children":[{"level":3,"title":"认识浮动布局","slug":"认识浮动布局","link":"#认识浮动布局","children":[]},{"level":3,"title":"浮动案例","slug":"浮动案例","link":"#浮动案例","children":[]},{"level":3,"title":"浮动规则","slug":"浮动规则","link":"#浮动规则","children":[]},{"level":3,"title":"通过清除浮动实现布局(TODO)","slug":"通过清除浮动实现布局-todo","link":"#通过清除浮动实现布局-todo","children":[]}]},{"level":2,"title":"Flex布局","slug":"flex布局","link":"#flex布局","children":[{"level":3,"title":"认识Flex布局","slug":"认识flex布局","link":"#认识flex布局","children":[]},{"level":3,"title":"flex布局的重要概念","slug":"flex布局的重要概念","link":"#flex布局的重要概念","children":[]},{"level":3,"title":"flex相关的属性","slug":"flex相关的属性","link":"#flex相关的属性","children":[]},{"level":3,"title":"案例:解决布局问题","slug":"案例-解决布局问题","link":"#案例-解决布局问题","children":[]}]},{"level":2,"title":"CSS中的函数","slug":"css中的函数","link":"#css中的函数","children":[{"level":3,"title":"var  变量","slug":"var-变量","link":"#var-变量","children":[]},{"level":3,"title":"calc 计算","slug":"calc-计算","link":"#calc-计算","children":[]},{"level":3,"title":"blur 高斯模糊","slug":"blur-高斯模糊","link":"#blur-高斯模糊","children":[]},{"level":3,"title":"gradient 颜色渐变","slug":"gradient-颜色渐变","link":"#gradient-颜色渐变","children":[]}]},{"level":2,"title":"CSS求值过程","slug":"css求值过程","link":"#css求值过程","children":[]},{"level":2,"title":"移动端开发","slug":"移动端开发","link":"#移动端开发","children":[]},{"level":2,"title":"额外知识补充","slug":"额外知识补充","link":"#额外知识补充","children":[{"level":3,"title":"浏览器前缀","slug":"浏览器前缀","link":"#浏览器前缀","children":[]},{"level":3,"title":"深入理解BFC(重点)","slug":"深入理解bfc-重点","link":"#深入理解bfc-重点","children":[]},{"level":3,"title":"媒体查询","slug":"媒体查询","link":"#媒体查询","children":[]},{"level":3,"title":"link元素的使用","slug":"link元素的使用","link":"#link元素的使用","children":[]},{"level":3,"title":"CSS颜色的表示方式","slug":"css颜色的表示方式","link":"#css颜色的表示方式","children":[]},{"level":3,"title":"网络字体","slug":"网络字体","link":"#网络字体","children":[]},{"level":3,"title":"字体图标","slug":"字体图标","link":"#字体图标","children":[]},{"level":3,"title":"精灵图 雪碧图","slug":"精灵图-雪碧图","link":"#精灵图-雪碧图","children":[]},{"level":3,"title":"white-space","slug":"white-space","link":"#white-space","children":[]},{"level":3,"title":"text-overflow","slug":"text-overflow","link":"#text-overflow","children":[]},{"level":3,"title":"水平垂直居中方案","slug":"水平垂直居中方案","link":"#水平垂直居中方案","children":[]},{"level":3,"title":"内联元素居中布局","slug":"内联元素居中布局","link":"#内联元素居中布局","children":[]},{"level":3,"title":"块级元素居中布局","slug":"块级元素居中布局","link":"#块级元素居中布局","children":[]}]},{"level":2,"title":"HTML5新增内容","slug":"html5新增内容","link":"#html5新增内容","children":[{"level":3,"title":"语义化元素","slug":"语义化元素","link":"#语义化元素","children":[]},{"level":3,"title":"video标签","slug":"video标签","link":"#video标签","children":[]},{"level":3,"title":"audio标签","slug":"audio标签","link":"#audio标签","children":[]},{"level":3,"title":"input元素","slug":"input元素","link":"#input元素","children":[]},{"level":3,"title":"全局新增属性 data-*","slug":"全局新增属性-data","link":"#全局新增属性-data","children":[]}]}],"relativePath":"note/CSS.md","lastUpdated":1675783866000}'),t={name:"note/CSS.md"},r=l(`

CSS基础

CSS提供了三种方法,可以将CSS样式应用到元素上:

  • 内联样式
    • 直接将样式写到元素的style属性上
  • 内部样式表
    • 将样式通过<style>标签写在<head>标签中,通过选择器应用到元素上
  • 外部样式表
    • 将样式写在外部文件如style.css中,再通过<link>标签引入

文本样式(text)

  • text-decoration 框线样式
    • line-through 删除线
    • overline 上划线
    • underline 下划线
    • none 不设置装饰线
  • text-transform
    • text-transform 属性指定如何将元素的文本大写。
    • 它可以用于使文本显示为全大写或全小写,也可单独对每一个单词进行操作。
  • text-indent
    • text-indent 属性能定义一个块元素首行文本内容之前的缩进量。
  • text-align
  • word/letter-spacing

text-align(重要)

行内内容(例如文字)如何相对它的块父元素对齐,left靠左 center居中 right靠右 justify两端对齐

默认值为left

需要注意的是,当子元素是div时,对父元素设置text-align是不生效的:

css
.box {
   height: 500px;
   text-align: center;
   background-color: red;
diff --git a/assets/note_CSS.md.4ab48bec.lean.js b/assets/note_CSS.md.504f05e4.lean.js
similarity index 98%
rename from assets/note_CSS.md.4ab48bec.lean.js
rename to assets/note_CSS.md.504f05e4.lean.js
index 8e23c003..3e12c71c 100644
--- a/assets/note_CSS.md.4ab48bec.lean.js
+++ b/assets/note_CSS.md.504f05e4.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const e="/assets/BFC-1.ed3fcfd0.jpg",p="/assets/BFC-2.3c4a8bbc.jpg",o="/assets/BFC-3.7daed619.jpg",c="/assets/BFC-4.b58515a7.jpg",A=JSON.parse('{"title":"CSS基础","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"文本样式(text)","slug":"文本样式-text","link":"#文本样式-text","children":[{"level":3,"title":"text-align(重要)","slug":"text-align-重要","link":"#text-align-重要","children":[]},{"level":3,"title":"letter-spacing word-spacing(了解)","slug":"letter-spacing-word-spacing-了解","link":"#letter-spacing-word-spacing-了解","children":[]}]},{"level":2,"title":"字体样式(font)","slug":"字体样式-font","link":"#字体样式-font","children":[{"level":3,"title":"font-size","slug":"font-size","link":"#font-size","children":[]},{"level":3,"title":"font-family(了解)","slug":"font-family-了解","link":"#font-family-了解","children":[]},{"level":3,"title":"font-weight(重要)","slug":"font-weight-重要","link":"#font-weight-重要","children":[]},{"level":3,"title":"font-style(了解)","slug":"font-style-了解","link":"#font-style-了解","children":[]},{"level":3,"title":"font-variant(了解)","slug":"font-variant-了解","link":"#font-variant-了解","children":[]},{"level":3,"title":"line-height(重要)","slug":"line-height-重要","link":"#line-height-重要","children":[]},{"level":3,"title":"font 缩写属性","slug":"font-缩写属性","link":"#font-缩写属性","children":[]}]},{"level":2,"title":"CSS选择器","slug":"css选择器","link":"#css选择器","children":[{"level":3,"title":"后代选择器","slug":"后代选择器","link":"#后代选择器","children":[]},{"level":3,"title":"直接子代选择器","slug":"直接子代选择器","link":"#直接子代选择器","children":[]},{"level":3,"title":"兄弟选择器","slug":"兄弟选择器","link":"#兄弟选择器","children":[]},{"level":3,"title":"选择器组","slug":"选择器组","link":"#选择器组","children":[]},{"level":3,"title":"伪类","slug":"伪类","link":"#伪类","children":[]},{"level":3,"title":"结构伪类","slug":"结构伪类","link":"#结构伪类","children":[]},{"level":3,"title":"伪元素","slug":"伪元素","link":"#伪元素","children":[]}]},{"level":2,"title":"CSS特性(重要)","slug":"css特性-重要","link":"#css特性-重要","children":[{"level":3,"title":"属性的继承","slug":"属性的继承","link":"#属性的继承","children":[]},{"level":3,"title":"属性的层叠","slug":"属性的层叠","link":"#属性的层叠","children":[]},{"level":3,"title":"HTML元素的类型","slug":"html元素的类型","link":"#html元素的类型","children":[]}]},{"level":2,"title":"CSS技巧","slug":"css技巧","link":"#css技巧","children":[{"level":3,"title":"元素隐藏方法","slug":"元素隐藏方法","link":"#元素隐藏方法","children":[]},{"level":3,"title":"样式不生效","slug":"样式不生效","link":"#样式不生效","children":[]}]},{"level":2,"title":"CSS盒子模型","slug":"css盒子模型","link":"#css盒子模型","children":[{"level":3,"title":"内容 width / height","slug":"内容-width-height","link":"#内容-width-height","children":[]},{"level":3,"title":"内边距 padding","slug":"内边距-padding","link":"#内边距-padding","children":[]},{"level":3,"title":"边框 border","slug":"边框-border","link":"#边框-border","children":[]},{"level":3,"title":"外边距 margin","slug":"外边距-margin","link":"#外边距-margin","children":[]},{"level":3,"title":"额外知识点","slug":"额外知识点","link":"#额外知识点","children":[]},{"level":3,"title":"外轮廓 outline","slug":"外轮廓-outline","link":"#外轮廓-outline","children":[]},{"level":3,"title":"盒子阴影 box-shadow","slug":"盒子阴影-box-shadow","link":"#盒子阴影-box-shadow","children":[]},{"level":3,"title":"行内非替换元素的注意事项","slug":"行内非替换元素的注意事项","link":"#行内非替换元素的注意事项","children":[]}]},{"level":2,"title":"CSS元素定位","slug":"css元素定位","link":"#css元素定位","children":[{"level":3,"title":"标准流","slug":"标准流","link":"#标准流","children":[]},{"level":3,"title":"认识元素的定位","slug":"认识元素的定位","link":"#认识元素的定位","children":[]},{"level":3,"title":"position属性取值","slug":"position属性取值","link":"#position属性取值","children":[]},{"level":3,"title":"绝对定位元素的特点","slug":"绝对定位元素的特点","link":"#绝对定位元素的特点","children":[]},{"level":3,"title":"z-index解析","slug":"z-index解析","link":"#z-index解析","children":[]}]},{"level":2,"title":"浮动布局","slug":"浮动布局","link":"#浮动布局","children":[{"level":3,"title":"认识浮动布局","slug":"认识浮动布局","link":"#认识浮动布局","children":[]},{"level":3,"title":"浮动案例","slug":"浮动案例","link":"#浮动案例","children":[]},{"level":3,"title":"浮动规则","slug":"浮动规则","link":"#浮动规则","children":[]},{"level":3,"title":"通过清除浮动实现布局(TODO)","slug":"通过清除浮动实现布局-todo","link":"#通过清除浮动实现布局-todo","children":[]}]},{"level":2,"title":"Flex布局","slug":"flex布局","link":"#flex布局","children":[{"level":3,"title":"认识Flex布局","slug":"认识flex布局","link":"#认识flex布局","children":[]},{"level":3,"title":"flex布局的重要概念","slug":"flex布局的重要概念","link":"#flex布局的重要概念","children":[]},{"level":3,"title":"flex相关的属性","slug":"flex相关的属性","link":"#flex相关的属性","children":[]},{"level":3,"title":"案例:解决布局问题","slug":"案例-解决布局问题","link":"#案例-解决布局问题","children":[]}]},{"level":2,"title":"CSS中的函数","slug":"css中的函数","link":"#css中的函数","children":[{"level":3,"title":"var  变量","slug":"var-变量","link":"#var-变量","children":[]},{"level":3,"title":"calc 计算","slug":"calc-计算","link":"#calc-计算","children":[]},{"level":3,"title":"blur 高斯模糊","slug":"blur-高斯模糊","link":"#blur-高斯模糊","children":[]},{"level":3,"title":"gradient 颜色渐变","slug":"gradient-颜色渐变","link":"#gradient-颜色渐变","children":[]}]},{"level":2,"title":"CSS求值过程","slug":"css求值过程","link":"#css求值过程","children":[]},{"level":2,"title":"移动端开发","slug":"移动端开发","link":"#移动端开发","children":[]},{"level":2,"title":"额外知识补充","slug":"额外知识补充","link":"#额外知识补充","children":[{"level":3,"title":"浏览器前缀","slug":"浏览器前缀","link":"#浏览器前缀","children":[]},{"level":3,"title":"深入理解BFC(重点)","slug":"深入理解bfc-重点","link":"#深入理解bfc-重点","children":[]},{"level":3,"title":"媒体查询","slug":"媒体查询","link":"#媒体查询","children":[]},{"level":3,"title":"link元素的使用","slug":"link元素的使用","link":"#link元素的使用","children":[]},{"level":3,"title":"CSS颜色的表示方式","slug":"css颜色的表示方式","link":"#css颜色的表示方式","children":[]},{"level":3,"title":"网络字体","slug":"网络字体","link":"#网络字体","children":[]},{"level":3,"title":"字体图标","slug":"字体图标","link":"#字体图标","children":[]},{"level":3,"title":"精灵图 雪碧图","slug":"精灵图-雪碧图","link":"#精灵图-雪碧图","children":[]},{"level":3,"title":"white-space","slug":"white-space","link":"#white-space","children":[]},{"level":3,"title":"text-overflow","slug":"text-overflow","link":"#text-overflow","children":[]},{"level":3,"title":"水平垂直居中方案","slug":"水平垂直居中方案","link":"#水平垂直居中方案","children":[]},{"level":3,"title":"内联元素居中布局","slug":"内联元素居中布局","link":"#内联元素居中布局","children":[]},{"level":3,"title":"块级元素居中布局","slug":"块级元素居中布局","link":"#块级元素居中布局","children":[]}]},{"level":2,"title":"HTML5新增内容","slug":"html5新增内容","link":"#html5新增内容","children":[{"level":3,"title":"语义化元素","slug":"语义化元素","link":"#语义化元素","children":[]},{"level":3,"title":"video标签","slug":"video标签","link":"#video标签","children":[]},{"level":3,"title":"audio标签","slug":"audio标签","link":"#audio标签","children":[]},{"level":3,"title":"input元素","slug":"input元素","link":"#input元素","children":[]},{"level":3,"title":"全局新增属性 data-*","slug":"全局新增属性-data","link":"#全局新增属性-data","children":[]}]}],"relativePath":"note/CSS.md","lastUpdated":1675780846000}'),t={name:"note/CSS.md"},r=l("",533),i=[r];function d(D,y,F,C,u,b){return n(),a("div",null,i)}const m=s(t,[["render",d]]);export{A as __pageData,m as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const e="/assets/BFC-1.ed3fcfd0.jpg",p="/assets/BFC-2.3c4a8bbc.jpg",o="/assets/BFC-3.7daed619.jpg",c="/assets/BFC-4.b58515a7.jpg",A=JSON.parse('{"title":"CSS基础","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"文本样式(text)","slug":"文本样式-text","link":"#文本样式-text","children":[{"level":3,"title":"text-align(重要)","slug":"text-align-重要","link":"#text-align-重要","children":[]},{"level":3,"title":"letter-spacing word-spacing(了解)","slug":"letter-spacing-word-spacing-了解","link":"#letter-spacing-word-spacing-了解","children":[]}]},{"level":2,"title":"字体样式(font)","slug":"字体样式-font","link":"#字体样式-font","children":[{"level":3,"title":"font-size","slug":"font-size","link":"#font-size","children":[]},{"level":3,"title":"font-family(了解)","slug":"font-family-了解","link":"#font-family-了解","children":[]},{"level":3,"title":"font-weight(重要)","slug":"font-weight-重要","link":"#font-weight-重要","children":[]},{"level":3,"title":"font-style(了解)","slug":"font-style-了解","link":"#font-style-了解","children":[]},{"level":3,"title":"font-variant(了解)","slug":"font-variant-了解","link":"#font-variant-了解","children":[]},{"level":3,"title":"line-height(重要)","slug":"line-height-重要","link":"#line-height-重要","children":[]},{"level":3,"title":"font 缩写属性","slug":"font-缩写属性","link":"#font-缩写属性","children":[]}]},{"level":2,"title":"CSS选择器","slug":"css选择器","link":"#css选择器","children":[{"level":3,"title":"后代选择器","slug":"后代选择器","link":"#后代选择器","children":[]},{"level":3,"title":"直接子代选择器","slug":"直接子代选择器","link":"#直接子代选择器","children":[]},{"level":3,"title":"兄弟选择器","slug":"兄弟选择器","link":"#兄弟选择器","children":[]},{"level":3,"title":"选择器组","slug":"选择器组","link":"#选择器组","children":[]},{"level":3,"title":"伪类","slug":"伪类","link":"#伪类","children":[]},{"level":3,"title":"结构伪类","slug":"结构伪类","link":"#结构伪类","children":[]},{"level":3,"title":"伪元素","slug":"伪元素","link":"#伪元素","children":[]}]},{"level":2,"title":"CSS特性(重要)","slug":"css特性-重要","link":"#css特性-重要","children":[{"level":3,"title":"属性的继承","slug":"属性的继承","link":"#属性的继承","children":[]},{"level":3,"title":"属性的层叠","slug":"属性的层叠","link":"#属性的层叠","children":[]},{"level":3,"title":"HTML元素的类型","slug":"html元素的类型","link":"#html元素的类型","children":[]}]},{"level":2,"title":"CSS技巧","slug":"css技巧","link":"#css技巧","children":[{"level":3,"title":"元素隐藏方法","slug":"元素隐藏方法","link":"#元素隐藏方法","children":[]},{"level":3,"title":"样式不生效","slug":"样式不生效","link":"#样式不生效","children":[]}]},{"level":2,"title":"CSS盒子模型","slug":"css盒子模型","link":"#css盒子模型","children":[{"level":3,"title":"内容 width / height","slug":"内容-width-height","link":"#内容-width-height","children":[]},{"level":3,"title":"内边距 padding","slug":"内边距-padding","link":"#内边距-padding","children":[]},{"level":3,"title":"边框 border","slug":"边框-border","link":"#边框-border","children":[]},{"level":3,"title":"外边距 margin","slug":"外边距-margin","link":"#外边距-margin","children":[]},{"level":3,"title":"额外知识点","slug":"额外知识点","link":"#额外知识点","children":[]},{"level":3,"title":"外轮廓 outline","slug":"外轮廓-outline","link":"#外轮廓-outline","children":[]},{"level":3,"title":"盒子阴影 box-shadow","slug":"盒子阴影-box-shadow","link":"#盒子阴影-box-shadow","children":[]},{"level":3,"title":"行内非替换元素的注意事项","slug":"行内非替换元素的注意事项","link":"#行内非替换元素的注意事项","children":[]}]},{"level":2,"title":"CSS元素定位","slug":"css元素定位","link":"#css元素定位","children":[{"level":3,"title":"标准流","slug":"标准流","link":"#标准流","children":[]},{"level":3,"title":"认识元素的定位","slug":"认识元素的定位","link":"#认识元素的定位","children":[]},{"level":3,"title":"position属性取值","slug":"position属性取值","link":"#position属性取值","children":[]},{"level":3,"title":"绝对定位元素的特点","slug":"绝对定位元素的特点","link":"#绝对定位元素的特点","children":[]},{"level":3,"title":"z-index解析","slug":"z-index解析","link":"#z-index解析","children":[]}]},{"level":2,"title":"浮动布局","slug":"浮动布局","link":"#浮动布局","children":[{"level":3,"title":"认识浮动布局","slug":"认识浮动布局","link":"#认识浮动布局","children":[]},{"level":3,"title":"浮动案例","slug":"浮动案例","link":"#浮动案例","children":[]},{"level":3,"title":"浮动规则","slug":"浮动规则","link":"#浮动规则","children":[]},{"level":3,"title":"通过清除浮动实现布局(TODO)","slug":"通过清除浮动实现布局-todo","link":"#通过清除浮动实现布局-todo","children":[]}]},{"level":2,"title":"Flex布局","slug":"flex布局","link":"#flex布局","children":[{"level":3,"title":"认识Flex布局","slug":"认识flex布局","link":"#认识flex布局","children":[]},{"level":3,"title":"flex布局的重要概念","slug":"flex布局的重要概念","link":"#flex布局的重要概念","children":[]},{"level":3,"title":"flex相关的属性","slug":"flex相关的属性","link":"#flex相关的属性","children":[]},{"level":3,"title":"案例:解决布局问题","slug":"案例-解决布局问题","link":"#案例-解决布局问题","children":[]}]},{"level":2,"title":"CSS中的函数","slug":"css中的函数","link":"#css中的函数","children":[{"level":3,"title":"var  变量","slug":"var-变量","link":"#var-变量","children":[]},{"level":3,"title":"calc 计算","slug":"calc-计算","link":"#calc-计算","children":[]},{"level":3,"title":"blur 高斯模糊","slug":"blur-高斯模糊","link":"#blur-高斯模糊","children":[]},{"level":3,"title":"gradient 颜色渐变","slug":"gradient-颜色渐变","link":"#gradient-颜色渐变","children":[]}]},{"level":2,"title":"CSS求值过程","slug":"css求值过程","link":"#css求值过程","children":[]},{"level":2,"title":"移动端开发","slug":"移动端开发","link":"#移动端开发","children":[]},{"level":2,"title":"额外知识补充","slug":"额外知识补充","link":"#额外知识补充","children":[{"level":3,"title":"浏览器前缀","slug":"浏览器前缀","link":"#浏览器前缀","children":[]},{"level":3,"title":"深入理解BFC(重点)","slug":"深入理解bfc-重点","link":"#深入理解bfc-重点","children":[]},{"level":3,"title":"媒体查询","slug":"媒体查询","link":"#媒体查询","children":[]},{"level":3,"title":"link元素的使用","slug":"link元素的使用","link":"#link元素的使用","children":[]},{"level":3,"title":"CSS颜色的表示方式","slug":"css颜色的表示方式","link":"#css颜色的表示方式","children":[]},{"level":3,"title":"网络字体","slug":"网络字体","link":"#网络字体","children":[]},{"level":3,"title":"字体图标","slug":"字体图标","link":"#字体图标","children":[]},{"level":3,"title":"精灵图 雪碧图","slug":"精灵图-雪碧图","link":"#精灵图-雪碧图","children":[]},{"level":3,"title":"white-space","slug":"white-space","link":"#white-space","children":[]},{"level":3,"title":"text-overflow","slug":"text-overflow","link":"#text-overflow","children":[]},{"level":3,"title":"水平垂直居中方案","slug":"水平垂直居中方案","link":"#水平垂直居中方案","children":[]},{"level":3,"title":"内联元素居中布局","slug":"内联元素居中布局","link":"#内联元素居中布局","children":[]},{"level":3,"title":"块级元素居中布局","slug":"块级元素居中布局","link":"#块级元素居中布局","children":[]}]},{"level":2,"title":"HTML5新增内容","slug":"html5新增内容","link":"#html5新增内容","children":[{"level":3,"title":"语义化元素","slug":"语义化元素","link":"#语义化元素","children":[]},{"level":3,"title":"video标签","slug":"video标签","link":"#video标签","children":[]},{"level":3,"title":"audio标签","slug":"audio标签","link":"#audio标签","children":[]},{"level":3,"title":"input元素","slug":"input元素","link":"#input元素","children":[]},{"level":3,"title":"全局新增属性 data-*","slug":"全局新增属性-data","link":"#全局新增属性-data","children":[]}]}],"relativePath":"note/CSS.md","lastUpdated":1675783866000}'),t={name:"note/CSS.md"},r=l("",533),i=[r];function d(D,y,F,C,u,b){return n(),a("div",null,i)}const m=s(t,[["render",d]]);export{A as __pageData,m as default};
diff --git a/assets/note_Front-end Engineering.md.66f43176.js b/assets/note_Front-end Engineering.md.66f43176.js
new file mode 100644
index 00000000..c50c970f
--- /dev/null
+++ b/assets/note_Front-end Engineering.md.66f43176.js	
@@ -0,0 +1 @@
+import{_ as e,o as i,c as l,a as n}from"./app.94d5b31a.js";const j=JSON.parse('{"title":"前端工程化","description":"","frontmatter":{},"headers":[{"level":2,"title":"Node.js","slug":"node-js","link":"#node-js","children":[{"level":3,"title":"什么是Node.js","slug":"什么是node-js","link":"#什么是node-js","children":[]},{"level":3,"title":"Node.js的应用场景","slug":"node-js的应用场景","link":"#node-js的应用场景","children":[]}]}],"relativePath":"note/Front-end Engineering.md","lastUpdated":1675783866000}'),o={name:"note/Front-end Engineering.md"},t=n('

前端工程化

Node.js

  • 什么是Node.JS Node的应用场景
  • JS代码执行
  • Node的输入和输出
  • Node的全局对象

什么是Node.js

Node.js是一个基于V8 JavaScript引擎JavaScript运行时环境

  • V8可以嵌入到任何C++应用程序中,无论是Chrome还是Node.js,事实上都嵌入了V8引擎来执行JavaScript代码
  • 在Chrome浏览器中,还需要解析、渲染HTML、CSS等相关渲染引擎,另外还需要支持浏览器操作的API、浏览器自己的事件循环
  • 在Node.js中我们也需要进行一些额外操作:文件系统读写、网络IO、加密、压缩解压文件等

可以简单总结出Node.js和浏览器的区别

  • Chrome浏览器

    • Blink负责解析HTML文档,遇到JavaScript标签时将内容交给V8引擎

    • Blink 是 Google Chrome 浏览器的渲染引擎,V8 是 Blink 内置的 JavaScript 引擎

      • 预分析:检查语法错误但不生成AST树
      • 生成AST:语法分析、词法分析后,生成抽象语法树(AST)
        • AST 为每一行代码定义键值对。初始类型标识符定义 AST 属于一个程序,然后所有代码行将定义在主体内部,主体是一个对象数组。
      • 生成字节码:基线编译器(Ignition)将 AST 转换为字节码
      • 生成机器代码:优化编译器 (Turbofan) 将字节码转换为优化的机器代码。另外,在逐行执行字节码的过程中,如果一段代码经常被执行,V8会直接将这段代码转换并保存为机器码,下次执行不需要经过字节码,优化了执行速度
  • Node.js

    • 只处理JavaScript代码 内部V8引擎负责JS代码的执行
    • JavaScript代码 -> V8 -> Node.js Bindings -> LibUV
    • LibUV是使用C语言编写的库,提供了事件循环、文件系统读写、网络IO、线程池等等内容

![The Node.js System](Front-end Engineering.assets/The Node.js System.jpeg)

Node.js的应用场景

  • 前端开发的库都是以node包形式管理的
  • npm yarn pnpm成为前端开发使用最多的工具
  • 使用Node.js作为Web服务器开发、中间件、代理服务器
  • 借助Node.js完成前后端渲染的同构应用
  • 编写脚本工具 构建项目 打包代码等
  • Electron桌面应用程序
',11),s=[t];function d(a,r,c,h,p,u){return i(),l("div",null,s)}const _=e(o,[["render",d]]);export{j as __pageData,_ as default}; diff --git a/assets/note_Front-end Engineering.md.66f43176.lean.js b/assets/note_Front-end Engineering.md.66f43176.lean.js new file mode 100644 index 00000000..0e8d0714 --- /dev/null +++ b/assets/note_Front-end Engineering.md.66f43176.lean.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as l,a as n}from"./app.94d5b31a.js";const j=JSON.parse('{"title":"前端工程化","description":"","frontmatter":{},"headers":[{"level":2,"title":"Node.js","slug":"node-js","link":"#node-js","children":[{"level":3,"title":"什么是Node.js","slug":"什么是node-js","link":"#什么是node-js","children":[]},{"level":3,"title":"Node.js的应用场景","slug":"node-js的应用场景","link":"#node-js的应用场景","children":[]}]}],"relativePath":"note/Front-end Engineering.md","lastUpdated":1675783866000}'),o={name:"note/Front-end Engineering.md"},t=n("",11),s=[t];function d(a,r,c,h,p,u){return i(),l("div",null,s)}const _=e(o,[["render",d]]);export{j as __pageData,_ as default}; diff --git a/assets/note_JavaScript.md.69e0f480.js b/assets/note_JavaScript.md.7d82dc69.js similarity index 83% rename from assets/note_JavaScript.md.69e0f480.js rename to assets/note_JavaScript.md.7d82dc69.js index d62bb091..5c108f7e 100644 --- a/assets/note_JavaScript.md.69e0f480.js +++ b/assets/note_JavaScript.md.7d82dc69.js @@ -1 +1 @@ -import{_ as a,o as e,c as r,b as t,d as s}from"./app.a81d7d4f.js";const S=JSON.parse('{"title":"JavaScript 基础","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"note/JavaScript.md","lastUpdated":1675780846000}'),c={name:"note/JavaScript.md"},i=t("h1",{id:"javascript-基础",tabindex:"-1"},[s("JavaScript 基础 "),t("a",{class:"header-anchor",href:"#javascript-基础","aria-hidden":"true"},"#")],-1),n=t("p",null,"JavaScript 组成",-1),o=t("ul",null,[t("li",null,"ECMAScript 定义语言规范"),t("li",null,"DOM 用于操作文档的API"),t("li",null,"BOM 用于操作浏览器的API")],-1),l=[i,n,o];function d(p,_,h,u,v,f){return e(),r("div",null,l)}const J=a(c,[["render",d]]);export{S as __pageData,J as default}; +import{_ as a,o as e,c as r,b as t,d as s}from"./app.94d5b31a.js";const S=JSON.parse('{"title":"JavaScript 基础","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"note/JavaScript.md","lastUpdated":1675783866000}'),c={name:"note/JavaScript.md"},i=t("h1",{id:"javascript-基础",tabindex:"-1"},[s("JavaScript 基础 "),t("a",{class:"header-anchor",href:"#javascript-基础","aria-hidden":"true"},"#")],-1),n=t("p",null,"JavaScript 组成",-1),o=t("ul",null,[t("li",null,"ECMAScript 定义语言规范"),t("li",null,"DOM 用于操作文档的API"),t("li",null,"BOM 用于操作浏览器的API")],-1),l=[i,n,o];function d(p,_,h,u,v,f){return e(),r("div",null,l)}const J=a(c,[["render",d]]);export{S as __pageData,J as default}; diff --git a/assets/note_JavaScript.md.69e0f480.lean.js b/assets/note_JavaScript.md.7d82dc69.lean.js similarity index 83% rename from assets/note_JavaScript.md.69e0f480.lean.js rename to assets/note_JavaScript.md.7d82dc69.lean.js index d62bb091..5c108f7e 100644 --- a/assets/note_JavaScript.md.69e0f480.lean.js +++ b/assets/note_JavaScript.md.7d82dc69.lean.js @@ -1 +1 @@ -import{_ as a,o as e,c as r,b as t,d as s}from"./app.a81d7d4f.js";const S=JSON.parse('{"title":"JavaScript 基础","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"note/JavaScript.md","lastUpdated":1675780846000}'),c={name:"note/JavaScript.md"},i=t("h1",{id:"javascript-基础",tabindex:"-1"},[s("JavaScript 基础 "),t("a",{class:"header-anchor",href:"#javascript-基础","aria-hidden":"true"},"#")],-1),n=t("p",null,"JavaScript 组成",-1),o=t("ul",null,[t("li",null,"ECMAScript 定义语言规范"),t("li",null,"DOM 用于操作文档的API"),t("li",null,"BOM 用于操作浏览器的API")],-1),l=[i,n,o];function d(p,_,h,u,v,f){return e(),r("div",null,l)}const J=a(c,[["render",d]]);export{S as __pageData,J as default}; +import{_ as a,o as e,c as r,b as t,d as s}from"./app.94d5b31a.js";const S=JSON.parse('{"title":"JavaScript 基础","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"note/JavaScript.md","lastUpdated":1675783866000}'),c={name:"note/JavaScript.md"},i=t("h1",{id:"javascript-基础",tabindex:"-1"},[s("JavaScript 基础 "),t("a",{class:"header-anchor",href:"#javascript-基础","aria-hidden":"true"},"#")],-1),n=t("p",null,"JavaScript 组成",-1),o=t("ul",null,[t("li",null,"ECMAScript 定义语言规范"),t("li",null,"DOM 用于操作文档的API"),t("li",null,"BOM 用于操作浏览器的API")],-1),l=[i,n,o];function d(p,_,h,u,v,f){return e(),r("div",null,l)}const J=a(c,[["render",d]]);export{S as __pageData,J as default}; diff --git a/assets/note_JavaScriptEnhanced.md.14bd6be0.js b/assets/note_JavaScriptEnhanced.md.e445eea3.js similarity index 99% rename from assets/note_JavaScriptEnhanced.md.14bd6be0.js rename to assets/note_JavaScriptEnhanced.md.e445eea3.js index 5e5a3851..df3d06d9 100644 --- a/assets/note_JavaScriptEnhanced.md.14bd6be0.js +++ b/assets/note_JavaScriptEnhanced.md.e445eea3.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const p="/assets/image-20221118222207332-16687813334481.64935e06.png",o="/assets/image-20221118222311200-16687813941873.8c07f79f.png",e="/assets/image-20221122103111654.29f48e34.png",c="/assets/image-20221122103256116.b7d76f81.png",r="/assets/image-20221122103715428.587185d1.png",t="/assets/image-20221125090752249.baeedc2b.png",y="/assets/image-20221125094148365.3adfbe2d.png",g=JSON.parse('{"title":"JavaScript 高级教程","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[{"level":3,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[]},{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]},{"level":3,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]},{"level":3,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}]},{"level":2,"title":"原型与继承","slug":"原型与继承","link":"#原型与继承","children":[{"level":3,"title":"原型有什么作用?","slug":"原型有什么作用","link":"#原型有什么作用","children":[]},{"level":3,"title":"函数的显式原型","slug":"函数的显式原型","link":"#函数的显式原型","children":[]},{"level":3,"title":"Object的原型","slug":"object的原型","link":"#object的原型","children":[]},{"level":3,"title":"原型链实现继承","slug":"原型链实现继承","link":"#原型链实现继承","children":[]},{"level":3,"title":"创建原型对象的方法","slug":"创建原型对象的方法","link":"#创建原型对象的方法","children":[]},{"level":3,"title":"对象方法补充","slug":"对象方法补充","link":"#对象方法补充","children":[]},{"level":3,"title":"解读原型继承关系图","slug":"解读原型继承关系图","link":"#解读原型继承关系图","children":[]},{"level":3,"title":"构造函数的类方法","slug":"构造函数的类方法","link":"#构造函数的类方法","children":[]}]},{"level":2,"title":"ES6继承","slug":"es6继承","link":"#es6继承","children":[{"level":3,"title":"与function的异同","slug":"与function的异同","link":"#与function的异同","children":[]},{"level":3,"title":"定义访问器方法","slug":"定义访问器方法","link":"#定义访问器方法","children":[]},{"level":3,"title":"类的静态方法","slug":"类的静态方法","link":"#类的静态方法","children":[]},{"level":3,"title":"extends实现继承","slug":"extends实现继承","link":"#extends实现继承","children":[]},{"level":3,"title":"继承自默认类","slug":"继承自默认类","link":"#继承自默认类","children":[]},{"level":3,"title":"类的混入mixin","slug":"类的混入mixin","link":"#类的混入mixin","children":[]},{"level":3,"title":"Babel是如何转化ES6的","slug":"babel是如何转化es6的","link":"#babel是如何转化es6的","children":[]}]},{"level":2,"title":"浏览器运行原理","slug":"浏览器运行原理","link":"#浏览器运行原理","children":[{"level":3,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":3,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]}]},{"level":2,"title":"JavaScript 运行原理","slug":"javascript-运行原理","link":"#javascript-运行原理","children":[{"level":3,"title":"JS代码的执行","slug":"js代码的执行","link":"#js代码的执行","children":[]},{"level":3,"title":"JavaScript V8引擎","slug":"javascript-v8引擎","link":"#javascript-v8引擎","children":[]},{"level":3,"title":"JavaScript代码执行过程","slug":"javascript代码执行过程","link":"#javascript代码执行过程","children":[]}]},{"level":2,"title":"Proxy与Reflect","slug":"proxy与reflect","link":"#proxy与reflect","children":[{"level":3,"title":"监听对象方法","slug":"监听对象方法","link":"#监听对象方法","children":[]},{"level":3,"title":"Proxy","slug":"proxy","link":"#proxy","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"理解Proxy与Reflect中的receiver参数","slug":"理解proxy与reflect中的receiver参数","link":"#理解proxy与reflect中的receiver参数","children":[]}]},{"level":2,"title":"Promise详解","slug":"promise详解","link":"#promise详解","children":[{"level":3,"title":"异步代码","slug":"异步代码","link":"#异步代码","children":[]},{"level":3,"title":"认识Promise","slug":"认识promise","link":"#认识promise","children":[]},{"level":3,"title":"Promise类方法","slug":"promise类方法","link":"#promise类方法","children":[]}]},{"level":2,"title":"迭代器与生成器","slug":"迭代器与生成器","link":"#迭代器与生成器","children":[{"level":3,"title":"异步处理","slug":"异步处理","link":"#异步处理","children":[]}]},{"level":2,"title":"let与const","slug":"let与const","link":"#let与const","children":[{"level":3,"title":"作用域提升","slug":"作用域提升","link":"#作用域提升","children":[]},{"level":3,"title":"暂时性死区","slug":"暂时性死区","link":"#暂时性死区","children":[]},{"level":3,"title":"变量保存位置","slug":"变量保存位置","link":"#变量保存位置","children":[]},{"level":3,"title":"块级作用域","slug":"块级作用域","link":"#块级作用域","children":[]},{"level":3,"title":"开发中的应用","slug":"开发中的应用","link":"#开发中的应用","children":[]}]},{"level":2,"title":"await async 事件循环","slug":"await-async-事件循环","link":"#await-async-事件循环","children":[{"level":3,"title":"异步函数 async","slug":"异步函数-async","link":"#异步函数-async","children":[]},{"level":3,"title":"await关键字","slug":"await关键字","link":"#await关键字","children":[]},{"level":3,"title":"进程与线程","slug":"进程与线程","link":"#进程与线程","children":[]},{"level":3,"title":"JavaScript线程","slug":"javascript线程","link":"#javascript线程","children":[]},{"level":3,"title":"微任务与宏任务","slug":"微任务与宏任务","link":"#微任务与宏任务","children":[]},{"level":3,"title":"事件循环 面试题","slug":"事件循环-面试题","link":"#事件循环-面试题","children":[]},{"level":3,"title":"Node事件循环","slug":"node事件循环","link":"#node事件循环","children":[]}]},{"level":2,"title":"防抖与节流","slug":"防抖与节流","link":"#防抖与节流","children":[{"level":3,"title":"防抖函数","slug":"防抖函数","link":"#防抖函数","children":[]},{"level":3,"title":"节流函数","slug":"节流函数","link":"#节流函数","children":[]}]},{"level":2,"title":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","link":"#深拷贝与浅拷贝","children":[{"level":3,"title":"浅拷贝","slug":"浅拷贝","link":"#浅拷贝","children":[]},{"level":3,"title":"深拷贝","slug":"深拷贝","link":"#深拷贝","children":[]},{"level":3,"title":"完整代码","slug":"完整代码","link":"#完整代码","children":[]}]},{"level":2,"title":"事件总线","slug":"事件总线","link":"#事件总线","children":[]}],"relativePath":"note/JavaScriptEnhanced.md","lastUpdated":1675780846000}'),F={name:"note/JavaScriptEnhanced.md"},D=l(`

JavaScript 高级教程

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

js
// 定义一个函数
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const p="/assets/image-20221118222207332-16687813334481.64935e06.png",o="/assets/image-20221118222311200-16687813941873.8c07f79f.png",e="/assets/image-20221122103111654.29f48e34.png",c="/assets/image-20221122103256116.b7d76f81.png",r="/assets/image-20221122103715428.587185d1.png",t="/assets/image-20221125090752249.baeedc2b.png",y="/assets/image-20221125094148365.3adfbe2d.png",g=JSON.parse('{"title":"JavaScript 高级教程","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[{"level":3,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[]},{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]},{"level":3,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]},{"level":3,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}]},{"level":2,"title":"原型与继承","slug":"原型与继承","link":"#原型与继承","children":[{"level":3,"title":"原型有什么作用?","slug":"原型有什么作用","link":"#原型有什么作用","children":[]},{"level":3,"title":"函数的显式原型","slug":"函数的显式原型","link":"#函数的显式原型","children":[]},{"level":3,"title":"Object的原型","slug":"object的原型","link":"#object的原型","children":[]},{"level":3,"title":"原型链实现继承","slug":"原型链实现继承","link":"#原型链实现继承","children":[]},{"level":3,"title":"创建原型对象的方法","slug":"创建原型对象的方法","link":"#创建原型对象的方法","children":[]},{"level":3,"title":"对象方法补充","slug":"对象方法补充","link":"#对象方法补充","children":[]},{"level":3,"title":"解读原型继承关系图","slug":"解读原型继承关系图","link":"#解读原型继承关系图","children":[]},{"level":3,"title":"构造函数的类方法","slug":"构造函数的类方法","link":"#构造函数的类方法","children":[]}]},{"level":2,"title":"ES6继承","slug":"es6继承","link":"#es6继承","children":[{"level":3,"title":"与function的异同","slug":"与function的异同","link":"#与function的异同","children":[]},{"level":3,"title":"定义访问器方法","slug":"定义访问器方法","link":"#定义访问器方法","children":[]},{"level":3,"title":"类的静态方法","slug":"类的静态方法","link":"#类的静态方法","children":[]},{"level":3,"title":"extends实现继承","slug":"extends实现继承","link":"#extends实现继承","children":[]},{"level":3,"title":"继承自默认类","slug":"继承自默认类","link":"#继承自默认类","children":[]},{"level":3,"title":"类的混入mixin","slug":"类的混入mixin","link":"#类的混入mixin","children":[]},{"level":3,"title":"Babel是如何转化ES6的","slug":"babel是如何转化es6的","link":"#babel是如何转化es6的","children":[]}]},{"level":2,"title":"浏览器运行原理","slug":"浏览器运行原理","link":"#浏览器运行原理","children":[{"level":3,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":3,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]}]},{"level":2,"title":"JavaScript 运行原理","slug":"javascript-运行原理","link":"#javascript-运行原理","children":[{"level":3,"title":"JS代码的执行","slug":"js代码的执行","link":"#js代码的执行","children":[]},{"level":3,"title":"JavaScript V8引擎","slug":"javascript-v8引擎","link":"#javascript-v8引擎","children":[]},{"level":3,"title":"JavaScript代码执行过程","slug":"javascript代码执行过程","link":"#javascript代码执行过程","children":[]}]},{"level":2,"title":"Proxy与Reflect","slug":"proxy与reflect","link":"#proxy与reflect","children":[{"level":3,"title":"监听对象方法","slug":"监听对象方法","link":"#监听对象方法","children":[]},{"level":3,"title":"Proxy","slug":"proxy","link":"#proxy","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"理解Proxy与Reflect中的receiver参数","slug":"理解proxy与reflect中的receiver参数","link":"#理解proxy与reflect中的receiver参数","children":[]}]},{"level":2,"title":"Promise详解","slug":"promise详解","link":"#promise详解","children":[{"level":3,"title":"异步代码","slug":"异步代码","link":"#异步代码","children":[]},{"level":3,"title":"认识Promise","slug":"认识promise","link":"#认识promise","children":[]},{"level":3,"title":"Promise类方法","slug":"promise类方法","link":"#promise类方法","children":[]}]},{"level":2,"title":"迭代器与生成器","slug":"迭代器与生成器","link":"#迭代器与生成器","children":[{"level":3,"title":"异步处理","slug":"异步处理","link":"#异步处理","children":[]}]},{"level":2,"title":"let与const","slug":"let与const","link":"#let与const","children":[{"level":3,"title":"作用域提升","slug":"作用域提升","link":"#作用域提升","children":[]},{"level":3,"title":"暂时性死区","slug":"暂时性死区","link":"#暂时性死区","children":[]},{"level":3,"title":"变量保存位置","slug":"变量保存位置","link":"#变量保存位置","children":[]},{"level":3,"title":"块级作用域","slug":"块级作用域","link":"#块级作用域","children":[]},{"level":3,"title":"开发中的应用","slug":"开发中的应用","link":"#开发中的应用","children":[]}]},{"level":2,"title":"await async 事件循环","slug":"await-async-事件循环","link":"#await-async-事件循环","children":[{"level":3,"title":"异步函数 async","slug":"异步函数-async","link":"#异步函数-async","children":[]},{"level":3,"title":"await关键字","slug":"await关键字","link":"#await关键字","children":[]},{"level":3,"title":"进程与线程","slug":"进程与线程","link":"#进程与线程","children":[]},{"level":3,"title":"JavaScript线程","slug":"javascript线程","link":"#javascript线程","children":[]},{"level":3,"title":"微任务与宏任务","slug":"微任务与宏任务","link":"#微任务与宏任务","children":[]},{"level":3,"title":"事件循环 面试题","slug":"事件循环-面试题","link":"#事件循环-面试题","children":[]},{"level":3,"title":"Node事件循环","slug":"node事件循环","link":"#node事件循环","children":[]}]},{"level":2,"title":"防抖与节流","slug":"防抖与节流","link":"#防抖与节流","children":[{"level":3,"title":"防抖函数","slug":"防抖函数","link":"#防抖函数","children":[]},{"level":3,"title":"节流函数","slug":"节流函数","link":"#节流函数","children":[]}]},{"level":2,"title":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","link":"#深拷贝与浅拷贝","children":[{"level":3,"title":"浅拷贝","slug":"浅拷贝","link":"#浅拷贝","children":[]},{"level":3,"title":"深拷贝","slug":"深拷贝","link":"#深拷贝","children":[]},{"level":3,"title":"完整代码","slug":"完整代码","link":"#完整代码","children":[]}]},{"level":2,"title":"事件总线","slug":"事件总线","link":"#事件总线","children":[]}],"relativePath":"note/JavaScriptEnhanced.md","lastUpdated":1675783866000}'),F={name:"note/JavaScriptEnhanced.md"},D=l(`

JavaScript 高级教程

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

js
// 定义一个函数
 function foo() {
   console.log(this)
 }
diff --git a/assets/note_JavaScriptEnhanced.md.14bd6be0.lean.js b/assets/note_JavaScriptEnhanced.md.e445eea3.lean.js
similarity index 98%
rename from assets/note_JavaScriptEnhanced.md.14bd6be0.lean.js
rename to assets/note_JavaScriptEnhanced.md.e445eea3.lean.js
index eea7cea8..8b06e7f8 100644
--- a/assets/note_JavaScriptEnhanced.md.14bd6be0.lean.js
+++ b/assets/note_JavaScriptEnhanced.md.e445eea3.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,a as l}from"./app.a81d7d4f.js";const p="/assets/image-20221118222207332-16687813334481.64935e06.png",o="/assets/image-20221118222311200-16687813941873.8c07f79f.png",e="/assets/image-20221122103111654.29f48e34.png",c="/assets/image-20221122103256116.b7d76f81.png",r="/assets/image-20221122103715428.587185d1.png",t="/assets/image-20221125090752249.baeedc2b.png",y="/assets/image-20221125094148365.3adfbe2d.png",g=JSON.parse('{"title":"JavaScript 高级教程","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[{"level":3,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[]},{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]},{"level":3,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]},{"level":3,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}]},{"level":2,"title":"原型与继承","slug":"原型与继承","link":"#原型与继承","children":[{"level":3,"title":"原型有什么作用?","slug":"原型有什么作用","link":"#原型有什么作用","children":[]},{"level":3,"title":"函数的显式原型","slug":"函数的显式原型","link":"#函数的显式原型","children":[]},{"level":3,"title":"Object的原型","slug":"object的原型","link":"#object的原型","children":[]},{"level":3,"title":"原型链实现继承","slug":"原型链实现继承","link":"#原型链实现继承","children":[]},{"level":3,"title":"创建原型对象的方法","slug":"创建原型对象的方法","link":"#创建原型对象的方法","children":[]},{"level":3,"title":"对象方法补充","slug":"对象方法补充","link":"#对象方法补充","children":[]},{"level":3,"title":"解读原型继承关系图","slug":"解读原型继承关系图","link":"#解读原型继承关系图","children":[]},{"level":3,"title":"构造函数的类方法","slug":"构造函数的类方法","link":"#构造函数的类方法","children":[]}]},{"level":2,"title":"ES6继承","slug":"es6继承","link":"#es6继承","children":[{"level":3,"title":"与function的异同","slug":"与function的异同","link":"#与function的异同","children":[]},{"level":3,"title":"定义访问器方法","slug":"定义访问器方法","link":"#定义访问器方法","children":[]},{"level":3,"title":"类的静态方法","slug":"类的静态方法","link":"#类的静态方法","children":[]},{"level":3,"title":"extends实现继承","slug":"extends实现继承","link":"#extends实现继承","children":[]},{"level":3,"title":"继承自默认类","slug":"继承自默认类","link":"#继承自默认类","children":[]},{"level":3,"title":"类的混入mixin","slug":"类的混入mixin","link":"#类的混入mixin","children":[]},{"level":3,"title":"Babel是如何转化ES6的","slug":"babel是如何转化es6的","link":"#babel是如何转化es6的","children":[]}]},{"level":2,"title":"浏览器运行原理","slug":"浏览器运行原理","link":"#浏览器运行原理","children":[{"level":3,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":3,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]}]},{"level":2,"title":"JavaScript 运行原理","slug":"javascript-运行原理","link":"#javascript-运行原理","children":[{"level":3,"title":"JS代码的执行","slug":"js代码的执行","link":"#js代码的执行","children":[]},{"level":3,"title":"JavaScript V8引擎","slug":"javascript-v8引擎","link":"#javascript-v8引擎","children":[]},{"level":3,"title":"JavaScript代码执行过程","slug":"javascript代码执行过程","link":"#javascript代码执行过程","children":[]}]},{"level":2,"title":"Proxy与Reflect","slug":"proxy与reflect","link":"#proxy与reflect","children":[{"level":3,"title":"监听对象方法","slug":"监听对象方法","link":"#监听对象方法","children":[]},{"level":3,"title":"Proxy","slug":"proxy","link":"#proxy","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"理解Proxy与Reflect中的receiver参数","slug":"理解proxy与reflect中的receiver参数","link":"#理解proxy与reflect中的receiver参数","children":[]}]},{"level":2,"title":"Promise详解","slug":"promise详解","link":"#promise详解","children":[{"level":3,"title":"异步代码","slug":"异步代码","link":"#异步代码","children":[]},{"level":3,"title":"认识Promise","slug":"认识promise","link":"#认识promise","children":[]},{"level":3,"title":"Promise类方法","slug":"promise类方法","link":"#promise类方法","children":[]}]},{"level":2,"title":"迭代器与生成器","slug":"迭代器与生成器","link":"#迭代器与生成器","children":[{"level":3,"title":"异步处理","slug":"异步处理","link":"#异步处理","children":[]}]},{"level":2,"title":"let与const","slug":"let与const","link":"#let与const","children":[{"level":3,"title":"作用域提升","slug":"作用域提升","link":"#作用域提升","children":[]},{"level":3,"title":"暂时性死区","slug":"暂时性死区","link":"#暂时性死区","children":[]},{"level":3,"title":"变量保存位置","slug":"变量保存位置","link":"#变量保存位置","children":[]},{"level":3,"title":"块级作用域","slug":"块级作用域","link":"#块级作用域","children":[]},{"level":3,"title":"开发中的应用","slug":"开发中的应用","link":"#开发中的应用","children":[]}]},{"level":2,"title":"await async 事件循环","slug":"await-async-事件循环","link":"#await-async-事件循环","children":[{"level":3,"title":"异步函数 async","slug":"异步函数-async","link":"#异步函数-async","children":[]},{"level":3,"title":"await关键字","slug":"await关键字","link":"#await关键字","children":[]},{"level":3,"title":"进程与线程","slug":"进程与线程","link":"#进程与线程","children":[]},{"level":3,"title":"JavaScript线程","slug":"javascript线程","link":"#javascript线程","children":[]},{"level":3,"title":"微任务与宏任务","slug":"微任务与宏任务","link":"#微任务与宏任务","children":[]},{"level":3,"title":"事件循环 面试题","slug":"事件循环-面试题","link":"#事件循环-面试题","children":[]},{"level":3,"title":"Node事件循环","slug":"node事件循环","link":"#node事件循环","children":[]}]},{"level":2,"title":"防抖与节流","slug":"防抖与节流","link":"#防抖与节流","children":[{"level":3,"title":"防抖函数","slug":"防抖函数","link":"#防抖函数","children":[]},{"level":3,"title":"节流函数","slug":"节流函数","link":"#节流函数","children":[]}]},{"level":2,"title":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","link":"#深拷贝与浅拷贝","children":[{"level":3,"title":"浅拷贝","slug":"浅拷贝","link":"#浅拷贝","children":[]},{"level":3,"title":"深拷贝","slug":"深拷贝","link":"#深拷贝","children":[]},{"level":3,"title":"完整代码","slug":"完整代码","link":"#完整代码","children":[]}]},{"level":2,"title":"事件总线","slug":"事件总线","link":"#事件总线","children":[]}],"relativePath":"note/JavaScriptEnhanced.md","lastUpdated":1675780846000}'),F={name:"note/JavaScriptEnhanced.md"},D=l("",660),i=[D];function A(C,b,u,d,m,h){return n(),a("div",null,i)}const E=s(F,[["render",A]]);export{g as __pageData,E as default};
+import{_ as s,o as n,c as a,a as l}from"./app.94d5b31a.js";const p="/assets/image-20221118222207332-16687813334481.64935e06.png",o="/assets/image-20221118222311200-16687813941873.8c07f79f.png",e="/assets/image-20221122103111654.29f48e34.png",c="/assets/image-20221122103256116.b7d76f81.png",r="/assets/image-20221122103715428.587185d1.png",t="/assets/image-20221125090752249.baeedc2b.png",y="/assets/image-20221125094148365.3adfbe2d.png",g=JSON.parse('{"title":"JavaScript 高级教程","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"函数中this指向","slug":"函数中this指向","link":"#函数中this指向","children":[{"level":3,"title":"如何改变this的指向","slug":"如何改变this的指向","link":"#如何改变this的指向","children":[]},{"level":3,"title":"new 实例化一个函数","slug":"new-实例化一个函数","link":"#new-实例化一个函数","children":[]},{"level":3,"title":"使用 call apply bind","slug":"使用-call-apply-bind","link":"#使用-call-apply-bind","children":[]},{"level":3,"title":"箭头函数","slug":"箭头函数","link":"#箭头函数","children":[]},{"level":3,"title":"严格模式","slug":"严格模式","link":"#严格模式","children":[]},{"level":3,"title":"this面试题","slug":"this面试题","link":"#this面试题","children":[]}]},{"level":2,"title":"原型与继承","slug":"原型与继承","link":"#原型与继承","children":[{"level":3,"title":"原型有什么作用?","slug":"原型有什么作用","link":"#原型有什么作用","children":[]},{"level":3,"title":"函数的显式原型","slug":"函数的显式原型","link":"#函数的显式原型","children":[]},{"level":3,"title":"Object的原型","slug":"object的原型","link":"#object的原型","children":[]},{"level":3,"title":"原型链实现继承","slug":"原型链实现继承","link":"#原型链实现继承","children":[]},{"level":3,"title":"创建原型对象的方法","slug":"创建原型对象的方法","link":"#创建原型对象的方法","children":[]},{"level":3,"title":"对象方法补充","slug":"对象方法补充","link":"#对象方法补充","children":[]},{"level":3,"title":"解读原型继承关系图","slug":"解读原型继承关系图","link":"#解读原型继承关系图","children":[]},{"level":3,"title":"构造函数的类方法","slug":"构造函数的类方法","link":"#构造函数的类方法","children":[]}]},{"level":2,"title":"ES6继承","slug":"es6继承","link":"#es6继承","children":[{"level":3,"title":"与function的异同","slug":"与function的异同","link":"#与function的异同","children":[]},{"level":3,"title":"定义访问器方法","slug":"定义访问器方法","link":"#定义访问器方法","children":[]},{"level":3,"title":"类的静态方法","slug":"类的静态方法","link":"#类的静态方法","children":[]},{"level":3,"title":"extends实现继承","slug":"extends实现继承","link":"#extends实现继承","children":[]},{"level":3,"title":"继承自默认类","slug":"继承自默认类","link":"#继承自默认类","children":[]},{"level":3,"title":"类的混入mixin","slug":"类的混入mixin","link":"#类的混入mixin","children":[]},{"level":3,"title":"Babel是如何转化ES6的","slug":"babel是如何转化es6的","link":"#babel是如何转化es6的","children":[]}]},{"level":2,"title":"浏览器运行原理","slug":"浏览器运行原理","link":"#浏览器运行原理","children":[{"level":3,"title":"网页解析过程","slug":"网页解析过程","link":"#网页解析过程","children":[]},{"level":3,"title":"浏览器对script元素的处理","slug":"浏览器对script元素的处理","link":"#浏览器对script元素的处理","children":[]}]},{"level":2,"title":"JavaScript 运行原理","slug":"javascript-运行原理","link":"#javascript-运行原理","children":[{"level":3,"title":"JS代码的执行","slug":"js代码的执行","link":"#js代码的执行","children":[]},{"level":3,"title":"JavaScript V8引擎","slug":"javascript-v8引擎","link":"#javascript-v8引擎","children":[]},{"level":3,"title":"JavaScript代码执行过程","slug":"javascript代码执行过程","link":"#javascript代码执行过程","children":[]}]},{"level":2,"title":"Proxy与Reflect","slug":"proxy与reflect","link":"#proxy与reflect","children":[{"level":3,"title":"监听对象方法","slug":"监听对象方法","link":"#监听对象方法","children":[]},{"level":3,"title":"Proxy","slug":"proxy","link":"#proxy","children":[]},{"level":3,"title":"Reflect","slug":"reflect","link":"#reflect","children":[]},{"level":3,"title":"理解Proxy与Reflect中的receiver参数","slug":"理解proxy与reflect中的receiver参数","link":"#理解proxy与reflect中的receiver参数","children":[]}]},{"level":2,"title":"Promise详解","slug":"promise详解","link":"#promise详解","children":[{"level":3,"title":"异步代码","slug":"异步代码","link":"#异步代码","children":[]},{"level":3,"title":"认识Promise","slug":"认识promise","link":"#认识promise","children":[]},{"level":3,"title":"Promise类方法","slug":"promise类方法","link":"#promise类方法","children":[]}]},{"level":2,"title":"迭代器与生成器","slug":"迭代器与生成器","link":"#迭代器与生成器","children":[{"level":3,"title":"异步处理","slug":"异步处理","link":"#异步处理","children":[]}]},{"level":2,"title":"let与const","slug":"let与const","link":"#let与const","children":[{"level":3,"title":"作用域提升","slug":"作用域提升","link":"#作用域提升","children":[]},{"level":3,"title":"暂时性死区","slug":"暂时性死区","link":"#暂时性死区","children":[]},{"level":3,"title":"变量保存位置","slug":"变量保存位置","link":"#变量保存位置","children":[]},{"level":3,"title":"块级作用域","slug":"块级作用域","link":"#块级作用域","children":[]},{"level":3,"title":"开发中的应用","slug":"开发中的应用","link":"#开发中的应用","children":[]}]},{"level":2,"title":"await async 事件循环","slug":"await-async-事件循环","link":"#await-async-事件循环","children":[{"level":3,"title":"异步函数 async","slug":"异步函数-async","link":"#异步函数-async","children":[]},{"level":3,"title":"await关键字","slug":"await关键字","link":"#await关键字","children":[]},{"level":3,"title":"进程与线程","slug":"进程与线程","link":"#进程与线程","children":[]},{"level":3,"title":"JavaScript线程","slug":"javascript线程","link":"#javascript线程","children":[]},{"level":3,"title":"微任务与宏任务","slug":"微任务与宏任务","link":"#微任务与宏任务","children":[]},{"level":3,"title":"事件循环 面试题","slug":"事件循环-面试题","link":"#事件循环-面试题","children":[]},{"level":3,"title":"Node事件循环","slug":"node事件循环","link":"#node事件循环","children":[]}]},{"level":2,"title":"防抖与节流","slug":"防抖与节流","link":"#防抖与节流","children":[{"level":3,"title":"防抖函数","slug":"防抖函数","link":"#防抖函数","children":[]},{"level":3,"title":"节流函数","slug":"节流函数","link":"#节流函数","children":[]}]},{"level":2,"title":"深拷贝与浅拷贝","slug":"深拷贝与浅拷贝","link":"#深拷贝与浅拷贝","children":[{"level":3,"title":"浅拷贝","slug":"浅拷贝","link":"#浅拷贝","children":[]},{"level":3,"title":"深拷贝","slug":"深拷贝","link":"#深拷贝","children":[]},{"level":3,"title":"完整代码","slug":"完整代码","link":"#完整代码","children":[]}]},{"level":2,"title":"事件总线","slug":"事件总线","link":"#事件总线","children":[]}],"relativePath":"note/JavaScriptEnhanced.md","lastUpdated":1675783866000}'),F={name:"note/JavaScriptEnhanced.md"},D=l("",660),i=[D];function A(C,b,u,d,m,h){return n(),a("div",null,i)}const E=s(F,[["render",A]]);export{g as __pageData,E as default};
diff --git a/assets/project_ClipboardManager_guide_index.md.0b657832.js b/assets/project_ClipboardManager_guide_index.md.a1b2b7e7.js
similarity index 99%
rename from assets/project_ClipboardManager_guide_index.md.0b657832.js
rename to assets/project_ClipboardManager_guide_index.md.a1b2b7e7.js
index d6f72f0f..dfa1952a 100644
--- a/assets/project_ClipboardManager_guide_index.md.0b657832.js
+++ b/assets/project_ClipboardManager_guide_index.md.a1b2b7e7.js
@@ -1,4 +1,4 @@
-import{_ as l,r as p,o as c,c as t,b as s,d as e,e as n,a as o}from"./app.a81d7d4f.js";const r="/assets/gi1.b601202a.png",i="/assets/gi2.e2b1f9d9.png",d="/assets/gi3.c83cee76.png",D="/assets/gi3-2.8cc1f8a9.png",h="/assets/gi3-3.47dffc9b.png",u="/assets/sign-mac.2c3e272f.png",F="/assets/sign-mac-2.5861d44c.png",y="/assets/mac-chmod.bf888724.jpg",g="/assets/guide-jianguo-1.a7e6fa82.png",b="/assets/guide-jianguo-2.14924b1b.png",m="/assets/gi4.e4051a3e.png",C="/assets/gi5.f517b425.png",I=JSON.parse('{"title":"使用指南","description":"","frontmatter":{},"headers":[{"level":2,"title":"如何手动安装clipboard-event-handler","slug":"如何手动安装clipboard-event-handler","link":"#如何手动安装clipboard-event-handler","children":[{"level":3,"title":"1. 下载监听程序","slug":"_1-下载监听程序","link":"#_1-下载监听程序","children":[]},{"level":3,"title":"2. 找到剪贴板数据文件所在目录","slug":"_2-找到剪贴板数据文件所在目录","link":"#_2-找到剪贴板数据文件所在目录","children":[]},{"level":3,"title":"3. 将监听程序拷贝到目录中","slug":"_3-将监听程序拷贝到目录中","link":"#_3-将监听程序拷贝到目录中","children":[]},{"level":3,"title":"4. 【重要】注意事项","slug":"_4-【重要】注意事项","link":"#_4-【重要】注意事项","children":[]}]},{"level":2,"title":"如何实现多端同步","slug":"如何实现多端同步","link":"#如何实现多端同步","children":[{"level":3,"title":"WebDav同步","slug":"webdav同步","link":"#webdav同步","children":[]},{"level":3,"title":"坚果云同步文件夹","slug":"坚果云同步文件夹","link":"#坚果云同步文件夹","children":[]},{"level":3,"title":"OneDrive","slug":"onedrive","link":"#onedrive","children":[]}]},{"level":2,"title":"快捷键一览","slug":"快捷键一览","link":"#快捷键一览","children":[]},{"level":2,"title":"如何迁移数据","slug":"如何迁移数据","link":"#如何迁移数据","children":[]},{"level":2,"title":"如何创造自己的功能按钮","slug":"如何创造自己的功能按钮","link":"#如何创造自己的功能按钮","children":[]}],"relativePath":"project/ClipboardManager/guide/index.md","lastUpdated":1675780846000}'),_={name:"project/ClipboardManager/guide/index.md"},A=o('

使用指南

如何手动安装clipboard-event-handler

新版 超级剪贴板 对剪贴板内容更新事件的监听,依赖于可执行文件:

  • Windows系统: clipboard-event-handler-win32.exe
  • Linux系统: clipboard-event-handler-linux
  • MacOS系统: clipboard-event-handler-mac

插件每次启动时,将自动检查剪贴板数据文件所在目录下是否存在剪贴板监听程序,如存在,则使用性能更优秀的新的监听策略,如不存在,则仍然使用旧的策略。


1. 下载监听程序

点击此处(百度网盘)或访问node-clipboard-event手动下载对应系统的文件,并将其移动到剪贴板数据文件所在目录

插件使用的二进制文件拷贝自node-clipboard-event,请避免从其它不可信的来源下载文件,并在下载文件后比较哈希,有能力的也可以从仓库源代码自行编译

2. 找到剪贴板数据文件所在目录

进入插件设置页(右上角💡按钮),打开插件数据文件所在路径:

3. 将监听程序拷贝到目录中

Windows:

Linux:

Mac:

4. 【重要】注意事项

MacOS需要特殊配置

MacOS拷贝完成后需要对插件进行签名&授权才能正常使用具体步骤如下

1. 签名

打开终端输入以下命令

sh
sudo codesign --force --deep --sign - 
+import{_ as l,r as p,o as c,c as t,b as s,d as e,e as n,a as o}from"./app.94d5b31a.js";const r="/assets/gi1.b601202a.png",i="/assets/gi2.e2b1f9d9.png",d="/assets/gi3.c83cee76.png",D="/assets/gi3-2.8cc1f8a9.png",h="/assets/gi3-3.47dffc9b.png",u="/assets/sign-mac.2c3e272f.png",F="/assets/sign-mac-2.5861d44c.png",y="/assets/mac-chmod.bf888724.jpg",g="/assets/guide-jianguo-1.a7e6fa82.png",b="/assets/guide-jianguo-2.14924b1b.png",m="/assets/gi4.e4051a3e.png",C="/assets/gi5.f517b425.png",I=JSON.parse('{"title":"使用指南","description":"","frontmatter":{},"headers":[{"level":2,"title":"如何手动安装clipboard-event-handler","slug":"如何手动安装clipboard-event-handler","link":"#如何手动安装clipboard-event-handler","children":[{"level":3,"title":"1. 下载监听程序","slug":"_1-下载监听程序","link":"#_1-下载监听程序","children":[]},{"level":3,"title":"2. 找到剪贴板数据文件所在目录","slug":"_2-找到剪贴板数据文件所在目录","link":"#_2-找到剪贴板数据文件所在目录","children":[]},{"level":3,"title":"3. 将监听程序拷贝到目录中","slug":"_3-将监听程序拷贝到目录中","link":"#_3-将监听程序拷贝到目录中","children":[]},{"level":3,"title":"4. 【重要】注意事项","slug":"_4-【重要】注意事项","link":"#_4-【重要】注意事项","children":[]}]},{"level":2,"title":"如何实现多端同步","slug":"如何实现多端同步","link":"#如何实现多端同步","children":[{"level":3,"title":"WebDav同步","slug":"webdav同步","link":"#webdav同步","children":[]},{"level":3,"title":"坚果云同步文件夹","slug":"坚果云同步文件夹","link":"#坚果云同步文件夹","children":[]},{"level":3,"title":"OneDrive","slug":"onedrive","link":"#onedrive","children":[]}]},{"level":2,"title":"快捷键一览","slug":"快捷键一览","link":"#快捷键一览","children":[]},{"level":2,"title":"如何迁移数据","slug":"如何迁移数据","link":"#如何迁移数据","children":[]},{"level":2,"title":"如何创造自己的功能按钮","slug":"如何创造自己的功能按钮","link":"#如何创造自己的功能按钮","children":[]}],"relativePath":"project/ClipboardManager/guide/index.md","lastUpdated":1675783866000}'),_={name:"project/ClipboardManager/guide/index.md"},A=o('

使用指南

如何手动安装clipboard-event-handler

新版 超级剪贴板 对剪贴板内容更新事件的监听,依赖于可执行文件:

  • Windows系统: clipboard-event-handler-win32.exe
  • Linux系统: clipboard-event-handler-linux
  • MacOS系统: clipboard-event-handler-mac

插件每次启动时,将自动检查剪贴板数据文件所在目录下是否存在剪贴板监听程序,如存在,则使用性能更优秀的新的监听策略,如不存在,则仍然使用旧的策略。


1. 下载监听程序

点击此处(百度网盘)或访问node-clipboard-event手动下载对应系统的文件,并将其移动到剪贴板数据文件所在目录

插件使用的二进制文件拷贝自node-clipboard-event,请避免从其它不可信的来源下载文件,并在下载文件后比较哈希,有能力的也可以从仓库源代码自行编译

2. 找到剪贴板数据文件所在目录

进入插件设置页(右上角💡按钮),打开插件数据文件所在路径:

3. 将监听程序拷贝到目录中

Windows:

Linux:

Mac:

4. 【重要】注意事项

MacOS需要特殊配置

MacOS拷贝完成后需要对插件进行签名&授权才能正常使用具体步骤如下

1. 签名

打开终端输入以下命令

sh
sudo codesign --force --deep --sign - 
 

然后将此目录中的clipboard-event-handler-mac文件拖入终端执行命令

2. 授权

左上角🍎 -> 系统偏好设置 -> 安全性与隐私 -> 通用 -> 点击允许

监听程序不生效如何排查?

请务必完整按照教程完成安装,如果程序仍未生效,请按照如下方式排查:

  • 监听程序拷贝完成后,需要重启插件方可生效
  • 设置页剪贴板监听程序状态选项是否为已安装
  • 系统进程管理器中是否存在clipboard-event-handler-xxxxx的进程

使用中遇到任何问题,请尝试通过论坛或加入QQ群反馈

如何实现多端同步

',36),v={id:"webdav同步",tabindex:"-1"},q=s("a",{class:"header-anchor",href:"#webdav同步","aria-hidden":"true"},"#",-1),f=s("div",{class:"tip custom-block"},[s("p",{class:"custom-block-title"},"TIP"),s("p",null,[e("自"),s("code",null,"v2.0.0"),e("起,可以通过开通插件会员启用"),s("strong",null,"WebDav同步功能")])],-1),x=s("p",null,[e("👉👉👉"),s("a",{href:"./../vip/#webdav同步功能"},"插件会员/WebDav同步功能"),e("👈👈👈")],-1),E={id:"坚果云同步文件夹",tabindex:"-1"},k=s("a",{class:"header-anchor",href:"#坚果云同步文件夹","aria-hidden":"true"},"#",-1),w=o('

WARNING

以下方法仅适用于v2.0.0之前的版本

数据库文件默认是直接存放在用户文件夹根目录下的,如果需要使用同步功能,请使用插件内提供的数据库路径自定义功能,将数据库路径改为其他路径,而后才能通过下文中讲述的同步文件夹实现云同步。

坚果云官网安装好软件后,找到_utools_clipboard_manager_storage文件所在的目录

右键目录,坚果云/同步该文件夹,将此文件夹加入到坚果云的同步服务中

这样,每次剪贴板内容更新都将自动触发坚果云的同步服务,将剪贴板数据同步到云端

其他安装了坚果云的设备也将自动同步更新

OneDrive

有待测试

快捷键一览

  • Shift进入多选模式 按下空格连续向下选择 支持跨标签合并复制/粘贴
  • 鼠标左键复制并粘贴 鼠标右键仅复制
  • 选中历史记录 按下直接粘贴
  • 切换分类 Tab键连续切换分类
  • Ctrl/Alt+数字键 快速粘贴
  • 输入任意字母或数字自动聚焦搜索框 支持使用空格同时检索多个关键词

如何迁移数据

剪贴板数据默认存放在

  • Windows Linux用户:{home}\\_utools_clipboard_manager_storage
  • Mac用户:{userData}\\_utools_clipboard_manager_storage

也可以在设置页中点击按钮打开数据库路径。要手动迁移数据,只需要在新设备上运行一次插件,而后将原设备上的数据文件拷贝并替换新设备中的数据文件即可

如何创造自己的功能按钮

v1.4.0起,插件为用户提供了自定义功能按钮的能力

这让超级剪贴板真正变得“超级”起来,用户可以通过编写json实现携带数据跳转到任何其他插件,这项功能给超级剪贴板带来了无限可能。

插件中,默认内置了若干使用样例:

  • 讯飞OCR识别
  • 百度搜索
  • 百度识图
  • 统计文本字数
  • 颜色管理
  • 识别图片中二维码
  • 上传到图床
  • 翻译

下面我将从这些样例出发对这项功能做简单介绍:

这项功能的原理是utools.redirect(),在不分离插件的情况下,在不同插件之间的跳转体验是连贯的。

百度搜索为例,是通过网页快开提供的关键词实现的,我们可以编写以下json:

json
{
   "id": "custom.1663490859",
   "title": "百度搜索",
diff --git a/assets/project_ClipboardManager_guide_index.md.0b657832.lean.js b/assets/project_ClipboardManager_guide_index.md.a1b2b7e7.lean.js
similarity index 96%
rename from assets/project_ClipboardManager_guide_index.md.0b657832.lean.js
rename to assets/project_ClipboardManager_guide_index.md.a1b2b7e7.lean.js
index 22697bdf..bcd6e494 100644
--- a/assets/project_ClipboardManager_guide_index.md.0b657832.lean.js
+++ b/assets/project_ClipboardManager_guide_index.md.a1b2b7e7.lean.js
@@ -1 +1 @@
-import{_ as l,r as p,o as c,c as t,b as s,d as e,e as n,a as o}from"./app.a81d7d4f.js";const r="/assets/gi1.b601202a.png",i="/assets/gi2.e2b1f9d9.png",d="/assets/gi3.c83cee76.png",D="/assets/gi3-2.8cc1f8a9.png",h="/assets/gi3-3.47dffc9b.png",u="/assets/sign-mac.2c3e272f.png",F="/assets/sign-mac-2.5861d44c.png",y="/assets/mac-chmod.bf888724.jpg",g="/assets/guide-jianguo-1.a7e6fa82.png",b="/assets/guide-jianguo-2.14924b1b.png",m="/assets/gi4.e4051a3e.png",C="/assets/gi5.f517b425.png",I=JSON.parse('{"title":"使用指南","description":"","frontmatter":{},"headers":[{"level":2,"title":"如何手动安装clipboard-event-handler","slug":"如何手动安装clipboard-event-handler","link":"#如何手动安装clipboard-event-handler","children":[{"level":3,"title":"1. 下载监听程序","slug":"_1-下载监听程序","link":"#_1-下载监听程序","children":[]},{"level":3,"title":"2. 找到剪贴板数据文件所在目录","slug":"_2-找到剪贴板数据文件所在目录","link":"#_2-找到剪贴板数据文件所在目录","children":[]},{"level":3,"title":"3. 将监听程序拷贝到目录中","slug":"_3-将监听程序拷贝到目录中","link":"#_3-将监听程序拷贝到目录中","children":[]},{"level":3,"title":"4. 【重要】注意事项","slug":"_4-【重要】注意事项","link":"#_4-【重要】注意事项","children":[]}]},{"level":2,"title":"如何实现多端同步","slug":"如何实现多端同步","link":"#如何实现多端同步","children":[{"level":3,"title":"WebDav同步","slug":"webdav同步","link":"#webdav同步","children":[]},{"level":3,"title":"坚果云同步文件夹","slug":"坚果云同步文件夹","link":"#坚果云同步文件夹","children":[]},{"level":3,"title":"OneDrive","slug":"onedrive","link":"#onedrive","children":[]}]},{"level":2,"title":"快捷键一览","slug":"快捷键一览","link":"#快捷键一览","children":[]},{"level":2,"title":"如何迁移数据","slug":"如何迁移数据","link":"#如何迁移数据","children":[]},{"level":2,"title":"如何创造自己的功能按钮","slug":"如何创造自己的功能按钮","link":"#如何创造自己的功能按钮","children":[]}],"relativePath":"project/ClipboardManager/guide/index.md","lastUpdated":1675780846000}'),_={name:"project/ClipboardManager/guide/index.md"},A=o("",36),v={id:"webdav同步",tabindex:"-1"},q=s("a",{class:"header-anchor",href:"#webdav同步","aria-hidden":"true"},"#",-1),f=s("div",{class:"tip custom-block"},[s("p",{class:"custom-block-title"},"TIP"),s("p",null,[e("自"),s("code",null,"v2.0.0"),e("起,可以通过开通插件会员启用"),s("strong",null,"WebDav同步功能")])],-1),x=s("p",null,[e("👉👉👉"),s("a",{href:"./../vip/#webdav同步功能"},"插件会员/WebDav同步功能"),e("👈👈👈")],-1),E={id:"坚果云同步文件夹",tabindex:"-1"},k=s("a",{class:"header-anchor",href:"#坚果云同步文件夹","aria-hidden":"true"},"#",-1),w=o("",32);function S(j,T,B,N,W,O){const a=p("Badge");return c(),t("div",null,[A,s("h3",v,[e("WebDav同步 "),n(a,{type:"tip",text:"^2.0.0"}),e(),q]),f,x,s("h3",E,[e("坚果云同步文件夹 "),n(a,{type:"warning",text:"仅旧版本"}),e(),k]),w])}const M=l(_,[["render",S]]);export{I as __pageData,M as default};
+import{_ as l,r as p,o as c,c as t,b as s,d as e,e as n,a as o}from"./app.94d5b31a.js";const r="/assets/gi1.b601202a.png",i="/assets/gi2.e2b1f9d9.png",d="/assets/gi3.c83cee76.png",D="/assets/gi3-2.8cc1f8a9.png",h="/assets/gi3-3.47dffc9b.png",u="/assets/sign-mac.2c3e272f.png",F="/assets/sign-mac-2.5861d44c.png",y="/assets/mac-chmod.bf888724.jpg",g="/assets/guide-jianguo-1.a7e6fa82.png",b="/assets/guide-jianguo-2.14924b1b.png",m="/assets/gi4.e4051a3e.png",C="/assets/gi5.f517b425.png",I=JSON.parse('{"title":"使用指南","description":"","frontmatter":{},"headers":[{"level":2,"title":"如何手动安装clipboard-event-handler","slug":"如何手动安装clipboard-event-handler","link":"#如何手动安装clipboard-event-handler","children":[{"level":3,"title":"1. 下载监听程序","slug":"_1-下载监听程序","link":"#_1-下载监听程序","children":[]},{"level":3,"title":"2. 找到剪贴板数据文件所在目录","slug":"_2-找到剪贴板数据文件所在目录","link":"#_2-找到剪贴板数据文件所在目录","children":[]},{"level":3,"title":"3. 将监听程序拷贝到目录中","slug":"_3-将监听程序拷贝到目录中","link":"#_3-将监听程序拷贝到目录中","children":[]},{"level":3,"title":"4. 【重要】注意事项","slug":"_4-【重要】注意事项","link":"#_4-【重要】注意事项","children":[]}]},{"level":2,"title":"如何实现多端同步","slug":"如何实现多端同步","link":"#如何实现多端同步","children":[{"level":3,"title":"WebDav同步","slug":"webdav同步","link":"#webdav同步","children":[]},{"level":3,"title":"坚果云同步文件夹","slug":"坚果云同步文件夹","link":"#坚果云同步文件夹","children":[]},{"level":3,"title":"OneDrive","slug":"onedrive","link":"#onedrive","children":[]}]},{"level":2,"title":"快捷键一览","slug":"快捷键一览","link":"#快捷键一览","children":[]},{"level":2,"title":"如何迁移数据","slug":"如何迁移数据","link":"#如何迁移数据","children":[]},{"level":2,"title":"如何创造自己的功能按钮","slug":"如何创造自己的功能按钮","link":"#如何创造自己的功能按钮","children":[]}],"relativePath":"project/ClipboardManager/guide/index.md","lastUpdated":1675783866000}'),_={name:"project/ClipboardManager/guide/index.md"},A=o("",36),v={id:"webdav同步",tabindex:"-1"},q=s("a",{class:"header-anchor",href:"#webdav同步","aria-hidden":"true"},"#",-1),f=s("div",{class:"tip custom-block"},[s("p",{class:"custom-block-title"},"TIP"),s("p",null,[e("自"),s("code",null,"v2.0.0"),e("起,可以通过开通插件会员启用"),s("strong",null,"WebDav同步功能")])],-1),x=s("p",null,[e("👉👉👉"),s("a",{href:"./../vip/#webdav同步功能"},"插件会员/WebDav同步功能"),e("👈👈👈")],-1),E={id:"坚果云同步文件夹",tabindex:"-1"},k=s("a",{class:"header-anchor",href:"#坚果云同步文件夹","aria-hidden":"true"},"#",-1),w=o("",32);function S(j,T,B,N,W,O){const a=p("Badge");return c(),t("div",null,[A,s("h3",v,[e("WebDav同步 "),n(a,{type:"tip",text:"^2.0.0"}),e(),q]),f,x,s("h3",E,[e("坚果云同步文件夹 "),n(a,{type:"warning",text:"仅旧版本"}),e(),k]),w])}const M=l(_,[["render",S]]);export{I as __pageData,M as default};
diff --git a/assets/project_ClipboardManager_index.md.315d88f3.js b/assets/project_ClipboardManager_index.md.8e0a31fd.js
similarity index 96%
rename from assets/project_ClipboardManager_index.md.315d88f3.js
rename to assets/project_ClipboardManager_index.md.8e0a31fd.js
index cc2d2a6e..3a084b1b 100644
--- a/assets/project_ClipboardManager_index.md.315d88f3.js
+++ b/assets/project_ClipboardManager_index.md.8e0a31fd.js
@@ -1 +1 @@
-import{r as t,o as c,c as r,e as a,n as d,g as i,a as l}from"./app.a81d7d4f.js";const n="/assets/hero-1.5b8b8e96.png",s="/assets/hero-2.2f9bd12d.png",g="/assets/logo.98e788ed.png",p=l('

🔰 开始使用

首次安装需要设置“跟随主程序同时启动”

  • ✅ 监听剪贴板并持续将新内容更新到本地磁盘 数据读写完全本地化
  • ✅ 快速收藏/转存/分词/复制/删除/打开文件&目标文件夹
  • ✅ 功能按钮 定义无限可能 OCR识别 百度搜索 百度识图 统计文本字数 颜色管理 识别图片中二维码 上传到图床 翻译
  • 鼠标左键 复制并粘贴 鼠标右键 仅复制
  • ✅ 按下Shift空格进入多选模式 连续选择多条内容合并复制 支持跨标签合并复制/粘贴
  • ✅ 键盘 选中历史记录,按下回车直接粘贴
  • ✅ 键盘 切换分类 Tab键连续切换分类
  • ✅ 使用 Ctrl/Alt+数字键 快速粘贴
  • ✅ 插件内输入任意字母或数字自动聚焦搜索框 支持使用空格同时检索多个关键词
  • 智慧分词 快速拖选指定内容 超级粘贴 直接转存为文件
  • ✅ 优雅的界面动效与交互 跟随系统的深色模式
  • ✅ 优秀的剪贴板监听性能 强大的自定义功能按钮 自搭建多端同步 ···

📚 安装方式

催更群 769115389 Github

',8),f=JSON.parse('{"title":"超级剪贴板","description":"","frontmatter":{"title":"超级剪贴板","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/ClipboardManager/index.md","lastUpdated":1675780846000}'),_={name:"project/ClipboardManager/index.md"},T=Object.assign(_,{setup(h){const e={subTitle:"✨ 强大的剪贴板管理工具。",logo:g,linkList:[{content:"⭐ 开源代码",target:"https://github.com/ZiuChen/ClipboardManager"},{content:"🚀 使用指南",target:"./guide/"},{content:"🌎 疑难解答",target:"./statement/"},{content:"👑 插件会员",target:"./vip/"},{content:"🚚 更新日志",target:"./log/"}]};return(u,m)=>{const o=t("Title");return c(),r("div",null,[a(o,d(i(e)),null,16),p])}}});export{f as __pageData,T as default}; +import{r as t,o as c,c as r,e as a,n as d,g as i,a as l}from"./app.94d5b31a.js";const n="/assets/hero-1.5b8b8e96.png",s="/assets/hero-2.2f9bd12d.png",g="/assets/logo.98e788ed.png",p=l('

🔰 开始使用

首次安装需要设置“跟随主程序同时启动”

  • ✅ 监听剪贴板并持续将新内容更新到本地磁盘 数据读写完全本地化
  • ✅ 快速收藏/转存/分词/复制/删除/打开文件&目标文件夹
  • ✅ 功能按钮 定义无限可能 OCR识别 百度搜索 百度识图 统计文本字数 颜色管理 识别图片中二维码 上传到图床 翻译
  • 鼠标左键 复制并粘贴 鼠标右键 仅复制
  • ✅ 按下Shift空格进入多选模式 连续选择多条内容合并复制 支持跨标签合并复制/粘贴
  • ✅ 键盘 选中历史记录,按下回车直接粘贴
  • ✅ 键盘 切换分类 Tab键连续切换分类
  • ✅ 使用 Ctrl/Alt+数字键 快速粘贴
  • ✅ 插件内输入任意字母或数字自动聚焦搜索框 支持使用空格同时检索多个关键词
  • 智慧分词 快速拖选指定内容 超级粘贴 直接转存为文件
  • ✅ 优雅的界面动效与交互 跟随系统的深色模式
  • ✅ 优秀的剪贴板监听性能 强大的自定义功能按钮 自搭建多端同步 ···

📚 安装方式

催更群 769115389 Github

',8),f=JSON.parse('{"title":"超级剪贴板","description":"","frontmatter":{"title":"超级剪贴板","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/ClipboardManager/index.md","lastUpdated":1675783866000}'),_={name:"project/ClipboardManager/index.md"},T=Object.assign(_,{setup(h){const e={subTitle:"✨ 强大的剪贴板管理工具。",logo:g,linkList:[{content:"⭐ 开源代码",target:"https://github.com/ZiuChen/ClipboardManager"},{content:"🚀 使用指南",target:"./guide/"},{content:"🌎 疑难解答",target:"./statement/"},{content:"👑 插件会员",target:"./vip/"},{content:"🚚 更新日志",target:"./log/"}]};return(u,m)=>{const o=t("Title");return c(),r("div",null,[a(o,d(i(e)),null,16),p])}}});export{f as __pageData,T as default}; diff --git a/assets/project_ClipboardManager_index.md.315d88f3.lean.js b/assets/project_ClipboardManager_index.md.8e0a31fd.lean.js similarity index 89% rename from assets/project_ClipboardManager_index.md.315d88f3.lean.js rename to assets/project_ClipboardManager_index.md.8e0a31fd.lean.js index cf973e55..04d7453d 100644 --- a/assets/project_ClipboardManager_index.md.315d88f3.lean.js +++ b/assets/project_ClipboardManager_index.md.8e0a31fd.lean.js @@ -1 +1 @@ -import{r as t,o as c,c as r,e as a,n as d,g as i,a as l}from"./app.a81d7d4f.js";const n="/assets/hero-1.5b8b8e96.png",s="/assets/hero-2.2f9bd12d.png",g="/assets/logo.98e788ed.png",p=l("",8),f=JSON.parse('{"title":"超级剪贴板","description":"","frontmatter":{"title":"超级剪贴板","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/ClipboardManager/index.md","lastUpdated":1675780846000}'),_={name:"project/ClipboardManager/index.md"},T=Object.assign(_,{setup(h){const e={subTitle:"✨ 强大的剪贴板管理工具。",logo:g,linkList:[{content:"⭐ 开源代码",target:"https://github.com/ZiuChen/ClipboardManager"},{content:"🚀 使用指南",target:"./guide/"},{content:"🌎 疑难解答",target:"./statement/"},{content:"👑 插件会员",target:"./vip/"},{content:"🚚 更新日志",target:"./log/"}]};return(u,m)=>{const o=t("Title");return c(),r("div",null,[a(o,d(i(e)),null,16),p])}}});export{f as __pageData,T as default}; +import{r as t,o as c,c as r,e as a,n as d,g as i,a as l}from"./app.94d5b31a.js";const n="/assets/hero-1.5b8b8e96.png",s="/assets/hero-2.2f9bd12d.png",g="/assets/logo.98e788ed.png",p=l("",8),f=JSON.parse('{"title":"超级剪贴板","description":"","frontmatter":{"title":"超级剪贴板","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/ClipboardManager/index.md","lastUpdated":1675783866000}'),_={name:"project/ClipboardManager/index.md"},T=Object.assign(_,{setup(h){const e={subTitle:"✨ 强大的剪贴板管理工具。",logo:g,linkList:[{content:"⭐ 开源代码",target:"https://github.com/ZiuChen/ClipboardManager"},{content:"🚀 使用指南",target:"./guide/"},{content:"🌎 疑难解答",target:"./statement/"},{content:"👑 插件会员",target:"./vip/"},{content:"🚚 更新日志",target:"./log/"}]};return(u,m)=>{const o=t("Title");return c(),r("div",null,[a(o,d(i(e)),null,16),p])}}});export{f as __pageData,T as default}; diff --git a/assets/project_ClipboardManager_log_index.md.f40163dc.js b/assets/project_ClipboardManager_log_index.md.bc5fefe2.js similarity index 99% rename from assets/project_ClipboardManager_log_index.md.f40163dc.js rename to assets/project_ClipboardManager_log_index.md.bc5fefe2.js index a8f09e40..e2cabc65 100644 --- a/assets/project_ClipboardManager_log_index.md.f40163dc.js +++ b/assets/project_ClipboardManager_log_index.md.bc5fefe2.js @@ -1 +1 @@ -import{_ as e,o as l,c as i,a}from"./app.a81d7d4f.js";const x=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v2.0.0","slug":"v2-0-0","link":"#v2-0-0","children":[]},{"level":2,"title":"v1.4.7","slug":"v1-4-7","link":"#v1-4-7","children":[]},{"level":2,"title":"v1.4.6","slug":"v1-4-6","link":"#v1-4-6","children":[]},{"level":2,"title":"v1.4.5","slug":"v1-4-5","link":"#v1-4-5","children":[]},{"level":2,"title":"v1.4.4","slug":"v1-4-4","link":"#v1-4-4","children":[]},{"level":2,"title":"v1.4.3","slug":"v1-4-3","link":"#v1-4-3","children":[]},{"level":2,"title":"v1.4.2","slug":"v1-4-2","link":"#v1-4-2","children":[]},{"level":2,"title":"v1.4.1","slug":"v1-4-1","link":"#v1-4-1","children":[]},{"level":2,"title":"v1.4.0","slug":"v1-4-0","link":"#v1-4-0","children":[]},{"level":2,"title":"v1.3.4","slug":"v1-3-4","link":"#v1-3-4","children":[]},{"level":2,"title":"v1.3.3","slug":"v1-3-3","link":"#v1-3-3","children":[]},{"level":2,"title":"v1.3.2","slug":"v1-3-2","link":"#v1-3-2","children":[]},{"level":2,"title":"v1.3.1","slug":"v1-3-1","link":"#v1-3-1","children":[]},{"level":2,"title":"v1.3.0","slug":"v1-3-0","link":"#v1-3-0","children":[]},{"level":2,"title":"v1.2.3","slug":"v1-2-3","link":"#v1-2-3","children":[]},{"level":2,"title":"v1.2.2","slug":"v1-2-2","link":"#v1-2-2","children":[]},{"level":2,"title":"v1.2.1","slug":"v1-2-1","link":"#v1-2-1","children":[]},{"level":2,"title":"v1.2.0","slug":"v1-2-0","link":"#v1-2-0","children":[]},{"level":2,"title":"v1.1.7","slug":"v1-1-7","link":"#v1-1-7","children":[]},{"level":2,"title":"v1.1.6","slug":"v1-1-6","link":"#v1-1-6","children":[]},{"level":2,"title":"v1.1.5","slug":"v1-1-5","link":"#v1-1-5","children":[]},{"level":2,"title":"v1.1.4","slug":"v1-1-4","link":"#v1-1-4","children":[]},{"level":2,"title":"v1.1.3","slug":"v1-1-3","link":"#v1-1-3","children":[]},{"level":2,"title":"v1.1.2","slug":"v1-1-2","link":"#v1-1-2","children":[]},{"level":2,"title":"v1.1.1","slug":"v1-1-1","link":"#v1-1-1","children":[]},{"level":2,"title":"v1.1.0","slug":"v1-1-0","link":"#v1-1-0","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/ClipboardManager/log/index.md","lastUpdated":1675780846000}'),d={name:"project/ClipboardManager/log/index.md"},c=a('

更新日志

v2.0.0

2023-02-07

  • feat: 界面焕新 简洁高效
  • feat: 支持WebDav自动同步功能
  • feat: 支持预览页代码高亮
  • feat: 支持自定义分类卡片的顺序
  • feat: 支持识别文本内容为色值、链接等
  • feat: 支持左右键切换导航
  • feat: 支持关闭剪贴板图片记录
  • feat: 支持手动设置偏好主题
  • fix: 清空数据库保留收藏内容
  • fix: 滚动到底部触发懒加载失败
  • refactor: 组件重构 优化大列表运行时性能
  • refactor: 本地读写性能优化

v1.4.7

2022-11-03

  • feat: 设置页支持使用ESC返回上一级
  • fix: 移除了启动监听程序时对MacOS的特殊判断
  • fix: 移除了缺少监听程序时的通知报错

v1.4.6

2022-11-01

  • feat: 调整设置页图标与界面按钮细节
  • fix: 会员用户由于数据同步导致的插件白屏问题
  • fix: 多选复制时条目排序被颠倒

v1.4.5

2022-10-10

  • feat: 调整过期天数列表 最长支持31天
  • feat: 设置页添加handler安装引导
  • fix: 清空数据时内存数据未清空
  • fix: 多端同步时内存数据未更新
  • fix: 开发者模式下listener错误挂载

v1.4.4

2022-09-26

  • fix: 修复重复粘贴的问题

v1.4.3

2022-09-25

  • feat: 增加空格快捷键 按下连续多选的功能
  • feat: 多选状态下移动鼠标不再激活列表条目
  • feat: 支持展示剪贴板监听程序状态
  • fix: 删除某条历史记录时不再返回顶部
  • fix: 多选图片无法合并复制
  • fix: 内置按钮颜色管理关键字错误
  • fix: 设置页下拉框过长时被卡片遮挡
  • fix: 设置页滚动到底部触发懒加载

v1.4.2

2022-09-21

  • chore: 移除了插件内的二进制文件 恢复旧的监听机制 性能问题有待解决

v1.4.1

2022-09-21

  • fix: 修复了新的监听机制在 Mac 下无法正确获取剪贴板更新事件的问题

v1.4.0

2022-09-20

插件能够正确在Linux上运行 离不开 小千 不厌其烦的测试与调试 💖

感谢每一位为超级剪贴板提出过建议、参与测试与调试的用户

  • feat: 支持自定义数据库路径/存储条数/过期时间/展示在主界面的按钮
  • feat: 功能按钮支持自定义 创造属于你自己的功能按钮
  • feat: 添加了9个内置的自定义功能按钮
  • feat: 增加了更优雅的弹窗与提示界面
  • feat: 预览页更宽了 支持预览图片
  • feat: 导航栏图标样式修改
  • fix: 解决了CPU占用高、浏览大图卡顿的性能问题
  • fix: 从后台进入插件自动清空搜索框
  • refactor: 改变了监听剪贴板的方式 性能更优
  • refactor: 引入了ElementPlus组件库与图标库

v1.3.4

2022-09-19

  • feat: 移除插件内收藏Tab
  • feat: 点击收藏按钮后将携带数据跳转至备忘快贴
  • refactor: 优化代码执行逻辑 移除冗余代码

v1.3.3

2022-09-16

  • feat: 提高主色在深色模式下的对比度 改善长文本表现
  • feat: 添加快存功能按钮 配合超级粘贴插件实现快速转存
  • feat: 支持在预览页展示全部功能按钮
  • feat: 重要版本更新自动展示通知卡片
  • fix: 修正多选快捷键Shift影响检索输入的问题
  • fix: 检索词更新后 未自动激活首条记录

v1.3.2

2022-09-15

  • feat: 鼠标悬停展示具体日期、完整数据
  • feat: 调整历史记录上限为800条
  • fix: 修复鼠标置于功能按钮时上下键失效的问题
  • fix: 调整大图片判定尺寸

v1.3.1

2022-09-12

  • feat: 支持通过历史记录列表进入分词
  • feat: 减小插件体积 对智慧分词的支持改为插件跳转

v1.3.0

2022-09-09

  • feat: 添加多选功能 支持跨标签合并文本/图片/文件
  • feat: 支持通过按下Shift进入多选功能 支持按住Shift快速选择
  • feat: 支持使用Ctrl+CEnter快捷合并复制/粘贴
  • feat: 添加智慧分词功能 可对文本进行分割提取
  • feat: 长文本以蓝色高亮显示 不再提供查看全部按钮
  • feat: 优化界面动效

v1.2.3

2022-09-08

  • fix: 修复了检索内容时搜索记录不准确的问题

v1.2.2

2022-09-07

  • feat: 搜索框支持使用空格分词以同时检索多个关键词
  • fix: 修复了剪贴板数据记录遗漏的问题
  • fix: 收藏内容不再计入到条数限制中
  • fix: 修复了非预期的搜索框聚焦行为
  • fix: 预览页的按钮改为固定在顶部

v1.2.1

2022-09-05

  • feat: 支持通过功能按钮进入任意数据的预览页面
  • feat: 支持通过功能按钮打开文件所在目录
  • feat: 添加取消收藏功能按钮
  • feat: 搜索框支持展开/收起 输入任意内容展开并聚焦搜索
  • feat: 侧栏预览页添加复制全部智慧分词按钮
  • feat: 功能按钮改为使用图标展示
  • feat: 优化了界面样式
  • refactor: 清理定时器 优化插件性能

v1.2.0

2022-09-04

  • feat: 添加右侧操作栏 支持复制/收藏/删除操作
  • feat: 添加标签页收藏 支持在此页面管理所有收藏
  • feat: 调整侧栏宽度 调整界面样式细节

v1.1.7

2022-08-30

  • fix: 定时器检查剪贴板,修复了不记录剪贴板的问题

v1.1.6

2022-08-27

  • feat: 添加Alt+数字键Ctrl+数字键快速选择功能
  • feat: 调整界面样式 调整查看全部位置 移除图片背景色 增加动效
  • feat: 搜索框增加检索条数展示
  • fix: 改善插件读取图片的性能

v1.1.5

2022-08-25

  • fix: 提高剪贴板读取频率,避免高频复制时丢数据的情况

v1.1.4

2022-08-20

  • feat: 增加清空搜索框的按钮
  • feat: 优化插件内按下ESC的功能: 退出完整预览/清空搜索框
  • feat: 进入插件自动选中框内全部文本
  • fix: Mac在分离窗口状态左键会粘贴到搜索框 #13

v1.1.3

2022-08-19

  • feat: 调整界面在深色模式下的表现样式
  • fix: 在侧栏全部数据中使用Ctrl+C复制部分文本失效
  • fix: Mac下使用Ctrl+C复制单条记录失效
  • fix: 通过换行符个数区分超长文本
  • fix: 窗口分离下鼠标单击导致粘贴到搜索框
  • chore: 原插件名剪贴板改为超级剪贴板

v1.1.2

2022-08-18

  • feat: 执行复制后只隐藏主界面而不退出插件到后台
  • feat: 搜索时不再区分大小写
  • fix: 文本内容会出现异常首行缩进
  • fix: 图片展示在列表中的时候 右侧多出一个图块
  • fix: 移除鼠标hover时数据底部的色块

v1.1.1

2022-08-17

  • fix: 复制超大图片进入插件时崩溃

v1.1.0

2022-08-16

  • feat: 支持使用 键切换选中记录
  • feat: 支持使用 Ctrl+C 复制选中记录
  • feat: 支持使用 Enter 复制选中记录并粘贴

v1.0.4

2022-08-16

  • feat: 进入插件自动回到顶部、切换至全部分类
  • feat: 监听到键盘事件自动聚焦到搜索框
  • feat: 调整鼠标hover动画与历史记录的active样式
  • fix: 使用Tab切换导航失效
  • fix: 超长图片显示越界

v1.0.3

2022-08-16

  • fix: 路径分隔符导致写入错误的数据文件

v1.0.2

2022-08-15

  • fix: Mac下由权限导致的无法写入数据

v1.0.1

2022-08-15

  • feat: 区分鼠标点击行为:左键复制并粘贴,右键仅复制
  • feat: 适配深色模式
  • feat: 移除了右侧的查看更多按钮
  • feat: 单次展示的条数增加到了15条
  • feat: 增加条数限制500条 增加存储日期限制14天
  • feat: 增加了多平台支持
  • fix: 执行粘贴后主输入框未隐藏
  • refactor: Vue3重构

v1.0.0

2022-08-14

  • release: v1.0.0发布
',96),t=[c];function r(h,v,o,n,f,u){return l(),i("div",null,t)}const p=e(d,[["render",r]]);export{x as __pageData,p as default}; +import{_ as e,o as l,c as i,a}from"./app.94d5b31a.js";const x=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v2.0.0","slug":"v2-0-0","link":"#v2-0-0","children":[]},{"level":2,"title":"v1.4.7","slug":"v1-4-7","link":"#v1-4-7","children":[]},{"level":2,"title":"v1.4.6","slug":"v1-4-6","link":"#v1-4-6","children":[]},{"level":2,"title":"v1.4.5","slug":"v1-4-5","link":"#v1-4-5","children":[]},{"level":2,"title":"v1.4.4","slug":"v1-4-4","link":"#v1-4-4","children":[]},{"level":2,"title":"v1.4.3","slug":"v1-4-3","link":"#v1-4-3","children":[]},{"level":2,"title":"v1.4.2","slug":"v1-4-2","link":"#v1-4-2","children":[]},{"level":2,"title":"v1.4.1","slug":"v1-4-1","link":"#v1-4-1","children":[]},{"level":2,"title":"v1.4.0","slug":"v1-4-0","link":"#v1-4-0","children":[]},{"level":2,"title":"v1.3.4","slug":"v1-3-4","link":"#v1-3-4","children":[]},{"level":2,"title":"v1.3.3","slug":"v1-3-3","link":"#v1-3-3","children":[]},{"level":2,"title":"v1.3.2","slug":"v1-3-2","link":"#v1-3-2","children":[]},{"level":2,"title":"v1.3.1","slug":"v1-3-1","link":"#v1-3-1","children":[]},{"level":2,"title":"v1.3.0","slug":"v1-3-0","link":"#v1-3-0","children":[]},{"level":2,"title":"v1.2.3","slug":"v1-2-3","link":"#v1-2-3","children":[]},{"level":2,"title":"v1.2.2","slug":"v1-2-2","link":"#v1-2-2","children":[]},{"level":2,"title":"v1.2.1","slug":"v1-2-1","link":"#v1-2-1","children":[]},{"level":2,"title":"v1.2.0","slug":"v1-2-0","link":"#v1-2-0","children":[]},{"level":2,"title":"v1.1.7","slug":"v1-1-7","link":"#v1-1-7","children":[]},{"level":2,"title":"v1.1.6","slug":"v1-1-6","link":"#v1-1-6","children":[]},{"level":2,"title":"v1.1.5","slug":"v1-1-5","link":"#v1-1-5","children":[]},{"level":2,"title":"v1.1.4","slug":"v1-1-4","link":"#v1-1-4","children":[]},{"level":2,"title":"v1.1.3","slug":"v1-1-3","link":"#v1-1-3","children":[]},{"level":2,"title":"v1.1.2","slug":"v1-1-2","link":"#v1-1-2","children":[]},{"level":2,"title":"v1.1.1","slug":"v1-1-1","link":"#v1-1-1","children":[]},{"level":2,"title":"v1.1.0","slug":"v1-1-0","link":"#v1-1-0","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/ClipboardManager/log/index.md","lastUpdated":1675783866000}'),d={name:"project/ClipboardManager/log/index.md"},c=a('

更新日志

v2.0.0

2023-02-07

  • feat: 界面焕新 简洁高效
  • feat: 支持WebDav自动同步功能
  • feat: 支持预览页代码高亮
  • feat: 支持自定义分类卡片的顺序
  • feat: 支持识别文本内容为色值、链接等
  • feat: 支持左右键切换导航
  • feat: 支持关闭剪贴板图片记录
  • feat: 支持手动设置偏好主题
  • fix: 清空数据库保留收藏内容
  • fix: 滚动到底部触发懒加载失败
  • refactor: 组件重构 优化大列表运行时性能
  • refactor: 本地读写性能优化

v1.4.7

2022-11-03

  • feat: 设置页支持使用ESC返回上一级
  • fix: 移除了启动监听程序时对MacOS的特殊判断
  • fix: 移除了缺少监听程序时的通知报错

v1.4.6

2022-11-01

  • feat: 调整设置页图标与界面按钮细节
  • fix: 会员用户由于数据同步导致的插件白屏问题
  • fix: 多选复制时条目排序被颠倒

v1.4.5

2022-10-10

  • feat: 调整过期天数列表 最长支持31天
  • feat: 设置页添加handler安装引导
  • fix: 清空数据时内存数据未清空
  • fix: 多端同步时内存数据未更新
  • fix: 开发者模式下listener错误挂载

v1.4.4

2022-09-26

  • fix: 修复重复粘贴的问题

v1.4.3

2022-09-25

  • feat: 增加空格快捷键 按下连续多选的功能
  • feat: 多选状态下移动鼠标不再激活列表条目
  • feat: 支持展示剪贴板监听程序状态
  • fix: 删除某条历史记录时不再返回顶部
  • fix: 多选图片无法合并复制
  • fix: 内置按钮颜色管理关键字错误
  • fix: 设置页下拉框过长时被卡片遮挡
  • fix: 设置页滚动到底部触发懒加载

v1.4.2

2022-09-21

  • chore: 移除了插件内的二进制文件 恢复旧的监听机制 性能问题有待解决

v1.4.1

2022-09-21

  • fix: 修复了新的监听机制在 Mac 下无法正确获取剪贴板更新事件的问题

v1.4.0

2022-09-20

插件能够正确在Linux上运行 离不开 小千 不厌其烦的测试与调试 💖

感谢每一位为超级剪贴板提出过建议、参与测试与调试的用户

  • feat: 支持自定义数据库路径/存储条数/过期时间/展示在主界面的按钮
  • feat: 功能按钮支持自定义 创造属于你自己的功能按钮
  • feat: 添加了9个内置的自定义功能按钮
  • feat: 增加了更优雅的弹窗与提示界面
  • feat: 预览页更宽了 支持预览图片
  • feat: 导航栏图标样式修改
  • fix: 解决了CPU占用高、浏览大图卡顿的性能问题
  • fix: 从后台进入插件自动清空搜索框
  • refactor: 改变了监听剪贴板的方式 性能更优
  • refactor: 引入了ElementPlus组件库与图标库

v1.3.4

2022-09-19

  • feat: 移除插件内收藏Tab
  • feat: 点击收藏按钮后将携带数据跳转至备忘快贴
  • refactor: 优化代码执行逻辑 移除冗余代码

v1.3.3

2022-09-16

  • feat: 提高主色在深色模式下的对比度 改善长文本表现
  • feat: 添加快存功能按钮 配合超级粘贴插件实现快速转存
  • feat: 支持在预览页展示全部功能按钮
  • feat: 重要版本更新自动展示通知卡片
  • fix: 修正多选快捷键Shift影响检索输入的问题
  • fix: 检索词更新后 未自动激活首条记录

v1.3.2

2022-09-15

  • feat: 鼠标悬停展示具体日期、完整数据
  • feat: 调整历史记录上限为800条
  • fix: 修复鼠标置于功能按钮时上下键失效的问题
  • fix: 调整大图片判定尺寸

v1.3.1

2022-09-12

  • feat: 支持通过历史记录列表进入分词
  • feat: 减小插件体积 对智慧分词的支持改为插件跳转

v1.3.0

2022-09-09

  • feat: 添加多选功能 支持跨标签合并文本/图片/文件
  • feat: 支持通过按下Shift进入多选功能 支持按住Shift快速选择
  • feat: 支持使用Ctrl+CEnter快捷合并复制/粘贴
  • feat: 添加智慧分词功能 可对文本进行分割提取
  • feat: 长文本以蓝色高亮显示 不再提供查看全部按钮
  • feat: 优化界面动效

v1.2.3

2022-09-08

  • fix: 修复了检索内容时搜索记录不准确的问题

v1.2.2

2022-09-07

  • feat: 搜索框支持使用空格分词以同时检索多个关键词
  • fix: 修复了剪贴板数据记录遗漏的问题
  • fix: 收藏内容不再计入到条数限制中
  • fix: 修复了非预期的搜索框聚焦行为
  • fix: 预览页的按钮改为固定在顶部

v1.2.1

2022-09-05

  • feat: 支持通过功能按钮进入任意数据的预览页面
  • feat: 支持通过功能按钮打开文件所在目录
  • feat: 添加取消收藏功能按钮
  • feat: 搜索框支持展开/收起 输入任意内容展开并聚焦搜索
  • feat: 侧栏预览页添加复制全部智慧分词按钮
  • feat: 功能按钮改为使用图标展示
  • feat: 优化了界面样式
  • refactor: 清理定时器 优化插件性能

v1.2.0

2022-09-04

  • feat: 添加右侧操作栏 支持复制/收藏/删除操作
  • feat: 添加标签页收藏 支持在此页面管理所有收藏
  • feat: 调整侧栏宽度 调整界面样式细节

v1.1.7

2022-08-30

  • fix: 定时器检查剪贴板,修复了不记录剪贴板的问题

v1.1.6

2022-08-27

  • feat: 添加Alt+数字键Ctrl+数字键快速选择功能
  • feat: 调整界面样式 调整查看全部位置 移除图片背景色 增加动效
  • feat: 搜索框增加检索条数展示
  • fix: 改善插件读取图片的性能

v1.1.5

2022-08-25

  • fix: 提高剪贴板读取频率,避免高频复制时丢数据的情况

v1.1.4

2022-08-20

  • feat: 增加清空搜索框的按钮
  • feat: 优化插件内按下ESC的功能: 退出完整预览/清空搜索框
  • feat: 进入插件自动选中框内全部文本
  • fix: Mac在分离窗口状态左键会粘贴到搜索框 #13

v1.1.3

2022-08-19

  • feat: 调整界面在深色模式下的表现样式
  • fix: 在侧栏全部数据中使用Ctrl+C复制部分文本失效
  • fix: Mac下使用Ctrl+C复制单条记录失效
  • fix: 通过换行符个数区分超长文本
  • fix: 窗口分离下鼠标单击导致粘贴到搜索框
  • chore: 原插件名剪贴板改为超级剪贴板

v1.1.2

2022-08-18

  • feat: 执行复制后只隐藏主界面而不退出插件到后台
  • feat: 搜索时不再区分大小写
  • fix: 文本内容会出现异常首行缩进
  • fix: 图片展示在列表中的时候 右侧多出一个图块
  • fix: 移除鼠标hover时数据底部的色块

v1.1.1

2022-08-17

  • fix: 复制超大图片进入插件时崩溃

v1.1.0

2022-08-16

  • feat: 支持使用 键切换选中记录
  • feat: 支持使用 Ctrl+C 复制选中记录
  • feat: 支持使用 Enter 复制选中记录并粘贴

v1.0.4

2022-08-16

  • feat: 进入插件自动回到顶部、切换至全部分类
  • feat: 监听到键盘事件自动聚焦到搜索框
  • feat: 调整鼠标hover动画与历史记录的active样式
  • fix: 使用Tab切换导航失效
  • fix: 超长图片显示越界

v1.0.3

2022-08-16

  • fix: 路径分隔符导致写入错误的数据文件

v1.0.2

2022-08-15

  • fix: Mac下由权限导致的无法写入数据

v1.0.1

2022-08-15

  • feat: 区分鼠标点击行为:左键复制并粘贴,右键仅复制
  • feat: 适配深色模式
  • feat: 移除了右侧的查看更多按钮
  • feat: 单次展示的条数增加到了15条
  • feat: 增加条数限制500条 增加存储日期限制14天
  • feat: 增加了多平台支持
  • fix: 执行粘贴后主输入框未隐藏
  • refactor: Vue3重构

v1.0.0

2022-08-14

  • release: v1.0.0发布
',96),t=[c];function r(h,v,o,n,f,u){return l(),i("div",null,t)}const p=e(d,[["render",r]]);export{x as __pageData,p as default}; diff --git a/assets/project_ClipboardManager_log_index.md.f40163dc.lean.js b/assets/project_ClipboardManager_log_index.md.bc5fefe2.lean.js similarity index 95% rename from assets/project_ClipboardManager_log_index.md.f40163dc.lean.js rename to assets/project_ClipboardManager_log_index.md.bc5fefe2.lean.js index df82976f..9991584c 100644 --- a/assets/project_ClipboardManager_log_index.md.f40163dc.lean.js +++ b/assets/project_ClipboardManager_log_index.md.bc5fefe2.lean.js @@ -1 +1 @@ -import{_ as e,o as l,c as i,a}from"./app.a81d7d4f.js";const x=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v2.0.0","slug":"v2-0-0","link":"#v2-0-0","children":[]},{"level":2,"title":"v1.4.7","slug":"v1-4-7","link":"#v1-4-7","children":[]},{"level":2,"title":"v1.4.6","slug":"v1-4-6","link":"#v1-4-6","children":[]},{"level":2,"title":"v1.4.5","slug":"v1-4-5","link":"#v1-4-5","children":[]},{"level":2,"title":"v1.4.4","slug":"v1-4-4","link":"#v1-4-4","children":[]},{"level":2,"title":"v1.4.3","slug":"v1-4-3","link":"#v1-4-3","children":[]},{"level":2,"title":"v1.4.2","slug":"v1-4-2","link":"#v1-4-2","children":[]},{"level":2,"title":"v1.4.1","slug":"v1-4-1","link":"#v1-4-1","children":[]},{"level":2,"title":"v1.4.0","slug":"v1-4-0","link":"#v1-4-0","children":[]},{"level":2,"title":"v1.3.4","slug":"v1-3-4","link":"#v1-3-4","children":[]},{"level":2,"title":"v1.3.3","slug":"v1-3-3","link":"#v1-3-3","children":[]},{"level":2,"title":"v1.3.2","slug":"v1-3-2","link":"#v1-3-2","children":[]},{"level":2,"title":"v1.3.1","slug":"v1-3-1","link":"#v1-3-1","children":[]},{"level":2,"title":"v1.3.0","slug":"v1-3-0","link":"#v1-3-0","children":[]},{"level":2,"title":"v1.2.3","slug":"v1-2-3","link":"#v1-2-3","children":[]},{"level":2,"title":"v1.2.2","slug":"v1-2-2","link":"#v1-2-2","children":[]},{"level":2,"title":"v1.2.1","slug":"v1-2-1","link":"#v1-2-1","children":[]},{"level":2,"title":"v1.2.0","slug":"v1-2-0","link":"#v1-2-0","children":[]},{"level":2,"title":"v1.1.7","slug":"v1-1-7","link":"#v1-1-7","children":[]},{"level":2,"title":"v1.1.6","slug":"v1-1-6","link":"#v1-1-6","children":[]},{"level":2,"title":"v1.1.5","slug":"v1-1-5","link":"#v1-1-5","children":[]},{"level":2,"title":"v1.1.4","slug":"v1-1-4","link":"#v1-1-4","children":[]},{"level":2,"title":"v1.1.3","slug":"v1-1-3","link":"#v1-1-3","children":[]},{"level":2,"title":"v1.1.2","slug":"v1-1-2","link":"#v1-1-2","children":[]},{"level":2,"title":"v1.1.1","slug":"v1-1-1","link":"#v1-1-1","children":[]},{"level":2,"title":"v1.1.0","slug":"v1-1-0","link":"#v1-1-0","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/ClipboardManager/log/index.md","lastUpdated":1675780846000}'),d={name:"project/ClipboardManager/log/index.md"},c=a("",96),t=[c];function r(h,v,o,n,f,u){return l(),i("div",null,t)}const p=e(d,[["render",r]]);export{x as __pageData,p as default}; +import{_ as e,o as l,c as i,a}from"./app.94d5b31a.js";const x=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v2.0.0","slug":"v2-0-0","link":"#v2-0-0","children":[]},{"level":2,"title":"v1.4.7","slug":"v1-4-7","link":"#v1-4-7","children":[]},{"level":2,"title":"v1.4.6","slug":"v1-4-6","link":"#v1-4-6","children":[]},{"level":2,"title":"v1.4.5","slug":"v1-4-5","link":"#v1-4-5","children":[]},{"level":2,"title":"v1.4.4","slug":"v1-4-4","link":"#v1-4-4","children":[]},{"level":2,"title":"v1.4.3","slug":"v1-4-3","link":"#v1-4-3","children":[]},{"level":2,"title":"v1.4.2","slug":"v1-4-2","link":"#v1-4-2","children":[]},{"level":2,"title":"v1.4.1","slug":"v1-4-1","link":"#v1-4-1","children":[]},{"level":2,"title":"v1.4.0","slug":"v1-4-0","link":"#v1-4-0","children":[]},{"level":2,"title":"v1.3.4","slug":"v1-3-4","link":"#v1-3-4","children":[]},{"level":2,"title":"v1.3.3","slug":"v1-3-3","link":"#v1-3-3","children":[]},{"level":2,"title":"v1.3.2","slug":"v1-3-2","link":"#v1-3-2","children":[]},{"level":2,"title":"v1.3.1","slug":"v1-3-1","link":"#v1-3-1","children":[]},{"level":2,"title":"v1.3.0","slug":"v1-3-0","link":"#v1-3-0","children":[]},{"level":2,"title":"v1.2.3","slug":"v1-2-3","link":"#v1-2-3","children":[]},{"level":2,"title":"v1.2.2","slug":"v1-2-2","link":"#v1-2-2","children":[]},{"level":2,"title":"v1.2.1","slug":"v1-2-1","link":"#v1-2-1","children":[]},{"level":2,"title":"v1.2.0","slug":"v1-2-0","link":"#v1-2-0","children":[]},{"level":2,"title":"v1.1.7","slug":"v1-1-7","link":"#v1-1-7","children":[]},{"level":2,"title":"v1.1.6","slug":"v1-1-6","link":"#v1-1-6","children":[]},{"level":2,"title":"v1.1.5","slug":"v1-1-5","link":"#v1-1-5","children":[]},{"level":2,"title":"v1.1.4","slug":"v1-1-4","link":"#v1-1-4","children":[]},{"level":2,"title":"v1.1.3","slug":"v1-1-3","link":"#v1-1-3","children":[]},{"level":2,"title":"v1.1.2","slug":"v1-1-2","link":"#v1-1-2","children":[]},{"level":2,"title":"v1.1.1","slug":"v1-1-1","link":"#v1-1-1","children":[]},{"level":2,"title":"v1.1.0","slug":"v1-1-0","link":"#v1-1-0","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/ClipboardManager/log/index.md","lastUpdated":1675783866000}'),d={name:"project/ClipboardManager/log/index.md"},c=a("",96),t=[c];function r(h,v,o,n,f,u){return l(),i("div",null,t)}const p=e(d,[["render",r]]);export{x as __pageData,p as default}; diff --git a/assets/project_ClipboardManager_statement_index.md.00adf700.js b/assets/project_ClipboardManager_statement_index.md.98bc3e66.js similarity index 98% rename from assets/project_ClipboardManager_statement_index.md.00adf700.js rename to assets/project_ClipboardManager_statement_index.md.98bc3e66.js index 2ecc3340..034fa3cd 100644 --- a/assets/project_ClipboardManager_statement_index.md.00adf700.js +++ b/assets/project_ClipboardManager_statement_index.md.98bc3e66.js @@ -1 +1 @@ -import{_ as e,o as a,c as l,a as i}from"./app.a81d7d4f.js";const g=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[{"level":2,"title":"为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?","slug":"为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","link":"#为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","children":[]},{"level":2,"title":"为什么官方的剪贴板插件没有CPU占用高这个问题?","slug":"为什么官方的剪贴板插件没有cpu占用高这个问题","link":"#为什么官方的剪贴板插件没有cpu占用高这个问题","children":[]},{"level":2,"title":"启动报错, 读取剪切板出错","slug":"启动报错-读取剪切板出错","link":"#启动报错-读取剪切板出错","children":[]},{"level":2,"title":"为什么剪贴板记录会丢失?","slug":"为什么剪贴板记录会丢失","link":"#为什么剪贴板记录会丢失","children":[]},{"level":2,"title":"我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?","slug":"我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","link":"#我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","children":[]},{"level":2,"title":"我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私","slug":"我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","link":"#我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","children":[]},{"level":2,"title":"开源版本和插件市场版本的区别?","slug":"开源版本和插件市场版本的区别","link":"#开源版本和插件市场版本的区别","children":[]},{"level":2,"title":"为什么不开源了, 为什么要开始收费?","slug":"为什么不开源了-为什么要开始收费","link":"#为什么不开源了-为什么要开始收费","children":[]}],"relativePath":"project/ClipboardManager/statement/index.md","lastUpdated":1675780846000}'),r={name:"project/ClipboardManager/statement/index.md"},t=i('

Q&A

为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?

这是由超级剪贴板监听剪贴板内容更新的机制决定的,为了不漏数据,超级剪贴板的监听策略为每300ms读取一次剪贴板内容并与上一次读取到的内容作比较。如果剪贴板当前位置是一张大图片,那么插件会反复读取这张图片,导致大量计算被用在了无意义的读取与对比上。

插件市场中相同原理的同类插件的处理方法是:

  • 轮询比较两次剪贴板内容,如果检查到当前剪贴板内容数据量较大,则降低轮询时间间隔。
    • 这避免了读取大图片/长文本时的高占用,然而这很容易导致漏数据
  • 轮询比较两次剪贴板内容,由用户自定义轮询时间
    • 用户设置的轮询间隔时间长,读取大图片/长文本时不会导致高占用,但很容易漏数据。
    • 用户设置的轮询间隔时间较短,则又会造成高占用

v1.4.0版本更新中,超级剪贴板换用了clipboard-event库监听剪贴板更新事件,这种方式性能更优,不需要反复读取剪贴板内容来做比较,而只需要在检查到剪贴板更新事件时通知插件读取一次剪贴板即可,完全解决了CPU占用高、浏览图片卡顿的问题。

然而该库包含了二进制文件,这触发了uTools插件市场的安全限制而无法上架。所以自v1.4.2起,插件不再内置监听剪贴板更新事件的二进制文件,用户要使用低占用、高性能的剪贴板监听方案,可以自行下载并将其移动到剪贴板数据库文件所在目录,详见如何手动安装clipboard-event-handler,插件会自动判断使用新的抑或是旧的方案监听剪贴板更新。同时,自v1.4.3起,你可以在设置页查看当前剪贴板监听程序的运行状态。

为什么官方的剪贴板插件没有CPU占用高这个问题?

官方的剪贴板内容更新事件监听函数也是从一个二进制文件引出的,这个二进制文件跟随主程序启动,不受剪贴板插件的打开或关闭的影响。

启动报错, 读取剪切板出错

请尝试以下方法:

  1. 清空本地数据库文件
  2. 格式化uTools内的插件数据
  3. 完全退出插件后重启插件

如果上述方法都无法解决你的问题,欢迎论坛回帖或加入QQ群交流具体情况

为什么剪贴板记录会丢失?

一般是由于插件退出后台运行导致的, 插件需要保持后台运行才能记录剪贴板, 请检查:

  • 是否正确设置了插件跟随主程序启动
  • 是否手动清理或关闭了后台插件 (在分离模式下关闭插件 使用clear命令 在插件列表退出插件)
  • 是否存在高频复制的操作 (高频复制可能会漏掉记录)

我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?

首先, 我写这个插件不是为了获取你的隐私的, 我对你的隐私没有兴趣, 这一点你完全可以放心;

其次uTools官方在插件上架前会对代码进行审查, 如果插件有高危行为, 那也不会过审;

再其次, uTools大部分用户是程序员, 如果我真的在代码里藏了"毒", 那他们也有办法发现, 如果你真的对你的隐私十分关心, 可以选择从开源仓库下载代码自行构建

我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私

我在贡献教程中详细说明了如何构建, JavaScript也并不是一门很高深的语言, 祝你能早日入门, 构建出安全的版本供自己使用, 学习的过程中遇到任何问题, 也欢迎随时与我交流 😄

开源版本和插件市场版本的区别?

开源版本后续将只提供必要的BUG修复, 不再添加新功能

  • 开源版本: 包含完整的基本功能, 可以自行构建开源版本, 通过安装离线插件方式使用
  • 市场版本: 包含后续更新的新功能插件会员功能, 可以直接从插件应用市场安装

为什么不开源了, 为什么要开始收费?

目前由我个人维护的开源版本已经趋于稳定, 可以满足绝大部分场景的需求

  • 代码开源的出发点不是为了让不愿付费的人白嫖开发者的劳动, 而是为开发提供更多的经验和思路, 开源的代码已经启发了一些开发者上架了自己的剪贴板插件应用
  • 开发和维护插件需要时间和精力, 插件付费可以鼓励我更积极的更新
  • 目前插件内已有的基本功能都不会转为收费, 可以放心使用
',28),d=[t];function n(o,c,h,s,p,u){return a(),l("div",null,d)}const f=e(r,[["render",n]]);export{g as __pageData,f as default}; +import{_ as e,o as a,c as l,a as i}from"./app.94d5b31a.js";const g=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[{"level":2,"title":"为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?","slug":"为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","link":"#为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","children":[]},{"level":2,"title":"为什么官方的剪贴板插件没有CPU占用高这个问题?","slug":"为什么官方的剪贴板插件没有cpu占用高这个问题","link":"#为什么官方的剪贴板插件没有cpu占用高这个问题","children":[]},{"level":2,"title":"启动报错, 读取剪切板出错","slug":"启动报错-读取剪切板出错","link":"#启动报错-读取剪切板出错","children":[]},{"level":2,"title":"为什么剪贴板记录会丢失?","slug":"为什么剪贴板记录会丢失","link":"#为什么剪贴板记录会丢失","children":[]},{"level":2,"title":"我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?","slug":"我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","link":"#我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","children":[]},{"level":2,"title":"我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私","slug":"我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","link":"#我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","children":[]},{"level":2,"title":"开源版本和插件市场版本的区别?","slug":"开源版本和插件市场版本的区别","link":"#开源版本和插件市场版本的区别","children":[]},{"level":2,"title":"为什么不开源了, 为什么要开始收费?","slug":"为什么不开源了-为什么要开始收费","link":"#为什么不开源了-为什么要开始收费","children":[]}],"relativePath":"project/ClipboardManager/statement/index.md","lastUpdated":1675783866000}'),r={name:"project/ClipboardManager/statement/index.md"},t=i('

Q&A

为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?

这是由超级剪贴板监听剪贴板内容更新的机制决定的,为了不漏数据,超级剪贴板的监听策略为每300ms读取一次剪贴板内容并与上一次读取到的内容作比较。如果剪贴板当前位置是一张大图片,那么插件会反复读取这张图片,导致大量计算被用在了无意义的读取与对比上。

插件市场中相同原理的同类插件的处理方法是:

  • 轮询比较两次剪贴板内容,如果检查到当前剪贴板内容数据量较大,则降低轮询时间间隔。
    • 这避免了读取大图片/长文本时的高占用,然而这很容易导致漏数据
  • 轮询比较两次剪贴板内容,由用户自定义轮询时间
    • 用户设置的轮询间隔时间长,读取大图片/长文本时不会导致高占用,但很容易漏数据。
    • 用户设置的轮询间隔时间较短,则又会造成高占用

v1.4.0版本更新中,超级剪贴板换用了clipboard-event库监听剪贴板更新事件,这种方式性能更优,不需要反复读取剪贴板内容来做比较,而只需要在检查到剪贴板更新事件时通知插件读取一次剪贴板即可,完全解决了CPU占用高、浏览图片卡顿的问题。

然而该库包含了二进制文件,这触发了uTools插件市场的安全限制而无法上架。所以自v1.4.2起,插件不再内置监听剪贴板更新事件的二进制文件,用户要使用低占用、高性能的剪贴板监听方案,可以自行下载并将其移动到剪贴板数据库文件所在目录,详见如何手动安装clipboard-event-handler,插件会自动判断使用新的抑或是旧的方案监听剪贴板更新。同时,自v1.4.3起,你可以在设置页查看当前剪贴板监听程序的运行状态。

为什么官方的剪贴板插件没有CPU占用高这个问题?

官方的剪贴板内容更新事件监听函数也是从一个二进制文件引出的,这个二进制文件跟随主程序启动,不受剪贴板插件的打开或关闭的影响。

启动报错, 读取剪切板出错

请尝试以下方法:

  1. 清空本地数据库文件
  2. 格式化uTools内的插件数据
  3. 完全退出插件后重启插件

如果上述方法都无法解决你的问题,欢迎论坛回帖或加入QQ群交流具体情况

为什么剪贴板记录会丢失?

一般是由于插件退出后台运行导致的, 插件需要保持后台运行才能记录剪贴板, 请检查:

  • 是否正确设置了插件跟随主程序启动
  • 是否手动清理或关闭了后台插件 (在分离模式下关闭插件 使用clear命令 在插件列表退出插件)
  • 是否存在高频复制的操作 (高频复制可能会漏掉记录)

我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?

首先, 我写这个插件不是为了获取你的隐私的, 我对你的隐私没有兴趣, 这一点你完全可以放心;

其次uTools官方在插件上架前会对代码进行审查, 如果插件有高危行为, 那也不会过审;

再其次, uTools大部分用户是程序员, 如果我真的在代码里藏了"毒", 那他们也有办法发现, 如果你真的对你的隐私十分关心, 可以选择从开源仓库下载代码自行构建

我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私

我在贡献教程中详细说明了如何构建, JavaScript也并不是一门很高深的语言, 祝你能早日入门, 构建出安全的版本供自己使用, 学习的过程中遇到任何问题, 也欢迎随时与我交流 😄

开源版本和插件市场版本的区别?

开源版本后续将只提供必要的BUG修复, 不再添加新功能

  • 开源版本: 包含完整的基本功能, 可以自行构建开源版本, 通过安装离线插件方式使用
  • 市场版本: 包含后续更新的新功能插件会员功能, 可以直接从插件应用市场安装

为什么不开源了, 为什么要开始收费?

目前由我个人维护的开源版本已经趋于稳定, 可以满足绝大部分场景的需求

  • 代码开源的出发点不是为了让不愿付费的人白嫖开发者的劳动, 而是为开发提供更多的经验和思路, 开源的代码已经启发了一些开发者上架了自己的剪贴板插件应用
  • 开发和维护插件需要时间和精力, 插件付费可以鼓励我更积极的更新
  • 目前插件内已有的基本功能都不会转为收费, 可以放心使用
',28),d=[t];function n(o,c,h,s,p,u){return a(),l("div",null,d)}const f=e(r,[["render",n]]);export{g as __pageData,f as default}; diff --git a/assets/project_ClipboardManager_statement_index.md.00adf700.lean.js b/assets/project_ClipboardManager_statement_index.md.98bc3e66.lean.js similarity index 94% rename from assets/project_ClipboardManager_statement_index.md.00adf700.lean.js rename to assets/project_ClipboardManager_statement_index.md.98bc3e66.lean.js index bad20583..ae847fd4 100644 --- a/assets/project_ClipboardManager_statement_index.md.00adf700.lean.js +++ b/assets/project_ClipboardManager_statement_index.md.98bc3e66.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as l,a as i}from"./app.a81d7d4f.js";const g=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[{"level":2,"title":"为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?","slug":"为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","link":"#为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","children":[]},{"level":2,"title":"为什么官方的剪贴板插件没有CPU占用高这个问题?","slug":"为什么官方的剪贴板插件没有cpu占用高这个问题","link":"#为什么官方的剪贴板插件没有cpu占用高这个问题","children":[]},{"level":2,"title":"启动报错, 读取剪切板出错","slug":"启动报错-读取剪切板出错","link":"#启动报错-读取剪切板出错","children":[]},{"level":2,"title":"为什么剪贴板记录会丢失?","slug":"为什么剪贴板记录会丢失","link":"#为什么剪贴板记录会丢失","children":[]},{"level":2,"title":"我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?","slug":"我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","link":"#我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","children":[]},{"level":2,"title":"我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私","slug":"我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","link":"#我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","children":[]},{"level":2,"title":"开源版本和插件市场版本的区别?","slug":"开源版本和插件市场版本的区别","link":"#开源版本和插件市场版本的区别","children":[]},{"level":2,"title":"为什么不开源了, 为什么要开始收费?","slug":"为什么不开源了-为什么要开始收费","link":"#为什么不开源了-为什么要开始收费","children":[]}],"relativePath":"project/ClipboardManager/statement/index.md","lastUpdated":1675780846000}'),r={name:"project/ClipboardManager/statement/index.md"},t=i("",28),d=[t];function n(o,c,h,s,p,u){return a(),l("div",null,d)}const f=e(r,[["render",n]]);export{g as __pageData,f as default}; +import{_ as e,o as a,c as l,a as i}from"./app.94d5b31a.js";const g=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[{"level":2,"title":"为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?","slug":"为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","link":"#为什么偶尔cpu占用特别高-为什么预览图片时插件卡顿","children":[]},{"level":2,"title":"为什么官方的剪贴板插件没有CPU占用高这个问题?","slug":"为什么官方的剪贴板插件没有cpu占用高这个问题","link":"#为什么官方的剪贴板插件没有cpu占用高这个问题","children":[]},{"level":2,"title":"启动报错, 读取剪切板出错","slug":"启动报错-读取剪切板出错","link":"#启动报错-读取剪切板出错","children":[]},{"level":2,"title":"为什么剪贴板记录会丢失?","slug":"为什么剪贴板记录会丢失","link":"#为什么剪贴板记录会丢失","children":[]},{"level":2,"title":"我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?","slug":"我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","link":"#我对这个插件的安全性有担忧-插件偷窃我的隐私怎么办","children":[]},{"level":2,"title":"我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私","slug":"我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","link":"#我不懂代码-我也不会构建-但是我担心你的插件会窃取我的隐私","children":[]},{"level":2,"title":"开源版本和插件市场版本的区别?","slug":"开源版本和插件市场版本的区别","link":"#开源版本和插件市场版本的区别","children":[]},{"level":2,"title":"为什么不开源了, 为什么要开始收费?","slug":"为什么不开源了-为什么要开始收费","link":"#为什么不开源了-为什么要开始收费","children":[]}],"relativePath":"project/ClipboardManager/statement/index.md","lastUpdated":1675783866000}'),r={name:"project/ClipboardManager/statement/index.md"},t=i("",28),d=[t];function n(o,c,h,s,p,u){return a(),l("div",null,d)}const f=e(r,[["render",n]]);export{g as __pageData,f as default}; diff --git a/assets/project_ClipboardManager_vip_index.md.0f0bb6a6.js b/assets/project_ClipboardManager_vip_index.md.c8460180.js similarity index 97% rename from assets/project_ClipboardManager_vip_index.md.0f0bb6a6.js rename to assets/project_ClipboardManager_vip_index.md.c8460180.js index 95eb3259..65f6c062 100644 --- a/assets/project_ClipboardManager_vip_index.md.0f0bb6a6.js +++ b/assets/project_ClipboardManager_vip_index.md.c8460180.js @@ -1 +1 @@ -import{_ as n,r as o,o as r,c as s,b as e,d as t,e as i,a}from"./app.a81d7d4f.js";const d="/assets/vip-webdav.17dfb7ac.jpg",I=JSON.parse('{"title":"插件会员","description":"","frontmatter":{},"headers":[{"level":2,"title":"会员权益","slug":"会员权益","link":"#会员权益","children":[]},{"level":2,"title":"会员定价","slug":"会员定价","link":"#会员定价","children":[]},{"level":2,"title":"WebDav同步功能","slug":"webdav同步功能","link":"#webdav同步功能","children":[]},{"level":2,"title":"更多内容","slug":"更多内容","link":"#更多内容","children":[]}],"relativePath":"project/ClipboardManager/vip/index.md","lastUpdated":1675780846000}'),c={name:"project/ClipboardManager/vip/index.md"},p=a('

插件会员

TIP

超级剪贴板是一款 “随心所欲” 的软件。您可以永久免费使用它。

但是,如果您真的喜欢它,您可以付费支持它的发展。作为答谢,您将获得更多更方便的功能。这取决于您,如果您不想,也没关系。谢谢你,祝你有美好的一天!☀️

会员权益

',3),_=e("strong",null,"插件会员",-1),u=e("code",null,"WebDav同步功能 轻点鼠标即可多端同步",-1),h=e("code",null,"最多支持保存2000条历史记录",-1),b=e("code",null,"不限制历史记录过期时间",-1),g=e("code",null,"文本内容增强 识别文本内容为色值、链接",-1),v=e("code",null,"自定义分类排序",-1),f=e("code",null,"预览页代码高亮",-1),x=e("code",null,"支持关闭剪贴板图片记录",-1),m=e("code",null,"插件使用统计",-1),T=e("li",null,[e("strong",null,"...")],-1),k=e("strong",null,"uTools会员",-1),D=e("code",null,"插件使用统计",-1),w=a('

会员定价

WARNING

  • 插件会员为大版本买断制,购买后即可享用当前版本(2.x)后续所有更新的会员内容
  • 插件会员为虚拟商品,购买后不支持退款
  • 插件会员的价格是浮动的,随着功能和权益的增加,不排除涨价的可能
  • 购买插件会员后如果出现相关问题,欢迎加入QQ群反馈

插件会员定价8元,登录uTools账号后点击插件工具栏中个人中心图标进入购买页面

购买后可使用会员功能,不购买不影响基本功能的使用,希望大家多多理解,按需购买

WebDav同步功能

插件会员支持通过WebDav同步剪贴板数据

获取服务器地址 账号 密钥后,仅需在插件内的设置页面添加WebDav配置后,

每次本地数据库发生变化,都会将最新数据同步到同步到服务器(须开启插件内的自动同步 否则需要手动同步)

  • 如果配置了WebDav 则每天第一次进入插件时会自动从服务器拉取最新数据
  • 如果设置了自动同步 每次本地数据变化将自动同步本地数据到服务器
    • 插件会缓存云端数据文件的ETag 如果云端数据有更新 则采用云端数据覆盖本地数据
    • 数据文件的上传和下载都开启了gzip以节省流量与带宽
    • 清空本地数据库的同时也会触发云端文件清空
    • 可以选择关闭图片记录 以降低同步的数据文件体积 提高同步效率
  • 插件仅在每次启动时主动从云端拉取数据 云端数据的更新不会自动同步到本地
  • 可以通过点击工具栏按钮主动拉取云端数据到本地或上传数据到云端

WebDav

相关链接:

更多内容

疑难解答

',14);function y(V,W,N,A,S,j){const l=o("Badge");return r(),s("div",null,[p,e("ul",null,[e("li",null,[_,e("ul",null,[e("li",null,[u,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[h,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[b,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[g,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[v,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[f,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[x,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[m,t(),i(l,{type:"tip",text:"已上线"})]),T])]),e("li",null,[k,e("ul",null,[e("li",null,[D,t(),i(l,{type:"tip",text:"已上线"})])])])]),w])}const P=n(c,[["render",y]]);export{I as __pageData,P as default}; +import{_ as n,r as o,o as r,c as s,b as e,d as t,e as i,a}from"./app.94d5b31a.js";const d="/assets/vip-webdav.17dfb7ac.jpg",I=JSON.parse('{"title":"插件会员","description":"","frontmatter":{},"headers":[{"level":2,"title":"会员权益","slug":"会员权益","link":"#会员权益","children":[]},{"level":2,"title":"会员定价","slug":"会员定价","link":"#会员定价","children":[]},{"level":2,"title":"WebDav同步功能","slug":"webdav同步功能","link":"#webdav同步功能","children":[]},{"level":2,"title":"更多内容","slug":"更多内容","link":"#更多内容","children":[]}],"relativePath":"project/ClipboardManager/vip/index.md","lastUpdated":1675783866000}'),c={name:"project/ClipboardManager/vip/index.md"},p=a('

插件会员

TIP

超级剪贴板是一款 “随心所欲” 的软件。您可以永久免费使用它。

但是,如果您真的喜欢它,您可以付费支持它的发展。作为答谢,您将获得更多更方便的功能。这取决于您,如果您不想,也没关系。谢谢你,祝你有美好的一天!☀️

会员权益

',3),_=e("strong",null,"插件会员",-1),u=e("code",null,"WebDav同步功能 轻点鼠标即可多端同步",-1),h=e("code",null,"最多支持保存2000条历史记录",-1),b=e("code",null,"不限制历史记录过期时间",-1),g=e("code",null,"文本内容增强 识别文本内容为色值、链接",-1),v=e("code",null,"自定义分类排序",-1),f=e("code",null,"预览页代码高亮",-1),x=e("code",null,"支持关闭剪贴板图片记录",-1),m=e("code",null,"插件使用统计",-1),T=e("li",null,[e("strong",null,"...")],-1),k=e("strong",null,"uTools会员",-1),D=e("code",null,"插件使用统计",-1),w=a('

会员定价

WARNING

  • 插件会员为大版本买断制,购买后即可享用当前版本(2.x)后续所有更新的会员内容
  • 插件会员为虚拟商品,购买后不支持退款
  • 插件会员的价格是浮动的,随着功能和权益的增加,不排除涨价的可能
  • 购买插件会员后如果出现相关问题,欢迎加入QQ群反馈

插件会员定价8元,登录uTools账号后点击插件工具栏中个人中心图标进入购买页面

购买后可使用会员功能,不购买不影响基本功能的使用,希望大家多多理解,按需购买

WebDav同步功能

插件会员支持通过WebDav同步剪贴板数据

获取服务器地址 账号 密钥后,仅需在插件内的设置页面添加WebDav配置后,

每次本地数据库发生变化,都会将最新数据同步到同步到服务器(须开启插件内的自动同步 否则需要手动同步)

  • 如果配置了WebDav 则每天第一次进入插件时会自动从服务器拉取最新数据
  • 如果设置了自动同步 每次本地数据变化将自动同步本地数据到服务器
    • 插件会缓存云端数据文件的ETag 如果云端数据有更新 则采用云端数据覆盖本地数据
    • 数据文件的上传和下载都开启了gzip以节省流量与带宽
    • 清空本地数据库的同时也会触发云端文件清空
    • 可以选择关闭图片记录 以降低同步的数据文件体积 提高同步效率
  • 插件仅在每次启动时主动从云端拉取数据 云端数据的更新不会自动同步到本地
  • 可以通过点击工具栏按钮主动拉取云端数据到本地或上传数据到云端

WebDav

相关链接:

更多内容

疑难解答

',14);function y(V,W,N,A,S,j){const l=o("Badge");return r(),s("div",null,[p,e("ul",null,[e("li",null,[_,e("ul",null,[e("li",null,[u,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[h,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[b,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[g,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[v,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[f,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[x,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[m,t(),i(l,{type:"tip",text:"已上线"})]),T])]),e("li",null,[k,e("ul",null,[e("li",null,[D,t(),i(l,{type:"tip",text:"已上线"})])])])]),w])}const P=n(c,[["render",y]]);export{I as __pageData,P as default}; diff --git a/assets/project_ClipboardManager_vip_index.md.0f0bb6a6.lean.js b/assets/project_ClipboardManager_vip_index.md.c8460180.lean.js similarity index 93% rename from assets/project_ClipboardManager_vip_index.md.0f0bb6a6.lean.js rename to assets/project_ClipboardManager_vip_index.md.c8460180.lean.js index 12b1ef62..9a671358 100644 --- a/assets/project_ClipboardManager_vip_index.md.0f0bb6a6.lean.js +++ b/assets/project_ClipboardManager_vip_index.md.c8460180.lean.js @@ -1 +1 @@ -import{_ as n,r as o,o as r,c as s,b as e,d as t,e as i,a}from"./app.a81d7d4f.js";const d="/assets/vip-webdav.17dfb7ac.jpg",I=JSON.parse('{"title":"插件会员","description":"","frontmatter":{},"headers":[{"level":2,"title":"会员权益","slug":"会员权益","link":"#会员权益","children":[]},{"level":2,"title":"会员定价","slug":"会员定价","link":"#会员定价","children":[]},{"level":2,"title":"WebDav同步功能","slug":"webdav同步功能","link":"#webdav同步功能","children":[]},{"level":2,"title":"更多内容","slug":"更多内容","link":"#更多内容","children":[]}],"relativePath":"project/ClipboardManager/vip/index.md","lastUpdated":1675780846000}'),c={name:"project/ClipboardManager/vip/index.md"},p=a("",3),_=e("strong",null,"插件会员",-1),u=e("code",null,"WebDav同步功能 轻点鼠标即可多端同步",-1),h=e("code",null,"最多支持保存2000条历史记录",-1),b=e("code",null,"不限制历史记录过期时间",-1),g=e("code",null,"文本内容增强 识别文本内容为色值、链接",-1),v=e("code",null,"自定义分类排序",-1),f=e("code",null,"预览页代码高亮",-1),x=e("code",null,"支持关闭剪贴板图片记录",-1),m=e("code",null,"插件使用统计",-1),T=e("li",null,[e("strong",null,"...")],-1),k=e("strong",null,"uTools会员",-1),D=e("code",null,"插件使用统计",-1),w=a("",14);function y(V,W,N,A,S,j){const l=o("Badge");return r(),s("div",null,[p,e("ul",null,[e("li",null,[_,e("ul",null,[e("li",null,[u,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[h,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[b,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[g,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[v,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[f,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[x,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[m,t(),i(l,{type:"tip",text:"已上线"})]),T])]),e("li",null,[k,e("ul",null,[e("li",null,[D,t(),i(l,{type:"tip",text:"已上线"})])])])]),w])}const P=n(c,[["render",y]]);export{I as __pageData,P as default}; +import{_ as n,r as o,o as r,c as s,b as e,d as t,e as i,a}from"./app.94d5b31a.js";const d="/assets/vip-webdav.17dfb7ac.jpg",I=JSON.parse('{"title":"插件会员","description":"","frontmatter":{},"headers":[{"level":2,"title":"会员权益","slug":"会员权益","link":"#会员权益","children":[]},{"level":2,"title":"会员定价","slug":"会员定价","link":"#会员定价","children":[]},{"level":2,"title":"WebDav同步功能","slug":"webdav同步功能","link":"#webdav同步功能","children":[]},{"level":2,"title":"更多内容","slug":"更多内容","link":"#更多内容","children":[]}],"relativePath":"project/ClipboardManager/vip/index.md","lastUpdated":1675783866000}'),c={name:"project/ClipboardManager/vip/index.md"},p=a("",3),_=e("strong",null,"插件会员",-1),u=e("code",null,"WebDav同步功能 轻点鼠标即可多端同步",-1),h=e("code",null,"最多支持保存2000条历史记录",-1),b=e("code",null,"不限制历史记录过期时间",-1),g=e("code",null,"文本内容增强 识别文本内容为色值、链接",-1),v=e("code",null,"自定义分类排序",-1),f=e("code",null,"预览页代码高亮",-1),x=e("code",null,"支持关闭剪贴板图片记录",-1),m=e("code",null,"插件使用统计",-1),T=e("li",null,[e("strong",null,"...")],-1),k=e("strong",null,"uTools会员",-1),D=e("code",null,"插件使用统计",-1),w=a("",14);function y(V,W,N,A,S,j){const l=o("Badge");return r(),s("div",null,[p,e("ul",null,[e("li",null,[_,e("ul",null,[e("li",null,[u,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[h,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[b,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[g,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[v,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[f,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[x,t(),i(l,{type:"tip",text:"已上线"})]),e("li",null,[m,t(),i(l,{type:"tip",text:"已上线"})]),T])]),e("li",null,[k,e("ul",null,[e("li",null,[D,t(),i(l,{type:"tip",text:"已上线"})])])])]),w])}const P=n(c,[["render",y]]);export{I as __pageData,P as default}; diff --git a/assets/project_SmartWordBreak_index.md.e19aed30.js b/assets/project_SmartWordBreak_index.md.8e06fb08.js similarity index 91% rename from assets/project_SmartWordBreak_index.md.e19aed30.js rename to assets/project_SmartWordBreak_index.md.8e06fb08.js index 1d56a5e3..dc1dfefb 100644 --- a/assets/project_SmartWordBreak_index.md.e19aed30.js +++ b/assets/project_SmartWordBreak_index.md.8e06fb08.js @@ -1 +1 @@ -import{r as a,o as l,c as i,e as r,n,g as s,a as o}from"./app.a81d7d4f.js";const c="/assets/img1.c8b019e1.png",d="/assets/img2.e389ad4d.png",_="/assets/logo.b98f7a12.png",p=o('

🔰 开始使用

服务器不会保留处理的数据, 但请避免使用此功能处理敏感数据

  • ✅ 支持选中文本后通过超级面板直接进入分词
  • ✅ 支持直接读取剪贴板文本分词
  • ✅ 支持单选/拖拽/跨段落快速拖选
  • ✅ 支持一键合并复制/粘贴/翻译/搜索
  • ✅ 普通用户有每日免费额度 每日0:00重置
  • ✅ 优雅、迅速的动效与交互 适配深色模式
  • ✅ 可以通过插件内入口获取更多额度
  • ✅ 与超级剪贴板插件集成,一次购买 多处使用

📚 安装方式

',8),b=JSON.parse('{"title":"超级分词","description":"","frontmatter":{"title":"超级分词","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/SmartWordBreak/index.md","lastUpdated":1675780846000}'),h={name:"project/SmartWordBreak/index.md"},T=Object.assign(h,{setup(g){const e={subTitle:"✨ 智慧分词,快速提取文本关键词。",logo:_,linkList:[{content:"⭐ 插件发布页",target:"https://yuanliao.info/d/5722/29"},{content:"🌎 Q&A",target:"./statement/"},{content:"🚚 更新日志",target:"./log/"}]};return(m,u)=>{const t=a("Title");return l(),i("div",null,[r(t,n(s(e)),null,16),p])}}});export{b as __pageData,T as default}; +import{r as a,o as l,c as i,e as r,n,g as s,a as o}from"./app.94d5b31a.js";const c="/assets/img1.c8b019e1.png",d="/assets/img2.e389ad4d.png",_="/assets/logo.b98f7a12.png",p=o('

🔰 开始使用

服务器不会保留处理的数据, 但请避免使用此功能处理敏感数据

  • ✅ 支持选中文本后通过超级面板直接进入分词
  • ✅ 支持直接读取剪贴板文本分词
  • ✅ 支持单选/拖拽/跨段落快速拖选
  • ✅ 支持一键合并复制/粘贴/翻译/搜索
  • ✅ 普通用户有每日免费额度 每日0:00重置
  • ✅ 优雅、迅速的动效与交互 适配深色模式
  • ✅ 可以通过插件内入口获取更多额度
  • ✅ 与超级剪贴板插件集成,一次购买 多处使用

📚 安装方式

',8),b=JSON.parse('{"title":"超级分词","description":"","frontmatter":{"title":"超级分词","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/SmartWordBreak/index.md","lastUpdated":1675783866000}'),h={name:"project/SmartWordBreak/index.md"},T=Object.assign(h,{setup(g){const e={subTitle:"✨ 智慧分词,快速提取文本关键词。",logo:_,linkList:[{content:"⭐ 插件发布页",target:"https://yuanliao.info/d/5722/29"},{content:"🌎 Q&A",target:"./statement/"},{content:"🚚 更新日志",target:"./log/"}]};return(m,u)=>{const t=a("Title");return l(),i("div",null,[r(t,n(s(e)),null,16),p])}}});export{b as __pageData,T as default}; diff --git a/assets/project_SmartWordBreak_index.md.e19aed30.lean.js b/assets/project_SmartWordBreak_index.md.8e06fb08.lean.js similarity index 81% rename from assets/project_SmartWordBreak_index.md.e19aed30.lean.js rename to assets/project_SmartWordBreak_index.md.8e06fb08.lean.js index 3ee4299e..c89a7def 100644 --- a/assets/project_SmartWordBreak_index.md.e19aed30.lean.js +++ b/assets/project_SmartWordBreak_index.md.8e06fb08.lean.js @@ -1 +1 @@ -import{r as a,o as l,c as i,e as r,n,g as s,a as o}from"./app.a81d7d4f.js";const c="/assets/img1.c8b019e1.png",d="/assets/img2.e389ad4d.png",_="/assets/logo.b98f7a12.png",p=o("",8),b=JSON.parse('{"title":"超级分词","description":"","frontmatter":{"title":"超级分词","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/SmartWordBreak/index.md","lastUpdated":1675780846000}'),h={name:"project/SmartWordBreak/index.md"},T=Object.assign(h,{setup(g){const e={subTitle:"✨ 智慧分词,快速提取文本关键词。",logo:_,linkList:[{content:"⭐ 插件发布页",target:"https://yuanliao.info/d/5722/29"},{content:"🌎 Q&A",target:"./statement/"},{content:"🚚 更新日志",target:"./log/"}]};return(m,u)=>{const t=a("Title");return l(),i("div",null,[r(t,n(s(e)),null,16),p])}}});export{b as __pageData,T as default}; +import{r as a,o as l,c as i,e as r,n,g as s,a as o}from"./app.94d5b31a.js";const c="/assets/img1.c8b019e1.png",d="/assets/img2.e389ad4d.png",_="/assets/logo.b98f7a12.png",p=o("",8),b=JSON.parse('{"title":"超级分词","description":"","frontmatter":{"title":"超级分词","navbar":false},"headers":[{"level":2,"title":"🔰 开始使用","slug":"🔰-开始使用","link":"#🔰-开始使用","children":[]},{"level":2,"title":"📚 安装方式","slug":"📚-安装方式","link":"#📚-安装方式","children":[]}],"relativePath":"project/SmartWordBreak/index.md","lastUpdated":1675783866000}'),h={name:"project/SmartWordBreak/index.md"},T=Object.assign(h,{setup(g){const e={subTitle:"✨ 智慧分词,快速提取文本关键词。",logo:_,linkList:[{content:"⭐ 插件发布页",target:"https://yuanliao.info/d/5722/29"},{content:"🌎 Q&A",target:"./statement/"},{content:"🚚 更新日志",target:"./log/"}]};return(m,u)=>{const t=a("Title");return l(),i("div",null,[r(t,n(s(e)),null,16),p])}}});export{b as __pageData,T as default}; diff --git a/assets/project_SmartWordBreak_log_index.md.11349d6f.js b/assets/project_SmartWordBreak_log_index.md.c4990e36.js similarity index 94% rename from assets/project_SmartWordBreak_log_index.md.11349d6f.js rename to assets/project_SmartWordBreak_log_index.md.c4990e36.js index f81163b3..2ac5b550 100644 --- a/assets/project_SmartWordBreak_log_index.md.11349d6f.js +++ b/assets/project_SmartWordBreak_log_index.md.c4990e36.js @@ -1 +1 @@ -import{_ as e,o as a,c as l,a as i}from"./app.a81d7d4f.js";const f=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v1.0.5","slug":"v1-0-5","link":"#v1-0-5","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/SmartWordBreak/log/index.md","lastUpdated":1675780846000}'),d={name:"project/SmartWordBreak/log/index.md"},t=i('

更新日志

v1.0.5

2022-12-17

  • feat: 限免活动 每日免费额度调整为99 移除充值入口
  • fix: 修复历史记录显示问题

v1.0.4

2022-09-25

  • feat: 分词上限提高到了1000个字符
  • feat: token支持本地缓存

v1.0.3

2022-09-19

  • feat: 增加历史记录功能
  • fix: 移除了在tag外按下鼠标拖选的功能

v1.0.2

2022-09-13

  • feat: 支持跨段快速拖选
  • feat: 分词页添加了搜索粘贴功能
  • feat: 优化换行符在分词页的表现 支持包含换行符拖选

v1.0.1

2022-09-13

  • feat: 增加了拖选过程中的动效
  • feat: 调整了按钮样式与颜色
  • fix: 移除了碍事的toast

v1.0.0

2022-09-11

  • release: v1.0.0发布
',19),r=[t];function c(n,h,o,v,s,u){return a(),l("div",null,r)}const p=e(d,[["render",c]]);export{f as __pageData,p as default}; +import{_ as e,o as a,c as l,a as i}from"./app.94d5b31a.js";const f=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v1.0.5","slug":"v1-0-5","link":"#v1-0-5","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/SmartWordBreak/log/index.md","lastUpdated":1675783866000}'),d={name:"project/SmartWordBreak/log/index.md"},t=i('

更新日志

v1.0.5

2022-12-17

  • feat: 限免活动 每日免费额度调整为99 移除充值入口
  • fix: 修复历史记录显示问题

v1.0.4

2022-09-25

  • feat: 分词上限提高到了1000个字符
  • feat: token支持本地缓存

v1.0.3

2022-09-19

  • feat: 增加历史记录功能
  • fix: 移除了在tag外按下鼠标拖选的功能

v1.0.2

2022-09-13

  • feat: 支持跨段快速拖选
  • feat: 分词页添加了搜索粘贴功能
  • feat: 优化换行符在分词页的表现 支持包含换行符拖选

v1.0.1

2022-09-13

  • feat: 增加了拖选过程中的动效
  • feat: 调整了按钮样式与颜色
  • fix: 移除了碍事的toast

v1.0.0

2022-09-11

  • release: v1.0.0发布
',19),r=[t];function c(n,h,o,v,s,u){return a(),l("div",null,r)}const p=e(d,[["render",c]]);export{f as __pageData,p as default}; diff --git a/assets/project_SmartWordBreak_log_index.md.11349d6f.lean.js b/assets/project_SmartWordBreak_log_index.md.c4990e36.lean.js similarity index 85% rename from assets/project_SmartWordBreak_log_index.md.11349d6f.lean.js rename to assets/project_SmartWordBreak_log_index.md.c4990e36.lean.js index e9a0e684..55db90a3 100644 --- a/assets/project_SmartWordBreak_log_index.md.11349d6f.lean.js +++ b/assets/project_SmartWordBreak_log_index.md.c4990e36.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as l,a as i}from"./app.a81d7d4f.js";const f=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v1.0.5","slug":"v1-0-5","link":"#v1-0-5","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/SmartWordBreak/log/index.md","lastUpdated":1675780846000}'),d={name:"project/SmartWordBreak/log/index.md"},t=i("",19),r=[t];function c(n,h,o,v,s,u){return a(),l("div",null,r)}const p=e(d,[["render",c]]);export{f as __pageData,p as default}; +import{_ as e,o as a,c as l,a as i}from"./app.94d5b31a.js";const f=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[{"level":2,"title":"v1.0.5","slug":"v1-0-5","link":"#v1-0-5","children":[]},{"level":2,"title":"v1.0.4","slug":"v1-0-4","link":"#v1-0-4","children":[]},{"level":2,"title":"v1.0.3","slug":"v1-0-3","link":"#v1-0-3","children":[]},{"level":2,"title":"v1.0.2","slug":"v1-0-2","link":"#v1-0-2","children":[]},{"level":2,"title":"v1.0.1","slug":"v1-0-1","link":"#v1-0-1","children":[]},{"level":2,"title":"v1.0.0","slug":"v1-0-0","link":"#v1-0-0","children":[]}],"relativePath":"project/SmartWordBreak/log/index.md","lastUpdated":1675783866000}'),d={name:"project/SmartWordBreak/log/index.md"},t=i("",19),r=[t];function c(n,h,o,v,s,u){return a(),l("div",null,r)}const p=e(d,[["render",c]]);export{f as __pageData,p as default}; diff --git a/assets/project_SmartWordBreak_statement_index.md.7b706e83.js b/assets/project_SmartWordBreak_statement_index.md.4e170fb2.js similarity index 92% rename from assets/project_SmartWordBreak_statement_index.md.7b706e83.js rename to assets/project_SmartWordBreak_statement_index.md.4e170fb2.js index 6b42de41..fe60fba7 100644 --- a/assets/project_SmartWordBreak_statement_index.md.7b706e83.js +++ b/assets/project_SmartWordBreak_statement_index.md.4e170fb2.js @@ -1 +1 @@ -import{_ as e,o as a,c as o,a as t}from"./app.a81d7d4f.js";const h=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[],"relativePath":"project/SmartWordBreak/statement/index.md","lastUpdated":1675780846000}'),i={name:"project/SmartWordBreak/statement/index.md"},l=t('

Q&A

  • Q: 为什么要收费
  • A: 此功能需要服务器资源, 而服务器资源有限, 故暂时只开放部分的免费资源给大家使用, 普通用户每日有部分免费额度, 额度每日0:00重置

  • Q: 我支付了,但是没有收到额度
  • A: 支付成功后,插件会自动获取最新用户信息,如果信息没有自动更新,请尝试退出插件后重新进入,如果仍未收到额度,请加入QQ群 769115389并联系我,我会尽快核实并为你解决

  • Q: 我之前赞赏过,可以有优惠吗
  • A: 2022年9月13日0:00前,赞赏过我的uTools用户,请发送:
    • UUID(超级分词插件内展示)
    • 赞赏金额
    • 赞赏时间
    • 支付截图
  • 到邮箱ZiuChen@outlook.com,邮箱主题为:申请超级分词赞赏额度,我将在核实后为你提供赞赏金额+15%的额度,感谢你的支持!💖。
',6),r=[l];function c(d,n,s,_,m,p){return a(),o("div",null,r)}const f=e(i,[["render",c]]);export{h as __pageData,f as default}; +import{_ as e,o as a,c as o,a as t}from"./app.94d5b31a.js";const h=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[],"relativePath":"project/SmartWordBreak/statement/index.md","lastUpdated":1675783866000}'),i={name:"project/SmartWordBreak/statement/index.md"},l=t('

Q&A

  • Q: 为什么要收费
  • A: 此功能需要服务器资源, 而服务器资源有限, 故暂时只开放部分的免费资源给大家使用, 普通用户每日有部分免费额度, 额度每日0:00重置

  • Q: 我支付了,但是没有收到额度
  • A: 支付成功后,插件会自动获取最新用户信息,如果信息没有自动更新,请尝试退出插件后重新进入,如果仍未收到额度,请加入QQ群 769115389并联系我,我会尽快核实并为你解决

  • Q: 我之前赞赏过,可以有优惠吗
  • A: 2022年9月13日0:00前,赞赏过我的uTools用户,请发送:
    • UUID(超级分词插件内展示)
    • 赞赏金额
    • 赞赏时间
    • 支付截图
  • 到邮箱ZiuChen@outlook.com,邮箱主题为:申请超级分词赞赏额度,我将在核实后为你提供赞赏金额+15%的额度,感谢你的支持!💖。
',6),r=[l];function c(d,n,s,_,m,p){return a(),o("div",null,r)}const f=e(i,[["render",c]]);export{h as __pageData,f as default}; diff --git a/assets/project_SmartWordBreak_statement_index.md.7b706e83.lean.js b/assets/project_SmartWordBreak_statement_index.md.4e170fb2.lean.js similarity index 70% rename from assets/project_SmartWordBreak_statement_index.md.7b706e83.lean.js rename to assets/project_SmartWordBreak_statement_index.md.4e170fb2.lean.js index 97e59608..5986b60f 100644 --- a/assets/project_SmartWordBreak_statement_index.md.7b706e83.lean.js +++ b/assets/project_SmartWordBreak_statement_index.md.4e170fb2.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as o,a as t}from"./app.a81d7d4f.js";const h=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[],"relativePath":"project/SmartWordBreak/statement/index.md","lastUpdated":1675780846000}'),i={name:"project/SmartWordBreak/statement/index.md"},l=t("",6),r=[l];function c(d,n,s,_,m,p){return a(),o("div",null,r)}const f=e(i,[["render",c]]);export{h as __pageData,f as default}; +import{_ as e,o as a,c as o,a as t}from"./app.94d5b31a.js";const h=JSON.parse('{"title":"Q&A","description":"","frontmatter":{"navbar":false},"headers":[],"relativePath":"project/SmartWordBreak/statement/index.md","lastUpdated":1675783866000}'),i={name:"project/SmartWordBreak/statement/index.md"},l=t("",6),r=[l];function c(d,n,s,_,m,p){return a(),o("div",null,r)}const f=e(i,[["render",c]]);export{h as __pageData,f as default}; diff --git a/assets/self_index.md.1b5c3151.js b/assets/self_index.md.d9f8db79.js similarity index 98% rename from assets/self_index.md.1b5c3151.js rename to assets/self_index.md.d9f8db79.js index a4f4ff7b..33f225c1 100644 --- a/assets/self_index.md.1b5c3151.js +++ b/assets/self_index.md.d9f8db79.js @@ -1 +1 @@ -import{_ as e,o,c as a,a as l}from"./app.a81d7d4f.js";const t="/logo.png",i="/assets/2.7aeaaf23.png",s="/assets/1.136ffa4a.png",_=JSON.parse('{"title":"个人介绍","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"技术栈","slug":"技术栈","link":"#技术栈","children":[{"level":3,"title":"前端技术","slug":"前端技术","link":"#前端技术","children":[]},{"level":3,"title":"后端技术","slug":"后端技术","link":"#后端技术","children":[]},{"level":3,"title":"相关技能","slug":"相关技能","link":"#相关技能","children":[]}]},{"level":2,"title":"获得奖项","slug":"获得奖项","link":"#获得奖项","children":[{"level":3,"title":"Microsoft Edge 浏览器开拓者大赛 开拓之星","slug":"microsoft-edge-浏览器开拓者大赛-开拓之星","link":"#microsoft-edge-浏览器开拓者大赛-开拓之星","children":[]},{"level":3,"title":"稀土掘金2022编程挑战赛 三等奖","slug":"稀土掘金2022编程挑战赛-三等奖","link":"#稀土掘金2022编程挑战赛-三等奖","children":[]},{"level":3,"title":"入选“扬帆计划·中央和国家机关大学生实习”","slug":"入选-扬帆计划·中央和国家机关大学生实习","link":"#入选-扬帆计划·中央和国家机关大学生实习","children":[]},{"level":3,"title":"100周年现场志愿者","slug":"_100周年现场志愿者","link":"#_100周年现场志愿者","children":[]},{"level":3,"title":"优秀学生干部、优秀共青团员","slug":"优秀学生干部、优秀共青团员","link":"#优秀学生干部、优秀共青团员","children":[]},{"level":3,"title":"社会工作优秀奖学金","slug":"社会工作优秀奖学金","link":"#社会工作优秀奖学金","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"self/index.md","lastUpdated":1675780846000}'),r={name:"self/index.md"},d=l('

个人介绍

logo

北京交通大学(BeijingJiaoTong University)电子信息工程学院本科在读

  • 熟悉ES6特性, 有前端领域开发经验, 能独立完成基础的前端开发工作;
  • 熟练使用Vue框架及相关工具开发应用, 阅读过部分Vue源码, 了解Vue响应式实现原理;
  • 掌握NodeJS基本使用, 能够基于NodeJS编写开发工具或搭建Web服务;
  • 了解Webpack基本配置和使用, 有Webpack Vite等前端工程化工具使用经验;
  • 了解Typescript, 有Typescript的项目使用经历;
  • 良好的Git操作, 清晰的Commit提交, 保证代码质量;
  • 对前端学习抱有热情, 有良好的学习能力, 能够快速学习掌握新知识;

技术栈

前端技术

Vue Router Vuex Pinia Element Plus Echart WangEditor

Sass/Less Axios Ajax ...

后端技术

相关技能

文档处理:

Microsoft Word Microsoft PowerPoint Microsoft Excel

平面设计:

Adobe PhotoShop Adobe Lightroom

影音制作:

DaVinci Resolve Studio Adobe Premiere Adobe After Effects

专业软件:

MATLAB ICEDA Multisim Keil uVision5

获得奖项

Microsoft Edge 浏览器开拓者大赛 开拓之星

稀土掘金2022编程挑战赛 三等奖

入选“扬帆计划·中央和国家机关大学生实习”

100周年现场志愿者

优秀学生干部、优秀共青团员

社会工作优秀奖学金

相关链接

Github哔哩哔哩稀土掘金CSDNGitee

',35),c=[d];function h(g,p,n,m,f,u){return o(),a("div",null,c)}const C=e(r,[["render",h]]);export{_ as __pageData,C as default}; +import{_ as e,o,c as a,a as l}from"./app.94d5b31a.js";const t="/logo.png",i="/assets/2.7aeaaf23.png",s="/assets/1.136ffa4a.png",_=JSON.parse('{"title":"个人介绍","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"技术栈","slug":"技术栈","link":"#技术栈","children":[{"level":3,"title":"前端技术","slug":"前端技术","link":"#前端技术","children":[]},{"level":3,"title":"后端技术","slug":"后端技术","link":"#后端技术","children":[]},{"level":3,"title":"相关技能","slug":"相关技能","link":"#相关技能","children":[]}]},{"level":2,"title":"获得奖项","slug":"获得奖项","link":"#获得奖项","children":[{"level":3,"title":"Microsoft Edge 浏览器开拓者大赛 开拓之星","slug":"microsoft-edge-浏览器开拓者大赛-开拓之星","link":"#microsoft-edge-浏览器开拓者大赛-开拓之星","children":[]},{"level":3,"title":"稀土掘金2022编程挑战赛 三等奖","slug":"稀土掘金2022编程挑战赛-三等奖","link":"#稀土掘金2022编程挑战赛-三等奖","children":[]},{"level":3,"title":"入选“扬帆计划·中央和国家机关大学生实习”","slug":"入选-扬帆计划·中央和国家机关大学生实习","link":"#入选-扬帆计划·中央和国家机关大学生实习","children":[]},{"level":3,"title":"100周年现场志愿者","slug":"_100周年现场志愿者","link":"#_100周年现场志愿者","children":[]},{"level":3,"title":"优秀学生干部、优秀共青团员","slug":"优秀学生干部、优秀共青团员","link":"#优秀学生干部、优秀共青团员","children":[]},{"level":3,"title":"社会工作优秀奖学金","slug":"社会工作优秀奖学金","link":"#社会工作优秀奖学金","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"self/index.md","lastUpdated":1675783866000}'),r={name:"self/index.md"},d=l('

个人介绍

logo

北京交通大学(BeijingJiaoTong University)电子信息工程学院本科在读

  • 熟悉ES6特性, 有前端领域开发经验, 能独立完成基础的前端开发工作;
  • 熟练使用Vue框架及相关工具开发应用, 阅读过部分Vue源码, 了解Vue响应式实现原理;
  • 掌握NodeJS基本使用, 能够基于NodeJS编写开发工具或搭建Web服务;
  • 了解Webpack基本配置和使用, 有Webpack Vite等前端工程化工具使用经验;
  • 了解Typescript, 有Typescript的项目使用经历;
  • 良好的Git操作, 清晰的Commit提交, 保证代码质量;
  • 对前端学习抱有热情, 有良好的学习能力, 能够快速学习掌握新知识;

技术栈

前端技术

Vue Router Vuex Pinia Element Plus Echart WangEditor

Sass/Less Axios Ajax ...

后端技术

相关技能

文档处理:

Microsoft Word Microsoft PowerPoint Microsoft Excel

平面设计:

Adobe PhotoShop Adobe Lightroom

影音制作:

DaVinci Resolve Studio Adobe Premiere Adobe After Effects

专业软件:

MATLAB ICEDA Multisim Keil uVision5

获得奖项

Microsoft Edge 浏览器开拓者大赛 开拓之星

稀土掘金2022编程挑战赛 三等奖

入选“扬帆计划·中央和国家机关大学生实习”

100周年现场志愿者

优秀学生干部、优秀共青团员

社会工作优秀奖学金

相关链接

Github哔哩哔哩稀土掘金CSDNGitee

',35),c=[d];function h(g,p,n,m,f,u){return o(),a("div",null,c)}const C=e(r,[["render",h]]);export{_ as __pageData,C as default}; diff --git a/assets/self_index.md.1b5c3151.lean.js b/assets/self_index.md.d9f8db79.lean.js similarity index 93% rename from assets/self_index.md.1b5c3151.lean.js rename to assets/self_index.md.d9f8db79.lean.js index 1f10d550..405da08a 100644 --- a/assets/self_index.md.1b5c3151.lean.js +++ b/assets/self_index.md.d9f8db79.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,a as l}from"./app.a81d7d4f.js";const t="/logo.png",i="/assets/2.7aeaaf23.png",s="/assets/1.136ffa4a.png",_=JSON.parse('{"title":"个人介绍","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"技术栈","slug":"技术栈","link":"#技术栈","children":[{"level":3,"title":"前端技术","slug":"前端技术","link":"#前端技术","children":[]},{"level":3,"title":"后端技术","slug":"后端技术","link":"#后端技术","children":[]},{"level":3,"title":"相关技能","slug":"相关技能","link":"#相关技能","children":[]}]},{"level":2,"title":"获得奖项","slug":"获得奖项","link":"#获得奖项","children":[{"level":3,"title":"Microsoft Edge 浏览器开拓者大赛 开拓之星","slug":"microsoft-edge-浏览器开拓者大赛-开拓之星","link":"#microsoft-edge-浏览器开拓者大赛-开拓之星","children":[]},{"level":3,"title":"稀土掘金2022编程挑战赛 三等奖","slug":"稀土掘金2022编程挑战赛-三等奖","link":"#稀土掘金2022编程挑战赛-三等奖","children":[]},{"level":3,"title":"入选“扬帆计划·中央和国家机关大学生实习”","slug":"入选-扬帆计划·中央和国家机关大学生实习","link":"#入选-扬帆计划·中央和国家机关大学生实习","children":[]},{"level":3,"title":"100周年现场志愿者","slug":"_100周年现场志愿者","link":"#_100周年现场志愿者","children":[]},{"level":3,"title":"优秀学生干部、优秀共青团员","slug":"优秀学生干部、优秀共青团员","link":"#优秀学生干部、优秀共青团员","children":[]},{"level":3,"title":"社会工作优秀奖学金","slug":"社会工作优秀奖学金","link":"#社会工作优秀奖学金","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"self/index.md","lastUpdated":1675780846000}'),r={name:"self/index.md"},d=l("",35),c=[d];function h(g,p,n,m,f,u){return o(),a("div",null,c)}const C=e(r,[["render",h]]);export{_ as __pageData,C as default}; +import{_ as e,o,c as a,a as l}from"./app.94d5b31a.js";const t="/logo.png",i="/assets/2.7aeaaf23.png",s="/assets/1.136ffa4a.png",_=JSON.parse('{"title":"个人介绍","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"技术栈","slug":"技术栈","link":"#技术栈","children":[{"level":3,"title":"前端技术","slug":"前端技术","link":"#前端技术","children":[]},{"level":3,"title":"后端技术","slug":"后端技术","link":"#后端技术","children":[]},{"level":3,"title":"相关技能","slug":"相关技能","link":"#相关技能","children":[]}]},{"level":2,"title":"获得奖项","slug":"获得奖项","link":"#获得奖项","children":[{"level":3,"title":"Microsoft Edge 浏览器开拓者大赛 开拓之星","slug":"microsoft-edge-浏览器开拓者大赛-开拓之星","link":"#microsoft-edge-浏览器开拓者大赛-开拓之星","children":[]},{"level":3,"title":"稀土掘金2022编程挑战赛 三等奖","slug":"稀土掘金2022编程挑战赛-三等奖","link":"#稀土掘金2022编程挑战赛-三等奖","children":[]},{"level":3,"title":"入选“扬帆计划·中央和国家机关大学生实习”","slug":"入选-扬帆计划·中央和国家机关大学生实习","link":"#入选-扬帆计划·中央和国家机关大学生实习","children":[]},{"level":3,"title":"100周年现场志愿者","slug":"_100周年现场志愿者","link":"#_100周年现场志愿者","children":[]},{"level":3,"title":"优秀学生干部、优秀共青团员","slug":"优秀学生干部、优秀共青团员","link":"#优秀学生干部、优秀共青团员","children":[]},{"level":3,"title":"社会工作优秀奖学金","slug":"社会工作优秀奖学金","link":"#社会工作优秀奖学金","children":[]}]},{"level":2,"title":"相关链接","slug":"相关链接","link":"#相关链接","children":[]}],"relativePath":"self/index.md","lastUpdated":1675783866000}'),r={name:"self/index.md"},d=l("",35),c=[d];function h(g,p,n,m,f,u){return o(),a("div",null,c)}const C=e(r,[["render",h]]);export{_ as __pageData,C as default}; diff --git a/assets/works_contribution.md.b453765d.js b/assets/works_contribution.md.48ce0aab.js similarity index 91% rename from assets/works_contribution.md.b453765d.js rename to assets/works_contribution.md.48ce0aab.js index e292216c..abb8fc23 100644 --- a/assets/works_contribution.md.b453765d.js +++ b/assets/works_contribution.md.48ce0aab.js @@ -1 +1 @@ -import{_ as e,o as r,c as a,a as t}from"./app.a81d7d4f.js";const f=JSON.parse('{"title":"社区贡献","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"稀土掘金助手","slug":"稀土掘金助手","link":"#稀土掘金助手","children":[]},{"level":2,"title":"B站粉丝牌助手文档","slug":"b站粉丝牌助手文档","link":"#b站粉丝牌助手文档","children":[]}],"relativePath":"works/contribution.md","lastUpdated":1675780846000}'),n={name:"works/contribution.md"},i=t('

社区贡献

稀土掘金助手

稀土掘金助手: 腾讯云函数部署

源代码

B站粉丝牌助手文档

B站粉丝牌助手文档

源代码Demo

',7),o=[i];function s(h,l,d,c,_,p){return r(),a("div",null,o)}const b=e(n,[["render",s]]);export{f as __pageData,b as default}; +import{_ as e,o as r,c as a,a as t}from"./app.94d5b31a.js";const f=JSON.parse('{"title":"社区贡献","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"稀土掘金助手","slug":"稀土掘金助手","link":"#稀土掘金助手","children":[]},{"level":2,"title":"B站粉丝牌助手文档","slug":"b站粉丝牌助手文档","link":"#b站粉丝牌助手文档","children":[]}],"relativePath":"works/contribution.md","lastUpdated":1675783866000}'),n={name:"works/contribution.md"},i=t('

社区贡献

稀土掘金助手

稀土掘金助手: 腾讯云函数部署

源代码

B站粉丝牌助手文档

B站粉丝牌助手文档

源代码Demo

',7),o=[i];function s(h,l,d,c,_,p){return r(),a("div",null,o)}const b=e(n,[["render",s]]);export{f as __pageData,b as default}; diff --git a/assets/works_contribution.md.b453765d.lean.js b/assets/works_contribution.md.48ce0aab.lean.js similarity index 80% rename from assets/works_contribution.md.b453765d.lean.js rename to assets/works_contribution.md.48ce0aab.lean.js index 5c397024..758d0567 100644 --- a/assets/works_contribution.md.b453765d.lean.js +++ b/assets/works_contribution.md.48ce0aab.lean.js @@ -1 +1 @@ -import{_ as e,o as r,c as a,a as t}from"./app.a81d7d4f.js";const f=JSON.parse('{"title":"社区贡献","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"稀土掘金助手","slug":"稀土掘金助手","link":"#稀土掘金助手","children":[]},{"level":2,"title":"B站粉丝牌助手文档","slug":"b站粉丝牌助手文档","link":"#b站粉丝牌助手文档","children":[]}],"relativePath":"works/contribution.md","lastUpdated":1675780846000}'),n={name:"works/contribution.md"},i=t("",7),o=[i];function s(h,l,d,c,_,p){return r(),a("div",null,o)}const b=e(n,[["render",s]]);export{f as __pageData,b as default}; +import{_ as e,o as r,c as a,a as t}from"./app.94d5b31a.js";const f=JSON.parse('{"title":"社区贡献","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"稀土掘金助手","slug":"稀土掘金助手","link":"#稀土掘金助手","children":[]},{"level":2,"title":"B站粉丝牌助手文档","slug":"b站粉丝牌助手文档","link":"#b站粉丝牌助手文档","children":[]}],"relativePath":"works/contribution.md","lastUpdated":1675783866000}'),n={name:"works/contribution.md"},i=t("",7),o=[i];function s(h,l,d,c,_,p){return r(),a("div",null,o)}const b=e(n,[["render",s]]);export{f as __pageData,b as default}; diff --git a/assets/works_opensource.md.56fe7cda.js b/assets/works_opensource.md.273cfbe0.js similarity index 97% rename from assets/works_opensource.md.56fe7cda.js rename to assets/works_opensource.md.273cfbe0.js index 9f5f5789..91bbca12 100644 --- a/assets/works_opensource.md.56fe7cda.js +++ b/assets/works_opensource.md.273cfbe0.js @@ -1 +1 @@ -import{_ as e,o as r,c as a,a as t}from"./app.a81d7d4f.js";const b=JSON.parse('{"title":"个人作品","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"Vue3+TypeScript后台管理系统","slug":"vue3-typescript后台管理系统","link":"#vue3-typescript后台管理系统","children":[]},{"level":2,"title":"Typein 效率工具集","slug":"typein-效率工具集","link":"#typein-效率工具集","children":[]},{"level":2,"title":"A-SOUL浏览器宠物","slug":"a-soul浏览器宠物","link":"#a-soul浏览器宠物","children":[]},{"level":2,"title":"北京交通大学课程平台功能增强","slug":"北京交通大学课程平台功能增强","link":"#北京交通大学课程平台功能增强","children":[]},{"level":2,"title":"超级剪贴板","slug":"超级剪贴板","link":"#超级剪贴板","children":[]},{"level":2,"title":"超级粘贴","slug":"超级粘贴","link":"#超级粘贴","children":[]},{"level":2,"title":"超级分词","slug":"超级分词","link":"#超级分词","children":[]},{"level":2,"title":"超级连点器","slug":"超级连点器","link":"#超级连点器","children":[]},{"level":2,"title":"PopNotify","slug":"popnotify","link":"#popnotify","children":[]},{"level":2,"title":"UserScripts","slug":"userscripts","link":"#userscripts","children":[]}],"relativePath":"works/opensource.md","lastUpdated":1675780846000}'),i={name:"works/opensource.md"},h=t('

个人作品

Vue3+TypeScript后台管理系统

Vue3+TypeScript后台管理系统

源代码

Typein 效率工具集

Typein 是一个运行在现代浏览器上的拓展插件,它可以帮助你在保持专注的情况下,高效完成各种操作。

源代码

宣传视频

Microsoft Edge Add-on Store

A-SOUL浏览器宠物

在浏览器里养一只A-Soul成员当宠物

源代码

宣传视频

北京交通大学课程平台功能增强

北京交通大学课程平台功能增强脚本,实现信息聚合,附件上传,让你高效处理课程信息。

源代码

超级剪贴板

uTools插件,一款强大的剪贴板管理工具。基于Vue3构建

源代码

主页

超级粘贴

uTools插件,将剪切板内容直接粘贴为文件。功能基于NodeJS

源代码

超级分词

uTools插件,前台使用Vue3+ElementPlus构建,后台基于Express封装结巴分词并暴露API接口

超级连点器

uTools插件,界面使用Vue3+AntDesign构建,功能基于Worker

PopNotify

仿 Element UI 的通知卡片。

源代码

Demo

UserScripts

用户脚本合集,生产力工具、效率工具、自动化脚本

源代码

',34),n=[h];function l(p,o,s,d,c,u){return r(),a("div",null,n)}const g=e(i,[["render",l]]);export{b as __pageData,g as default}; +import{_ as e,o as r,c as a,a as t}from"./app.94d5b31a.js";const b=JSON.parse('{"title":"个人作品","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"Vue3+TypeScript后台管理系统","slug":"vue3-typescript后台管理系统","link":"#vue3-typescript后台管理系统","children":[]},{"level":2,"title":"Typein 效率工具集","slug":"typein-效率工具集","link":"#typein-效率工具集","children":[]},{"level":2,"title":"A-SOUL浏览器宠物","slug":"a-soul浏览器宠物","link":"#a-soul浏览器宠物","children":[]},{"level":2,"title":"北京交通大学课程平台功能增强","slug":"北京交通大学课程平台功能增强","link":"#北京交通大学课程平台功能增强","children":[]},{"level":2,"title":"超级剪贴板","slug":"超级剪贴板","link":"#超级剪贴板","children":[]},{"level":2,"title":"超级粘贴","slug":"超级粘贴","link":"#超级粘贴","children":[]},{"level":2,"title":"超级分词","slug":"超级分词","link":"#超级分词","children":[]},{"level":2,"title":"超级连点器","slug":"超级连点器","link":"#超级连点器","children":[]},{"level":2,"title":"PopNotify","slug":"popnotify","link":"#popnotify","children":[]},{"level":2,"title":"UserScripts","slug":"userscripts","link":"#userscripts","children":[]}],"relativePath":"works/opensource.md","lastUpdated":1675783866000}'),i={name:"works/opensource.md"},h=t('

个人作品

Vue3+TypeScript后台管理系统

Vue3+TypeScript后台管理系统

源代码

Typein 效率工具集

Typein 是一个运行在现代浏览器上的拓展插件,它可以帮助你在保持专注的情况下,高效完成各种操作。

源代码

宣传视频

Microsoft Edge Add-on Store

A-SOUL浏览器宠物

在浏览器里养一只A-Soul成员当宠物

源代码

宣传视频

北京交通大学课程平台功能增强

北京交通大学课程平台功能增强脚本,实现信息聚合,附件上传,让你高效处理课程信息。

源代码

超级剪贴板

uTools插件,一款强大的剪贴板管理工具。基于Vue3构建

源代码

主页

超级粘贴

uTools插件,将剪切板内容直接粘贴为文件。功能基于NodeJS

源代码

超级分词

uTools插件,前台使用Vue3+ElementPlus构建,后台基于Express封装结巴分词并暴露API接口

超级连点器

uTools插件,界面使用Vue3+AntDesign构建,功能基于Worker

PopNotify

仿 Element UI 的通知卡片。

源代码

Demo

UserScripts

用户脚本合集,生产力工具、效率工具、自动化脚本

源代码

',34),n=[h];function l(p,o,s,d,c,u){return r(),a("div",null,n)}const g=e(i,[["render",l]]);export{b as __pageData,g as default}; diff --git a/assets/works_opensource.md.56fe7cda.lean.js b/assets/works_opensource.md.273cfbe0.lean.js similarity index 91% rename from assets/works_opensource.md.56fe7cda.lean.js rename to assets/works_opensource.md.273cfbe0.lean.js index 7dda816d..63a0144b 100644 --- a/assets/works_opensource.md.56fe7cda.lean.js +++ b/assets/works_opensource.md.273cfbe0.lean.js @@ -1 +1 @@ -import{_ as e,o as r,c as a,a as t}from"./app.a81d7d4f.js";const b=JSON.parse('{"title":"个人作品","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"Vue3+TypeScript后台管理系统","slug":"vue3-typescript后台管理系统","link":"#vue3-typescript后台管理系统","children":[]},{"level":2,"title":"Typein 效率工具集","slug":"typein-效率工具集","link":"#typein-效率工具集","children":[]},{"level":2,"title":"A-SOUL浏览器宠物","slug":"a-soul浏览器宠物","link":"#a-soul浏览器宠物","children":[]},{"level":2,"title":"北京交通大学课程平台功能增强","slug":"北京交通大学课程平台功能增强","link":"#北京交通大学课程平台功能增强","children":[]},{"level":2,"title":"超级剪贴板","slug":"超级剪贴板","link":"#超级剪贴板","children":[]},{"level":2,"title":"超级粘贴","slug":"超级粘贴","link":"#超级粘贴","children":[]},{"level":2,"title":"超级分词","slug":"超级分词","link":"#超级分词","children":[]},{"level":2,"title":"超级连点器","slug":"超级连点器","link":"#超级连点器","children":[]},{"level":2,"title":"PopNotify","slug":"popnotify","link":"#popnotify","children":[]},{"level":2,"title":"UserScripts","slug":"userscripts","link":"#userscripts","children":[]}],"relativePath":"works/opensource.md","lastUpdated":1675780846000}'),i={name:"works/opensource.md"},h=t("",34),n=[h];function l(p,o,s,d,c,u){return r(),a("div",null,n)}const g=e(i,[["render",l]]);export{b as __pageData,g as default}; +import{_ as e,o as r,c as a,a as t}from"./app.94d5b31a.js";const b=JSON.parse('{"title":"个人作品","description":"","frontmatter":{"editLink":false},"headers":[{"level":2,"title":"Vue3+TypeScript后台管理系统","slug":"vue3-typescript后台管理系统","link":"#vue3-typescript后台管理系统","children":[]},{"level":2,"title":"Typein 效率工具集","slug":"typein-效率工具集","link":"#typein-效率工具集","children":[]},{"level":2,"title":"A-SOUL浏览器宠物","slug":"a-soul浏览器宠物","link":"#a-soul浏览器宠物","children":[]},{"level":2,"title":"北京交通大学课程平台功能增强","slug":"北京交通大学课程平台功能增强","link":"#北京交通大学课程平台功能增强","children":[]},{"level":2,"title":"超级剪贴板","slug":"超级剪贴板","link":"#超级剪贴板","children":[]},{"level":2,"title":"超级粘贴","slug":"超级粘贴","link":"#超级粘贴","children":[]},{"level":2,"title":"超级分词","slug":"超级分词","link":"#超级分词","children":[]},{"level":2,"title":"超级连点器","slug":"超级连点器","link":"#超级连点器","children":[]},{"level":2,"title":"PopNotify","slug":"popnotify","link":"#popnotify","children":[]},{"level":2,"title":"UserScripts","slug":"userscripts","link":"#userscripts","children":[]}],"relativePath":"works/opensource.md","lastUpdated":1675783866000}'),i={name:"works/opensource.md"},h=t("",34),n=[h];function l(p,o,s,d,c,u){return r(),a("div",null,n)}const g=e(i,[["render",l]]);export{b as __pageData,g as default}; diff --git a/hashmap.json b/hashmap.json index af2f6024..6144bac8 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"article_一文读懂函数中this指向问题.md":"5a36a98f","article_一文读懂伪类与伪元素.md":"ee081a05","article_一文读懂事件冒泡与事件捕获.md":"23d45e04","article_【2023】青训营 - 前端练习题汇总解析.md":"1e0e60ae","article_彻底搞懂对象的数据属性描述符、存储属性描述符.md":"20b39f0a","article_从0实现一个年度报告.md":"db25d26a","article_深入理解proxy与reflect.md":"b8fd25c3","article_深入理解浏览器运行原理.md":"7e80be4c","article_深入理解浏览器缓存机制.md":"f2ead021","index.md":"dd81ce4e","note_javascript.md":"69e0f480","article_深入vue3源码,看看vue.use后究竟发生了什么?.md":"21fec897","project_smartwordbreak_statement_index.md":"7b706e83","project_clipboardmanager_guide_index.md":"0b657832","project_clipboardmanager_vip_index.md":"0f0bb6a6","project_smartwordbreak_index.md":"e19aed30","project_clipboardmanager_statement_index.md":"00adf700","project_clipboardmanager_log_index.md":"f40163dc","project_smartwordbreak_log_index.md":"11349d6f","self_index.md":"1b5c3151","works_opensource.md":"56fe7cda","works_contribution.md":"b453765d","note_javascriptenhanced.md":"14bd6be0","project_clipboardmanager_index.md":"315d88f3","note_css.md":"4ab48bec"} +{"article_一文读懂事件冒泡与事件捕获.md":"8ffefd80","article_一文读懂函数中this指向问题.md":"f6508f72","article_一文读懂伪类与伪元素.md":"dfb8b26d","article_【2023】青训营 - 前端练习题汇总解析.md":"d551ee63","article_深入理解浏览器运行原理.md":"dac12750","index.md":"c3e50456","article_彻底搞懂对象的数据属性描述符、存储属性描述符.md":"9cda00db","article_深入vue3源码,看看vue.use后究竟发生了什么?.md":"e5df2d33","article_从0实现一个年度报告.md":"b23f5ee8","article_深入理解浏览器缓存机制.md":"8bbc1a24","article_深入理解proxy与reflect.md":"e5d90d5d","note_javascript.md":"7d82dc69","note_front-end engineering.md":"66f43176","note_css.md":"504f05e4","project_clipboardmanager_index.md":"8e0a31fd","project_clipboardmanager_log_index.md":"bc5fefe2","project_clipboardmanager_statement_index.md":"98bc3e66","project_clipboardmanager_vip_index.md":"c8460180","project_smartwordbreak_index.md":"8e06fb08","project_smartwordbreak_log_index.md":"c4990e36","project_smartwordbreak_statement_index.md":"4e170fb2","self_index.md":"d9f8db79","works_contribution.md":"48ce0aab","works_opensource.md":"273cfbe0","project_clipboardmanager_guide_index.md":"a1b2b7e7","note_javascriptenhanced.md":"e445eea3"} diff --git a/index.html b/index.html index bb4b87a9..6320a338 100644 --- a/index.html +++ b/index.html @@ -6,16 +6,16 @@ 主页 | ZiuChen - - + + -
Skip to content

ZiuChen

无限进步.

Infinite Progress...

🎓

Electronic Information Major

电子信息工程

🎯

JavaScript & TypeScript

自学前端 热爱技术

👆

See more information

访问导航栏查看更多信息

Released under the MIT License.

- - +
Skip to content

ZiuChen

无限进步.

Infinite Progress...

🎓

Electronic Information Major

电子信息工程

🎯

JavaScript & TypeScript

自学前端 热爱技术

👆

See more information

访问导航栏查看更多信息

Released under the MIT License.

+ + \ No newline at end of file diff --git a/note/CSS.html b/note/CSS.html index 482a6647..49e6f25e 100644 --- a/note/CSS.html +++ b/note/CSS.html @@ -6,14 +6,14 @@ CSS基础 | ZiuChen - - + + -
Skip to content
On this page

CSS基础

CSS提供了三种方法,可以将CSS样式应用到元素上:

  • 内联样式
    • 直接将样式写到元素的style属性上
  • 内部样式表
    • 将样式通过<style>标签写在<head>标签中,通过选择器应用到元素上
  • 外部样式表
    • 将样式写在外部文件如style.css中,再通过<link>标签引入

文本样式(text)

  • text-decoration 框线样式
    • line-through 删除线
    • overline 上划线
    • underline 下划线
    • none 不设置装饰线
  • text-transform
    • text-transform 属性指定如何将元素的文本大写。
    • 它可以用于使文本显示为全大写或全小写,也可单独对每一个单词进行操作。
  • text-indent
    • text-indent 属性能定义一个块元素首行文本内容之前的缩进量。
  • text-align
  • word/letter-spacing

text-align(重要)

行内内容(例如文字)如何相对它的块父元素对齐,left靠左 center居中 right靠右 justify两端对齐

默认值为left

需要注意的是,当子元素是div时,对父元素设置text-align是不生效的:

css
.box {
+    
Skip to content
On this page

CSS基础

CSS提供了三种方法,可以将CSS样式应用到元素上:

  • 内联样式
    • 直接将样式写到元素的style属性上
  • 内部样式表
    • 将样式通过<style>标签写在<head>标签中,通过选择器应用到元素上
  • 外部样式表
    • 将样式写在外部文件如style.css中,再通过<link>标签引入

文本样式(text)

  • text-decoration 框线样式
    • line-through 删除线
    • overline 上划线
    • underline 下划线
    • none 不设置装饰线
  • text-transform
    • text-transform 属性指定如何将元素的文本大写。
    • 它可以用于使文本显示为全大写或全小写,也可单独对每一个单词进行操作。
  • text-indent
    • text-indent 属性能定义一个块元素首行文本内容之前的缩进量。
  • text-align
  • word/letter-spacing

text-align(重要)

行内内容(例如文字)如何相对它的块父元素对齐,left靠左 center居中 right靠右 justify两端对齐

默认值为left

需要注意的是,当子元素是div时,对父元素设置text-align是不生效的:

css
.box {
   height: 500px;
   text-align: center;
   background-color: red;
@@ -491,9 +491,9 @@
 
js
const el = document.querySelector('.item')
 console.log(el.dataset.age) // 18
 console.log(el.dataset.name) // 'ziu'
-

Released under the MIT License.

- - +

Released under the MIT License.

+ + \ No newline at end of file diff --git a/note/Front-end Engineering.html b/note/Front-end Engineering.html new file mode 100644 index 00000000..7e9693cc --- /dev/null +++ b/note/Front-end Engineering.html @@ -0,0 +1,21 @@ + + + + + + 前端工程化 | ZiuChen + + + + + + + + + +
Skip to content
On this page

前端工程化

Node.js

  • 什么是Node.JS Node的应用场景
  • JS代码执行
  • Node的输入和输出
  • Node的全局对象

什么是Node.js

Node.js是一个基于V8 JavaScript引擎JavaScript运行时环境

  • V8可以嵌入到任何C++应用程序中,无论是Chrome还是Node.js,事实上都嵌入了V8引擎来执行JavaScript代码
  • 在Chrome浏览器中,还需要解析、渲染HTML、CSS等相关渲染引擎,另外还需要支持浏览器操作的API、浏览器自己的事件循环
  • 在Node.js中我们也需要进行一些额外操作:文件系统读写、网络IO、加密、压缩解压文件等

可以简单总结出Node.js和浏览器的区别

  • Chrome浏览器

    • Blink负责解析HTML文档,遇到JavaScript标签时将内容交给V8引擎

    • Blink 是 Google Chrome 浏览器的渲染引擎,V8 是 Blink 内置的 JavaScript 引擎

      • 预分析:检查语法错误但不生成AST树
      • 生成AST:语法分析、词法分析后,生成抽象语法树(AST)
        • AST 为每一行代码定义键值对。初始类型标识符定义 AST 属于一个程序,然后所有代码行将定义在主体内部,主体是一个对象数组。
      • 生成字节码:基线编译器(Ignition)将 AST 转换为字节码
      • 生成机器代码:优化编译器 (Turbofan) 将字节码转换为优化的机器代码。另外,在逐行执行字节码的过程中,如果一段代码经常被执行,V8会直接将这段代码转换并保存为机器码,下次执行不需要经过字节码,优化了执行速度
  • Node.js

    • 只处理JavaScript代码 内部V8引擎负责JS代码的执行
    • JavaScript代码 -> V8 -> Node.js Bindings -> LibUV
    • LibUV是使用C语言编写的库,提供了事件循环、文件系统读写、网络IO、线程池等等内容

![The Node.js System](Front-end Engineering.assets/The Node.js System.jpeg)

Node.js的应用场景

  • 前端开发的库都是以node包形式管理的
  • npm yarn pnpm成为前端开发使用最多的工具
  • 使用Node.js作为Web服务器开发、中间件、代理服务器
  • 借助Node.js完成前后端渲染的同构应用
  • 编写脚本工具 构建项目 打包代码等
  • Electron桌面应用程序

Released under the MIT License.

+ + + + + \ No newline at end of file diff --git a/note/JavaScript.html b/note/JavaScript.html index c8ea6f1e..62a5c25b 100644 --- a/note/JavaScript.html +++ b/note/JavaScript.html @@ -6,16 +6,16 @@ JavaScript 基础 | ZiuChen - - + + - - - + + + \ No newline at end of file diff --git a/note/JavaScriptEnhanced.html b/note/JavaScriptEnhanced.html index 35149c2c..8cd492ae 100644 --- a/note/JavaScriptEnhanced.html +++ b/note/JavaScriptEnhanced.html @@ -6,14 +6,14 @@ JavaScript 高级教程 | ZiuChen - - + + -
Skip to content
On this page

JavaScript 高级教程

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

js
// 定义一个函数
+    
Skip to content
On this page

JavaScript 高级教程

函数中this指向

函数在调用时, Javascript会默认为this绑定一个值

js
// 定义一个函数
 function foo() {
   console.log(this)
 }
@@ -2020,9 +2020,9 @@
 setTimeout(() => {
   eventBus.off('navClick', callBack) // 移除某个事件的某次回调
 }, 5000)
-

Released under the MIT License.

- - +

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/ClipboardManager/guide/index.html b/project/ClipboardManager/guide/index.html index 59b5df17..e602a51b 100644 --- a/project/ClipboardManager/guide/index.html +++ b/project/ClipboardManager/guide/index.html @@ -6,14 +6,14 @@ 使用指南 | ZiuChen - - + + -
Skip to content
On this page

使用指南

如何手动安装clipboard-event-handler

新版 超级剪贴板 对剪贴板内容更新事件的监听,依赖于可执行文件:

  • Windows系统: clipboard-event-handler-win32.exe
  • Linux系统: clipboard-event-handler-linux
  • MacOS系统: clipboard-event-handler-mac

插件每次启动时,将自动检查剪贴板数据文件所在目录下是否存在剪贴板监听程序,如存在,则使用性能更优秀的新的监听策略,如不存在,则仍然使用旧的策略。


1. 下载监听程序

点击此处(百度网盘)或访问node-clipboard-event手动下载对应系统的文件,并将其移动到剪贴板数据文件所在目录

插件使用的二进制文件拷贝自node-clipboard-event,请避免从其它不可信的来源下载文件,并在下载文件后比较哈希,有能力的也可以从仓库源代码自行编译

2. 找到剪贴板数据文件所在目录

进入插件设置页(右上角💡按钮),打开插件数据文件所在路径:

3. 将监听程序拷贝到目录中

Windows:

Linux:

Mac:

4. 【重要】注意事项

MacOS需要特殊配置

MacOS拷贝完成后需要对插件进行签名&授权才能正常使用具体步骤如下

1. 签名

打开终端输入以下命令

sh
sudo codesign --force --deep --sign - 
+    
Skip to content
On this page

使用指南

如何手动安装clipboard-event-handler

新版 超级剪贴板 对剪贴板内容更新事件的监听,依赖于可执行文件:

  • Windows系统: clipboard-event-handler-win32.exe
  • Linux系统: clipboard-event-handler-linux
  • MacOS系统: clipboard-event-handler-mac

插件每次启动时,将自动检查剪贴板数据文件所在目录下是否存在剪贴板监听程序,如存在,则使用性能更优秀的新的监听策略,如不存在,则仍然使用旧的策略。


1. 下载监听程序

点击此处(百度网盘)或访问node-clipboard-event手动下载对应系统的文件,并将其移动到剪贴板数据文件所在目录

插件使用的二进制文件拷贝自node-clipboard-event,请避免从其它不可信的来源下载文件,并在下载文件后比较哈希,有能力的也可以从仓库源代码自行编译

2. 找到剪贴板数据文件所在目录

进入插件设置页(右上角💡按钮),打开插件数据文件所在路径:

3. 将监听程序拷贝到目录中

Windows:

Linux:

Mac:

4. 【重要】注意事项

MacOS需要特殊配置

MacOS拷贝完成后需要对插件进行签名&授权才能正常使用具体步骤如下

1. 签名

打开终端输入以下命令

sh
sudo codesign --force --deep --sign - 
 

然后将此目录中的clipboard-event-handler-mac文件拖入终端执行命令

2. 授权

左上角🍎 -> 系统偏好设置 -> 安全性与隐私 -> 通用 -> 点击允许

监听程序不生效如何排查?

请务必完整按照教程完成安装,如果程序仍未生效,请按照如下方式排查:

  • 监听程序拷贝完成后,需要重启插件方可生效
  • 设置页剪贴板监听程序状态选项是否为已安装
  • 系统进程管理器中是否存在clipboard-event-handler-xxxxx的进程

使用中遇到任何问题,请尝试通过论坛或加入QQ群反馈

如何实现多端同步

WebDav同步 ^2.0.0

TIP

v2.0.0起,可以通过开通插件会员启用WebDav同步功能

👉👉👉插件会员/WebDav同步功能👈👈👈

坚果云同步文件夹 仅旧版本

WARNING

以下方法仅适用于v2.0.0之前的版本

数据库文件默认是直接存放在用户文件夹根目录下的,如果需要使用同步功能,请使用插件内提供的数据库路径自定义功能,将数据库路径改为其他路径,而后才能通过下文中讲述的同步文件夹实现云同步。

坚果云官网安装好软件后,找到_utools_clipboard_manager_storage文件所在的目录

右键目录,坚果云/同步该文件夹,将此文件夹加入到坚果云的同步服务中

这样,每次剪贴板内容更新都将自动触发坚果云的同步服务,将剪贴板数据同步到云端

其他安装了坚果云的设备也将自动同步更新

OneDrive

有待测试

快捷键一览

  • Shift进入多选模式 按下空格连续向下选择 支持跨标签合并复制/粘贴
  • 鼠标左键复制并粘贴 鼠标右键仅复制
  • 选中历史记录 按下直接粘贴
  • 切换分类 Tab键连续切换分类
  • Ctrl/Alt+数字键 快速粘贴
  • 输入任意字母或数字自动聚焦搜索框 支持使用空格同时检索多个关键词

如何迁移数据

剪贴板数据默认存放在

  • Windows Linux用户:{home}\_utools_clipboard_manager_storage
  • Mac用户:{userData}\_utools_clipboard_manager_storage

也可以在设置页中点击按钮打开数据库路径。要手动迁移数据,只需要在新设备上运行一次插件,而后将原设备上的数据文件拷贝并替换新设备中的数据文件即可

如何创造自己的功能按钮

v1.4.0起,插件为用户提供了自定义功能按钮的能力

这让超级剪贴板真正变得“超级”起来,用户可以通过编写json实现携带数据跳转到任何其他插件,这项功能给超级剪贴板带来了无限可能。

插件中,默认内置了若干使用样例:

  • 讯飞OCR识别
  • 百度搜索
  • 百度识图
  • 统计文本字数
  • 颜色管理
  • 识别图片中二维码
  • 上传到图床
  • 翻译

下面我将从这些样例出发对这项功能做简单介绍:

这项功能的原理是utools.redirect(),在不分离插件的情况下,在不同插件之间的跳转体验是连贯的。

百度搜索为例,是通过网页快开提供的关键词实现的,我们可以编写以下json:

json
{
   "id": "custom.1663490859",
   "title": "百度搜索",
@@ -28,9 +28,9 @@
   "match": ["image", { "type": "file", "regex": ".(?:jpg|jpeg|png)$" }],
   "command": "redirect:上传到图床"
 }
-

这个功能除了可以匹配图片,还可以将符合正则的图片文件匹配上,在匹配上的历史记录上展示上传到图床按钮,携带数据跳转到图床插件,一键上传。

需要注意的是,因为自定义功能按钮实现的是携带数据跳转不同插件,所以redirect后的内容并不应该是普通关键字(普通关键字仅能作为插件入口,而不能携带数据),而应该是文本/图片/文件或文件夹

  • id: String 全局唯一 必须以custom开头 建议以时间戳为后缀
  • title: String 鼠标悬停时展示的文本
  • icon: String 展示在插件内的图标
  • match: <String | Object>[] 匹配模式
  • command: String 执行跳转的关键字 前缀redirect:是必须的

在未来的版本更新中,超级剪贴板将开放更多自定义功能给高级用户,帮助你更高效率的管理、使用剪贴板。

Released under the MIT License.

- - +

这个功能除了可以匹配图片,还可以将符合正则的图片文件匹配上,在匹配上的历史记录上展示上传到图床按钮,携带数据跳转到图床插件,一键上传。

需要注意的是,因为自定义功能按钮实现的是携带数据跳转不同插件,所以redirect后的内容并不应该是普通关键字(普通关键字仅能作为插件入口,而不能携带数据),而应该是文本/图片/文件或文件夹

  • id: String 全局唯一 必须以custom开头 建议以时间戳为后缀
  • title: String 鼠标悬停时展示的文本
  • icon: String 展示在插件内的图标
  • match: <String | Object>[] 匹配模式
  • command: String 执行跳转的关键字 前缀redirect:是必须的

在未来的版本更新中,超级剪贴板将开放更多自定义功能给高级用户,帮助你更高效率的管理、使用剪贴板。

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/ClipboardManager/index.html b/project/ClipboardManager/index.html index 624b0fe7..523b7e89 100644 --- a/project/ClipboardManager/index.html +++ b/project/ClipboardManager/index.html @@ -6,16 +6,16 @@ 超级剪贴板 | ZiuChen - - + + -
Skip to content
On this page

🔰 开始使用

首次安装需要设置“跟随主程序同时启动”

  • ✅ 监听剪贴板并持续将新内容更新到本地磁盘 数据读写完全本地化
  • ✅ 快速收藏/转存/分词/复制/删除/打开文件&目标文件夹
  • ✅ 功能按钮 定义无限可能 OCR识别 百度搜索 百度识图 统计文本字数 颜色管理 识别图片中二维码 上传到图床 翻译
  • 鼠标左键 复制并粘贴 鼠标右键 仅复制
  • ✅ 按下Shift空格进入多选模式 连续选择多条内容合并复制 支持跨标签合并复制/粘贴
  • ✅ 键盘 选中历史记录,按下回车直接粘贴
  • ✅ 键盘 切换分类 Tab键连续切换分类
  • ✅ 使用 Ctrl/Alt+数字键 快速粘贴
  • ✅ 插件内输入任意字母或数字自动聚焦搜索框 支持使用空格同时检索多个关键词
  • 智慧分词 快速拖选指定内容 超级粘贴 直接转存为文件
  • ✅ 优雅的界面动效与交互 跟随系统的深色模式
  • ✅ 优秀的剪贴板监听性能 强大的自定义功能按钮 自搭建多端同步 ···

📚 安装方式

催更群 769115389 Github

Released under the MIT License.

- - +
Skip to content
On this page

🔰 开始使用

首次安装需要设置“跟随主程序同时启动”

  • ✅ 监听剪贴板并持续将新内容更新到本地磁盘 数据读写完全本地化
  • ✅ 快速收藏/转存/分词/复制/删除/打开文件&目标文件夹
  • ✅ 功能按钮 定义无限可能 OCR识别 百度搜索 百度识图 统计文本字数 颜色管理 识别图片中二维码 上传到图床 翻译
  • 鼠标左键 复制并粘贴 鼠标右键 仅复制
  • ✅ 按下Shift空格进入多选模式 连续选择多条内容合并复制 支持跨标签合并复制/粘贴
  • ✅ 键盘 选中历史记录,按下回车直接粘贴
  • ✅ 键盘 切换分类 Tab键连续切换分类
  • ✅ 使用 Ctrl/Alt+数字键 快速粘贴
  • ✅ 插件内输入任意字母或数字自动聚焦搜索框 支持使用空格同时检索多个关键词
  • 智慧分词 快速拖选指定内容 超级粘贴 直接转存为文件
  • ✅ 优雅的界面动效与交互 跟随系统的深色模式
  • ✅ 优秀的剪贴板监听性能 强大的自定义功能按钮 自搭建多端同步 ···

📚 安装方式

催更群 769115389 Github

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/ClipboardManager/log/index.html b/project/ClipboardManager/log/index.html index bbced79c..7df05db6 100644 --- a/project/ClipboardManager/log/index.html +++ b/project/ClipboardManager/log/index.html @@ -6,16 +6,16 @@ 更新日志 | ZiuChen - - + + -
Skip to content
On this page

更新日志

v2.0.0

2023-02-07

  • feat: 界面焕新 简洁高效
  • feat: 支持WebDav自动同步功能
  • feat: 支持预览页代码高亮
  • feat: 支持自定义分类卡片的顺序
  • feat: 支持识别文本内容为色值、链接等
  • feat: 支持左右键切换导航
  • feat: 支持关闭剪贴板图片记录
  • feat: 支持手动设置偏好主题
  • fix: 清空数据库保留收藏内容
  • fix: 滚动到底部触发懒加载失败
  • refactor: 组件重构 优化大列表运行时性能
  • refactor: 本地读写性能优化

v1.4.7

2022-11-03

  • feat: 设置页支持使用ESC返回上一级
  • fix: 移除了启动监听程序时对MacOS的特殊判断
  • fix: 移除了缺少监听程序时的通知报错

v1.4.6

2022-11-01

  • feat: 调整设置页图标与界面按钮细节
  • fix: 会员用户由于数据同步导致的插件白屏问题
  • fix: 多选复制时条目排序被颠倒

v1.4.5

2022-10-10

  • feat: 调整过期天数列表 最长支持31天
  • feat: 设置页添加handler安装引导
  • fix: 清空数据时内存数据未清空
  • fix: 多端同步时内存数据未更新
  • fix: 开发者模式下listener错误挂载

v1.4.4

2022-09-26

  • fix: 修复重复粘贴的问题

v1.4.3

2022-09-25

  • feat: 增加空格快捷键 按下连续多选的功能
  • feat: 多选状态下移动鼠标不再激活列表条目
  • feat: 支持展示剪贴板监听程序状态
  • fix: 删除某条历史记录时不再返回顶部
  • fix: 多选图片无法合并复制
  • fix: 内置按钮颜色管理关键字错误
  • fix: 设置页下拉框过长时被卡片遮挡
  • fix: 设置页滚动到底部触发懒加载

v1.4.2

2022-09-21

  • chore: 移除了插件内的二进制文件 恢复旧的监听机制 性能问题有待解决

v1.4.1

2022-09-21

  • fix: 修复了新的监听机制在 Mac 下无法正确获取剪贴板更新事件的问题

v1.4.0

2022-09-20

插件能够正确在Linux上运行 离不开 小千 不厌其烦的测试与调试 💖

感谢每一位为超级剪贴板提出过建议、参与测试与调试的用户

  • feat: 支持自定义数据库路径/存储条数/过期时间/展示在主界面的按钮
  • feat: 功能按钮支持自定义 创造属于你自己的功能按钮
  • feat: 添加了9个内置的自定义功能按钮
  • feat: 增加了更优雅的弹窗与提示界面
  • feat: 预览页更宽了 支持预览图片
  • feat: 导航栏图标样式修改
  • fix: 解决了CPU占用高、浏览大图卡顿的性能问题
  • fix: 从后台进入插件自动清空搜索框
  • refactor: 改变了监听剪贴板的方式 性能更优
  • refactor: 引入了ElementPlus组件库与图标库

v1.3.4

2022-09-19

  • feat: 移除插件内收藏Tab
  • feat: 点击收藏按钮后将携带数据跳转至备忘快贴
  • refactor: 优化代码执行逻辑 移除冗余代码

v1.3.3

2022-09-16

  • feat: 提高主色在深色模式下的对比度 改善长文本表现
  • feat: 添加快存功能按钮 配合超级粘贴插件实现快速转存
  • feat: 支持在预览页展示全部功能按钮
  • feat: 重要版本更新自动展示通知卡片
  • fix: 修正多选快捷键Shift影响检索输入的问题
  • fix: 检索词更新后 未自动激活首条记录

v1.3.2

2022-09-15

  • feat: 鼠标悬停展示具体日期、完整数据
  • feat: 调整历史记录上限为800条
  • fix: 修复鼠标置于功能按钮时上下键失效的问题
  • fix: 调整大图片判定尺寸

v1.3.1

2022-09-12

  • feat: 支持通过历史记录列表进入分词
  • feat: 减小插件体积 对智慧分词的支持改为插件跳转

v1.3.0

2022-09-09

  • feat: 添加多选功能 支持跨标签合并文本/图片/文件
  • feat: 支持通过按下Shift进入多选功能 支持按住Shift快速选择
  • feat: 支持使用Ctrl+CEnter快捷合并复制/粘贴
  • feat: 添加智慧分词功能 可对文本进行分割提取
  • feat: 长文本以蓝色高亮显示 不再提供查看全部按钮
  • feat: 优化界面动效

v1.2.3

2022-09-08

  • fix: 修复了检索内容时搜索记录不准确的问题

v1.2.2

2022-09-07

  • feat: 搜索框支持使用空格分词以同时检索多个关键词
  • fix: 修复了剪贴板数据记录遗漏的问题
  • fix: 收藏内容不再计入到条数限制中
  • fix: 修复了非预期的搜索框聚焦行为
  • fix: 预览页的按钮改为固定在顶部

v1.2.1

2022-09-05

  • feat: 支持通过功能按钮进入任意数据的预览页面
  • feat: 支持通过功能按钮打开文件所在目录
  • feat: 添加取消收藏功能按钮
  • feat: 搜索框支持展开/收起 输入任意内容展开并聚焦搜索
  • feat: 侧栏预览页添加复制全部智慧分词按钮
  • feat: 功能按钮改为使用图标展示
  • feat: 优化了界面样式
  • refactor: 清理定时器 优化插件性能

v1.2.0

2022-09-04

  • feat: 添加右侧操作栏 支持复制/收藏/删除操作
  • feat: 添加标签页收藏 支持在此页面管理所有收藏
  • feat: 调整侧栏宽度 调整界面样式细节

v1.1.7

2022-08-30

  • fix: 定时器检查剪贴板,修复了不记录剪贴板的问题

v1.1.6

2022-08-27

  • feat: 添加Alt+数字键Ctrl+数字键快速选择功能
  • feat: 调整界面样式 调整查看全部位置 移除图片背景色 增加动效
  • feat: 搜索框增加检索条数展示
  • fix: 改善插件读取图片的性能

v1.1.5

2022-08-25

  • fix: 提高剪贴板读取频率,避免高频复制时丢数据的情况

v1.1.4

2022-08-20

  • feat: 增加清空搜索框的按钮
  • feat: 优化插件内按下ESC的功能: 退出完整预览/清空搜索框
  • feat: 进入插件自动选中框内全部文本
  • fix: Mac在分离窗口状态左键会粘贴到搜索框 #13

v1.1.3

2022-08-19

  • feat: 调整界面在深色模式下的表现样式
  • fix: 在侧栏全部数据中使用Ctrl+C复制部分文本失效
  • fix: Mac下使用Ctrl+C复制单条记录失效
  • fix: 通过换行符个数区分超长文本
  • fix: 窗口分离下鼠标单击导致粘贴到搜索框
  • chore: 原插件名剪贴板改为超级剪贴板

v1.1.2

2022-08-18

  • feat: 执行复制后只隐藏主界面而不退出插件到后台
  • feat: 搜索时不再区分大小写
  • fix: 文本内容会出现异常首行缩进
  • fix: 图片展示在列表中的时候 右侧多出一个图块
  • fix: 移除鼠标hover时数据底部的色块

v1.1.1

2022-08-17

  • fix: 复制超大图片进入插件时崩溃

v1.1.0

2022-08-16

  • feat: 支持使用 键切换选中记录
  • feat: 支持使用 Ctrl+C 复制选中记录
  • feat: 支持使用 Enter 复制选中记录并粘贴

v1.0.4

2022-08-16

  • feat: 进入插件自动回到顶部、切换至全部分类
  • feat: 监听到键盘事件自动聚焦到搜索框
  • feat: 调整鼠标hover动画与历史记录的active样式
  • fix: 使用Tab切换导航失效
  • fix: 超长图片显示越界

v1.0.3

2022-08-16

  • fix: 路径分隔符导致写入错误的数据文件

v1.0.2

2022-08-15

  • fix: Mac下由权限导致的无法写入数据

v1.0.1

2022-08-15

  • feat: 区分鼠标点击行为:左键复制并粘贴,右键仅复制
  • feat: 适配深色模式
  • feat: 移除了右侧的查看更多按钮
  • feat: 单次展示的条数增加到了15条
  • feat: 增加条数限制500条 增加存储日期限制14天
  • feat: 增加了多平台支持
  • fix: 执行粘贴后主输入框未隐藏
  • refactor: Vue3重构

v1.0.0

2022-08-14

  • release: v1.0.0发布

Released under the MIT License.

- - +
Skip to content
On this page

更新日志

v2.0.0

2023-02-07

  • feat: 界面焕新 简洁高效
  • feat: 支持WebDav自动同步功能
  • feat: 支持预览页代码高亮
  • feat: 支持自定义分类卡片的顺序
  • feat: 支持识别文本内容为色值、链接等
  • feat: 支持左右键切换导航
  • feat: 支持关闭剪贴板图片记录
  • feat: 支持手动设置偏好主题
  • fix: 清空数据库保留收藏内容
  • fix: 滚动到底部触发懒加载失败
  • refactor: 组件重构 优化大列表运行时性能
  • refactor: 本地读写性能优化

v1.4.7

2022-11-03

  • feat: 设置页支持使用ESC返回上一级
  • fix: 移除了启动监听程序时对MacOS的特殊判断
  • fix: 移除了缺少监听程序时的通知报错

v1.4.6

2022-11-01

  • feat: 调整设置页图标与界面按钮细节
  • fix: 会员用户由于数据同步导致的插件白屏问题
  • fix: 多选复制时条目排序被颠倒

v1.4.5

2022-10-10

  • feat: 调整过期天数列表 最长支持31天
  • feat: 设置页添加handler安装引导
  • fix: 清空数据时内存数据未清空
  • fix: 多端同步时内存数据未更新
  • fix: 开发者模式下listener错误挂载

v1.4.4

2022-09-26

  • fix: 修复重复粘贴的问题

v1.4.3

2022-09-25

  • feat: 增加空格快捷键 按下连续多选的功能
  • feat: 多选状态下移动鼠标不再激活列表条目
  • feat: 支持展示剪贴板监听程序状态
  • fix: 删除某条历史记录时不再返回顶部
  • fix: 多选图片无法合并复制
  • fix: 内置按钮颜色管理关键字错误
  • fix: 设置页下拉框过长时被卡片遮挡
  • fix: 设置页滚动到底部触发懒加载

v1.4.2

2022-09-21

  • chore: 移除了插件内的二进制文件 恢复旧的监听机制 性能问题有待解决

v1.4.1

2022-09-21

  • fix: 修复了新的监听机制在 Mac 下无法正确获取剪贴板更新事件的问题

v1.4.0

2022-09-20

插件能够正确在Linux上运行 离不开 小千 不厌其烦的测试与调试 💖

感谢每一位为超级剪贴板提出过建议、参与测试与调试的用户

  • feat: 支持自定义数据库路径/存储条数/过期时间/展示在主界面的按钮
  • feat: 功能按钮支持自定义 创造属于你自己的功能按钮
  • feat: 添加了9个内置的自定义功能按钮
  • feat: 增加了更优雅的弹窗与提示界面
  • feat: 预览页更宽了 支持预览图片
  • feat: 导航栏图标样式修改
  • fix: 解决了CPU占用高、浏览大图卡顿的性能问题
  • fix: 从后台进入插件自动清空搜索框
  • refactor: 改变了监听剪贴板的方式 性能更优
  • refactor: 引入了ElementPlus组件库与图标库

v1.3.4

2022-09-19

  • feat: 移除插件内收藏Tab
  • feat: 点击收藏按钮后将携带数据跳转至备忘快贴
  • refactor: 优化代码执行逻辑 移除冗余代码

v1.3.3

2022-09-16

  • feat: 提高主色在深色模式下的对比度 改善长文本表现
  • feat: 添加快存功能按钮 配合超级粘贴插件实现快速转存
  • feat: 支持在预览页展示全部功能按钮
  • feat: 重要版本更新自动展示通知卡片
  • fix: 修正多选快捷键Shift影响检索输入的问题
  • fix: 检索词更新后 未自动激活首条记录

v1.3.2

2022-09-15

  • feat: 鼠标悬停展示具体日期、完整数据
  • feat: 调整历史记录上限为800条
  • fix: 修复鼠标置于功能按钮时上下键失效的问题
  • fix: 调整大图片判定尺寸

v1.3.1

2022-09-12

  • feat: 支持通过历史记录列表进入分词
  • feat: 减小插件体积 对智慧分词的支持改为插件跳转

v1.3.0

2022-09-09

  • feat: 添加多选功能 支持跨标签合并文本/图片/文件
  • feat: 支持通过按下Shift进入多选功能 支持按住Shift快速选择
  • feat: 支持使用Ctrl+CEnter快捷合并复制/粘贴
  • feat: 添加智慧分词功能 可对文本进行分割提取
  • feat: 长文本以蓝色高亮显示 不再提供查看全部按钮
  • feat: 优化界面动效

v1.2.3

2022-09-08

  • fix: 修复了检索内容时搜索记录不准确的问题

v1.2.2

2022-09-07

  • feat: 搜索框支持使用空格分词以同时检索多个关键词
  • fix: 修复了剪贴板数据记录遗漏的问题
  • fix: 收藏内容不再计入到条数限制中
  • fix: 修复了非预期的搜索框聚焦行为
  • fix: 预览页的按钮改为固定在顶部

v1.2.1

2022-09-05

  • feat: 支持通过功能按钮进入任意数据的预览页面
  • feat: 支持通过功能按钮打开文件所在目录
  • feat: 添加取消收藏功能按钮
  • feat: 搜索框支持展开/收起 输入任意内容展开并聚焦搜索
  • feat: 侧栏预览页添加复制全部智慧分词按钮
  • feat: 功能按钮改为使用图标展示
  • feat: 优化了界面样式
  • refactor: 清理定时器 优化插件性能

v1.2.0

2022-09-04

  • feat: 添加右侧操作栏 支持复制/收藏/删除操作
  • feat: 添加标签页收藏 支持在此页面管理所有收藏
  • feat: 调整侧栏宽度 调整界面样式细节

v1.1.7

2022-08-30

  • fix: 定时器检查剪贴板,修复了不记录剪贴板的问题

v1.1.6

2022-08-27

  • feat: 添加Alt+数字键Ctrl+数字键快速选择功能
  • feat: 调整界面样式 调整查看全部位置 移除图片背景色 增加动效
  • feat: 搜索框增加检索条数展示
  • fix: 改善插件读取图片的性能

v1.1.5

2022-08-25

  • fix: 提高剪贴板读取频率,避免高频复制时丢数据的情况

v1.1.4

2022-08-20

  • feat: 增加清空搜索框的按钮
  • feat: 优化插件内按下ESC的功能: 退出完整预览/清空搜索框
  • feat: 进入插件自动选中框内全部文本
  • fix: Mac在分离窗口状态左键会粘贴到搜索框 #13

v1.1.3

2022-08-19

  • feat: 调整界面在深色模式下的表现样式
  • fix: 在侧栏全部数据中使用Ctrl+C复制部分文本失效
  • fix: Mac下使用Ctrl+C复制单条记录失效
  • fix: 通过换行符个数区分超长文本
  • fix: 窗口分离下鼠标单击导致粘贴到搜索框
  • chore: 原插件名剪贴板改为超级剪贴板

v1.1.2

2022-08-18

  • feat: 执行复制后只隐藏主界面而不退出插件到后台
  • feat: 搜索时不再区分大小写
  • fix: 文本内容会出现异常首行缩进
  • fix: 图片展示在列表中的时候 右侧多出一个图块
  • fix: 移除鼠标hover时数据底部的色块

v1.1.1

2022-08-17

  • fix: 复制超大图片进入插件时崩溃

v1.1.0

2022-08-16

  • feat: 支持使用 键切换选中记录
  • feat: 支持使用 Ctrl+C 复制选中记录
  • feat: 支持使用 Enter 复制选中记录并粘贴

v1.0.4

2022-08-16

  • feat: 进入插件自动回到顶部、切换至全部分类
  • feat: 监听到键盘事件自动聚焦到搜索框
  • feat: 调整鼠标hover动画与历史记录的active样式
  • fix: 使用Tab切换导航失效
  • fix: 超长图片显示越界

v1.0.3

2022-08-16

  • fix: 路径分隔符导致写入错误的数据文件

v1.0.2

2022-08-15

  • fix: Mac下由权限导致的无法写入数据

v1.0.1

2022-08-15

  • feat: 区分鼠标点击行为:左键复制并粘贴,右键仅复制
  • feat: 适配深色模式
  • feat: 移除了右侧的查看更多按钮
  • feat: 单次展示的条数增加到了15条
  • feat: 增加条数限制500条 增加存储日期限制14天
  • feat: 增加了多平台支持
  • fix: 执行粘贴后主输入框未隐藏
  • refactor: Vue3重构

v1.0.0

2022-08-14

  • release: v1.0.0发布

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/ClipboardManager/statement/index.html b/project/ClipboardManager/statement/index.html index c260ecce..3ccb7262 100644 --- a/project/ClipboardManager/statement/index.html +++ b/project/ClipboardManager/statement/index.html @@ -6,16 +6,16 @@ Q&A | ZiuChen - - + + -
Skip to content
On this page

Q&A

为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?

这是由超级剪贴板监听剪贴板内容更新的机制决定的,为了不漏数据,超级剪贴板的监听策略为每300ms读取一次剪贴板内容并与上一次读取到的内容作比较。如果剪贴板当前位置是一张大图片,那么插件会反复读取这张图片,导致大量计算被用在了无意义的读取与对比上。

插件市场中相同原理的同类插件的处理方法是:

  • 轮询比较两次剪贴板内容,如果检查到当前剪贴板内容数据量较大,则降低轮询时间间隔。
    • 这避免了读取大图片/长文本时的高占用,然而这很容易导致漏数据
  • 轮询比较两次剪贴板内容,由用户自定义轮询时间
    • 用户设置的轮询间隔时间长,读取大图片/长文本时不会导致高占用,但很容易漏数据。
    • 用户设置的轮询间隔时间较短,则又会造成高占用

v1.4.0版本更新中,超级剪贴板换用了clipboard-event库监听剪贴板更新事件,这种方式性能更优,不需要反复读取剪贴板内容来做比较,而只需要在检查到剪贴板更新事件时通知插件读取一次剪贴板即可,完全解决了CPU占用高、浏览图片卡顿的问题。

然而该库包含了二进制文件,这触发了uTools插件市场的安全限制而无法上架。所以自v1.4.2起,插件不再内置监听剪贴板更新事件的二进制文件,用户要使用低占用、高性能的剪贴板监听方案,可以自行下载并将其移动到剪贴板数据库文件所在目录,详见如何手动安装clipboard-event-handler,插件会自动判断使用新的抑或是旧的方案监听剪贴板更新。同时,自v1.4.3起,你可以在设置页查看当前剪贴板监听程序的运行状态。

为什么官方的剪贴板插件没有CPU占用高这个问题?

官方的剪贴板内容更新事件监听函数也是从一个二进制文件引出的,这个二进制文件跟随主程序启动,不受剪贴板插件的打开或关闭的影响。

启动报错, 读取剪切板出错

请尝试以下方法:

  1. 清空本地数据库文件
  2. 格式化uTools内的插件数据
  3. 完全退出插件后重启插件

如果上述方法都无法解决你的问题,欢迎论坛回帖或加入QQ群交流具体情况

为什么剪贴板记录会丢失?

一般是由于插件退出后台运行导致的, 插件需要保持后台运行才能记录剪贴板, 请检查:

  • 是否正确设置了插件跟随主程序启动
  • 是否手动清理或关闭了后台插件 (在分离模式下关闭插件 使用clear命令 在插件列表退出插件)
  • 是否存在高频复制的操作 (高频复制可能会漏掉记录)

我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?

首先, 我写这个插件不是为了获取你的隐私的, 我对你的隐私没有兴趣, 这一点你完全可以放心;

其次uTools官方在插件上架前会对代码进行审查, 如果插件有高危行为, 那也不会过审;

再其次, uTools大部分用户是程序员, 如果我真的在代码里藏了"毒", 那他们也有办法发现, 如果你真的对你的隐私十分关心, 可以选择从开源仓库下载代码自行构建

我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私

我在贡献教程中详细说明了如何构建, JavaScript也并不是一门很高深的语言, 祝你能早日入门, 构建出安全的版本供自己使用, 学习的过程中遇到任何问题, 也欢迎随时与我交流 😄

开源版本和插件市场版本的区别?

开源版本后续将只提供必要的BUG修复, 不再添加新功能

  • 开源版本: 包含完整的基本功能, 可以自行构建开源版本, 通过安装离线插件方式使用
  • 市场版本: 包含后续更新的新功能插件会员功能, 可以直接从插件应用市场安装

为什么不开源了, 为什么要开始收费?

目前由我个人维护的开源版本已经趋于稳定, 可以满足绝大部分场景的需求

  • 代码开源的出发点不是为了让不愿付费的人白嫖开发者的劳动, 而是为开发提供更多的经验和思路, 开源的代码已经启发了一些开发者上架了自己的剪贴板插件应用
  • 开发和维护插件需要时间和精力, 插件付费可以鼓励我更积极的更新
  • 目前插件内已有的基本功能都不会转为收费, 可以放心使用

Released under the MIT License.

- - +
Skip to content
On this page

Q&A

为什么偶尔CPU占用特别高? 为什么预览图片时插件卡顿?

这是由超级剪贴板监听剪贴板内容更新的机制决定的,为了不漏数据,超级剪贴板的监听策略为每300ms读取一次剪贴板内容并与上一次读取到的内容作比较。如果剪贴板当前位置是一张大图片,那么插件会反复读取这张图片,导致大量计算被用在了无意义的读取与对比上。

插件市场中相同原理的同类插件的处理方法是:

  • 轮询比较两次剪贴板内容,如果检查到当前剪贴板内容数据量较大,则降低轮询时间间隔。
    • 这避免了读取大图片/长文本时的高占用,然而这很容易导致漏数据
  • 轮询比较两次剪贴板内容,由用户自定义轮询时间
    • 用户设置的轮询间隔时间长,读取大图片/长文本时不会导致高占用,但很容易漏数据。
    • 用户设置的轮询间隔时间较短,则又会造成高占用

v1.4.0版本更新中,超级剪贴板换用了clipboard-event库监听剪贴板更新事件,这种方式性能更优,不需要反复读取剪贴板内容来做比较,而只需要在检查到剪贴板更新事件时通知插件读取一次剪贴板即可,完全解决了CPU占用高、浏览图片卡顿的问题。

然而该库包含了二进制文件,这触发了uTools插件市场的安全限制而无法上架。所以自v1.4.2起,插件不再内置监听剪贴板更新事件的二进制文件,用户要使用低占用、高性能的剪贴板监听方案,可以自行下载并将其移动到剪贴板数据库文件所在目录,详见如何手动安装clipboard-event-handler,插件会自动判断使用新的抑或是旧的方案监听剪贴板更新。同时,自v1.4.3起,你可以在设置页查看当前剪贴板监听程序的运行状态。

为什么官方的剪贴板插件没有CPU占用高这个问题?

官方的剪贴板内容更新事件监听函数也是从一个二进制文件引出的,这个二进制文件跟随主程序启动,不受剪贴板插件的打开或关闭的影响。

启动报错, 读取剪切板出错

请尝试以下方法:

  1. 清空本地数据库文件
  2. 格式化uTools内的插件数据
  3. 完全退出插件后重启插件

如果上述方法都无法解决你的问题,欢迎论坛回帖或加入QQ群交流具体情况

为什么剪贴板记录会丢失?

一般是由于插件退出后台运行导致的, 插件需要保持后台运行才能记录剪贴板, 请检查:

  • 是否正确设置了插件跟随主程序启动
  • 是否手动清理或关闭了后台插件 (在分离模式下关闭插件 使用clear命令 在插件列表退出插件)
  • 是否存在高频复制的操作 (高频复制可能会漏掉记录)

我对这个插件的安全性有担忧, 插件偷窃我的隐私怎么办?

首先, 我写这个插件不是为了获取你的隐私的, 我对你的隐私没有兴趣, 这一点你完全可以放心;

其次uTools官方在插件上架前会对代码进行审查, 如果插件有高危行为, 那也不会过审;

再其次, uTools大部分用户是程序员, 如果我真的在代码里藏了"毒", 那他们也有办法发现, 如果你真的对你的隐私十分关心, 可以选择从开源仓库下载代码自行构建

我不懂代码, 我也不会构建, 但是我担心你的插件会窃取我的隐私

我在贡献教程中详细说明了如何构建, JavaScript也并不是一门很高深的语言, 祝你能早日入门, 构建出安全的版本供自己使用, 学习的过程中遇到任何问题, 也欢迎随时与我交流 😄

开源版本和插件市场版本的区别?

开源版本后续将只提供必要的BUG修复, 不再添加新功能

  • 开源版本: 包含完整的基本功能, 可以自行构建开源版本, 通过安装离线插件方式使用
  • 市场版本: 包含后续更新的新功能插件会员功能, 可以直接从插件应用市场安装

为什么不开源了, 为什么要开始收费?

目前由我个人维护的开源版本已经趋于稳定, 可以满足绝大部分场景的需求

  • 代码开源的出发点不是为了让不愿付费的人白嫖开发者的劳动, 而是为开发提供更多的经验和思路, 开源的代码已经启发了一些开发者上架了自己的剪贴板插件应用
  • 开发和维护插件需要时间和精力, 插件付费可以鼓励我更积极的更新
  • 目前插件内已有的基本功能都不会转为收费, 可以放心使用

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/ClipboardManager/vip/index.html b/project/ClipboardManager/vip/index.html index 5510a61d..3b8ad04e 100644 --- a/project/ClipboardManager/vip/index.html +++ b/project/ClipboardManager/vip/index.html @@ -6,16 +6,16 @@ 插件会员 | ZiuChen - - + + -
Skip to content
On this page

插件会员

TIP

超级剪贴板是一款 “随心所欲” 的软件。您可以永久免费使用它。

但是,如果您真的喜欢它,您可以付费支持它的发展。作为答谢,您将获得更多更方便的功能。这取决于您,如果您不想,也没关系。谢谢你,祝你有美好的一天!☀️

会员权益

  • 插件会员
    • WebDav同步功能 轻点鼠标即可多端同步 已上线
    • 最多支持保存2000条历史记录 已上线
    • 不限制历史记录过期时间 已上线
    • 文本内容增强 识别文本内容为色值、链接 已上线
    • 自定义分类排序 已上线
    • 预览页代码高亮 已上线
    • 支持关闭剪贴板图片记录 已上线
    • 插件使用统计 已上线
    • ...
  • uTools会员
    • 插件使用统计 已上线

会员定价

WARNING

  • 插件会员为大版本买断制,购买后即可享用当前版本(2.x)后续所有更新的会员内容
  • 插件会员为虚拟商品,购买后不支持退款
  • 插件会员的价格是浮动的,随着功能和权益的增加,不排除涨价的可能
  • 购买插件会员后如果出现相关问题,欢迎加入QQ群反馈

插件会员定价8元,登录uTools账号后点击插件工具栏中个人中心图标进入购买页面

购买后可使用会员功能,不购买不影响基本功能的使用,希望大家多多理解,按需购买

WebDav同步功能

插件会员支持通过WebDav同步剪贴板数据

获取服务器地址 账号 密钥后,仅需在插件内的设置页面添加WebDav配置后,

每次本地数据库发生变化,都会将最新数据同步到同步到服务器(须开启插件内的自动同步 否则需要手动同步)

  • 如果配置了WebDav 则每天第一次进入插件时会自动从服务器拉取最新数据
  • 如果设置了自动同步 每次本地数据变化将自动同步本地数据到服务器
    • 插件会缓存云端数据文件的ETag 如果云端数据有更新 则采用云端数据覆盖本地数据
    • 数据文件的上传和下载都开启了gzip以节省流量与带宽
    • 清空本地数据库的同时也会触发云端文件清空
    • 可以选择关闭图片记录 以降低同步的数据文件体积 提高同步效率
  • 插件仅在每次启动时主动从云端拉取数据 云端数据的更新不会自动同步到本地
  • 可以通过点击工具栏按钮主动拉取云端数据到本地或上传数据到云端

WebDav

相关链接:

更多内容

疑难解答

Released under the MIT License.

- - +
Skip to content
On this page

插件会员

TIP

超级剪贴板是一款 “随心所欲” 的软件。您可以永久免费使用它。

但是,如果您真的喜欢它,您可以付费支持它的发展。作为答谢,您将获得更多更方便的功能。这取决于您,如果您不想,也没关系。谢谢你,祝你有美好的一天!☀️

会员权益

  • 插件会员
    • WebDav同步功能 轻点鼠标即可多端同步 已上线
    • 最多支持保存2000条历史记录 已上线
    • 不限制历史记录过期时间 已上线
    • 文本内容增强 识别文本内容为色值、链接 已上线
    • 自定义分类排序 已上线
    • 预览页代码高亮 已上线
    • 支持关闭剪贴板图片记录 已上线
    • 插件使用统计 已上线
    • ...
  • uTools会员
    • 插件使用统计 已上线

会员定价

WARNING

  • 插件会员为大版本买断制,购买后即可享用当前版本(2.x)后续所有更新的会员内容
  • 插件会员为虚拟商品,购买后不支持退款
  • 插件会员的价格是浮动的,随着功能和权益的增加,不排除涨价的可能
  • 购买插件会员后如果出现相关问题,欢迎加入QQ群反馈

插件会员定价8元,登录uTools账号后点击插件工具栏中个人中心图标进入购买页面

购买后可使用会员功能,不购买不影响基本功能的使用,希望大家多多理解,按需购买

WebDav同步功能

插件会员支持通过WebDav同步剪贴板数据

获取服务器地址 账号 密钥后,仅需在插件内的设置页面添加WebDav配置后,

每次本地数据库发生变化,都会将最新数据同步到同步到服务器(须开启插件内的自动同步 否则需要手动同步)

  • 如果配置了WebDav 则每天第一次进入插件时会自动从服务器拉取最新数据
  • 如果设置了自动同步 每次本地数据变化将自动同步本地数据到服务器
    • 插件会缓存云端数据文件的ETag 如果云端数据有更新 则采用云端数据覆盖本地数据
    • 数据文件的上传和下载都开启了gzip以节省流量与带宽
    • 清空本地数据库的同时也会触发云端文件清空
    • 可以选择关闭图片记录 以降低同步的数据文件体积 提高同步效率
  • 插件仅在每次启动时主动从云端拉取数据 云端数据的更新不会自动同步到本地
  • 可以通过点击工具栏按钮主动拉取云端数据到本地或上传数据到云端

WebDav

相关链接:

更多内容

疑难解答

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/SmartWordBreak/index.html b/project/SmartWordBreak/index.html index 19f01161..fd38adde 100644 --- a/project/SmartWordBreak/index.html +++ b/project/SmartWordBreak/index.html @@ -6,16 +6,16 @@ 超级分词 | ZiuChen - - + + -
Skip to content
On this page
logo

✨ 智慧分词,快速提取文本关键词。

⭐ 插件发布页🌎 Q&A🚚 更新日志

🔰 开始使用

服务器不会保留处理的数据, 但请避免使用此功能处理敏感数据

  • ✅ 支持选中文本后通过超级面板直接进入分词
  • ✅ 支持直接读取剪贴板文本分词
  • ✅ 支持单选/拖拽/跨段落快速拖选
  • ✅ 支持一键合并复制/粘贴/翻译/搜索
  • ✅ 普通用户有每日免费额度 每日0:00重置
  • ✅ 优雅、迅速的动效与交互 适配深色模式
  • ✅ 可以通过插件内入口获取更多额度
  • ✅ 与超级剪贴板插件集成,一次购买 多处使用

📚 安装方式

Released under the MIT License.

- - +
Skip to content
On this page
logo

✨ 智慧分词,快速提取文本关键词。

⭐ 插件发布页🌎 Q&A🚚 更新日志

🔰 开始使用

服务器不会保留处理的数据, 但请避免使用此功能处理敏感数据

  • ✅ 支持选中文本后通过超级面板直接进入分词
  • ✅ 支持直接读取剪贴板文本分词
  • ✅ 支持单选/拖拽/跨段落快速拖选
  • ✅ 支持一键合并复制/粘贴/翻译/搜索
  • ✅ 普通用户有每日免费额度 每日0:00重置
  • ✅ 优雅、迅速的动效与交互 适配深色模式
  • ✅ 可以通过插件内入口获取更多额度
  • ✅ 与超级剪贴板插件集成,一次购买 多处使用

📚 安装方式

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/SmartWordBreak/log/index.html b/project/SmartWordBreak/log/index.html index 5d9515f0..42608703 100644 --- a/project/SmartWordBreak/log/index.html +++ b/project/SmartWordBreak/log/index.html @@ -6,16 +6,16 @@ 更新日志 | ZiuChen - - + + -
Skip to content
On this page

更新日志

v1.0.5

2022-12-17

  • feat: 限免活动 每日免费额度调整为99 移除充值入口
  • fix: 修复历史记录显示问题

v1.0.4

2022-09-25

  • feat: 分词上限提高到了1000个字符
  • feat: token支持本地缓存

v1.0.3

2022-09-19

  • feat: 增加历史记录功能
  • fix: 移除了在tag外按下鼠标拖选的功能

v1.0.2

2022-09-13

  • feat: 支持跨段快速拖选
  • feat: 分词页添加了搜索粘贴功能
  • feat: 优化换行符在分词页的表现 支持包含换行符拖选

v1.0.1

2022-09-13

  • feat: 增加了拖选过程中的动效
  • feat: 调整了按钮样式与颜色
  • fix: 移除了碍事的toast

v1.0.0

2022-09-11

  • release: v1.0.0发布

Released under the MIT License.

- - +
Skip to content
On this page

更新日志

v1.0.5

2022-12-17

  • feat: 限免活动 每日免费额度调整为99 移除充值入口
  • fix: 修复历史记录显示问题

v1.0.4

2022-09-25

  • feat: 分词上限提高到了1000个字符
  • feat: token支持本地缓存

v1.0.3

2022-09-19

  • feat: 增加历史记录功能
  • fix: 移除了在tag外按下鼠标拖选的功能

v1.0.2

2022-09-13

  • feat: 支持跨段快速拖选
  • feat: 分词页添加了搜索粘贴功能
  • feat: 优化换行符在分词页的表现 支持包含换行符拖选

v1.0.1

2022-09-13

  • feat: 增加了拖选过程中的动效
  • feat: 调整了按钮样式与颜色
  • fix: 移除了碍事的toast

v1.0.0

2022-09-11

  • release: v1.0.0发布

Released under the MIT License.

+ + \ No newline at end of file diff --git a/project/SmartWordBreak/statement/index.html b/project/SmartWordBreak/statement/index.html index 99ef67f8..ba459f7e 100644 --- a/project/SmartWordBreak/statement/index.html +++ b/project/SmartWordBreak/statement/index.html @@ -6,16 +6,16 @@ Q&A | ZiuChen - - + + -
Skip to content
On this page

Q&A

  • Q: 为什么要收费
  • A: 此功能需要服务器资源, 而服务器资源有限, 故暂时只开放部分的免费资源给大家使用, 普通用户每日有部分免费额度, 额度每日0:00重置

  • Q: 我支付了,但是没有收到额度
  • A: 支付成功后,插件会自动获取最新用户信息,如果信息没有自动更新,请尝试退出插件后重新进入,如果仍未收到额度,请加入QQ群 769115389并联系我,我会尽快核实并为你解决

  • Q: 我之前赞赏过,可以有优惠吗
  • A: 2022年9月13日0:00前,赞赏过我的uTools用户,请发送:
    • UUID(超级分词插件内展示)
    • 赞赏金额
    • 赞赏时间
    • 支付截图
  • 到邮箱ZiuChen@outlook.com,邮箱主题为:申请超级分词赞赏额度,我将在核实后为你提供赞赏金额+15%的额度,感谢你的支持!💖。

Released under the MIT License.

- - +
Skip to content
On this page

Q&A

  • Q: 为什么要收费
  • A: 此功能需要服务器资源, 而服务器资源有限, 故暂时只开放部分的免费资源给大家使用, 普通用户每日有部分免费额度, 额度每日0:00重置

  • Q: 我支付了,但是没有收到额度
  • A: 支付成功后,插件会自动获取最新用户信息,如果信息没有自动更新,请尝试退出插件后重新进入,如果仍未收到额度,请加入QQ群 769115389并联系我,我会尽快核实并为你解决

  • Q: 我之前赞赏过,可以有优惠吗
  • A: 2022年9月13日0:00前,赞赏过我的uTools用户,请发送:
    • UUID(超级分词插件内展示)
    • 赞赏金额
    • 赞赏时间
    • 支付截图
  • 到邮箱ZiuChen@outlook.com,邮箱主题为:申请超级分词赞赏额度,我将在核实后为你提供赞赏金额+15%的额度,感谢你的支持!💖。

Released under the MIT License.

+ + \ No newline at end of file diff --git a/self/index.html b/self/index.html index 5680bc21..c83fe760 100644 --- a/self/index.html +++ b/self/index.html @@ -6,16 +6,16 @@ 个人介绍 | ZiuChen - - + + -
Skip to content
On this page

个人介绍

logo

北京交通大学(BeijingJiaoTong University)电子信息工程学院本科在读

  • 熟悉ES6特性, 有前端领域开发经验, 能独立完成基础的前端开发工作;
  • 熟练使用Vue框架及相关工具开发应用, 阅读过部分Vue源码, 了解Vue响应式实现原理;
  • 掌握NodeJS基本使用, 能够基于NodeJS编写开发工具或搭建Web服务;
  • 了解Webpack基本配置和使用, 有Webpack Vite等前端工程化工具使用经验;
  • 了解Typescript, 有Typescript的项目使用经历;
  • 良好的Git操作, 清晰的Commit提交, 保证代码质量;
  • 对前端学习抱有热情, 有良好的学习能力, 能够快速学习掌握新知识;

技术栈

前端技术

Vue Router Vuex Pinia Element Plus Echart WangEditor

Sass/Less Axios Ajax ...

后端技术

相关技能

文档处理:

Microsoft Word Microsoft PowerPoint Microsoft Excel

平面设计:

Adobe PhotoShop Adobe Lightroom

影音制作:

DaVinci Resolve Studio Adobe Premiere Adobe After Effects

专业软件:

MATLAB ICEDA Multisim Keil uVision5

获得奖项

Microsoft Edge 浏览器开拓者大赛 开拓之星

稀土掘金2022编程挑战赛 三等奖

入选“扬帆计划·中央和国家机关大学生实习”

100周年现场志愿者

优秀学生干部、优秀共青团员

社会工作优秀奖学金

相关链接

Github哔哩哔哩稀土掘金CSDNGitee

Released under the MIT License.

- - +
Skip to content
On this page

个人介绍

logo

北京交通大学(BeijingJiaoTong University)电子信息工程学院本科在读

  • 熟悉ES6特性, 有前端领域开发经验, 能独立完成基础的前端开发工作;
  • 熟练使用Vue框架及相关工具开发应用, 阅读过部分Vue源码, 了解Vue响应式实现原理;
  • 掌握NodeJS基本使用, 能够基于NodeJS编写开发工具或搭建Web服务;
  • 了解Webpack基本配置和使用, 有Webpack Vite等前端工程化工具使用经验;
  • 了解Typescript, 有Typescript的项目使用经历;
  • 良好的Git操作, 清晰的Commit提交, 保证代码质量;
  • 对前端学习抱有热情, 有良好的学习能力, 能够快速学习掌握新知识;

技术栈

前端技术

Vue Router Vuex Pinia Element Plus Echart WangEditor

Sass/Less Axios Ajax ...

后端技术

相关技能

文档处理:

Microsoft Word Microsoft PowerPoint Microsoft Excel

平面设计:

Adobe PhotoShop Adobe Lightroom

影音制作:

DaVinci Resolve Studio Adobe Premiere Adobe After Effects

专业软件:

MATLAB ICEDA Multisim Keil uVision5

获得奖项

Microsoft Edge 浏览器开拓者大赛 开拓之星

稀土掘金2022编程挑战赛 三等奖

入选“扬帆计划·中央和国家机关大学生实习”

100周年现场志愿者

优秀学生干部、优秀共青团员

社会工作优秀奖学金

相关链接

Github哔哩哔哩稀土掘金CSDNGitee

Released under the MIT License.

+ + \ No newline at end of file diff --git a/works/contribution.html b/works/contribution.html index c13e8081..52fce636 100644 --- a/works/contribution.html +++ b/works/contribution.html @@ -6,16 +6,16 @@ 社区贡献 | ZiuChen - - + + - - - + + + \ No newline at end of file diff --git a/works/opensource.html b/works/opensource.html index 95b7664e..006358d9 100644 --- a/works/opensource.html +++ b/works/opensource.html @@ -6,16 +6,16 @@ 个人作品 | ZiuChen - - + + -
Skip to content
On this page

个人作品

Vue3+TypeScript后台管理系统

Vue3+TypeScript后台管理系统

源代码

Typein 效率工具集

Typein 是一个运行在现代浏览器上的拓展插件,它可以帮助你在保持专注的情况下,高效完成各种操作。

源代码

宣传视频

Microsoft Edge Add-on Store

A-SOUL浏览器宠物

在浏览器里养一只A-Soul成员当宠物

源代码

宣传视频

北京交通大学课程平台功能增强

北京交通大学课程平台功能增强脚本,实现信息聚合,附件上传,让你高效处理课程信息。

源代码

超级剪贴板

uTools插件,一款强大的剪贴板管理工具。基于Vue3构建

源代码

主页

超级粘贴

uTools插件,将剪切板内容直接粘贴为文件。功能基于NodeJS

源代码

超级分词

uTools插件,前台使用Vue3+ElementPlus构建,后台基于Express封装结巴分词并暴露API接口

超级连点器

uTools插件,界面使用Vue3+AntDesign构建,功能基于Worker

PopNotify

仿 Element UI 的通知卡片。

源代码

Demo

UserScripts

用户脚本合集,生产力工具、效率工具、自动化脚本

源代码

Released under the MIT License.

- - +
Skip to content
On this page

个人作品

Vue3+TypeScript后台管理系统

Vue3+TypeScript后台管理系统

源代码

Typein 效率工具集

Typein 是一个运行在现代浏览器上的拓展插件,它可以帮助你在保持专注的情况下,高效完成各种操作。

源代码

宣传视频

Microsoft Edge Add-on Store

A-SOUL浏览器宠物

在浏览器里养一只A-Soul成员当宠物

源代码

宣传视频

北京交通大学课程平台功能增强

北京交通大学课程平台功能增强脚本,实现信息聚合,附件上传,让你高效处理课程信息。

源代码

超级剪贴板

uTools插件,一款强大的剪贴板管理工具。基于Vue3构建

源代码

主页

超级粘贴

uTools插件,将剪切板内容直接粘贴为文件。功能基于NodeJS

源代码

超级分词

uTools插件,前台使用Vue3+ElementPlus构建,后台基于Express封装结巴分词并暴露API接口

超级连点器

uTools插件,界面使用Vue3+AntDesign构建,功能基于Worker

PopNotify

仿 Element UI 的通知卡片。

源代码

Demo

UserScripts

用户脚本合集,生产力工具、效率工具、自动化脚本

源代码

Released under the MIT License.

+ + \ No newline at end of file