Full Code of hamster1963/HomeDash for AI

main abb6f8e8b9bf cached
54 files
710.4 KB
207.7k tokens
50 symbols
1 requests
Download .txt
Showing preview only (739K chars total). Download the full file or copy to clipboard to get everything.
Repository: hamster1963/HomeDash
Branch: main
Commit: abb6f8e8b9bf
Files: 54
Total size: 710.4 KB

Directory structure:
gitextract_1c6wmyk2/

├── .eslintrc.cjs
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── DeployTo_ghrc_ali.yml
│       └── autoMerge.yml
├── .gitignore
├── .idea/
│   ├── .gitignore
│   ├── hamster-home.iml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── modules.xml
│   └── vcs.xml
├── Dockerfile
├── LICENSE
├── README.md
├── app/
│   ├── home/
│   │   ├── globals.css
│   │   ├── layout.tsx
│   │   ├── main/
│   │   │   ├── components/
│   │   │   │   ├── NewDescription.tsx
│   │   │   │   ├── infoCard.tsx
│   │   │   │   ├── networkChart.tsx
│   │   │   │   ├── networkSummary.tsx
│   │   │   │   ├── proxySummary.tsx
│   │   │   │   └── serverList.tsx
│   │   │   ├── dashboard.tsx
│   │   │   └── page.tsx
│   │   ├── semi.css
│   │   ├── service/
│   │   │   ├── components/
│   │   │   │   ├── homeSummary.tsx
│   │   │   │   ├── paySummary.tsx
│   │   │   │   ├── serviceList.tsx
│   │   │   │   └── serviceSummary.tsx
│   │   │   ├── page.tsx
│   │   │   └── service.tsx
│   │   ├── style.css
│   │   ├── surge/
│   │   │   ├── components/
│   │   │   │   └── surgeCard.tsx
│   │   │   ├── page.tsx
│   │   │   ├── surge.tsx
│   │   │   ├── surgeStatus.tsx
│   │   │   └── surgeTraffic.tsx
│   │   ├── utils/
│   │   │   ├── fixedButton.tsx
│   │   │   ├── functions.tsx
│   │   │   ├── leftSide.tsx
│   │   │   ├── sseContext.tsx
│   │   │   └── sseFetch.tsx
│   │   └── xui/
│   │       ├── components/
│   │       │   ├── xuiDetail.tsx
│   │       │   └── xuiTable.tsx
│   │       ├── page.tsx
│   │       └── xui.tsx
│   ├── layout.tsx
│   └── providers.tsx
├── env.d.ts
├── git-cliff/
│   └── cliff.toml
├── next.config.js
├── package.json
├── tsconfig.json
├── turbo.json
└── vercel.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintrc.cjs
================================================
// eslint-disable-next-line @typescript-eslint/no-var-requires
const path = require('path')

/** @type {import("eslint").Linter.Config} */
const config = {
  overrides: [
    {
      extends: [
        'plugin:@typescript-eslint/recommended-requiring-type-checking',
      ],
      files: ['*.ts', '*.tsx'],
      parserOptions: {
        project: path.join(__dirname, 'tsconfig.json'),
      },
      rules: {
        '@typescript-eslint/no-misused-promises': 'off',
        '@typescript-eslint/no-unsafe-call': 'off',
        '@typescript-eslint/no-unsafe-member-access': 'off',
        '@typescript-eslint/no-unsafe-assignment': 'off',
        '@typescript-eslint/no-explicit-any': 'off',
        '@typescript-eslint/no-unsafe-argument': 'off',
      },
    },
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: path.join(__dirname, 'tsconfig.json'),
  },
  ignorePatterns: ['**/*.md'],
  plugins: [
    'turbo',
    '@typescript-eslint',
    'simple-import-sort',
    'unused-imports',
  ],
  extends: ['next/core-web-vitals', 'plugin:@typescript-eslint/recommended'],
  rules: {
    '@typescript-eslint/consistent-type-imports': [
      'warn',
      {
        prefer: 'type-imports',
        fixStyle: 'inline-type-imports',
      },
    ],
    '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],

    'simple-import-sort/imports': 'error',
    'simple-import-sort/exports': 'warn',
    'unused-imports/no-unused-imports': 'error',
  },
}

module.exports = config


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "npm" # See documentation for possible values
    directory: "/" # Location of package manifests
    schedule:
      interval: "daily"

  - package-ecosystem: "github-actions" # GitHub Actions
    directory: "/"
    schedule:
      interval: "daily"


================================================
FILE: .github/workflows/DeployTo_ghrc_ali.yml
================================================
name: Build and push Docker image

on:
  push:
    tags:
      - 'v*'

jobs:
  changelog:
    name: Generate Changelog
    runs-on: ubuntu-latest
    outputs:
      release_body: ${{ steps.git-cliff.outputs.content }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Generate a changelog
        uses: orhun/git-cliff-action@v3
        id: git-cliff
        with:
          config: git-cliff/cliff.toml
          args: -vv --latest --strip 'footer'
        env:
          OUTPUT: CHANGES.md
      - name: Release
        uses: softprops/action-gh-release@v1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          body: ${{ steps.git-cliff.outputs.content }}
          token: ${{ secrets.GITHUB_TOKEN }}
        env:
          GITHUB_REPOSITORY: ${{ github.repository }}

  build-and-push:
    runs-on: ubuntu-latest
    needs: changelog
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Login to AliYun Container Registry
        uses: docker/login-action@v3
        with:
          registry: registry.cn-guangzhou.aliyuncs.com
          username: ${{ secrets.ALI_USERNAME }}
          password: ${{ secrets.ALI_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: |
            ghcr.io/${{ github.repository }}
            registry.cn-guangzhou.aliyuncs.com/hamster-home/homedash
          tags: |
            type=raw,value=latest
            type=ref,event=tag

      - name: Print environment variables
        run: |
          echo "${{env.GIT_COMMIT_LOG}}"
          echo "${{env.BUILD_TIME}}"
          echo "${{env.CURRENT_VERSION}}"

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          build-args: |
                GIT_TAG=${{env.CURRENT_VERSION}}
                GIT_COMMIT_LOG=${{env.GIT_COMMIT_LOG}}
                BUILD_TIME=${{env.BUILD_TIME}}
                PROD_ENV=${{secrets.PROD_ENV}}
            


================================================
FILE: .github/workflows/autoMerge.yml
================================================
name: Dependabot auto-merge
on: pull_request

permissions:
  contents: write
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v2
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Enable auto-merge for Dependabot PRs
        if: ${{contains(steps.metadata.outputs.dependency-names, 'my-dependency') && steps.metadata.outputs.update-type == 'version-update:semver-patch'}}
        run: gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}


================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env*.local
.env

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts

# turbo
.turbo


================================================
FILE: .idea/.gitignore
================================================
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# GitHub Copilot persisted chat sessions
/copilot/chatSessions


================================================
FILE: .idea/hamster-home.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
  <component name="NewModuleRootManager">
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
      <excludeFolder url="file://$MODULE_DIR$/temp" />
      <excludeFolder url="file://$MODULE_DIR$/tmp" />
      <excludeFolder url="file://$MODULE_DIR$/.idea/copilot/chatSessions" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>

================================================
FILE: .idea/inspectionProfiles/Project_Default.xml
================================================
<component name="InspectionProjectProfileManager">
  <profile version="1.0">
    <option name="myName" value="Project Default" />
    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
  </profile>
</component>

================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/hamster-home.iml" filepath="$PROJECT_DIR$/.idea/hamster-home.iml" />
    </modules>
  </component>
</project>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="" vcs="Git" />
  </component>
</project>

================================================
FILE: Dockerfile
================================================
FROM node:18-alpine AS base

FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app

COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
  if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
  elif [ -f package-lock.json ]; then npm ci; \
  elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
  else echo "Lockfile not found." && exit 1; \
  fi


FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

ARG PROD_ENV=""
# Appends to .env.production
RUN printf "$PROD_ENV" >> .env.production

RUN yarn build


FROM base AS runner
WORKDIR /app

ENV NODE_ENV production
ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder /app/public ./public

COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static



USER nextjs

EXPOSE 3000

ENV PORT 3000
ENV HOSTNAME "0.0.0.0"

CMD ["node", "server.js"]


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 仓鼠

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<div align="center">
<strong>项目因技术栈选择问题已归档,重构中...</strong>
<br>
<strong>新重构 HomeDash 地址: https://dash.buycoffee.top</strong>
    
![screen-shot-new](/.github/new-home.png)
<br>
</div>

<h1 align="center">HomeDash</h1>

<div align="center">
<strong>HomeDash 是一个基于 Next.js 和 Semi-design 的仪表盘</strong>
<br>
<strong>Demo地址: https://home.buycoffee.top</strong>


![screen-shot-one](/.github/CleanShot1.png)
![screen-shot-two](/.github/CleanShot2.png)
</div>

## 一键部署前端
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fhamster1963%2FHomeDash%3Ftab%3Dreadme-ov-file&env=NEXT_PUBLIC_GO_API_BASE_URL&envDescription=%E5%A1%AB%E5%85%A5%E5%90%8E%E7%AB%AF%20API%20%E5%9C%B0%E5%9D%80)

* 在环境变量中填入后端 API 地址
### 文档完善中...

## 后端仓库
[HomeDash-Backend](https://github.com/hamster1963/HomeDash-Backend)

## 本地开发

### 配置文件填入后端地址
    
```bash
cp .env.example .env.local
```

### 安装依赖

```bash
pnpm install
```

### 运行前端

```bash
pnpm dev
```

## 同时也兼容了黑色模式!
![screen-shot-three](/.github/CleanShot3-new.png)
![screen-shot-four](/.github/CleanShot4-new.png)


================================================
FILE: app/home/globals.css
================================================
/* http://meyerweb.com/eric/tools/css/reset/
   v5.0.1 | 20191019
   License: none (public domain)
*/
@import '@/app/home/semi.css';
@import "@/app/home/style.css";

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
main, menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font: inherit;
    vertical-align: baseline;
    /* Disable tap highlights on iOS */
    -webkit-tap-highlight-color: transparent;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, main, menu, nav, section {
    display: block;
}
/* HTML5 hidden-attribute fix for newer browsers */
*[hidden] {
    display: none;
}
body {
    line-height: 1;
    color: var(--semi-color-text-0);
    background-color: var( --semi-color-bg-0);
}
menu, ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: none;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}


================================================
FILE: app/home/layout.tsx
================================================
"use client";
import "./globals.css";

import { Layout } from "@douyinfe/semi-ui";
import React, { useEffect, useState } from "react";

import FixedButton from "@/app/home/utils/fixedButton";
import LeftSide from "@/app/home/utils/leftSide";
import { useSSEContext } from "@/app/home/utils/sseContext";

export default function DashboardLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  const { Sider, Content } = Layout;

  // 从 SSEContext 中获取侧边栏状态及其 setter 函数
  const { isNavCollapsed } = useSSEContext();

  // 避免页面初始化时侧边栏闪烁的问题
  const [mounted, setMounted] = useState(false);
  useEffect(() => {
    setMounted(true);
  }, []);
  if (!mounted) {
    return null;
  }

  return (
    <Layout>
      <Sider
        style={{
          marginRight: isNavCollapsed ? "60px" : "220px",
        }}
      >
        <LeftSide />
      </Sider>
      <Layout>
        <Content>{children}</Content>
      </Layout>
      <FixedButton />
    </Layout>
  );
}


================================================
FILE: app/home/main/components/NewDescription.tsx
================================================
import { Typography } from "@douyinfe/semi-ui";
import React from "react";

type NewDescriptionProps = {
  keyString: string;
  value: React.ReactNode;
  style?: React.CSSProperties;
};

export default function NewDescription({
  keyString,
  value,
  style,
}: NewDescriptionProps) {
  const { Text, Title } = Typography;
  return (
    <div
      style={{
        gap: "3px",
        display: "flex",
        flexDirection: "column",
        justifyContent: "center",
        ...style, // This is the style prop that is passed in from the parent component
      }}
    >
      <Text type="tertiary">{keyString}</Text>
      <Title heading={4}>{value}</Title>
    </div>
  );
}


================================================
FILE: app/home/main/components/infoCard.tsx
================================================
import {
  IconBolt,
  IconBrackets,
  IconCalendarClock,
  IconConnectionPoint2,
  IconGithubLogo,
  IconGlobeStroke,
  IconUser,
} from "@douyinfe/semi-icons";
import { Card, Progress, Typography } from "@douyinfe/semi-ui";
import React from "react";
import { z } from "zod";

import { SSEDataFetch } from "@/app/home/utils/sseFetch";

type InfoCardProps = {
  backgroundColor: string;
  backgroundFillColor: string;
  icon: React.ReactNode;
  title: string;
  moreIcon: React.ReactNode;
  moreInfo: string;
  value: number;
  unit: string;
  name: string;
  total: number;
};

export function InfoCard(props: InfoCardProps) {
  const { Title } = Typography;
  // 计算进度百分比
  const progressPercent =
    props.value !== 0 ? Math.round((props.value / props.total) * 100) : 0;
  // 使用线性渐变设置背景色
  // 可以根据需要更改颜色
  const backgroundColor = `linear-gradient(90deg, ${props.backgroundFillColor} ${progressPercent}%, ${props.backgroundColor} ${progressPercent}%)`;
  return (
    <Card
      style={{
        flex: "1",
        minWidth: "220px",
        margin: "10px",
        borderRadius: "10px",
        border: "none",
        // backgroundColor: props.backgroundColor,
        backgroundImage: backgroundColor,
      }}
    >
      <div
        style={{
          display: "flex",
          flexDirection: "column",
          justifyContent: "start",
        }}
      >
        <div
          style={{
            display: "flex",
            justifyContent: "space-between",
            alignItems: "center",
          }}
        >
          <div
            style={{
              display: "flex",
              justifyContent: "start",
              alignItems: "center",
            }}
          >
            {props.icon}
            <Title
              heading={6}
              style={{
                marginLeft: "5px",
              }}
            >
              {props.title}
            </Title>
          </div>
          <div
            style={{
              display: "flex",
              justifyContent: "start",
              alignItems: "center",
            }}
          >
            <div
              style={{
                marginRight: "5px",
                fontWeight: "bold",
                fontSize: "0.8rem",
              }}
            >
              {props.moreInfo}
            </div>
            {props.moreIcon}
          </div>
        </div>
        <div
          style={{
            display: "flex",
            justifyContent: "start",
            alignItems: "baseline",
          }}
        >
          <Title
            style={{
              marginTop: "15px",
              marginBottom: "10px",
            }}
            heading={1}
          >
            {props.value.toFixed(2)}
          </Title>
          <Title
            style={{
              marginLeft: "3px",
              fontWeight: "lighter",
            }}
            heading={6}
          >
            {props.unit}
          </Title>
        </div>
        <div
          style={{
            display: "flex",
            justifyContent: "space-between",
            alignItems: "baseline",
          }}
        >
          <div
            style={{
              fontWeight: "bold",
            }}
          >
            {props.name}
          </div>
          <div
            style={{
              marginTop: "10px",
              fontWeight: "bold",
            }}
          >
            {props.value.toFixed(2)}/{props.total}
          </div>
        </div>
        <Progress
          stroke={"rgba(var(--semi-grey-9), 1)"}
          orbitStroke={"rgba(var(--semi-grey-2), 0.5)"}
          style={{
            height: "4px",
          }}
          percent={
            props.value !== 0
              ? Math.round((props.value / props.total) * 100)
              : 0
          }
          aria-label={props.name}
        />
      </div>
    </Card>
  );
}

const CoffeeInfoSchema = z.object({
  usedBound: z.string(),
  remainBound: z.string(),
  planBound: z.string(),
  resetDay: z.string(),
});

const XuiInfoSchema = z.object({
  user_count: z.number(),
  up_total: z.number(),
  down_total: z.number(),
});

const GitHubInfoSchema = z.object({
  included_minutes: z.number(),
  next_bill_day: z.number(),
  total_minutes_used: z.number(),
});

const BoceCountSchema = z.object({
  boce_count: z.number(),
});

export default function InfoCardList() {
  const coffeeGetData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetNetworkDataSSE",
  );
  const coffeeValidation = CoffeeInfoSchema.safeParse(
    coffeeGetData?.coffeeInfo,
  );
  const xuiGetData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetXuiDataSSE",
  );
  const xuiValidation = XuiInfoSchema.safeParse(xuiGetData?.xuiData);

  const githubGetData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetGitHubActionDataSSE",
  );
  const githubValidation = GitHubInfoSchema.safeParse(
    githubGetData?.GitHubActionData,
  );
  const boceCountData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetBoceCountSSE",
  );
  const boceCountValidation = BoceCountSchema.safeParse(boceCountData);

  return (
    <>
      <InfoCard
        backgroundColor={"rgba(var(--semi-light-blue-3), 0.1)"}
        backgroundFillColor={"rgba(var(--semi-light-blue-3), 0.3)"}
        icon={<IconGlobeStroke />}
        title={"代理服务"}
        moreIcon={<IconCalendarClock />}
        value={
          coffeeValidation.success ? Number(coffeeValidation.data.usedBound) : 0
        }
        unit={"GB"}
        name={"CoffeeCloud"}
        total={
          coffeeValidation.success ? Number(coffeeValidation.data.planBound) : 0
        }
        moreInfo={
          "重置: " +
          (coffeeValidation.success ? coffeeValidation.data.resetDay : 0) +
          "天"
        }
      />
      <InfoCard
        backgroundColor={"rgba(var(--semi-light-green-3), 0.1)"}
        backgroundFillColor={"rgba(var(--semi-light-green-3), 0.3)"}
        icon={<IconConnectionPoint2 />}
        title={"x-ui 面板"}
        moreIcon={<IconUser />}
        value={
          xuiValidation.success
            ? xuiValidation.data.down_total + xuiValidation.data.up_total
            : 0
        }
        unit={"GB"}
        name={"已用流量"}
        total={xuiValidation.success ? 1000 : 0}
        moreInfo={
          "用户数: " +
          (xuiValidation.success ? xuiValidation.data.user_count : 0)
        }
      />
      <InfoCard
        backgroundColor={"rgba(var(--semi-cyan-3), 0.1)"}
        backgroundFillColor={"rgba(var(--semi-cyan-3), 0.3)"}
        icon={<IconGithubLogo />}
        title={"Actions"}
        moreIcon={<IconCalendarClock />}
        value={
          githubValidation.success
            ? githubValidation.data.total_minutes_used
            : 0
        }
        unit={"Minute"}
        name={"已用构建时间"}
        total={
          githubValidation.success ? githubValidation.data.included_minutes : 0
        }
        moreInfo={
          "重置: " +
          (githubValidation.success ? githubValidation.data.next_bill_day : 0) +
          "天"
        }
      />
      <InfoCard
        backgroundColor={"rgba(var(--semi-violet-3),0.1)"}
        backgroundFillColor={"rgba(var(--semi-violet-3),0.3)"}
        icon={<IconBrackets />}
        title={"拨测总数"}
        moreIcon={<IconBolt />}
        value={
          boceCountValidation.success ? boceCountValidation.data.boce_count : 0
        }
        unit={"Count"}
        name={"任务数"}
        total={boceCountValidation.success ? 10000 : 0}
        moreInfo={"拨测服务"}
      />
    </>
  );
}


================================================
FILE: app/home/main/components/networkChart.tsx
================================================
import React from "react";
import { Area, AreaChart, ResponsiveContainer, YAxis } from "recharts";

type NetworkChartProps = {
  data: any;
  keyString: string;
  colorToken: string;
};

export default function NetworkChart({
  data,
  keyString,
  colorToken,
}: NetworkChartProps) {
  const backgroundColor = `rgba(var(--semi-${colorToken}-0), 1)`;
  const strokeColor = `rgba(var(--semi-${colorToken}-5), 1)`;
  const fill = `url(#${colorToken})`;
  return (
    <div
      style={{
        margin: "10px",
      }}
    >
      <div
        style={{
          width: "100%",
          height: "100px",
          backgroundColor: backgroundColor,
          borderRadius: "10px",
        }}
      >
        <ResponsiveContainer width="100%" height="100%">
          <AreaChart
            data={data}
            margin={{ top: 10, right: -10, left: -10, bottom: 6 }}
          >
            <defs>
              <linearGradient id={colorToken} x1="0" y1="0" x2="0" y2="1">
                <stop offset="5%" stopColor={strokeColor} stopOpacity={0.6} />
                <stop offset="100%" stopColor={strokeColor} stopOpacity={0} />
              </linearGradient>
            </defs>
            <YAxis domain={[0, "dataMax + 1"]} hide={true} />
            {/*<Tooltip />*/}
            <Area
              type="linear"
              dataKey={keyString?.toString()}
              stroke={strokeColor}
              isAnimationActive={false}
              fillOpacity={1}
              fill={fill}
            />
          </AreaChart>
        </ResponsiveContainer>
      </div>
    </div>
  );
}


================================================
FILE: app/home/main/components/networkSummary.tsx
================================================
import { Skeleton } from "@douyinfe/semi-ui";
import React, { useEffect } from "react";
import { z } from "zod";

import NetworkChart from "@/app/home/main/components/networkChart";
import NewDescription from "@/app/home/main/components/NewDescription";
import { useSSEContext } from "@/app/home/utils/sseContext";
import { SSEDataFetch } from "@/app/home/utils/sseFetch";

const NetworkInfoSchema = z.object({
  deviceCount: z.number(),
  rxSpeedMbps: z.number(),
  txSpeedMbps: z.number(),
})

const AdGuardInfoSchema = z.object({
  AvgProcessingTime: z.number(),
  NumBlockedFiltering: z.number(),
  NumDnsQueries: z.number(),
});

export default function NetworkSummary() {
  const networkGetData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetNetworkDataSSE",
  );
  const networkValidation = NetworkInfoSchema.safeParse(
    networkGetData?.homeNetwork,
  );
  const adguardGetData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetAdGuardInfoSSE",
  );
  const adguardValidation = AdGuardInfoSchema.safeParse(
    adguardGetData?.adGuardInfo,
  );

  const { setSSEConnect, HomeNetworkSpeedList, setHomeNetworkSpeedList } =
    useSSEContext();

  useEffect(() => {
    if (networkValidation.success) {
      // 获取当前的速度列表
      const currentList = [...HomeNetworkSpeedList];

      // 添加新的速度数据到列表中
      currentList.push({
        speed: Number(
          networkValidation.data.rxSpeedMbps +
          networkValidation.data.txSpeedMbps,
        ),
      });

      // 如果长度大于10,删除第一个元素
      if (currentList.length > 10) {
        currentList.shift();
      }

      // 更新速度列表
      setHomeNetworkSpeedList(currentList);
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [networkGetData]);

  useEffect(() => {
    if (networkValidation.success) {
      setSSEConnect(true);
    } else {
      setSSEConnect(false);
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [networkGetData]);

  const placeholder = (
    <div>
      <Skeleton.Title style={{ width: 50 }} />
    </div>
  );

  return (
    <>
      <div
        className={"newDescription"}
        style={{
          gap: "20px",
          display: "flex",
          marginLeft: "10px",
          marginRight: "10px",
          flexWrap: "wrap",
        }}
      >
        <NewDescription
          keyString={"设备数"}
          value={
            networkValidation.success ? (
              networkValidation.data.deviceCount
            ) : (
              <Skeleton
                placeholder={placeholder}
                loading={true}
                active
              ></Skeleton>
            )
          }
        />
        <NewDescription
          style={{
            width: "105px",
            overflow: "hidden",
          }}
          keyString={"上传速率"}
          value={
            networkValidation.success ? (
              networkValidation.data.txSpeedMbps + "mb/s"
            ) : (
              <Skeleton
                placeholder={placeholder}
                loading={true}
                active
              ></Skeleton>
            )
          }
        />
        <NewDescription
          style={{
            width: "105px",
            overflow: "hidden",
          }}
          keyString={"下载速率"}
          value={
            networkValidation.success ? (
              networkValidation.data.rxSpeedMbps + "mb/s"
            ) : (
              <Skeleton
                placeholder={placeholder}
                loading={true}
                active
              ></Skeleton>
            )
          }
        />
        <section
          style={{
            columnGap: "20px",
            display: "flex",
          }}
        >
          <NewDescription
            keyString={"DNS查询数"}
            value={
              adguardValidation.success ? (
                adguardValidation.data.NumDnsQueries
              ) : (
                <Skeleton
                  placeholder={placeholder}
                  loading={true}
                  active
                ></Skeleton>
              )
            }
          />
          <NewDescription
            keyString={"拦截数"}
            value={
              adguardValidation.success ? (
                adguardValidation.data.NumBlockedFiltering
              ) : (
                <Skeleton
                  placeholder={placeholder}
                  loading={true}
                  active
                ></Skeleton>
              )
            }
          />
          <NewDescription
            keyString={"处理时间"}
            value={
              adguardValidation.success ? (
                adguardValidation.data.AvgProcessingTime + "ms"
              ) : (
                <Skeleton
                  placeholder={placeholder}
                  loading={true}
                  active
                ></Skeleton>
              )
            }
          />
        </section>
      </div>
      <NetworkChart
        data={HomeNetworkSpeedList}
        keyString={"speed"}
        colorToken={"blue"}
      />
    </>
  );
}


================================================
FILE: app/home/main/components/proxySummary.tsx
================================================
import { Skeleton, Typography } from "@douyinfe/semi-ui";
import React, { useEffect } from "react";
import { z } from "zod";

import NetworkChart from "@/app/home/main/components/networkChart";
import NewDescription from "@/app/home/main/components/NewDescription";
import { useSSEContext } from "@/app/home/utils/sseContext";
import { SSEDataFetch } from "@/app/home/utils/sseFetch";

const proxyInfoSchema = z.object({
  rxSpeedMbps: z.number(),
  txSpeedMbps: z.number(),
});

const nodeInfoSchema = z.object({
  nodeName: z.string(),
  nodeLatency: z.string(),
});

export default function ProxySummary() {
  const { Title } = Typography;
  const proxyGetData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetNetworkDataSSE",
  );
  const proxyValidation = proxyInfoSchema.safeParse(proxyGetData?.proxyNetwork);
  const nodeValidation = nodeInfoSchema.safeParse(proxyGetData?.nodeInfo);

  const { ProxyNetworkSpeedList, setProxyNetworkSpeedList } = useSSEContext();

  useEffect(() => {
    if (proxyValidation.success) {
      // 获取当前的速度列表
      const currentList = [...ProxyNetworkSpeedList];

      // 添加新的速度数据到列表中
      currentList.push({
        speed: Number(
          proxyValidation.data.rxSpeedMbps + proxyValidation.data.txSpeedMbps,
        ),
      });

      // 如果长度大于10,删除第一个元素
      if (currentList.length > 10) {
        currentList.shift();
      }

      // 更新速度列表
      setProxyNetworkSpeedList(currentList);
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [proxyGetData]);

  const placeholder = (
    <div>
      <Skeleton.Title style={{ width: 50 }} />
    </div>
  );
  return (
    <>
      <div
        className={"newDescription"}
        style={{
          gap: "20px",
          display: "flex",
          marginLeft: "10px",
          marginRight: "10px",
          flexWrap: "wrap",
        }}
      >
        <NewDescription
          keyString={"当前节点"}
          value={
            nodeValidation.success ? (
              <Title heading={5}>
                {nodeValidation.data.nodeName.slice(1, -1)}
              </Title>
            ) : (
              <Skeleton
                placeholder={placeholder}
                loading={true}
                active
              ></Skeleton>
            )
          }
        />
        <NewDescription
          keyString={"延迟"}
          value={
            nodeValidation.success ? (
              nodeValidation.data.nodeLatency + "ms"
            ) : (
              <Skeleton
                placeholder={placeholder}
                loading={true}
                active
              ></Skeleton>
            )
          }
        />
        <NewDescription
          style={{
            width: "105px",
            overflow: "hidden",
          }}
          keyString={"上传速率"}
          value={
            proxyValidation.success ? (
              proxyValidation.data.txSpeedMbps + "mb/s"
            ) : (
              <Skeleton
                placeholder={placeholder}
                loading={true}
                active
              ></Skeleton>
            )
          }
        />
        <NewDescription
          style={{
            width: "105px",
            overflow: "hidden",
          }}
          keyString={"下载速率"}
          value={
            proxyValidation.success ? (
              proxyValidation.data.rxSpeedMbps + "mb/s"
            ) : (
              <Skeleton
                placeholder={placeholder}
                loading={true}
                active
              ></Skeleton>
            )
          }
        />
      </div>

      <NetworkChart
        data={ProxyNetworkSpeedList}
        keyString={"speed"}
        colorToken={"purple"}
      />
    </>
  );
}


================================================
FILE: app/home/main/components/serverList.tsx
================================================
import { Progress, Skeleton } from "@douyinfe/semi-ui";
import React from "react";

import NewDescription from "@/app/home/main/components/NewDescription";
import { SSEDataFetch } from "@/app/home/utils/sseFetch";

type ServerCardProps = {
  id: number;
  name: string;
  status: string;
  cpu: number;
  memory: number;
  disk: number;
  uptime: number;
  up: number;
  down: number;
};

const placeholder = (
  <div>
    <Skeleton.Title style={{ width: 50 }} />
  </div>
);

export function ServerCard(props: ServerCardProps) {
  return (
    <>
      <div>
        <div
          className={"serverDescription"}
          style={{
            display: "flex",
            flexWrap: "wrap",
          }}
        >
          <NewDescription
            style={{
              minWidth: "200px",
            }}
            keyString={"服务器"}
            value={props.name}
          />
          <section
            style={{
              display: "flex",
              flexWrap: "wrap",
              columnGap: "40px",
            }}
          >
            <NewDescription
              keyString={"在线状态"}
              value={
                <div
                  style={{
                    color:
                      props.status === "online"
                        ? "rgba(var(--semi-green-6), 1)"
                        : "rgba(var(--semi-red-6), 1)",
                  }}
                >
                  {props.status}
                </div>
              }
            />
            <NewDescription
              style={{
                width: "110px",
                overflow: "hidden",
              }}
              keyString={"CPU占用"}
              value={
                props.status === "online" ? (
                  <div
                    style={{
                      display: "flex",
                      alignItems: "center",
                    }}
                  >
                    <Progress
                      style={{
                        marginRight: "4px",
                      }}
                      stroke={
                        props.cpu > 80
                          ? "rgba(var(--semi-red-5), 1)"
                          : props.cpu > 50
                            ? "rgba(var(--semi-orange-5), 1)"
                            : "rgba(var(--semi-green-5), 1)"
                      }
                      percent={props.cpu}
                      type="circle"
                      size="small"
                    />
                    {props.cpu}%
                  </div>
                ) : (
                  <Skeleton
                    placeholder={placeholder}
                    loading={true}
                    active
                  ></Skeleton>
                )
              }
            />
            <NewDescription
              style={{
                width: "110px",
                overflow: "hidden",
              }}
              keyString={"内存占用"}
              value={
                props.status === "online" ? (
                  <div
                    style={{
                      display: "flex",
                      alignItems: "center",
                    }}
                  >
                    <Progress
                      style={{
                        marginRight: "4px",
                      }}
                      stroke={
                        props.memory > 80
                          ? "rgba(var(--semi-red-5), 1)"
                          : props.memory > 50
                            ? "rgba(var(--semi-orange-5), 1)"
                            : "rgba(var(--semi-green-5), 1)"
                      }
                      percent={props.memory}
                      type="circle"
                      size="small"
                    />
                    {props.memory}%
                  </div>
                ) : (
                  <Skeleton
                    placeholder={placeholder}
                    loading={true}
                    active
                  ></Skeleton>
                )
              }
            />
            <NewDescription
              style={{
                width: "110px",
                overflow: "hidden",
              }}
              keyString={"存储占用"}
              value={
                props.status === "online" ? (
                  <div
                    style={{
                      display: "flex",
                      alignItems: "center",
                    }}
                  >
                    <Progress
                      style={{
                        marginRight: "4px",
                      }}
                      stroke={
                        props.disk > 80
                          ? "rgba(var(--semi-red-5), 1)"
                          : props.disk > 50
                            ? "rgba(var(--semi-orange-5), 1)"
                            : "rgba(var(--semi-green-5), 1)"
                      }
                      percent={props.disk}
                      type="circle"
                      size="small"
                    />
                    {props.disk}%
                  </div>
                ) : (
                  <Skeleton
                    placeholder={placeholder}
                    loading={true}
                    active
                  ></Skeleton>
                )
              }
            />
            <NewDescription
              style={{
                width: "110px",
                overflow: "hidden",
              }}
              keyString={"上传"}
              value={
                props.status === "online" ? (
                  props.up.toFixed(2) + "mb/s"
                ) : (
                  <Skeleton
                    placeholder={placeholder}
                    loading={true}
                    active
                  ></Skeleton>
                )
              }
            />
            <NewDescription
              style={{
                width: "110px",
                overflow: "hidden",
              }}
              keyString={"下载"}
              value={
                props.status === "online" ? (
                  props.down.toFixed(2) + "mb/s"
                ) : (
                  <Skeleton
                    placeholder={placeholder}
                    loading={true}
                    active
                  ></Skeleton>
                )
              }
            />
            <NewDescription
              keyString={"在线天数"}
              value={
                props.status === "online" ? (
                  props.uptime.toFixed(0) + "天"
                ) : (
                  <Skeleton
                    placeholder={placeholder}
                    loading={true}
                    active
                  ></Skeleton>
                )
              }
            />
          </section>
        </div>
      </div>
    </>
  );
}

export default function Server() {
  const serverGetData = SSEDataFetch(
    process.env.NEXT_PUBLIC_GO_API_BASE_URL + "/GetNetworkDataSSE",
  );
  return (
    <div
      style={{
        marginBottom: "20px",
      }}
    >
      {serverGetData ? (
        serverGetData?.serverInfo.map((server: ServerCardProps) => (
          <ServerCard
            key={server.id}
            id={server.id}
            name={server.name}
            status={server.status}
            cpu={server.cpu}
            memory={server.memory}
            disk={server.disk}
            uptime={server.uptime}
            up={server.up}
            down={server.down}
          />
        ))
      ) : (
        <ServerCard
          key={"server.id"}
          id={0}
          name={"加载中"}
          status={"加载中"}
          cpu={0}
          memory={0}
          disk={0}
          uptime={0}
          up={0}
          down={0}
        />
      )}
    </div>
  );
}


================================================
FILE: app/home/main/dashboard.tsx
================================================
"use client";
import {
  IconGithubLogo,
  IconTickCircle,
  IconUploadError,
} from "@douyinfe/semi-icons";
import { Tag, Typography } from "@douyinfe/semi-ui";
import { useTheme } from "next-themes";
import React from "react";

import InfoCardList from "@/app/home/main/components/infoCard";
import NetworkSummary from "@/app/home/main/components/networkSummary";
import ProxySummary from "@/app/home/main/components/proxySummary";
import Server from "@/app/home/main/components/serverList";
import { useSSEContext } from "@/app/home/utils/sseContext";

export default function MainContent() {
  const { Title, Text } = Typography;
  const { SSEConnect } = useSSEContext();
  const { resolvedTheme } = useTheme();

  return (
    <>
      <Title
        heading={2}
        style={{
          marginTop: "30px",
          marginLeft: "30px",
          marginBottom: "20px",
        }}
      >
        <div
          style={{
            display: "flex",
            flexWrap: "wrap",
            justifyContent: "flex-start",
            alignItems: "baseline",
          }}
        >
          👋 你好, 欢迎来到 HomeDash
          {SSEConnect ? (
            <Tag
              type={"light"}
              color="green"
              prefixIcon={<IconTickCircle />}
              size="large"
              shape="circle"
              style={{
                marginLeft: "5px",
                pointerEvents: "none",
              }}
            >
              SSE 已连接
            </Tag>
          ) : (
            <Tag
              type={"light"}
              color="red"
              prefixIcon={<IconUploadError />}
              size="large"
              shape="circle"
              style={{
                marginLeft: "5px",
                pointerEvents: "none",
              }}
            >
              SSE 未连接
            </Tag>
          )}
          <Tag
            color="grey"
            prefixIcon={<IconGithubLogo />}
            size="large"
            shape="circle"
            onClick={() => {
              window.open("https://github.com/hamster1963/HomeDash");
            }}
            style={{
              marginLeft: "5px",
              cursor: "pointer",
            }}
          >
            GitHub
          </Tag>
        </div>
      </Title>
      <div
        style={{
          display: "flex",
          flexWrap: "wrap",
          justifyContent: "space-between",
          alignItems: "center",
          marginLeft: "20px",
        }}
      >
        <div
          style={{
            paddingTop: "10px",
            border: "1px solid rgba(var(--semi-grey-1), 1)",
            borderRadius: "15px",
            minWidth: "220px",
            marginRight: "20px",
            marginBottom: "10px",
            flex: 1,
          }}
        >
          <section
            style={{
              display: "flex",
              justifyContent: "space-between",
              alignItems: "start",
              flexWrap: "wrap",
              marginLeft: "20px",
              marginRight: "20px",
            }}
          >
            <Title heading={3}>家庭网络</Title>
            <picture>
              <img
                src={
                  resolvedTheme === "light"
                    ? "/AdguardHome.png"
                    : "/AdguardHome-dark.png"
                }
                width={"130px"}
                alt={"AdGuardHome"}
              />
            </picture>
          </section>

          <NetworkSummary />
        </div>

        <div
          style={{
            paddingTop: "10px",
            border: "1px solid rgba(var(--semi-grey-1), 1)",
            borderRadius: "15px",
            flex: 1,
            marginRight: "20px",
            marginBottom: "10px",
            minWidth: "220px",
          }}
        >
          <section
            style={{
              display: "flex",
              justifyContent: "space-between",
              alignItems: "start",
              flexWrap: "wrap",
              marginLeft: "20px",
              marginRight: "20px",
            }}
          >
            <Title heading={3}>科学上网</Title>
            <div
              style={{
                display: "flex",
                justifyContent: "space-between",
                alignItems: "center",
              }}
            >
              <picture>
                <img
                  src={
                    resolvedTheme === "light"
                      ? "/kuromi.png"
                      : "/kuromi-dark.png"
                  }
                  width={"110px"}
                  alt={"kuromi"}
                />
              </picture>
              <Text
                strong
                style={{
                  marginLeft: "5px",
                  marginRight: "5px",
                }}
              >
                &
              </Text>
              <picture>
                <img
                  src={
                    resolvedTheme === "light"
                      ? "/coffee.png"
                      : "/coffee-dark.png"
                  }
                  width={"60px"}
                  alt={"coffee"}
                />
              </picture>
            </div>
          </section>
          <ProxySummary />
        </div>
      </div>
      <div
        style={{
          display: "flex",
          flexWrap: "wrap",
          justifyContent: "space-between",
          alignItems: "center",
          marginLeft: "10px",
          marginRight: "10px",
        }}
      >
        <InfoCardList />
      </div>
      <Title
        heading={3}
        style={{
          marginLeft: "30px",
          marginBottom: "10px",
        }}
      >
        系统状态
      </Title>
      <Server />
    </>
  );
}


================================================
FILE: app/home/main/page.tsx
================================================
import MainContent from "@/app/home/main/dashboard";

export const metadata = {
  title: "概览 | HomeDash",
};

export default function DashboardPage() {
  return <MainContent />;
}


================================================
FILE: app/home/semi.css
================================================
/* shadow */
/* sizing */
/* spacing */
body,
body .semi-always-light {
  --semi-amber-0: 254,251,235;
  --semi-amber-1: 252,245,206;
  --semi-amber-2: 249,232,158;
  --semi-amber-3: 246,216,111;
  --semi-amber-4: 243,198,65;
  --semi-amber-5: 240,177,20;
  --semi-amber-6: 200,138,15;
  --semi-amber-7: 160,102,10;
  --semi-amber-8: 120,70,6;
  --semi-amber-9: 80,43,3;
  --semi-black: 0,0,0;
  --semi-blue-0: 234,245,255;
  --semi-blue-1: 203,231,254;
  --semi-blue-2: 152,205,253;
  --semi-blue-3: 101,178,252;
  --semi-blue-4: 50,149,251;
  --semi-blue-5: 0,100,250;
  --semi-blue-6: 0,98,214;
  --semi-blue-7: 0,79,179;
  --semi-blue-8: 0,61,143;
  --semi-blue-9: 0,44,107;
  --semi-cyan-0: 229,247,248;
  --semi-cyan-1: 194,239,240;
  --semi-cyan-2: 138,221,226;
  --semi-cyan-3: 88,203,211;
  --semi-cyan-4: 44,184,197;
  --semi-cyan-5: 5,164,182;
  --semi-cyan-6: 3,134,152;
  --semi-cyan-7: 1,105,121;
  --semi-cyan-8: 0,77,91;
  --semi-cyan-9: 0,50,61;
  --semi-green-0: 236,247,236;
  --semi-green-1: 208,240,209;
  --semi-green-2: 164,224,167;
  --semi-green-3: 125,209,130;
  --semi-green-4: 90,194,98;
  --semi-green-5: 59,179,70;
  --semi-green-6: 48,149,59;
  --semi-green-7: 37,119,47;
  --semi-green-8: 27,89,36;
  --semi-green-9: 17,60,24;
  --semi-grey-0: 249,249,249;
  --semi-grey-1: 230,232,234;
  --semi-grey-2: 198,202,205;
  --semi-grey-3: 167,171,176;
  --semi-grey-4: 136,141,146;
  --semi-grey-5: 107,112,117;
  --semi-grey-6: 85,91,97;
  --semi-grey-7: 65,70,76;
  --semi-grey-8: 46,50,56;
  --semi-grey-9: 28,31,35;
  --semi-indigo-0: 236,239,248;
  --semi-indigo-1: 209,216,240;
  --semi-indigo-2: 167,179,225;
  --semi-indigo-3: 128,144,211;
  --semi-indigo-4: 94,111,196;
  --semi-indigo-5: 63,81,181;
  --semi-indigo-6: 51,66,161;
  --semi-indigo-7: 40,52,140;
  --semi-indigo-8: 31,40,120;
  --semi-indigo-9: 23,29,99;
  --semi-light-blue-0: 233,247,253;
  --semi-light-blue-1: 201,236,252;
  --semi-light-blue-2: 149,216,248;
  --semi-light-blue-3: 98,195,245;
  --semi-light-blue-4: 48,172,241;
  --semi-light-blue-5: 0,149,238;
  --semi-light-blue-6: 0,123,202;
  --semi-light-blue-7: 0,99,167;
  --semi-light-blue-8: 0,75,131;
  --semi-light-blue-9: 0,53,95;
  --semi-light-green-0: 243,248,236;
  --semi-light-green-1: 227,240,208;
  --semi-light-green-2: 200,226,165;
  --semi-light-green-3: 173,211,126;
  --semi-light-green-4: 147,197,91;
  --semi-light-green-5: 123,182,60;
  --semi-light-green-6: 100,152,48;
  --semi-light-green-7: 78,121,38;
  --semi-light-green-8: 57,91,27;
  --semi-light-green-9: 37,61,18;
  --semi-lime-0: 242,250,230;
  --semi-lime-1: 227,246,197;
  --semi-lime-2: 203,237,142;
  --semi-lime-3: 183,227,91;
  --semi-lime-4: 167,218,44;
  --semi-lime-5: 155,209,0;
  --semi-lime-6: 126,174,0;
  --semi-lime-7: 99,139,0;
  --semi-lime-8: 72,104,0;
  --semi-lime-9: 47,70,0;
  --semi-orange-0: 255,248,234;
  --semi-orange-1: 254,238,204;
  --semi-orange-2: 254,217,152;
  --semi-orange-3: 253,193,101;
  --semi-orange-4: 253,166,51;
  --semi-orange-5: 252,136,0;
  --semi-orange-6: 210,103,0;
  --semi-orange-7: 168,74,0;
  --semi-orange-8: 126,49,0;
  --semi-orange-9: 84,29,0;
  --semi-pink-0: 253,236,239;
  --semi-pink-1: 251,207,216;
  --semi-pink-2: 246,160,181;
  --semi-pink-3: 242,115,150;
  --semi-pink-4: 237,72,123;
  --semi-pink-5: 233,30,99;
  --semi-pink-6: 197,19,86;
  --semi-pink-7: 162,11,72;
  --semi-pink-8: 126,5,58;
  --semi-pink-9: 90,1,43;
  --semi-purple-0: 247,233,247;
  --semi-purple-1: 239,202,240;
  --semi-purple-2: 221,155,224;
  --semi-purple-3: 201,111,209;
  --semi-purple-4: 180,73,194;
  --semi-purple-5: 158,40,179;
  --semi-purple-6: 135,30,158;
  --semi-purple-7: 113,22,138;
  --semi-purple-8: 92,15,117;
  --semi-purple-9: 73,10,97;
  --semi-red-0: 254,242,237;
  --semi-red-1: 254,221,210;
  --semi-red-2: 253,183,165;
  --semi-red-3: 251,144,120;
  --semi-red-4: 250,102,76;
  --semi-red-5: 249,57,32;
  --semi-red-6: 213,37,21;
  --semi-red-7: 178,20,12;
  --semi-red-8: 142,8,5;
  --semi-red-9: 106,1,3;
  --semi-teal-0: 228,247,244;
  --semi-teal-1: 192,240,232;
  --semi-teal-2: 135,224,211;
  --semi-teal-3: 84,209,193;
  --semi-teal-4: 39,194,176;
  --semi-teal-5: 0,179,161;
  --semi-teal-6: 0,149,137;
  --semi-teal-7: 0,119,111;
  --semi-teal-8: 0,89,85;
  --semi-teal-9: 0,60,58;
  --semi-violet-0: 243,237,249;
  --semi-violet-1: 226,209,244;
  --semi-violet-2: 196,167,233;
  --semi-violet-3: 166,127,221;
  --semi-violet-4: 136,91,210;
  --semi-violet-5: 106,58,199;
  --semi-violet-6: 87,47,179;
  --semi-violet-7: 70,37,158;
  --semi-violet-8: 54,28,138;
  --semi-violet-9: 40,20,117;
  --semi-white: 255,255,255;
  --semi-yellow-0: 255,253,234;
  --semi-yellow-1: 254,251,203;
  --semi-yellow-2: 253,243,152;
  --semi-yellow-3: 252,232,101;
  --semi-yellow-4: 251,218,50;
  --semi-yellow-5: 250,200,0;
  --semi-yellow-6: 208,170,0;
  --semi-yellow-7: 167,139,0;
  --semi-yellow-8: 125,106,0;
  --semi-yellow-9: 83,72,0;
}

html[theme-mode=dark] body,
body .semi-always-dark {
  --semi-red-0: 108,9,11;
  --semi-red-1: 144,17,16;
  --semi-red-2: 180,32,25;
  --semi-red-3: 215,51,36;
  --semi-red-4: 251,73,50;
  --semi-red-5: 252,114,90;
  --semi-red-6: 253,153,131;
  --semi-red-7: 253,190,172;
  --semi-red-8: 254,224,213;
  --semi-red-9: 255,243,239;
  --semi-pink-0: 92,7,48;
  --semi-pink-1: 128,14,65;
  --semi-pink-2: 164,23,81;
  --semi-pink-3: 199,34,97;
  --semi-pink-4: 235,47,113;
  --semi-pink-5: 239,86,134;
  --semi-pink-6: 243,126,159;
  --semi-pink-7: 247,168,188;
  --semi-pink-8: 251,211,220;
  --semi-pink-9: 253,238,241;
  --semi-purple-0: 74,16,97;
  --semi-purple-1: 94,23,118;
  --semi-purple-2: 115,31,138;
  --semi-purple-3: 137,40,159;
  --semi-purple-4: 160,51,179;
  --semi-purple-5: 181,83,194;
  --semi-purple-6: 202,120,209;
  --semi-purple-7: 221,160,225;
  --semi-purple-8: 239,206,240;
  --semi-purple-9: 247,235,247;
  --semi-violet-0: 64,27,119;
  --semi-violet-1: 76,36,140;
  --semi-violet-2: 88,46,160;
  --semi-violet-3: 100,57,181;
  --semi-violet-4: 114,70,201;
  --semi-violet-5: 136,101,212;
  --semi-violet-6: 162,136,223;
  --semi-violet-7: 190,173,233;
  --semi-violet-8: 221,212,244;
  --semi-violet-9: 241,238,250;
  --semi-indigo-0: 23,30,101;
  --semi-indigo-1: 32,41,122;
  --semi-indigo-2: 41,54,142;
  --semi-indigo-3: 52,68,163;
  --semi-indigo-4: 64,83,183;
  --semi-indigo-5: 95,113,197;
  --semi-indigo-6: 129,145,212;
  --semi-indigo-7: 167,180,226;
  --semi-indigo-8: 209,216,241;
  --semi-indigo-9: 237,239,248;
  --semi-blue-0: 5,49,112;
  --semi-blue-1: 10,70,148;
  --semi-blue-2: 19,92,184;
  --semi-blue-3: 29,117,219;
  --semi-blue-4: 41,144,255;
  --semi-blue-5: 84,169,255;
  --semi-blue-6: 127,193,255;
  --semi-blue-7: 169,215,255;
  --semi-blue-8: 212,236,255;
  --semi-blue-9: 239,248,255;
  --semi-light-blue-0: 0,55,97;
  --semi-light-blue-1: 0,77,133;
  --semi-light-blue-2: 3,102,169;
  --semi-light-blue-3: 10,129,204;
  --semi-light-blue-4: 19,159,240;
  --semi-light-blue-5: 64,180,243;
  --semi-light-blue-6: 110,200,246;
  --semi-light-blue-7: 157,220,249;
  --semi-light-blue-8: 206,238,252;
  --semi-light-blue-9: 235,248,254;
  --semi-cyan-0: 4,52,61;
  --semi-cyan-1: 7,79,92;
  --semi-cyan-2: 10,108,123;
  --semi-cyan-3: 14,137,153;
  --semi-cyan-4: 19,168,184;
  --semi-cyan-5: 56,187,198;
  --semi-cyan-6: 98,205,212;
  --semi-cyan-7: 145,223,227;
  --semi-cyan-8: 198,239,241;
  --semi-cyan-9: 231,247,248;
  --semi-teal-0: 2,60,57;
  --semi-teal-1: 4,90,85;
  --semi-teal-2: 7,119,111;
  --semi-teal-3: 10,149,136;
  --semi-teal-4: 14,179,161;
  --semi-teal-5: 51,194,176;
  --semi-teal-6: 94,209,193;
  --semi-teal-7: 142,225,211;
  --semi-teal-8: 196,240,232;
  --semi-teal-9: 230,247,244;
  --semi-green-0: 18,60,25;
  --semi-green-1: 28,90,37;
  --semi-green-2: 39,119,49;
  --semi-green-3: 50,149,61;
  --semi-green-4: 62,179,73;
  --semi-green-5: 93,194,100;
  --semi-green-6: 127,209,132;
  --semi-green-7: 166,225,168;
  --semi-green-8: 208,240,209;
  --semi-green-9: 236,247,236;
  --semi-light-green-0: 38,61,19;
  --semi-light-green-1: 59,92,29;
  --semi-light-green-2: 81,123,40;
  --semi-light-green-3: 103,153,52;
  --semi-light-green-4: 127,184,64;
  --semi-light-green-5: 151,198,95;
  --semi-light-green-6: 176,212,129;
  --semi-light-green-7: 201,227,167;
  --semi-light-green-8: 228,241,209;
  --semi-light-green-9: 243,248,237;
  --semi-lime-0: 49,70,3;
  --semi-lime-1: 75,105,5;
  --semi-lime-2: 103,141,9;
  --semi-lime-3: 132,176,12;
  --semi-lime-4: 162,211,17;
  --semi-lime-5: 174,220,58;
  --semi-lime-6: 189,229,102;
  --semi-lime-7: 207,237,150;
  --semi-lime-8: 229,246,201;
  --semi-lime-9: 243,251,233;
  --semi-yellow-0: 84,73,3;
  --semi-yellow-1: 126,108,6;
  --semi-yellow-2: 168,142,10;
  --semi-yellow-3: 210,175,15;
  --semi-yellow-4: 252,206,20;
  --semi-yellow-5: 253,222,67;
  --semi-yellow-6: 253,235,113;
  --semi-yellow-7: 254,245,160;
  --semi-yellow-8: 254,251,208;
  --semi-yellow-9: 255,254,236;
  --semi-amber-0: 81,46,9;
  --semi-amber-1: 121,75,15;
  --semi-amber-2: 161,107,22;
  --semi-amber-3: 202,143,30;
  --semi-amber-4: 242,183,38;
  --semi-amber-5: 245,202,80;
  --semi-amber-6: 247,219,122;
  --semi-amber-7: 250,234,166;
  --semi-amber-8: 252,246,210;
  --semi-amber-9: 254,251,237;
  --semi-orange-0: 85,31,3;
  --semi-orange-1: 128,53,6;
  --semi-orange-2: 170,80,10;
  --semi-orange-3: 213,111,15;
  --semi-orange-4: 255,146,20;
  --semi-orange-5: 255,174,67;
  --semi-orange-6: 255,199,114;
  --semi-orange-7: 255,221,161;
  --semi-orange-8: 255,239,208;
  --semi-orange-9: 255,249,237;
  --semi-grey-0: 28,31,35;
  --semi-grey-1: 46,50,56;
  --semi-grey-2: 65,70,76;
  --semi-grey-3: 85,91,97;
  --semi-grey-4: 107,112,117;
  --semi-grey-5: 136,141,146;
  --semi-grey-6: 167,171,176;
  --semi-grey-7: 198,202,205;
  --semi-grey-8: 230,232,234;
  --semi-grey-9: 249,249,249;
  --semi-white: 255, 255, 255;
  --semi-black: 0, 0, 0;
}

body, html[theme-mode=dark] .semi-always-light {
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  --semi-color-white: rgba(var(--semi-white), 1);
  --semi-color-black: rgba(var(--semi-black), 1);
  --semi-color-primary: rgba(var(--semi-blue-5), 1);
  --semi-color-primary-hover: rgba(var(--semi-blue-6), 1);
  --semi-color-primary-active: rgba(var(--semi-blue-7), 1);
  --semi-color-primary-disabled: rgba(var(--semi-blue-2), 1);
  --semi-color-primary-light-default: rgba(var(--semi-blue-0), 1);
  --semi-color-primary-light-hover: rgba(var(--semi-blue-1), 1);
  --semi-color-primary-light-active: rgba(var(--semi-blue-2), 1);
  --semi-color-secondary: rgba(var(--semi-light-blue-5), 1);
  --semi-color-secondary-hover: rgba(var(--semi-light-blue-6), 1);
  --semi-color-secondary-active: rgba(var(--semi-light-blue-7), 1);
  --semi-color-secondary-disabled: rgba(var(--semi-light-blue-2), 1);
  --semi-color-secondary-light-default: rgba(var(--semi-light-blue-0), 1);
  --semi-color-secondary-light-hover: rgba(var(--semi-light-blue-1), 1);
  --semi-color-secondary-light-active: rgba(var(--semi-light-blue-2), 1);
  --semi-color-tertiary: rgba(var(--semi-grey-5), 1);
  --semi-color-tertiary-hover: rgba(var(--semi-grey-6), 1);
  --semi-color-tertiary-active: rgba(var(--semi-grey-7), 1);
  --semi-color-tertiary-light-default: rgba(var(--semi-grey-0), 1);
  --semi-color-tertiary-light-hover: rgba(var(--semi-grey-1), 1);
  --semi-color-tertiary-light-active: rgba(var(--semi-grey-2), 1);
  --semi-color-default: rgba(var(--semi-grey-0), 1);
  --semi-color-default-hover: rgba(var(--semi-grey-1), 1);
  --semi-color-default-active: rgba(var(--semi-grey-2), 1);
  --semi-color-info: rgba(var(--semi-blue-5), 1);
  --semi-color-info-hover: rgba(var(--semi-blue-6), 1);
  --semi-color-info-active: rgba(var(--semi-blue-7), 1);
  --semi-color-info-disabled: rgba(var(--semi-blue-2), 1);
  --semi-color-info-light-default: rgba(var(--semi-blue-0), 1);
  --semi-color-info-light-hover: rgba(var(--semi-blue-1), 1);
  --semi-color-info-light-active: rgba(var(--semi-blue-2), 1);
  --semi-color-success: rgba(var(--semi-green-5), 1);
  --semi-color-success-hover: rgba(var(--semi-green-6), 1);
  --semi-color-success-active: rgba(var(--semi-green-7), 1);
  --semi-color-success-disabled: rgba(var(--semi-green-2), 1);
  --semi-color-success-light-default: rgba(var(--semi-green-0), 1);
  --semi-color-success-light-hover: rgba(var(--semi-green-1), 1);
  --semi-color-success-light-active: rgba(var(--semi-green-2), 1);
  --semi-color-danger: rgba(var(--semi-red-5), 1);
  --semi-color-danger-hover: rgba(var(--semi-red-6), 1);
  --semi-color-danger-active: rgba(var(--semi-red-7), 1);
  --semi-color-danger-light-default: rgba(var(--semi-red-0), 1);
  --semi-color-danger-light-hover: rgba(var(--semi-red-1), 1);
  --semi-color-danger-light-active: rgba(var(--semi-red-2), 1);
  --semi-color-warning: rgba(var(--semi-orange-5), 1);
  --semi-color-warning-hover: rgba(var(--semi-orange-6), 1);
  --semi-color-warning-active: rgba(var(--semi-orange-7), 1);
  --semi-color-warning-light-default: rgba(var(--semi-orange-0), 1);
  --semi-color-warning-light-hover: rgba(var(--semi-orange-1), 1);
  --semi-color-warning-light-active: rgba(var(--semi-orange-2), 1);
  --semi-color-focus-border: rgba(var(--semi-blue-5), 1);
  --semi-color-disabled-text: rgba(var(--semi-grey-9), .35);
  --semi-color-disabled-border: rgba(var(--semi-grey-1), 1);
  --semi-color-disabled-bg: rgba(var(--semi-grey-1), 1);
  --semi-color-disabled-fill: rgba(var(--semi-grey-8), .04);
  --semi-color-shadow: rgba(var(--semi-black), .04);
  --semi-color-link: rgba(var(--semi-blue-5), 1);
  --semi-color-link-hover: rgba(var(--semi-blue-6), 1);
  --semi-color-link-active: rgba(var(--semi-blue-7), 1);
  --semi-color-link-visited: rgba(var(--semi-blue-5), 1);
  --semi-color-border: rgba(var(--semi-grey-9), .08);
  --semi-color-nav-bg: rgba(var(--semi-white), 1);
  --semi-color-overlay-bg: rgba(22, 22, 26, .6);
  --semi-color-fill-0: rgba(var(--semi-grey-8), .05);
  --semi-color-fill-1: rgba(var(--semi-grey-8), .09);
  --semi-color-fill-2: rgba(var(--semi-grey-8), .13);
  --semi-color-bg-0: rgba(var(--semi-white), 1);
  --semi-color-bg-1: rgba(var(--semi-white), 1);
  --semi-color-bg-2: rgba(var(--semi-white), 1);
  --semi-color-bg-3: rgba(var(--semi-white), 1);
  --semi-color-bg-4: rgba(var(--semi-white), 1);
  --semi-color-text-0: rgba(var(--semi-grey-9), 1);
  --semi-color-text-1: rgba(var(--semi-grey-9), .8);
  --semi-color-text-2: rgba(var(--semi-grey-9), .62);
  --semi-color-text-3: rgba(var(--semi-grey-9), .35);
  --semi-shadow-elevated: 0 0 1px rgba(0, 0, 0, .3), 0 4px 14px rgba(0, 0, 0, .1);
  --semi-border-radius-extra-small: 3px;
  --semi-border-radius-small: 3px;
  --semi-border-radius-medium: 6px;
  --semi-border-radius-large: 12px;
  --semi-border-radius-circle: 50%;
  --semi-border-radius-full: 9999px;
  --semi-color-highlight-bg: rgba(var(--semi-yellow-4), 1);
  --semi-color-highlight: rgba(var(--semi-black), 1);
}

html[theme-mode=dark] body, body .semi-always-dark {
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  --semi-color-white: rgba(228, 231, 245, 1);
  --semi-color-black: rgba(var(--semi-black), 1);
  --semi-color-primary: rgba(var(--semi-blue-5), 1);
  --semi-color-primary-hover: rgba(var(--semi-blue-6), 1);
  --semi-color-primary-active: rgba(var(--semi-blue-7), 1);
  --semi-color-primary-disabled: rgba(var(--semi-blue-2), 1);
  --semi-color-primary-light-default: rgba(var(--semi-blue-5), .2);
  --semi-color-primary-light-hover: rgba(var(--semi-blue-5), .3);
  --semi-color-primary-light-active: rgba(var(--semi-blue-5), .4);
  --semi-color-secondary: rgba(var(--semi-light-blue-5), 1);
  --semi-color-secondary-hover: rgba(var(--semi-light-blue-6), 1);
  --semi-color-secondary-active: rgba(var(--semi-light-blue-7), 1);
  --semi-color-secondary-disabled: rgba(var(--semi-light-blue-2), 1);
  --semi-color-secondary-light-default: rgba(var(--semi-light-blue-5), .2);
  --semi-color-secondary-light-hover: rgba(var(--semi-light-blue-5), .3);
  --semi-color-secondary-light-active: rgba(var(--semi-light-blue-5), .4);
  --semi-color-tertiary: rgba(var(--semi-grey-5), 1);
  --semi-color-tertiary-hover: rgba(var(--semi-grey-6), 1);
  --semi-color-tertiary-active: rgba(var(--semi-grey-7), 1);
  --semi-color-tertiary-light-default: rgba(var(--semi-grey-5), .2);
  --semi-color-tertiary-light-hover: rgba(var(--semi-grey-5), .3);
  --semi-color-tertiary-light-active: rgba(var(--semi-grey-5), .4);
  --semi-color-default: rgba(var(--semi-grey-0), 1);
  --semi-color-default-hover: rgba(var(--semi-grey-1), 1);
  --semi-color-default-active: rgba(var(--semi-grey-2), 1);
  --semi-color-info: rgba(var(--semi-blue-5), 1);
  --semi-color-info-hover: rgba(var(--semi-blue-6), 1);
  --semi-color-info-active: rgba(var(--semi-blue-7), 1);
  --semi-color-info-disabled: rgba(var(--semi-blue-2), 1);
  --semi-color-info-light-default: rgba(var(--semi-blue-5), .2);
  --semi-color-info-light-hover: rgba(var(--semi-blue-5), .3);
  --semi-color-info-light-active: rgba(var(--semi-blue-5), .4);
  --semi-color-success: rgba(var(--semi-green-5), 1);
  --semi-color-success-hover: rgba(var(--semi-green-6), 1);
  --semi-color-success-active: rgba(var(--semi-green-7), 1);
  --semi-color-success-disabled: rgba(var(--semi-green-2), 1);
  --semi-color-success-light-default: rgba(var(--semi-green-5), .2);
  --semi-color-success-light-hover: rgba(var(--semi-green-5), .3);
  --semi-color-success-light-active: rgba(var(--semi-green-5), .4);
  --semi-color-danger: rgba(var(--semi-red-5), 1);
  --semi-color-danger-hover: rgba(var(--semi-red-6), 1);
  --semi-color-danger-active: rgba(var(--semi-red-7), 1);
  --semi-color-danger-light-default: rgba(var(--semi-red-5), .2);
  --semi-color-danger-light-hover: rgba(var(--semi-red-5), .3);
  --semi-color-danger-light-active: rgba(var(--semi-red-5), .4);
  --semi-color-warning: rgba(var(--semi-orange-5), 1);
  --semi-color-warning-hover: rgba(var(--semi-orange-6), 1);
  --semi-color-warning-active: rgba(var(--semi-orange-7), 1);
  --semi-color-warning-light-default: rgba(var(--semi-orange-5), .2);
  --semi-color-warning-light-hover: rgba(var(--semi-orange-5), .3);
  --semi-color-warning-light-active: rgba(var(--semi-orange-5), .4);
  --semi-color-focus-border: rgba(var(--semi-blue-5), 1);
  --semi-color-disabled-text: rgba(var(--semi-grey-9), .35);
  --semi-color-disabled-border: rgba(var(--semi-grey-1), 1);
  --semi-color-disabled-bg: rgba(var(--semi-grey-1), 1);
  --semi-color-disabled-fill: rgba(var(--semi-grey-8), .04);
  --semi-color-link: rgba(var(--semi-blue-5), 1);
  --semi-color-link-hover: rgba(var(--semi-blue-6), 1);
  --semi-color-link-active: rgba(var(--semi-blue-7), 1);
  --semi-color-link-visited: rgba(var(--semi-blue-5), 1);
  --semi-color-nav-bg: rgba(35, 36, 41, 1);
  --semi-shadow-elevated: inset 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 14px rgba(0, 0, 0, .25);
  --semi-color-overlay-bg: rgba(22, 22, 26, .6);
  --semi-color-fill-0: rgba(var(--semi-white), .12);
  --semi-color-fill-1: rgba(var(--semi-white), .16);
  --semi-color-fill-2: rgba(var(--semi-white), .20);
  --semi-color-border: rgba(var(--semi-white), .08);
  --semi-color-shadow: rgba(var(--semi-black), .04);
  --semi-color-bg-0: rgba(22, 22, 26, 1);
  --semi-color-bg-1: rgba(35, 36, 41, 1);
  --semi-color-bg-2: rgba(53, 54, 60, 1);
  --semi-color-bg-3: rgba(67, 68, 74, 1);
  --semi-color-bg-4: rgba(79, 81, 89, 1);
  --semi-color-text-0: rgba(var(--semi-grey-9), 1);
  --semi-color-text-1: rgba(var(--semi-grey-9), .8);
  --semi-color-text-2: rgba(var(--semi-grey-9), .6);
  --semi-color-text-3: rgba(var(--semi-grey-9), .35);
  --semi-border-radius-extra-small: 3px;
  --semi-border-radius-small: 3px;
  --semi-border-radius-medium: 6px;
  --semi-border-radius-large: 12px;
  --semi-border-radius-circle: 50%;
  --semi-border-radius-full: 9999px;
  --semi-color-highlight-bg: rgba(var(--semi-yellow-2), 1);
  --semi-color-highlight: rgba(var(--semi-white), 1);
}

body {
  --semi-transition_duration-slowest:0ms;
  --semi-transition_duration-slower:0ms;
  --semi-transition_duration-slow:0ms;
  --semi-transition_duration-normal:0ms;
  --semi-transition_duration-fast:0ms;
  --semi-transition_duration-faster:0ms;
  --semi-transition_duration-fastest:0ms;
  --semi-transition_duration-none:0ms;
  --semi-transition_function-linear:linear;
  --semi-transition_function-ease:ease;
  --semi-transition_function-easeIn:ease-in;
  --semi-transition_function-easeOut:ease-out;
  --semi-transition_function-easeInIOut:ease-in-out;
  --semi-transition_delay-none: 0ms;
  --semi-transition_delay-slowest:0ms;
  --semi-transition_delay-slower:0ms;
  --semi-transition_delay-slow:0ms;
  --semi-transition_delay-normal:0ms;
  --semi-transition_delay-fast:0ms;
  --semi-transition_delay-faster:0ms;
  --semi-transition_delay-fastest:0ms;
  --semi-transform_scale-none:scale(1,1);
  --semi-transform_scale-small:scale(1,1);
  --semi-transform_scale-medium:scale(1,1);
  --semi-transform_scale-large:scale(1,1);
  --semi-transform-rotate-none:rotate(0deg);
  --semi-transform_rotate-clockwise90deg:rotate(90deg);
  --semi-transform_rotate-clockwise180deg:rotate(180deg);
  --semi-transform_rotate-clockwise270deg:rotate(270deg);
  --semi-transform_rotate-clockwise360deg:rotate(360deg);
  --semi-transform_rotate-anticlockwise90deg:rotate(-90deg);
  --semi-transform_rotate-anticlockwise180deg:rotate(-180deg);
  --semi-transform_rotate-anticlockwise270deg:rotate(-270deg);
  --semi-transform_rotate-anticlockwise360deg:rotate(-360deg);
}

.semi-portal {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 1;
}
.semi-portal-inner {
  position: absolute;
  background-color: transparent;
  min-width: max-content;
}

.semi-anchor {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  overflow-y: auto;
  overflow-x: hidden;
  position: relative;
}
.semi-anchor-size-small {
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-anchor-slide {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
}
.semi-anchor-slide-muted {
  display: none;
}
.semi-anchor-slide-bar {
  display: none;
  position: absolute;
  top: 0;
  width: 2px;
  border-radius: 1px;
}
.semi-anchor-slide-bar-active {
  display: inline-block;
}
.semi-anchor-slide-bar-default {
  height: 28px;
}
.semi-anchor-slide-bar-small {
  height: 24px;
}
.semi-anchor-slide-bar-primary {
  background-color: var(--semi-color-primary);
}
.semi-anchor-slide-bar-tertiary {
  background-color: var(--semi-color-tertiary);
}
.semi-anchor-slide::before {
  position: absolute;
  display: block;
  width: 2px;
  height: 100%;
  background-color: var(--semi-color-border);
  border-radius: 1px;
  content: " ";
}
.semi-anchor-link-title {
  cursor: pointer;
  color: var(--semi-color-text-2);
  padding-top: 4px;
  padding-bottom: 4px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  border-radius: 3px;
  transition: color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-anchor-link-title:hover {
  color: var(--semi-color-tertiary-hover);
}
.semi-anchor-link-title-active {
  color: var(--semi-color-text-0);
}
.semi-anchor-link-title:focus-visible {
  outline: 2px solid var(--semi-color-primary-light-active);
  outline-offset: -2px;
}
.semi-anchor-link-title-disabled {
  color: var(--semi-color-disabled-text);
  cursor: not-allowed;
}
.semi-anchor-link-title-disabled:hover {
  color: var(--semi-color-disabled-text);
}
.semi-anchor-link-tooltip {
  cursor: pointer;
  color: var(--semi-color-text-2) !important;
}
.semi-anchor-link-tooltip-small {
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-anchor-link-tooltip:hover {
  color: var(--semi-color-tertiary-hover) !important;
}
.semi-anchor-link-tooltip-active {
  color: var(--semi-color-text-0) !important;
}
.semi-anchor-link-tooltip-disabled {
  color: var(--semi-color-disabled-text) !important;
  cursor: not-allowed;
}
.semi-anchor-link-tooltip-disabled:hover {
  color: var(--semi-color-disabled-text) !important;
}

.semi-rtl .semi-anchor,
.semi-portal-rtl .semi-anchor {
  direction: rtl;
}
.semi-rtl .semi-anchor-slide,
.semi-portal-rtl .semi-anchor-slide {
  right: 0;
  left: auto;
}
.semi-rtl .semi-anchor-link,
.semi-portal-rtl .semi-anchor-link {
  padding-left: auto;
}

.semi-autoComplete-option {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  word-break: break-all;
  padding-left: 12px;
  padding-right: 12px;
  padding-top: 8px;
  padding-bottom: 8px;
  color: var(--semi-color-text-0);
  border-radius: 0px;
  position: relative;
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  cursor: pointer;
  box-sizing: border-box;
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
}
.semi-autoComplete-option-icon {
  width: 12px;
  color: transparent;
  visibility: hidden;
  margin-right: 8px;
  display: flex;
  justify-content: center;
  align-content: center;
}
.semi-autoComplete-option-text {
  display: flex;
  flex-wrap: wrap;
  white-space: pre;
}
.semi-autoComplete-option-keyword {
  color: var(--semi-color-primary);
  background-color: inherit;
  font-weight: 600;
}
.semi-autoComplete-option:active {
  background-color: var(--semi-color-fill-1);
}
.semi-autoComplete-option-empty {
  cursor: not-allowed;
  color: var(--semi-color-disabled-text);
  justify-content: center;
}
.semi-autoComplete-option-empty:hover {
  background-color: inherit;
}
.semi-autoComplete-option-empty:active {
  background-color: inherit;
}
.semi-autoComplete-option-disabled {
  color: var(--semi-color-disabled-text);
  cursor: not-allowed;
}
.semi-autoComplete-option-disabled:hover {
  background-color: var(--semi-color-fill-0);
}
.semi-autoComplete-option-selected {
  font-weight: 600;
}
.semi-autoComplete-option-selected .semi-autoComplete-option-icon {
  visibility: visible;
  color: var(--semi-color-text-2);
}
.semi-autoComplete-option-focused {
  background-color: var(--semi-color-fill-0);
}
.semi-autoComplete-option:first-of-type {
  margin-top: 4px;
}
.semi-autoComplete-option:last-of-type {
  margin-bottom: 4px;
}

.semi-autocomplete {
  cursor: text;
  display: inline-flex;
  vertical-align: middle;
  box-sizing: border-box;
}
.semi-autocomplete-option-list {
  overflow-x: hidden;
  overflow-y: auto;
}
.semi-autocomplete-option-list-chosen .semi-autocomplete-option-icon {
  display: flex;
}
.semi-autocomplete-loading-wrapper {
  padding-top: 8px;
  padding-bottom: 8px;
  cursor: not-allowed;
  height: 20px;
}
.semi-autocomplete-loading-wrapper .semi-spin {
  width: 100%;
}

.semi-rtl .semi-autocomplete,
.semi-portal-rtl .semi-autocomplete {
  direction: rtl;
}

.semi-avatar {
  position: relative;
  display: inline-flex;
  overflow: hidden;
  align-items: center;
  justify-content: center;
  white-space: nowrap;
  text-align: center;
  vertical-align: middle;
}
.semi-avatar:focus-visible {
  outline: 2px solid var(--semi-color-primary-light-active);
}
.semi-avatar-focus {
  outline: 2px solid var(--semi-color-primary-light-active);
}
.semi-avatar-no-focus-visible:focus-visible {
  outline: none;
}
.semi-avatar .semi-avatar-label {
  display: flex;
  align-items: center;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-weight: 600;
}
.semi-avatar-content {
  user-select: none;
}
.semi-avatar-extra-extra-small {
  width: 20px;
  height: 20px;
  border-radius: 3px;
}
.semi-avatar-extra-extra-small .semi-avatar-content {
  transform-origin: center;
  transform: scale(0.8);
}
.semi-avatar-extra-extra-small .semi-avatar-label {
  font-size: 10px;
  line-height: 15px;
}
.semi-avatar-extra-small {
  width: 24px;
  height: 24px;
  border-radius: 3px;
}
.semi-avatar-extra-small .semi-avatar-content {
  transform-origin: center;
  transform: scale(0.8);
}
.semi-avatar-extra-small .semi-avatar-label {
  font-size: 10px;
  line-height: 15px;
}
.semi-avatar-small {
  width: 32px;
  height: 32px;
  border-radius: 3px;
}
.semi-avatar-small .semi-avatar-label {
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-avatar-default {
  width: 40px;
  height: 40px;
  border-radius: 3px;
}
.semi-avatar-default .semi-avatar-label {
  font-size: 18px;
  line-height: 24px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-avatar-medium {
  width: 48px;
  height: 48px;
  border-radius: 3px;
}
.semi-avatar-medium .semi-avatar-label {
  font-size: 20px;
  line-height: 28px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-avatar-large {
  width: 72px;
  height: 72px;
  border-radius: 6px;
}
.semi-avatar-large .semi-avatar-label {
  font-size: 32px;
  line-height: 44px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-avatar-extra-large {
  width: 128px;
  height: 128px;
  border-radius: 12px;
}
.semi-avatar-extra-large .semi-avatar-label {
  font-size: 64px;
  line-height: 77px;
}
.semi-avatar-circle {
  border-radius: var(--semi-border-radius-circle);
}
.semi-avatar-image {
  background-color: transparent;
}
.semi-avatar > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.semi-avatar-hover {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}
.semi-avatar:hover {
  cursor: pointer;
}

.semi-avatar-group {
  display: inline-block;
}
.semi-avatar-group .semi-avatar {
  box-sizing: border-box;
}
.semi-avatar-group .semi-avatar:first-child {
  margin-left: 0;
}
.semi-avatar-group .semi-avatar-extra-large {
  border: 3px var(--semi-color-bg-1) solid;
  margin-left: -32px;
}
.semi-avatar-group .semi-avatar-large {
  border: 3px var(--semi-color-bg-1) solid;
  margin-left: -18px;
}
.semi-avatar-group .semi-avatar-medium {
  border: 2px var(--semi-color-bg-1) solid;
  margin-left: -12px;
}
.semi-avatar-group .semi-avatar-default {
  border: 2px var(--semi-color-bg-1) solid;
  margin-left: -12px;
}
.semi-avatar-group .semi-avatar-small {
  border: 2px var(--semi-color-bg-1) solid;
  margin-left: -12px;
}
.semi-avatar-group .semi-avatar-extra-small {
  border: 1px var(--semi-color-bg-1) solid;
  margin-left: -10px;
}
.semi-avatar-group .semi-avatar-extra-extra-small {
  border: 1px var(--semi-color-bg-1) solid;
  margin-left: -4px;
}
.semi-avatar-group .semi-avatar-item-start-0 {
  z-index: 100;
}
.semi-avatar-group .semi-avatar-item-end-0 {
  z-index: 80;
}
.semi-avatar-group .semi-avatar-item-start-1 {
  z-index: 99;
}
.semi-avatar-group .semi-avatar-item-end-1 {
  z-index: 81;
}
.semi-avatar-group .semi-avatar-item-start-2 {
  z-index: 98;
}
.semi-avatar-group .semi-avatar-item-end-2 {
  z-index: 82;
}
.semi-avatar-group .semi-avatar-item-start-3 {
  z-index: 97;
}
.semi-avatar-group .semi-avatar-item-end-3 {
  z-index: 83;
}
.semi-avatar-group .semi-avatar-item-start-4 {
  z-index: 96;
}
.semi-avatar-group .semi-avatar-item-end-4 {
  z-index: 84;
}
.semi-avatar-group .semi-avatar-item-start-5 {
  z-index: 95;
}
.semi-avatar-group .semi-avatar-item-end-5 {
  z-index: 85;
}
.semi-avatar-group .semi-avatar-item-start-6 {
  z-index: 94;
}
.semi-avatar-group .semi-avatar-item-end-6 {
  z-index: 86;
}
.semi-avatar-group .semi-avatar-item-start-7 {
  z-index: 93;
}
.semi-avatar-group .semi-avatar-item-end-7 {
  z-index: 87;
}
.semi-avatar-group .semi-avatar-item-start-8 {
  z-index: 92;
}
.semi-avatar-group .semi-avatar-item-end-8 {
  z-index: 88;
}
.semi-avatar-group .semi-avatar-item-start-9 {
  z-index: 91;
}
.semi-avatar-group .semi-avatar-item-end-9 {
  z-index: 89;
}
.semi-avatar-group .semi-avatar-item-start-10 {
  z-index: 90;
}
.semi-avatar-group .semi-avatar-item-end-10 {
  z-index: 90;
}
.semi-avatar-group .semi-avatar-item-start-11 {
  z-index: 89;
}
.semi-avatar-group .semi-avatar-item-end-11 {
  z-index: 91;
}
.semi-avatar-group .semi-avatar-item-start-12 {
  z-index: 88;
}
.semi-avatar-group .semi-avatar-item-end-12 {
  z-index: 92;
}
.semi-avatar-group .semi-avatar-item-start-13 {
  z-index: 87;
}
.semi-avatar-group .semi-avatar-item-end-13 {
  z-index: 93;
}
.semi-avatar-group .semi-avatar-item-start-14 {
  z-index: 86;
}
.semi-avatar-group .semi-avatar-item-end-14 {
  z-index: 94;
}
.semi-avatar-group .semi-avatar-item-start-15 {
  z-index: 85;
}
.semi-avatar-group .semi-avatar-item-end-15 {
  z-index: 95;
}
.semi-avatar-group .semi-avatar-item-start-16 {
  z-index: 84;
}
.semi-avatar-group .semi-avatar-item-end-16 {
  z-index: 96;
}
.semi-avatar-group .semi-avatar-item-start-17 {
  z-index: 83;
}
.semi-avatar-group .semi-avatar-item-end-17 {
  z-index: 97;
}
.semi-avatar-group .semi-avatar-item-start-18 {
  z-index: 82;
}
.semi-avatar-group .semi-avatar-item-end-18 {
  z-index: 98;
}
.semi-avatar-group .semi-avatar-item-start-19 {
  z-index: 81;
}
.semi-avatar-group .semi-avatar-item-end-19 {
  z-index: 99;
}
.semi-avatar-group .semi-avatar-item-start-20 {
  z-index: 80;
}
.semi-avatar-group .semi-avatar-item-end-20 {
  z-index: 100;
}
.semi-avatar-group .semi-avatar-item-more {
  background-color: rgba(var(--semi-grey-5), 1);
}

.semi-avatar-amber {
  background-color: rgba(var(--semi-amber-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-blue {
  background-color: rgba(var(--semi-blue-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-cyan {
  background-color: rgba(var(--semi-cyan-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-green {
  background-color: rgba(var(--semi-green-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-grey {
  background-color: rgba(var(--semi-grey-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-indigo {
  background-color: rgba(var(--semi-indigo-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-light-blue {
  background-color: rgba(var(--semi-light-blue-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-light-green {
  background-color: rgba(var(--semi-light-green-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-lime {
  background-color: rgba(var(--semi-lime-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-orange {
  background-color: rgba(var(--semi-orange-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-pink {
  background-color: rgba(var(--semi-pink-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-purple {
  background-color: rgba(var(--semi-purple-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-red {
  background-color: rgba(var(--semi-red-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-teal {
  background-color: rgba(var(--semi-teal-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-violet {
  background-color: rgba(var(--semi-violet-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-avatar-yellow {
  background-color: rgba(var(--semi-yellow-3), 1);
  color: rgba(var(--semi-white), 1);
}

.semi-rtl .semi-avatar,
.semi-portal-rtl .semi-avatar {
  direction: rtl;
}
.semi-rtl .semi-avatar-extra-extra-small .semi-avatar-content,
.semi-portal-rtl .semi-avatar-extra-extra-small .semi-avatar-content {
  transform: scale(0.8);
}
.semi-rtl .semi-avatar-extra-small .semi-avatar-content,
.semi-portal-rtl .semi-avatar-extra-small .semi-avatar-content {
  transform: scale(0.8);
}
.semi-rtl .semi-avatar-hover,
.semi-portal-rtl .semi-avatar-hover {
  left: auto;
  right: 0;
}
.semi-rtl .semi-avatar-group,
.semi-portal-rtl .semi-avatar-group {
  direction: rtl;
}
.semi-rtl .semi-avatar-group .semi-avatar:first-child,
.semi-portal-rtl .semi-avatar-group .semi-avatar:first-child {
  margin-left: auto;
  margin-right: 0;
}
.semi-rtl .semi-avatar-group .semi-avatar-extra-large,
.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-large {
  margin-left: auto;
  margin-right: -32px;
}
.semi-rtl .semi-avatar-group .semi-avatar-large,
.semi-portal-rtl .semi-avatar-group .semi-avatar-large {
  margin-left: auto;
  margin-right: -18px;
}
.semi-rtl .semi-avatar-group .semi-avatar-medium,
.semi-rtl .semi-avatar-group .semi-avatar-small,
.semi-portal-rtl .semi-avatar-group .semi-avatar-medium,
.semi-portal-rtl .semi-avatar-group .semi-avatar-small {
  margin-left: auto;
  margin-right: -12px;
}
.semi-rtl .semi-avatar-group .semi-avatar-extra-small,
.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-small {
  margin-left: auto;
  margin-right: -10px;
}
.semi-rtl .semi-avatar-group .semi-avatar-extra-extra-small,
.semi-portal-rtl .semi-avatar-group .semi-avatar-extra-extra-small {
  margin-left: auto;
  margin-right: -4px;
}

.semi-backtop {
  position: fixed;
  box-sizing: border-box;
  right: 100px;
  bottom: 50px;
  z-index: 10;
  cursor: pointer;
  text-align: center;
  overflow: hidden;
}

.semi-rtl .semi-backtop,
.semi-portal-rtl .semi-backtop {
  direction: rtl;
  right: auto;
  left: 100px;
}

.semi-badge {
  position: relative;
  display: inline-block;
}
.semi-badge-dot {
  box-sizing: border-box;
  width: 8px;
  height: 8px;
  border-radius: var(--semi-border-radius-circle);
  background-color: var(--semi-color-bg-1);
  border: 1px var(--semi-color-bg-1) solid;
  z-index: 1;
}
.semi-badge-count {
  box-sizing: border-box;
  height: 18px;
  min-width: 18px;
  border-radius: 9px;
  padding: 0px 4px;
  background-color: var(--semi-color-bg-1);
  border: 1px var(--semi-color-bg-1) solid;
  z-index: 1;
  text-align: center;
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-weight: 14px;
  color: var(--semi-color-bg-2);
}
.semi-badge-rightTop {
  position: absolute;
  top: 0;
  right: 0;
  transform: translate(50%, -50%);
  transform-origin: 100% 0%;
}
.semi-badge-rightBottom {
  position: absolute;
  right: 0;
  bottom: 0;
  transform: translate(50%, 50%);
  transform-origin: 100% 0%;
}
.semi-badge-leftTop {
  position: absolute;
  top: 0;
  left: 0;
  transform: translate(-50%, -50%);
  transform-origin: 100% 0%;
}
.semi-badge-leftBottom {
  position: absolute;
  bottom: 0;
  left: 0;
  transform: translate(-50%, 50%);
  transform-origin: 100% 0%;
}
.semi-badge-custom {
  display: flex;
}
.semi-badge-block {
  position: static;
  display: inline-block;
}
.semi-badge-light::before {
  content: "";
  display: block;
  width: 100%;
  height: 100%;
  border-radius: inherit;
  position: absolute;
  top: 0;
  left: 0;
  background-color: var(--semi-color-bg-2);
  z-index: -1;
}
.semi-badge-light::after {
  content: "";
  display: block;
  width: 100%;
  height: 100%;
  border-radius: inherit;
  position: absolute;
  top: 0;
  left: 0;
  background-color: inherit;
  z-index: -1;
}
.semi-badge-primary.semi-badge-solid {
  background-color: var(--semi-color-primary);
}
.semi-badge-primary.semi-badge-light {
  background-color: var(--semi-color-primary-light-default);
  color: var(--semi-color-primary);
}
.semi-badge-primary.semi-badge-inverted {
  color: var(--semi-color-primary);
}
.semi-badge-secondary.semi-badge-solid {
  background-color: var(--semi-color-secondary);
}
.semi-badge-secondary.semi-badge-light {
  background-color: var(--semi-color-secondary-light-default);
  color: var(--semi-color-secondary);
}
.semi-badge-secondary.semi-badge-inverted {
  color: var(--semi-color-secondary);
}
.semi-badge-tertiary.semi-badge-solid {
  background-color: var(--semi-color-tertiary);
}
.semi-badge-tertiary.semi-badge-light {
  background-color: var(--semi-color-tertiary-light-default);
  color: var(--semi-color-tertiary);
}
.semi-badge-tertiary.semi-badge-inverted {
  color: var(--semi-color-tertiary);
}
.semi-badge-danger.semi-badge-solid {
  background-color: var(--semi-color-danger);
}
.semi-badge-danger.semi-badge-light {
  background-color: var(--semi-color-danger-light-default);
  color: var(--semi-color-danger);
}
.semi-badge-danger.semi-badge-inverted {
  color: var(--semi-color-danger);
}
.semi-badge-warning.semi-badge-solid {
  background-color: var(--semi-color-warning);
}
.semi-badge-warning.semi-badge-light {
  background-color: var(--semi-color-warning-light-default);
  color: var(--semi-color-warning);
}
.semi-badge-warning.semi-badge-inverted {
  color: var(--semi-color-warning);
}
.semi-badge-success.semi-badge-solid {
  background-color: var(--semi-color-success);
}
.semi-badge-success.semi-badge-light {
  background-color: var(--semi-color-success-light-default);
  color: var(--semi-color-success);
}
.semi-badge-success.semi-badge-inverted {
  color: var(--semi-color-success);
}

.semi-rtl .semi-badge,
.semi-portal-rtl .semi-badge {
  direction: rtl;
}

.semi-banner {
  padding: 12px 12px;
}
.semi-banner-content-wrapper {
  display: flex;
  flex-direction: row;
}
.semi-banner-description {
  margin: 0;
}
.semi-banner .semi-banner-content-wrapper .semi-banner-content {
  display: flex;
  flex: 1;
  align-items: top;
}
.semi-banner-in-container {
  border-radius: var(--semi-border-radius-small);
}
.semi-banner-in-container .semi-banner-content-wrapper .semi-banner-content-body {
  flex: 1;
}
.semi-banner-in-container .semi-banner-content-wrapper .semi-banner-content-body .semi-banner-title + .semi-banner-description {
  margin-top: 2px;
}
.semi-banner-full .semi-banner-content-wrapper .semi-banner-content {
  justify-content: center;
}
.semi-banner-full .semi-banner-content-wrapper .semi-banner-icon,
.semi-banner-full .semi-banner-content-wrapper .semi-banner-content-body {
  display: flex;
  align-items: center;
}
.semi-banner-close {
  margin-left: 12px;
  height: 24px;
  width: 24px;
}
.semi-banner-extra {
  margin-top: 8px;
}
.semi-banner-icon {
  display: flex;
  margin-right: 12px;
}
.semi-banner-info {
  background-color: var(--semi-color-info-light-default);
  color: var(--semi-color-info);
}
.semi-banner-info.semi-banner-bordered {
  border: 1px solid var(--semi-color-info);
}
.semi-banner-warning {
  background-color: var(--semi-color-warning-light-default);
  color: var(--semi-color-warning);
}
.semi-banner-warning.semi-banner-bordered {
  border: 1px solid var(--semi-color-warning);
}
.semi-banner-success {
  background-color: var(--semi-color-success-light-default);
  color: var(--semi-color-success);
}
.semi-banner-success.semi-banner-bordered {
  border: 1px solid var(--semi-color-success);
}
.semi-banner-danger {
  background-color: var(--semi-color-danger-light-default);
  color: var(--semi-color-danger);
}
.semi-banner-danger.semi-banner-bordered {
  border: 1px solid var(--semi-color-danger);
}

.semi-rtl .semi-banner,
.semi-portal-rtl .semi-banner {
  direction: rtl;
}
.semi-rtl .semi-banner-close,
.semi-portal-rtl .semi-banner-close {
  margin-left: 0;
  margin-right: 12px;
  height: 24px;
  width: 24px;
}
.semi-rtl .semi-banner-icon,
.semi-portal-rtl .semi-banner-icon {
  margin-right: 0;
  margin-left: 12px;
}

.semi-light-scrollbar::-webkit-scrollbar, .semi-light-scrollbar *::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}
.semi-light-scrollbar::-webkit-scrollbar-track, .semi-light-scrollbar *::-webkit-scrollbar-track {
  background: rgba(0, 0, 0, 0);
}
.semi-light-scrollbar::-webkit-scrollbar-corner, .semi-light-scrollbar *::-webkit-scrollbar-corner {
  background-color: rgba(0, 0, 0, 0);
}
.semi-light-scrollbar::-webkit-scrollbar-thumb, .semi-light-scrollbar *::-webkit-scrollbar-thumb {
  border-radius: 6px;
  background: transparent;
  transition: all 1s;
}
.semi-light-scrollbar:hover::-webkit-scrollbar-thumb, .semi-light-scrollbar *:hover::-webkit-scrollbar-thumb {
  background: var(--semi-color-fill-2);
}
.semi-light-scrollbar::-webkit-scrollbar-thumb:hover, .semi-light-scrollbar *::-webkit-scrollbar-thumb:hover {
  background: var(--semi-color-fill-1);
}

.semi-breadcrumb {
  overflow: hidden;
}
.semi-breadcrumb-wrapper {
  display: flex;
  flex-wrap: wrap;
}
.semi-breadcrumb-wrapper-loose {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 14px;
}
.semi-breadcrumb-wrapper-compact {
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 12px;
}
.semi-breadcrumb-item-wrap {
  display: inline-flex;
  align-items: center;
  margin: 4px 0px;
  margin-right: 4px;
}
.semi-breadcrumb-item {
  display: inline;
  margin-right: 4px;
  color: var(--semi-color-text-2);
  font-weight: 400;
}
.semi-breadcrumb-item .semi-typography {
  color: inherit;
}
.semi-breadcrumb-item-title-inline {
  display: inline-flex;
}
.semi-breadcrumb-item-active {
  color: var(--semi-color-text-0);
  font-weight: 600;
}
.semi-breadcrumb-item-active:hover, .semi-breadcrumb-item-active:active {
  border: none;
  margin-bottom: 0px;
  color: var(--semi-color-text-0);
  cursor: default;
}
.semi-breadcrumb-item-icon {
  margin-bottom: -1px;
}
.semi-breadcrumb-item-more svg {
  vertical-align: middle;
}
.semi-breadcrumb-item-link {
  display: inline-flex;
  align-items: center;
  column-gap: 4px;
  text-decoration: inherit;
  transition: color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-breadcrumb-item-link:hover {
  color: var(--semi-color-link);
  cursor: pointer;
}
.semi-breadcrumb-item-link:active {
  color: var(--semi-color-link-hover);
  cursor: pointer;
}
.semi-breadcrumb-collapse {
  display: inline-flex;
  flex-shrink: 0;
}
.semi-breadcrumb-separator {
  display: flex;
  color: var(--semi-color-text-2);
}
.semi-breadcrumb-restItem {
  color: var(--semi-color-text-2);
  margin-right: 8px;
}

.semi-rtl .semi-breadcrumb-wrapper,
.semi-portal-rtl .semi-breadcrumb-wrapper {
  direction: rtl;
}
.semi-rtl .semi-breadcrumb-item-wrap,
.semi-portal-rtl .semi-breadcrumb-item-wrap {
  margin-right: 0;
  margin-left: 4px;
}
.semi-rtl .semi-breadcrumb-item,
.semi-portal-rtl .semi-breadcrumb-item {
  margin-right: 0;
  margin-left: 4px;
}
.semi-rtl .semi-breadcrumb-restItem,
.semi-portal-rtl .semi-breadcrumb-restItem {
  margin-right: 0;
  margin-left: 8px;
}
.semi-rtl .semi-breadcrumb-item-icon + .semi-breadcrumb-item-title,
.semi-portal-rtl .semi-breadcrumb-item-icon + .semi-breadcrumb-item-title {
  margin-left: 0;
  margin-right: 4px;
  display: inline-block;
}

.semi-button-split {
  display: inline-block;
}
.semi-button-split .semi-button {
  border-radius: 0;
  margin-right: 1px;
}
.semi-button-split .semi-button-first {
  border-top-left-radius: var(--semi-border-radius-small);
  border-bottom-left-radius: var(--semi-border-radius-small);
}
.semi-button-split .semi-button-last {
  border-top-right-radius: var(--semi-border-radius-small);
  border-bottom-right-radius: var(--semi-border-radius-small);
  margin-right: unset;
}
.semi-button-split:hover .semi-button-borderless:active {
  background-color: var(--semi-color-fill-1);
}

.semi-button {
  box-shadow: none;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  user-select: none;
  border: 0 transparent solid;
  border-radius: var(--semi-border-radius-small);
  padding-left: 12px;
  padding-right: 12px;
  padding-top: 6px;
  padding-bottom: 6px;
  font-weight: 600;
  outline: none;
  vertical-align: middle;
  white-space: nowrap;
}
.semi-button.semi-button-primary:focus-visible, .semi-button.semi-button-secondary:focus-visible, .semi-button.semi-button-tertiary:focus-visible, .semi-button.semi-button-warning:focus-visible, .semi-button.semi-button-danger:focus-visible {
  outline: 2px solid var(--semi-color-primary-light-active);
}
.semi-button-danger {
  background-color: var(--semi-color-danger);
  color: rgba(var(--semi-white), 1);
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-button-danger:hover {
  background-color: var(--semi-color-danger-hover);
}
.semi-button-danger:active {
  background-color: var(--semi-color-danger-active);
}
.semi-button-danger.semi-button-light, .semi-button-danger.semi-button-borderless {
  color: var(--semi-color-danger);
}
.semi-button-danger:not(.semi-button-borderless):not(.semi-button-light):focus-visible {
  outline: 2px solid var(--semi-color-danger-light-active);
}
.semi-button-warning {
  background-color: var(--semi-color-warning);
  color: rgba(var(--semi-white), 1);
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-button-warning:hover {
  background-color: var(--semi-color-warning-hover);
}
.semi-button-warning:active {
  background-color: var(--semi-color-warning-active);
}
.semi-button-warning.semi-button-light, .semi-button-warning.semi-button-borderless {
  color: var(--semi-color-warning);
}
.semi-button-warning:not(.semi-button-borderless):not(.semi-button-light):focus-visible {
  outline: 2px solid var(--semi-color-warning-light-active);
}
.semi-button-tertiary {
  background-color: var(--semi-color-tertiary);
  color: rgba(var(--semi-white), 1);
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-button-tertiary:hover {
  background-color: var(--semi-color-tertiary-hover);
}
.semi-button-tertiary:active {
  background-color: var(--semi-color-tertiary-active);
}
.semi-button-tertiary.semi-button-light, .semi-button-tertiary.semi-button-borderless {
  color: var(--semi-color-text-1);
}
.semi-button-primary {
  background-color: var(--semi-color-primary);
  color: rgba(var(--semi-white), 1);
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-button-primary:not(.semi-button-borderless):not(.semi-button-light):hover {
  background-color: var(--semi-color-primary-hover);
}
.semi-button-primary:not(.semi-button-borderless):not(.semi-button-light):active {
  background-color: var(--semi-color-primary-active);
}
.semi-button-primary.semi-button-light, .semi-button-primary.semi-button-borderless {
  color: var(--semi-color-primary);
}
.semi-button-secondary {
  background-color: var(--semi-color-secondary);
  outline-color: var(--semi-color-secondary);
  color: rgba(var(--semi-white), 1);
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-button-secondary:hover {
  background-color: var(--semi-color-secondary-hover);
}
.semi-button-secondary:active {
  background-color: var(--semi-color-secondary-active);
}
.semi-button-secondary.semi-button-light, .semi-button-secondary.semi-button-borderless {
  color: var(--semi-color-secondary);
}
.semi-button-disabled {
  color: var(--semi-color-disabled-text);
  background-color: var(--semi-color-disabled-bg);
  cursor: not-allowed;
}
.semi-button-disabled:not(.semi-button-borderless):not(.semi-button-light):hover {
  color: var(--semi-color-disabled-text);
  background-color: var(--semi-color-disabled-bg);
}
.semi-button-disabled.semi-button-light, .semi-button-disabled.semi-button-borderless {
  color: var(--semi-color-disabled-text);
}
.semi-button-borderless {
  background-color: transparent;
  border: 0 transparent solid;
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-button-borderless:not(.semi-button-disabled):hover {
  background-color: var(--semi-color-fill-0);
  border: 0 transparent solid;
}
.semi-button-borderless:not(.semi-button-disabled):active {
  background-color: var(--semi-color-fill-1);
  border: 0 transparent solid;
}
.semi-button-light {
  background-color: var(--semi-color-fill-0);
  border: 0 transparent solid;
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
}
.semi-button-light:not(.semi-button-disabled):hover {
  background-color: var(--semi-color-fill-1);
  border: 0 transparent solid;
}
.semi-button-light:not(.semi-button-disabled):active {
  background-color: var(--semi-color-fill-2);
  border: 0 transparent solid;
}
.semi-button-size-small {
  height: 24px;
  padding-top: 2px;
  padding-bottom: 2px;
  padding-left: 12px;
  padding-right: 12px;
}
.semi-button-size-large {
  height: 40px;
  padding-top: 10px;
  padding-bottom: 10px;
  padding-left: 16px;
  padding-right: 16px;
}
.semi-button-block {
  width: 100%;
}
.semi-button-group {
  display: flex;
  flex-wrap: wrap;
}
.semi-button-group > .semi-button {
  margin: 0;
  padding-left: 0;
  padding-right: 0;
  border-radius: 0;
}
.semi-button-group > .semi-button .semi-button-content {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-button-group > .semi-button-size-large .semi-button-content {
  padding-left: 16px;
  padding-right: 16px;
}
.semi-button-group > .semi-button-size-small .semi-button-content {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-button-group > .semi-button.semi-button-with-icon-only {
  padding-left: 0;
  padding-right: 0;
}
.semi-button-group > .semi-button.semi-button-with-icon-only .semi-button-content {
  padding-left: 8px;
  padding-right: 8px;
}
.semi-button-group > .semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content {
  padding-left: 4px;
  padding-right: 4px;
}
.semi-button-group > .semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-button-group > .semi-button:first-child {
  border-top-left-radius: var(--semi-border-radius-small);
  border-bottom-left-radius: var(--semi-border-radius-small);
}
.semi-button-group > .semi-button:last-child {
  border-top-right-radius: var(--semi-border-radius-small);
  border-bottom-right-radius: var(--semi-border-radius-small);
}
.semi-button-group-line {
  display: inline-flex;
  align-items: center;
  background-color: var(--semi-color-border);
}
.semi-button-group-line-primary {
  background-color: var(--semi-color-primary);
}
.semi-button-group-line-secondary {
  background-color: var(--semi-color-secondary);
}
.semi-button-group-line-tertiary {
  background-color: var(--semi-color-tertiary);
}
.semi-button-group-line-warning {
  background-color: var(--semi-color-warning);
}
.semi-button-group-line-danger {
  background-color: var(--semi-color-danger);
}
.semi-button-group-line-disabled {
  background-color: var(--semi-color-disabled-bg);
}
.semi-button-group-line-light {
  background-color: var(--semi-color-fill-0);
}
.semi-button-group-line-borderless {
  background-color: transparent;
}
.semi-button-group-line::before {
  display: block;
  content: "";
  width: 1px;
  height: 20px;
  background-color: var(--semi-color-border);
}

.semi-rtl .semi-button,
.semi-portal-rtl .semi-button {
  direction: rtl;
  padding-left: 12px;
  padding-right: 12px;
}
.semi-rtl .semi-button-size-small,
.semi-portal-rtl .semi-button-size-small {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-rtl .semi-button-size-large,
.semi-portal-rtl .semi-button-size-large {
  padding-left: 16px;
  padding-right: 16px;
}
.semi-rtl .semi-button-group,
.semi-portal-rtl .semi-button-group {
  direction: rtl;
}
.semi-rtl .semi-button-group > .semi-button,
.semi-portal-rtl .semi-button-group > .semi-button {
  padding-left: 0;
  padding-right: 0;
}
.semi-rtl .semi-button-group > .semi-button .semi-button-content,
.semi-portal-rtl .semi-button-group > .semi-button .semi-button-content {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-rtl .semi-button-group > .semi-button-size-large .semi-button-content,
.semi-portal-rtl .semi-button-group > .semi-button-size-large .semi-button-content {
  padding-left: 16px;
  padding-right: 16px;
}
.semi-rtl .semi-button-group > .semi-button-size-small .semi-button-content,
.semi-portal-rtl .semi-button-group > .semi-button-size-small .semi-button-content {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-rtl .semi-button-group > .semi-button.semi-button-with-icon-only,
.semi-portal-rtl .semi-button-group > .semi-button.semi-button-with-icon-only {
  padding-left: 0;
  padding-right: 0;
}
.semi-rtl .semi-button-group > .semi-button.semi-button-with-icon-only .semi-button-content,
.semi-portal-rtl .semi-button-group > .semi-button.semi-button-with-icon-only .semi-button-content {
  padding-left: 8px;
  padding-right: 8px;
}
.semi-rtl .semi-button-group > .semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content,
.semi-portal-rtl .semi-button-group > .semi-button.semi-button-with-icon-only.semi-button-size-small .semi-button-content {
  padding-left: 4px;
  padding-right: 4px;
}
.semi-rtl .semi-button-group > .semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content,
.semi-portal-rtl .semi-button-group > .semi-button.semi-button-with-icon-only.semi-button-size-large .semi-button-content {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-rtl .semi-button-group > .semi-button:first-child,
.semi-portal-rtl .semi-button-group > .semi-button:first-child {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  border-top-right-radius: var(--semi-border-radius-small);
  border-bottom-right-radius: var(--semi-border-radius-small);
}
.semi-rtl .semi-button-group > .semi-button:not(:last-child) .semi-button-content,
.semi-portal-rtl .semi-button-group > .semi-button:not(:last-child) .semi-button-content {
  border-left: 1px var(--semi-color-border) solid;
  border-right: 0;
}
.semi-rtl .semi-button-group > .semi-button:last-child,
.semi-portal-rtl .semi-button-group > .semi-button:last-child {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
  border-top-left-radius: var(--semi-border-radius-small);
  border-bottom-left-radius: var(--semi-border-radius-small);
}
.semi-rtl .semi-button.semi-button-with-icon-only,
.semi-portal-rtl .semi-button.semi-button-with-icon-only {
  padding-left: 8px;
  padding-right: 8px;
}
.semi-rtl .semi-button.semi-button-with-icon-only.semi-button-size-small,
.semi-portal-rtl .semi-button.semi-button-with-icon-only.semi-button-size-small {
  padding-left: 4px;
  padding-right: 4px;
}
.semi-rtl .semi-button.semi-button-with-icon-only.semi-button-size-large,
.semi-portal-rtl .semi-button.semi-button-with-icon-only.semi-button-size-large {
  padding-left: 12px;
  padding-right: 12px;
}
.semi-rtl .semi-button-content-left,
.semi-portal-rtl .semi-button-content-left {
  margin-left: 8px;
  margin-right: 0;
}
.semi-rtl .semi-button-content-right,
.semi-portal-rtl .semi-button-content-right {
  margin-right: 8px;
  margin-left: 0;
}

.semi-calendar-day ul,
.semi-calendar-day li,
.semi-calendar-week ul,
.semi-calendar-week li,
.semi-calendar-month ul,
.semi-calendar-month li {
  padding: 0;
  margin: 0;
  list-style: none;
}
.semi-calendar-day-sticky-top,
.semi-calendar-week-sticky-top,
.semi-calendar-month-sticky-top {
  position: sticky;
  position: -webkit-sticky;
  top: 0;
  left: 0;
  right: 0;
  background-color: var(--semi-color-bg-2);
  z-index: 20;
}
.semi-calendar-day .semi-calendar-weekend,
.semi-calendar-week .semi-calendar-weekend,
.semi-calendar-month .semi-calendar-weekend {
  background-color: var(--semi-color-fill-0);
}
.semi-calendar-day .semi-calendar-event-items,
.semi-calendar-week .semi-calendar-event-items,
.semi-calendar-month .semi-calendar-event-items {
  pointer-events: none;
}
.semi-calendar-day .semi-calendar-event-items > *,
.semi-calendar-week .semi-calendar-event-items > *,
.semi-calendar-month .semi-calendar-event-items > * {
  pointer-events: auto;
}
.semi-calendar-day .semi-calendar-event-items .semi-calendar-event-day,
.semi-calendar-week .semi-calendar-event-items .semi-calendar-event-day,
.semi-calendar-month .semi-calendar-event-items .semi-calendar-event-day {
  position: absolute;
  left: 0;
  right: 0;
  z-index: 5;
  overflow: hidden;
}
.semi-calendar-day .semi-calendar-custom-container,
.semi-calendar-week .semi-calendar-custom-container,
.semi-calendar-month .semi-calendar-custom-container {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

.semi-calendar-day,
.semi-calendar-week {
  overflow: auto;
}
.semi-calendar-day-sticky-left,
.semi-calendar-week-sticky-left {
  position: sticky;
  position: -webkit-sticky;
  left: 0;
  background-color: var(--semi-color-bg-2);
  z-index: 10;
}
.semi-calendar-day .semi-calendar-tag,
.semi-calendar-week .semi-calendar-tag {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  min-width: 70px;
  color: var(--semi-color-text-2);
}
.semi-calendar-day-scroll,
.semi-calendar-week-scroll {
  display: flex;
  flex: 1 1 auto;
  position: relative;
}
.semi-calendar-day .semi-calendar-grid,
.semi-calendar-week .semi-calendar-grid {
  display: flex;
  align-items: flex-start;
  flex: 1 1 auto;
  position: relative;
}
.semi-calendar-day .semi-calendar-grid-skeleton,
.semi-calendar-week .semi-calendar-grid-skeleton {
  position: relative;
  box-sizing: border-box;
}
.semi-calendar-day .semi-calendar-grid-skeleton li,
.semi-calendar-week .semi-calendar-grid-skeleton li {
  height: 30px;
}
.semi-calendar-day .semi-calendar-grid-skeleton li:last-child, .semi-calendar-day .semi-calendar-grid-skeleton li:nth-last-child(2),
.semi-calendar-week .semi-calendar-grid-skeleton li:last-child,
.semi-calendar-week .semi-calendar-grid-skeleton li:nth-last-child(2) {
  height: 0;
}
.semi-calendar-day .semi-calendar-grid-skeleton-row-line::after,
.semi-calendar-week .semi-calendar-grid-skeleton-row-line::after {
  content: "";
  border-bottom: 1px solid var(--semi-color-border);
  position: absolute;
  left: 0;
  right: 0;
  z-index: 3;
  pointer-events: none;
}
.semi-calendar-day .semi-calendar-grid-skeleton-row-line:first-child::after,
.semi-calendar-week .semi-calendar-grid-skeleton-row-line:first-child::after {
  border: 0;
}
.semi-calendar-day .semi-calendar-grid-content,
.semi-calendar-week .semi-calendar-grid-content {
  flex: 1 0 auto;
  min-width: 130px;
  height: 100%;
}
.semi-calendar-day .semi-calendar-grid-curr-circle,
.semi-calendar-week .semi-calendar-grid-curr-circle {
  background: var(--semi-color-danger);
  border-radius: var(--semi-border-radius-circle);
  content: "";
  position: absolute;
  height: 8px;
  width: 8px;
  margin-top: -4px;
  z-index: 8;
}
.semi-calendar-day .semi-calendar-grid-curr-line,
.semi-calendar-week .semi-calendar-grid-curr-line {
  position: absolute;
  left: 0;
  right: 0;
  z-index: 8;
  border-top: 1px solid var(--semi-color-danger);
  pointer-events: none;
}
.semi-calendar-day .semi-calendar-all-day,
.semi-calendar-week .semi-calendar-all-day {
  display: flex;
  flex: 1 1 auto;
  border-bottom: 1px solid var(--semi-color-border);
}
.semi-calendar-day .semi-calendar-all-day .semi-calendar-tag,
.semi-calendar-week .semi-calendar-all-day .semi-calendar-tag {
  text-align: right;
  padding-right: 8px;
}
.semi-calendar-day .semi-calendar-all-day .semi-calendar-tag span,
.semi-calendar-week .semi-calendar-all-day .semi-calendar-tag span {
  line-height: 26px;
}
.semi-calendar-day .semi-calendar-all-day-content,
.semi-calendar-week .semi-calendar-all-day-content {
  display: flex;
  flex: 1 0 auto;
  height: 100%;
  min-height: 26px;
  min-width: 130px;
}
.semi-calendar-day .semi-calendar-all-day .semi-calendar-event-items,
.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items {
  width: 100%;
}
.semi-calendar-day .semi-calendar-time,
.semi-calendar-week .semi-calendar-time {
  height: auto;
  display: flex;
  flex: none;
  align-items: flex-start;
  padding-right: 8px;
}
.semi-calendar-day .semi-calendar-time-item,
.semi-calendar-week .semi-calendar-time-item {
  position: relative;
  height: 60px;
  text-align: right;
}
.semi-calendar-day .semi-calendar-time-item span,
.semi-calendar-week .semi-calendar-time-item span {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  display: block;
  position: relative;
  top: -10px;
  color: var(--semi-color-text-2);
}
.semi-calendar-day .semi-calendar-time .semi-calendar-time-items,
.semi-calendar-week .semi-calendar-time .semi-calendar-time-items {
  position: relative;
  min-width: 70px;
  background-color: var(--semi-color-bg-2);
  box-sizing: border-box;
  margin-left: auto;
}

.semi-calendar-week .semi-calendar-today .semi-calendar-today-date,
.semi-calendar-month .semi-calendar-today .semi-calendar-today-date {
  width: 24px;
  height: 24px;
  line-height: 24px;
  text-align: center;
  border-radius: var(--semi-border-radius-circle);
  background-color: var(--semi-color-primary);
  color: var(--semi-color-bg-1);
}

.semi-calendar-day-scroll-wrapper {
  height: calc(100% - 28px);
}

.semi-calendar-week {
  position: relative;
  display: grid;
}
.semi-calendar-week-scroll-wrapper {
  height: calc(100% - 55px);
}
.semi-calendar-week .semi-calendar-grid-skeleton-row-line::after {
  left: 0;
}
.semi-calendar-week .semi-calendar-grid-skeleton li {
  border-right: 1px solid var(--semi-color-border);
}
.semi-calendar-week .semi-calendar-grid:last-child .semi-calendar-grid-content li {
  border-right: 0;
}
.semi-calendar-week-header, .semi-calendar-week-grid-row {
  display: flex;
  align-items: flex-start;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: var(--semi-color-text-2);
}
.semi-calendar-week-header {
  flex: 1 1 auto;
  border-bottom: 1px solid var(--semi-color-border);
}
.semi-calendar-week-grid {
  display: flex;
  flex: 1 0 auto;
}
.semi-calendar-week-grid-row {
  display: flex;
  flex: 1 0 auto;
}
.semi-calendar-week-grid-row li {
  display: flex;
  flex: 1 1 0;
  border-right: 1px solid transparent;
  height: auto;
  box-sizing: border-box;
  justify-content: center;
  align-items: center;
}
.semi-calendar-week-grid-row li > span {
  display: flex;
  align-items: center;
  justify-content: center;
  line-height: 26px;
}
.semi-calendar-week-grid-row li > span:last-child {
  padding: 0 4px;
}
.semi-calendar-week .semi-calendar-all-day {
  font-size: 26px;
}
.semi-calendar-week .semi-calendar-all-day-content {
  padding-left: 0;
  position: relative;
}
.semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton {
  display: flex;
  flex: 1 1 auto;
}
.semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li {
  flex: 1 1 auto;
  min-width: 130px;
  box-sizing: border-box;
  border-right: 1px solid var(--semi-color-border);
}
.semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li:last-child {
  border-right: 1px solid transparent;
}
.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items {
  position: absolute;
}
.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items .semi-calendar-event-allday {
  position: absolute;
}
.semi-calendar-week .semi-calendar-all-day .semi-calendar-event-items .semi-calendar-event-allday > * {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-calendar-week .semi-calendar-week-tag {
  text-align: right;
  line-height: 26px;
}
.semi-calendar-week .semi-calendar-week-tag:first-child {
  padding-right: 8px;
}

.semi-calendar-month {
  display: flex;
  flex-direction: column;
  height: 100%;
  overflow: hidden;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-calendar-month-grid-wrapper {
  height: calc(100% - 27px);
}
.semi-calendar-month-week, .semi-calendar-month-skeleton {
  height: 100%;
}
.semi-calendar-month-header {
  display: flex;
  flex: 1 1 auto;
  align-items: flex-start;
  color: var(--semi-color-text-2);
}
.semi-calendar-month-grid {
  flex: 1 1 auto;
  box-sizing: border-box;
}
.semi-calendar-month-grid li {
  line-height: 26px;
}
.semi-calendar-month-grid-row, .semi-calendar-month-skeleton {
  display: flex;
  box-sizing: border-box;
}
.semi-calendar-month-grid-row li, .semi-calendar-month-skeleton li {
  flex: 1;
  white-space: nowrap;
  text-align: right;
  padding-right: 8px;
  box-sizing: border-box;
  border-bottom: 1px solid var(--semi-color-border);
  color: var(--semi-color-text-2);
}
.semi-calendar-month-grid-row li span, .semi-calendar-month-skeleton li span {
  display: inline-block;
  text-align: right;
}
.semi-calendar-month-skeleton {
  position: absolute;
  overflow: hidden;
  left: 0;
  right: 0;
}
.semi-calendar-month-skeleton li {
  position: relative;
  overflow: hidden;
  border-right: 1px solid var(--semi-color-border);
  height: 100%;
  padding-top: 4px;
}
.semi-calendar-month-skeleton li span {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-calendar-month-skeleton li:last-child {
  border-right: none;
}
.semi-calendar-month-skeleton .semi-calendar-month-same {
  color: var(--semi-color-text-0);
}
.semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  display: block;
  position: absolute;
  right: 8px;
  padding-top: 2px;
  user-select: none;
}
.semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper:hover {
  cursor: pointer;
}
.semi-calendar-month .semi-calendar-event-items {
  position: absolute;
  top: 31px;
  right: 0;
  bottom: 20px;
  left: 0;
  overflow: hidden;
}
.semi-calendar-month-grid-col {
  display: flex;
  flex-direction: column;
  flex: 1;
  height: 100%;
}
.semi-calendar-month-weekrow {
  flex: 1 1 auto;
  position: relative;
}
.semi-calendar-month-weekrow .semi-calendar-event-items .semi-calendar-event-month {
  position: absolute;
  font-size: 24px;
  height: 1em;
  overflow: hidden;
}
.semi-calendar-month-weekrow .semi-calendar-event-items .semi-calendar-event-month > * {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-calendar-month-date {
  position: absolute;
  right: 4px;
  z-index: 3;
}

.semi-calendar-month-event-card {
  width: 220px;
}
.semi-calendar-month-event-card ul,
.semi-calendar-month-event-card li {
  padding: 0;
  margin: 0;
  list-style: none;
}
.semi-calendar-month-event-card-close {
  margin-right: -4px;
}
.semi-calendar-month-event-card-content {
  padding: 12px 0;
}
.semi-calendar-month-event-card-header {
  display: flex;
  flex-direction: row;
  margin: 12px 20px;
}
.semi-calendar-month-event-card-header-info {
  display: flex;
  flex: 1;
  flex-direction: column;
  align-items: center;
}
.semi-calendar-month-event-card-header-info-weekday {
  color: var(--semi-color-text-2);
}
.semi-calendar-month-event-card-header-info-date {
  font-size: 20px;
  line-height: 28px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  margin-top: 4px;
}
.semi-calendar-month-event-card-body {
  padding: 0 16px;
}
.semi-calendar-month-event-card-body li {
  height: 24px;
}

.semi-rtl .semi-calendar-day,
.semi-rtl .semi-calendar-week,
.semi-rtl .semi-calendar-month,
.semi-portal-rtl .semi-calendar-day,
.semi-portal-rtl .semi-calendar-week,
.semi-portal-rtl .semi-calendar-month {
  direction: rtl;
}
.semi-rtl .semi-calendar-day-sticky-left,
.semi-rtl .semi-calendar-week-sticky-left,
.semi-portal-rtl .semi-calendar-day-sticky-left,
.semi-portal-rtl .semi-calendar-week-sticky-left {
  left: auto;
  right: 0;
}
.semi-rtl .semi-calendar-day .semi-calendar-all-day .semi-calendar-tag,
.semi-rtl .semi-calendar-week .semi-calendar-all-day .semi-calendar-tag,
.semi-portal-rtl .semi-calendar-day .semi-calendar-all-day .semi-calendar-tag,
.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day .semi-calendar-tag {
  text-align: left;
  padding-right: 0;
  padding-left: 8px;
}
.semi-rtl .semi-calendar-day .semi-calendar-time,
.semi-rtl .semi-calendar-week .semi-calendar-time,
.semi-portal-rtl .semi-calendar-day .semi-calendar-time,
.semi-portal-rtl .semi-calendar-week .semi-calendar-time {
  padding-right: 0;
  padding-left: 8px;
}
.semi-rtl .semi-calendar-day .semi-calendar-time-item,
.semi-rtl .semi-calendar-week .semi-calendar-time-item,
.semi-portal-rtl .semi-calendar-day .semi-calendar-time-item,
.semi-portal-rtl .semi-calendar-week .semi-calendar-time-item {
  text-align: left;
}
.semi-rtl .semi-calendar-day .semi-calendar-time .semi-calendar-time-items,
.semi-rtl .semi-calendar-week .semi-calendar-time .semi-calendar-time-items,
.semi-portal-rtl .semi-calendar-day .semi-calendar-time .semi-calendar-time-items,
.semi-portal-rtl .semi-calendar-week .semi-calendar-time .semi-calendar-time-items {
  margin-left: 0;
  margin-right: auto;
}
.semi-rtl .semi-calendar-week .semi-calendar-grid-skeleton-row-line::after,
.semi-portal-rtl .semi-calendar-week .semi-calendar-grid-skeleton-row-line::after {
  left: 0;
  right: 0;
}
.semi-rtl .semi-calendar-week .semi-calendar-grid-skeleton li,
.semi-portal-rtl .semi-calendar-week .semi-calendar-grid-skeleton li {
  border-right: 0;
  border-left: 1px solid var(--semi-color-border);
}
.semi-rtl .semi-calendar-week .semi-calendar-grid:last-child .semi-calendar-grid-content li,
.semi-portal-rtl .semi-calendar-week .semi-calendar-grid:last-child .semi-calendar-grid-content li {
  border-left: 0;
}
.semi-rtl .semi-calendar-week .semi-calendar-all-day-content,
.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day-content {
  padding-left: auto;
  padding-right: 0;
}
.semi-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li,
.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li {
  border-right: 0;
  border-left: 1px solid var(--semi-color-border);
}
.semi-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li:last-child,
.semi-portal-rtl .semi-calendar-week .semi-calendar-all-day-content .semi-calendar-all-day-skeleton li:last-child {
  border-left: 1px solid transparent;
}
.semi-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag,
.semi-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag,
.semi-portal-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag,
.semi-portal-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag {
  text-align: left;
}
.semi-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag:first-child,
.semi-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag:first-child,
.semi-portal-rtl .semi-calendar-week .semi-rtl .semi-calendar-week-tag:first-child,
.semi-portal-rtl .semi-calendar-week .semi-portal-rtl .semi-calendar-week-tag:first-child {
  padding-right: auto;
  padding-left: 8px;
}
.semi-rtl .semi-calendar-month-grid-row li, .semi-rtl .semi-calendar-month-skeleton li,
.semi-portal-rtl .semi-calendar-month-grid-row li,
.semi-portal-rtl .semi-calendar-month-skeleton li {
  text-align: left;
  padding-right: auto;
  padding-left: 8px;
}
.semi-rtl .semi-calendar-month-grid-row li span, .semi-rtl .semi-calendar-month-skeleton li span,
.semi-portal-rtl .semi-calendar-month-grid-row li span,
.semi-portal-rtl .semi-calendar-month-skeleton li span {
  text-align: left;
}
.semi-rtl .semi-calendar-month-skeleton li,
.semi-portal-rtl .semi-calendar-month-skeleton li {
  border-right: 0;
  border-left: 1px solid var(--semi-color-border);
}
.semi-rtl .semi-calendar-month-skeleton li:last-child,
.semi-portal-rtl .semi-calendar-month-skeleton li:last-child {
  border-left: none;
}
.semi-rtl .semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper,
.semi-portal-rtl .semi-calendar-month-skeleton .semi-calendar-month-event-card-wrapper {
  right: auto;
  left: 8px;
}
.semi-rtl .semi-calendar-month-date,
.semi-portal-rtl .semi-calendar-month-date {
  right: auto;
  left: 4px;
}
.semi-rtl .semi-calendar-month-event-card-close,
.semi-portal-rtl .semi-calendar-month-event-card-close {
  margin-right: 0;
  margin-left: -4px;
}

.semi-card {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  border-radius: var(--semi-border-radius-medium);
  overflow: hidden;
  background-color: var(--semi-color-bg-0);
  font-size: 14px;
  font-style: normal;
  font-weight: 400;
  line-height: 20px;
  letter-spacing: 0em;
}
.semi-card-shadows {
  cursor: pointer;
  transition: box-shadow 300ms;
}
.semi-card-shadows-hover:hover {
  box-shadow: var(--semi-shadow-elevated);
  z-index: 1;
}
.semi-card-shadows-always {
  box-shadow: var(--semi-shadow-elevated);
}
.semi-card-bordered {
  border: 1px solid var(--semi-color-border);
}
.semi-card-header {
  padding: 20px;
}
.semi-card-header-bordered {
  border-bottom: 1px solid var(--semi-color-border);
}
.semi-card-header-wrapper {
  display: flex;
  align-items: flex-start;
  flex-direction: row-reverse;
  justify-content: space-between;
}
.semi-card-header-wrapper-spacing {
  margin-right: 20px;
}
.semi-card-header-wrapper-title {
  width: 100%;
  overflow: hidden;
}
.semi-card-header-wrapper-extra {
  flex-shrink: 0;
  font-size: 16px;
  font-style: normal;
  font-weight: 700;
  letter-spacing: 0em;
  color: var(--semi-color-text-0);
}
.semi-card-cover > * {
  display: block;
  width: 100%;
}
.semi-card-body {
  padding: 20px;
  font-size: 14px;
  font-style: normal;
  font-weight: 400;
  line-height: 20px;
  letter-spacing: 0em;
  color: var(--semi-color-text-1);
}
.semi-card-body-actions {
  margin-top: 20px;
  padding-top: 20px;
  border-top: 1px solid var(--semi-color-border);
}
.semi-card-footer {
  padding: 20px;
}
.semi-card-footer-bordered {
  border-top: 1px solid var(--semi-color-border);
}
.semi-card-meta {
  display: flex;
  align-items: center;
  justify-content: flex-start;
}
.semi-card-meta-avatar {
  margin-right: 12px;
}
.semi-card-meta-wrapper-title {
  font-size: 16px;
  font-style: normal;
  font-weight: 700;
  line-height: 22px;
  letter-spacing: 0em;
  color: var(--semi-color-text-0);
}
.semi-card-meta-wrapper-description {
  font-size: 14px;
  font-style: normal;
  font-weight: 400;
  line-height: 20px;
  letter-spacing: 0em;
  color: var(--semi-color-text-2);
}

.semi-card-group-grid .semi-card {
  border-radius: 0;
}
.semi-card-group-grid .semi-card {
  margin-left: -1px;
  margin-top: -1px;
}

.semi-rtl .semi-card,
.semi-portal-rtl .semi-card {
  direction: rtl;
}
.semi-rtl .semi-card-header-wrapper,
.semi-portal-rtl .semi-card-header-wrapper {
  align-items: flex-end;
}
.semi-rtl .semi-card-header-wrapper-title,
.semi-portal-rtl .semi-card-header-wrapper-title {
  display: flex;
  align-items: flex-end;
}
.semi-rtl .semi-card-header-wrapper-spacing,
.semi-portal-rtl .semi-card-header-wrapper-spacing {
  margin-left: 20px;
  margin-right: 0;
}
.semi-rtl .semi-card-meta-avatar,
.semi-portal-rtl .semi-card-meta-avatar {
  margin-left: 12px;
  margin-right: 0;
}
.semi-rtl .semi-card-group,
.semi-portal-rtl .semi-card-group {
  direction: rtl;
}
.semi-rtl .semi-card-group-grid .semi-card,
.semi-portal-rtl .semi-card-group-grid .semi-card {
  margin-left: 0;
  margin-top: 0;
  margin-right: -1px;
  margin-bottom: -1px;
}

.semi-carousel {
  position: relative;
  overflow: hidden;
}
.semi-carousel-content {
  width: 100%;
  height: 100%;
  overflow: hidden;
  position: relative;
}
.semi-carousel-content-item {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.semi-carousel-content-item-current {
  z-index: 1;
}
.semi-carousel-content-fade > * {
  opacity: 0;
}
.semi-carousel-content-fade .semi-carousel-content-item-current {
  opacity: 1;
}
.semi-carousel-content-slide > *:not(.semi-carousel-content-item-current) {
  visibility: hidden;
}
.semi-carousel-content-slide .semi-carousel-content-item-slide-out {
  display: block;
  animation: semi-carousel-content-item-keyframe-slide-out;
  animation-fill-mode: forwards;
}
.semi-carousel-content-slide .semi-carousel-content-item-slide-in {
  display: block;
  animation: semi-carousel-content-item-keyframe-slide-in;
  animation-fill-mode: forwards;
}
.semi-carousel-content-reverse .semi-carousel-content-item-slide-out {
  animation: semi-carousel-content-item-keyframe-slide-out-reverse;
  animation-fill-mode: forwards;
}
.semi-carousel-content-reverse .semi-carousel-content-item-slide-in {
  animation: semi-carousel-content-item-keyframe-slide-in-reverse;
  animation-fill-mode: forwards;
}
.semi-carousel-indicator {
  display: flex;
  align-items: flex-end;
  z-index: 2;
}
.semi-carousel-indicator-left {
  position: absolute;
  left: 32px;
  bottom: 32px;
}
.semi-carousel-indicator-center {
  position: absolute;
  left: 50%;
  bottom: 32px;
  transform: translate(-50%);
}
.semi-carousel-indicator-right {
  position: absolute;
  right: 32px;
  bottom: 32px;
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item {
  border-radius: 50%;
  cursor: pointer;
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item:not(:last-child) {
  margin-right: 8px;
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-small {
  width: 8px;
  height: 8px;
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-medium {
  width: 12px;
  height: 12px;
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary {
  background-color: rgba(var(--semi-blue-6), 0.4);
  transition: background-color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-blue-6), 1);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary:hover {
  background-color: rgba(var(--semi-blue-6), 0.7);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-primary:active {
  background: rgba(var(--semi-blue-6), 1);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-light {
  background-color: rgba(var(--semi-white), 0.4);
  transition: background-color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-light.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-white), 1);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-light:hover {
  background-color: rgba(var(--semi-white), 0.7);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-light:active {
  background: rgba(var(--semi-white), 1);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark {
  background-color: rgba(var(--semi-black), 0.5);
  transition: background-color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark.semi-carousel-indicator-item-active {
  background-color: rgba(var(--semi-black), 1);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark:hover {
  background-color: rgba(var(--semi-black), 0.7);
}
.semi-carousel-indicator-dot .semi-carousel-indicator-item-dark:active {
  background: rgba(var(--semi-black), 1);
}
.semi-carousel-indicator-line {
  width: 240px;
}
.semi-carousel-indicator-line .semi-carousel-indicator-item {
  flex: 1;
  cursor: pointer;
}
.semi-carousel-indicator-line .semi-carousel-indicator-item:not(:last-child) {
  margin-right: 4px;
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-small {
  height: 4px;
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-medium {
  height: 6px;
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-primary {
  background-color: rgba(var(--semi-blue-6), 0.4);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-primary.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-blue-6), 1);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-primary:hover {
  background-color: rgba(var(--semi-blue-6), 0.7);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-primary:active {
  background: rgba(var(--semi-blue-6), 1);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-light {
  background-color: rgba(var(--semi-white), 0.4);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-light.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-white), 1);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-light:hover {
  background-color: rgba(var(--semi-white), 0.7);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-light:active {
  background: rgba(var(--semi-white), 1);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-dark {
  background-color: rgba(var(--semi-black), 0.5);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-dark.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-black), 1);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-dark:hover {
  background-color: rgba(var(--semi-black), 0.7);
}
.semi-carousel-indicator-line .semi-carousel-indicator-item-dark:active {
  background: rgba(var(--semi-black), 1);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item {
  cursor: pointer;
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item:not(:last-child) {
  margin-right: 4px;
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-small {
  width: 4px;
  height: 12px;
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-small.semi-carousel-indicator-item-active {
  height: 20px;
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-medium {
  width: 6px;
  height: 20px;
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-medium.semi-carousel-indicator-item-active {
  height: 28px;
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary {
  background-color: rgba(var(--semi-blue-6), 0.4);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-blue-6), 1);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary:hover {
  background-color: rgba(var(--semi-blue-6), 0.7);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-primary:active {
  background: rgba(var(--semi-blue-6), 1);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light {
  background-color: rgba(var(--semi-white), 0.4);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-white), 1);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light:hover {
  background-color: rgba(var(--semi-white), 0.7);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-light:active {
  background: rgba(var(--semi-white), 1);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark {
  background-color: rgba(var(--semi-black), 0.5);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark.semi-carousel-indicator-item-active {
  background: rgba(var(--semi-black), 1);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark:hover {
  background-color: rgba(var(--semi-black), 0.7);
}
.semi-carousel-indicator-columnar .semi-carousel-indicator-item-dark:active {
  background: rgba(var(--semi-black), 1);
}
.semi-carousel-arrow {
  display: flex;
  font-size: 32px;
  cursor: pointer;
}
.semi-carousel-arrow-prev {
  position: absolute;
  top: 50%;
  left: 20px;
  transform: translateY(-50%);
  z-index: 2;
}
.semi-carousel-arrow-next {
  position: absolute;
  top: 50%;
  right: 20px;
  transform: translateY(-50%);
  z-index: 2;
}
.semi-carousel-arrow-light {
  color: rgba(var(--semi-white), 0.4);
  transition: color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none);
}
.semi-carousel-arrow-light:hover {
  color: rgba(var(--semi-white), 1);
}
.semi-carousel-arrow-primary {
  color: rgba(var(--semi-blue-6), 0.4);
  transition: color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none);
}
.semi-carousel-arrow-primary:hover {
  color: rgba(var(--semi-blue-6), 1);
}
.semi-carousel-arrow-dark {
  color: rgba(var(--semi-black), 0.5);
  transition: color var(--semi-transition_delay-none) var(--semi-transition_function-easeOut) var(--semi-transition_delay-none);
}
.semi-carousel-arrow-dark:hover {
  color: rgba(var(--semi-black), 1);
}
.semi-carousel-arrow-hover div {
  z-index: 2;
  opacity: 0;
}
.semi-carousel:hover .semi-carousel-arrow-hover div {
  opacity: 1;
}

@keyframes semi-carousel-content-item-keyframe-slide-in {
  from {
    transform: translateX(100%);
  }
  to {
    transform: translateX(0);
  }
}
@keyframes semi-carousel-content-item-keyframe-slide-out {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-100%);
  }
}
@keyframes semi-carousel-content-item-keyframe-slide-in-reverse {
  from {
    transform: translateX(-100%);
  }
  to {
    transform: translateX(0);
  }
}
@keyframes semi-carousel-content-item-keyframe-slide-out-reverse {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(100%);
  }
}
.semi-rtl .semi-carousel,
.semi-portal-rtl .semi-carousel {
  direction: rtl;
}
.semi-rtl .semi-carousel-indicator,
.semi-portal-rtl .semi-carousel-indicator {
  display: flex;
}
.semi-rtl .semi-carousel-indicator-dot .semi-carousel-indicator-item:not(:last-child),
.semi-portal-rtl .semi-carousel-indicator-dot .semi-carousel-indicator-item:not(:last-child) {
  margin-right: 0;
  margin-left: 8px;
}
.semi-rtl .semi-carousel-indicator-columnar .semi-carousel-indicator-item:not(:last-child),
.semi-portal-rtl .semi-carousel-indicator-columnar .semi-carousel-indicator-item:not(:last-child) {
  margin-right: 0;
  margin-left: 4px;
}
.semi-rtl .semi-carousel-arrow,
.semi-portal-rtl .semi-carousel-arrow {
  flex-direction: row-reverse;
}
.semi-rtl .semi-carousel-arrow-prev,
.semi-portal-rtl .semi-carousel-arrow-prev {
  left: auto;
  right: 20px;
  transform: scaleX(-1) translateY(-50%);
  z-index: 2;
}
.semi-rtl .semi-carousel-arrow-next,
.semi-portal-rtl .semi-carousel-arrow-next {
  left: 20px;
  transform: scaleX(-1) translateY(-50%);
  right: auto;
  z-index: 2;
}

.semi-cascader {
  box-sizing: border-box;
  border-radius: var(--semi-border-radius-small);
  border: 1px solid transparent;
  min-width: 80px;
  min-height: 32px;
  height: auto;
  line-height: 32px;
  font-weight: 400;
  background-color: var(--semi-color-fill-0);
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
  position: relative;
  cursor: pointer;
}
.semi-cascader:hover {
  background-color: var(--semi-color-fill-1);
  border: 1px transparent solid;
}
.semi-cascader:focus:not(.semi-cascader-disabled) {
  border: 1px solid var(--semi-color-focus-border);
  background-color: var(--semi-color-fill-0);
  outline: 0;
}
.semi-cascader:active {
  background-color: var(--semi-color-fill-2);
}
.semi-cascader-small {
  min-height: 24px;
  line-height: 24px;
}
.semi-cascader-large {
  min-height: 40px;
  line-height: 40px;
}
.semi-cascader-large .semi-cascader-selection {
  font-size: 16px;
  line-height: 22px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-cascader-focus {
  border: 1px solid var(--semi-color-focus-border);
  outline: 0;
}
.semi-cascader-focus:hover {
  background-color: var(--semi-color-fill-0);
  border: 1px solid var(--semi-color-focus-border);
}
.semi-cascader-focus:active {
  background-color: var(--semi-color-fill-2);
}
.semi-cascader-warning {
  background-color: var(--semi-color-warning-light-default);
  border-color: var(--semi-color-warning-light-default);
}
.semi-cascader-warning:hover {
  background-color: var(--semi-color-warning-light-hover);
  border-color: var(--semi-color-warning-light-hover);
}
.semi-cascader-warning.semi-cascader-focus {
  background-color: var(--semi-color-warning-light-default);
  border-color: var(--semi-color-warning);
}
.semi-cascader-warning:active {
  background-color: var(--semi-color-warning-light-active);
  border-color: var(--semi-color-warning-light-active);
}
.semi-cascader-error {
  background-color: var(--semi-color-danger-light-default);
  border-color: var(--semi-color-danger-light-default);
}
.semi-cascader-error:hover {
  background-color: var(--semi-color-danger-light-hover);
  border-color: var(--semi-color-danger-light-hover);
}
.semi-cascader-error.semi-cascader-focus {
  background-color: var(--semi-color-danger-light-default);
  border-color: var(--semi-color-danger);
}
.semi-cascader-error:active {
  background-color: var(--semi-color-danger-light-active);
  border-color: var(--semi-color-danger-light-active);
}
.semi-cascader-selection {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  height: 100%;
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  flex-grow: 1;
  overflow: hidden;
  padding-left: 12px;
  padding-right: 12px;
  cursor: pointer;
  color: var(--semi-color-text-0);
}
.semi-cascader-selection-multiple {
  padding-left: 4px;
  padding-right: 4px;
}
.semi-cascader-selection-placeholder {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  color: var(--semi-color-text-2);
}
.semi-cascader-selection-tag {
  margin: 1px 2px 1px 0;
}
.semi-cascader-selection-tag:first-child {
  margin-left: 0;
}
.semi-cascader-selection-tag-disabled.semi-tag {
  color: var(--semi-color-disabled-text);
  background-color: transparent;
  cursor: not-allowed;
}
.semi-cascader-selection-tag-disabled.semi-tag .semi-tag-close {
  color: var(--semi-color-disabled-text);
  cursor: not-allowed;
  pointer-events: none;
}
.semi-cascader-selection-n {
  cursor: pointer;
  font-size: 12px;
  margin-right: 4px;
  color: var(--semi-color-text-0);
  padding-left: 8px;
  padding-right: 8px;
}
.semi-cascader-selection-n-disabled {
  cursor: not-allowed;
  color: var(--semi-color-disabled-text);
}
.semi-cascader-selection span {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.semi-cascader-selection .semi-cascader-tagInput-wrapper {
  border: hidden;
  background: transparent;
  margin-left: -4px;
}
.semi-cascader-selection .semi-tagInput {
  min-height: 30px;
}
.semi-cascader-selection .semi-tagInput-small {
  min-height: 22px;
}
.semi-cascader-selection .semi-tagInput-large {
  min-height: 38px;
}
.semi-cascader-selection .semi-tagInput .semi-input-wrapper {
  margin-left: 4px;
}
.semi-cascader-selection .semi-tagInput .semi-input-wrapper .semi-input {
  padding-left: 0;
}
.semi-cascader-selection .semi-tagInput .semi-input-wrapper-default {
  margin-top: 1px;
  margin-bottom: 1px;
}
.semi-cascader-selection .semi-tagInput .semi-input-wrapper-large {
  margin-top: 1px;
  margin-bottom: 1px;
}
.semi-cascader-selection-text-inactive {
  color: var(--semi-color-text-2);
}
.semi-cascader-selection-text-hide {
  display: none;
}
.semi-cascader-arrow, .semi-cascader-clearbtn {
  display: inline-flex;
  align-items: center;
  height: 100%;
  justify-content: center;
  width: 16px;
  color: var(--semi-color-text-2);
  margin-right: 12px;
}
.semi-cascader-clearbtn:hover {
  color: var(--semi-color-primary-hover);
}
.semi-cascader-clearbtn:active {
  color: var(--semi-color-primary-active);
}
.semi-cascader-prefix, .semi-cascader-suffix {
  display: inline;
  display: flex;
  justify-content: center;
  align-items: center;
}
.semi-cascader-prefix-text, .semi-cascader-suffix-text {
  margin: 0 12px;
}
.semi-cascader-prefix-icon, .semi-cascader-suffix-icon {
  color: var(--semi-color-text-2);
  margin: 0 8px;
}
.semi-cascader-inset-label {
  display: inline;
  margin-right: 12px;
  font-weight: 600;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: var(--semi-color-text-2);
  flex-shrink: 0;
  white-space: nowrap;
}
.semi-cascader.semi-cascader-with-prefix {
  display: inline-flex;
  align-items: center;
}
.semi-cascader.semi-cascader-with-prefix .semi-cascader-selection {
  padding-left: 0;
}
.semi-cascader.semi-cascader-with-suffix .semi-cascader-selection {
  padding-right: 0;
}
.semi-cascader-disabled {
  cursor: not-allowed;
  user-select: none;
  background-color: var(--semi-color-disabled-fill);
}
.semi-cascader-disabled .semi-cascader-selection {
  cursor: not-allowed;
}
.semi-cascader-disabled:hover {
  background-color: var(--semi-color-disabled-fill);
}
.semi-cascader-disabled .semi-cascader-selection,
.semi-cascader-disabled .semi-cascader-selection-placeholder,
.semi-cascader-disabled .semi-cascader-prefix,
.semi-cascader-disabled .semi-cascader-suffix {
  color: var(--semi-color-disabled-text);
  cursor: not-allowed;
}
.semi-cascader-disabled .semi-cascader-arrow {
  color: var(--semi-color-disabled-text);
}

.semi-cascader-popover .semi-cascader-search-wrapper {
  padding: 8px 12px;
  border-bottom: 1px solid var(--semi-color-fill-0);
}
.semi-cascader-popover .semi-cascader-option-empty {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  min-width: 150px;
  color: var(--semi-color-disabled-text);
  margin: 0;
  padding: 8px 12px;
  user-select: none;
  text-align: center;
  cursor: not-allowed;
}

.semi-cascader-single.semi-cascader-filterable {
  display: inline-flex;
}
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper {
  width: 100%;
  height: 30px;
  display: flex;
  align-items: center;
  position: relative;
}
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper-small {
  height: 22px;
}
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper-large {
  height: 38px;
}
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper .semi-input-wrapper {
  position: absolute;
  top: 0;
  left: 0;
  border: none;
  background-color: transparent;
  height: 100%;
  width: 100%;
  border: none;
  background-color: transparent;
}
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper .semi-input-wrapper-focus {
  border: none;
}
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper .semi-input {
  padding-left: 0;
  padding-right: 0;
}

.semi-cascader-option-lists {
  display: flex;
  overflow: hidden;
  padding: 0;
  margin: 0;
  height: 180px;
}
.semi-cascader-option-lists-empty {
  height: auto;
}
.semi-cascader-option-lists ul,
.semi-cascader-option-lists li {
  list-style-type: none;
  padding: 0;
  margin: 0;
}
.semi-cascader-option-lists ul > li {
  padding-top: 8px;
  padding-bottom: 8px;
  padding-left: 12px;
  padding-right: 16px;
}
.semi-cascader-option-lists .semi-cascader-option-list {
  box-sizing: border-box;
  display: inline-block;
  min-width: 150px;
  height: 100%;
  margin: 0;
  padding: 4px 0px;
  overflow: auto;
  list-style: none;
  border-left: 1px solid var(--semi-color-fill-0);
}
.semi-cascader-option-lists .semi-cascader-option-list:first-child {
  border-left: none;
}
.semi-cascader-option-lists .semi-cascader-option {
  display: flex;
  align-items: center;
  justify-content: space-between;
  cursor: pointer;
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  min-width: min-content;
  word-break: break-all;
  color: var(--semi-color-text-0);
  position: relative;
}
.semi-cascader-option-lists .semi-cascader-option:hover {
  background-color: var(--semi-color-fill-0);
}
.semi-cascader-option-lists .semi-cascader-option:active {
  background-color: var(--semi-color-fill-1);
}
.semi-cascader-option-lists .semi-cascader-option-icon {
  display: inline-flex;
  flex-shrink: 0;
  width: 16px;
  color: var(--semi-color-text-2);
}
.semi-cascader-option-lists .semi-cascader-option-icon-active, .semi-cascader-option-lists .semi-cascader-option-icon-empty {
  margin-right: 8px;
}
.semi-cascader-option-lists .semi-cascader-option-icon-left {
  margin-left: 8px;
}
.semi-cascader-option-lists .semi-cascader-option-spin-icon {
  width: 16px;
  height: 16px;
  line-height: 0;
}
.semi-cascader-option-lists .semi-cascader-option-spin-icon svg {
  width: 16px;
  height: 16px;
}
.semi-cascader-option-lists .semi-cascader-option-label {
  display: flex;
  align-items: center;
  white-space: pre;
}
.semi-cascader-option-lists .semi-cascader-option-label-checkbox {
  margin-right: 8px;
}
.semi-cascader-option-lists .semi-cascader-option-hidden {
  display: none;
}
.semi-cascader-option-lists .semi-cascader-option-active {
  background-color: var(--semi-color-primary-light-default);
}
.semi-cascader-option-lists .semi-cascader-option-active:hover {
  background-color: var(--semi-color-primary-light-default);
}
.semi-cascader-option-lists .semi-cascader-option-select, .semi-cascader-option-lists .semi-cascader-option-label-highlight {
  font-weight: 600;
  color: var(--semi-color-primary);
}
.semi-cascader-option-lists .semi-cascader-option-disabled {
  cursor: not-allowed;
}
.semi-cascader-option-lists .semi-cascader-option-disabled:hover {
  background-color: transparent;
}
.semi-cascader-option-lists .semi-cascader-option-disabled:active {
  background-color: transparent;
}
.semi-cascader-option-lists .semi-cascader-option-disabled .semi-cascader-option-label {
  color: var(--semi-color-disabled-text);
}
.semi-cascader-option-lists .semi-cascader-option-flatten {
  padding-right: 64px;
}

.semi-cascader-borderless:not(:focus-within):not(:hover) {
  background-color: transparent;
  border-color: transparent;
}
.semi-cascader-borderless:not(:focus-within):not(:hover) .semi-cascader-arrow {
  opacity: 0;
}
.semi-cascader-borderless:focus-within:not(:active) {
  background-color: transparent;
}
.semi-cascader-borderless.semi-cascader-error:not(:focus-within) {
  border-color: var(--semi-color-danger);
}
.semi-cascader-borderless.semi-cascader-warning:not(:focus-within) {
  border-color: var(--semi-color-warning);
}
.semi-cascader-borderless.semi-cascader-error:focus-within {
  border-color: var(--semi-color-danger);
}
.semi-cascader-borderless.semi-cascader-warning:focus-within {
  border-color: var(--semi-color-warning);
}

.semi-rtl .semi-cascader,
.semi-portal-rtl .semi-cascader {
  direction: rtl;
}
.semi-rtl .semi-cascader-arrow, .semi-rtl .semi-cascader-clearbtn,
.semi-portal-rtl .semi-cascader-arrow,
.semi-portal-rtl .semi-cascader-clearbtn {
  margin-right: 0;
  margin-left: 12px;
}
.semi-rtl .semi-cascader-inset-label,
.semi-portal-rtl .semi-cascader-inset-label {
  margin-right: 12px;
  margin-left: 12px;
}
.semi-rtl .semi-cascader.semi-cascader-with-prefix .semi-cascader-selection,
.semi-portal-rtl .semi-cascader.semi-cascader-with-prefix .semi-cascader-selection {
  padding-left: auto;
  padding-right: 0;
}
.semi-rtl .semi-cascader.semi-cascader-with-suffix .semi-cascader-selection,
.semi-portal-rtl .semi-cascader.semi-cascader-with-suffix .semi-cascader-selection {
  padding-right: auto;
  padding-left: 0;
}
.semi-rtl .semi-cascader-selection-multiple,
.semi-portal-rtl .semi-cascader-selection-multiple {
  padding-right: 4px;
  padding-left: 4px;
}
.semi-rtl .semi-cascader-selection-tag:first-child,
.semi-portal-rtl .semi-cascader-selection-tag:first-child {
  margin-right: 0;
}
.semi-rtl .semi-cascader-selection-n,
.semi-portal-rtl .semi-cascader-selection-n {
  margin-right: 0;
  margin-left: 4px;
}
.semi-rtl .semi-cascader-selection .semi-cascader-tagInput-wrapper,
.semi-portal-rtl .semi-cascader-selection .semi-cascader-tagInput-wrapper {
  margin-left: 0;
  margin-right: -4px;
}
.semi-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper,
.semi-portal-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper {
  margin-left: 0;
  margin-right: 4px;
}
.semi-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper .semi-input,
.semi-portal-rtl .semi-cascader-selection .semi-tagInput .semi-input-wrapper .semi-input {
  padding-right: 0;
}

.semi-cascader-option-label-checkbox {
  margin-right: 0;
  margin-left: 8px;
}

.semi-cascader-option-lists-rtl {
  direction: rtl;
}
.semi-cascader-option-lists .semi-cascader-option-lists-rtl ul > li {
  padding-right: 12px;
  padding-left: auto;
}
.semi-cascader-option-lists .semi-cascader-option-lists-rtl .semi-cascader-option-list {
  border-left: 0;
  border-right: 1px solid var(--semi-color-fill-0);
}
.semi-cascader-option-lists .semi-cascader-option-lists-rtl .semi-cascader-option-list:first-child {
  border-right: none;
}
.semi-cascader-option-lists .semi-cascader-option-lists-rtl .semi-cascader-option-icon-active, .semi-cascader-option-lists .semi-cascader-option-lists-rtl .semi-cascader-option-icon-empty {
  margin-right: 0;
  margin-left: 8px;
}
.semi-cascader-option-lists .semi-cascader-option-lists-rtl .semi-cascader-option-flatten {
  padding-right: 0;
  padding-left: 64px;
}
.semi-cascader-option-lists .semi-cascader-option-lists-rtl .semi-cascader-option .semi-icon-chevron_right {
  transform: scaleX(-1);
}

.semi-checkbox {
  box-sizing: border-box;
  position: relative;
  display: flex;
  align-items: flex-start;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  cursor: pointer;
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  transform: scale(var(--semi-transform_scale-none));
  column-gap: 8px;
}
.semi-checkbox input[type=checkbox] {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
}
.semi-checkbox-content {
  flex: 1;
  display: flex;
  flex-direction: column;
  row-gap: 4px;
}
.semi-checkbox-addon {
  display: flex;
  flex: 1;
  align-items: center;
  color: var(--semi-color-text-0);
  line-height: 20px;
  user-select: none;
}
.semi-checkbox:hover .semi-checkbox-inner-display {
  background: var(--semi-color-fill-0);
  box-shadow: inset 0 0 0 1px var(--semi-color-focus-border);
}
.semi-checkbox:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  background: var(--semi-color-primary-hover);
  box-shadow: none;
}
.semi-checkbox:active .semi-checkbox-inner-display {
  background: var(--semi-color-fill-1);
}
.semi-checkbox:active .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  background: var(--semi-color-primary-active);
  box-shadow: none;
}
.semi-checkbox.semi-checkbox-disabled:hover .semi-checkbox-inner-display, .semi-checkbox.semi-checkbox-disabled:active .semi-checkbox-inner-display {
  background: var(--semi-color-disabled-fill);
  box-shadow: inset 0 0 0 1px var(--semi-color-border);
}
.semi-checkbox.semi-checkbox-disabled:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display, .semi-checkbox.semi-checkbox-disabled:active .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  background: var(--semi-color-primary-disabled);
  box-shadow: none;
}
.semi-checkbox-inner {
  position: relative;
  display: flex;
  align-items: center;
  width: 16px;
  height: 20px;
  user-select: none;
  cursor: pointer;
}
.semi-checkbox-inner-display {
  box-sizing: border-box;
  position: relative;
  width: 16px;
  height: 16px;
  margin: 0;
  background: transparent;
  transition: background-color var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none), border var(--semi-transition_duration-none) var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
  box-shadow: inset 0 0 0 1px var(--semi-color-text-3);
  border-radius: var(--semi-border-radius-extra-small);
}
.semi-checkbox-inner-display .semi-icon {
  font-size: 16px;
}
.semi-checkbox-inner-checked .semi-checkbox-inner-display {
  background: var(--semi-color-primary);
  color: var(--semi-color-white);
  box-shadow: inset 0 0 0 1px var(--semi-color-primary);
  border-radius: var(--semi-border-radius-extra-small);
}
.semi-checkbox-inner-checked > .semi-checkbox-addon {
  color: var(--semi-color-text-0);
}
.semi-checkbox:hover .semi-checkbox-inner-display {
  background: var(--semi-color-fill-0);
}
.semi-checkbox:hover.semi-checkbox-indeterminate .semi-checkbox-inner-display {
  background: var(--semi-color-primary-hover);
  box-shadow: none;
  color: var(--semi-color-white);
}
.semi-checkbox:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  background: var(--semi-color-primary-hover);
  border-color: var(--semi-color-primary-hover);
  color: var(--semi-color-white);
}
.semi-checkbox:hover.semi-checkbox-cardType.semi-checkbox-unChecked.semi-checkbox-cardType_unDisabled .semi-checkbox-inner-display {
  background: var(--semi-color-white);
}
.semi-checkbox:active .semi-checkbox-inner-display {
  background: var(--semi-color-fill-1);
}
.semi-checkbox:active.semi-checkbox-indeterminate .semi-checkbox-inner-display {
  background: var(--semi-color-primary-active);
  border-color: var(--semi-color-primary-active);
  color: var(--semi-color-white);
  box-shadow: none;
}
.semi-checkbox:active .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  background: var(--semi-color-primary-active);
  border-color: var(--semi-color-primary-active);
  color: var(--semi-color-white);
}
.semi-checkbox:active.semi-checkbox-cardType.semi-checkbox-unChecked.semi-checkbox-cardType_unDisabled .semi-checkbox-inner-display {
  background: var(--semi-color-white);
}
.semi-checkbox-cardType {
  flex-wrap: nowrap;
  align-items: flex-start;
  border-radius: 3px;
  padding: 12px 16px;
  background: transparent;
  border: 1px solid transparent;
}
.semi-checkbox-cardType .semi-checkbox-inner {
  position: relative;
  flex-shrink: 0;
}
.semi-checkbox-cardType .semi-checkbox-inner-display {
  background: var(--semi-color-white);
}
.semi-checkbox-cardType .semi-checkbox-inner-pureCardType {
  opacity: 0;
  width: 0;
}
.semi-checkbox-cardType .semi-checkbox-addon {
  font-weight: 600;
  font-size: 14px;
  line-height: 20px;
  color: var(--semi-color-text-0);
}
.semi-checkbox-cardType .semi-checkbox-extra {
  font-weight: normal;
  font-size: 14px;
  line-height: 20px;
  color: var(--semi-color-text-2);
}
.semi-checkbox-cardType .semi-checkbox-extra.semi-checkbox-cardType_extra_noChildren {
  margin-top: 0;
}
.semi-checkbox-cardType:hover {
  background: var(--semi-color-fill-0);
}
.semi-checkbox-cardType:active {
  background: var(--semi-color-fill-1);
}
.semi-checkbox-cardType_checked {
  background: var(--semi-color-primary-light-default);
  border: 1px solid var(--semi-color-primary);
}
.semi-checkbox-cardType_checked:hover {
  background: var(--semi-color-primary-light-default);
  border-color: var(--semi-color-primary-hover);
}
.semi-checkbox-cardType_checked:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  box-shadow: none;
}
.semi-checkbox-cardType_checked:active {
  background: var(--semi-color-primary-light-default);
  border-color: var(--semi-color-primary-active);
}
.semi-checkbox-cardType_disabled:active {
  background: transparent;
}
.semi-checkbox-cardType_disabled:hover {
  background: transparent;
}
.semi-checkbox-cardType_checked_disabled.semi-checkbox-cardType {
  background: var(--semi-color-primary-light-default);
  border: 1px solid var(--semi-color-primary-disabled);
}
.semi-checkbox-cardType_checked_disabled.semi-checkbox-cardType:hover .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  box-shadow: none;
}
.semi-checkbox-indeterminate .semi-checkbox-inner-display, .semi-checkbox-checked .semi-checkbox-inner-display {
  background: var(--semi-color-primary);
  color: var(--semi-color-white);
  box-shadow: inset 0 0 0 1px var(--semi-color-primary);
  border-radius: var(--semi-border-radius-extra-small);
}
.semi-checkbox-indeterminate .semi-checkbox-inner-display:hover, .semi-checkbox-checked .semi-checkbox-inner-display:hover {
  background: var(--semi-color-primary-hover);
  border-color: var(--semi-color-primary-hover);
  color: var(--semi-color-white);
}
.semi-checkbox-indeterminate .semi-checkbox-inner-display:active, .semi-checkbox-checked .semi-checkbox-inner-display:active {
  background: var(--semi-color-primary-active);
  border-color: var(--semi-color-primary-active);
  color: var(--semi-color-white);
}
.semi-checkbox-indeterminate .semi-checkbox-inner-addon, .semi-checkbox-checked .semi-checkbox-inner-addon {
  color: var(--semi-color-text-0);
}
.semi-checkbox-disabled {
  cursor: not-allowed;
}
.semi-checkbox-disabled .semi-checkbox-inner {
  cursor: not-allowed;
}
.semi-checkbox-disabled .semi-checkbox-inner-display {
  color: var(--semi-color-white);
  background: var(--semi-color-disabled-fill);
  box-shadow: inset 0 0 0 1px var(--semi-color-border);
}
.semi-checkbox-disabled .semi-checkbox-inner-display:hover {
  color: var(--semi-color-white);
  background: transparent;
}
.semi-checkbox-disabled .semi-checkbox-inner-checked {
  color: var(--semi-color-white);
}
.semi-checkbox-disabled .semi-checkbox-inner-checked .semi-checkbox-inner-display {
  opacity: 0.75;
  background: var(--semi-color-primary-disabled);
  box-shadow: inset 0 0 0 1px var(--semi-color-primary-disabled);
}
.semi-checkbox-disabled .semi-checkbox-inner-checked .semi-checkbox-inner-display:hover {
  color: var(--semi-color-white);
  background: var(--semi-color-primary-disabled);
}
.semi-checkbox-disabled .semi-checkbox-addon {
  color: var(--semi-color-disabled-text);
}
.semi-checkbox-disabled .semi-checkbox-extra {
  color: var(--semi-color-disabled-text);
}
.semi-checkbox.semi-checkbox-disabled.semi-checkbox-indeterminate .semi-checkbox-inner-display {
  opacity: 0.75;
  background: var(--semi-color-primary-disabled);
  box-shadow: inset 0 0 0 1px var(--semi-color-primary-disabled);
  color: var(--semi-color-white);
}
.semi-checkbox-extra {
  flex-shrink: 0;
  flex-grow: 1;
  flex-basis: 100%;
  box-sizing: border-box;
  color: var(--semi-color-text-2);
}
.semi-checkbox-focus {
  outline: 2px solid var(--semi-color-primary-light-active);
}
.semi-checkbox-focus-border {
  box-shadow: inset 0 0 0 1px var(--semi-color-focus-border);
}

.semi-checkboxGroup {
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  line-height: 14px;
}
.semi-checkboxGroup .semi-checkbox.semi-checkbox-vertical {
  margin-bottom: 16px;
}
.semi-checkboxGroup-horizontal {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}
.semi-checkboxGroup-horizontal .semi-checkbox {
  display: inline-flex;
}
.semi-checkboxGroup-vertical {
  display: flex;
  flex-direction: column;
  row-gap: 12px;
}
.semi-checkboxGroup-vertical-cardType {
  row-gap: 16px;
}
.semi-checkboxGroup-vertical-pureCardType .semi-checkbox {
  column-gap: 0;
}

.semi-rtl .semi-checkbox,
.semi-portal-rtl .semi-checkbox {
  direction: rtl;
}
.semi-rtl .semi-checkbox input[type=checkbox],
.semi-portal-rtl .semi-checkbox input[type=checkbox] {
  left: auto;
  right: 0;
}
.semi-rtl .semi-checkboxGroup,
.semi-portal-rtl .semi-checkboxGroup {
  direction: rtl;
}

.semi-collapse-item {
  border-bottom: 1px solid var(--semi-color-border);
}
.semi-collapse-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin: 4px 8px;
  padding: 8px;
  border-radius: var(--semi-border-radius-small);
  outline: none;
  cursor: pointer;
  color: var(--semi-color-text-0);
  font-weight: 600;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-collapse-header-right {
  display: flex;
  align-items: center;
}
.semi-collapse-header-right span {
  display: flex;
  padding-right: 8px;
}
.semi-collapse-header-right span:last-child {
  padding-right: 0;
}
.semi-collapse-header-icon {
  width: 16px;
  height: 16px;
  color: var(--semi-color-text-2);
}
.semi-collapse-header-iconLeft {
  justify-content: flex-start;
}
.semi-collapse-header-iconLeft .semi-collapse-header-icon {
  margin-right: 8px;
}
.semi-collapse-header-iconDisabled {
  color: var(--semi-color-disabled-text);
}
.semi-collapse-header:hover {
  background-color: var(--semi-color-fill-0);
}
.semi-collapse-header:active {
  background-color: var(--semi-color-fill-1);
}
.semi-collapse-header-disabled {
  color: var(--semi-color-disabled-text);
}
.semi-collapse-header-disabled:hover {
  background-color: transparent;
}
.semi-collapse-content {
  padding: 4px 16px 8px 16px;
  color: var(--semi-color-text-1);
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.semi-collapse-content p {
  margin: 0;
}

.semi-rtl .semi-collapse,
.semi-portal-rtl .semi-collapse {
  direction: rtl;
}
.semi-rtl .semi-collapse-header-right span,
.semi-portal-rtl .semi-collapse-header-right span {
  display: flex;
  padding-right: 0;
  padding-left: 8px;
}
.semi-rtl .semi-collapse-header-right span:last-child,
.semi-portal-rtl .semi-collapse-header-right span:last-child {
  padding-right: 0;
  padding-left: 0;
}

.semi-collapsible-transition {
  transition: height 250ms cubic-bezier(0.25, 0.1, 0.25, 1) var(--semi-transition_delay-none), opacity 250ms var(--semi-transition_function-easeIn) var(--semi-transition_delay-none);
}

.semi-datepicker {
  box-sizing: border-box;
  display: inline-block;
}
.semi-datepicker .semi-scrolllist-body .semi-scrolllist-item {
  -ms-overflow-style: none; /* Internet Explorer 10+ */
  scrollbar-width: none; /* Firefox */
}
.semi-datepicker .semi-scrolllist-body .semi-scrolllist-item::-webkit-scrollbar {
  display: none;
  width: 0;
  height: 0;
}
.semi-datepicker .semi-scrolllist-body .semi-scrolllist-list-outer {
  -ms-overflow-style: none; /* Internet Explorer 10+ */
  scrollbar-width: none; /* Firefox */
}
.semi-datepicker .semi-scrolllist-body .semi-scrolllist-list-outer::-webkit-scrollbar {
  display: none;
  width: 0;
  height: 0;
}
.semi-datepicker-month-grid {
  user-select: none;
  display: flex;
}
.semi-datepicker-month-grid-left, .semi-datepicker-month-grid-right {
  position: relative;
  padding: 0;
  display: inline-flex;
  flex-direction: column;
  justify-content: flex-start;
}
.semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam, .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-yam {
  height: 100%;
}
.semi-datepicker-month-grid[x-type=dateTime] .semi-datepicker-yam, .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-yam {
  height: calc(100% - 54px);
}
.semi-datepicker-month-grid .semi-datepicker-yam-showing {
  min-height: 378px;
  min-width: 284px;
}
.semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam-showing {
  min-height: 325px;
}
.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=year],
.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=year] {
  min-height: 317px;
}
.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-left[x-open-type=time],
.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-month-grid-right[x-open-type=time] {
  min-height: 317px;
}
.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-navigation {
  padding-top: 8px;
  padding-bottom: 8px;
}
.semi-datepicker-month-grid[x-insetinput=true] .semi-datepicker-tpk {
  min-height: 100%;
}
.semi-datepicker-month-grid[x-insetinput=true][x-type=dateTime] .semi-datepicker-yam, .semi-datepicker-month-grid[x-insetinput=true][x-type=dateTimeRange] .semi-datepicker-yam {
  height: 100%;
}
.semi-datepicker-month-grid[x-preset-position=left][x-insetinput=false] .semi-datepicker-month, .semi-datepicker-month-grid[x-preset-position=right][x-insetinput=false] .semi-datepicker-month {
  height: 253px;
}
.semi-datepicker-month-grid .semi-datepicker-yearmonth-header {
  background: var(--semi-color-bg-3);
  padding: 12px 16px;
  border-bottom: 1px solid var(--semi-color-border);
  border-radius: var(--semi-border-radius-medium) var(--semi-border-radius-medium) 0 0;
  display: flex;
  align-items: center;
}
.semi-datepicker-month-grid .semi-scrolllist {
  background: var(--semi-color-bg-3);
  position: relative;
  box-shadow: none;
  height: auto;
  width: 100%;
  height: 100%;
  overflow: hidden;
  flex: 1;
}
.semi-datepicker-month-grid .semi-scrolllist-header, .semi-datepicker-month-grid .semi-scrolllist-body {
  box-sizing: border-box;
  width: 100%;
}
.semi-datepicker-month-grid .semi-scrolllist-header {
  border-bottom: 1px solid var(--semi-color-border);
  padding: 16px;
}
.semi-datepicker-month-grid .semi-scrolllist-body {
  height: 100%;
  overflow: hidden;
  padding: 0;
  flex: 1;
}
.semi-datepicker-month-grid .semi-scrolllist-line {
  display: none;
}
.semi-datepicker-month-grid .semi-scrolllist-header-title {
  padding: 0;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  min-height: 24px;
  line-height: 24px;
}
.semi-datepicker-month-grid[x-panel-yearandmonth-open-type=left] .semi-datepicker-weeks, .semi-datepicker-month-grid[x-panel-yearandmonth-open-type=right] .semi-datepicker-weeks {
  min-height: 216px;
}
.semi-datepicker-panel-yam {
  max-width: 484px;
}
.semi-datepicker-panel-yam[x-type=monthRange] {
  max-width: 584px;
}
.semi-datepicker-panel-yam .semi-datepicker-yearmonth-body {
  display: flex;
}
.semi-datepicker-panel-yam .semi-datepicker-yearmonth-body .semi-scrolllist:nth-child(2) {
  border-left: 1px solid var(--semi-color-border);
}
.semi-datepicker-panel-yam .semi-scrolllist {
  box-shadow: none;
  height: 266px;
}
.semi-datepicker-panel-yam .semi-scrolllist-list-outer > ul > li {
  min-width: 64px;
}
.semi-datepicker-panel-yam .semi-scrolllist-item > ul > li {
  min-width: 82px;
}
.semi-datepicker-panel-yam .semi-scrolllist-body {
  padding: 0;
  overflow: hidden;
}
.semi-datepicker-panel-yam .semi-scrolllist-body .semi-scrolllist-item-wheel:not(#neverExistElement) {
  border: none;
}
.semi-datepicker-footer {
  padding-top: 10px;
  padding-right: 8px;
  padding-bottom: 10px;
  text-align: right;
  background-color: var(--semi-color-fill-0);
}
.semi-datepicker-footer .semi-button:first-of-type {
  margin-right: 12px;
}
.semi-datepicker-footer .semi-button:nth-of-type(2) {
  margin-right: 8px;
}
.semi-datepicker-yam {
  position: absolute;
  top: 0;
  width: 100%;
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
}
.semi-datepicker-tpk {
  position: absolute;
  top: 0;
  height: calc(100% - 54px);
  width: 100%;
  display: flex;
  flex-direction: column;
}
.semi-datepicker-tpk .semi-datepicker-time {
  height: 100%;
}
.semi-datepicker-navigation {
  display: flex;
  align-items: center;
  box-sizing: content-box;
  height: 32px;
  padding: 12px 16px;
}
.semi-datepicker-navigation-left, .semi-datepicker-navigation-right {
  width: 32px;
  height: 32px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.semi-datepicker-navigation .semi-button {
  color: var(--semi-color-text-2);
  min-width: 32px;
}
.semi-datepicker-navigation-month {
  font-size: 16px;
  line-height: 22px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  flex-grow: 1;
  text-align: center;
  font-weight: 600;
  color: var(--semi-color-text-0);
}
.semi-datepicker-navigation-month .semi-button {
  color: var(--semi-color-text-0);
}
.semi-datepicker-month {
  width: 252px;
  box-sizing: content-box;
  padding: 16px;
  padding-top: 0;
}
.semi-datepicker-weekday {
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-weight: 600;
  color: var(--semi-color-text-2);
  border-bottom: 1px solid var(--semi-color-border);
}
.semi-datepicker-weekday-item {
  width: 36px;
  height: 36px;
  line-height: 36px;
  text-align: center;
  display: inline-block;
}
.semi-datepicker-weeks {
  color: var(--semi-color-text-0);
}
.semi-datepicker-week {
  display: flex;
  align-items: center;
}
.semi-datepicker-day {
  box-sizing: border-box;
  display: inline-block;
  width: 36px;
  height: 36px;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}
.semi-datepicker-day-main {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 32px;
  height: 32px;
  margin: 0 auto;
  box-sizing: border-box;
  border-radius: var(--semi-border-radius-small);
}
.semi-datepicker-day-main:hover {
  background-color: var(--semi-color-fill-0);
}
.semi-datepicker-day-main:active {
  background-color: var(--semi-color-fill-1);
}
.semi-datepicker-day-today .semi-datepicker-day-main {
  color: var(--semi-color-primary);
  background-color: var(--semi-color-fill-0);
  font-weight: 600;
}
.semi-datepicker-day-today.semi-datepicker-day-disabled .semi-datepicker-day-main {
  color: var(--semi-color-primary-disabled);
}
.semi-datepicker-day-inrange .semi-datepicker-day-main, .semi-datepicker-day-inhover .semi-datepicker-day-main, .semi-datepicker-day-inoffsetrange .semi-datepicker-day-main, .semi-datepicker-day-hoverday .semi-datepicker-day-main, .semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main, .semi-datepicker-day-hoverday-around-singleselected .semi-datepicker-day-main {
  border-radius: 0;
  margin-left: 0;
  margin-right: 0;
  width: 36px;
}
.semi-datepicker-day-selected .semi-datepicker-day-main {
  border-radius: var(--semi-border-radius-small);
}
.semi-datepicker-day-selected-start.semi-datepicker-day-selected-end .semi-datepicker-day-main, .semi-datepicker-day-offsetrange-start.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main {
  border-radius: var(--semi-border-radius-small);
}
.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main {
  border-radius: var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small);
}
.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main {
  border-radius: 0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;
}
.semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main {
  border-radius: var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small);
}
.semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main {
  border-radius: 0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;
}
.semi-datepicker-day-selected-start .semi-datepicker-day-main, .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main {
  width: 34px;
  margin-left: 2px;
  margin-right: 0;
  border-radius: var(--semi-border-radius-small) 0 0 var(--semi-border-radius-small);
}
.semi-datepicker-day-selected-end .semi-datepicker-day-main, .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main {
  width: 34px;
  margin-right: 2px;
  margin-left: 0;
  border-radius: 0 var(--semi-border-radius-small) var(--semi-border-radius-small) 0;
}
.semi-datepicker-day-hoverday-inrange .semi-datepicker-day-main {
  border-radius: 0;
}
.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main, .semi-datepicker-day-offsetrange-start .semi-datepicker-day-main, .semi-datepicker-day-offsetrange-end .semi-datepicker-day-main {
  background-color: var(--semi-color-fill-0);
}
.semi-datepicker-day-hoverday .semi-datepicker-day-main, .semi-datepicker-day-hoverday-offset .semi-datepicker-day-main {
  background-color: var(--semi-color-fill-1);
}
.semi-datepicker-day-inrange .semi-datepicker-day-main, .semi-datepicker-day-inhover .semi-datepicker-day-main {
  background-color: var(--semi-color-primary-light-default);
}
.semi-datepicker-day-hoverday-inrange .semi-datepicker-day-main, .semi-datepicker-day-hoverday-beforerange .semi-datepicker-day-main, .semi-datepicker-day-hoverday-afterrange .semi-datepicker-day-main {
  background-color: var(--semi-color-primary-light-active);
}
.semi-datepicker-day-hoverday-around-singleselected .semi-datepicker-day-main {
  background-color: var(--semi-color-primary-light-active);
}
.semi-datepicker-day-selected .semi-datepicker-day-main, .semi-datepicker-day-selected-start .semi-datepicker-day-main, .semi-datepicker-day-selected-end .semi-datepicker-day-main {
  background-color: var(--semi-color-primary);
  color: var(--semi-color-white);
}
.semi-datepicker-day-selected .semi-datepicker-day-main:hover, .semi-datepicker-day-selected-start .semi-datepicker-day-main:hover, .semi-datepicker-day-selected-end .semi-datepicker-day-main:hover {
  background-color: var(--semi-color-primary);
}
.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main {
  background-color: var(--semi-color-primary-light-hover);
}
.semi-datepicker-day-selected-start-afterhover .semi-datepicker-day-main, .semi-datepicker-day-selected-end-beforehover .semi-datepicker-day-main {
  border: 1px solid var(--semi-color-primary-active);
}
.semi-datepicker-day-disabled {
  cursor: not-allowed;
  color: var(--semi-color-disabled-text);
}
.semi-datepicker-day-disabled .semi-datepicker-day-main:hover {
  background-color: transparent;
}
.semi-datepicker-day-disabled .semi-datepicker-day-main:active {
  background-color: transparent;
}
.semi-datepicker-day-disabled.semi-datepicker-day-selected .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-selected-start .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-selected-end .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-inhover .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-inrange .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-inoffsetrange .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-hoverday .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-hoverday-offset .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-offsetrange-start .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-offsetrange-end .semi-datepicker-day-main, .semi-datepicker-day-disabled.semi-datepicker-day-selectedrange-hover .semi-datepicker-day-main {
  background-color: var(--semi-color-disabled-fill);
  color: var(--semi-color-disabled-text);
}
.semi-datepicker-switch {
  text-align: center;
  display: flex;
  border-top: 1px solid var(--semi-color-border);
  margin-top: auto;
}
.semi-datepicker-switch-date, .semi-datepicker-switch-time {
  width: 50%;
  cursor: pointer;
  padding-top: 16px;
  padding-bottom: 16px;
  display: flex;
  justify-content: center;
  align-items: center;
  color: var(--semi-color-text-2);
}
.semi-datepicker-switch-date:not(.semi-datepicker-switch-time-disabled):hover, .semi-datepicker-switch-time:not(.semi-datepicker-switch-time-disabled):hover {
  background-color: var(--semi-color-fill-0);
}
.semi-datepicker-switch-date-active, .semi-datepicker-switch-time-active {
  color: var(--semi-color-text-0);
  font-weight: 600;
  cursor: auto;
}
.semi-datepicker-switch-date-active:hover, .semi-datepicker-switch-time-active:hover {
  background-color: inherit;
}
.semi-datepicker-switch-date-disabled, .semi-datepicker-switch-time-disabled {
  cursor: not-allowed;
}
.semi-datepicker-switch-text {
  padding-left: 8px;
}
.semi-datepicker-time .semi-jumperlist {
  box-shadow: none;
  border-radius: 0;
}
.semi-datepicker-quick-control {
  box-sizing: border-box;
  background-color: transparent;
}
.semi-datepicker-quick-control-header {
  padding: 18px 12px 0;
  font-weight: 600;
}
.semi-datepicker-quick-control-left {
  border-right: 1px solid var(--semi-color-border);
}
.semi-datepicker-quick-control-right {
  border-left: 1px solid var(--semi-color-border);
}
.semi-datepicker-quick-control-top {
  border-bottom: 1px solid var(--semi-color-border);
}
.semi-datepicker-quick-control-bottom {
  border-top: 1px solid var(--semi-color-border);
}
.semi-datepicker-quick-control-left-content-wrapper, .semi-datepicker-quick-control-right-content-wrapper {
  max-width: 200px;
  margin-top: 14px;
  overflow-y: auto;
}
.semi-datepicker-quick-control-top-content-wrapper, .semi-datepicker-quick-control-bottom-content-wrapper {
  overflow-y: auto;
  max-height: 100px;
}
.semi-datepicker-quick-control-left-content, .semi-datepicker-quick-control-right-content {
  box-sizing: border-box;
  display: grid;
  align-content: flex-start;
  grid-gap: 8px;
  grid-template-columns: repeat(2, minmax(76.5px, 84px));
  padding: 0 12px 12px;
}
.semi-datepicker-quick-control-left-content-item, .semi-datepicker-quick-control-right-content-item {
  max-width: 84px;
}
.semi-datepicker-quick-control-left-content-item-ellipsis, .semi-datepicker-quick-control-right-content-item-ellipsis {
  width: 68px;
  color: var(--semi-color-primary);
}
.semi-datepicker-quick-control-top-content, .semi-datepicker-quick-control-bottom-content {
  display: grid;
  grid-gap: 8px;
  grid-template-columns: repeat(3, minmax(70.924px, 75.924px));
  align-content: flex-start;
  padding: 8px 20px;
}
.semi-datepicker-quick-control-top-content-item, .semi-datepicker-quick-control-bottom-content-item {
  max-width: 75.924px;
}
.semi-datepicker-quick-control-top-content-item-ellipsis, .semi-datepicker-quick-control-bottom-content-item-ellipsis {
  width: 59.924px;
  color: var(--semi-color-primary);
}
.semi-datepicker-quick-control-top-range-content, .semi-datepicker-quick-control-bottom-range-content {
  box-sizing: border-box;
  display: grid;
  align-content: flex-start;
  grid-template-columns: repeat(5, minmax(96.2px, 99.2px));
  grid-gap: 8px;
  padding: 8px 20px;
}
.semi-datepicker-quick-control-top-range-content-item, .semi-datepicker-quick-control-bottom-range-content-item {
  max-width: 99.2px;
}
.semi-datepicker-quick-control-top-range-content-item-ellipsis, .semi-datepicker-quick-control-bottom-range-content-item-ellipsis {
  width: 83.2px;
  color: var(--semi-color-primary);
}
.semi-datepicker-quick-control-top-month-content, .semi-datepicker-quick-control-bottom-month-content {
  box-sizing: border-box;
  display: grid;
  grid-template-columns: repeat(2, minmax(51px, 58.5px));
  grid-gap: 8px;
  align-content: flex-start;
  padding: 8px 20px;
}
.semi-datepicker-quick-control-top-month-content-item, .semi-datepicker-quick-control-bottom-month-content-item {
  max-width: 58.5px;
}
.semi-datepicker-quick-control-top-month-content-item-ellipsis, .semi-datepicker-quick-control-bottom-month-content-item-ellipsis {
  max-width: 42.5px;
  color: var(--semi-color-primary);
}
.semi-datepicker-quick-control-month {
  max-width: 284px;
}
.semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-month[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 258px;
}
.semi-datepicker-quick-control-month .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-month .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 214px;
}
.semi-datepicker-quick-control-date {
  max-width: 284px;
}
.semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-date[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 309px;
}
.semi-datepicker-quick-control-date .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-date .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 273px;
}
.semi-datepicker-quick-control-dateTime {
  max-width: 284px;
}
.semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-dateTime[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 309px;
}
.semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-dateTime .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 326px;
}
.semi-datepicker-quick-control-dateRange {
  max-width: 568px;
}
.semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-dateRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 309px;
}
.semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-dateRange .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 273px;
}
.semi-datepicker-quick-control-dateTimeRange {
  max-width: 568px;
}
.semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-dateTimeRange[x-insetinput=true] .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 309px;
}
.semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-right-content-wrapper,
.semi-datepicker-quick-control-dateTimeRange .semi-datepicker-quick-control-left-content-wrapper {
  max-height: 326px;
}
.semi-datepicker-topSlot {
  border-bottom: 1px solid var(--semi-color-border);
}
.semi-datepicker-bottomSlot {
  border-top: 1px solid var(--semi-color-border);
}
.semi-datepicker .semi-popover-trigger {
  width: 100%;
}
.semi-datepicker .semi-popover-trigger .semi-input-wrapper {
  font-size: 13px;
}
.semi-datepicker .semi-popover-trigger .semi-input-suffix {
  color: var(--semi-color-primary);
}
.semi-datepicker .semi-datepicker-input-readonly {
  cursor: pointer;
}
.semi-datepicker-inset-input-wrapper {
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;
  box-sizing: border-box;
  column-gap: 8px;
  padding: 12px 16px;
  padding-bottom: 0;
  width: 284px;
}
.semi-datepicker-inset-input-wrapper[x-type=dateRange], .semi-datepicker-inset-input-wrapper[x-type=dateTimeRange] {
  width: 568px;
}
.semi-datepicker-inset-input-wrapper[x-type=month] {
  width: 165px;
}
.semi-datepicker-inset-input-wrapper[x-type=monthRange] {
  width: 331px;
}
.semi-datepicker-inset-input-wrapper .semi-input-wrapper {
  flex: 1;
  flex-shrink: 0;
}
.semi-datepicker-inset-input-separator {
  flex-grow: 0;
  flex-shrink: 0;
  height: 32px;
  line-height: 32px;
  padding: 0 4px;
  color: var(--semi-color-text-3);
}
.semi-datepicker-range-input {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  border-radius: var(--semi-border-radius-small);
  height: 32px;
  color: var(--semi-color-text-2);
  background-color: var(--semi-color-fill-0);
  border: 0px solid transparent;
}
.semi-datepicker-range-input:hover {
  border-color: transparent;
}
.semi-datepicker-range-input:active {
  border-color: transparent;
}
.semi-datepicker-range-input .semi-datepicker-monthRange-input {
  background-color: transparent;
}
.semi-datepicker-range-input-wrapper {
  box-sizing: border-box;
  background-color: transparent;
  padding: 0 8px;
  height: 100%;
  width: 100%;
  border: 1px solid transparent;
  border-radius: var(--semi-border-radius-small);
  display: flex;
  align-items: center;
}
.semi-datepicker-range-input-wrapper .semi-input-wrapper {
  background-color: transparent;
  border: none;
}
.semi-datepicker-range-input-wrapper-focus {
  border-color: transparent;
  background-color: var(--semi-color-fill-1);
  border-radius: var(--semi-border-radius-small);
  transition: background-color 0.16s ease-in-out;
}
.semi-datepicker-range-input-wrapper-focus ~ .semi-datepicker-range-input-clearbtn {
  display: flex;
}
.semi-datepicker-range-input-wrapper-focus ~ .semi-datepicker-range-input-clearbtn ~ .semi-datepicker-range-input-suffix {
  display: none;
}
.semi-datepicker-range-input-wrapper .semi-input {
  padding: 2px 4px;
}
.semi-datepicker-range-input-wrapper-icon {
  flex-shrink: 0;
}
.semi-datepicker-range-input-wrapper:hover {
  background-color: var(--semi-color-fill-1);
}
.semi-datepicker-range-input-wrapper-start {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
.semi-datepicker-range-input-wrapper-start-with-prefix {
  border-radius: 0;
}
.semi-datepicker-range-input-wrapper-end {
  border-radius: 0;
}
.semi-datepicker-range-input-wrapper-active {
  border-color: var(--semi-color-focus-border);
  background-color: var(--semi-color-fill-1);
}
.semi-datepicker-range-input-separator {
  display: flex;
  align-items: center;
}
.semi-datepicker-range-input-separator-active {
  color: var(--semi-color-text-0);
}
.semi-datepicker-range-input-small {
  height: 24px;
}
.semi-datepicker-range-input-large {
  height: 40px;
}
.semi-datepicker-range-input-large .semi-input-default {
  font-size: 16px;
}
.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn {
  display: flex;
  cursor: pointer;
}
.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn ~ .semi-datepicker-range-input-suffix {
  display: none;
}
.semi-datepicker-range-input:hover .semi-datepicker-range-input-clearbtn:hover {
  color: var(--semi-color-primary-hover);
}
.semi-datepicker-range-input-disabled {
  cursor: not-allowed;
  color: var(--semi-color-disabled-text);
  background-color: var(--semi-color-disabled-fill);
}
.semi-datepicker-range-input-disabled .semi-datepicker-range-input-wrapper:hover {
  background-color: transparent;
}
.semi-datepicker-range-input-disabled:hover {
  background-color: var(--semi-color-disabled-fill);
}
.semi-datepicker-range-input-disabled .semi-datepicker-range-input-prefix,
.semi-datepicker-range-input-disabled .semi-datepicker-range-input-suffix,
.semi-datepicker-range-input-disabled .semi-datepicker-range-input-clearbtn {
  color: var(--semi-color-disabled-text);
}
.semi-datepicker-range-input-warning {
  background-color: var(--semi-color-warning-light-default);
}
.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper:hover {
  background-color: var(--semi-color-warning-light-hover);
}
.semi-datepicker-range-input-warning .semi-datepicker-range-input-wrapper-active {
  border-color: var(--semi-color-warning);
  background-color: var(--semi-color-warning-light-hover);
}
.semi-datepicker-range-input-error {
  background-color: var(--semi-color-danger-light-default);
}
.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper:hover {
  background-color: var(--semi-color-danger-light-hover);
}
.semi-datepicker-range-input-error .semi-datepicker-range-input-wrapper-active {
  border-color: var(--semi-color-danger);
  background-color: var(--semi-color-danger-light-hover);
}
.semi-datepicker-range-input .semi-datepicker-range-input-clearbtn {
  display: none;
}
.semi-datepicker-range-input-prefix, .semi-datepicker-range-input-suffix, .semi-datepicker-range-input-clearbtn {
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 600;
  font-size: 14px;
  line-height: 20px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  white-space: nowrap;
  color: var(--semi-color-text-2);
}
.semi-datepicker-range-input-prefix {
  padding-left: 12px;
  padding-right: 8px;
}
.semi-datepicker-range-input-suffix {
  padding-left: 8px;
  padding-right: 12px;
}
.semi-datepicker-range-input-suffix-hidden {
  display: none;
}
.semi-datepicker-range-input-clearbtn {
  padding-left: 8px;
  padding-right: 12px;
}

/*
* 小尺寸 DatePicker
*/
.semi-datepicker-compact {
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  line-height: 20px;
}
.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTime] .semi-datepicker-yam, .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-yam {
  height: calc(100% - 32px);
}
.semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateRange] .semi-datepicker-month-grid-left, .semi-datepicker-compact .semi-datepicker-month-grid[x-type=dateTimeRange] .semi-datepicker-month-grid-left {
  border-right: 1px solid var(--semi-color-border);
}
.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yam-showing {
  min-height: 288px;
  min-width: 216px;
}
.semi-datepicker-compact .semi-datepicker-month-grid[x-type=date] .semi-datepicker-yam-showing {
  min-height: 256px;
}
.semi-datepicker-compact .semi-datepicker-month-grid[x-preset-position=left][x-insetinput=false] .semi-datepicker-month, .semi-datepicker-compact .semi-datepicker-month-grid[x-preset-position=right][x-insetinput=false] .semi-datepicker-month {
  height: 220px;
}
.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-header {
  box-sizing: border-box;
  height: 48px;
  padding: 12px;
}
.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-body {
  display: flex;
}
.semi-datepicker-compact .semi-datepicker-month-grid .semi-datepicker-yearmonth-body .semi-scrolllist:nth-child(2) {
  border: 1px solid var(--semi-color-border);
}
.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist {
  font-size: 12px;
  line-height: 16px;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
  line-height: 20px;
}
.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-header {
  display: none;
}
.semi-datepicker-compact .semi-datepicker-month-grid .semi-scrolllist-list-outer > ul > li {
 
Download .txt
gitextract_1c6wmyk2/

├── .eslintrc.cjs
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── DeployTo_ghrc_ali.yml
│       └── autoMerge.yml
├── .gitignore
├── .idea/
│   ├── .gitignore
│   ├── hamster-home.iml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── modules.xml
│   └── vcs.xml
├── Dockerfile
├── LICENSE
├── README.md
├── app/
│   ├── home/
│   │   ├── globals.css
│   │   ├── layout.tsx
│   │   ├── main/
│   │   │   ├── components/
│   │   │   │   ├── NewDescription.tsx
│   │   │   │   ├── infoCard.tsx
│   │   │   │   ├── networkChart.tsx
│   │   │   │   ├── networkSummary.tsx
│   │   │   │   ├── proxySummary.tsx
│   │   │   │   └── serverList.tsx
│   │   │   ├── dashboard.tsx
│   │   │   └── page.tsx
│   │   ├── semi.css
│   │   ├── service/
│   │   │   ├── components/
│   │   │   │   ├── homeSummary.tsx
│   │   │   │   ├── paySummary.tsx
│   │   │   │   ├── serviceList.tsx
│   │   │   │   └── serviceSummary.tsx
│   │   │   ├── page.tsx
│   │   │   └── service.tsx
│   │   ├── style.css
│   │   ├── surge/
│   │   │   ├── components/
│   │   │   │   └── surgeCard.tsx
│   │   │   ├── page.tsx
│   │   │   ├── surge.tsx
│   │   │   ├── surgeStatus.tsx
│   │   │   └── surgeTraffic.tsx
│   │   ├── utils/
│   │   │   ├── fixedButton.tsx
│   │   │   ├── functions.tsx
│   │   │   ├── leftSide.tsx
│   │   │   ├── sseContext.tsx
│   │   │   └── sseFetch.tsx
│   │   └── xui/
│   │       ├── components/
│   │       │   ├── xuiDetail.tsx
│   │       │   └── xuiTable.tsx
│   │       ├── page.tsx
│   │       └── xui.tsx
│   ├── layout.tsx
│   └── providers.tsx
├── env.d.ts
├── git-cliff/
│   └── cliff.toml
├── next.config.js
├── package.json
├── tsconfig.json
├── turbo.json
└── vercel.json
Download .txt
SYMBOL INDEX (50 symbols across 32 files)

FILE: app/home/layout.tsx
  function DashboardLayout (line 11) | function DashboardLayout({

FILE: app/home/main/components/NewDescription.tsx
  type NewDescriptionProps (line 4) | type NewDescriptionProps = {
  function NewDescription (line 10) | function NewDescription({

FILE: app/home/main/components/infoCard.tsx
  type InfoCardProps (line 16) | type InfoCardProps = {
  function InfoCard (line 29) | function InfoCard(props: InfoCardProps) {
  function InfoCardList (line 189) | function InfoCardList() {

FILE: app/home/main/components/networkChart.tsx
  type NetworkChartProps (line 4) | type NetworkChartProps = {
  function NetworkChart (line 10) | function NetworkChart({

FILE: app/home/main/components/networkSummary.tsx
  function NetworkSummary (line 22) | function NetworkSummary() {

FILE: app/home/main/components/proxySummary.tsx
  function ProxySummary (line 20) | function ProxySummary() {

FILE: app/home/main/components/serverList.tsx
  type ServerCardProps (line 7) | type ServerCardProps = {
  function ServerCard (line 25) | function ServerCard(props: ServerCardProps) {
  function Server (line 242) | function Server() {

FILE: app/home/main/dashboard.tsx
  function MainContent (line 17) | function MainContent() {

FILE: app/home/main/page.tsx
  function DashboardPage (line 7) | function DashboardPage() {

FILE: app/home/service/components/homeSummary.tsx
  type HomeCardProps (line 7) | type HomeCardProps = {
  function HomeSummary (line 102) | function HomeSummary() {

FILE: app/home/service/components/paySummary.tsx
  type PayCardProps (line 5) | type PayCardProps = {
  function PayDetailCard (line 10) | function PayDetailCard(props: PayCardProps) {
  function PaySummary (line 81) | function PaySummary() {

FILE: app/home/service/components/serviceList.tsx
  type ServiceCardProps (line 6) | type ServiceCardProps = {
  function ServerDetailCard (line 14) | function ServerDetailCard(props: ServiceCardProps) {
  function ServiceList (line 164) | function ServiceList() {

FILE: app/home/service/components/serviceSummary.tsx
  type ServiceCardProps (line 7) | type ServiceCardProps = {
  function ServiceCard (line 13) | function ServiceCard(props: ServiceCardProps) {
  function ServiceSummary (line 83) | function ServiceSummary() {

FILE: app/home/service/page.tsx
  function Service (line 7) | function Service() {

FILE: app/home/service/service.tsx
  function ServiceContent (line 9) | function ServiceContent() {

FILE: app/home/surge/components/surgeCard.tsx
  type SurgeCardProps (line 3) | type SurgeCardProps = {
  function SurgeCard (line 8) | function SurgeCard({ children, style }: SurgeCardProps) {

FILE: app/home/surge/page.tsx
  function Service (line 7) | function Service() {

FILE: app/home/surge/surge.tsx
  function SurgeContent (line 8) | function SurgeContent() {

FILE: app/home/surge/surgeStatus.tsx
  function SurgeStatus (line 14) | function SurgeStatus() {

FILE: app/home/surge/surgeTraffic.tsx
  function SurgeTraffic (line 28) | function SurgeTraffic() {

FILE: app/home/utils/functions.tsx
  function getDaysBetweenDates (line 1) | function getDaysBetweenDates(date1: string, date2: string): number {

FILE: app/home/utils/leftSide.tsx
  function LeftSide (line 22) | function LeftSide() {

FILE: app/home/utils/sseContext.tsx
  type SpeedData (line 10) | type SpeedData = { speed: number };
  type SSEContextType (line 12) | interface SSEContextType {
  type Actions (line 46) | type Actions =
  type SSEContextProviderProps (line 71) | interface SSEContextProviderProps {

FILE: app/home/utils/sseFetch.tsx
  type LooseObject (line 6) | type LooseObject = {
  function SSEDataFetch (line 10) | function SSEDataFetch(url: string): LooseObject | undefined {

FILE: app/home/xui/components/xuiDetail.tsx
  function XuiSummary (line 13) | function XuiSummary() {

FILE: app/home/xui/components/xuiTable.tsx
  function XuiTable (line 22) | function XuiTable() {

FILE: app/home/xui/page.tsx
  function NetWork (line 7) | function NetWork() {

FILE: app/home/xui/xui.tsx
  function XuiContent (line 8) | function XuiContent() {

FILE: app/layout.tsx
  function RootLayout (line 10) | function RootLayout({

FILE: app/providers.tsx
  function Providers (line 6) | function Providers({ children }: { children: React.ReactNode }) {

FILE: env.d.ts
  type ProcessEnv (line 2) | interface ProcessEnv {

FILE: next.config.js
  method redirects (line 11) | async redirects() {
Condensed preview — 54 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (762K chars).
[
  {
    "path": ".eslintrc.cjs",
    "chars": 1519,
    "preview": "// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst path = require('path')\n\n/** @type {import(\"eslint\")"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 616,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/DeployTo_ghrc_ali.yml",
    "chars": 2475,
    "preview": "name: Build and push Docker image\n\non:\n  push:\n    tags:\n      - 'v*'\n\njobs:\n  changelog:\n    name: Generate Changelog\n "
  },
  {
    "path": ".github/workflows/autoMerge.yml",
    "chars": 751,
    "preview": "name: Dependabot auto-merge\non: pull_request\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  dependabot:"
  },
  {
    "path": ".gitignore",
    "chars": 389,
    "preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pn"
  },
  {
    "path": ".idea/.gitignore",
    "chars": 131,
    "preview": "# 默认忽略的文件\n/shelf/\n/workspace.xml\n# 基于编辑器的 HTTP 客户端请求\n/httpRequests/\n# GitHub Copilot persisted chat sessions\n/copilot/ch"
  },
  {
    "path": ".idea/hamster-home.iml",
    "chars": 535,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"WEB_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\">\n"
  },
  {
    "path": ".idea/inspectionProfiles/Project_Default.xml",
    "chars": 251,
    "preview": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project De"
  },
  {
    "path": ".idea/modules.xml",
    "chars": 276,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 167,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": "Dockerfile",
    "chars": 1058,
    "preview": "FROM node:18-alpine AS base\n\nFROM base AS deps\nRUN apk add --no-cache libc6-compat\nWORKDIR /app\n\nCOPY package.json yarn."
  },
  {
    "path": "LICENSE",
    "chars": 1059,
    "preview": "MIT License\n\nCopyright (c) 2023 仓鼠\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this"
  },
  {
    "path": "README.md",
    "chars": 1107,
    "preview": "<div align=\"center\">\n<strong>项目因技术栈选择问题已归档,重构中...</strong>\n<br>\n<strong>新重构 HomeDash 地址: https://dash.buycoffee.top</str"
  },
  {
    "path": "app/home/globals.css",
    "chars": 1431,
    "preview": "/* http://meyerweb.com/eric/tools/css/reset/\n   v5.0.1 | 20191019\n   License: none (public domain)\n*/\n@import '@/app/hom"
  },
  {
    "path": "app/home/layout.tsx",
    "chars": 963,
    "preview": "\"use client\";\nimport \"./globals.css\";\n\nimport { Layout } from \"@douyinfe/semi-ui\";\nimport React, { useEffect, useState }"
  },
  {
    "path": "app/home/main/components/NewDescription.tsx",
    "chars": 679,
    "preview": "import { Typography } from \"@douyinfe/semi-ui\";\nimport React from \"react\";\n\ntype NewDescriptionProps = {\n  keyString: st"
  },
  {
    "path": "app/home/main/components/infoCard.tsx",
    "chars": 7609,
    "preview": "import {\n  IconBolt,\n  IconBrackets,\n  IconCalendarClock,\n  IconConnectionPoint2,\n  IconGithubLogo,\n  IconGlobeStroke,\n "
  },
  {
    "path": "app/home/main/components/networkChart.tsx",
    "chars": 1600,
    "preview": "import React from \"react\";\nimport { Area, AreaChart, ResponsiveContainer, YAxis } from \"recharts\";\n\ntype NetworkChartPro"
  },
  {
    "path": "app/home/main/components/networkSummary.tsx",
    "chars": 5092,
    "preview": "import { Skeleton } from \"@douyinfe/semi-ui\";\nimport React, { useEffect } from \"react\";\nimport { z } from \"zod\";\n\nimport"
  },
  {
    "path": "app/home/main/components/proxySummary.tsx",
    "chars": 3746,
    "preview": "import { Skeleton, Typography } from \"@douyinfe/semi-ui\";\nimport React, { useEffect } from \"react\";\nimport { z } from \"z"
  },
  {
    "path": "app/home/main/components/serverList.tsx",
    "chars": 7867,
    "preview": "import { Progress, Skeleton } from \"@douyinfe/semi-ui\";\nimport React from \"react\";\n\nimport NewDescription from \"@/app/ho"
  },
  {
    "path": "app/home/main/dashboard.tsx",
    "chars": 5761,
    "preview": "\"use client\";\nimport {\n  IconGithubLogo,\n  IconTickCircle,\n  IconUploadError,\n} from \"@douyinfe/semi-icons\";\nimport { Ta"
  },
  {
    "path": "app/home/main/page.tsx",
    "chars": 180,
    "preview": "import MainContent from \"@/app/home/main/dashboard\";\n\nexport const metadata = {\n  title: \"概览 | HomeDash\",\n};\n\nexport def"
  },
  {
    "path": "app/home/semi.css",
    "chars": 624750,
    "preview": "/* shadow */\n/* sizing */\n/* spacing */\nbody,\nbody .semi-always-light {\n  --semi-amber-0: 254,251,235;\n  --semi-amber-1:"
  },
  {
    "path": "app/home/service/components/homeSummary.tsx",
    "chars": 4697,
    "preview": "import { Card, Tag, Typography } from \"@douyinfe/semi-ui\";\nimport Image from \"next/image\";\nimport { z } from \"zod\";\n\nimp"
  },
  {
    "path": "app/home/service/components/paySummary.tsx",
    "chars": 2412,
    "preview": "import { Card, Progress, Typography } from \"@douyinfe/semi-ui\";\n\nimport { getDaysBetweenDates } from \"@/app/home/utils/f"
  },
  {
    "path": "app/home/service/components/serviceList.tsx",
    "chars": 7474,
    "preview": "import { Card, Progress, Tag, Typography } from \"@douyinfe/semi-ui\";\nimport { z } from \"zod\";\n\nimport { SSEDataFetch } f"
  },
  {
    "path": "app/home/service/components/serviceSummary.tsx",
    "chars": 4194,
    "preview": "import { Card, Descriptions, Progress } from \"@douyinfe/semi-ui\";\nimport { z } from \"zod\";\n\nimport { getDaysBetweenDates"
  },
  {
    "path": "app/home/service/page.tsx",
    "chars": 181,
    "preview": "import ServiceContent from \"@/app/home/service/service\";\n\nexport const metadata = {\n  title: \"服务 | HomeDash\",\n};\n\nexport"
  },
  {
    "path": "app/home/service/service.tsx",
    "chars": 697,
    "preview": "\"use client\";\nimport { Typography } from \"@douyinfe/semi-ui\";\n\nimport HomeSummary from \"@/app/home/service/components/ho"
  },
  {
    "path": "app/home/style.css",
    "chars": 1100,
    "preview": ".newDescription {\n    padding: 10px;\n    border-radius: 5px;\n    background-color: transparent;\n    transition: border-r"
  },
  {
    "path": "app/home/surge/components/surgeCard.tsx",
    "chars": 478,
    "preview": "import React from \"react\";\n\ntype SurgeCardProps = {\n  children?: React.ReactNode;\n  style?: React.CSSProperties;\n};\n\nfun"
  },
  {
    "path": "app/home/surge/page.tsx",
    "chars": 176,
    "preview": "import SurgeContent from \"@/app/home/surge/surge\";\n\nexport const metadata = {\n  title: \"Surge | HomeDash\",\n};\n\nexport de"
  },
  {
    "path": "app/home/surge/surge.tsx",
    "chars": 516,
    "preview": "\"use client\";\nimport { Typography } from \"@douyinfe/semi-ui\";\nimport React from \"react\";\n\nimport SurgeStatus from \"@/app"
  },
  {
    "path": "app/home/surge/surgeStatus.tsx",
    "chars": 6776,
    "preview": "import {\n  IconActivity,\n  IconDisc,\n  IconSafe,\n  IconSignal,\n} from \"@douyinfe/semi-icons\";\nimport { Divider, Progress"
  },
  {
    "path": "app/home/surge/surgeTraffic.tsx",
    "chars": 8671,
    "preview": "import { Descriptions, Skeleton, Typography } from \"@douyinfe/semi-ui\";\nimport React from \"react\";\nimport { z } from \"zo"
  },
  {
    "path": "app/home/utils/fixedButton.tsx",
    "chars": 1369,
    "preview": "\"use client\";\nimport { IconDesktop, IconMoon, IconSun } from \"@douyinfe/semi-icons\";\nimport { Button } from \"@douyinfe/s"
  },
  {
    "path": "app/home/utils/functions.tsx",
    "chars": 316,
    "preview": "export function getDaysBetweenDates(date1: string, date2: string): number {\n  const oneDay = 24 * 60 * 60 * 1000; // 一天的"
  },
  {
    "path": "app/home/utils/leftSide.tsx",
    "chars": 2564,
    "preview": "import { IconSemiLogo } from \"@douyinfe/semi-icons\";\nimport {\n  IconBanner,\n  IconList,\n  IconProgress,\n  IconToken,\n} f"
  },
  {
    "path": "app/home/utils/sseContext.tsx",
    "chars": 3223,
    "preview": "\"use client\";\nimport React, {\n  createContext,\n  type ReactNode,\n  useContext,\n  useReducer,\n  useState,\n} from \"react\";"
  },
  {
    "path": "app/home/utils/sseFetch.tsx",
    "chars": 659,
    "preview": "\"use client\";\nimport useSWRSubscription, {\n  type SWRSubscriptionOptions,\n} from \"swr/subscription\";\n\ntype LooseObject ="
  },
  {
    "path": "app/home/xui/components/xuiDetail.tsx",
    "chars": 1806,
    "preview": "import { Descriptions, Skeleton, Typography } from \"@douyinfe/semi-ui\";\nimport React from \"react\";\nimport { z } from \"zo"
  },
  {
    "path": "app/home/xui/components/xuiTable.tsx",
    "chars": 3016,
    "preview": "import { Progress, Table, Tag } from \"@douyinfe/semi-ui\";\nimport React from \"react\";\nimport { z } from \"zod\";\n\nimport { "
  },
  {
    "path": "app/home/xui/page.tsx",
    "chars": 167,
    "preview": "import XuiContent from \"@/app/home/xui/xui\";\n\nexport const metadata = {\n  title: \"用户列表 | HomeDash\",\n};\n\nexport default f"
  },
  {
    "path": "app/home/xui/xui.tsx",
    "chars": 509,
    "preview": "\"use client\";\nimport { Typography } from \"@douyinfe/semi-ui\";\nimport React from \"react\";\n\nimport XuiSummary from \"@/app/"
  },
  {
    "path": "app/layout.tsx",
    "chars": 691,
    "preview": "import { Inter } from \"next/font/google\";\nimport Script from \"next/script\";\nimport React from \"react\";\n\nimport { SSEConn"
  },
  {
    "path": "app/providers.tsx",
    "chars": 328,
    "preview": "\"use client\";\n\nimport { ThemeProvider } from \"next-themes\";\nimport React from \"react\";\n\nexport function Providers({ chil"
  },
  {
    "path": "env.d.ts",
    "chars": 99,
    "preview": "declare namespace NodeJS {\n  interface ProcessEnv {\n    NEXT_PUBLIC_GO_API_BASE_URL: string;\n  }\n}\n"
  },
  {
    "path": "git-cliff/cliff.toml",
    "chars": 2880,
    "preview": "# git-cliff ~ configuration file\n# https://git-cliff.org/docs/configuration\n#\n# Lines starting with \"#\" are comments.\n# "
  },
  {
    "path": "next.config.js",
    "chars": 398,
    "preview": "/** @type {import('next').NextConfig} */\n\nconst nextConfig = {\n  // 针对Docker部署\n  output: \"standalone\",\n  transpilePackag"
  },
  {
    "path": "package.json",
    "chars": 1074,
    "preview": "{\n  \"name\": \"home-dash\",\n  \"version\": \"0.2.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"ne"
  },
  {
    "path": "tsconfig.json",
    "chars": 792,
    "preview": "{\n  \"compilerOptions\": {\n    \"target\": \"es2017\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    "
  },
  {
    "path": "turbo.json",
    "chars": 158,
    "preview": "{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"pipeline\": {\n    \"build\": {\n      \"outputs\": [\".next/**\", \"!.next/c"
  },
  {
    "path": "vercel.json",
    "chars": 41,
    "preview": "{\n  \"buildCommand\": \"pnpm turbo build\"\n}\n"
  }
]

About this extraction

This page contains the full source code of the hamster1963/HomeDash GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 54 files (710.4 KB), approximately 207.7k tokens, and a symbol index with 50 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!