高可用性
通过简单的接口,实现了大部分几何运算和粒子制作的需求
diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..3c5c336 --- /dev/null +++ b/404.html @@ -0,0 +1,21 @@ + + +
+ + +This page demonstrates usage of some of the runtime APIs provided by VitePress.
The main useData()
API can be used to access site, theme, and page data for the current page. It works in both .md
and .vue
files:
<script setup>
+import { useData } from 'vitepress'
+
+const { theme, page, frontmatter } = useData()
+</script>
+
+## Results
+
+### Theme Data
+<pre>{{ theme }}</pre>
+
+### Page Data
+<pre>{{ page }}</pre>
+
+### Page Frontmatter
+<pre>{{ frontmatter }}</pre>
{ + "socialLinks": [ + { + "icon": "github", + "link": "https://github.com/snowykami/mbcp" + } + ] +}
{ + "title": "Runtime API Examples", + "description": "", + "frontmatter": { + "outline": "deep" + }, + "headers": [], + "relativePath": "api-ex.md", + "filePath": "api-ex.md" +}
{ + "outline": "deep" +}
Check out the documentation for the full list of runtime APIs.
AnyAngle
__init__(self, value: float, is_radian: bool) -> None
任意角度。
Args:
value: 角度或弧度值
+
+is_radian: 是否为弧度,默认为否
+
def __init__(self, value: float, is_radian: bool=False):
+ """
+ 任意角度。
+ Args:
+ value: 角度或弧度值
+ is_radian: 是否为弧度,默认为否
+ """
+ if is_radian:
+ self.radian = value
+ else:
+ self.radian = value * PI / 180
complementary(self: Any) -> 'AnyAngle'
余角:两角的和为90°。
Returns:
余角
+
@property
+def complementary(self) -> 'AnyAngle':
+ """
+ 余角:两角的和为90°。
+ Returns:
+ 余角
+ """
+ return AnyAngle(PI / 2 - self.minimum_positive.radian, is_radian=True)
supplementary(self: Any) -> 'AnyAngle'
补角:两角的和为180°。
Returns:
补角
+
@property
+def supplementary(self) -> 'AnyAngle':
+ """
+ 补角:两角的和为180°。
+ Returns:
+ 补角
+ """
+ return AnyAngle(PI - self.minimum_positive.radian, is_radian=True)
degree(self: Any) -> float
角度。
Returns:
弧度
+
@property
+def degree(self) -> float:
+ """
+ 角度。
+ Returns:
+ 弧度
+ """
+ return self.radian * 180 / PI
minimum_positive(self: Any) -> 'AnyAngle'
最小正角。
Returns:
最小正角度
+
@property
+def minimum_positive(self) -> 'AnyAngle':
+ """
+ 最小正角。
+ Returns:
+ 最小正角度
+ """
+ return AnyAngle(self.radian % (2 * PI))
maximum_negative(self: Any) -> 'AnyAngle'
最大负角。
Returns:
最大负角度
+
@property
+def maximum_negative(self) -> 'AnyAngle':
+ """
+ 最大负角。
+ Returns:
+ 最大负角度
+ """
+ return AnyAngle(-self.radian % (2 * PI), is_radian=True)
sin(self: Any) -> float
正弦值。
Returns:
正弦值
+
@property
+def sin(self) -> float:
+ """
+ 正弦值。
+ Returns:
+ 正弦值
+ """
+ return math.sin(self.radian)
cos(self: Any) -> float
余弦值。
Returns:
余弦值
+
@property
+def cos(self) -> float:
+ """
+ 余弦值。
+ Returns:
+ 余弦值
+ """
+ return math.cos(self.radian)
tan(self: Any) -> float
正切值。
Returns:
正切值
+
@property
+def tan(self) -> float:
+ """
+ 正切值。
+ Returns:
+ 正切值
+ """
+ return math.tan(self.radian)
cot(self: Any) -> float
余切值。
Returns:
余切值
+
@property
+def cot(self) -> float:
+ """
+ 余切值。
+ Returns:
+ 余切值
+ """
+ return 1 / math.tan(self.radian)
sec(self: Any) -> float
正割值。
Returns:
正割值
+
@property
+def sec(self) -> float:
+ """
+ 正割值。
+ Returns:
+ 正割值
+ """
+ return 1 / math.cos(self.radian)
csc(self: Any) -> float
余割值。
Returns:
余割值
+
@property
+def csc(self) -> float:
+ """
+ 余割值。
+ Returns:
+ 余割值
+ """
+ return 1 / math.sin(self.radian)
get_partial_derivative_func(func: MultiVarsFunc, var: int | tuple[int, ...], epsilon: Number) -> MultiVarsFunc
求N元函数一阶偏导函数。这玩意不太稳定,慎用。
Args:
func: 函数
+
+var: 变量位置,可为整数(一阶偏导)或整数元组(高阶偏导)
+
+epsilon: 偏移量
+
Returns:
偏导函数
+
Raises:
ValueError: 无效变量类型
+
def get_partial_derivative_func(func: MultiVarsFunc, var: int | tuple[int, ...], epsilon: Number=EPSILON) -> MultiVarsFunc:
+ """
+ 求N元函数一阶偏导函数。这玩意不太稳定,慎用。
+ Args:
+ func: 函数
+ var: 变量位置,可为整数(一阶偏导)或整数元组(高阶偏导)
+ epsilon: 偏移量
+ Returns:
+ 偏导函数
+ Raises:
+ ValueError: 无效变量类型
+ """
+ if isinstance(var, int):
+
+ def partial_derivative_func(*args: Var) -> Var:
+ args_list_plus = list(args)
+ args_list_plus[var] += epsilon
+ args_list_minus = list(args)
+ args_list_minus[var] -= epsilon
+ return (func(*args_list_plus) - func(*args_list_minus)) / (2 * epsilon)
+ return partial_derivative_func
+ elif isinstance(var, tuple):
+
+ def high_order_partial_derivative_func(*args: Var) -> Var:
+ result_func = func
+ for v in var:
+ result_func = get_partial_derivative_func(result_func, v, epsilon)
+ return result_func(*args)
+ return high_order_partial_derivative_func
+ else:
+ raise ValueError('Invalid var type')
partial_derivative_func() -> Var
def partial_derivative_func(*args: Var) -> Var:
+ args_list_plus = list(args)
+ args_list_plus[var] += epsilon
+ args_list_minus = list(args)
+ args_list_minus[var] -= epsilon
+ return (func(*args_list_plus) - func(*args_list_minus)) / (2 * epsilon)
high_order_partial_derivative_func() -> Var
def high_order_partial_derivative_func(*args: Var) -> Var:
+ result_func = func
+ for v in var:
+ result_func = get_partial_derivative_func(result_func, v, epsilon)
+ return result_func(*args)
CurveEquation
__init__(self, x_func: OneVarFunc, y_func: OneVarFunc, z_func: OneVarFunc) -> None
曲线方程。
:param x_func:
:param y_func:
:param z_func:
def __init__(self, x_func: OneVarFunc, y_func: OneVarFunc, z_func: OneVarFunc):
+ """
+ 曲线方程。
+ :param x_func:
+ :param y_func:
+ :param z_func:
+ """
+ self.x_func = x_func
+ self.y_func = y_func
+ self.z_func = z_func
args_list_plus = list(args)
args_list_minus = list(args)
result_func = func
result_func = get_partial_derivative_func(result_func, v, epsilon)
Line3
__init__(self, point: 'Point3', direction: 'Vector3') -> None
三维空间中的直线。由一个点和一个方向向量确定。
Args:
point: 直线上的一点
+
+direction: 直线的方向向量
+
def __init__(self, point: 'Point3', direction: 'Vector3'):
+ """
+ 三维空间中的直线。由一个点和一个方向向量确定。
+ Args:
+ point: 直线上的一点
+ direction: 直线的方向向量
+ """
+ self.point = point
+ self.direction = direction
approx(self, other: 'Line3', epsilon: float) -> bool
判断两条直线是否近似相等。
Args:
other: 另一条直线
+
+epsilon: 误差
+
Returns:
是否近似相等
+
def approx(self, other: 'Line3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两条直线是否近似相等。
+ Args:
+ other: 另一条直线
+ epsilon: 误差
+ Returns:
+ 是否近似相等
+ """
+ return self.is_approx_parallel(other, epsilon) and (self.point - other.point).is_approx_parallel(self.direction, epsilon)
cal_angle(self, other: 'Line3') -> 'AnyAngle'
计算直线和直线之间的夹角。
Args:
other: 另一条直线
+
Returns:
夹角弧度
+
Raises:
TypeError: 不支持的类型
+
def cal_angle(self, other: 'Line3') -> 'AnyAngle':
+ """
+ 计算直线和直线之间的夹角。
+ Args:
+ other: 另一条直线
+ Returns:
+ 夹角弧度
+ Raises:
+ TypeError: 不支持的类型
+ """
+ return self.direction.cal_angle(other.direction)
cal_distance(self, other: 'Line3 | Point3') -> float
计算直线和直线或点之间的距离。
Args:
other: 平行直线或点
+
Returns:
距离
+
Raises:
TypeError: 不支持的类型
+
def cal_distance(self, other: 'Line3 | Point3') -> float:
+ """
+ 计算直线和直线或点之间的距离。
+ Args:
+ other: 平行直线或点
+
+ Returns:
+ 距离
+ Raises:
+ TypeError: 不支持的类型
+ """
+ if isinstance(other, Line3):
+ if self == other:
+ return 0
+ elif self.is_parallel(other):
+ return (other.point - self.point).cross(self.direction).length / self.direction.length
+ elif not self.is_coplanar(other):
+ return abs(self.direction.cross(other.direction) @ (self.point - other.point) / self.direction.cross(other.direction).length)
+ else:
+ return 0
+ elif isinstance(other, Point3):
+ return (other - self.point).cross(self.direction).length / self.direction.length
+ else:
+ raise TypeError('Unsupported type.')
cal_intersection(self, other: 'Line3') -> 'Point3'
计算两条直线的交点。
Args:
other: 另一条直线
+
Returns:
交点
+
Raises:
ValueError: 直线平行
+
+ValueError: 直线不共面
+
def cal_intersection(self, other: 'Line3') -> 'Point3':
+ """
+ 计算两条直线的交点。
+ Args:
+ other: 另一条直线
+ Returns:
+ 交点
+ Raises:
+ ValueError: 直线平行
+ ValueError: 直线不共面
+ """
+ if self.is_parallel(other):
+ raise ValueError('Lines are parallel and do not intersect.')
+ if not self.is_coplanar(other):
+ raise ValueError('Lines are not coplanar and do not intersect.')
+ return self.point + self.direction.cross(other.direction) @ other.direction.cross(self.point - other.point) / self.direction.cross(other.direction).length ** 2 * self.direction
cal_perpendicular(self, point: 'Point3') -> 'Line3'
计算直线经过指定点p的垂线。
Args:
point: 指定点
+
Returns:
垂线
+
def cal_perpendicular(self, point: 'Point3') -> 'Line3':
+ """
+ 计算直线经过指定点p的垂线。
+ Args:
+ point: 指定点
+ Returns:
+ 垂线
+ """
+ return Line3(point, self.direction.cross(point - self.point))
get_point(self, t: RealNumber) -> 'Point3'
获取直线上的点。同一条直线,但起始点和方向向量不同,则同一个t对应的点不同。
Args:
t: 参数t
+
Returns:
点
+
def get_point(self, t: RealNumber) -> 'Point3':
+ """
+ 获取直线上的点。同一条直线,但起始点和方向向量不同,则同一个t对应的点不同。
+ Args:
+ t: 参数t
+ Returns:
+ 点
+ """
+ return self.point + t * self.direction
get_parametric_equations(self) -> tuple[OneSingleVarFunc, OneSingleVarFunc, OneSingleVarFunc]
获取直线的参数方程。
Returns:
x(t), y(t), z(t)
+
def get_parametric_equations(self) -> tuple[OneSingleVarFunc, OneSingleVarFunc, OneSingleVarFunc]:
+ """
+ 获取直线的参数方程。
+ Returns:
+ x(t), y(t), z(t)
+ """
+ return (lambda t: self.point.x + self.direction.x * t, lambda t: self.point.y + self.direction.y * t, lambda t: self.point.z + self.direction.z * t)
is_approx_parallel(self, other: 'Line3', epsilon: float) -> bool
判断两条直线是否近似平行。
Args:
other: 另一条直线
+
+epsilon: 误差
+
Returns:
是否近似平行
+
def is_approx_parallel(self, other: 'Line3', epsilon: float=1e-06) -> bool:
+ """
+ 判断两条直线是否近似平行。
+ Args:
+ other: 另一条直线
+ epsilon: 误差
+ Returns:
+ 是否近似平行
+ """
+ return self.direction.is_approx_parallel(other.direction, epsilon)
is_parallel(self, other: 'Line3') -> bool
判断两条直线是否平行。
Args:
other: 另一条直线
+
Returns:
是否平行
+
def is_parallel(self, other: 'Line3') -> bool:
+ """
+ 判断两条直线是否平行。
+ Args:
+ other: 另一条直线
+ Returns:
+ 是否平行
+ """
+ return self.direction.is_parallel(other.direction)
is_collinear(self, other: 'Line3') -> bool
判断两条直线是否共线。
Args:
other: 另一条直线
+
Returns:
是否共线
+
def is_collinear(self, other: 'Line3') -> bool:
+ """
+ 判断两条直线是否共线。
+ Args:
+ other: 另一条直线
+ Returns:
+ 是否共线
+ """
+ return self.is_parallel(other) and (self.point - other.point).is_parallel(self.direction)
is_point_on(self, point: 'Point3') -> bool
判断点是否在直线上。
Args:
point: 点
+
Returns:
是否在直线上
+
def is_point_on(self, point: 'Point3') -> bool:
+ """
+ 判断点是否在直线上。
+ Args:
+ point: 点
+ Returns:
+ 是否在直线上
+ """
+ return (point - self.point).is_parallel(self.direction)
is_coplanar(self, other: 'Line3') -> bool
判断两条直线是否共面。
充要条件:两直线方向向量的叉乘与两直线上任意一点的向量的点积为0。
Args:
other: 另一条直线
+
Returns:
是否共面
+
def is_coplanar(self, other: 'Line3') -> bool:
+ """
+ 判断两条直线是否共面。
+ 充要条件:两直线方向向量的叉乘与两直线上任意一点的向量的点积为0。
+ Args:
+ other: 另一条直线
+ Returns:
+ 是否共面
+ """
+ return self.direction.cross(other.direction) @ (self.point - other.point) == 0
simplify(self) -> None
简化直线方程,等价相等。
自体简化,不返回值。
按照可行性一次对x y z 化 0 处理,并对向量单位化
def simplify(self):
+ """
+ 简化直线方程,等价相等。
+ 自体简化,不返回值。
+
+ 按照可行性一次对x y z 化 0 处理,并对向量单位化
+ """
+ self.direction.normalize()
+ if self.direction.x == 0:
+ self.point.x = 0
+ if self.direction.y == 0:
+ self.point.y = 0
+ if self.direction.z == 0:
+ self.point.z = 0
from_two_points(cls: Any, p1: 'Point3', p2: 'Point3') -> 'Line3'
工厂函数 由两点构造直线。
Args:
p1: 点1
+
+p2: 点2
+
Returns:
直线
+
@classmethod
+def from_two_points(cls, p1: 'Point3', p2: 'Point3') -> 'Line3':
+ """
+ 工厂函数 由两点构造直线。
+ Args:
+ p1: 点1
+ p2: 点2
+ Returns:
+ 直线
+ """
+ direction = p2 - p1
+ return cls(p1, direction)
direction = p2 - p1
s = 'Line3: '
Plane3
__init__(self, a: float, b: float, c: float, d: float) -> None
平面方程:ax + by + cz + d = 0
Args:
a:
+
+b:
+
+c:
+
+d:
+
def __init__(self, a: float, b: float, c: float, d: float):
+ """
+ 平面方程:ax + by + cz + d = 0
+ Args:
+ a:
+ b:
+ c:
+ d:
+ """
+ self.a = a
+ self.b = b
+ self.c = c
+ self.d = d
approx(self, other: 'Plane3', epsilon: float) -> bool
判断两个平面是否近似相等。
Args:
other:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(self, other: 'Plane3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个平面是否近似相等。
+ Args:
+ other:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ if self.a != 0:
+ k = other.a / self.a
+ return approx(other.b, self.b * k) and approx(other.c, self.c * k) and approx(other.d, self.d * k)
+ elif self.b != 0:
+ k = other.b / self.b
+ return approx(other.a, self.a * k) and approx(other.c, self.c * k) and approx(other.d, self.d * k)
+ elif self.c != 0:
+ k = other.c / self.c
+ return approx(other.a, self.a * k) and approx(other.b, self.b * k) and approx(other.d, self.d * k)
+ else:
+ return False
cal_angle(self, other: 'Line3 | Plane3') -> 'AnyAngle'
计算平面与平面之间的夹角。
Args:
other: 另一个平面
+
Returns:
夹角弧度
+
Raises:
TypeError: 不支持的类型
+
def cal_angle(self, other: 'Line3 | Plane3') -> 'AnyAngle':
+ """
+ 计算平面与平面之间的夹角。
+ Args:
+ other: 另一个平面
+ Returns:
+ 夹角弧度
+ Raises:
+ TypeError: 不支持的类型
+ """
+ if isinstance(other, Line3):
+ return self.normal.cal_angle(other.direction).complementary
+ elif isinstance(other, Plane3):
+ return AnyAngle(math.acos(self.normal @ other.normal / (self.normal.length * other.normal.length)), is_radian=True)
+ else:
+ raise TypeError(f'Unsupported type: {type(other)}')
cal_distance(self, other: 'Plane3 | Point3') -> float
计算平面与平面或点之间的距离。
Args:
other: 另一个平面或点
+
Returns:
距离
+
Raises:
TypeError: 不支持的类型
+
def cal_distance(self, other: 'Plane3 | Point3') -> float:
+ """
+ 计算平面与平面或点之间的距离。
+ Args:
+ other: 另一个平面或点
+ Returns:
+ 距离
+ Raises:
+ TypeError: 不支持的类型
+ """
+ if isinstance(other, Plane3):
+ return 0
+ elif isinstance(other, Point3):
+ return abs(self.a * other.x + self.b * other.y + self.c * other.z + self.d) / (self.a ** 2 + self.b ** 2 + self.c ** 2) ** 0.5
+ else:
+ raise TypeError(f'Unsupported type: {type(other)}')
cal_intersection_line3(self, other: 'Plane3') -> 'Line3'
计算两平面的交线。该方法有问题,待修复。
Args:
other: 另一个平面
+
Returns:
交线
+
Raises:
def cal_intersection_line3(self, other: 'Plane3') -> 'Line3':
+ """
+ 计算两平面的交线。该方法有问题,待修复。
+ Args:
+ other: 另一个平面
+ Returns:
+ 交线
+ Raises:
+ """
+ if self.normal.is_parallel(other.normal):
+ raise ValueError('Planes are parallel and have no intersection.')
+ direction = self.normal.cross(other.normal)
+ x, y, z = (0, 0, 0)
+ if self.a != 0 and other.a != 0:
+ A = np.array([[self.b, self.c], [other.b, other.c]])
+ B = np.array([-self.d, -other.d])
+ y, z = np.linalg.solve(A, B)
+ elif self.b != 0 and other.b != 0:
+ A = np.array([[self.a, self.c], [other.a, other.c]])
+ B = np.array([-self.d, -other.d])
+ x, z = np.linalg.solve(A, B)
+ elif self.c != 0 and other.c != 0:
+ A = np.array([[self.a, self.b], [other.a, other.b]])
+ B = np.array([-self.d, -other.d])
+ x, y = np.linalg.solve(A, B)
+ return Line3(Point3(x, y, z), direction)
cal_intersection_point3(self, other: 'Line3') -> 'Point3'
计算平面与直线的交点。
Args:
other: 不与平面平行或在平面上的直线
+
Returns:
交点
+
Raises:
ValueError: 平面与直线平行或重合
+
def cal_intersection_point3(self, other: 'Line3') -> 'Point3':
+ """
+ 计算平面与直线的交点。
+ Args:
+ other: 不与平面平行或在平面上的直线
+ Returns:
+ 交点
+ Raises:
+ ValueError: 平面与直线平行或重合
+ """
+ if self.normal @ other.direction == 0:
+ raise ValueError('The plane and the line are parallel or coincident.')
+ x, y, z = other.get_parametric_equations()
+ t = -(self.a * other.point.x + self.b * other.point.y + self.c * other.point.z + self.d) / (self.a * other.direction.x + self.b * other.direction.y + self.c * other.direction.z)
+ return Point3(x(t), y(t), z(t))
cal_parallel_plane3(self, point: 'Point3') -> 'Plane3'
计算平行于该平面且过指定点的平面。
Args:
point: 指定点
+
Returns:
平面
+
def cal_parallel_plane3(self, point: 'Point3') -> 'Plane3':
+ """
+ 计算平行于该平面且过指定点的平面。
+ Args:
+ point: 指定点
+ Returns:
+ 平面
+ """
+ return Plane3.from_point_and_normal(point, self.normal)
is_parallel(self, other: 'Plane3') -> bool
判断两个平面是否平行。
Args:
other: 另一个平面
+
Returns:
是否平行
+
def is_parallel(self, other: 'Plane3') -> bool:
+ """
+ 判断两个平面是否平行。
+ Args:
+ other: 另一个平面
+ Returns:
+ 是否平行
+ """
+ return self.normal.is_parallel(other.normal)
normal(self: Any) -> 'Vector3'
平面的法向量。
Returns:
法向量
+
@property
+def normal(self) -> 'Vector3':
+ """
+ 平面的法向量。
+ Returns:
+ 法向量
+ """
+ return Vector3(self.a, self.b, self.c)
from_point_and_normal(cls: Any, point: 'Point3', normal: 'Vector3') -> 'Plane3'
工厂函数 由点和法向量构造平面(点法式构造)。
Args:
point: 平面上的一点
+
+normal: 法向量
+
Returns:
平面
+
@classmethod
+def from_point_and_normal(cls, point: 'Point3', normal: 'Vector3') -> 'Plane3':
+ """
+ 工厂函数 由点和法向量构造平面(点法式构造)。
+ Args:
+ point: 平面上的一点
+ normal: 法向量
+ Returns:
+ 平面
+ """
+ a, b, c = (normal.x, normal.y, normal.z)
+ d = -a * point.x - b * point.y - c * point.z
+ return cls(a, b, c, d)
from_three_points(cls: Any, p1: 'Point3', p2: 'Point3', p3: 'Point3') -> 'Plane3'
工厂函数 由三点构造平面。
Args:
p1: 点1
+
+p2: 点2
+
+p3: 点3
+
Returns:
平面
+
@classmethod
+def from_three_points(cls, p1: 'Point3', p2: 'Point3', p3: 'Point3') -> 'Plane3':
+ """
+ 工厂函数 由三点构造平面。
+ Args:
+ p1: 点1
+ p2: 点2
+ p3: 点3
+ Returns:
+ 平面
+ """
+ v1 = p2 - p1
+ v2 = p3 - p1
+ normal = v1.cross(v2)
+ return cls.from_point_and_normal(p1, normal)
from_two_lines(cls: Any, l1: 'Line3', l2: 'Line3') -> 'Plane3'
工厂函数 由两直线构造平面。
Args:
l1: 直线1
+
+l2: 直线2
+
Returns:
平面
+
@classmethod
+def from_two_lines(cls, l1: 'Line3', l2: 'Line3') -> 'Plane3':
+ """
+ 工厂函数 由两直线构造平面。
+ Args:
+ l1: 直线1
+ l2: 直线2
+ Returns:
+ 平面
+ """
+ v1 = l1.direction
+ v2 = l2.point - l1.point
+ if v2 == zero_vector3:
+ v2 = l2.get_point(1) - l1.point
+ return cls.from_point_and_normal(l1.point, v1.cross(v2))
from_point_and_line(cls: Any, point: 'Point3', line: 'Line3') -> 'Plane3'
工厂函数 由点和直线构造平面。
Args:
point: 面上一点
+
+line: 面上直线,不包含点
+
Returns:
平面
+
@classmethod
+def from_point_and_line(cls, point: 'Point3', line: 'Line3') -> 'Plane3':
+ """
+ 工厂函数 由点和直线构造平面。
+ Args:
+ point: 面上一点
+ line: 面上直线,不包含点
+ Returns:
+ 平面
+ """
+ return cls.from_point_and_normal(point, line.direction)
direction = self.normal.cross(other.normal)
t = -(self.a * other.point.x + self.b * other.point.y + self.c * other.point.z + self.d) / (self.a * other.direction.x + self.b * other.direction.y + self.c * other.direction.z)
d = -a * point.x - b * point.y - c * point.z
v1 = p2 - p1
v2 = p3 - p1
normal = v1.cross(v2)
v1 = l1.direction
v2 = l2.point - l1.point
s = 'Plane3: '
k = other.a / self.a
A = np.array([[self.b, self.c], [other.b, other.c]])
B = np.array([-self.d, -other.d])
v2 = l2.get_point(1) - l1.point
k = other.b / self.b
A = np.array([[self.a, self.c], [other.a, other.c]])
B = np.array([-self.d, -other.d])
k = other.c / self.c
A = np.array([[self.a, self.b], [other.a, other.b]])
B = np.array([-self.d, -other.d])
Point3
__init__(self, x: float, y: float, z: float) -> None
笛卡尔坐标系中的点。
Args:
x: x 坐标
+
+y: y 坐标
+
+z: z 坐标
+
def __init__(self, x: float, y: float, z: float):
+ """
+ 笛卡尔坐标系中的点。
+ Args:
+ x: x 坐标
+ y: y 坐标
+ z: z 坐标
+ """
+ self.x = x
+ self.y = y
+ self.z = z
approx(self, other: 'Point3', epsilon: float) -> bool
判断两个点是否近似相等。
Args:
other:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(self, other: 'Point3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个点是否近似相等。
+ Args:
+ other:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ return all([abs(self.x - other.x) < epsilon, abs(self.y - other.y) < epsilon, abs(self.z - other.z) < epsilon])
Segment3
__init__(self, p1: 'Point3', p2: 'Point3') -> None
三维空间中的线段。
:param p1:
:param p2:
def __init__(self, p1: 'Point3', p2: 'Point3'):
+ """
+ 三维空间中的线段。
+ :param p1:
+ :param p2:
+ """
+ self.p1 = p1
+ self.p2 = p2
+ '方向向量'
+ self.direction = self.p2 - self.p1
+ '长度'
+ self.length = self.direction.length
+ '中心点'
+ self.midpoint = Point3((self.p1.x + self.p2.x) / 2, (self.p1.y + self.p2.y) / 2, (self.p1.z + self.p2.z) / 2)
clamp(x: float, min_: float, max_: float) -> float
区间截断函数。
Args:
x:
+
+min_:
+
+max_:
+
Returns:
限制后的值
+
def clamp(x: float, min_: float, max_: float) -> float:
+ """
+ 区间截断函数。
+ Args:
+ x:
+ min_:
+ max_:
+
+ Returns:
+ 限制后的值
+ """
+ return max(min(x, max_), min_)
approx(x: float, y: float, epsilon: float) -> bool
判断两个数是否近似相等。或包装一个实数,用于判断是否近似于0。
Args:
x:
+
+y:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(x: float, y: float=0.0, epsilon: float=APPROX) -> bool:
+ """
+ 判断两个数是否近似相等。或包装一个实数,用于判断是否近似于0。
+ Args:
+ x:
+ y:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ return abs(x - y) < epsilon
sign(x: float, only_neg: bool) -> str
获取数的符号。
Args:
x: 数
+
+only_neg: 是否只返回负数的符号
+
Returns:
符号 + - ""
+
def sign(x: float, only_neg: bool=False) -> str:
+ """获取数的符号。
+ Args:
+ x: 数
+ only_neg: 是否只返回负数的符号
+ Returns:
+ 符号 + - ""
+ """
+ if x > 0:
+ return '+' if not only_neg else ''
+ elif x < 0:
+ return '-'
+ else:
+ return ''
sign_format(x: float, only_neg: bool) -> str
格式化符号数
-1 -> -1
1 -> +1
0 -> ""
Args:
x: 数
+
+only_neg: 是否只返回负数的符号
+
Returns:
符号 + - ""
+
def sign_format(x: float, only_neg: bool=False) -> str:
+ """格式化符号数
+ -1 -> -1
+ 1 -> +1
+ 0 -> ""
+ Args:
+ x: 数
+ only_neg: 是否只返回负数的符号
+ Returns:
+ 符号 + - ""
+ """
+ if x > 0:
+ return f'+{x}' if not only_neg else f'{x}'
+ elif x < 0:
+ return f'-{abs(x)}'
+ else:
+ return ''
Approx
用于近似比较对象
已实现对象 实数 Vector3 Point3 Plane3 Line3
__init__(self, value: RealNumber) -> None
def __init__(self, value: RealNumber):
+ self.value = value
raise_type_error(self, other: Any) -> None
def raise_type_error(self, other):
+ raise TypeError(f'Unsupported type: {type(self.value)} and {type(other)}')
Vector3
__init__(self, x: float, y: float, z: float) -> None
3维向量
Args:
x: x轴分量
+
+y: y轴分量
+
+z: z轴分量
+
def __init__(self, x: float, y: float, z: float):
+ """
+ 3维向量
+ Args:
+ x: x轴分量
+ y: y轴分量
+ z: z轴分量
+ """
+ self.x = x
+ self.y = y
+ self.z = z
approx(self, other: 'Vector3', epsilon: float) -> bool
判断两个向量是否近似相等。
Args:
other:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个向量是否近似相等。
+ Args:
+ other:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ return all([abs(self.x - other.x) < epsilon, abs(self.y - other.y) < epsilon, abs(self.z - other.z) < epsilon])
cal_angle(self, other: 'Vector3') -> 'AnyAngle'
计算两个向量之间的夹角。
Args:
other: 另一个向量
+
Returns:
夹角
+
def cal_angle(self, other: 'Vector3') -> 'AnyAngle':
+ """
+ 计算两个向量之间的夹角。
+ Args:
+ other: 另一个向量
+ Returns:
+ 夹角
+ """
+ return AnyAngle(math.acos(self @ other / (self.length * other.length)), is_radian=True)
cross(self, other: 'Vector3') -> 'Vector3'
向量积 叉乘:v1 cross v2 -> v3
叉乘为0,则两向量平行。
其余结果的模为平行四边形的面积。
返回如下行列式的结果:
i j k
x1 y1 z1
x2 y2 z2
Args:
other:
+
Returns:
行列式的结果
+
def cross(self, other: 'Vector3') -> 'Vector3':
+ """
+ 向量积 叉乘:v1 cross v2 -> v3
+
+ 叉乘为0,则两向量平行。
+ 其余结果的模为平行四边形的面积。
+
+ 返回如下行列式的结果:
+
+ ``i j k``
+
+ ``x1 y1 z1``
+
+ ``x2 y2 z2``
+
+ Args:
+ other:
+ Returns:
+ 行列式的结果
+ """
+ return Vector3(self.y * other.z - self.z * other.y, self.z * other.x - self.x * other.z, self.x * other.y - self.y * other.x)
is_approx_parallel(self, other: 'Vector3', epsilon: float) -> bool
判断两个向量是否近似平行。
Args:
other: 另一个向量
+
+epsilon: 允许的误差
+
Returns:
是否近似平行
+
def is_approx_parallel(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个向量是否近似平行。
+ Args:
+ other: 另一个向量
+ epsilon: 允许的误差
+ Returns:
+ 是否近似平行
+ """
+ return self.cross(other).length < epsilon
is_parallel(self, other: 'Vector3') -> bool
判断两个向量是否平行。
Args:
other: 另一个向量
+
Returns:
是否平行
+
def is_parallel(self, other: 'Vector3') -> bool:
+ """
+ 判断两个向量是否平行。
+ Args:
+ other: 另一个向量
+ Returns:
+ 是否平行
+ """
+ return self.cross(other).approx(zero_vector3)
normalize(self) -> None
将向量归一化。
自体归一化,不返回值。
def normalize(self):
+ """
+ 将向量归一化。
+
+ 自体归一化,不返回值。
+ """
+ length = self.length
+ self.x /= length
+ self.y /= length
+ self.z /= length
np_array(self: Any) -> 'np.ndarray'
返回numpy数组
Returns:
@property
+def np_array(self) -> 'np.ndarray':
+ """
+ 返回numpy数组
+ Returns:
+ """
+ return np.array([self.x, self.y, self.z])
length(self: Any) -> float
向量的模。
Returns:
模
+
@property
+def length(self) -> float:
+ """
+ 向量的模。
+ Returns:
+ 模
+ """
+ return math.sqrt(self.x ** 2 + self.y ** 2 + self.z ** 2)
unit(self: Any) -> 'Vector3'
获取该向量的单位向量。
Returns:
单位向量
+
@property
+def unit(self) -> 'Vector3':
+ """
+ 获取该向量的单位向量。
+ Returns:
+ 单位向量
+ """
+ return self / self.length
zero_vector3 = Vector3(0, 0, 0)
x_axis = Vector3(1, 0, 0)
y_axis = Vector3(0, 1, 0)
z_axis = Vector3(0, 0, 1)
length = self.length
sphere(radius: float, density: float) -> None
生成球体上的点集。
Args:
radius:
+
+density:
+
Returns:
List[Point3]: 球体上的点集。
+
@staticmethod
+def sphere(radius: float, density: float):
+ """
+ 生成球体上的点集。
+ Args:
+ radius:
+ density:
+ Returns:
+ List[Point3]: 球体上的点集。
+ """
+ area = 4 * np.pi * radius ** 2
+ num = int(area * density)
+ phi_list = np.arccos([clamp(-1 + (2.0 * _ - 1.0) / num, -1, 1) for _ in range(num)])
+ theta_list = np.sqrt(num * np.pi) * phi_list
+ x_array = radius * np.sin(phi_list) * np.cos(theta_list)
+ y_array = radius * np.sin(phi_list) * np.sin(theta_list)
+ z_array = radius * np.cos(phi_list)
+ return [Point3(x_array[i], y_array[i], z_array[i]) for i in range(num)]
GeometricModels
sphere(radius: float, density: float) -> None
生成球体上的点集。
Args:
radius:
+
+density:
+
Returns:
List[Point3]: 球体上的点集。
+
@staticmethod
+def sphere(radius: float, density: float):
+ """
+ 生成球体上的点集。
+ Args:
+ radius:
+ density:
+ Returns:
+ List[Point3]: 球体上的点集。
+ """
+ area = 4 * np.pi * radius ** 2
+ num = int(area * density)
+ phi_list = np.arccos([clamp(-1 + (2.0 * _ - 1.0) / num, -1, 1) for _ in range(num)])
+ theta_list = np.sqrt(num * np.pi) * phi_list
+ x_array = radius * np.sin(phi_list) * np.cos(theta_list)
+ y_array = radius * np.sin(phi_list) * np.sin(theta_list)
+ z_array = radius * np.cos(phi_list)
+ return [Point3(x_array[i], y_array[i], z_array[i]) for i in range(num)]
area = 4 * np.pi * radius ** 2
num = int(area * density)
phi_list = np.arccos([clamp(-1 + (2.0 * _ - 1.0) / num, -1, 1) for _ in range(num)])
theta_list = np.sqrt(num * np.pi) * phi_list
x_array = radius * np.sin(phi_list) * np.cos(theta_list)
y_array = radius * np.sin(phi_list) * np.sin(theta_list)
z_array = radius * np.cos(phi_list)
This page demonstrates usage of some of the runtime APIs provided by VitePress.
The main useData()
API can be used to access site, theme, and page data for the current page. It works in both .md
and .vue
files:
<script setup>
+import { useData } from 'vitepress'
+
+const { theme, page, frontmatter } = useData()
+</script>
+
+## Results
+
+### Theme Data
+<pre>{{ theme }}</pre>
+
+### Page Data
+<pre>{{ page }}</pre>
+
+### Page Frontmatter
+<pre>{{ frontmatter }}</pre>
AnyAngle
__init__(self, value: float, is_radian: bool) -> None
任意角度。
Args:
value: 角度或弧度值
+
+is_radian: 是否为弧度,默认为否
+
def __init__(self, value: float, is_radian: bool=False):
+ """
+ 任意角度。
+ Args:
+ value: 角度或弧度值
+ is_radian: 是否为弧度,默认为否
+ """
+ if is_radian:
+ self.radian = value
+ else:
+ self.radian = value * PI / 180
complementary(self: Any) -> 'AnyAngle'
余角:两角的和为90°。
Returns:
余角
+
@property
+def complementary(self) -> 'AnyAngle':
+ """
+ 余角:两角的和为90°。
+ Returns:
+ 余角
+ """
+ return AnyAngle(PI / 2 - self.minimum_positive.radian, is_radian=True)
supplementary(self: Any) -> 'AnyAngle'
补角:两角的和为180°。
Returns:
补角
+
@property
+def supplementary(self) -> 'AnyAngle':
+ """
+ 补角:两角的和为180°。
+ Returns:
+ 补角
+ """
+ return AnyAngle(PI - self.minimum_positive.radian, is_radian=True)
degree(self: Any) -> float
角度。
Returns:
弧度
+
@property
+def degree(self) -> float:
+ """
+ 角度。
+ Returns:
+ 弧度
+ """
+ return self.radian * 180 / PI
minimum_positive(self: Any) -> 'AnyAngle'
最小正角。
Returns:
最小正角度
+
@property
+def minimum_positive(self) -> 'AnyAngle':
+ """
+ 最小正角。
+ Returns:
+ 最小正角度
+ """
+ return AnyAngle(self.radian % (2 * PI))
maximum_negative(self: Any) -> 'AnyAngle'
最大负角。
Returns:
最大负角度
+
@property
+def maximum_negative(self) -> 'AnyAngle':
+ """
+ 最大负角。
+ Returns:
+ 最大负角度
+ """
+ return AnyAngle(-self.radian % (2 * PI), is_radian=True)
sin(self: Any) -> float
正弦值。
Returns:
正弦值
+
@property
+def sin(self) -> float:
+ """
+ 正弦值。
+ Returns:
+ 正弦值
+ """
+ return math.sin(self.radian)
cos(self: Any) -> float
余弦值。
Returns:
余弦值
+
@property
+def cos(self) -> float:
+ """
+ 余弦值。
+ Returns:
+ 余弦值
+ """
+ return math.cos(self.radian)
tan(self: Any) -> float
正切值。
Returns:
正切值
+
@property
+def tan(self) -> float:
+ """
+ 正切值。
+ Returns:
+ 正切值
+ """
+ return math.tan(self.radian)
cot(self: Any) -> float
余切值。
Returns:
余切值
+
@property
+def cot(self) -> float:
+ """
+ 余切值。
+ Returns:
+ 余切值
+ """
+ return 1 / math.tan(self.radian)
sec(self: Any) -> float
正割值。
Returns:
正割值
+
@property
+def sec(self) -> float:
+ """
+ 正割值。
+ Returns:
+ 正割值
+ """
+ return 1 / math.cos(self.radian)
csc(self: Any) -> float
余割值。
Returns:
余割值
+
@property
+def csc(self) -> float:
+ """
+ 余割值。
+ Returns:
+ 余割值
+ """
+ return 1 / math.sin(self.radian)
PI = math.pi
E = math.e
GOLDEN_RATIO = (1 + math.sqrt(5)) / 2
GAMMA = 0.5772156649015329
EPSILON = 0.0001
APPROX = 0.001
get_partial_derivative_func(func: MultiVarsFunc, var: int | tuple[int, ...], epsilon: Number) -> MultiVarsFunc
求N元函数一阶偏导函数。这玩意不太稳定,慎用。
Args:
func: 函数
+
+var: 变量位置,可为整数(一阶偏导)或整数元组(高阶偏导)
+
+epsilon: 偏移量
+
Returns:
偏导函数
+
Raises:
ValueError: 无效变量类型
+
def get_partial_derivative_func(func: MultiVarsFunc, var: int | tuple[int, ...], epsilon: Number=EPSILON) -> MultiVarsFunc:
+ """
+ 求N元函数一阶偏导函数。这玩意不太稳定,慎用。
+ Args:
+ func: 函数
+ var: 变量位置,可为整数(一阶偏导)或整数元组(高阶偏导)
+ epsilon: 偏移量
+ Returns:
+ 偏导函数
+ Raises:
+ ValueError: 无效变量类型
+ """
+ if isinstance(var, int):
+
+ def partial_derivative_func(*args: Var) -> Var:
+ args_list_plus = list(args)
+ args_list_plus[var] += epsilon
+ args_list_minus = list(args)
+ args_list_minus[var] -= epsilon
+ return (func(*args_list_plus) - func(*args_list_minus)) / (2 * epsilon)
+ return partial_derivative_func
+ elif isinstance(var, tuple):
+
+ def high_order_partial_derivative_func(*args: Var) -> Var:
+ result_func = func
+ for v in var:
+ result_func = get_partial_derivative_func(result_func, v, epsilon)
+ return result_func(*args)
+ return high_order_partial_derivative_func
+ else:
+ raise ValueError('Invalid var type')
partial_derivative_func() -> Var
def partial_derivative_func(*args: Var) -> Var:
+ args_list_plus = list(args)
+ args_list_plus[var] += epsilon
+ args_list_minus = list(args)
+ args_list_minus[var] -= epsilon
+ return (func(*args_list_plus) - func(*args_list_minus)) / (2 * epsilon)
high_order_partial_derivative_func() -> Var
def high_order_partial_derivative_func(*args: Var) -> Var:
+ result_func = func
+ for v in var:
+ result_func = get_partial_derivative_func(result_func, v, epsilon)
+ return result_func(*args)
CurveEquation
__init__(self, x_func: OneVarFunc, y_func: OneVarFunc, z_func: OneVarFunc) -> None
曲线方程。
:param x_func:
:param y_func:
:param z_func:
def __init__(self, x_func: OneVarFunc, y_func: OneVarFunc, z_func: OneVarFunc):
+ """
+ 曲线方程。
+ :param x_func:
+ :param y_func:
+ :param z_func:
+ """
+ self.x_func = x_func
+ self.y_func = y_func
+ self.z_func = z_func
args_list_plus = list(args)
args_list_minus = list(args)
result_func = func
result_func = get_partial_derivative_func(result_func, v, epsilon)
Line3
__init__(self, point: 'Point3', direction: 'Vector3') -> None
三维空间中的直线。由一个点和一个方向向量确定。
Args:
point: 直线上的一点
+
+direction: 直线的方向向量
+
def __init__(self, point: 'Point3', direction: 'Vector3'):
+ """
+ 三维空间中的直线。由一个点和一个方向向量确定。
+ Args:
+ point: 直线上的一点
+ direction: 直线的方向向量
+ """
+ self.point = point
+ self.direction = direction
approx(self, other: 'Line3', epsilon: float) -> bool
判断两条直线是否近似相等。
Args:
other: 另一条直线
+
+epsilon: 误差
+
Returns:
是否近似相等
+
def approx(self, other: 'Line3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两条直线是否近似相等。
+ Args:
+ other: 另一条直线
+ epsilon: 误差
+ Returns:
+ 是否近似相等
+ """
+ return self.is_approx_parallel(other, epsilon) and (self.point - other.point).is_approx_parallel(self.direction, epsilon)
cal_angle(self, other: 'Line3') -> 'AnyAngle'
计算直线和直线之间的夹角。
Args:
other: 另一条直线
+
Returns:
夹角弧度
+
Raises:
TypeError: 不支持的类型
+
def cal_angle(self, other: 'Line3') -> 'AnyAngle':
+ """
+ 计算直线和直线之间的夹角。
+ Args:
+ other: 另一条直线
+ Returns:
+ 夹角弧度
+ Raises:
+ TypeError: 不支持的类型
+ """
+ return self.direction.cal_angle(other.direction)
cal_distance(self, other: 'Line3 | Point3') -> float
计算直线和直线或点之间的距离。
Args:
other: 平行直线或点
+
Returns:
距离
+
Raises:
TypeError: 不支持的类型
+
def cal_distance(self, other: 'Line3 | Point3') -> float:
+ """
+ 计算直线和直线或点之间的距离。
+ Args:
+ other: 平行直线或点
+
+ Returns:
+ 距离
+ Raises:
+ TypeError: 不支持的类型
+ """
+ if isinstance(other, Line3):
+ if self == other:
+ return 0
+ elif self.is_parallel(other):
+ return (other.point - self.point).cross(self.direction).length / self.direction.length
+ elif not self.is_coplanar(other):
+ return abs(self.direction.cross(other.direction) @ (self.point - other.point) / self.direction.cross(other.direction).length)
+ else:
+ return 0
+ elif isinstance(other, Point3):
+ return (other - self.point).cross(self.direction).length / self.direction.length
+ else:
+ raise TypeError('Unsupported type.')
cal_intersection(self, other: 'Line3') -> 'Point3'
计算两条直线的交点。
Args:
other: 另一条直线
+
Returns:
交点
+
Raises:
ValueError: 直线平行
+
+ValueError: 直线不共面
+
def cal_intersection(self, other: 'Line3') -> 'Point3':
+ """
+ 计算两条直线的交点。
+ Args:
+ other: 另一条直线
+ Returns:
+ 交点
+ Raises:
+ ValueError: 直线平行
+ ValueError: 直线不共面
+ """
+ if self.is_parallel(other):
+ raise ValueError('Lines are parallel and do not intersect.')
+ if not self.is_coplanar(other):
+ raise ValueError('Lines are not coplanar and do not intersect.')
+ return self.point + self.direction.cross(other.direction) @ other.direction.cross(self.point - other.point) / self.direction.cross(other.direction).length ** 2 * self.direction
cal_perpendicular(self, point: 'Point3') -> 'Line3'
计算直线经过指定点p的垂线。
Args:
point: 指定点
+
Returns:
垂线
+
def cal_perpendicular(self, point: 'Point3') -> 'Line3':
+ """
+ 计算直线经过指定点p的垂线。
+ Args:
+ point: 指定点
+ Returns:
+ 垂线
+ """
+ return Line3(point, self.direction.cross(point - self.point))
get_point(self, t: RealNumber) -> 'Point3'
获取直线上的点。同一条直线,但起始点和方向向量不同,则同一个t对应的点不同。
Args:
t: 参数t
+
Returns:
点
+
def get_point(self, t: RealNumber) -> 'Point3':
+ """
+ 获取直线上的点。同一条直线,但起始点和方向向量不同,则同一个t对应的点不同。
+ Args:
+ t: 参数t
+ Returns:
+ 点
+ """
+ return self.point + t * self.direction
get_parametric_equations(self) -> tuple[OneSingleVarFunc, OneSingleVarFunc, OneSingleVarFunc]
获取直线的参数方程。
Returns:
x(t), y(t), z(t)
+
def get_parametric_equations(self) -> tuple[OneSingleVarFunc, OneSingleVarFunc, OneSingleVarFunc]:
+ """
+ 获取直线的参数方程。
+ Returns:
+ x(t), y(t), z(t)
+ """
+ return (lambda t: self.point.x + self.direction.x * t, lambda t: self.point.y + self.direction.y * t, lambda t: self.point.z + self.direction.z * t)
is_approx_parallel(self, other: 'Line3', epsilon: float) -> bool
判断两条直线是否近似平行。
Args:
other: 另一条直线
+
+epsilon: 误差
+
Returns:
是否近似平行
+
def is_approx_parallel(self, other: 'Line3', epsilon: float=1e-06) -> bool:
+ """
+ 判断两条直线是否近似平行。
+ Args:
+ other: 另一条直线
+ epsilon: 误差
+ Returns:
+ 是否近似平行
+ """
+ return self.direction.is_approx_parallel(other.direction, epsilon)
is_parallel(self, other: 'Line3') -> bool
判断两条直线是否平行。
Args:
other: 另一条直线
+
Returns:
是否平行
+
def is_parallel(self, other: 'Line3') -> bool:
+ """
+ 判断两条直线是否平行。
+ Args:
+ other: 另一条直线
+ Returns:
+ 是否平行
+ """
+ return self.direction.is_parallel(other.direction)
is_collinear(self, other: 'Line3') -> bool
判断两条直线是否共线。
Args:
other: 另一条直线
+
Returns:
是否共线
+
def is_collinear(self, other: 'Line3') -> bool:
+ """
+ 判断两条直线是否共线。
+ Args:
+ other: 另一条直线
+ Returns:
+ 是否共线
+ """
+ return self.is_parallel(other) and (self.point - other.point).is_parallel(self.direction)
is_point_on(self, point: 'Point3') -> bool
判断点是否在直线上。
Args:
point: 点
+
Returns:
是否在直线上
+
def is_point_on(self, point: 'Point3') -> bool:
+ """
+ 判断点是否在直线上。
+ Args:
+ point: 点
+ Returns:
+ 是否在直线上
+ """
+ return (point - self.point).is_parallel(self.direction)
is_coplanar(self, other: 'Line3') -> bool
判断两条直线是否共面。
充要条件:两直线方向向量的叉乘与两直线上任意一点的向量的点积为0。
Args:
other: 另一条直线
+
Returns:
是否共面
+
def is_coplanar(self, other: 'Line3') -> bool:
+ """
+ 判断两条直线是否共面。
+ 充要条件:两直线方向向量的叉乘与两直线上任意一点的向量的点积为0。
+ Args:
+ other: 另一条直线
+ Returns:
+ 是否共面
+ """
+ return self.direction.cross(other.direction) @ (self.point - other.point) == 0
simplify(self) -> None
简化直线方程,等价相等。
自体简化,不返回值。
按照可行性一次对x y z 化 0 处理,并对向量单位化
def simplify(self):
+ """
+ 简化直线方程,等价相等。
+ 自体简化,不返回值。
+
+ 按照可行性一次对x y z 化 0 处理,并对向量单位化
+ """
+ self.direction.normalize()
+ if self.direction.x == 0:
+ self.point.x = 0
+ if self.direction.y == 0:
+ self.point.y = 0
+ if self.direction.z == 0:
+ self.point.z = 0
from_two_points(cls: Any, p1: 'Point3', p2: 'Point3') -> 'Line3'
工厂函数 由两点构造直线。
Args:
p1: 点1
+
+p2: 点2
+
Returns:
直线
+
@classmethod
+def from_two_points(cls, p1: 'Point3', p2: 'Point3') -> 'Line3':
+ """
+ 工厂函数 由两点构造直线。
+ Args:
+ p1: 点1
+ p2: 点2
+ Returns:
+ 直线
+ """
+ direction = p2 - p1
+ return cls(p1, direction)
direction = p2 - p1
s = 'Line3: '
SingleVar = TypeVar('SingleVar', bound=Number)
ArrayVar = TypeVar('ArrayVar', bound=Iterable[Number])
Plane3
__init__(self, a: float, b: float, c: float, d: float) -> None
平面方程:ax + by + cz + d = 0
Args:
a:
+
+b:
+
+c:
+
+d:
+
def __init__(self, a: float, b: float, c: float, d: float):
+ """
+ 平面方程:ax + by + cz + d = 0
+ Args:
+ a:
+ b:
+ c:
+ d:
+ """
+ self.a = a
+ self.b = b
+ self.c = c
+ self.d = d
approx(self, other: 'Plane3', epsilon: float) -> bool
判断两个平面是否近似相等。
Args:
other:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(self, other: 'Plane3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个平面是否近似相等。
+ Args:
+ other:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ if self.a != 0:
+ k = other.a / self.a
+ return approx(other.b, self.b * k) and approx(other.c, self.c * k) and approx(other.d, self.d * k)
+ elif self.b != 0:
+ k = other.b / self.b
+ return approx(other.a, self.a * k) and approx(other.c, self.c * k) and approx(other.d, self.d * k)
+ elif self.c != 0:
+ k = other.c / self.c
+ return approx(other.a, self.a * k) and approx(other.b, self.b * k) and approx(other.d, self.d * k)
+ else:
+ return False
cal_angle(self, other: 'Line3 | Plane3') -> 'AnyAngle'
计算平面与平面之间的夹角。
Args:
other: 另一个平面
+
Returns:
夹角弧度
+
Raises:
TypeError: 不支持的类型
+
def cal_angle(self, other: 'Line3 | Plane3') -> 'AnyAngle':
+ """
+ 计算平面与平面之间的夹角。
+ Args:
+ other: 另一个平面
+ Returns:
+ 夹角弧度
+ Raises:
+ TypeError: 不支持的类型
+ """
+ if isinstance(other, Line3):
+ return self.normal.cal_angle(other.direction).complementary
+ elif isinstance(other, Plane3):
+ return AnyAngle(math.acos(self.normal @ other.normal / (self.normal.length * other.normal.length)), is_radian=True)
+ else:
+ raise TypeError(f'Unsupported type: {type(other)}')
cal_distance(self, other: 'Plane3 | Point3') -> float
计算平面与平面或点之间的距离。
Args:
other: 另一个平面或点
+
Returns:
距离
+
Raises:
TypeError: 不支持的类型
+
def cal_distance(self, other: 'Plane3 | Point3') -> float:
+ """
+ 计算平面与平面或点之间的距离。
+ Args:
+ other: 另一个平面或点
+ Returns:
+ 距离
+ Raises:
+ TypeError: 不支持的类型
+ """
+ if isinstance(other, Plane3):
+ return 0
+ elif isinstance(other, Point3):
+ return abs(self.a * other.x + self.b * other.y + self.c * other.z + self.d) / (self.a ** 2 + self.b ** 2 + self.c ** 2) ** 0.5
+ else:
+ raise TypeError(f'Unsupported type: {type(other)}')
cal_intersection_line3(self, other: 'Plane3') -> 'Line3'
计算两平面的交线。该方法有问题,待修复。
Args:
other: 另一个平面
+
Returns:
交线
+
Raises:
def cal_intersection_line3(self, other: 'Plane3') -> 'Line3':
+ """
+ 计算两平面的交线。该方法有问题,待修复。
+ Args:
+ other: 另一个平面
+ Returns:
+ 交线
+ Raises:
+ """
+ if self.normal.is_parallel(other.normal):
+ raise ValueError('Planes are parallel and have no intersection.')
+ direction = self.normal.cross(other.normal)
+ x, y, z = (0, 0, 0)
+ if self.a != 0 and other.a != 0:
+ A = np.array([[self.b, self.c], [other.b, other.c]])
+ B = np.array([-self.d, -other.d])
+ y, z = np.linalg.solve(A, B)
+ elif self.b != 0 and other.b != 0:
+ A = np.array([[self.a, self.c], [other.a, other.c]])
+ B = np.array([-self.d, -other.d])
+ x, z = np.linalg.solve(A, B)
+ elif self.c != 0 and other.c != 0:
+ A = np.array([[self.a, self.b], [other.a, other.b]])
+ B = np.array([-self.d, -other.d])
+ x, y = np.linalg.solve(A, B)
+ return Line3(Point3(x, y, z), direction)
cal_intersection_point3(self, other: 'Line3') -> 'Point3'
计算平面与直线的交点。
Args:
other: 不与平面平行或在平面上的直线
+
Returns:
交点
+
Raises:
ValueError: 平面与直线平行或重合
+
def cal_intersection_point3(self, other: 'Line3') -> 'Point3':
+ """
+ 计算平面与直线的交点。
+ Args:
+ other: 不与平面平行或在平面上的直线
+ Returns:
+ 交点
+ Raises:
+ ValueError: 平面与直线平行或重合
+ """
+ if self.normal @ other.direction == 0:
+ raise ValueError('The plane and the line are parallel or coincident.')
+ x, y, z = other.get_parametric_equations()
+ t = -(self.a * other.point.x + self.b * other.point.y + self.c * other.point.z + self.d) / (self.a * other.direction.x + self.b * other.direction.y + self.c * other.direction.z)
+ return Point3(x(t), y(t), z(t))
cal_parallel_plane3(self, point: 'Point3') -> 'Plane3'
计算平行于该平面且过指定点的平面。
Args:
point: 指定点
+
Returns:
平面
+
def cal_parallel_plane3(self, point: 'Point3') -> 'Plane3':
+ """
+ 计算平行于该平面且过指定点的平面。
+ Args:
+ point: 指定点
+ Returns:
+ 平面
+ """
+ return Plane3.from_point_and_normal(point, self.normal)
is_parallel(self, other: 'Plane3') -> bool
判断两个平面是否平行。
Args:
other: 另一个平面
+
Returns:
是否平行
+
def is_parallel(self, other: 'Plane3') -> bool:
+ """
+ 判断两个平面是否平行。
+ Args:
+ other: 另一个平面
+ Returns:
+ 是否平行
+ """
+ return self.normal.is_parallel(other.normal)
normal(self: Any) -> 'Vector3'
平面的法向量。
Returns:
法向量
+
@property
+def normal(self) -> 'Vector3':
+ """
+ 平面的法向量。
+ Returns:
+ 法向量
+ """
+ return Vector3(self.a, self.b, self.c)
from_point_and_normal(cls: Any, point: 'Point3', normal: 'Vector3') -> 'Plane3'
工厂函数 由点和法向量构造平面(点法式构造)。
Args:
point: 平面上的一点
+
+normal: 法向量
+
Returns:
平面
+
@classmethod
+def from_point_and_normal(cls, point: 'Point3', normal: 'Vector3') -> 'Plane3':
+ """
+ 工厂函数 由点和法向量构造平面(点法式构造)。
+ Args:
+ point: 平面上的一点
+ normal: 法向量
+ Returns:
+ 平面
+ """
+ a, b, c = (normal.x, normal.y, normal.z)
+ d = -a * point.x - b * point.y - c * point.z
+ return cls(a, b, c, d)
from_three_points(cls: Any, p1: 'Point3', p2: 'Point3', p3: 'Point3') -> 'Plane3'
工厂函数 由三点构造平面。
Args:
p1: 点1
+
+p2: 点2
+
+p3: 点3
+
Returns:
平面
+
@classmethod
+def from_three_points(cls, p1: 'Point3', p2: 'Point3', p3: 'Point3') -> 'Plane3':
+ """
+ 工厂函数 由三点构造平面。
+ Args:
+ p1: 点1
+ p2: 点2
+ p3: 点3
+ Returns:
+ 平面
+ """
+ v1 = p2 - p1
+ v2 = p3 - p1
+ normal = v1.cross(v2)
+ return cls.from_point_and_normal(p1, normal)
from_two_lines(cls: Any, l1: 'Line3', l2: 'Line3') -> 'Plane3'
工厂函数 由两直线构造平面。
Args:
l1: 直线1
+
+l2: 直线2
+
Returns:
平面
+
@classmethod
+def from_two_lines(cls, l1: 'Line3', l2: 'Line3') -> 'Plane3':
+ """
+ 工厂函数 由两直线构造平面。
+ Args:
+ l1: 直线1
+ l2: 直线2
+ Returns:
+ 平面
+ """
+ v1 = l1.direction
+ v2 = l2.point - l1.point
+ if v2 == zero_vector3:
+ v2 = l2.get_point(1) - l1.point
+ return cls.from_point_and_normal(l1.point, v1.cross(v2))
from_point_and_line(cls: Any, point: 'Point3', line: 'Line3') -> 'Plane3'
工厂函数 由点和直线构造平面。
Args:
point: 面上一点
+
+line: 面上直线,不包含点
+
Returns:
平面
+
@classmethod
+def from_point_and_line(cls, point: 'Point3', line: 'Line3') -> 'Plane3':
+ """
+ 工厂函数 由点和直线构造平面。
+ Args:
+ point: 面上一点
+ line: 面上直线,不包含点
+ Returns:
+ 平面
+ """
+ return cls.from_point_and_normal(point, line.direction)
direction = self.normal.cross(other.normal)
t = -(self.a * other.point.x + self.b * other.point.y + self.c * other.point.z + self.d) / (self.a * other.direction.x + self.b * other.direction.y + self.c * other.direction.z)
d = -a * point.x - b * point.y - c * point.z
v1 = p2 - p1
v2 = p3 - p1
normal = v1.cross(v2)
v1 = l1.direction
v2 = l2.point - l1.point
s = 'Plane3: '
k = other.a / self.a
A = np.array([[self.b, self.c], [other.b, other.c]])
B = np.array([-self.d, -other.d])
v2 = l2.get_point(1) - l1.point
k = other.b / self.b
A = np.array([[self.a, self.c], [other.a, other.c]])
B = np.array([-self.d, -other.d])
k = other.c / self.c
A = np.array([[self.a, self.b], [other.a, other.b]])
B = np.array([-self.d, -other.d])
Point3
__init__(self, x: float, y: float, z: float) -> None
笛卡尔坐标系中的点。
Args:
x: x 坐标
+
+y: y 坐标
+
+z: z 坐标
+
def __init__(self, x: float, y: float, z: float):
+ """
+ 笛卡尔坐标系中的点。
+ Args:
+ x: x 坐标
+ y: y 坐标
+ z: z 坐标
+ """
+ self.x = x
+ self.y = y
+ self.z = z
approx(self, other: 'Point3', epsilon: float) -> bool
判断两个点是否近似相等。
Args:
other:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(self, other: 'Point3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个点是否近似相等。
+ Args:
+ other:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ return all([abs(self.x - other.x) < epsilon, abs(self.y - other.y) < epsilon, abs(self.z - other.z) < epsilon])
Segment3
__init__(self, p1: 'Point3', p2: 'Point3') -> None
三维空间中的线段。
:param p1:
:param p2:
def __init__(self, p1: 'Point3', p2: 'Point3'):
+ """
+ 三维空间中的线段。
+ :param p1:
+ :param p2:
+ """
+ self.p1 = p1
+ self.p2 = p2
+ '方向向量'
+ self.direction = self.p2 - self.p1
+ '长度'
+ self.length = self.direction.length
+ '中心点'
+ self.midpoint = Point3((self.p1.x + self.p2.x) / 2, (self.p1.y + self.p2.y) / 2, (self.p1.z + self.p2.z) / 2)
clamp(x: float, min_: float, max_: float) -> float
区间截断函数。
Args:
x:
+
+min_:
+
+max_:
+
Returns:
限制后的值
+
def clamp(x: float, min_: float, max_: float) -> float:
+ """
+ 区间截断函数。
+ Args:
+ x:
+ min_:
+ max_:
+
+ Returns:
+ 限制后的值
+ """
+ return max(min(x, max_), min_)
approx(x: float, y: float, epsilon: float) -> bool
判断两个数是否近似相等。或包装一个实数,用于判断是否近似于0。
Args:
x:
+
+y:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(x: float, y: float=0.0, epsilon: float=APPROX) -> bool:
+ """
+ 判断两个数是否近似相等。或包装一个实数,用于判断是否近似于0。
+ Args:
+ x:
+ y:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ return abs(x - y) < epsilon
sign(x: float, only_neg: bool) -> str
获取数的符号。
Args:
x: 数
+
+only_neg: 是否只返回负数的符号
+
Returns:
符号 + - ""
+
def sign(x: float, only_neg: bool=False) -> str:
+ """获取数的符号。
+ Args:
+ x: 数
+ only_neg: 是否只返回负数的符号
+ Returns:
+ 符号 + - ""
+ """
+ if x > 0:
+ return '+' if not only_neg else ''
+ elif x < 0:
+ return '-'
+ else:
+ return ''
sign_format(x: float, only_neg: bool) -> str
格式化符号数
-1 -> -1
1 -> +1
0 -> ""
Args:
x: 数
+
+only_neg: 是否只返回负数的符号
+
Returns:
符号 + - ""
+
def sign_format(x: float, only_neg: bool=False) -> str:
+ """格式化符号数
+ -1 -> -1
+ 1 -> +1
+ 0 -> ""
+ Args:
+ x: 数
+ only_neg: 是否只返回负数的符号
+ Returns:
+ 符号 + - ""
+ """
+ if x > 0:
+ return f'+{x}' if not only_neg else f'{x}'
+ elif x < 0:
+ return f'-{abs(x)}'
+ else:
+ return ''
Approx
用于近似比较对象
已实现对象 实数 Vector3 Point3 Plane3 Line3
__init__(self, value: RealNumber) -> None
def __init__(self, value: RealNumber):
+ self.value = value
raise_type_error(self, other: Any) -> None
def raise_type_error(self, other):
+ raise TypeError(f'Unsupported type: {type(self.value)} and {type(other)}')
Vector3
__init__(self, x: float, y: float, z: float) -> None
3维向量
Args:
x: x轴分量
+
+y: y轴分量
+
+z: z轴分量
+
def __init__(self, x: float, y: float, z: float):
+ """
+ 3维向量
+ Args:
+ x: x轴分量
+ y: y轴分量
+ z: z轴分量
+ """
+ self.x = x
+ self.y = y
+ self.z = z
approx(self, other: 'Vector3', epsilon: float) -> bool
判断两个向量是否近似相等。
Args:
other:
+
+epsilon:
+
Returns:
是否近似相等
+
def approx(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个向量是否近似相等。
+ Args:
+ other:
+ epsilon:
+
+ Returns:
+ 是否近似相等
+ """
+ return all([abs(self.x - other.x) < epsilon, abs(self.y - other.y) < epsilon, abs(self.z - other.z) < epsilon])
cal_angle(self, other: 'Vector3') -> 'AnyAngle'
计算两个向量之间的夹角。
Args:
other: 另一个向量
+
Returns:
夹角
+
def cal_angle(self, other: 'Vector3') -> 'AnyAngle':
+ """
+ 计算两个向量之间的夹角。
+ Args:
+ other: 另一个向量
+ Returns:
+ 夹角
+ """
+ return AnyAngle(math.acos(self @ other / (self.length * other.length)), is_radian=True)
cross(self, other: 'Vector3') -> 'Vector3'
向量积 叉乘:v1 cross v2 -> v3
叉乘为0,则两向量平行。
其余结果的模为平行四边形的面积。
返回如下行列式的结果:
i j k
x1 y1 z1
x2 y2 z2
Args:
other:
+
Returns:
行列式的结果
+
def cross(self, other: 'Vector3') -> 'Vector3':
+ """
+ 向量积 叉乘:v1 cross v2 -> v3
+
+ 叉乘为0,则两向量平行。
+ 其余结果的模为平行四边形的面积。
+
+ 返回如下行列式的结果:
+
+ \`\`i j k\`\`
+
+ \`\`x1 y1 z1\`\`
+
+ \`\`x2 y2 z2\`\`
+
+ Args:
+ other:
+ Returns:
+ 行列式的结果
+ """
+ return Vector3(self.y * other.z - self.z * other.y, self.z * other.x - self.x * other.z, self.x * other.y - self.y * other.x)
is_approx_parallel(self, other: 'Vector3', epsilon: float) -> bool
判断两个向量是否近似平行。
Args:
other: 另一个向量
+
+epsilon: 允许的误差
+
Returns:
是否近似平行
+
def is_approx_parallel(self, other: 'Vector3', epsilon: float=APPROX) -> bool:
+ """
+ 判断两个向量是否近似平行。
+ Args:
+ other: 另一个向量
+ epsilon: 允许的误差
+ Returns:
+ 是否近似平行
+ """
+ return self.cross(other).length < epsilon
is_parallel(self, other: 'Vector3') -> bool
判断两个向量是否平行。
Args:
other: 另一个向量
+
Returns:
是否平行
+
def is_parallel(self, other: 'Vector3') -> bool:
+ """
+ 判断两个向量是否平行。
+ Args:
+ other: 另一个向量
+ Returns:
+ 是否平行
+ """
+ return self.cross(other).approx(zero_vector3)
normalize(self) -> None
将向量归一化。
自体归一化,不返回值。
def normalize(self):
+ """
+ 将向量归一化。
+
+ 自体归一化,不返回值。
+ """
+ length = self.length
+ self.x /= length
+ self.y /= length
+ self.z /= length
np_array(self: Any) -> 'np.ndarray'
返回numpy数组
Returns:
@property
+def np_array(self) -> 'np.ndarray':
+ """
+ 返回numpy数组
+ Returns:
+ """
+ return np.array([self.x, self.y, self.z])
length(self: Any) -> float
向量的模。
Returns:
模
+
@property
+def length(self) -> float:
+ """
+ 向量的模。
+ Returns:
+ 模
+ """
+ return math.sqrt(self.x ** 2 + self.y ** 2 + self.z ** 2)
unit(self: Any) -> 'Vector3'
获取该向量的单位向量。
Returns:
单位向量
+
@property
+def unit(self) -> 'Vector3':
+ """
+ 获取该向量的单位向量。
+ Returns:
+ 单位向量
+ """
+ return self / self.length
zero_vector3 = Vector3(0, 0, 0)
x_axis = Vector3(1, 0, 0)
y_axis = Vector3(0, 1, 0)
z_axis = Vector3(0, 0, 1)
length = self.length
sphere(radius: float, density: float) -> None
生成球体上的点集。
Args:
radius:
+
+density:
+
Returns:
List[Point3]: 球体上的点集。
+
@staticmethod
+def sphere(radius: float, density: float):
+ """
+ 生成球体上的点集。
+ Args:
+ radius:
+ density:
+ Returns:
+ List[Point3]: 球体上的点集。
+ """
+ area = 4 * np.pi * radius ** 2
+ num = int(area * density)
+ phi_list = np.arccos([clamp(-1 + (2.0 * _ - 1.0) / num, -1, 1) for _ in range(num)])
+ theta_list = np.sqrt(num * np.pi) * phi_list
+ x_array = radius * np.sin(phi_list) * np.cos(theta_list)
+ y_array = radius * np.sin(phi_list) * np.sin(theta_list)
+ z_array = radius * np.cos(phi_list)
+ return [Point3(x_array[i], y_array[i], z_array[i]) for i in range(num)]
GeometricModels
sphere(radius: float, density: float) -> None
生成球体上的点集。
Args:
radius:
+
+density:
+
Returns:
List[Point3]: 球体上的点集。
+
@staticmethod
+def sphere(radius: float, density: float):
+ """
+ 生成球体上的点集。
+ Args:
+ radius:
+ density:
+ Returns:
+ List[Point3]: 球体上的点集。
+ """
+ area = 4 * np.pi * radius ** 2
+ num = int(area * density)
+ phi_list = np.arccos([clamp(-1 + (2.0 * _ - 1.0) / num, -1, 1) for _ in range(num)])
+ theta_list = np.sqrt(num * np.pi) * phi_list
+ x_array = radius * np.sin(phi_list) * np.cos(theta_list)
+ y_array = radius * np.sin(phi_list) * np.sin(theta_list)
+ z_array = radius * np.cos(phi_list)
+ return [Point3(x_array[i], y_array[i], z_array[i]) for i in range(num)]
area = 4 * np.pi * radius ** 2
num = int(area * density)
phi_list = np.arccos([clamp(-1 + (2.0 * _ - 1.0) / num, -1, 1) for _ in range(num)])
theta_list = np.sqrt(num * np.pi) * phi_list
x_array = radius * np.sin(phi_list) * np.cos(theta_list)
y_array = radius * np.sin(phi_list) * np.sin(theta_list)
z_array = radius * np.cos(phi_list)
numpy
、scipy
及sumpy
进行了封装和集成,使脚本编写像使用Geogebra一样简单"},{"title":"内置预设","details":"提供了大量的预设,包括常见的几何图形、粒子效果等,方便快速制作"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),o={name:"index.md"};function i(c,n,d,s,r,l){return a(),t("div")}const x=e(o,[["render",i]]);export{p as __pageData,x as default};
diff --git a/assets/index.md.CJvRmMfL.lean.js b/assets/index.md.CJvRmMfL.lean.js
new file mode 100644
index 0000000..7162b9e
--- /dev/null
+++ b/assets/index.md.CJvRmMfL.lean.js
@@ -0,0 +1 @@
+import{_ as e,c as t,o as a}from"./chunks/framework.BV61Qrc0.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"MBCP docs","text":"More basic change particle","tagline":"用于几何运算和粒子制作的库","actions":[{"theme":"brand","text":"快速开始","link":"md-ex"},{"theme":"alt","text":"API文档","link":"api/"}]},"features":[{"title":"高可用性","details":"通过简单的接口,实现了大部分几何运算和粒子制作的需求"},{"title":"高集成度","details":"对numpy
、scipy
及sumpy
进行了封装和集成,使脚本编写像使用Geogebra一样简单"},{"title":"内置预设","details":"提供了大量的预设,包括常见的几何图形、粒子效果等,方便快速制作"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),o={name:"index.md"};function i(c,n,d,s,r,l){return a(),t("div")}const x=e(o,[["render",i]]);export{p as __pageData,x as default};
diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2
new file mode 100644
index 0000000..b6b603d
Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ
diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2
new file mode 100644
index 0000000..def40a4
Binary files /dev/null and b/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ
diff --git a/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/assets/inter-italic-greek-ext.1u6EdAuj.woff2
new file mode 100644
index 0000000..e070c3d
Binary files /dev/null and b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ
diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2
new file mode 100644
index 0000000..a3c16ca
Binary files /dev/null and b/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ
diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2
new file mode 100644
index 0000000..2210a89
Binary files /dev/null and b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ
diff --git a/assets/inter-italic-latin.C2AdPX0b.woff2 b/assets/inter-italic-latin.C2AdPX0b.woff2
new file mode 100644
index 0000000..790d62d
Binary files /dev/null and b/assets/inter-italic-latin.C2AdPX0b.woff2 differ
diff --git a/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/assets/inter-italic-vietnamese.BSbpV94h.woff2
new file mode 100644
index 0000000..1eec077
Binary files /dev/null and b/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ
diff --git a/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2
new file mode 100644
index 0000000..2cfe615
Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ
diff --git a/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2
new file mode 100644
index 0000000..e3886dd
Binary files /dev/null and b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ
diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2
new file mode 100644
index 0000000..36d6748
Binary files /dev/null and b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ
diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2
new file mode 100644
index 0000000..2bed1e8
Binary files /dev/null and b/assets/inter-roman-greek.BBVDIX6e.woff2 differ
diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2
new file mode 100644
index 0000000..9a8d1e2
Binary files /dev/null and b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ
diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2
new file mode 100644
index 0000000..07d3c53
Binary files /dev/null and b/assets/inter-roman-latin.Di8DUHzh.woff2 differ
diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2
new file mode 100644
index 0000000..57bdc22
Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ
diff --git a/assets/md-ex.md.BX0WqOqv.js b/assets/md-ex.md.BX0WqOqv.js
new file mode 100644
index 0000000..31360cd
--- /dev/null
+++ b/assets/md-ex.md.BX0WqOqv.js
@@ -0,0 +1,33 @@
+import{_ as s,c as i,o as a,a2 as n}from"./chunks/framework.BV61Qrc0.js";const g=JSON.parse('{"title":"Markdown Extension Examples","description":"","frontmatter":{},"headers":[],"relativePath":"md-ex.md","filePath":"md-ex.md"}'),t={name:"md-ex.md"},e=n(`This page demonstrates some of the built-in markdown extensions provided by VitePress.
VitePress provides Syntax Highlighting powered by Shiki, with additional features like line-highlighting:
Input
\`\`\`js{4}
+export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
+\`\`\`
Output
export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
Input
::: info
+This is an info box.
+:::
+
+::: tip
+This is a tip.
+:::
+
+::: warning
+This is a warning.
+:::
+
+::: danger
+This is a dangerous warning.
+:::
+
+::: details
+This is a details block.
+:::
Output
INFO
This is an info box.
TIP
This is a tip.
WARNING
This is a warning.
DANGER
This is a dangerous warning.
This is a details block.
Check out the documentation for the full list of markdown extensions.
`,19),l=[e];function p(h,k,r,d,o,E){return a(),i("div",null,l)}const m=s(t,[["render",p]]);export{g as __pageData,m as default}; diff --git a/assets/md-ex.md.BX0WqOqv.lean.js b/assets/md-ex.md.BX0WqOqv.lean.js new file mode 100644 index 0000000..f08e7fd --- /dev/null +++ b/assets/md-ex.md.BX0WqOqv.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a2 as n}from"./chunks/framework.BV61Qrc0.js";const g=JSON.parse('{"title":"Markdown Extension Examples","description":"","frontmatter":{},"headers":[],"relativePath":"md-ex.md","filePath":"md-ex.md"}'),t={name:"md-ex.md"},e=n("",19),l=[e];function p(h,k,r,d,o,E){return a(),i("div",null,l)}const m=s(t,[["render",p]]);export{g as __pageData,m as default}; diff --git a/assets/style.Bb0QBJmh.css b/assets/style.Bb0QBJmh.css new file mode 100644 index 0000000..b26e9bf --- /dev/null +++ b/assets/style.Bb0QBJmh.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-3cecd3dd]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-3cecd3dd],.VPBackdrop.fade-leave-to[data-v-3cecd3dd]{opacity:0}.VPBackdrop.fade-leave-active[data-v-3cecd3dd]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-3cecd3dd]{display:none}}.NotFound[data-v-794c8617]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-794c8617]{padding:96px 32px 168px}}.code[data-v-794c8617]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-794c8617]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-794c8617]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-794c8617]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-794c8617]{padding-top:20px}.link[data-v-794c8617]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-794c8617]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-f55eb20b]{position:relative;z-index:1}.nested[data-v-f55eb20b]{padding-right:16px;padding-left:16px}.outline-link[data-v-f55eb20b]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-f55eb20b]:hover,.outline-link.active[data-v-f55eb20b]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-f55eb20b]{padding-left:13px}.VPDocAsideOutline[data-v-e9eccece]{display:none}.VPDocAsideOutline.has-outline[data-v-e9eccece]{display:block}.content[data-v-e9eccece]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-e9eccece]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-e9eccece]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-9030d96a]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-9030d96a]{flex-grow:1}.VPDocAside[data-v-9030d96a] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-9030d96a] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-9030d96a] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-0d7790be]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-0d7790be]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-f33b051d]{margin-top:64px}.edit-info[data-v-f33b051d]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-f33b051d]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-f33b051d]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-f33b051d]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-f33b051d]{margin-right:8px}.prev-next[data-v-f33b051d]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-f33b051d]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-f33b051d]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-f33b051d]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-f33b051d]{margin-left:auto;text-align:right}.desc[data-v-f33b051d]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-f33b051d]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-aa782c77]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-aa782c77]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-aa782c77]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-aa782c77]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-aa782c77]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-aa782c77]{display:flex;justify-content:center}.VPDoc .aside[data-v-aa782c77]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-aa782c77]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-aa782c77]{max-width:1104px}}.container[data-v-aa782c77]{margin:0 auto;width:100%}.aside[data-v-aa782c77]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-aa782c77]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-aa782c77]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-aa782c77]::-webkit-scrollbar{display:none}.aside-curtain[data-v-aa782c77]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-aa782c77]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-aa782c77]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-aa782c77]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-aa782c77]{order:1;margin:0;min-width:640px}}.content-container[data-v-aa782c77]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-aa782c77]{max-width:688px}.VPButton[data-v-2c313aad]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-2c313aad]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-2c313aad]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-2c313aad]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-2c313aad]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-2c313aad]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-2c313aad]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-2c313aad]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-2c313aad]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-2c313aad]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-2c313aad]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-2c313aad]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-2c313aad]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-778ce7b3]{display:none}.dark .VPImage.light[data-v-778ce7b3]{display:none}.VPHero[data-v-1e5b8ae1]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-1e5b8ae1]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-1e5b8ae1]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-1e5b8ae1]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-1e5b8ae1]{flex-direction:row}}.main[data-v-1e5b8ae1]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-1e5b8ae1]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-1e5b8ae1]{text-align:left}}@media (min-width: 960px){.main[data-v-1e5b8ae1]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-1e5b8ae1]{max-width:592px}}.name[data-v-1e5b8ae1],.text[data-v-1e5b8ae1]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-1e5b8ae1],.VPHero.has-image .text[data-v-1e5b8ae1]{margin:0 auto}.name[data-v-1e5b8ae1]{color:var(--vp-home-hero-name-color)}.clip[data-v-1e5b8ae1]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-1e5b8ae1],.text[data-v-1e5b8ae1]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-1e5b8ae1],.text[data-v-1e5b8ae1]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-1e5b8ae1],.VPHero.has-image .text[data-v-1e5b8ae1]{margin:0}}.tagline[data-v-1e5b8ae1]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-1e5b8ae1]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-1e5b8ae1]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-1e5b8ae1]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-1e5b8ae1]{margin:0}}.actions[data-v-1e5b8ae1]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-1e5b8ae1]{justify-content:center}@media (min-width: 640px){.actions[data-v-1e5b8ae1]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-1e5b8ae1]{justify-content:flex-start}}.action[data-v-1e5b8ae1]{flex-shrink:0;padding:6px}.image[data-v-1e5b8ae1]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-1e5b8ae1]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-1e5b8ae1]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-1e5b8ae1]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-1e5b8ae1]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-1e5b8ae1]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-1e5b8ae1]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-1e5b8ae1]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-1e5b8ae1]{width:320px;height:320px}}[data-v-1e5b8ae1] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-1e5b8ae1] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-1e5b8ae1] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-dc42ca30]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-dc42ca30]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-dc42ca30]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-dc42ca30]>.VPImage{margin-bottom:20px}.icon[data-v-dc42ca30]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-dc42ca30]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-dc42ca30]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-dc42ca30]{padding-top:8px}.link-text-value[data-v-dc42ca30]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-dc42ca30]{margin-left:6px}.VPFeatures[data-v-d6e8dd35]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-d6e8dd35]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-d6e8dd35]{padding:0 64px}}.container[data-v-d6e8dd35]{margin:0 auto;max-width:1152px}.items[data-v-d6e8dd35]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-d6e8dd35]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-d6e8dd35],.item.grid-4[data-v-d6e8dd35],.item.grid-6[data-v-d6e8dd35]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-d6e8dd35],.item.grid-4[data-v-d6e8dd35]{width:50%}.item.grid-3[data-v-d6e8dd35],.item.grid-6[data-v-d6e8dd35]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-d6e8dd35]{width:25%}}.container[data-v-811aea7b]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-811aea7b]{padding:0 48px}}@media (min-width: 960px){.container[data-v-811aea7b]{width:100%;padding:0 64px}}.vp-doc[data-v-811aea7b] .VPHomeSponsors,.vp-doc[data-v-811aea7b] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-811aea7b] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-811aea7b] .VPHomeSponsors a,.vp-doc[data-v-811aea7b] .VPTeamPage a{text-decoration:none}.VPHome[data-v-4dea4f14]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-4dea4f14]{margin-bottom:128px}}.VPContent[data-v-4fa77a91]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-4fa77a91]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-4fa77a91]{margin:0}@media (min-width: 960px){.VPContent[data-v-4fa77a91]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-4fa77a91]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-4fa77a91]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-50f76801]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-50f76801]{display:none}.VPFooter[data-v-50f76801] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-50f76801] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-50f76801]{padding:32px}}.container[data-v-50f76801]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-50f76801],.copyright[data-v-50f76801]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-c4b0adf9]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-c4b0adf9]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-c4b0adf9]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-c4b0adf9]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-c4b0adf9]{color:var(--vp-c-text-1)}.icon[data-v-c4b0adf9]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-c4b0adf9]{font-size:14px}.icon[data-v-c4b0adf9]{font-size:16px}}.open>.icon[data-v-c4b0adf9]{transform:rotate(90deg)}.items[data-v-c4b0adf9]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-c4b0adf9]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-c4b0adf9]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-c4b0adf9]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-c4b0adf9]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-c4b0adf9]{transition:all .2s ease-out}.flyout-leave-active[data-v-c4b0adf9]{transition:all .15s ease-in}.flyout-enter-from[data-v-c4b0adf9],.flyout-leave-to[data-v-c4b0adf9]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-513d39e6]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-513d39e6]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-513d39e6]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-513d39e6]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-513d39e6]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-513d39e6]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-513d39e6]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-513d39e6]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-513d39e6]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-513d39e6]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-513d39e6]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-513d39e6]{display:none}}.menu-icon[data-v-513d39e6]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-513d39e6]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-513d39e6]{padding:12px 32px 11px}}.VPSwitch[data-v-793caf05]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-793caf05]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-793caf05]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-793caf05]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-793caf05] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-793caf05] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-38c704f2]{opacity:1}.moon[data-v-38c704f2],.dark .sun[data-v-38c704f2]{opacity:0}.dark .moon[data-v-38c704f2]{opacity:1}.dark .VPSwitchAppearance[data-v-38c704f2] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-fd625bab]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-fd625bab]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-a9b5eada]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-a9b5eada]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-a9b5eada]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-a9b5eada]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-6d568c27]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-6d568c27]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-6d568c27]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-6d568c27]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-36a6a4be]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-36a6a4be] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-36a6a4be] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-36a6a4be] .group:last-child{padding-bottom:0}.VPMenu[data-v-36a6a4be] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-36a6a4be] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-36a6a4be] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-36a6a4be] .action{padding-left:24px}.VPFlyout[data-v-6d56b0ed]{position:relative}.VPFlyout[data-v-6d56b0ed]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-6d56b0ed]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-6d56b0ed]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-6d56b0ed]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-6d56b0ed]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-6d56b0ed],.button[aria-expanded=true]+.menu[data-v-6d56b0ed]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-6d56b0ed]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-6d56b0ed]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-6d56b0ed]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-6d56b0ed]{margin-right:0;font-size:16px}.text-icon[data-v-6d56b0ed]{margin-left:4px;font-size:14px}.icon[data-v-6d56b0ed]{font-size:20px;transition:fill .25s}.menu[data-v-6d56b0ed]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-36d54f99]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-36d54f99]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-36d54f99]>svg,.VPSocialLink[data-v-36d54f99]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-0ada25a4]{display:flex;justify-content:center}.VPNavBarExtra[data-v-8ac0e455]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-8ac0e455]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-8ac0e455]{display:none}}.trans-title[data-v-8ac0e455]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-8ac0e455],.item.social-links[data-v-8ac0e455]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-8ac0e455]{min-width:176px}.appearance-action[data-v-8ac0e455]{margin-right:-2px}.social-links-list[data-v-8ac0e455]{margin:-4px -8px}.VPNavBarHamburger[data-v-9b302893]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-9b302893]{display:none}}.container[data-v-9b302893]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-9b302893]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-9b302893]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-9b302893]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-9b302893]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-9b302893]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-9b302893]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-9b302893],.VPNavBarHamburger.active:hover .middle[data-v-9b302893],.VPNavBarHamburger.active:hover .bottom[data-v-9b302893]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-9b302893],.middle[data-v-9b302893],.bottom[data-v-9b302893]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-9b302893]{top:0;left:0;transform:translate(0)}.middle[data-v-9b302893]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-9b302893]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-4ca2fdac]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-4ca2fdac],.VPNavBarMenuLink[data-v-4ca2fdac]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-ae469694]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-ae469694]{display:flex}}/*! @docsearch/css 3.6.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-9b3d2141]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-9b3d2141]{display:flex;align-items:center}}.title[data-v-73c882b0]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-73c882b0]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-73c882b0]{border-bottom-color:var(--vp-c-divider)}}[data-v-73c882b0] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-ba521018]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-ba521018]{display:flex;align-items:center}}.title[data-v-ba521018]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-af8d762d]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-af8d762d]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-af8d762d]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-af8d762d]:not(.home){background-color:transparent}.VPNavBar[data-v-af8d762d]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-af8d762d]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-af8d762d]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-af8d762d]{padding:0}}.container[data-v-af8d762d]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-af8d762d],.container>.content[data-v-af8d762d]{pointer-events:none}.container[data-v-af8d762d] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-af8d762d]{max-width:100%}}.title[data-v-af8d762d]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-af8d762d]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-af8d762d]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-af8d762d]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-af8d762d]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-af8d762d]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-af8d762d]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-af8d762d]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-af8d762d]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-af8d762d]{column-gap:.5rem}}.menu+.translations[data-v-af8d762d]:before,.menu+.appearance[data-v-af8d762d]:before,.menu+.social-links[data-v-af8d762d]:before,.translations+.appearance[data-v-af8d762d]:before,.appearance+.social-links[data-v-af8d762d]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-af8d762d]:before,.translations+.appearance[data-v-af8d762d]:before{margin-right:16px}.appearance+.social-links[data-v-af8d762d]:before{margin-left:16px}.social-links[data-v-af8d762d]{margin-right:-8px}.divider[data-v-af8d762d]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-af8d762d]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-af8d762d]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-af8d762d]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-af8d762d]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-af8d762d]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-af8d762d]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-89b5e60a]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-89b5e60a]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-1dbea2c1]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-1dbea2c1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-bfeb9577]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-bfeb9577]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-479edfcd]{display:block}.title[data-v-479edfcd]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-c2cd7d8e]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-c2cd7d8e]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-c2cd7d8e]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-c2cd7d8e]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-c2cd7d8e]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-c2cd7d8e]{transform:rotate(45deg)}.button[data-v-c2cd7d8e]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-c2cd7d8e]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-c2cd7d8e]{transition:transform .25s}.group[data-v-c2cd7d8e]:first-child{padding-top:0}.group+.group[data-v-c2cd7d8e],.group+.item[data-v-c2cd7d8e]{padding-top:4px}.VPNavScreenTranslations[data-v-7397f3c0]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-7397f3c0]{height:auto}.title[data-v-7397f3c0]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-7397f3c0]{font-size:16px}.icon.lang[data-v-7397f3c0]{margin-right:8px}.icon.chevron[data-v-7397f3c0]{margin-left:4px}.list[data-v-7397f3c0]{padding:4px 0 0 24px}.link[data-v-7397f3c0]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-9061cc92]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-9061cc92],.VPNavScreen.fade-leave-active[data-v-9061cc92]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-9061cc92],.VPNavScreen.fade-leave-active .container[data-v-9061cc92]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-9061cc92],.VPNavScreen.fade-leave-to[data-v-9061cc92]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-9061cc92],.VPNavScreen.fade-leave-to .container[data-v-9061cc92]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-9061cc92]{display:none}}.container[data-v-9061cc92]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-9061cc92],.menu+.appearance[data-v-9061cc92],.translations+.appearance[data-v-9061cc92]{margin-top:24px}.menu+.social-links[data-v-9061cc92]{margin-top:16px}.appearance+.social-links[data-v-9061cc92]{margin-top:16px}.VPNav[data-v-0c3b3583]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-0c3b3583]{position:fixed}}.VPSidebarItem.level-0[data-v-e6240f47]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-e6240f47]{padding-bottom:10px}.item[data-v-e6240f47]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-e6240f47]{cursor:pointer}.indicator[data-v-e6240f47]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-e6240f47],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-e6240f47],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-e6240f47],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-e6240f47]{background-color:var(--vp-c-brand-1)}.link[data-v-e6240f47]{display:flex;align-items:center;flex-grow:1}.text[data-v-e6240f47]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-e6240f47]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-e6240f47],.VPSidebarItem.level-2 .text[data-v-e6240f47],.VPSidebarItem.level-3 .text[data-v-e6240f47],.VPSidebarItem.level-4 .text[data-v-e6240f47],.VPSidebarItem.level-5 .text[data-v-e6240f47]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-e6240f47],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-e6240f47],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-e6240f47],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-e6240f47],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-e6240f47],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-e6240f47]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-e6240f47],.VPSidebarItem.level-1.has-active>.item>.text[data-v-e6240f47],.VPSidebarItem.level-2.has-active>.item>.text[data-v-e6240f47],.VPSidebarItem.level-3.has-active>.item>.text[data-v-e6240f47],.VPSidebarItem.level-4.has-active>.item>.text[data-v-e6240f47],.VPSidebarItem.level-5.has-active>.item>.text[data-v-e6240f47],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-e6240f47],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-e6240f47],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-e6240f47],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-e6240f47],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-e6240f47],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-e6240f47]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-e6240f47],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-e6240f47],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-e6240f47],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-e6240f47],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-e6240f47],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-e6240f47]{color:var(--vp-c-brand-1)}.caret[data-v-e6240f47]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-e6240f47]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-e6240f47]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-e6240f47]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-e6240f47]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-e6240f47],.VPSidebarItem.level-2 .items[data-v-e6240f47],.VPSidebarItem.level-3 .items[data-v-e6240f47],.VPSidebarItem.level-4 .items[data-v-e6240f47],.VPSidebarItem.level-5 .items[data-v-e6240f47]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-e6240f47]{display:none}.no-transition[data-v-c4d8cef8] .caret-icon{transition:none}.group+.group[data-v-c4d8cef8]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-c4d8cef8]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-a2c838fb]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-a2c838fb]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-a2c838fb]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-a2c838fb]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-a2c838fb]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-a2c838fb]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-a2c838fb]{outline:0}.VPSkipLink[data-v-efdf7a7d]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-efdf7a7d]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-efdf7a7d]{top:14px;left:16px}}.Layout[data-v-8e016544]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-af52d356]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-af52d356]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-af52d356]{margin:128px 0}}.VPHomeSponsors[data-v-af52d356]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-af52d356]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-af52d356]{padding:0 64px}}.container[data-v-af52d356]{margin:0 auto;max-width:1152px}.love[data-v-af52d356]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-af52d356]{display:inline-block}.message[data-v-af52d356]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-af52d356]{padding-top:32px}.action[data-v-af52d356]{padding-top:40px;text-align:center}.VPTeamPage[data-v-27a8b650]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-27a8b650]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-27a8b650-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-27a8b650-s],.VPTeamMembers+.VPTeamPageSection[data-v-27a8b650-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-27a8b650-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-27a8b650-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-27a8b650-s],.VPTeamMembers+.VPTeamPageSection[data-v-27a8b650-s]{margin-top:96px}}.VPTeamMembers[data-v-27a8b650-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-27a8b650-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-27a8b650-s]{padding:0 64px}}.VPTeamPageTitle[data-v-3b9ba24c]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-3b9ba24c]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-3b9ba24c]{padding:80px 64px 48px}}.title[data-v-3b9ba24c]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-3b9ba24c]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-3b9ba24c]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-3b9ba24c]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-efb85c77]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-efb85c77]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-efb85c77]{padding:0 64px}}.title[data-v-efb85c77]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-efb85c77]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-efb85c77]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-efb85c77]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-efb85c77]{padding-top:40px}.VPTeamMembersItem[data-v-38cef690]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-38cef690]{padding:32px}.VPTeamMembersItem.small .data[data-v-38cef690]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-38cef690]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-38cef690]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-38cef690]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-38cef690]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-38cef690]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-38cef690]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-38cef690]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-38cef690]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-38cef690]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-38cef690]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-38cef690]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-38cef690]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-38cef690]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-38cef690]{text-align:center}.avatar[data-v-38cef690]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-38cef690]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-38cef690]{margin:0;font-weight:600}.affiliation[data-v-38cef690]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-38cef690]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-38cef690]:hover{color:var(--vp-c-brand-1)}.desc[data-v-38cef690]{margin:0 auto}.desc[data-v-38cef690] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-38cef690]{display:flex;justify-content:center;height:56px}.sp-link[data-v-38cef690]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-38cef690]:hover,.sp .sp-link.link[data-v-38cef690]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-38cef690]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-41c192cb]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-41c192cb]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-41c192cb]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-41c192cb]{max-width:876px}.VPTeamMembers.medium .container[data-v-41c192cb]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-41c192cb]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-41c192cb]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-41c192cb]{max-width:760px}.container[data-v-41c192cb]{display:grid;gap:24px;margin:0 auto;max-width:1152px} diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 0000000..0e11d89 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"api-ex.md":"DOsKaL8H","api_index.md":"CsKClHFh","api_mp_math_angle.md":"9eUTSIe4","api_mp_math_const.md":"Bhz27OPg","api_mp_math_equation.md":"xiyFVY1c","api_mp_math_index.md":"DTIfeUA1","api_mp_math_line.md":"BybnyRUL","api_mp_math_mp_math_typing.md":"DXaadYgy","api_mp_math_plane.md":"Cdj0PlKB","api_mp_math_point.md":"D3f-vzVt","api_mp_math_segment.md":"DIViBThe","api_mp_math_utils.md":"CDwq4icO","api_mp_math_vector.md":"BgK1TmFY","api_particle_index.md":"BqH-w2FR","api_presets_index.md":"CvgR5vOS","api_presets_model_index.md":"D1iZ1qEr","index.md":"CJvRmMfL","md-ex.md":"BX0WqOqv"} diff --git a/index.html b/index.html new file mode 100644 index 0000000..233f2df --- /dev/null +++ b/index.html @@ -0,0 +1,24 @@ + + + + + +This page demonstrates some of the built-in markdown extensions provided by VitePress.
VitePress provides Syntax Highlighting powered by Shiki, with additional features like line-highlighting:
Input
```js{4}
+export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
+```
Output
export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
Input
::: info
+This is an info box.
+:::
+
+::: tip
+This is a tip.
+:::
+
+::: warning
+This is a warning.
+:::
+
+::: danger
+This is a dangerous warning.
+:::
+
+::: details
+This is a details block.
+:::
Output
INFO
This is an info box.
TIP
This is a tip.
WARNING
This is a warning.
DANGER
This is a dangerous warning.
This is a details block.
Check out the documentation for the full list of markdown extensions.